找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2046|回复: 13

[已解决] [已解决]:如果获取属性块中的“标记”“提示”“默认”值?

[复制链接]
发表于 2007-9-7 16:41:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
在Vlisp中,如果获取属性块中的“标记”“提示”“默认”的值?图块中可能存在多个属性文字(例如图框)。(块中带有ddattdef命令创建的文字,就叫属性块。对吗?)

A图框和B图框为同一个属性块,但属性文字的值不同。
我最终目的是想把A图框内的(设计、制图、审定)替换至B图框内的(设计、制图、审定)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-9-7 17:57:49 | 显示全部楼层
[php]
;;获取属性块中的“标记”“默认”值
;;
(defun vlex-GetAttributes (ent / blkref lst)
  (vl-load-com)
  (if (= (vla-Get-ObjectName
           (setq blkref (vlax-Ename->vla-Object ent))
         )
         "AcDbBlockReference"
      )
    (if        (vla-Get-HasAttributes blkref)
      (mapcar
        '(lambda (x)
           (setq
             lst (cons
                   (list (vla-Get-TagString x) (vla-Get-TextString x))
                   lst
                 )
           )
         )
        (vlax-safearray->list
          (vlax-variant-value (vla-GetAttributes blkref))
        )
      )
    )
  )
  (reverse lst)
)
[/php]
(setq ent (car (entsel)))
(vlex-GetAttributes ent)

取得属性的提示: (vla-get-PromptString Object ) 好像不行.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-9-8 07:20:19 | 显示全部楼层
还有个苯办法 eattext (属性提取)

我的错 这个是lisp 版块
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-10 16:53:43 | 显示全部楼层
请问如何把一个新的表替换lst?
我只学了autolisp,现在边查vlisp函数边学习,可以基本看懂您的程序含义,想依葫芦画瓢,估计要调用vla-put-TagString和vla-put-TextString函数,但搞了几天也搞不定。再请教。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-9-10 17:58:54 | 显示全部楼层
如果只是想换掉图框中某些标记对应的默认值
(replattstr e2 tagstring textstring)
tagstring textstring可以做成表.然后遍历表....

[php]
(vl-load-com)
(defun c:tt ()
  (setq e1 (car (entsel "\n>>>选择 A 图框:")))
  (setq e2 (car (entsel "\n>>>选择 B 图框:")))
  (setq lst1 (vlex-GetAttributes e1))
  (foreach t1 lst1
    (setq tagstring (car t1))
    (setq textstring (cadr t1))
    (replattstr e2 tagstring textstring)
  )
)

;;;修改块属性文字__mapcar+lamdba
(defun replattstr (ent tagstring textstring / blkref x)
  (if (= (vla-get-objectname
           (setq blkref (vlax-ename->vla-object ent))
         )
         "AcDbBlockReference"
      )
    (progn
      (if (vla-get-hasattributes blkref)
        (progn
          (mapcar '(lambda (x)
                     (if (= tagstring (vla-get-tagstring x))
                       (vla-put-textstring x textstring)
                     )                        ;if
                   )                        ;lambda
                  (vlax-safearray->list
                    (vlax-variant-value (vla-getattributes blkref))
                  )
          )                                ;mapcar
        )                                ;progn
      )                                        ;if
    )                                        ;progn
  )                                        ;if
  (princ)
)


;;;取得块属性的列表
(defun vlex-GetAttributes (ent / blkref lst)
  (if (= (vla-Get-ObjectName
           (setq blkref (vlax-Ename->vla-Object ent))
         )
         "AcDbBlockReference"
      )
    (if        (vla-Get-HasAttributes blkref)
      (mapcar
        '(lambda (x)
           (setq
             lst (cons
                   (list (vla-Get-TagString x) (vla-Get-TextString x))
                   lst
                 )
           )
         )
        (vlax-safearray->list
          (vlax-variant-value (vla-GetAttributes blkref))
        )
      )                                        ; mapcar
    )                                        ; endif
  )                                        ; endif
  (reverse lst)
)

[/php]

注意:给个类似的通用函数:

  1. ;|获取块中所有属性
  2. 函数名:VxGetAtts
  3. 功  能:获取块中所有属性
  4. Copyright:2000 MENZI ENGINEERING GmbH, Switzerland
  5. 参  数[类型]:
  6.          Obj = Object [VLA-OBJECT]
  7. 返回值 [类型]: 点表 '(("Tag1" . "Val1")...) [LIST]
  8. |;
  9. (defun VxGetAtts (Obj)
  10.   (mapcar
  11.     '(lambda (Att)
  12.        (cons (vla-get-TagString Att)
  13.              (vla-get-TextString Att)
  14.        )
  15.      )
  16.     (vlax-invoke Obj "GetAttributes")
  17.   )
  18. )
  19. ;|VxSetAtts - Sets?attribute values to block
  20. 函数名: VxSetAtts
  21. 功  能: 设置块中属性
  22. Copyright: ?000 MENZI ENGINEERING GmbH, Switzerland
  23. 参数 [类型]:
  24.     Obj = Object [VLA-OBJECT]
  25.     Lst = 点表 '(("Tag1" . "Val1")...) [LIST]
  26. 返回值[类型]: nil
  27. |;
  28. (defun VxSetAtts (Obj Lst / AttVal)
  29.   (mapcar
  30.     '(lambda (Att)
  31.        (if (setq AttVal (cdr (assoc (vla-get-TagString Att) Lst)))
  32.          (vla-put-TextString Att AttVal)
  33.        )
  34.      )
  35.     (vlax-invoke Obj "GetAttributes")
  36.   )
  37.   (vla-update Obj)
  38.   (princ)
  39. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-9-10 18:09:18 | 显示全部楼层
(if (and (setq e (car(entsel)))
         (setq o (vlax-Ename->vla-Object e))
         (= "AcDbBlockReference" (vla-get-objectname o)))
  (mapcar '(lambda(x)(mapcar '(lambda(y)(vlax-get x y))'(TagString TextString )))(vlax-invoke o 'getattributes))
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-9-10 20:47:31 | 显示全部楼层
lisp的话我一般是这样用的,有点麻烦。
(setq a (car (entsel )))  ;;;选择块
(setq b (entnext a))
(steq b_data (entget b));;;就可以提取图元列表.
如果要下个属性
(setq c (entnext b))
(steq c_data (entget c)
一直下去就可以取得所有的属性
值.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-9-11 08:39:05 | 显示全部楼层
(vlax-get x y))'(TagString TextString )))
我也刚学VLisp,更多的都是用别人写好的.
这个太帅了..强
7楼的兄弟,你没搞清楚,这里所谓的属性块是,ATTDEF+(W)BLOCK
你说的那个是图元数据.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-11 15:28:25 | 显示全部楼层
最初由 雨箭风刀 发布
[B](if (and (setq e (car(entsel)))
         (setq o (vlax-Ename->vla-Object e))
         (= "AcDbBlockReference" (vla-get-objectname o)))
  (mapcar '(lambda(x)(mapcar '(lambda(y)(vlax-get x y))'(TagString TextStrin... [/B]


每次雨箭风刀帮我解答疑难的程序都是那么短小精悍哦。谢谢您。
请问(vlax-invoke o 'getattributes)的意义是通过 ActiveX 的方法调出物体o的块属性并返出一个表吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-11 15:40:42 | 显示全部楼层
最初由 carrot1983 发布
[B][php]
;;获取属性块中的“标记”“默认”值
;;
(defun vlex-GetAttributes (ent / blkref lst)
  (vl-load-com)
  (if (= (vla-Get-ObjectName
           (setq blkref (vlax-Ename->vla-Object ent))
         )
         "AcDb... [/B]


还有一个地方想请教,vla-GetAttributes这个函数具体是什么含义呀?查VLISP的帮助文件好像查不到这个的定义。

另外,总觉得学习vlisp要比autolisp难得多,初步的原因是因为很多vlisp的函数在控制台里返回的值总是些很不直观的东西,例如上面的(vla-GetAttributes blkref),在控制台返回#variant 8201 ... ,不像autolisp那样返回一些“实数,整数,字串,表……),我手上也没有什么VLISP的教程,只有一本帮助手册,学起来格外费力。市面上又就不着相关的教程,如果方便的话可以提供一些相关的书籍名称给我吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-9-11 20:54:49 | 显示全部楼层
GetAttributes 要看vba里面的帮助部分,属于“方法”
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-11 23:53:04 | 显示全部楼层
最初由 雨箭风刀 发布
[B]GetAttributes 要看vba里面的帮助部分,属于“方法” [/B]

谢谢您,我查查VBA的帮助,再理解一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-9-12 06:07:51 | 显示全部楼层
[iframe h=600 w=100%]http://www.mjtd.com/object/acad2004/idh_getattributes.htm[/iframe]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-8-4 15:54:40 | 显示全部楼层
hao ji le hao ji le
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 12:25 , Processed in 0.474067 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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