批处理属性编辑器
大家好,我的数百个图形中有一个块,现在我需要将其中一个属性的宽度因子值从1.0更改为0.9。我可以使用LSP程序吗?
我也尝试过脚本,但由于我糟糕的脚本技能,这是一次不成功的练习。
干杯 可以使用脚本调用LISP例程。块/属性的名称是什么? 我找到了一个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”。
谢谢 你可以试试李·麦克的优秀网站上的lisp。
http://www.lee-mac.com/macatt.html
如果这不是任务的最佳选择,那么还有很多其他选择,
浏览Lee的可用Lisp库。
谢谢李! 李无疑是LSP大师。但lisp与属性属性无关。只能设置值。 试试这个
(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/…”曾经出现过吗? 注意,如果OP想要更改所有“Date”属性,那么这就足够了。节目有多少人无关紧要。只需确保比较子字符串而不是整个字符串。
谢谢你的建议,neophoible。请参阅上面修订的代码。 干得好CheSyn干得好-
以下是对代码的一些小建议,以提高简洁性和效率:
几点注意:
[列表]
[*]我建议尽可能细化选择过滤器列表,以确保获得准确的选择-例如,在我的代码中,我过滤块名等于“MRM”的属性插入。但是请注意,如果块是动态的,则这将不包括所有动态引用。
[/列表]
[列表]
[*]不需要对文字字符串进行小写,只需使用大写文字即可。
[/列表]
[列表]
[*]查看wcmatch函数以进行字符串比较。
[/列表]
[列表]
[*]为了提高效率,请限制执行相同操作的次数,例如,对于每次迭代(即对于每个属性引用),您将通过entget检索属性DXF数据4次,而每次迭代只需要检索一次该数据,如我的代码所示。
[/列表]
[列表]
[*]同样,为了效率起见,尽可能引用文字表达式,例如(cons 41 0.9)不包含要计算的表达式,因此可以简单地变成“(41.0.9),无需计算cons函数。
[/列表] 李,谢谢你的提示!
我会研究你发布的代码以及你的笔记,以备将来参考。再次感谢!
页:
[1]
2