明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3168|回复: 9

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

[复制链接]
发表于 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" 」的值呢?
昐请高手能帮忙解决困惑。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 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
)


点评

真的是太谢谢你了。  发表于 2011-5-27 02:57
 楼主| 发表于 2011-5-27 02:37:38 | 显示全部楼层
謝謝 小菜123  我會好好研究的。
 楼主| 发表于 2011-5-27 02:56:55 | 显示全部楼层
太感动了。这正是我要的最好的解答。我真的懂了。再次谢谢小菜123
发表于 2011-5-28 10:17:54 | 显示全部楼层
学习中.多学习多进步.
发表于 2013-2-9 10:43:26 | 显示全部楼层
这程序太好用了,谢谢“小菜123”
发表于 2013-3-1 10:54:24 | 显示全部楼层
学习中.多学习多进步
发表于 2021-2-19 14:40:24 | 显示全部楼层
谢谢,有了 vla-getdynamicblockproperties 这个不迷路,正需要
发表于 2021-2-19 18:04:57 | 显示全部楼层
谢谢 小菜123  分享程序!!!!
发表于 3 天前 | 显示全部楼层
本帖最后由 tranque 于 2025-12-9 11:46 编辑

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

  1. ;| 功能: 获取或设置动态块的属性
  2.    参数:
  3.      ename   - 图元名或VLA对象
  4.      propname - 属性名称(字符串)
  5.                - 空字符串""获取所有属性
  6.                - 指定名称获取特定属性
  7.      value   - 要设置的属性值
  8.                - nil: 仅获取不设置
  9.                - 其他: 设置该值
  10.    返回值: 根据调用情况返回
  11. |;
  12. (defun DynamicProps (ename propname value / obj prpL cla cll prp)
  13.   (vl-load-com)  ; 加载VLISP扩展支持ActiveX
  14.   
  15.   ; 将输入参数转换为VLA对象(如果输入的是图元名)
  16.   (setq obj
  17.     (if (= (type ename) 'VLA-OBJECT)  ; 判断是否为VLA对象
  18.       ename                           ; 是: 直接使用
  19.       (vlax-ename->vla-object ename)  ; 否: 转换为VLA对象
  20.     )
  21.   )
  22.   
  23.   ; 获取动态块属性列表(如果对象支持)
  24.   (if vla-getdynamicblockproperties
  25.     (setq prpL (vlax-invoke obj 'getdynamicblockproperties))
  26.   )
  27.   
  28.   ; 主处理逻辑: 根据propname参数决定返回内容
  29.   (setq return
  30.     (if (setq prp  ; 查找匹配指定名称的属性
  31.               (vl-remove-if-not  ; 移除不匹配的元素
  32.                 (function  ; 定义判断函数
  33.                   (lambda (x)
  34.                     (= (vlax-get-property x 'PropertyName) propname)
  35.                   )
  36.                 )
  37.                 prpL
  38.               )
  39.         )
  40.       ; 情况1: 找到了指定名称的属性(propname非空且匹配)
  41.       (mapcar  ; 遍历匹配到的属性列表
  42.         (function
  43.           (lambda (v)
  44.             ; 如果提供了要设置的值且属性支持Value属性
  45.             (if (and
  46.                   (/= value nil)                     ; 有设置值
  47.                   (vlax-property-available-p v 'Value) ; 属性可写
  48.                   (/= (type value) 'LIST)            ; 值不是列表类型
  49.                 )
  50.               (progn
  51.                 (vlax-put-property v 'Value value)  ; 设置属性值
  52.                 (vla-update obj)                    ; 更新对象显示
  53.               )
  54.             )
  55.             
  56.             ; 构造返回值
  57.             (if (and
  58.                   (vlax-property-available-p v 'AllowedValues)  ; 有允许值列表
  59.                   (vlax-get v 'AllowedValues)                   ; 允许值非空
  60.                 )
  61.               ; 返回: (当前值 允许值列表)
  62.               (list
  63.                 (vlax-get v 'Value)         ; 当前属性值
  64.                 (vlax-get v 'AllowedValues) ; 允许的取值范围
  65.               )
  66.               ; 返回: 当前值
  67.               (vlax-get v 'Value)
  68.             )
  69.           )
  70.         )
  71.         prp
  72.       )
  73.       
  74.       ; 情况2: 没有指定属性名或未找到匹配(propname为空或未匹配)
  75.       (mapcar
  76.         (function
  77.           (lambda (v)
  78.             ; 返回: (属性名 属性值 VLA对象)
  79.             (list
  80.               (vla-get-propertyName v)  ; 属性名称
  81.               (vlax-get v 'Value)       ; 属性值
  82.               v                         ; VLA对象引用
  83.             )
  84.           )
  85.         )
  86.         prpL
  87.       )
  88.     )
  89.   )
  90.   
  91.   return  ; 返回最终结果
  92. )


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-12-12 06:35 , Processed in 0.253702 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表