sakinen 发表于 2022-7-6 14:20:38

在中时获取属性值

我开始发展Lisp程序,但我意识到这是一个有点出马联盟,所以我需要一些帮助。这是所需的工作流程。我需要插入一个名为roomtag的特定块。此块具有名为roomnumber的属性。当我插入此块时,需要提示我选择房间号。房间编号可以是文字、多行文字或其他属性。选中后,该实体的值应成为roomnumber属性值。有什么想法吗?

flowerrobot 发表于 2022-7-6 14:33:08

对不起,我的无知,你不是在问什么吗?
 
或者你有很多属性,只想编辑一个?
 
(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)
)

sakinen 发表于 2022-7-6 14:34:53

我有两个属性,但我只想更新一个。

sakinen 发表于 2022-7-6 14:43:28

也许我没有解释“选择”是什么意思。当提示我输入房间号时,我想选择文字、多行文字或其他属性来获取我的房间号属性的值。

flowerrobot 发表于 2022-7-6 14:53:06

啊,我现在明白了,对不起,现在公共汽车在叫我,上面的代码也没有用
这应该会帮助你(将文本输出)
Nm=实体数据
 
(cdr (assoc 1 (entget NM)))

Lee Mac 发表于 2022-7-6 14:55:43

试试这个伴侣:
 

(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))

sakinen 发表于 2022-7-6 15:07:15

 
我试过了,但我收到了这个消息
我放了房间标签。带有roomtag块的dwg文件位于一个文件夹中,我将其放在选项中的支持文件夹中。也许我错了。

Lee Mac 发表于 2022-7-6 15:11:27

 
如果是房间标签。dwg包含roomtag块-然后将出现自参考问题。
 
你可以打开房间标签。dwg,分解其中的块,然后WBLOCK它来生成块-一种更好的方法来处理事情。

sakinen 发表于 2022-7-6 15:14:45

谢谢你,伙计。很有魅力!
你太牛了
这是我的Lisp程序联盟的出路。

Lee Mac 发表于 2022-7-6 15:23:22

 
很乐意帮助伙计-别担心,这是唯一的练习
页: [1]
查看完整版本: 在中时获取属性值