明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: cnks

[求助]属性块不能用vla-getattributes是为什么

  [复制链接]
发表于 2008-2-16 15:10 | 显示全部楼层
一个基本概念问题:blkref来源于blkdef..............
你如果这样删除,再次保存,打开图形,你删除的属性还是会出现,,,,,
运行_.attsync命令就可以发现你的操作什么作用也没有!!
正确的步骤是:先删除 blkdef里面的相应的属性定义对象,然后删除blkref里面的属性ref对象..
 楼主| 发表于 2008-2-16 18:40 | 显示全部楼层

不是很明白,楼上能否做个例子?

发表于 2008-2-16 18:51 | 显示全部楼层
本帖最后由 作者 于 2008-2-16 18:52:06 编辑

没有你说的问题:
  1. (defun c:ttD (/ BLKREF)
  2.   (setq BLKREF (vlax-ename->vla-object (car (Nentsel "\n 删除块属性,点选:"))))
  3.   (vla-DELETE BLKREF)
  4. )
  5. (defun c:tt (/ BLKREF)
  6.   (setq BLKREF (vlax-ename->vla-object (car (entsel "\n 检查块属性值,点选块:"))))
  7.   (MAPCAR 'VLA-GET-TEXTSTRING (vlaX-INVOKE  BLKREF 'getattributes))
  8. )
 楼主| 发表于 2008-2-17 16:55 | 显示全部楼层
无痕发表于2008-2-16 18:51:00没有你说的问题:(defun c:ttD (/ BLKREF)  (setq BLKREF (vlax-ename->vla-object (car (Nentsel \"\n 删除块属性,点选:\"))))  (vla-DELETE BLKREF))(defun c:tt (/ BLKREF)&nb

先谢过,我这样删除属性的:

(defun c:tt (/ ss1 Height sslenth n)
  (setq ss1 (ssget '((0 . "INSERT"))))
  (setq sslenth (sslength ss1))
  (setq BLK (ssname ss1 0))
  (if (and
 (setq BLKREF (vlax-ename->vla-object BLK))
 (= (vlax-get-PROPERTY BLKREF "Hasattributes") ':vlax-true)
      )
    (progn
      (setq ENT (vlax-safearray->list
    (vlax-variant-value (vla-getattributes BLKREF))
  )
      )
      (vla-Delete (car ENT))
      (vlax-invoke-method (car ENT) 'Update)
      (vlax-invoke-method BLKREF 'Update)
    )
  )
)

然后执行下面这段,下面这段执行到红色部分就出错:

(defun c:tt (/ BLKREF)
  (setq BLKREF (vlax-ename->vla-object (car (entsel))))
  (vla-getattributes BLKREF)
)

发表于 2008-2-17 19:38 | 显示全部楼层

     (vla-Delete (car ENT))
      (vlax-invoke-method (car ENT) 'Update)

可能这里有问题,已经删除了,干嘛还update?

 楼主| 发表于 2008-2-17 22:25 | 显示全部楼层
无痕发表于2008-2-17 19:38:00     (vla-Delete (car ENT))      (vlax-invoke-method (car ENT) 'Update)可能这里有问题,已经删除了,干嘛还update?

嗯,把这句删除后再执行下面也会出错:

(defun c:tt1 (/ BLKREF)
  (setq BLKREF (vlax-ename->vla-object (car (entsel))))
  (vla-getattributes BLKREF)
)

发表于 2008-2-18 10:55 | 显示全部楼层
抱歉没有注意看你的问题,属性对象不同于块内的对象.
当你不是删除第一个属性对象而是其他的属性对象的时候,vla-getattributes仍然完全可以使用.
如(vla-Delete (cadr ENT))或者(vla-Delete (last ENT))后,.vla-getattributes仍然没有问题...
为什么出错估计还是vla-getattributes的工作原理本身是通过第一个属性来获取后续的属性对象,当你删除第一个属性对象,它只能是出错了.
建议如果一定要删除第一个属性还是用entnext加判断返回其他的属性.

发表于 2008-2-18 14:08 | 显示全部楼层
没有问题啊,用我上面的程序,稍微修改以下,用ttd2删除属性,再用tt测试,不管是第几个属性,都正常返回。
测试环境:cad2006
  1. (vl-load-com)
  2. (defun c:ttD (/ BLKREF)
  3.    (setq BLKREF (vlax-ename->vla-object (car (Nentsel "\n 删除块属性,点选:"))))
  4.    (vla-DELETE BLKREF)
  5. )
  6. (defun c:ttD2 (/ BLKREF a i)
  7.    (setq BLKREF (vlax-ename->vla-object (car (entsel "\n 删除块属性,点选块:"))))
  8.    (setq i (getint "\n 删除第?个属性<1>:"))
  9.    (if (not i)(setq i 1))
  10.    (setq a (nth (1- i) (vlax-invoke  BLKREF 'getattributes)))
  11.    (if a (vla-DELETE a))
  12. )
  13. (defun c:tt (/ BLKREF)
  14.    (setq BLKREF (vlax-ename->vla-object (car (entsel "\n 检查块属性值,点选块:"))))
  15.    (MAPCAR 'vla-GET-TEXTSTRING (vlaX-INVOKE  BLKREF 'getattributes))
  16. )
 楼主| 发表于 2008-2-18 16:56 | 显示全部楼层
无痕发表于2008-2-18 14:08:00没有问题啊,用我上面的程序,稍微修改以下,用ttd2删除属性,再用tt测试,不管是第几个属性,都正常返回。测试环境:cad2006(vl-load-com)(defun c:ttD (/ BLKREF)   (setq BLKREF

用你的确实没有问题,用我的有问题

我的是从选择集里面枚举:

(setq ss1 (ssget '((0 . "INSERT"))))

 楼主| 发表于 2008-2-18 17:03 | 显示全部楼层
xxsheng发表于2008-2-18 10:55:00抱歉没有注意看你的问题,属性对象不同于块内的对象.当你不是删除第一个属性对象而是其他的属性对象的时候,vla-getattributes仍然完全可以使用.如(vla-Delete (cadr ENT))或者(vla-Delete (last

先谢了,确实是这样:不是删除第一个属性对象而是其他的属性对象的时候,vla-getattributes仍然完全可以使用

如果一定要删除第一属性对象呢?

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

本版积分规则

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

GMT+8, 2024-5-8 06:17 , Processed in 0.273312 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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