明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1032|回复: 16

[提问] 怎样获取这种图块的最小点与最大点

[复制链接]
发表于 2024-8-5 13:50:39 | 显示全部楼层 |阅读模式
如图所示,我选择左上角的图框块,获取最小点与最大点,画出红色的框线,但这并不是我想要的,我想要的是左下角的效果。然后我把这个图框打散,发现问题所在。这是因为图框中的多行文字造成的。

问题是,选择这样的图框,怎样避开块中的文字影响,达到左下角的效果?



附上我获得最小点与最大点的代码
  1. (defun c:11(/ ss1 ss2 ss i pmin name pmax minx miny maxx maxy minx0 miny0 maxx0 maxy0 pma pmi)
  2. (setq minx0 1e6  miny0 1e6 maxx0 -1e6  maxy0 -1e6)
  3. (setq ss1 (cadr (ssgetfirst)))
  4. (if (null ss1)(setq ss2 (ssget ":s")))
  5. (if ss1 (setq ss ss1)(setq ss ss2))
  6. (repeat (setq i (sslength ss))
  7. (setq name (ssname ss (setq i (1- i))))
  8. (vla-getboundingbox (vlax-ename->vla-object name) 'minpoint 'maxpoint)
  9. (setq pmax (vlax-safearray->list maxpoint)  pmin (vlax-safearray->list minpoint))
  10. (setq minx (car pmin)  maxx (car pmax)  miny (cadr pmin)  maxy (cadr pmax))
  11. (if (> minx0 minx) (setq minx0 minx))
  12. (if (> miny0 miny) (setq miny0 miny))
  13. (if (< maxx0 maxx) (setq maxx0 maxx))
  14. (if (< maxy0 maxy) (setq maxy0 maxy))
  15. )
  16. (setq pmi (list minx0 miny0 0.0))  ;;最小点
  17. (setq pma (list maxx0 maxy0 0.0))  ;;最大点
  18. (if ss2 (vl-cmdf "rectang" "non" pmi "non" pma) )
  19. (princ)
  20. )


本帖子中包含更多资源

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

x

点评

看多行文字占多宽,坐标减掉这个宽度即可。其他倍数,按块比例运算。  发表于 2024-8-5 14:02
发表于 2024-8-5 16:37:36 | 显示全部楼层
(defun c:tt (/ dxm ss1 ss2)
        (setq dxm (car (entsel "\n选择目标对象:")));获取对象名
        (command "_.copy" dxm "" "0,0" "@");原地复制对象
        (command "EXPLODE" (entlast));炸开对象
        (setq ss1 (ssget "p" ));炸开后的所有对象
        (setq ss2 (ssget "p" '((0 . "LINE,LWPOLYLINE"))));不包括文字的对象
        (get-dxj5d ss2);获取对象集的 5点
        (command "ERASE" ss1 "")
        (command "ERASE" ss2 "")
)
参考一下这个
回复 支持 1 反对 0

使用道具 举报

发表于 2024-8-5 16:12:35 | 显示全部楼层
  1. ;;说明:获得块包围盒排除属性块及文字的干扰
  2. ;;参数:BLK:obj对象
  3. ;;返回:块两点包围盒(不一定是左下右上点)
  4. (defun lm-get-blkboundingbox (blk / bnm lst llp urp)
  5.         (defun refgeom (ent / ang ang mat ocs)
  6.                 (setq enx (entget ent))
  7.                 (setq ang (cdr (assoc 50 enx)))
  8.                 (setq ocs (cdr (assoc 210 enx)))
  9.                 (list (setq
  10.                                                 mat        (mxm (mapcar '(lambda (v) (trans v 0 ocs t))
  11.                                                                                          '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  12.                                                                                  )
  13.                                                                         (mxm (list        (list (cos ang) (- (sin ang)) 0.0)
  14.                                                                                                  (list (sin ang) (cos ang) 0.0)
  15.                                                                                                  '(0.0 0.0 1.0)
  16.                                                                                          )
  17.                                                                                 (list        (list (cdr (assoc 41 enx)) 0.0 0.0)
  18.                                                                                         (list 0.0 (cdr (assoc 42 enx)) 0.0)
  19.                                                                                         (list 0.0 0.0 (cdr (assoc 43 enx)))
  20.                                                                                 )
  21.                                                                         )
  22.                                                                 )
  23.                                         )
  24.                         (mapcar
  25.                                 '-
  26.                                 (trans (cdr (assoc 10 enx)) ocs 0)
  27.                                 (mxv mat
  28.                                         (cdr (assoc 10 (tblsearch "block" (cdr (assoc 2 enx)))))
  29.                                 )
  30.                         )
  31.                 )
  32.         )
  33.         (defun mxv (m v)
  34.                 (mapcar '(lambda (r) (apply '+ (mapcar '* r v)))
  35.                         m
  36.                 )
  37.         )
  38.         (defun trp (m) (apply 'mapcar (cons 'list m)))
  39.         (defun mxm (m n)
  40.                 ((lambda (a) (mapcar '(lambda (r) (mxv a r)) m)) (trp n))
  41.         )
  42.         (setq acaddoc (vla-get-activedocument (vlax-get-acad-object)))
  43.         (setq bnm (strcase (vla-get-name blk)))
  44.         (cond
  45.                 ((setq lst (cdr (assoc bnm lm:blockboundingbox))))
  46.                 (t
  47.                         (vlax-for obj (vla-item (vla-get-blocks acaddoc) bnm)
  48.                                 (cond
  49.                                         ((and
  50.                                                  (= :vlax-true (vla-get-Visible OBJ))
  51.                                                  (= "AcDbBlockReference" (vla-get-objectname obj))
  52.                                          )
  53.                                                 (setq lst (append lst (lm-get-blkboundingbox obj)))
  54.                                         )
  55.                                         ((and
  56.                                                  (= :vlax-true (vla-get-visible obj))
  57.                                                  (not        (wcmatch (vla-get-objectname obj) "AcDbAttributeDefinition,AcDb*Text,TDb*Text"))
  58.                                                  (not        (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox(list obj 'llp 'urp))))
  59.                                          )
  60.                                                 (setq lst (vl-list* (vlax-safearray->list llp)(vlax-safearray->list urp)lst))
  61.                                         )
  62.                                 )
  63.                         )
  64.                 )
  65.         )
  66.         (cond
  67.                 (lst
  68.                         (setq lst (mapcar'(lambda (fun) (apply 'mapcar (cons fun lst)))'(min max)))
  69.                         (setq        lm:blockboundingbox (cons (cons bnm lst) lm:blockboundingbox))
  70.                 )
  71.         )
  72.         (apply '(lambda (m v) (mapcar '(lambda (p) (mapcar '+ (mxv m p) v)) lst))(refgeom (vlax-vla-object->ename blk)))
  73. )

评分

参与人数 1明经币 +1 收起 理由
qazxswk + 1

查看全部评分

发表于 2024-8-5 14:03:47 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2024-8-13 15:14 编辑

重定义块,文字基点不要搞那么远,直接
(vla-getboundingbox (vlax-ename->vla-object name) 'minpoint 'maxpoint)


  1. (defun t1t1t1 (e / A B EB EN L NAME OBJ)
  2.   (setq en (entget e))
  3.   (setq name (cdr (assoc 2 en)))
  4.   (setq eb (TBLOBJNAME "Block" name))
  5.   (while (setq eb (entnext eb))
  6.     ;;如果不是*TEXT,ATTDEF ,求包围盒
  7.     (setq name (cdr (assoc 0 (entget eb))))
  8.     (if  (not (wcmatch name "*TEXT,ATTDEF"))
  9.       (progn
  10.   (setq obj (vlax-ename->vla-object eb))
  11.   (vla-GetBoundingBox obj 'a 'b)
  12.   (setq a (safearray-value a))
  13.   (setq b (safearray-value b))
  14.   (setq L (cons a L))
  15.   (setq L (cons b L))
  16.       )
  17.     )
  18.   )
  19.   ;;如果L存在,求包围盒
  20.   (if L
  21.     (list
  22.       (apply 'mapcar (cons 'min L))
  23.       (apply 'mapcar (cons 'max L))
  24.     )
  25.   )
  26. )


  27. ;;选择块
  28. (defun C:t1 (/ A B E L OBJ)
  29.   (setq e (car (entsel)))
  30.   ;;此块的外围盒
  31.   (setq obj (vlax-ename->vla-object e))
  32.   (vla-GetBoundingBox obj 'a 'b)
  33.   (setq a (safearray-value a))
  34.   (setq b (safearray-value b))
  35.   (setq L (cons a L))
  36.   (setq L (cons b L))
  37.   (princ (list
  38.      (apply 'mapcar (cons 'min L))
  39.      (apply 'mapcar (cons 'max L))
  40.    )
  41.   )


  42.   ;;块最小包围盒
  43.   (princ (t1t1t1 e))
  44.   (princ)
  45. )

评分

参与人数 1明经币 +1 收起 理由
qazxswk + 1

查看全部评分

发表于 2024-8-5 13:59:10 | 显示全部楼层
克隆一下块,删除里面的文本,求包围盒
 楼主| 发表于 2024-8-5 14:14:45 来自手机 | 显示全部楼层
自贡黄明儒 发表于 2024-8-5 14:03
重定义块,文字基点不要搞那么远,直接
(vla-getboundingbox (vlax-ename->vla-object name) 'minpoint 'm ...

有时候并不是选择一个图块,会同时选择多个图块的
发表于 2024-8-5 14:27:14 | 显示全部楼层
本帖最后由 天命 于 2024-8-5 14:31 编辑

多行文字的边界太远了吧,把多行文字过滤掉
发表于 2024-8-5 15:34:15 | 显示全部楼层
这个我见过啊,之前有个也是说的这个,院长说是多行字框出去了
发表于 2024-8-5 20:11:24 | 显示全部楼层
统一网名 发表于 2024-8-5 16:37
(defun c:tt (/ dxm ss1 ss2)
        (setq dxm (car (entsel "\n选择目标对象:")));获取对象名
        (command "_.c ...

简单粗暴有效
不过重块的还再炸才可以。
发表于 2024-8-13 12:37:57 | 显示全部楼层
本帖最后由 null. 于 2024-8-13 13:04 编辑

把块定义的图元找到,排除全部文字图元后,生成一个基于这个块定义位置的矩形框A后,取得这个块的矩阵,传导给矩形框A后,就得到你想要这个位置的矩形框。
这个方法还可以扩展到其他功能,根据选择块定义的中不同定义的图元,生成A图元后,再通过块的矩阵传导,块内的定点插入图元。


好吧,就是7楼写的,完全是这么干的。也不是,这个程序不用生成矩形框A,只取得基于块定义位置的最大和最小点,直接把块矩阵mat传导给这两个点。我还不会这个。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 10:09 , Processed in 0.272660 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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