马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 newer 于 2017-7-14 20:17 编辑
 - (defun c:min+maxbbrec-2dents ( / *error* maxn mid pp bb pta bbar geta min-maxbbrec f ss bbb )
-
- (defun *error* ( m )
- (if f (command "_.UCS" "_P"))
- (if m (prompt m))
- (princ)
- )
- (defun maxn ( l / x r )
- (if (cadr l)
- (progn
- (while (cadr l)
- (if (null r)
- (setq x (car l))
- (setq x r)
- )
- (if (> x (cadr l))
- (setq r x)
- (setq r (cadr l))
- )
- (setq l (cdr l))
- )
- r
- )
- (car l)
- )
- )
-
- (defun mid ( p1 p2 )
- (mapcar '(lambda ( a b ) (/ (+ a b) 2.0)) p1 p2)
- )
-
- (defun pp ( p a )
- (caddr (trans p 0 (polar '(0.0 0.0 0.0) a 1.0)))
- )
-
- (defun bb ( entl a / p1 p2 d bbb bbl ) (vl-load-com)
- (foreach ent entl
- (vla-getboundingbox (vlax-ename->vla-object ent) 'p1 'p2)
- (mapcar 'set (list 'p1 'p2) (mapcar 'vlax-safearray->list (list p1 p2)))
- (setq d (* 25 (distance p1 p2)))
- (mapcar 'set (list 'p1 'p2) (mapcar '(lambda ( x s ) (polar x (+ a (* 0.25 pi)) ((eval s) d))) (list (mid p1 p2) (mid p1 p2)) (list '- '+)))
- (setq bbb (mapcar
- '(lambda ( p )
- (list
- (pp (vlax-curve-getclosestpointtoprojection ent p (polar '(0.0 0.0 0.0) (+ a (* 0.5 pi)) 1.0)) a)
- (pp (vlax-curve-getclosestpointtoprojection ent p (polar '(0.0 0.0 0.0) a 1.0)) (+ a (* 0.5 pi)))
- 0.0
- )
- ) (list p1 p2)
- )
- )
- (setq bbl (cons bbb bbl))
- )
- (setq bbb
- (list
- (list
- (minn (mapcar 'car (mapcar 'car bbl)))
- (minn (mapcar 'cadr (mapcar 'car bbl)))
- 0.0
- )
- (list
- (maxn (mapcar 'car (mapcar 'cadr bbl)))
- (maxn (mapcar 'cadr (mapcar 'cadr bbl)))
- 0.0
- )
- )
- )
- bbb
- )
-
- (defun pta ( pt a )
- (list
- (pp pt a)
- (pp pt (+ (* 0.5 pi) a))
- (caddr pt)
- )
- )
-
- (defun bbar ( ptll ptur )
- (* (- (car ptur) (car ptll)) (- (cadr ptur) (cadr ptll)))
- )
-
- (defun geta ( entl / k a aral bbb armin amin armax amax )
- (setq k -1)
- (repeat (fix (* 2.0 pi 1e+3))
- (setq a (* (setq k (1+ k)) 1e-3))
- (setq aral (cons (list (bbar (car (setq bbb (bb entl a)))
- (cadr bbb)
- )
- a
- )
- aral
- )
- )
- )
- (setq armin (minn (mapcar 'car aral)))
- (setq amin (cadr (assoc armin aral)))
- (setq armax (maxn (mapcar 'car aral)))
- (setq amax (cadr (assoc armax aral)))
- (list (list armin amin) (list armax amax))
- )
-
- (defun min-maxbbrec ( entl / get anmin anmax bbb d )
- (setq anmin (cadr (car (setq get (geta entl)))))
- (setq anmax (cadr (cadr get)))
- (list
- (list
- (car (setq bbb (mapcar '(lambda ( p ) (pta p (- anmin))) (bb entl anmin))))
- (polar (car bbb) anmin (setq d (- (pp (cadr bbb) anmin) (pp (car bbb) anmin))))
- (cadr bbb)
- (polar (cadr bbb) anmin (- d))
- (car (car get))
- )
- (list
- (car (setq bbb (mapcar '(lambda ( p ) (pta p (- anmax))) (bb entl anmax))))
- (polar (car bbb) anmax (setq d (- (pp (cadr bbb) anmax) (pp (car bbb) anmax))))
- (cadr bbb)
- (polar (cadr bbb) anmax (- d))
- (car (cadr get))
- )
- )
- )
-
- ---------------------------------------------------------------
- (if (eq (getvar 'worlducs) 0)
- (progn
- (command "_.UCS" "_W")
- (setq f t)
- )
- )
- (prompt "\nSelect 2d curve entities that lie in WCS")
- (setq ss (ssget '((0 . "*POLYLINE,SPLINE,LINE,ARC,CIRCLE,ELLIPSE"))))
- (while (or (not ss) (or (not (equal (caddr (car (acet-geom-ss-extents-accurate ss))) 0.0 1e-6)) (not (equal (caddr (cadr (acet-geom-ss-extents-accurate ss))) 0.0 1e-6))))
- (prompt "\nEmpty sel.set or selected curve entities don't lie in WCS or some aren't 2D... Please select 2d curve entities that lie in WCS again...")
- (setq ss (ssget '((0 . "*POLYLINE,SPLINE,LINE,ARC,CIRCLE,ELLIPSE"))))
- )
- (entmake
- (list
- '(0 . "LWPOLYLINE")
- '(100 . "AcDbEntity")
- '(100 . "AcDbPolyline")
- '(90 . 4)
- (cons 70 (if (eq (getvar 'plinegen) 1) 129 1))
- '(62 . 3)
- '(38 . 0.0)
- (cons 10 (car (car (setq bbb (min-maxbbrec (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))))))
- (cons 10 (cadr (car bbb)))
- (cons 10 (caddr (car bbb)))
- (cons 10 (cadddr (car bbb)))
- '(210 0.0 0.0 1.0)
- )
- )
- (entmake
- (list
- '(0 . "LWPOLYLINE")
- '(100 . "AcDbEntity")
- '(100 . "AcDbPolyline")
- '(90 . 4)
- (cons 70 (if (eq (getvar 'plinegen) 1) 129 1))
- '(62 . 1)
- '(38 . 0.0)
- (cons 10 (car (cadr bbb)))
- (cons 10 (cadr (cadr bbb)))
- (cons 10 (caddr (cadr bbb)))
- (cons 10 (cadddr (cadr bbb)))
- '(210 0.0 0.0 1.0)
- )
- )
- (prompt "\nGreen rectangle is minimum enclosing and red is maximum enclosing...")
- (prompt (strcat "\nMinimal area is : " (rtos (last (car bbb)) 2 50) "\tMaximal area is : " (rtos (last (cadr bbb)) 2 50)))
- (*error* nil)
- )
minn函数:
上面是LISP实现,
下面是XDRX API实现代码:
 - (defun c:tt ()
- (if (setq e (car (xdrx_entsel
- "\n拾取曲线<退出>:"
- '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))
- )
- )
- )
- (progn
- (setq pts (xdrx_getsamplept e 0.001)
- minA (xdrx_points_minareabox pts)
- maxA (xdrx_points_maxareabox pts)
- )
- (xdrx_polyline_make minA t)
- (xdrx_setpropertyvalue (entlast) "color" 3)
- (xdrx_polyline_make maxA t)
- (xdrx_setpropertyvalue (entlast) "color" 1)
- )
- )
- (princ)
- )
效率测试工具
 - (defun _xmin (e)
- (setq pts (xdrx_getsamplept e 0.001)
- minA (xdrx_points_minareabox pts)
- maxA (xdrx_points_maxareabox pts)
- )
- )
- (defun c:tt ()
- (if (setq e (car (entsel)))
- (progn
- (setq ss (ssadd)
- ss (ssadd e ss)
- )
- (xd::quickbench
- '((setq a(min-maxbbrec
- (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
- ))
- (setq b (_xmin e))
- )
- )
- )
- )
- (princ)
- )
测试结果:
|