明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 曰微言薄论

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

[复制链接]
发表于 2016-7-12 16:37 | 显示全部楼层
本帖最后由 陨落 于 2016-7-12 16:39 编辑
曰微言薄论 发表于 2016-7-12 15:10
炸开不慢,历遍也不慢,但是慢在处理么多对象的包围盒

(defun c:tt()
  (vl-load-com)
  (setq blk(car (entsel"\n选择块"))
        bwb nil)
  (foreach x(setq exploded(vlax-safearray->list (vlax-variant-value(vla-explode (vlax-ename->vla-object blk)))))
    (if (not (wcmatch (cdr (assoc 0(entget(setq enx(vlax-vla-object->ename x))))) "*TEXT"))
    (PROGN(vla-getboundingbox x 'pt1 'pt2)
        (setq pt1 (vlax-safearray->list pt1)
        pt2 (vlax-safearray->list pt2)
        bwb(cons pt1 bwb)
        bwb(cons pt2 bwb))
      )
      )
   
    )
  (foreach x exploded(entdel (vlax-vla-object->ename x)))
    (setq bwb (vl-sort bwb'(lambda (e1 e2) (< (car e1) (car e2))))
        x1 (car(car bwb))
        x2 (car(last bwb)))
    (setq bwb (vl-sort bwb'(lambda (e1 e2) (< (cadr e1) (cadr e2))))
        y1 (cadr(car bwb))
        y2 (cadr(last bwb)))
  (setq box(list (list x1 y1)(list x2 y2)))
  (command "rectangle" (car box)(cadr box))
  (vla-put-color (vlax-ename->vla-object (entlast))1)
  )
包括rectangle在内,处理一个动态块不到1s,应该比手动要快了,代码还有很大的优化空间
不知道楼主的20s是怎么写的
 楼主| 发表于 2016-7-12 16:52 | 显示全部楼层
陨落 发表于 2016-7-12 16:37
(defun c:tt()
  (vl-load-com)
  (setq blk(car (entsel"\n选择块"))

不知道你用附件中的动态块尝试了没有。我这边用你的函数处理结果是,只能炸开块,不能够生成包围盒。
发表于 2016-7-12 16:56 | 显示全部楼层
曰微言薄论 发表于 2016-7-12 16:52
不知道你用附件中的动态块尝试了没有。我这边用你的函数处理结果是,只能炸开块,不能够生成包围盒。

用的就是你的附件测试的

本帖子中包含更多资源

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

x
 楼主| 发表于 2016-7-12 17:26 | 显示全部楼层

我用你的代码,结果是上面的样子,有些准确有些错误。

本帖子中包含更多资源

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

x
 楼主| 发表于 2016-7-12 17:30 | 显示全部楼层
陨落 发表于 2016-7-12 16:56
用的就是你的附件测试的

有没有不用炸开的方法能得到包围盒?或者思路?
发表于 2016-7-12 20:14 | 显示全部楼层
曰微言薄论 发表于 2016-7-12 17:26
我用你的代码,结果是上面的样子,有些准确有些错误。

图再传上来看看
发表于 2016-7-12 23:36 | 显示全部楼层
本帖最后由 小菜123 于 2016-7-13 08:39 编辑

可能是楼主的CAD有问题,不要用简化版,原盘安装
速度慢的一个原因是因为块中的文字都打碎成线了,实体数量过多

本帖子中包含更多资源

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

x
发表于 2016-7-13 14:32 | 显示全部楼层
对于这种奇葩块,最快还是我之前说的,炸开只选择四个顶点的封闭多线段来求包围框最快。
发表于 2018-10-7 19:23 | 显示全部楼层
曰微言薄论 发表于 2016-7-12 17:30
有没有不用炸开的方法能得到包围盒?或者思路?

先把动态块在位复制一个,再用entmod重写,得到一个与之前动态块一样的匿名块,,去除动态块的属性,然后再计算包围框,再删除匿名块
发表于 2018-10-7 19:30 | 显示全部楼层
本帖最后由 头大无恼 于 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)
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-9 04:57 , Processed in 0.183907 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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