将属性值设置为Variabl
如何使用lisp语句将块内的属性值设置为变量?我不希望使用任何用户输入,它需要可以编写脚本。图形中只有一个块实例。如果你需要更多信息,我很乐意提供。谢谢 欢迎来到CADTutor。玩一下下面的游戏,您应该能够在命令行中看到属性列表;
(defun c:Test ( / s sn e lst)
(if (setq s (ssget "_X" '((0 . "INSERT")(66 . 1) (2 . "MyBlock")))) ;; Change the MyBlock name to your block name
(progn
(setq sn (ssname s 0)) ;; Assumed to run on one block instance / reference.
(while (= "ATTRIB" (cdr (assoc 0 (setq e (entget (setq sn (entnext sn)))))))
(setq lst (cons (cdr (assoc 1 e)) lst))
)
)
)
lst ;; list of attributes values if available.
)
我在运行代码时插入了块名。然后我在命令行中进行了类型测试,唯一返回的结果是nil。我不知道我应该在这里做什么。 你是阻止动态还是常规?
你是如何将你的区块名添加到代码中的? 另一个(只是为了好玩):
(defun GetBlkAttVals ( bnm / o L )
(if (and (setq o (FirstBlkOccurrence bnm)) (setq L (vlax-invoke o 'GetAttributes)) )
(mapcar 'vla-get-TextString L)
)
); defun GetBlkAttVals
; recursive
(defun FirstBlkOccurrence ( n / rec )
(defun rec ( b n i / o )
(cond
( (vl-catch-all-error-p (setq o (vl-catch-all-apply 'vla-item (list b i)))) (prompt "\nError") )
( (and (vlax-property-available-p o 'EffectiveName) (= n (vla-get-EffectiveName o))) o)
( (rec b n (1+ i)) )
); cond
); defun
(rec (vla-get-Block (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object)))) n 0)
); defun FirstBlkOccurrence
; iterative
(defun FirstBlkOccurrence ( n / i->L b o )
(defun i->L ( i / L ) (if (eq 'INT (type i)) (repeat i (setq L (cons (setq i (1- i)) L)))) )
(setq b (vla-get-Block (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object)))))
(vl-some
(function
(lambda (x)
(if
(and
(setq o (vla-item b x))
(vlax-property-available-p o 'EffectiveName)
(= n (vla-get-EffectiveName o))
)
o
)
)
)
(i->L (vla-get-Count b))
); vl-some
); defun FirstBlkOccurrence
用法示例-(其中块名区分大小写):
(GetBlkAttVals "MyBlockName")
我的街区是静态的。我插入了我的区块名称,如下所示:
(if(setq s(ssget“_X”'((0。“INSERT”)(66.1)(2。“FCA\u TB”)));;将MyBlock名称更改为您的块名称 在我上面发布的代码中没有什么特别的地方,所以如果你能上传一个示例图,那么仔细检查一下就好了。
页:
[1]