怎么得到动态块的最小包围盒,谁能解决谁就是大师!!
最近在弄一个程序,想得到变尺寸的动态块的包围盒,使用(defun xxGetBoundingBox (ent / ll ur)
(vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
(mapcar 'vlax-safearray->list (list ll ur))
)
上述函数得到的尺寸总是动态块的原始包围盒,即动态块尺寸的改变,得到的包围盒总是大小相同。
我也查了很多资料,但是总是找不到解决办法,连lee-mac的最小包围盒函数都解决不了。
也试过历遍块图元的方法,哪个可以得到准确的包围盒,但是效率太低,速度太慢。
下贴一个图像:
下面上传我要处理的动态块附件
谁能解决谁就真是大师级高手!!
http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 曰微言薄论的微博 本帖最后由 曰微言薄论 于 2016-7-8 14:24 编辑
kozmosovia 发表于 2016-7-8 13:57 static/image/common/back.gif
临时将其转换成有名块再求boundingbox即可
首先,insert的dxf43 是z方向的缩放比例,你应该意思是让我把匿名块转换成普通块,我用下面的程序转换成功。
;;change Annonymous block to normal block
;;Tested in R2005
;;By LUCAS
(defun C:AN_TO_N (/ SS)
(prompt "\nSelect Annonymous block: ")
(if (setq SS (ssget ":S:E" '((0 . "INSERT") (2 . "`**"))))
(progn
(vla-put-name
(vla-item (vla-get-blocks
(vla-get-activedocument (vlax-get-acad-object))
)
(vla-get-name (vlax-ename->vla-object (ssname SS 0)))
)
"LUCAS"
)
(vla-auditinfo
(vla-get-activedocument (vlax-get-acad-object))
:vlax-true
)
)
(alert "\nNot match Annonymous block!")
)
(princ)
)
下面是转换结果:
动态块没转换前:
((-1 . <图元名: 7fffe52ccf0>) (0 . "INSERT") (5 . "C16AF") (102 . "{ACAD_XDICTIONARY") (360 . <图元名: 7fffe52cd00>) (102 . "}") (330 . <图元名: 7ffffb03f00>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "G-BORD_图框") (100 . "AcDbBlockReference") (66 . 1) (2 . "*U") (10 -167208.0 202739.0 0.0) (41 . 100.0) (42 . 100.0) (43 . 100.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
动态块转换后:
((-1 . <图元名: 7fffe6076c0>) (0 . "INSERT") (5 . "6D64") (102 . "{ACAD_XDICTIONARY") (360 . <图元名: 7fffe6076d0>) (102 . "}") (330 . <图元名: 7ffffb03f00>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "G-BORD_图框") (100 . "AcDbBlockReference") (66 . 1) (2 . "U") (10 51.0888 101406.0 0.0) (41 . 100.0) (42 . 100.0) (43 . 100.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
但是,用boundingbox函数还是一样,不能得到准确的包容盒。
我想,这其中的区别不是块名的问题,而是动态与非动态的原因,如果能将动态块转换成非动态块,估计能解决问题。
最后,谢谢你的回答~要是我操作有问题,恳请指正~~
初步写个框架,剩余的自行添加
本帖最后由 头大无恼 于 2018-10-7 20:42 编辑
;;动态块改为普通快 By Gu_xl 2013.11.13
(defun c:DynBlk2blk (/ cnt)
(if (ssget (list '(0 . "INSERT") (cons 410 (getvar 'CTAB))))
(progn
(setq cnt 0)
(vlax-for obj
(vla-get-activeselectionset
(vla-get-activedocument (vlax-get-acad-object))
)
(if (and
(vlax-property-available-p obj 'isdynamicblock)
(eq :vlax-true (vla-get-isdynamicblock obj))
)
(progn
(setq cnt (1+ cnt))
(vla-ConvertToAnonymousBlock obj)
)
)
)
(princ (strcat "\n***共修改 " (itoa cnt) " 个动态块***"))
)
)
(princ)
)
;;动态块改为普通快 By Gu_xl 2013.11.13
(defun c:tt (/ lst name blkdef blkref cnt)
(if (ssget (list '(0 . "INSERT") (cons 410 (getvar 'CTAB))))
(progn
(setq cnt 0)
(vlax-for obj
(vla-get-activeselectionset
(vla-get-activedocument (vlax-get-acad-object))
)
(if (and
(vlax-property-available-p obj 'isdynamicblock)
(eq :vlax-true (vla-get-isdynamicblock obj))
)
(progn
(setq lst nil
cnt (1+ cnt)
)
(vlax-for a (vla-item (vla-get-blocks
(vla-get-activedocument
(vlax-get-acad-object)
)
)
(vla-get-name obj)
)
(setq lst (cons a lst))
)
(setq blkdef
(vla-add
(vla-get-blocks
(vla-get-activedocument (vlax-get-acad-object))
)
(vlax-3d-point '(0 0 0))
"*U"
)
)
(vla-CopyObjects
(vla-get-activedocument (vlax-get-acad-object))
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray
vlax-vbobject
(cons 0 (1- (length lst)))
)
lst
)
)
blkdef
)
(setq name (vla-get-name blkdef))
(setq blkref
(vla-InsertBlock
(vlax-get-property
(vla-get-activedocument (vlax-get-acad-object))
(if (= 1 (getvar 'CVPORT))
'PaperSpace
'ModelSpace
)
)
(vla-get-InsertionPoint obj)
Name
(vla-get-XScaleFactor obj)
(vla-get-YScaleFactor obj)
(vla-get-ZScaleFactor obj)
(vla-get-Rotation obj)
)
)
(vla-put-layer blkref (vla-get-layer obj))
(vla-delete obj)
)
)
)
(princ (strcat "\n***共修改 " (itoa cnt) " 个动态块***"))
)
)
(princ)
)
(defun c:tt (/ cnt)
(if (ssget (list '(0 . "INSERT") (cons 410 (getvar 'CTAB))))
(progn
(setq cnt 0)
(vlax-for obj
(vla-get-activeselectionset
(vla-get-activedocument (vlax-get-acad-object))
)
(if (and
(vlax-property-available-p obj 'isdynamicblock)
(eq :vlax-true (vla-get-isdynamicblock obj))
)
(progn
(setq cnt (1+ cnt))
(vla-ConvertToAnonymousBlock obj)
)
)
)
(princ (strcat "\n***共修改 " (itoa cnt) " 个动态块***"))
)
)
(princ)
)
大师是这么定义的?管发大师证么?到庙里包吃住么? mikewolf2k 发表于 2016-7-8 09:29 static/image/common/back.gif
大师是这么定义的?管发大师证么?到庙里包吃住么?
不是小看你,这个问题你解决不了~你以为这是随便的一个问题? 取个名字叫:大师评定中心 陨落 发表于 2016-7-8 13:23 static/image/common/back.gif
取个名字叫:大师评定中心
何必呢,就不能好好动动脑筋做点正事啊~为什么你的关注点要故意跑偏~ 本帖最后由 kozmosovia 于 2016-7-8 13:59 编辑
临时将其转换成有名块再求boundingbox即可 问题不在你的代码和获取动态块的式,而在你做的动态块
没有打开你的动态块仔细研究,但我猜测你有隐藏了部分对象,这些对象虽然看不到,但却是实在占用空间的,boundingbox返回的正是这个尺寸 本帖最后由 曰微言薄论 于 2016-7-8 19:31 编辑
vectra 发表于 2016-7-8 17:25 static/image/common/back.gif
问题不在你的代码和获取动态块的式,而在你做的动态块
没有打开你的动态块仔细研究,但我猜测你有隐藏了 ...
对的,这个动态块是可变尺寸的,确实隐藏了一些图元,比如A2图框时,就把其他尺寸的图签隐藏,只显示A2的图签~所以才是头痛的地方~
而我正是希望得到这种动态块的包容盒。 那就别怕效率低,遍历块内可见图元或者炸开图块遍历