明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8689|回复: 43

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

[复制链接]
发表于 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的最小包围盒函数都解决不了。
也试过历遍块图元的方法,哪个可以得到准确的包围盒,但是效率太低,速度太慢。
下贴一个图像:

下面上传我要处理的动态块附件

谁能解决谁就真是大师级高手!!


该贴已经同步到 曰微言薄论的微博

本帖子中包含更多资源

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

x

点评

块中制图和专业负责的英文出自何处?似有问题  发表于 2016-7-10 20:15
 楼主| 发表于 2016-7-8 14:17:55 | 显示全部楼层
本帖最后由 曰微言薄论 于 2016-7-8 14:24 编辑
kozmosovia 发表于 2016-7-8 13:57
临时将其转换成有名块再求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函数还是一样,不能得到准确的包容盒。
我想,这其中的区别不是块名的问题,而是动态与非动态的原因,如果能将动态块转换成非动态块,估计能解决问题。
最后,谢谢你的回答~要是我操作有问题,恳请指正~~
回复 支持 1 反对 0

使用道具 举报

发表于 2016-7-10 21:20:57 | 显示全部楼层
初步写个框架,剩余的自行添加



本帖子中包含更多资源

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

x

点评

MXS
可以使用很厉害  发表于 2024-3-27 18:33
回复 支持 1 反对 0

使用道具 举报

发表于 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)
)
发表于 2016-7-8 09:29:39 | 显示全部楼层
大师是这么定义的?管发大师证么?到庙里包吃住么?
 楼主| 发表于 2016-7-8 11:04:39 | 显示全部楼层
mikewolf2k 发表于 2016-7-8 09:29
大师是这么定义的?管发大师证么?到庙里包吃住么?

不是小看你,这个问题你解决不了~你以为这是随便的一个问题?
发表于 2016-7-8 13:23:24 | 显示全部楼层
取个名字叫:大师评定中心
 楼主| 发表于 2016-7-8 13:41:47 | 显示全部楼层
陨落 发表于 2016-7-8 13:23
取个名字叫:大师评定中心

何必呢,就不能好好动动脑筋做点正事啊~为什么你的关注点要故意跑偏~
发表于 2016-7-8 13:57:35 | 显示全部楼层
本帖最后由 kozmosovia 于 2016-7-8 13:59 编辑

临时将其转换成有名块再求boundingbox即可
发表于 2016-7-8 17:25:22 | 显示全部楼层
问题不在你的代码和获取动态块的式,而在你做的动态块

没有打开你的动态块仔细研究,但我猜测你有隐藏了部分对象,这些对象虽然看不到,但却是实在占用空间的,boundingbox返回的正是这个尺寸
 楼主| 发表于 2016-7-8 19:29:08 | 显示全部楼层
本帖最后由 曰微言薄论 于 2016-7-8 19:31 编辑
vectra 发表于 2016-7-8 17:25
问题不在你的代码和获取动态块的式,而在你做的动态块

没有打开你的动态块仔细研究,但我猜测你有隐藏了 ...

对的,这个动态块是可变尺寸的,确实隐藏了一些图元,比如A2图框时,就把其他尺寸的图签隐藏,只显示A2的图签~所以才是头痛的地方~

而我正是希望得到这种动态块的包容盒。
发表于 2016-7-9 11:19:11 | 显示全部楼层
那就别怕效率低,遍历块内可见图元或者炸开图块遍历
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 21:44 , Processed in 0.166251 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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