jialiang168 发表于 2011-5-26 18:45:22

已经会取得动态块的可见性名称,但是。。。

本帖最后由 jialiang168 于 2011-5-26 18:55 编辑

(defun c:bb1 ()
(setq obj (vlax-ename->vla-object (car (entsel))))
(if (= (vlax-get-property obj 'isdynamicblock) :vlax-true)
    (progn
      (setq v (vla-getdynamicblockproperties obj))
      (setq vval (vlax-variant-value v))
      (setq sal (vlax-safearray->list vval))
      (setq count t)
      (while count
(setq vval(vlax-dump-object (nth 3 sal)))
      (setq aa1 (nth 3 sal))
(setq aa2(vla-get-PropertyName aa1))
(if (= aa2 "管径选项");自定义可见性名称「"管径选项"」
   (progn
   (setq aa4(vla-get-Value aa1))
   (setq count nil)
   ) ) ) ) )
aa4
)
aa4 回传的如左:#<variant 8 2">
如题: 已经可取得动态块的可见性名称,但是 aa4 回传的如左:#<variant 8 2">
2" 是我做的动态块2英吋管选项    (vla-put-Value aa1 "5\"");這句可以改可見性,让2英吋管的管变成5英吋的管。
#<variant 8 2"> 回传的这个,要如何才能取得「 2" 」的值呢?
昐请高手能帮忙解决困惑。


小菜123 发表于 2011-5-26 19:20:55

看看这个程序就会明白了; Function retrieve or set properties from a dynamic block
; (DynamicProps (car (entsel)) "Pipe length" nil) get the Pipe length from a dynamic block
; (DynamicProps (car (entsel)) "" nil) get the properties from a dynamic block
; (DynamicProps (car (entsel)) "Pipe length" 2000.0) set the properties from a dynamic block
(defun DynamicProps (ename propname value / obj prpL cla cll prp)
(vl-load-com)
(setq obj (if (= (type ename) 'VLA-OBJECT) ename (vlax-ename->vla-object ename)))
(if vla-getdynamicblockproperties (setq prpL (vlax-invoke obj 'getdynamicblockproperties)))
(setq return
    (if (setq prp (vl-remove-if-not (function (lambda(x)(= (vlax-get-property x 'PropertyName) propname))) prpL))
      (mapcar (function (lambda(v)
      (if (and (/= value nil)(vlax-property-available-p v 'Value)(/= (type value)'LIST))
          (progn (vlax-put-property v 'Value value)(vla-update obj))
      )
      (if (and (vlax-property-available-p v 'AllowedValues) (vlax-get v 'AllowedValues))
          (list (vlax-get v 'Value)(vlax-get v 'AllowedValues))
   (vlax-get v 'Value)
      )
      )) prp)
      (mapcar (function (lambda(v)(list (vla-get-propertyName v)(vlax-get v 'Value) v))) prpL)
    )
)
return
)


jialiang168 发表于 2011-5-27 02:37:38

謝謝 小菜123我會好好研究的。

jialiang168 发表于 2011-5-27 02:56:55

太感动了。这正是我要的最好的解答。我真的懂了。再次谢谢小菜123

LLXXZZ 发表于 2011-5-28 10:17:54

学习中.多学习多进步.

yfeng17 发表于 2013-2-9 10:43:26

这程序太好用了,谢谢“小菜123”

mono 发表于 2013-3-1 10:54:24

学习中.多学习多进步

消失的天空 发表于 2021-2-19 14:40:24

谢谢,有了 vla-getdynamicblockproperties 这个不迷路,正需要

yoyoho 发表于 2021-2-19 18:04:57

谢谢 小菜123分享程序!!!!

tranque 发表于 3 天前

本帖最后由 tranque 于 2025-12-9 11:46 编辑

感谢菜总 ,分享的程序!!!!我把这个代码给AI让它给我改出来我需要的功能了
顺便让AI给菜总提供的代码加个注释

;| 功能: 获取或设置动态块的属性
   参数:
   ename   - 图元名或VLA对象
   propname - 属性名称(字符串)
               - 空字符串""获取所有属性
               - 指定名称获取特定属性
   value   - 要设置的属性值
               - nil: 仅获取不设置
               - 其他: 设置该值
   返回值: 根据调用情况返回
|;
(defun DynamicProps (ename propname value / obj prpL cla cll prp)
(vl-load-com); 加载VLISP扩展支持ActiveX

; 将输入参数转换为VLA对象(如果输入的是图元名)
(setq obj
    (if (= (type ename) 'VLA-OBJECT); 判断是否为VLA对象
      ename                           ; 是: 直接使用
      (vlax-ename->vla-object ename); 否: 转换为VLA对象
    )
)

; 获取动态块属性列表(如果对象支持)
(if vla-getdynamicblockproperties
    (setq prpL (vlax-invoke obj 'getdynamicblockproperties))
)

; 主处理逻辑: 根据propname参数决定返回内容
(setq return
    (if (setq prp; 查找匹配指定名称的属性
            (vl-remove-if-not; 移除不匹配的元素
                (function; 定义判断函数
                  (lambda (x)
                  (= (vlax-get-property x 'PropertyName) propname)
                  )
                )
                prpL
            )
      )
      ; 情况1: 找到了指定名称的属性(propname非空且匹配)
      (mapcar; 遍历匹配到的属性列表
      (function
          (lambda (v)
            ; 如果提供了要设置的值且属性支持Value属性
            (if (and
                  (/= value nil)                     ; 有设置值
                  (vlax-property-available-p v 'Value) ; 属性可写
                  (/= (type value) 'LIST)            ; 值不是列表类型
                )
            (progn
                (vlax-put-property v 'Value value); 设置属性值
                (vla-update obj)                  ; 更新对象显示
            )
            )
            
            ; 构造返回值
            (if (and
                  (vlax-property-available-p v 'AllowedValues); 有允许值列表
                  (vlax-get v 'AllowedValues)                   ; 允许值非空
                )
            ; 返回: (当前值 允许值列表)
            (list
                (vlax-get v 'Value)         ; 当前属性值
                (vlax-get v 'AllowedValues) ; 允许的取值范围
            )
            ; 返回: 当前值
            (vlax-get v 'Value)
            )
          )
      )
      prp
      )
      
      ; 情况2: 没有指定属性名或未找到匹配(propname为空或未匹配)
      (mapcar
      (function
          (lambda (v)
            ; 返回: (属性名 属性值 VLA对象)
            (list
            (vla-get-propertyName v); 属性名称
            (vlax-get v 'Value)       ; 属性值
            v                         ; VLA对象引用
            )
          )
      )
      prpL
      )
    )
)

return; 返回最终结果
)

页: [1]
查看完整版本: 已经会取得动态块的可见性名称,但是。。。