明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1196|回复: 3

选择集对角点(包容盒)--快速求法的思考

[复制链接]
发表于 2021-12-30 18:56:29 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2021-12-30 19:50 编辑

  • ;;求屏幕(左下角 右上角 中点)-------(一级)------------
  • (defun sl_pm2pt (/ a b c d x)
  •   (setq b (getvar "viewsize")
  •     c (car (getvar "screensize"))
  •     d (cadr (getvar "screensize"))
  •     a (* b (/ c d))
  •     x (trans (getvar "viewctr") 1 2)
  •     c (trans (list (- (car x) (* a 0.5)) (- (cadr x) (* b 0.5)) 0.0) 2 1)
  •     d (trans (list (+ (car x) (* a 0.5)) (+ (cadr x) (* b 0.5)) 0.0) 2 1)
  •     e (sl:mid c d)
  •   )
  •   (list c d e)   ;;c 左下  d 右上 e 中心
  • )
  • ;返回最大外型两对角点的表 -----(一级)-------------
  • (defun get-box (ss / len ptlis pp objlst boxlst minlst maxlst enam obj)  
  •   (defun get-ssbox (ss) ;返回集最大外框两对角点的表
  •     (setq len (sslength ss))
  •     (cond
  •       ((< len 500) ;实体小于500,采用高飞鸟求凸包
  •         (setq ptlis (getpt ss 50))
  •         (setq ptlis (graham-scan ptlis))
  •         (if (<= (det (car ptlis) (cadr ptlis) (caddr ptlis)) 0.0)
  •           (setq ptlis (reverse ptlis))        
  •         )  
  •         (setq pp (car (minarearectangle ptlis)))
  •         (setq ptlis (list (car pp) (caddr pp)))
  •       )
  •       ((and (>= len 500) (< len 10000)) ;实体大于500,小于10000,采用常规
  •         (setq objlst (mapcar 'en2obj (ss-enlst ss)))
  •         (setq boxlst (mapcar 'get-enbox objlst))
  •         (setq minlst (mapcar 'car boxlst))
  •         (setq maxlst (mapcar 'cadr boxlst))
  •         (setq ptlis (list (apply 'mapcar (cons 'min minlst)) (apply 'mapcar (cons 'max maxlst))))
  •       )
  •       ((>= len 10000) ;;实体多于 10000,采用视口近似
  •         (command "_zoom" "_object" ss "")
  •         (setq pp (sl_pm2pt))
  •         (setq ptlis (list (car pp) (cadr pp)))
  •         (command "_zoom" "_p")
  •       )
  •     )
  •   )
  •   ;;返回对象最大外框两对角点的表---------
  •   (defun get-enbox (obj)
  •     (if (= (type obj) 'ENAME) (setq obj (en2obj obj)))
  •     (vla-getboundingbox obj 'Minp 'Maxp)
  •     (setq ptlis (mapcar 'vlax-safearray->list (list Minp Maxp)))
  •   )
  •   ;返回点表最大外框两对角点的表
  •   (defun get-extents (lst)
  •     (setq ptlis (list (apply 'mapcar (cons 'min lst)) (apply 'mapcar (cons 'max lst))))
  •   )
  •   (cond
  •     ((= (type ss) 'PICKSET) (get-ssbox ss))  ;集
  •     ((= (type ss) 'ENAME) (get-enbox ss))    ;图元
  •     ((= (type ss) 'LIST) (get-extents ss))   ;点表
  •     (t nil)
  •   )
  •   ptlis
  • )
发表于 2021-12-31 08:22:48 | 显示全部楼层
楼主居然还活跃
发表于 2022-1-1 10:23:23 | 显示全部楼层
;by MP
  1. (defun SSBoundingBox ( ss / _GetBoundingBox _SStoObjects _Main )

  2.    (defun _GetBoundingBox ( object / p1 p2 )
  3.        (vl-catch-all-apply
  4.           '(lambda ( )
  5.                (vlax-invoke-method
  6.                    object
  7.                   'GetBoundingBox
  8.                   'p1
  9.                   'p2
  10.                )
  11.            )
  12.        )
  13.        (if p1
  14.            (   (lambda (data)
  15.                    (mapcar
  16.                       '(lambda (funcs)
  17.                            (mapcar
  18.                               '(lambda (func)
  19.                                    (apply func data)
  20.                                )
  21.                                funcs
  22.                            )
  23.                        )   
  24.                       '(   (caar cadar)
  25.                            (caadr cadar)
  26.                            (caadr cadadr)
  27.                            (caar cadadr)
  28.                        )
  29.                    )
  30.                )   
  31.                (list
  32.                    (mapcar
  33.                        'vlax-safearray->list
  34.                        (list p1 p2)
  35.                    )
  36.                )
  37.            )
  38.        )   
  39.    )
  40.    
  41.    (defun _SStoObjects ( ss / i objects )
  42.        (if (eq 'pickset (type ss))
  43.            (repeat (setq i (sslength ss))
  44.                (setq objects
  45.                    (cons
  46.                        (vlax-ename->vla-object
  47.                            (ssname ss
  48.                                (setq i (1- i))
  49.                            )
  50.                        )
  51.                        objects
  52.                    )
  53.                )
  54.            )
  55.        )
  56.        objects
  57.    )
  58.    
  59.    (defun _Main ( ss / boundingboxes )  
  60.        (cond
  61.            (   (setq boundingboxes
  62.                    (vl-remove-if 'null
  63.                        (mapcar '_GetBoundingBox
  64.                            (_SStoObjects ss)
  65.                        )
  66.                    )
  67.                )   
  68.                (mapcar
  69.                   '(lambda ( func pair / lst )
  70.                        (list
  71.                            (apply (car pair)
  72.                                (mapcar 'car
  73.                                    (setq lst
  74.                                        (mapcar
  75.                                            func
  76.                                            boundingboxes
  77.                                        )
  78.                                    )
  79.                                )   
  80.                            )
  81.                            (apply (cadr pair)
  82.                                (mapcar 'cadr lst)
  83.                            )
  84.                        )   
  85.                    )
  86.                   '(car cadr caddr cadddr)
  87.                   '((min min)(max min)(max max)(min max))   
  88.                )   
  89.            )   
  90.        )
  91.    )
  92.    
  93.    (_Main ss)
  94.    
  95. )

发表于 2022-2-11 07:04:26 | 显示全部楼层
感谢大佬分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 08:23 , Processed in 0.157326 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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