数值全局块属性
我有一个问题要问所有你经历过的AutoCAD专家。。。我有一张有许多高程点的图纸。这些点通过插入的块列出,我在其中用两个属性(路缘顶部高程和路缘底部高程)标记块。有时,客户会希望整个场地以一定的增量下降或降低。如何或可以编辑所有高程点块,使其增加或减少特定的数值?我被告知这是不可能的,但我真的希望我能找到一个更好的解决方案,然后打开每个块属性,手动编辑1.5英尺的值!(当然,通过这种方式,我还遇到了一个障碍,即试图辨别哪些块已经提高了1.5英尺,哪些还没有!)我尝试在更改每个块颜色时更改块颜色,但是我找不到将所有块颜色都更改回“bylayer”颜色的方法。由于这种原因,attedit过去没有工作。任何提示或技巧都将不胜感激。
~克里斯汀 我知道我可以用VBA来做这件事,我确信它可以用LISP来做。但是我现在在家,离AutoCAD太远了,我现在没有时间在工作中做这件事。
假设您的所有块都有相同的名称(并且都需要更改相同的数量),您可以将它们全部放入一个选择集中,检索值,进行求和,然后写回新值。
这真的需要在LISP/VBA领域,但我相信一个mod很快就会移动它。 好的,我本来希望一个Lisp程序的人来救我,但是,哦,好吧。
为了证明可以做些什么,我创建了一个包含一个矩形的块,其中有一个属性。以下代码将向该属性添加28。(注意:非常令人兴奋,但没关系)
(defun c:bl()
(setq F1 (entsel))
(setq F2 (entget(entnext(car F1))))
(setq V1 (assoc 1 F2))
(setq V2 (+ 28 (atof (cdr V1))))
(setq V3 (cons 1 (rtos V2)))
(setq F2 (subst V3 V1 F2))
(entmod F2)
(princ)
)
加载代码,键入BL并选择块,然后查看发生了什么。注意-没有错误检查,所以不要在有价值的图纸上尝试! 您可以尝试此操作,注意它将编辑dwg中的所有属性,并显示2个小数点(可以编辑代码以更改该值)
;Adds a numerical value to attributes (caution: edits ALL attributes in drawing)
(defun AddNumAtt (add tag / e ei et txt)
`
(setq e (entnext)
tag (strcase tag))
(while (setq e (entnext e))
(setq ei (entget e)
et (cdr (assoc 0 ei)))
(and (= "ATTRIB" et)
(wcmatch (cdr (assoc 2 ei)) tag)
(setq txt (cdr (assoc 1 ei)))
(numberp (setq num (read txt)))
(entmod
(subst (cons 1 (rtos (+ add num) 2 2)) (assoc 1 ei) ei))
(entupd e)))
(princ))
(alert "This will edit all attributes in the drawing!!!")
(setq addreal (getreal "Enter amount to add: "))
(AddNumAtt addreal "*")
;(AddNumAtt 1.00 "*")
我不能接受功劳,大部分是国有企业的功劳。 谢谢你的帮助。我98年上大学时学过一门简单的AutoCAD基础课程,但直到今年我开始工作(跟随我的军事丈夫在欧洲周游了6年),才发现我在大学里学到的最基本的东西已经蒸发了!再加上自……以来的所有改进。。。什么R14?我真是一团糟。。。再次感谢你的帮助。
~克里斯汀
(嘿,lpseifert…看起来我们在同一个地区!) 欢迎如果你在宾夕法尼亚州,你拼写匹兹堡错了(不过德克萨斯州、加利福尼亚州和加利福尼亚州都有匹兹堡) 好吧,看看这个!我想我还是习惯在德国!刚搬到这里。谢谢你的更正。 如果您的属性仅包含数字,则它将起作用。
(defun c:addn(/ aLst bLst bSet cAtt cDel cNum fLst nAtt)
(vl-load-com)
(if
(and
(setq cAtt(nentsel "\nPick attribute > "))
(= "ATTRIB"(cdr(assoc 0(entget(setq cAtt(car cAtt))))))
); end and
(progn
(setq cAtt(vlax-ename->vla-object cAtt)
fLst(vl-remove-if-not '
(lambda(x)(member x '(0 2)))
(entget(vlax-vla-object->ename
(vla-ObjectIDtoObject
(vla-get-ActiveDocument
(vlax-get-acad-object))
(vla-get-OwnerID cAtt)))))
nAtt(vla-get-TagString cAtt)
); end setq
(princ "\n<<< Select blocks >>>")
(if(setq bSet(ssget fLst))
(progn
(setq bLst(mapcar 'vlax-ename->vla-object
(vl-remove-if 'listp
(mapcar 'cadr(ssnamex bSet))))
cDel(getreal "\nSpecify number to Add/Subtract: ")
); end setq
(foreach b bLst
(setq aLst(vlax-safearray->list
(vlax-variant-value
(vla-getAttributes b))))
(foreach at aLst
(if(= nAtt(setq cAtt(vla-get-TagString at)))
(if(setq cNum(atof(vla-get-TextString at)))
(vla-put-TextString at(rtos(+ cNum cDel)2 1))
); end if
); end if
); end foreach
); end foreach
); end progn
); end if
); end progn
); end if
(princ)
); end of c:addn 你好
非常感谢你的Lisp程序。我有一个问题,如果我们运行脚本,它会将“+7.00”更改为“8”,它不会保留“+”符号或十进制数字。
有办法解决这个问题吗?我们有大约15000个属性,海拔像(-07.22),我们必须从中减去7。
再次感谢你的帮助。 您好,欢迎来到论坛。
你指的是什么Lisp程序?这个线程中有三个。
顺便说一句,这个帖子大约有3年了,如果你也在说ASMIs Lisp,他在这里已经不太活跃了,所以如果你没有得到回复,考虑开始一个新的帖子,在那里提出你的问题。
页:
[1]
2