kristin 发表于 2022-7-6 09:17:49

数值全局块属性

我有一个问题要问所有你经历过的AutoCAD专家。。。
 
我有一张有许多高程点的图纸。这些点通过插入的块列出,我在其中用两个属性(路缘顶部高程和路缘底部高程)标记块。有时,客户会希望整个场地以一定的增量下降或降低。如何或可以编辑所有高程点块,使其增加或减少特定的数值?我被告知这是不可能的,但我真的希望我能找到一个更好的解决方案,然后打开每个块属性,手动编辑1.5英尺的值!(当然,通过这种方式,我还遇到了一个障碍,即试图辨别哪些块已经提高了1.5英尺,哪些还没有!)我尝试在更改每个块颜色时更改块颜色,但是我找不到将所有块颜色都更改回“bylayer”颜色的方法。由于这种原因,attedit过去没有工作。任何提示或技巧都将不胜感激。
 
~克里斯汀

dbroada 发表于 2022-7-6 09:28:30

我知道我可以用VBA来做这件事,我确信它可以用LISP来做。但是我现在在家,离AutoCAD太远了,我现在没有时间在工作中做这件事。
 
假设您的所有块都有相同的名称(并且都需要更改相同的数量),您可以将它们全部放入一个选择集中,检索值,进行求和,然后写回新值。
 
这真的需要在LISP/VBA领域,但我相信一个mod很快就会移动它。

dbroada 发表于 2022-7-6 09:33:21

好的,我本来希望一个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并选择块,然后查看发生了什么。注意-没有错误检查,所以不要在有价值的图纸上尝试!

lpseifert 发表于 2022-7-6 09:38:43

您可以尝试此操作,注意它将编辑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 "*")

我不能接受功劳,大部分是国有企业的功劳。

kristin 发表于 2022-7-6 09:46:34

谢谢你的帮助。我98年上大学时学过一门简单的AutoCAD基础课程,但直到今年我开始工作(跟随我的军事丈夫在欧洲周游了6年),才发现我在大学里学到的最基本的东西已经蒸发了!再加上自……以来的所有改进。。。什么R14?我真是一团糟。。。再次感谢你的帮助。
 
~克里斯汀
 
(嘿,lpseifert…看起来我们在同一个地区!)

lpseifert 发表于 2022-7-6 09:49:21

欢迎如果你在宾夕法尼亚州,你拼写匹兹堡错了(不过德克萨斯州、加利福尼亚州和加利福尼亚州都有匹兹堡)

kristin 发表于 2022-7-6 09:56:41

好吧,看看这个!我想我还是习惯在德国!刚搬到这里。谢谢你的更正。

ASMI 发表于 2022-7-6 10:05:43

如果您的属性仅包含数字,则它将起作用。
 
(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

cestel 发表于 2022-7-6 10:06:28

你好
 
非常感谢你的Lisp程序。我有一个问题,如果我们运行脚本,它会将“+7.00”更改为“8”,它不会保留“+”符号或十进制数字。
 
有办法解决这个问题吗?我们有大约15000个属性,海拔像(-07.22),我们必须从中减去7。
 
 
再次感谢你的帮助。

Tiger 发表于 2022-7-6 10:13:03

您好,欢迎来到论坛。
 
你指的是什么Lisp程序?这个线程中有三个。
 
顺便说一句,这个帖子大约有3年了,如果你也在说ASMIs Lisp,他在这里已经不太活跃了,所以如果你没有得到回复,考虑开始一个新的帖子,在那里提出你的问题。
页: [1] 2
查看完整版本: 数值全局块属性