需要AutoLisp例程
我试图找到一个AutoLisp例程来更新块属性信息,但我感到非常沮丧,所以如果有人觉得无聊,想尝试一下,我会寻求一些帮助。我有一个接线图,其中我创建了几个块作为连接器触点块,它们有两个属性:第一个是标记“RDN1”值“AcDbBlockReference”,第二个是标记“RDN2”值“AcDbBlockReference”。我使用这些属性将连接器连接块属性与用户设置的起始连接器块属性标记“RDN”值和用户设置的结束连接器块属性标记“RDN”值链接。这样,如果开始或结束连接器RDN值更改,则连接器接触块属性也随之更改。
现在我必须使用ATTEDIT,双击“AcDbBlockReference”字段,选择对象类型,然后从属性列表中选择RDN。
我想将其自动化,这样我就不必经历ATTEDIT过程,而只需选择连接器触点,然后选择开始连接器块,然后选择结束连接器块,这些属性就会更改。
任何帮助都将不胜感激。 我不确定,但我认为我已经做了类似的事情,您可以选择一个块或文本来获取另一个块的唯一id,然后自动更改该块中的值。
你能粘贴一张图纸吗 比加尔。。。。谢谢你的回复。我能得到的最小尺寸的dwg是900kb,所以我不能把它张贴在这里。我的电子邮件是t_shadle@yahoo.com如果你给我发一封电子邮件,我会用文件回复你。
谢谢 跟进原帖子。我在这个论坛上找到了几个lisp例程,它们将块的属性复制到外部。txt文件。然后,另一个lisp例程读取。txt文件,并将属性值插入具有相同属性标记的任何块中。这是我最初寻找的内容的一部分,但是我希望更改的属性是AcDbBlockReference字段。当我使用上述lisp例程时,它将AcDbBlockReference替换为文本字符串,因此删除了AcDbBlockReference链接。
有没有一种方法可以使用lisp更新字段而不将其作为文本字符串覆盖?
对不起,当上述lisp例程运行时,我很兴奋,因为我忘记了作者的名字。。。。但它的超级道具就像广告中宣传的那样,对于其他应用程序来说非常方便。你们真是太棒了!!! 很抱歉
我可能误解了这个请求,但是,是否要选择一个块,并且属性标记“RDN”的值将作为另一个块的字段放入一个属性中? 这正是我想要的。(你的版本更简单)
但是,接收“RDN”值的块必须保持链接,因此当具有标记“RDN”值的块更改时,链接到它的所有块都将随之更改。
我希望这不会太让人困惑?
谢谢你的回复。。。在过去的几天里,我发现了几十个autolisp例程,我在试图减少这些例程的使用量时,我感到精神疲惫。除了如何制作一个Lisp程序的Lisp程序说“嗨”之外,我的大脑就是一堆自动Lisp程序的烂泥。 如果我理解正确,试一试:
(defun c:Contact (/ *error* lst2str SourceTag DestTagLst ent1 eLst1 att1 ent2 eLst2 att2 uFlag)
(vl-load-com)
;; Lee Mac~04.02.10
(setq SourceTag "RDN" DestTagLst '("RDN1" "RDN2"))
(setq *doc (cond (*doc) ((vla-get-ActiveDocument
(vlax-get-acad-object)))))
(defun *error* (msg)
(and uFlag (vla-EndUndoMark *doc))
(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
(princ (strcat "\n** Error: " msg " **")))
(princ))
(defun lst2str (lst sep)
(if (cdr lst)
(strcat (car lst) sep (lst2str (cdr lst) sep))
(car lst)))
(while
(progn
(setq ent1 (nentsel (strcat "\nSelect Block or Attrib to get " SourceTag ": ")))
(cond ((eq 'ENAME (type (car ent1)))
(if (or (and (eq "ATTRIB"(cdr (assoc 0 (setq eLst1 (entget (car ent1))))))
(eq SourceTag (strcase (cdr (assoc 2 eLst1))))
(setq att1 (vlax-ename->vla-object (car ent1))))
(and (= 4 (length ent1))
(eq "INSERT" (cdr (assoc 0 (entget (setq ent1 (car (last ent1)))))))
(progn
(while (not (eq "SEQEND" (cdr (assoc 0 (entget (setq ent1 (entnext ent1)))))))
(if (eq SourceTag (cdr (assoc 2 (entget ent1))))
(setq att1 (vlax-ename->vla-object ent1))))
att1)))
(while
(progn
(setq ent2 (car (nentsel (strcat "\nSelect Destination Attrib for " SourceTag ": "))))
(cond ((eq 'ENAME (type ent2))
(if (eq "ATTRIB" (cdr (assoc 0 (setq eLst2 (entget ent2)))))
(if (vl-position (cdr (assoc 2 eLst2)) DestTagLst)
(progn
(setq uFlag (not (vla-StartUndoMark *doc)))
(vla-put-TextString
(setq att2 (vlax-ename->vla-object ent2))
(strcat "%<\\AcObjProp Object(%<\\_ObjId "
(itoa
(vla-get-ObjectId att1)) ">%).TextString>%"))
(vla-update att2)
(setq uFlag (vla-EndUndoMark *doc)))
(princ (strcat "\n** ATTRIB Must be Either " (lst2str DestTagLst ",") " **")))
(princ "\n** Object Must be an ATTRIB **"))))))
(princ (strcat "\n** Object Must be an INSERT or ATTRIB with Tag \"" SourceTag "\" **")))))))
(vla-regen *doc acActiveViewport)
(princ))
李·麦克。。。。它起作用了!
无论如何,要在RDN1 RDN2可见性设置为OFF时使其工作吗?
是的,我可以做到这一点,但它如何知道是将RDN的值放入RDN1还是RDN2?或者它们都包含来自同一块的值吗?
此外,我们在这里处理的是动态块吗? 如果有一种简单的方法测试用户将RDN放入RDN1或RDN2,那将很酷。因为用户选择了属性,我可以使RDN1和RDN2可见,但在不打印的层上。
但在这一刻,我很高兴。。。。。谢谢!
页:
[1]
2