bababarghi 发表于 2022-7-6 06:18:18

批处理属性编辑器

大家好,
 
我的数百个图形中有一个块,现在我需要将其中一个属性的宽度因子值从1.0更改为0.9。我可以使用LSP程序吗?
 
我也尝试过脚本,但由于我糟糕的脚本技能,这是一次不成功的练习。
 
 
干杯

CheSyn 发表于 2022-7-6 06:26:06

可以使用脚本调用LISP例程。块/属性的名称是什么?

bababarghi 发表于 2022-7-6 06:27:25

我找到了一个LSP可以帮我:
 
(defun c:att_width(/ att_en width_x ed)

(setq att_en (car (nentsel "\nSelect attribute to change \n")))
(setq ed (entget att_en))
(if (= (cdr(assoc 0 ed)) "ATTRIB")
(progn
(setq width_x (getreal "\nEnter width factor \n"))
(setq ed (subst (cons 41 width_x ) (assoc 41 ed) ed ))
(entmod ed)
(entupd att_en)
(princ)
)
(princ "\nEntity is not an attribute ")
)
(princ)
)
 
遗憾的是,这个lisp的设计要求用户交互选择一个属性,这是一个通过脚本部署的繁琐过程(我更喜欢按名称选择一个块)
 
我的块名是“MRM”(标题块),有一个属性的标签名是“DATE-5”,我特别关注这个属性。如果我可以在“DATE-1”、“DATE-2”上应用相同的宽度因子变化,那就更好了,同时“DATE-5”。
 
谢谢

Dadgad 发表于 2022-7-6 06:31:15

你可以试试李·麦克的优秀网站上的lisp。
http://www.lee-mac.com/macatt.html
 
如果这不是任务的最佳选择,那么还有很多其他选择,
浏览Lee的可用Lisp库。
 
谢谢李!

bababarghi 发表于 2022-7-6 06:38:26

李无疑是LSP大师。但lisp与属性属性无关。只能设置值。

CheSyn 发表于 2022-7-6 06:43:45

试试这个
 

(defun c:test ( / blk att)
   (if
       (setq blk (ssget "_x" '((2 . "MRM"))))
       (progn
         (setq blk (ssname blk 0)
               att (entnext blk))
         (while
               (/=
                   (cdr (assoc 0 (entget att)))
                   "SEQEND"
               )
                   (if
                     (=
                           (strcase "DATE-")
                           (substr (cdr (assoc 2 (entget att))) 1 5)
                     )
                     (progn
                           (entmod
                               (subst
                                 (cons 41 0.9)
                                 (assoc 41 (entget att))
                                 (entget att)
                               )
                           )
                               (entupd att)
                     )
                   )
               (setq att (entnext att))
         )
       )
       (princ "\nMRM not in drawing!")
   )
(princ)
)

 
标签是否只升到“Date-5”或“Date-6/7/…”曾经出现过吗?

neophoible 发表于 2022-7-6 06:44:38

注意,如果OP想要更改所有“Date”属性,那么这就足够了。节目有多少人无关紧要。只需确保比较子字符串而不是整个字符串。

CheSyn 发表于 2022-7-6 06:48:51

 
谢谢你的建议,neophoible。请参阅上面修订的代码。

Lee Mac 发表于 2022-7-6 06:53:13

干得好CheSyn干得好-
 
以下是对代码的一些小建议,以提高简洁性和效率:
几点注意:
 
[列表]
[*]我建议尽可能细化选择过滤器列表,以确保获得准确的选择-例如,在我的代码中,我过滤块名等于“MRM”的属性插入。但是请注意,如果块是动态的,则这将不包括所有动态引用。
[/列表]
 
[列表]
[*]不需要对文字字符串进行小写,只需使用大写文字即可。
[/列表]
 
[列表]
[*]查看wcmatch函数以进行字符串比较。
[/列表]
 
[列表]
[*]为了提高效率,请限制执行相同操作的次数,例如,对于每次迭代(即对于每个属性引用),您将通过entget检索属性DXF数据4次,而每次迭代只需要检索一次该数据,如我的代码所示。
[/列表]
 
[列表]
[*]同样,为了效率起见,尽可能引用文字表达式,例如(cons 41 0.9)不包含要计算的表达式,因此可以简单地变成“(41.0.9),无需计算cons函数。
[/列表]

CheSyn 发表于 2022-7-6 06:59:29

李,谢谢你的提示!
 
我会研究你发布的代码以及你的笔记,以备将来参考。再次感谢!
页: [1] 2
查看完整版本: 批处理属性编辑器