Cad Guy 发表于 2022-7-6 12:28:17

块中的许多Attdribute标记

在我开始之前,这是一个很棒的网站,非常有用
 
现在回答我的问题。
 
我有这个项目,我们正在使用客户区块。在需要编辑的块中,有许多属性有自己的“标签”。
 
例如:
 
块名称
ABC_123
 
标记值
AAAA级####
标记值
BBBB####
等等
 
我想给他们每个不同的值。在这种情况下,一个简单的查找和替换就可以了,但使用的每个块中都有相同的标记,我不想全部更新。
我想知道是否有一种方法可以根据标记名而不是值进行搜索和替换。就像搜索标记AAAA并将其值替换为4321一样,标记BBBB并将其值替换为8765。这些值将用于整个图形集。
 
有人能帮我解决这个问题吗?
 
 
 
 

gile 发表于 2022-7-6 12:46:54

你好
 
这是一个快捷方式
 
(defun c:setAtt (/ ent elst val ss tag)
(if
   (and
   (setq ent (car (nentsel "\nSelect the attribute: ")))
   (setq elst (entget ent))
   (= (cdr (assoc 0 elst)) "ATTRIB")
   (setq val (getstring "\nNew value: "))
   (princ "\nSelect blocks to be edited (Enter for all)")
   (or
       (setq
         ss
          (ssget (list '(0 . "INSERT") (assoc 2 (entget (cdr (assoc 330 elst))))))
       )
       (setq
         ss
          (ssget "_X"
               (list '(0 . "INSERT") (assoc 2 (entget (cdr (assoc 330 elst)))))
          )
       )
   )
   (setq tag (cdr (assoc 2 elst)))
   (setq n 0)
   )
    (progn
      (while (setq ent (ssname ss n))
      (SetAttValue ent tag val)
      (setq n (1+ n))
      )
    )
    (princ "\nInvalid input")
)
(princ)
)

;;; SetAttValue (gile)
;;; Sets a value to an attribute
;;;
;;; Arguments
;;; blk : block ename
;;; tag : attribute tag
;;; val : new value

(defun SetAttValue (blk tag val / lst loop)
(setq    lst(entget (entnext blk))
   loop (= "ATTRIB" (cdr (assoc 0 lst)))
)
(while loop
   (if    (= (strcase tag) (cdr (assoc 2 lst)))
   (progn
   (entmod (subst (cons 1 val) (assoc 1 lst) lst))
   (setq loop nil)
   (entupd blk)
   )
   (setq lst   (entget (entnext (cdr (assoc -1 lst))))
       loop (= "ATTRIB" (cdr (assoc 0 lst)))
   )
   )
)
)

Cad Guy 发表于 2022-7-6 13:00:24

给我,但我是lisp格式的新手。但当我运行它时,它给了我一个错误。
 

gile 发表于 2022-7-6 13:08:43

抱歉,出现错误,我编辑了代码。
试试新的。

Cad Guy 发表于 2022-7-6 13:21:24

几乎
 

Cad Guy 发表于 2022-7-6 13:34:52

哎呀,我明白了。我认为我的代码副本缺少最后一部分。
 
 
但它现在起作用了,非常感谢!
页: [1]
查看完整版本: 块中的许多Attdribute标记