bcarlso2 发表于 2022-7-5 16:38:56

将属性值设置为Variabl

如何使用lisp语句将块内的属性值设置为变量?我不希望使用任何用户输入,它需要可以编写脚本。图形中只有一个块实例。如果你需要更多信息,我很乐意提供。谢谢

Tharwat 发表于 2022-7-5 16:49:38

欢迎来到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.
)

bcarlso2 发表于 2022-7-5 17:01:26

我在运行代码时插入了块名。然后我在命令行中进行了类型测试,唯一返回的结果是nil。我不知道我应该在这里做什么。

Tharwat 发表于 2022-7-5 17:11:01

你是阻止动态还是常规?
你是如何将你的区块名添加到代码中的?

Grrr 发表于 2022-7-5 17:25:57

另一个(只是为了好玩):

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

bcarlso2 发表于 2022-7-5 17:31:41

 
我的街区是静态的。我插入了我的区块名称,如下所示:
 
(if(setq s(ssget“_X”'((0。“INSERT”)(66.1)(2。“FCA\u TB”)));;将MyBlock名称更改为您的块名称

Tharwat 发表于 2022-7-5 17:45:39

在我上面发布的代码中没有什么特别的地方,所以如果你能上传一个示例图,那么仔细检查一下就好了。
页: [1]
查看完整版本: 将属性值设置为Variabl