在中时获取属性值
我开始发展Lisp程序,但我意识到这是一个有点出马联盟,所以我需要一些帮助。这是所需的工作流程。我需要插入一个名为roomtag的特定块。此块具有名为roomnumber的属性。当我插入此块时,需要提示我选择房间号。房间编号可以是文字、多行文字或其他属性。选中后,该实体的值应成为roomnumber属性值。有什么想法吗? 对不起,我的无知,你不是在问什么吗?或者你有很多属性,只想编辑一个?
(defun c:pen ()
(defun attget (ss1 / en edata)
(if ss1
(progn
(setq en (ssname ss1 0))
(setq edata (entget en))
(setq blockdata nil)
(setq edata (entget (entnext (cdr (assoc -1 edata)))))
(while (not(= (cdr (assoc 0 edata)) "SEQEND"))
(setq blockdata (cons (cons(cdr (assoc 2 edata)) (cdr (assoc 1 edata))) blockdata))
(setq edata (entget (entnext (cdr (assoc -1 edata)))))
)
)
(progn
(alert "Their is no block")
(exit)
)
)
)
(defun attput (ss1 / en edata)
(setq en (ssname ss1 0))
(setq edata (entget en))
(setq edata (entget (entnext (cdr (assoc -1 edata)))))
(while (not(= (cdr (assoc 0 edata)) "SEQEND"))
(entmod (subst (cons 1 (cdr (assoc (cdr (assoc 2 edata)) blockdata)))(assoc 1 edata) edata))
(setq edata (entget (entnext (cdr (assoc -1 edata)))))
)
)
(setq InPoint (getpoint "\nSelect insetion point :"))
(Setq TheString (getstring "\nWhat is the room number :"))
(setq TheScale (getint "What is the scale of insertion? :"))
(setvar "attdia" 0)
;What is the one that turns it off completly?
(command "_.Insert" "roomtag" InPoint TheScale TheScale 0)
(setq TheEntity (ssget (entlast)))
(attget TheEntity)
(setq blockdata (subst (cons "roomnumber" TheString) (assoc "roomnumber" blockdata) blockdata))
(attput TheEntity)
(princ Block Created)
(princ)
) 我有两个属性,但我只想更新一个。 也许我没有解释“选择”是什么意思。当提示我输入房间号时,我想选择文字、多行文字或其他属性来获取我的房间号属性的值。 啊,我现在明白了,对不起,现在公共汽车在叫我,上面的代码也没有用
这应该会帮助你(将文本输出)
Nm=实体数据
(cdr (assoc 1 (entget NM))) 试试这个伴侣:
(defun c:RmNo (/ doc spc str pt Blk gr dat ent)
(vl-load-com)
(setq doc (vla-get-ActiveDocument
(vlax-get-Acad-Object))
spc (if (zerop (vla-get-activespace doc))
(if (= (vla-get-mspace doc) :vlax-true)
(vla-get-modelspace doc)
(vla-get-paperspace doc))
(vla-get-modelspace doc)) str "")
(if (or (tblsearch "BLOCK" "roomtag")
(findfile "roomtag.dwg"))
(if (setq pt (getpoint "\nSpecify Point for Block: "))
(progn
(setq Blk
(vla-insertblock spc
(vlax-3D-point pt) "roomtag.dwg" 1. 1. 1. 0.))
(princ "\nSelect or Specify Room Number: ")
(vl-catch-all-apply
(function
(lambda ( )
(while
(progn
(setq gr (grread t 15 2) dat (cadr gr))
(cond
((and (= 3 (car gr)) (listp dat))
(if (setq ent (car (nentselp dat)))
(if (vl-position
(cdr (assoc 0 (entget ent)))
'("TEXT" "MTEXT" "ATTRIB"))
(progn
(setq str
(vla-get-TextString
(vlax-ename->vla-object ent))) nil)
(princ "\n** Invalid Object Selected **"))
(princ "\n** Nothing Selected **")))
((= 2 (car gr))
(cond ((<= 32 dat 126)
(princ (chr dat))
(setq str (strcat str (chr dat))))
((= 8 dat)
(and (< 0 (strlen str))
(princ (strcat (chr(chr 32) (chr ))
(setq str (substr str 1 (1- (strlen str))))))
((= dat 13) nil)))
((= 25 (car gr)) nil)
(t t)))))))
(foreach att
(append
(if
(not
(vl-catch-all-error-p
(setq atArr
(vl-catch-all-apply
'vlax-safearray->list
(list
(vlax-variant-value
(vla-GetAttributes Blk))))))) atArr)
(if
(not
(vl-catch-all-error-p
(setq caArr
(vl-catch-all-apply
'vlax-safearray->list
(list
(vlax-variant-value
(vla-GetConstantAttributes Blk))))))) caArr))
(if (eq "ROOMNUMBER"
(strcase
(vla-get-TagString att)))
(vla-put-TextString att str))))
(princ "\n<< No Point Specified >>"))
(princ "\n<< Block Not Found >>"))
(princ))
我试过了,但我收到了这个消息
我放了房间标签。带有roomtag块的dwg文件位于一个文件夹中,我将其放在选项中的支持文件夹中。也许我错了。
如果是房间标签。dwg包含roomtag块-然后将出现自参考问题。
你可以打开房间标签。dwg,分解其中的块,然后WBLOCK它来生成块-一种更好的方法来处理事情。 谢谢你,伙计。很有魅力!
你太牛了
这是我的Lisp程序联盟的出路。
很乐意帮助伙计-别担心,这是唯一的练习
页:
[1]