曰微言薄论 发表于 2016-7-7 21:53:32

怎么得到动态块的最小包围盒,谁能解决谁就是大师!!

最近在弄一个程序,想得到变尺寸的动态块的包围盒,使用
(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:17:55

本帖最后由 曰微言薄论 于 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函数还是一样,不能得到准确的包容盒。
我想,这其中的区别不是块名的问题,而是动态与非动态的原因,如果能将动态块转换成非动态块,估计能解决问题。
最后,谢谢你的回答~要是我操作有问题,恳请指正~~

小菜123 发表于 2016-7-10 21:20:57

初步写个框架,剩余的自行添加



头大无恼 发表于 2018-10-7 19:30:03

本帖最后由 头大无恼 于 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:39

大师是这么定义的?管发大师证么?到庙里包吃住么?

曰微言薄论 发表于 2016-7-8 11:04:39

mikewolf2k 发表于 2016-7-8 09:29 static/image/common/back.gif
大师是这么定义的?管发大师证么?到庙里包吃住么?

不是小看你,这个问题你解决不了~你以为这是随便的一个问题?

陨落 发表于 2016-7-8 13:23:24

取个名字叫:大师评定中心

曰微言薄论 发表于 2016-7-8 13:41:47

陨落 发表于 2016-7-8 13:23 static/image/common/back.gif
取个名字叫:大师评定中心

何必呢,就不能好好动动脑筋做点正事啊~为什么你的关注点要故意跑偏~

kozmosovia 发表于 2016-7-8 13:57:35

本帖最后由 kozmosovia 于 2016-7-8 13:59 编辑

临时将其转换成有名块再求boundingbox即可

vectra 发表于 2016-7-8 17:25:22

问题不在你的代码和获取动态块的式,而在你做的动态块

没有打开你的动态块仔细研究,但我猜测你有隐藏了部分对象,这些对象虽然看不到,但却是实在占用空间的,boundingbox返回的正是这个尺寸

曰微言薄论 发表于 2016-7-8 19:29:08

本帖最后由 曰微言薄论 于 2016-7-8 19:31 编辑

vectra 发表于 2016-7-8 17:25 static/image/common/back.gif
问题不在你的代码和获取动态块的式,而在你做的动态块

没有打开你的动态块仔细研究,但我猜测你有隐藏了 ...
对的,这个动态块是可变尺寸的,确实隐藏了一些图元,比如A2图框时,就把其他尺寸的图签隐藏,只显示A2的图签~所以才是头痛的地方~

而我正是希望得到这种动态块的包容盒。

kozmosovia 发表于 2016-7-9 11:19:11

那就别怕效率低,遍历块内可见图元或者炸开图块遍历
页: [1] 2 3 4
查看完整版本: 怎么得到动态块的最小包围盒,谁能解决谁就是大师!!