noslenac 发表于 2022-7-5 17:22:14

更改

一段时间以来,我一直在努力寻找现有的lisp例程来执行以下操作(断断续续)。虽然我发现一些会改变图形中每一段文字的属性值或文字宽度,但这不是我需要做的。
 
我需要一个lisp例程,该例程将根据客户端标题栏使用当前属性标记和块名手动修改。它不需要手动选择(用户输入),因为这将在脚本中用于批量运行lisp例程。
 
总而言之,我希望能够指定块名和属性标记名(在指定的块中),并能够在图形中设置文本宽度因子,以考虑每个客户端请求的更长文件名。这仅适用于所有图形中的1属性。
 
任何帮助都将不胜感激。
 
下面是一个示例:
 
标题栏有:
 
属性:文件名
标签:图纸编号
值:通过字段链接到实际文件名
 
当前文本宽度因子为。8,这是必须的。7以适合标题栏空间。

BIGAL 发表于 2022-7-5 17:32:07

这可能会有所帮助
 

(setq ss1 (ssget)) ; pick a block
(foreach att (vlax-invoke (vlax-ename->vla-object (ssname SS1 0 )) 'getattributes)
(if (= tagname (strcase (vla-get-tagstring att)))
(vla-put-scalefactor att X) ; x is new scale factor
)
)

noslenac 发表于 2022-7-5 17:44:25

感谢您的快速回复;然而,这仍然需要我手动选择属性。我真的需要一种将标记传递给函数的方法。我发现的和/或拼合在一起的所有内容都使用了nenetsel,但我还没有找到一种方法来自动选择嵌套在块中的属性标记,而不使用nenetsel。

Tharwat 发表于 2022-7-5 17:49:37

也许命令:巴特曼会工作吗?

noslenac 发表于 2022-7-5 17:54:55

 
这不允许我使用脚本来自动更改一个属性的文本宽度。

noslenac 发表于 2022-7-5 18:04:16

这是我最近发现并稍加修改的一个惯例;然而,我仍然无法找到替代第#6行的方法,使用NENTSEL将属性标记传递到函数中,而不需要用户输入。
 
(defun widedit (/ aDoc x attent uwd option tag blk bn)
(vl-load-com)

(setq aDoc (vla-get-ActiveDocument (vlax-get-acad-object)))

(if (and (setq x (car (nentsel "\nSelect attribute: ")))
        (eq "ATTRIB" (cdr (assoc 0 (entget x))))
        (setq attent (vlax-ename->vla-object x))
       
        ;; Display Current Text Width Factor
        (princ (strcat "\nCurrent Width is <" (rtos (vla-get-scalefactor attent) 2)"> "))
       
        ;; Set width to 0.7
        (setq uwd 0.7)) ;(getreal "\nEnter new width: ")))
       
        (progn
                (initget "Y N")
                (setq option "N")
                        ;(cond ((getkword "\nApply width to all Attribute of the same block? <N>: "))( "N" )))
                (if (eq option "N")
                        (vla-put-scalefactor attent uwd)
                        (progn
                        (setq tag (vla-get-tagstring attent))
                        (setq Blk
                                (vla-ObjectIdToObject aDoc
                                        (vla-get-OwnerId attent)
                                )
                               
                                Bn (vla-get-effectivename blk)
                        )

                        (vlax-for itm (vla-item (vla-get-blocks aDoc) bn)
                                (if
                                        (and (eq (vla-get-objectname itm) "AcDbAttributeDefinition")
                                                (eq (vla-get-tagstring itm) tag)
                                        )
                                (vla-put-scalefactor itm uwd)
                                )
                        )

                        (vlax-for layout (vla-get-layouts aDoc)
                                (vlax-for i (vla-get-block layout)
                                        (if (and
                                                        (eq (vla-get-objectname i) "AcDbBlockReference")
                                                        (eq (Vla-get-hasAttributes i) :Vlax-true)
                                                        (eq (vla-get-effectivename i) bn))
               
                                                (foreach itm (vlax-invoke i 'GetAttributes)
                                                        (if (eq (vla-get-tagstring itm) tag)
                                                                (vla-put-scalefactor itm uwd))))))
                        )
                ) ;; end if
        ) ;; end progn
        (vl-some
        '(lambda (j) (if (null (eval (car j))) (princ (cadr j))
        ))
        '((x "\n<<None Selected>>")
        (attent "\n<<Selected object not an Attribute>>")
        (uwd "\n<<No Width value>>"))
        )
)
(princ)
) ;; end defun

Lee Mac 发表于 2022-7-5 18:11:52

请尝试以下操作:
使用标记名(不区分大小写)和新属性宽度因子进行评估,例如:
3

noslenac 发表于 2022-7-5 18:17:45

这很有效。非常感谢。我非常感谢你的帮助!

Lee Mac 发表于 2022-7-5 18:24:42

不客气!
页: [1]
查看完整版本: 更改