找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 725|回复: 6

[求助] [求助]:这些是不是VLISP的BUG?

[复制链接]
发表于 2006-5-7 14:04:53 | 显示全部楼层 |阅读模式

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

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

×
1、附件中一个块经以下命令后得到的结果和直接用explode命令得到的结果不同,是什么原因呢?
(vlax-invoke (vlax-ename->vla-object (car(entsel))) "Explode")

2、Xref是不能被explode的,即对一个外部引用块使用:(vlax-invoke (vlax-ename->vla-object (car(entsel))) "Explode")会出错退出,但用(vlax-method-applicable-p (vlax-ename->vla-object (car(entsel))) "Explode")测试,却返回T,这时只有用(vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke (list (vlax-ename->vla-object (car(entsel))) "Explode")))才能判断出该外部引用不能使用expolde方法,是什么原因呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2006-5-7 14:42:06 | 显示全部楼层
DWG文件的附件在这里
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-5-8 01:12:59 | 显示全部楼层
1 ActiveX 模型中的 Explode 本来就不好用,首先Explode 方法对非等比插入的块无效,会提示错误,你的例图中块虽然显示比例一样,其实是不同的

  1. _$ (rtos (vla-get-xscalefactor (vlax-ename->vla-object (car (entsel)))) 2 12)
  2. "45.599999997765"
  3. _$ (rtos (vla-get-yscalefactor (vlax-ename->vla-object (car (entsel)))) 2 12)
  4. "45.600000000559"
  5. _$ (rtos (vla-get-zscalefactor (vlax-ename->vla-object (car (entsel)))) 2 12)
  6. "45.6"
  7. _$
复制代码

在特性管理器中修改比例因子成为等比块就可以使用 Explode 方法,另外炸开后没有丢失“圆”

2 Xref 在ActiveX和DXF中是没有这个对象的,它属于 Block,在DXF中是Insert,而BlockReferencer是支持 Explode 方法的,当然用 vlax-method-applicable-p 会返回 T,vlax-method-applicable-p 只检测对象是否支持指定的方法,至于使用该方法是否成功 vlax-method-applicable-p 是不管的。某些方法比如 Explode 的 BUG 在ActiveX的帮助中是没有说明的(帮助中只是说参照 Explode命令,其实两者是不同的),这要靠在实践中积累。
判断块是否是参照应该用

  1. _$ (vla-get-isxref
  2.      (vla-item (vla-get-blocks
  3.                  (vla-get-activedocument (vlax-get-acad-object))
  4.                )
  5.                (vla-get-name (vlax-ename->vla-object (car (entsel))))
  6.      )
  7.    )
  8. :vlax-true
  9. _$
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-8 02:39:22 | 显示全部楼层
补充一下。两种方法取xref名列表,并构造选集。

  1. ;|(vgetxrefns)=取得xref名列表---by.雨箭风刀.2006.5|;
  2. (defun vgetxrefns (/ lst)
  3.   (vlax-map-collection
  4.     (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
  5.     '(lambda (x)
  6.        (if (equal :vlax-true (vla-get-isxref x))
  7.          (setq lst (cons (vla-get-name x) lst))
  8.        )
  9.      )
  10.   )
  11.   lst
  12. )
  13. ;|(getxrefns)=取得xref名列表--by.雨箭风刀.2006.5|;
  14. (defun getxrefns (/ xr lst)
  15.   (while (setq xr (tblnext "BLOCK" (not xr)))
  16.     (if (< 3 (cdr (assoc 70 x)))
  17.       (setq lst (cons (cdr (assoc 2 x)) lst))
  18.     )
  19.   )
  20. )
  21. ;; 构造xref选集:
  22. ;; 调用: (xgetxrefs)
  23. (defun xgetxrefs (/ fil)
  24.   ;;构造字符过滤器.如: "0,xr,标注"
  25.   (setq fil (apply 'strcat (mapcar '(lambda (x) (strcat x ",")) (getxrefns)))) ;或(vgetxrefns)
  26.   (ssget (list '(0 . "INSERT") (CONS 2 fil)))
  27. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-8 09:41:00 | 显示全部楼层
多谢楼上两位高人指点,关于判断块是否是外部引用,我发现还可以用下面的函数,虽然比不上eachy斑竹的方法正宗,但也行之有效:
(defun isxref (blk) ;测试 (isxref (car(entsel)))  测试一个块是否是外部引用
  (if (= (type blk) 'ENAME) (setq blk (vlax-ename->vla-object blk)))
  (vlax-property-available-p blk 'Path)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-5-9 04:04:49 | 显示全部楼层
用 70 判断是否为 XREF 不完全,当不保存路径的时候 为 0,普通块的也为 0

块类型标志(按位编码值,可以组合使用):

0 = 表示不应用下列任何标志

1 = 由图案填充、关联标注、其他内部操作或应用程序生成的匿名块

2 = 块具有非固定属性定义(如果块具有任何固定属性定义或根本没有属性定义,则不设置此位)

4 = 块是外部参照 (xref)

8 = 块是外部参照覆盖

16 = 块依赖外部参照

32 = 块是融入的外部参照,或者依赖外部参照(输入时被忽略)

64 = 定义是被引用的外部参照(输入时

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

使用道具 举报

 楼主| 发表于 2006-5-9 08:46:30 | 显示全部楼层
我试了一下,不等比例块使用explode方法的结果不确定,但不会出错退出,得到的实体与explode命令不同。
能否把这个帖子变成VLISP的“BUG”汇总帖,有些问题只有在编程时遇到才会发现,如果大家把自己遇到的情况都列出来,也许能帮助别人少走弯路。
我还遇到过IntersectWith出错的情况,当其中一个实体是极短线时,即使采用acExtendNone选项,也会得到交点,实际上是没有交点的
vla-GetBoundingBox函数对于MTEXT或含有MTEXT实体的块,其返回点常常不是真正需要的点,可能是MTEXT的范围,如:"\f黑体|b0|i0|c134|p2;有限责任公司"这样的MTEXT
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 14:31 , Processed in 0.256553 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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