乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 96|回复: 13

[编程交流] 所有对象的边界框?

[复制链接]

6

主题

48

帖子

44

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 16:43:35 | 显示全部楼层 |阅读模式
我似乎记得能够返回当前图形中所有对象的边界框。类似于最大化显示。这是我编的吗?
 
布瑞恩
回复

使用道具 举报

22

主题

272

帖子

254

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2022-7-5 16:49:15 | 显示全部楼层
多亏了Vovka
bbox。拉链
回复

使用道具 举报

1

主题

316

帖子

311

银币

初来乍到

Rank: 1

铜币
29
发表于 2022-7-5 16:53:55 | 显示全部楼层
  1. ;;;***********************************************************************************
  2. ;;;PROGRAM CREATED FOR SELECTION SET BOUNDARY
  3. ;;;DATE: MAY 2008
  4. ;;;BY: wizman
  5. ;;;
  6. ;;;
  7. ;;;
  8. ;;;TYPE "BBS" TO START COMMAND
  9. ;;;
  10. ;;;
  11. ;;;
  12. ;;; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  13. (defun c:BBS (/ all_max all_min ll_pt maxpt minpt myset ur_pt)
  14. (vl-load-com)
  15. (setq        all_min        '()
  16. all_max        '()
  17. ) ;_ end_setq
  18. (if (setq mySet (ssget))
  19.    ;;"_X" '((410 . "Model"))))
  20.    (progn
  21.      (foreach x
  22.          (mapcar 'vlax-ename->vla-object
  23.                  (vl-remove-if 'listp
  24.                                (mapcar 'cadr
  25.                                        (ssnamex myset)
  26.                                ) ;_ end_mapcar
  27.                  ) ;_ end_vl-remove-if
  28.          ) ;_ end_mapcar
  29. (vla-GetBoundingBox x 'minpt 'maxpt)
  30. (Setq all_min (cons (trans (vlax-safearray->list minpt) 1 0) all_min))
  31. (Setq all_max (cons (trans (vlax-safearray->list maxpt) 1 0) all_max))
  32.      ) ;_ end_foreach
  33.      (setq LL_pt (list        (car (vl-sort (mapcar 'car all_min) '<))
  34.                 (car (vl-sort (mapcar 'cadr all_min) '<))
  35.           ) ;_ end_list
  36.      ) ;_ end_setq
  37.      (setq UR_pt (list        (last (vl-sort (mapcar 'car all_max) '<))
  38.                 (last (vl-sort (mapcar 'cadr all_max) '<))
  39.           ) ;_ end_list
  40.      ) ;_ end_setq
  41.      (mapcar 'princ (list "\nlower left:>> " ll_pt "\nupper right:>> " ur_pt))
  42.      (grvecs (append '(1)
  43.               (list ll_pt
  44.                     (list (car ur_pt) (cadr ll_pt))
  45.                     (list (car ur_pt) (cadr ll_pt))
  46.                     ur_pt
  47.                     ur_pt
  48.                     (list (car ll_pt) (cadr ur_pt))
  49.                     (list (car ll_pt) (cadr ur_pt))
  50.                     ll_pt
  51.               ) ;_ end_list
  52.       ) ;_ end_append
  53.      ) ;_ end_grvecs
  54.      ;;(textpage)
  55.    ) ;_ end_progn
  56. ) ;_ end_if
  57. (princ)
  58. ) ;_ end_defun
  59. (princ)
回复

使用道具 举报

0

主题

89

帖子

147

银币

限制会员

铜币
-9
发表于 2022-7-5 16:59:14 | 显示全部楼层
做得很好,弗拉基米尔!
回复

使用道具 举报

1

主题

316

帖子

311

银币

初来乍到

Rank: 1

铜币
29
发表于 2022-7-5 17:03:09 | 显示全部楼层
太好了,弗拉德!你展示动画的方式很酷,这很有帮助
 
我刚刚复制了你的代码,我要试试。
 
如果是这样的话,那么从视觉上看到边界框会很酷。
 
我现在就去看看。
 
这是我的代码。。。。
 
这将提示您输入块引用,在您选择blkref后,它将获取该blkref边界框的中点,并提示您输入目标点。
 
如有必要,对定位块非常有用
 
如果我要创建一组幻灯片,我将在ACAD中设置一个网格(数组),然后将我的所有块插入到该图形中,然后使用此代码,我可以很容易地将所有块都放在中间。
 
然后我有代码,可以在一次弹出中为该图形中的所有块创建幻灯片。
 
M
 
  1. ;| ! *******************************************************************
  2. ;; !                  lib:IsPtInView
  3. ;; ! *******************************************************************
  4. ;; ! Проверяет находится ли точка в видовом экране
  5. ;; ! Auguments: 'pt'  - Точка для анализа в МСК!!!
  6. ;; ! Return   : T или nil если 'pt' в видовом экране или нет
  7. ;; ! *******************************************************************|;
  8. (defun lib:IsPtInView (pt / VCTR Y_Len SSZ X_Pix Y_Pix X_Len Lc Uc)
  9. (setq pt (trans pt 0 1))  
  10. (setq VCTR (getvar "VIEWCTR") Y_Len (getvar "VIEWSIZE")
  11.   SSZ (getvar "SCREENSIZE")
  12.   X_Pix (car SSZ) Y_Pix (cadr SSZ)
  13.   X_Len (* (/ X_Pix Y_Pix) Y_Len)
  14.   Lc (polar VCTR (dtr 180.0) (* 0.5 X_Len))
  15.   Uc (polar Lc 0.0 X_Len)
  16.   Lc (polar Lc (dtr 270.0) (* 0.5 Y_Len))
  17.   Uc (polar Uc (dtr 90.0) (* 0.5 Y_Len)))
  18. (if (and (> (car pt) (car Lc))(< (car pt) (car Uc))
  19. (> (cadr pt) (cadr Lc))(< (cadr pt) (cadr Uc)))
  20. T nil))
  21. (defun DTR (a)(* pi (/ a 180.0)))
  22. ;| ! ***************************************************************************
  23. ;; !           lib:pt_extents
  24. ;; ! ***************************************************************************
  25. ;; ! Function : Возвращает границы MIN, MAX X,Y,Z списка точек
  26. ;; ! Argument : 'vlist' - Список точек
  27. ;; ! Returns  : Список точек (ЛевНижн ПравВерхн)
  28. ;; ! ***************************************************************************|;
  29. (defun  lib:pt_extents (vlist / tmp)
  30. (setq tmp (mapcar '(lambda (x) (vl-remove-if 'null x))
  31. (mapcar '(lambda (what) (mapcar '(lambda (x) (nth what x)) vlist))
  32. '(0 1 2))));_setq
  33. (list (mapcar '(lambda(x)(apply 'min x)) tmp)(mapcar '(lambda(x)(apply 'max x)) tmp)));_defun
  34. ;http://www.theswamp.org/index.php?topic=15123.0
  35. ;;;(defun GetBoundingBox-3d (pt_lst)
  36. ;;;  (list (apply 'mapcar (cons 'min pt_lst))
  37. ;;; (apply 'mapcar (cons 'max pt_lst))
  38. ;;;  )
  39. ;;
  40. ; ! ***********************************************************
  41. ;; !                             lib:Zoom2Lst
  42. ;; ! **********************************************************
  43. ;; ! Function : Zoom границ списка точек
  44. ;; ! Arguments: 'vlist' - Список точек в МСК!!!!
  45. ;; ! Зуммирует экран, чтобы все точки были видны
  46. ;; ! Returns  : t - было зуммирование nil - нет
  47. ;; ! **********************************************************
  48. (defun lib:Zoom2Lst( vlist / bl tr Lst OS)
  49. (setq Lst (lib:pt_extents vlist)
  50. bl (car Lst) tr (cadr Lst))
  51. (if (not (and (lib:IsPtInView bl) (lib:IsPtInView tr)))
  52. (progn  (setq OS (getvar "OSMODE"))(setvar "OSMODE" 0)
  53. (command "_.Zoom" "_Window" (trans bl 0 1)(trans tr 0 1)
  54. "_.Zoom" "0.95x")
  55. (setvar "OSMODE" OS)
  56. T) NIL))
  57. ;External contour of objects
  58. (defun C:ECO ( / *error* blk obj MinPt MaxPt hiden pt pl unnamed_block isRus
  59.       tmp_blk adoc blks lays lay oname sel csp loc sc ec ret DS osm iNSpT)
  60. (defun *error* (msg)(princ msg)(mapcar '(lambda (x) (vla-put-Visible x :vlax-true)) hiden)
  61. (vla-endundomark adoc)(if (and tmp_blk (not (vlax-erased-p tmp_blk))(vlax-write-enabled-p tmp_blk) )
  62. (vla-Erase tmp_blk))(if osm (setvar "OSMODE" osm))(foreach x loc (vla-put-lock x :vlax-true)))
  63. (vl-load-com)(setvar "CMDECHO" 0)(setq osm (getvar "OSMODE"))
  64. (if (zerop (getvar "WORLDUCS"))(progn(vl-cmdf "_.UCS" "")(vl-cmdf "_.Plan" "")))
  65. (setq isRus (= (getvar "SysCodePage") "ANSI_1251"))
  66. (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
  67.        blks (vla-get-blocks adoc) lays (vla-get-layers adoc))
  68. (vla-startundomark adoc)(if isRus (princ "\nВыберите объекты для построения контура")(princ "\nSelect objects for making a contour"))
  69. (vlax-for lay lays
  70.      (if (= (vla-get-lock lay) :vlax-true)
  71.          (progn (vla-put-lock lay :vlax-false) (setq loc (cons lay loc))))
  72.      )
  73. (if (setq sel (ssget))(progn
  74.    (setq sel (ssnamex sel))
  75. ;;;    (setq iNSpT(apply 'mapcar (cons 'min
  76. ;;;     (mapcar 'cadr (apply 'append (mapcar '(lambda(x)(vl-remove-if-not 'listp x)) sel))))))
  77.    (setq iNSpT '(0 0 0))
  78.    (setq sel (mapcar 'vlax-ename->vla-object(vl-remove-if 'listp (mapcar 'cadr sel))))
  79.    (setq csp (vla-objectidtoobject adoc (vla-get-ownerid (car sel))))
  80.   ; (setq unnamed_block (vla-add (vla-get-blocks adoc)(vlax-3d-point '(0. 0. 0.)) "*U"))
  81.    (setq unnamed_block (vla-add (vla-get-blocks adoc)(vlax-3d-point inspt) "*U"))
  82.    (foreach x sel
  83.      (setq oname (strcase (vla-get-objectname x)))
  84.      (cond ((member oname '("ACDBVIEWPORT" "ACDBATTRIBUTEDEFINITION" "ACDBMTEXT" "ACDBTEXT")) nil)
  85.     ((= oname "ACDBBLOCKREFERENCE")
  86.      (vla-InsertBlock unnamed_block
  87.        (vla-get-insertionpoint x)(vla-get-name x)
  88.        (vla-get-xscalefactor x)(vla-get-yscalefactor x)
  89.        (vla-get-zscalefactor x)(vla-get-rotation x))
  90.      (setq blk (cons x blk)))
  91.     (t (setq obj (cons x obj)))));_foreach
  92.        (setq lay  (vla-item lays (getvar "CLAYER")))
  93.        (if (= (vla-get-lock lay) :vlax-true)(progn (vla-put-lock lay :vlax-false) (setq loc (cons lay loc))))
  94.     (if obj (progn (vla-copyobjects (vla-get-activedocument (vlax-get-acad-object))
  95.              (vlax-make-variant (vlax-safearray-fill
  96.                  (vlax-make-safearray vlax-vbobject (cons 0 (1- (length obj))))
  97.                  obj)) unnamed_block)))
  98.    (setq obj (append obj blk))
  99.    (if obj (progn
  100.          ;(setq tmp_blk (vla-insertblock csp (vlax-3d-point '(0. 0. 0.))(vla-get-name unnamed_block) 1.0 1.0 1.0 0.0))
  101.              (setq tmp_blk (vla-insertblock csp (vlax-3d-point inspt)(vla-get-name unnamed_block) 1.0 1.0 1.0 0.0))
  102.          (vla-GetBoundingBox tmp_blk 'MinPt 'MaxPt)  ;_Границы блока
  103.               (setq MinPt (vlax-safearray->list MinPt) MaxPt (vlax-safearray->list MaxPt)
  104.       DS (max (distance MinPt (list (car MinPt)(cadr MaxPt)))
  105.        (distance MinPt (list (car MaxPt)(cadr MinPt))))
  106.              DS (* 0.2 DS) ;1/5
  107.       DS (max DS 10) MinPt (mapcar '- MinPt (list DS DS))
  108.                     MaxPt (mapcar '+ MaxPt (list DS DS)))
  109. (lib:Zoom2Lst (list MinPt MaxPt))(setq sset (ssget "_C" MinPt MaxPt))
  110. (if sset (progn (setvar "OSMODE" 0)
  111.      (setq hiden (mapcar 'vlax-ename->vla-object(vl-remove-if 'listp (mapcar 'cadr (ssnamex sset))))
  112.     hiden (vl-remove tmp_blk hiden))
  113.      (mapcar '(lambda(x)(vla-put-Visible x :vlax-false)) hiden)
  114.      (setq pt (mapcar '+ MinPt (list (* 0.5 DS)(* 0.5 DS))))
  115.      (vl-cmdf "_.RECTANG" (trans MinPt 0 1)(trans MaxPt 0 1))
  116.      (setq pl (vlax-ename->vla-object(entlast)))
  117.      (setq sc (1-(vla-get-count csp)))
  118.      (if (VL-CATCH-ALL-ERROR-P (VL-CATCH-ALL-APPLY '(lambda ()
  119.         (vl-cmdf "_-BOUNDARY" (trans pt 0 1) "")
  120.              (while (> (getvar "CMDACTIVE") 0)(command "")))))
  121.      (if isRus (princ "\nНе удалось построить контур")(princ "\nIt was not possible to construct a contour")))
  122.      (setq ec (vla-get-count csp))
  123.        (while (< sc ec)(setq ret (append ret (list (vla-item csp sc))) sc(1+ sc)))
  124.      (setq ret (vl-remove pl ret))
  125.      (mapcar '(lambda (x)(vla-Erase x)(vlax-release-object x))(list pl tmp_blk))(setq pl nil tmp_blk nil)
  126.      (setq ret (mapcar '(lambda ( x / mipt)(vla-GetBoundingBox x 'MiPt nil)  ;_Границы блока
  127.                 (setq MiPt (vlax-safearray->list MiPt))(list MiPt x)) ret))
  128.      (setq ret (vl-sort ret '(lambda (e1 e2)(< (distance MinPt (car e1))(distance MinPt (car e2))))))
  129.      (setq pl (nth 1 ret) ret (vl-remove pl ret)) (mapcar 'vla-erase (mapcar 'cadr ret))
  130.      (mapcar '(lambda(x)(vla-put-Visible x :vlax-true)) hiden)
  131.      (foreach x loc (vla-put-lock x :vlax-true))
  132.      (if pl (progn (initget  "Yes No")
  133.      (if (= (getkword (if isRus "\nУдалять объекты? [Yes/No] <No> : " "\nDelete objects? [Yes/No] <No> : ")) "Yes")
  134.         (mapcar '(lambda (x) (if (vlax-write-enabled-p x)(vla-Erase x))) obj)))
  135. (if isRus (princ "\nНе удалось построить контур")(princ "\nIt was not possible to construct a contour")))))))
  136.     (VL-CATCH-ALL-APPLY '(lambda ()(mapcar 'vlax-release-object
  137.    (list unnamed_block tmp_blk csp blks lays))))));_if not
  138. (foreach x loc (vla-put-lock x :vlax-true))(setvar "OSMODE" osm)
  139. (vla-endundomark adoc)(vlax-release-object adoc)(princ))
回复

使用道具 举报

VVA

1

主题

308

帖子

308

银币

初来乍到

Rank: 1

铜币
8
发表于 2022-7-5 17:07:37 | 显示全部楼层
Wiz公司
Lisp程序的程序很酷
到目前为止,我只在一个块上尝试了它,但它对所有具有边界框的实体都有效吗?
 
此外,如果您这样做,用户可以选择他们想要查看其边界框的实体,那将非常酷。
 
这就是我想使用它的方式
做记号
回复

使用道具 举报

0

主题

127

帖子

130

银币

限制会员

铜币
-2
发表于 2022-7-5 17:13:48 | 显示全部楼层
您好,ML,用户现在可以进行选择。此外,您编写的vva代码很好。
 
 
回复

使用道具 举报

0

主题

89

帖子

147

银币

限制会员

铜币
-9
发表于 2022-7-5 17:18:48 | 显示全部楼层
我比赛迟到了,但有没有办法增加这个Lisp程序的缓冲区?如忽略某些大小的差距?
回复

使用道具 举报

0

主题

89

帖子

147

银币

限制会员

铜币
-9
发表于 2022-7-5 17:21:00 | 显示全部楼层
要创建忽略间隙的轮廓,可以尝试TotalBoundary实用程序。
查看此视频:
回复

使用道具 举报

1

主题

316

帖子

311

银币

初来乍到

Rank: 1

铜币
29
发表于 2022-7-5 17:26:53 | 显示全部楼层
谢谢,我以前用过TotalBoundary,它真是棒极了!但是它并没有像我想的那样工作,我希望能够将代码合并到带有附加组件的LISP中。
 
但是谢谢!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-16 13:36 , Processed in 0.294614 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表