明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1083|回复: 11

[提问] 批量执行的边界盒,有可能实现吗?

[复制链接]
发表于 2023-12-8 16:14 | 显示全部楼层 |阅读模式
引用一段源码,来自PF工具



  1. ;【PF工具箱--自动边界盒】
  2. (defun c:bjh (/ ss i l1 l2 ll ur os d)
  3.    (setq os (getvar 'osmode))
  4.    (PRINC "\n【PF工具箱--QQ交流群:214654218】--自动边界盒 ")(PRINC)  
  5.    (setq d (getreal "\n偏距<5>"))
  6.    (if (null d)
  7.      (setq d 5)
  8.    )
  9.    (setq ss (ssget))
  10.    (repeat (setq i (sslength ss))
  11.      (vla-getboundingbox
  12.        (vlax-ename->vla-object (ssname ss (setq i (1- i))))
  13.        'll
  14.        'ur
  15.      )
  16.      (setq l1 (cons (vlax-safearray->list ll) l1)
  17.            l2 (cons (vlax-safearray->list ur) l2)
  18.      )
  19.    )
  20.    (mapcar 'set
  21.            (list 'll 'ur)
  22.            (mapcar '(lambda (a b) (apply 'mapcar (cons a b)))
  23.                    '(min max)
  24.                    (list l1 l2)
  25.            )
  26.    )
  27.    (command
  28.      "rectang"
  29.      (trans (polar ll (* pi 1.25) (setq d (sqrt (+ (* d d) (* d d)))))
  30.             0
  31.             1
  32.      )
  33.      (trans (polar ur (* pi 0.25) d) 0 1)
  34.    )
  35.    (setvar 'osmode os)
  36.    (princ)
  37. )





程序很好,但是针对框选的两点,来生成边界框;假如图形中有多个需要框选的“范围”,这些“范围”,如何被批量的识别及生成边界框,是个问题;




本帖子中包含更多资源

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

x
发表于 2023-12-8 20:09 | 显示全部楼层
本帖最后由 yoyoho 于 2023-12-9 22:58 编辑

;;框选物体画框 By Gu_xl 明经通道 2014.05.12
;;新增物件 模糊距离
;;新增包围盒 外偏距离
(defun c:mBox (/ BOX INTERSECT RECTANG SS N L A L1 FLAG B C)

   (IF (= DIST2 NIL)
       (SETQ DIST2 50)  ;;;变数值需预设
   )
      (IF (/= DIST2 NIL) (SETQ DIST2-S DIST2) (SETQ DIST2 50))
        (PRINC "\n 物件 模糊距离 (")(PRINC (FIX DIST2))(PRINC "):")
    (setq DIST2 (GETDIST))
    (IF (= DIST2 NIL)(SETQ DIST2 DIST2-S))

   (IF (= DIST3 NIL)
       (SETQ DIST3 10)  ;;;变数值需预设
   )
      (IF (/= DIST3 NIL) (SETQ DIST3-S DIST3) (SETQ DIST3 10))
        (PRINC "\n 包围盒 外偏距离 (")(PRINC (FIX DIST3))(PRINC "):")
    (setq DIST3 (GETDIST))
    (IF (= DIST3 NIL)(SETQ DIST3 DIST3-S))

    (setq DIST4 (- DIST2 DIST3))

(defun box (e / p1 p2 p3 p4 obj)
    (setq obj (vlax-ename->vla-object e))
    (vla-GetBoundingBox obj 'p1 'p3)
    (setq p1 (vlax-safearray->list p1)
          p3 (vlax-safearray->list p3)
          p2 (list (car p1) (cadr p3) (caddr p1))
          p4 (list (car p3) (cadr p1) (caddr p1))
    )
    (if (= "SPLINE" (cdr (assoc 0 (entget e))))
      (progn
        (SETQ lst
               (mapcar '(lambda (a b)
                          (vlax-curve-getClosestPointToProjection e a b t)
                        )
                       (list p1 p2 p3 p4)
                       '((1.0 0 0) (0 -1.0 0) (-1.0 0 0) (0 1.0 0))
               )
        )
        (list
          (apply 'mapcar (cons 'min lst))
          (apply 'mapcar (cons 'max lst))
        )
      )
      ;(SETQ P1 (mapcar '+ P1 (LIST (* DIST2 -1) (* DIST2 -1))))      ;;;DIST2包围盒外偏距离
      ;(SETQ P3 (mapcar '+ P3 (LIST (* DIST2 1) (* DIST2 1))))
      ;(SETQ P11 (LIST (* -1 DIST2) (* -1  DIST2)))
      ;(SETQ P1 (mapcar '+ P1 P11))      ;;;DIST2包围盒外偏距离
      (list p1 p3)
    )
)
  (defun intersect (a b)
    (if
      (or
        (and
          (<= (caar a) (caar b) (caadr a))
          (<= (cadar a) (cadar b) (cadadr a))
        )
        (and
          (<= (caar a) (caar b) (caadr a))
          (<= (cadar a) (cadadr b) (cadadr a))
        )
        (and
          (<= (caar a) (caadr b) (caadr a))
          (<= (cadar a) (cadadr b) (cadadr a))
        )
        (and
          (<= (caar a) (caadr b) (caadr a))
          (<= (cadar a) (cadar b) (cadadr a))
        )

      )
       (list
         (apply 'mapcar (cons 'min (append a b)))
         (apply 'mapcar (cons 'max (append a b)))
       )
    )
  )
  (defun rectang (a b)
    (entmake
      (list
        '(0 . "LWPOLYLINE")
        '(100 . "AcDbEntity")
        '(8 . "0")  ;;;'(8 . "辅助线")
        '(62 . 256)
        '(100 . "AcDbPolyline")
        '(90 . 4)
        '(70 . 1)
        (cons 10 a)
        (list 10 (car a) (cadr b))
        (cons 10 b)
        (list 10 (car b) (cadr a))
      )
    )
  )
  (if (setq ss (ssget))
    (progn
      (repeat (setq n (sslength ss))
        (SETQ PTS (box (ssname ss (setq n (1- n)))))
        (SETQ P1 (mapcar '+ (NTH 0 PTS) (LIST (* DIST2 -1) (* DIST2 -1))))
        (SETQ P3 (mapcar '+ (NTH 1 PTS) (LIST (* DIST2 1) (* DIST2 1))))
        (setq l (cons (list P1 P3) l))
      )
      (setq l
             (vl-sort
               l
               '(lambda (a b)
                  (if (equal (caar a) (caar b) 1e-3)
                    (if (equal (cadar a) (cadar b) 1e-3)
                      (if (equal (caadr a) (caadr b) 1e-3)
                        (< (cadadr a) (cadadr b))
                        (< (caadr a) (caadr b))
                      )
                      (< (cadar a) (cadar b))
                    )
                    (< (caar a) (caar b))
                  )
                )
             )
      )
      (setq a (car l)
            l (cdr l)
      )
      (while l
        (setq l1   nil
              flag nil
        )
        (while l
          (setq b (car l)
                l (cdr l)
          )
          (if (setq c (intersect a b))
            (setq a c
                  flag t
            )
            (setq l1 (cons b l1))
          )
        )
        (setq l (reverse l1))
        (if (not flag)
          (progn
            (rectang (mapcar '+ (car a) (LIST (* DIST4 1) (* DIST4 1)))
                     (mapcar '+ (cadr a) (LIST (* DIST4 -1) (* DIST4 -1)))
            )
            (setq a (car l)
                  l (cdr l)
            )
          )
        )
        (if (not l)
          (rectang (mapcar '+ (car a) (LIST (* DIST4 1) (* DIST4 1)))
                   (mapcar '+ (cadr a) (LIST (* DIST4 -1) (* DIST4 -1)))
          )
        )
      )
    )
  )
  (princ)
)

评分

参与人数 1明经币 +1 收起 理由
lengxiaxi + 1 非常好用,感谢热情回帖!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-12-8 19:48 | 显示全部楼层
飞雪神光 发表于 2023-12-8 17:16
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=188763&highlight=%B7%D6%D7%E9
http://bbs.mjtd.com/ ...

感谢老铁

下面的程序,来自【世并】

  1. (defun c:tt (/ wkjl ss lst obj maxp minp flst nlst maxpx maxpy pt )
  2.   (IF (NULL *wkjl) (setq *wkjl 30.0))
  3.    (setq wkjl (GETREAL (strcat "\n外扩距离<" (rtos *wkjl 2 2) ">:")))
  4.    (if (NULL wkjl) (setq wkjl *wkjl) (setq *wkjl wkjl))
  5.   
  6.   (setq ss (ssget))
  7.   (setq  lst
  8.    (mapcar '(lambda (x)
  9.         (setq obj (vlax-ename->vla-object x))
  10.         (vla-getboundingbox obj 'minp 'maxp)
  11.         (setq
  12.           maxp (mapcar '* '(1.0 1.0) (vlax-safearray->list maxp))
  13.         )
  14.         (setq
  15.           minp (mapcar '* '(1.0 1.0) (vlax-safearray->list minp))
  16.         )
  17.         (list x (car minp) (car maxp) (cadr minp) (cadr maxp))
  18.       )
  19.      (vl-remove-if-not
  20.        '(lambda (x) (= 'ENAME (type x)))
  21.        (apply 'append (ssnamex ss))
  22.      )
  23.    )
  24.   )
  25.   (setq  flst (lambda (lst key)
  26.          (if lst
  27.      (if key
  28.        (progn
  29.          (setq nlst   (list (list (caar lst)
  30.                (cadddr (car lst))
  31.                (last (car lst))
  32.          ))
  33.          maxpx (caddar lst)
  34.          lst   (cdr lst)
  35.          )
  36.          (while (and lst (<= (cadar lst) maxpx))
  37.            (setq nlst  (cons (list (caar lst)
  38.                  (cadddr (car lst))
  39.                  (last (car lst))
  40.            )
  41.            nlst
  42.            )
  43.            maxpx (max maxpx (caddar lst))
  44.            lst   (cdr lst)
  45.            )
  46.          )
  47.          (cons nlst (flst lst key))
  48.        )
  49.        (progn
  50.          (setq nlst   (list (caar lst))
  51.          maxpy (caddar lst)
  52.          lst   (cdr lst)
  53.          )
  54.          (while (and lst (<= (cadar lst) maxpy))
  55.            (setq nlst  (cons (caar lst) nlst)
  56.            maxpy (max maxpy (caddar lst))
  57.            lst   (cdr lst)
  58.            )
  59.          )
  60.          (cons nlst (flst lst key))
  61.        )
  62.      )
  63.          )
  64.        )
  65.   )
  66.   (setq
  67.     lst
  68.      (apply
  69.        'append
  70.        (mapcar
  71.    '(lambda (wlst)
  72.       (flst (vl-sort wlst '(lambda (a b) (< (cadr a) (cadr b))))
  73.       nil
  74.       )
  75.     )
  76.    (flst (vl-sort lst '(lambda (a b) (< (cadr a) (cadr b)))) t)
  77.        )
  78.      )
  79.   )
  80.   (mapcar
  81.     '(lambda (x)
  82.        (setq pt (apply
  83.    'append
  84.    (mapcar
  85.      '(lambda (ent)
  86.         (vla-getboundingbox (vlax-ename->vla-object ent) 'minp 'maxp)
  87.         (list (mapcar '* '(1.0 1.0) (vlax-safearray->list maxp))
  88.           (mapcar '* '(1.0 1.0) (vlax-safearray->list minp))
  89.         )
  90.       )
  91.      x
  92.    )
  93.        ))
  94.        (setq minp (mapcar '- (apply 'mapcar (cons 'min pt)) (list wkjl wkjl)))
  95.        (setq maxp (mapcar '+ (apply 'mapcar (cons 'max pt)) (list wkjl wkjl)))
  96.        (entmake  (list '(0 . "LWPOLYLINE")
  97.           '(100 . "AcDbEntity")
  98.           '(100 . "AcDbPolyline")
  99.           '(90 . 4)
  100.           '(70 . 1)
  101.           '(62 . 1)
  102.           (cons 10 minp)
  103.           (cons 10 (list (car minp) (cadr maxp)))
  104.           (cons 10 maxp)
  105.           (cons 10 (list (car maxp) (cadr minp)))
  106.     )
  107.        )
  108.      )
  109.     lst
  110.   )
  111.   (princ)
  112. )


可以批量求出最大边界,如果对象obj,包含文字,该怎样修改程序?
发表于 2023-12-8 17:16 | 显示全部楼层
发表于 2023-12-8 19:56 | 显示全部楼层
lengxiaxi 发表于 2023-12-8 19:48
感谢老铁

下面的程序,来自【世并】

嗯 他加了句手输外扩距离 包含文字有什么影响吗 和对象又有什么关系呢
发表于 2023-12-8 21:03 | 显示全部楼层



本帖子中包含更多资源

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

x
发表于 2023-12-8 21:10 | 显示全部楼层



本帖子中包含更多资源

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

x
发表于 2023-12-8 23:19 | 显示全部楼层

真厉害,感谢分享
 楼主| 发表于 2023-12-9 08:02 | 显示全部楼层

感谢院长回复,荣幸至极
发表于 2023-12-9 18:02 | 显示全部楼层
路过,收下各位前辈的代码,感谢有您。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 16:42 , Processed in 0.846375 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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