明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2074|回复: 8

选择集中心点的快速求法

[复制链接]
发表于 2021-9-4 20:34:51 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2021-9-4 20:46 编辑

选择集图元很多的时候,会卡机,摸索下怎么快速求得。

  • ;; 选择集中心点--ss 选择集-------(一级)--------------------------
  • (defun ssmpt1 (ss / i s1 box ptn a p1 p5 num)
  •   ;;e 实体名  返回 (左下 右上)
  •   (defun ebox2p (e / pa pb)
  •     (Vlax-Invoke-Method (en2obj e ) 'GetBoundingBox 'pa 'pb )
  •     (setq pa (trans (vlax-safearray->list pa) 0 1)
  •       pb (trans (vlax-safearray->list pb) 0 1)
  •     )
  •     (list pa pb)
  •   )  
  •   ;;-----------------------------------------
  •   (setq num (sslength ss) i -1)
  •   (if (< num 100)
  •     (progn
  •       (repeat num
  •         (setq s1 (ssname ss (setq i (1+ i))))
  •         (setq box (ebox2p s1) ptn (append box ptn))
  •       )
  •       (setq a (mapcar '(lambda (x) (apply 'mapcar (cons x ptn))) (list 'min 'max))
  •         p1 (car a)
  •         p9 (cadr a)
  •         p5 (sl:mid p1 p9)
  •       )
  •     )
  •     (progn
  •       (command "_zoom" "_object" ss "")
  •       (setq p5 (getvar "viewctr"))
  •       (command "_zoom" "_p")
  •     )
  •   )
  •   p5
  • )


想不起是否还有不卡,更快的办法。

发表于 2021-9-6 09:51:24 | 显示全部楼层
分享一个别人写的

;;获得选择集的中心
;[用法](GetMidPt  选择集)
;[返回](点)
(defun GetMidPt (ss / i lstX lstY vn pt X1 X2 Y1 Y2)
        (setq i    0
                lstX '()
                lstY '()
        )
        (repeat (sslength ss)
                (setq vn (vlax-ename->vla-object (ssname ss i))
                        i  (1+ i)
                )
                (setq pt (vl-catch-all-apply 'vla-getBoundingBox (list vn 'MinPt 'MaxPt)))
                (if (not (vl-catch-all-error-p pt))
                        (progn
                                (setq
                                        X1 (vlax-safeArray-get-element MinPt 0)
                                        X2 (vlax-safeArray-get-element MaxPt 0)
                                        Y1 (vlax-safeArray-get-element MinPt 1)
                                        Y2 (vlax-safeArray-get-element MaxPt 1)
                                )
                                (cond
                                        ;; if this is the first time run,then put the value it .
                                        ((null lstX)
                                                (setq lstX (list X1 X2)
                                                        lstY (list Y1 Y2)
                                                )
                                        )
                                        ;; NOTE here,  .
                                        (T
                                                ;; X-Min .
                                                (if (< X1 (car lstX))
                                                        (setq lstX (list X1 (cadr lstX)))
                                                )
                                                ;; X-Max
                                                (if (> X2 (cadr lstX))
                                                        (setq lstX (list (car lstX) X2))
                                                )
                                                ;; Y-Min .
                                                (if (< Y1 (car lstY))
                                                        (setq lstY (list Y1 (cadr lstY)))
                                                )
                                                ;; Y-Max
                                                (if (> Y2 (cadr lstY))
                                                        (setq lstY (list (car lstY) Y2))
                                                )
                                        )
                                )
                        )
                )
        )
        ;; return the point  .
        (if lstX
                (list (* (apply '+ lstX) 0.5) (* (apply '+ lstY) 0.5) 0)
                nil
        )
)
发表于 2021-9-28 23:05:48 | 显示全部楼层
cghdy 发表于 2021-9-6 09:51
分享一个别人写的

;;获得选择集的中心

好用 学习了~~~~
发表于 2022-1-30 12:53:18 | 显示全部楼层
我正需要这个,谢谢了
 楼主| 发表于 2022-1-30 19:44:35 | 显示全部楼层
本帖最后由 尘缘一生 于 2022-1-30 20:24 编辑

关于这个问题,还值得研究,我目前这么用的。
  • ;; 选择集中心点--ss 选择集----(一级)----------
  • (defun ssmpt (ss / i s1 box ptn a p1 p9 p5 num)
  •   (setq num (sslength ss) i -1)
  •   (if (< num 100)
  •     (progn
  •       (repeat num
  •         (setq s1 (ssname ss (setq i (1+ i))))
  •         (setq box (get-box s1) ptn (append box ptn))
  •       )
  •       (setq a (mapcar '(lambda (x) (apply 'mapcar (cons x ptn))) (list 'min 'max))
  •         p1 (car a)
  •         p9 (cadr a)
  •         p5 (sl:mid p1 p9)
  •       )
  •     )
  •     (progn
  •       (command "_zoom" "_object" ss "")
  •       (setq p5 (getvar "viewctr"))
  •       (command "_zoom" "_p")
  •     )
  •   )
  •   p5
  • )



  • ;返回最大外型两对角点的表 -----(一级)-------------
  • (defun get-box (ss / len ss1 len1 ptlis pp dis ang pt1 pt2 objlst boxlst minlst maxlst enam obj)  
  •   (defun get-ssbox (ss) ;返回集最大外框两对角点的表
  •     (setq len (sslength ss))
  •     (cond
  •       ((< len 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))
  •         (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)
  •         (command "_zoom" "_object" ss "")
  •         (setq pp (sl_pm2pt))
  •         (setq pt1 (car pp) pt2 (cadr pp))
  •         (setq dis (distance pt1 pt2) ang (angle pt1 pt2) pt1 (polar pt1 ang (* 0.2 dis)) pt2 (polar pt1 ang (* 0.6 dis)))
  •         (setq ss1 (ssget "W" pt1 pt2))
  •         (setq ss1 (ssdiff ss ss1) len1 (sslength ss1))
  •         (if (< len1 10000)
  •           (get-ssbox ss1)
  •           (progn
  •             (command "_zoom" "_object" ss1 "")
  •             (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
  • )

发表于 2022-2-11 07:03:38 | 显示全部楼层
感谢大佬分享
发表于 2024-5-17 08:21:17 | 显示全部楼层
(command "_zoom" "_object" ss "")
      (setq p5 (getvar "viewctr")),这个太有才了吧,只是不清楚精度怎么样。
发表于 2024-6-27 08:15:46 | 显示全部楼层
hubeiwdlue 发表于 2024-5-17 08:21
(command "_zoom" "_object" ss "")
      (setq p5 (getvar "viewctr")),这个太有才了吧,只是不清楚精 ...

估计精度差点。
不过速度肯定慢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 04:53 , Processed in 0.150048 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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