cabltv1 发表于 2022-7-5 19:47:38

Lisp合并和更新

请帮忙!
我需要一个lisp例程,它可以执行以下操作。。。
1) 选择一个块。
2) 从块中的两个独立标签获取信息
第一个标记:NODE\u ID
第二个标签:DEVICE-TYPE_ID
3) 然后,我需要将上面的两个标记与中间的破折号(-)组合。例子:
第一个标记:NODE_ID=1256
第二个标签:DEVICE-TYPE_ID=C5B3
最终=1256-C5B3
4) 然后我需要一个“暂停”来选择几个不同的块并更新以下标记。。。
标记:与组合结果一起处于活动状态。。
标签:激活=1256-C5B3
 
任何帮助都将不胜感激。

fixo 发表于 2022-7-5 19:58:13

试试这个

;; cca.lsp

(defun C:CCA(/ attent atttag attval elist en head pt ss tail)
(setq osm (getvar "osmode"))
(setvar "osmode" 513)
(setq        pt (getpoint
   "\n   ***   Specify point on the source block   ***"))

(setq ss (ssget pt (list (cons 0 "INSERT") (cons 66 1))))
(sssetfirst nil ss)
(if ss
   (progn
   (setq en (ssname ss 0))
   (setq elist (entget en))
   (while (=        (cdr
          (assoc 0
               (setq elist (entget (entnext
                                     (setq attent (cdr (assoc -1 elist))))))))
        "ATTRIB")
(setq atttag (cdr (assoc 2 elist)))
(setq attval (cdr (assoc 1 elist)))
(cond ((eq "NODE_ID" atttag)
       (setq head (cdr (assoc 1 elist))))
      ((eq "DEVICE-TYPE_ID" atttag)
       (setq tail (cdr (assoc 1 elist))))
      (T nil)
      )
(ssdel en ss)
)
   )
   (princ "\n   0 blocks selected")
   )
(sssetfirst nil nil)
(setq ss nil)
(prompt
   "\n   ***   Select all target blocks you need to update   ***")
(setq ss (ssget (list (cons 0 "INSERT") (cons 66 1))))
(sssetfirst nil ss)
(if (and head tail ss)
   (progn
   (while
(setq en (ssname ss 0))
(setq elist (entget en))
(while        (= (cdr
             (assoc 0
                  (setq elist        (entget        (entnext
                                          (setq attent (cdr (assoc -1 elist))))))))
           "ATTRIB")
   (setq atttag (cdr (assoc 2 elist)))

   (if (eq "ACTIVE" atttag)
   (progn
       (entmod (subst (cons 1 (strcat head "-" tail))
                      (assoc 1 elist)
                      elist))
       (entupd en)
       )
   )
   (ssdel en ss)
   )
)
   (sssetfirst nil nil)
   )
   (princ "\n   0 blocks selected")
   )
(setvar "osmode" osm)
(princ)
)
(princ "   ***   Start command wit CCA   ***")
(princ)

 
~'J'~

cabltv1 发表于 2022-7-5 20:07:12

Fixo,
谢谢你的快速回复。我试了一下常规动作,上半场不错,但下半场不行。
我选择源块,然后选择需要更新的块,然后发生以下情况。。。。
第一个标记:NODE_ID(这会更新目标块/标记:Active[包括短划线])。
第二个源块标记:DEVICE-TYPE_ID(目标块/标记中缺少:Active[包括短划线])。
例子:
源块:第一个标记:NODE\u ID=1256
第二个标签:DEVICE-TYPE_ID=C5B3
==============================
更新后。。。
目标块:标记:ACTIVE=“1256-
目标块末端缺少“C5B3”。

Lee Mac 发表于 2022-7-5 20:08:18

试试这个:
 

(defun c:tagupd (/ bEnt aEnt aEntLst aNode aType nAtt ss entLst dAtt dAttLst)
(vl-load-com)
(if (and (setq bEnt (car (entsel "\nSelect Block to Retrieve Tag Values >")))
      (= "INSERT" (cdr (assoc 0 (entget bEnt))))
      (= 1 (cdr (assoc 66 (entget bEnt)))))
   (progn
   (setq aEnt (entnext bEnt))
   (while (not (eq "SEQEND" (cdr (assoc 0 (setq aEntLst (entget aEnt))))))
   (cond ((= "NODE_ID" (cdr (assoc 2 aEntLst)))
          (setq aNode (cdr (assoc 1 aEntLst))))
         ((= "DEVICE-TYPE_ID" (cdr (assoc 2 aEntLst)))
          (setq aType (cdr (assoc 1 aEntLst)))))
   (setq aEnt (entnext aEnt)))
   (setq nAtt (strcat aNode (chr 45) aType))
   (if (setq ss (ssget (list (cons 0 "INSERT") (cons 66 1)
   (if (getvar "CTAB") (cons 410 (getvar "CTAB")) (cons 67 (- 1 (getvar "TILEMODE")))))))
   (progn
   (setq entLst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
   (foreach ent entLst
       (setq dAtt (entnext ent))
       (while (not (eq "SEQEND" (cdr (assoc 0 (setq dAttLst (entget dAtt))))))
         (if (= "ACTIVE" (cdr (assoc 2 dAttLst)))
       (setq dAttLst (subst (cons 1 nAtt) (assoc 1 dAttLst) dAttLst))
       (entmod dAttLst))
         (setq dAtt (entnext dAtt)))))
   (princ "\n<!> No Destination Blocks Selected <!>")))
   (princ "\n<!> No Attributed Block Selected <!>"))
(command "_regenall")
(princ))

Lee Mac 发表于 2022-7-5 20:18:13

对不起,遗漏了一件事:
 

(defun c:tagupd (/ bEnt aEnt aEntLst aNode aType nAtt ss entLst dAtt dAttLst)
(vl-load-com)
(if (and (setq bEnt (car (entsel "\nSelect Block to Retrieve Tag Values >")))
      (= "INSERT" (cdr (assoc 0 (entget bEnt))))
      (= 1 (cdr (assoc 66 (entget bEnt)))))
   (progn
   (setq aEnt (entnext bEnt))
   (while (not (eq "SEQEND" (cdr (assoc 0 (setq aEntLst (entget aEnt))))))
   (cond ((= "NODE_ID" (cdr (assoc 2 aEntLst)))
          (setq aNode (cdr (assoc 1 aEntLst))))
         ((= "DEVICE-TYPE_ID" (cdr (assoc 2 aEntLst)))
          (setq aType (cdr (assoc 1 aEntLst)))))
   (setq aEnt (entnext aEnt)))
   (setq nAtt (strcat aNode (chr 45) aType))
   (if (setq ss (ssget (list (cons 0 "INSERT") (cons 66 1)
   (if (getvar "CTAB") (cons 410 (getvar "CTAB")) (cons 67 (- 1 (getvar "TILEMODE")))))))
   (progn
   (setq entLst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
   (foreach ent entLst
       (setq dAtt (entnext ent))
       (while (not (eq "SEQEND" (cdr (assoc 0 (setq dAttLst (entget dAtt))))))
         (if (= "ACTIVE" (cdr (assoc 2 dAttLst)))
       (progn
       (setq dAttLst (subst (cons 1 nAtt) (assoc 1 dAttLst) dAttLst))
       (entmod dAttLst)))
         (setq dAtt (entnext dAtt)))))
   (princ "\n<!> No Destination Blocks Selected <!>")))
   (princ "\n<!> No Attributed Block Selected <!>"))
(command "_regenall")
(princ))

cabltv1 发表于 2022-7-5 20:23:00

李,
工作完美!
非常感谢你。你帮我省了很多时间,我一个人想办法解决这个问题。

Lee Mac 发表于 2022-7-5 20:33:34

 
 
没问题,cabltv,-你的LISP请求看起来都很简单,但都是很好的实践

blue-drafter 发表于 2022-7-5 20:34:22

我有一个类似的需要,上述职位。我需要将属性字符串的平衡转移到另一个块。我已附加了一个AutoCAD文件,其中包含要传输到零件标记块的信息表。
ATT-传输。图纸

BIGAL 发表于 2022-7-5 20:42:42

不是很确定你想要什么,但你可以用多个块做任何事情,这只是识别它们的一个例子,在你的情况下,你是说一个带有标签MM01的块要更新,但存在55次?
 
作为参考,我们有一个pit计划更新程序,它可以从各地获取信息,但无论单个计划在图形中的什么位置都会更新,这只是块名和标记的情况。
 
进一步研究自动更新属性。

blue-drafter 发表于 2022-7-5 20:49:51

比加尔,我附上了一个新的CAD文件与我需要的方向。谢谢
物料清单。图纸
页: [1]
查看完整版本: Lisp合并和更新