小菜123 发表于 2011-5-25 14:49:24

Vlisp访问动态块的定制属性(不知道是不是这个名字)问题?

附件中是从论坛下载的一个动态块,用这个程序看,属性N多:(defun c:tdb ()
(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 salnth (length sal))
(setq count 0)
(while (/= count salnth)
(vlax-dump-object (nth count sal))
(setq count (+ count 1))
)
)
(print "Not a dynamic block")
)
(setq count nil)
(princ)
)

但在ACAD中,只显示图片上的那几个,显示的这几个与其它的在属性上有什么不同?是如何得到的?

caoyin 发表于 2011-5-26 23:59:05

本帖最后由 caoyin 于 2011-5-27 01:15 编辑

(defun c:TT ()
(setq OBJ(vlax-ename->vla-object (car (entsel))))
;;获取动态块的属性
(setq PROS (vlax-invoke OBJ 'getdynamicblockproperties))
;;;----------------------------------------------------------
;;获取属性名
(mapcar '(lambda (V) (vlax-get V 'propertyName)) PROS)
;;获取属性是否为只读
(mapcar 'vla-get-readOnly PROS)
;;获取属性是否显示
(mapcar 'vla-get-show PROS)
;;获取所有属性的允许值
(mapcar '(lambda (V) (vlax-get V 'allowedValues)) PROS)
;;获取所有属性的当前值
(mapcar '(lambda (V) (vlax-get V 'Value)) PROS)
)
终于明白楼主的意思了,研究了一晚上也没有搞定。
不过,由于动态块是VLISP所无法直接创建的,而且具有很多的不可确定性,用现有的VLA函数只能对不同的动态块进行个例操作,通用性不强。因此我认为得到这个答案的意义不是很大。

caoyin 发表于 2021-1-19 15:32:13

本帖最后由 caoyin 于 2021-1-19 15:34 编辑

十年前的帖子被翻出来了,哈哈
动态块的很多数据都在扩展词典里,读取应该问题不大,修改好像挺麻烦的!
(setq BLK (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
               (vla-get-effectivename (vlax-ename->vla-object (car (entsel))))
            )
       DIC (dictsearch
                (vlax-vla-object->ename (vla-getextensiondictionary BLK))
            "ACAD_ENHANCEDBLOCK"
          )
)

caoyin 发表于 2021-1-19 15:38:21

无尽的手残 发表于 2021-1-19 12:17
小白问个弱智问题,怎么知道getdynamicblockproperties有哪些属性的?propertyName、allowedValues什么的 ...

是这个意思吗?
(setq OBJ(vlax-ename->vla-object (car (entsel))))
(mapcar '(lambda (X) (vlax-get X 'PropertyName))
          (vlax-invoke OBJ 'getDynamicBlockProperties)
)

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

顶一下,继续求助

caoyin 发表于 2011-5-26 20:04:16

楼主之所以看到的没有程序获得的属性多,是因为该动态块包含不可见的状态,而每个状态包含若干的动态属性

小菜123 发表于 2011-5-26 22:10:56

请版主再明示,我要得到显示的那五个特性,如何判断不可见的状态?有的特性还会随着“Visibility"的值不同跟随变化。

小菜123 发表于 2011-5-27 08:35:36

版主辛苦了,这么晚还不睡,谢谢!
要是没有办法,我也就死心了,这个问题是我在完善选择易的时候发现的,动态特性太多,对话框都显示不出来了

LLXXZZ 发表于 2011-5-28 10:14:58

学习的精神,值得学习.

无尽的手残 发表于 2021-1-19 12:17:45

caoyin 发表于 2011-5-26 23:59
(defun c:TT ()
(setq OBJ(vlax-ename->vla-object (car (entsel))))
;;获取动态块的属性


小白问个弱智问题,怎么知道getdynamicblockproperties有哪些属性的?propertyName、allowedValues什么的,
我把getdynamicblockproperties换成其他的就错误了。
页: [1] 2
查看完整版本: Vlisp访问动态块的定制属性(不知道是不是这个名字)问题?