cabinsummer 发表于 2012-2-18 18:30 static/image/common/back.gif
呵呵,确实是数学问题。QJCHEN和highflybird应该能解决
Spline的最小包围框可以通过精度拟合逼近!
下面是我的求任何物体的最小包围框通用函数:
;;;(gxl-GetRealBox e1 d) 获取物体真实实体外矩形框,d为拟合逼近Spline最小长度
;;参数 e1 图元名或Vla对象 d = Spline最小拟合间距
(defun gxl-GetRealBox(E1 D / OBJ MINPOINT MAXPOINT DD PTS LEN)
(if (= 'ENAME (type e1))
(setq obj (vlax-ename->vla-object e1)) ;_ 转换图元名
(setq obj e1)
)
(cond ((= "AcDbSpline" (vla-get-ObjectName obj))
(setq len (vlax-curve-getDistAtParam
obj
(vlax-curve-getEndParam obj))
)
(if (or (equal d 0 1e-6)
(> (/ len d) 1000)
)
(setq d (/ len 1000.))
)
(setq ddd
pts (list (vlax-curve-getStartPoint obj))
)
(while (< dd len)
(setq pts (cons (vlax-curve-getPointAtDist obj dd) pts)
dd(+ dd d)
)
)
(cons (vlax-curve-getendPoint obj) pts)
(list (apply 'mapcar (cons 'min pts))
(apply 'mapcar (cons 'max pts)))
)
(t
(vla-GetBoundingBox obj 'minpoint 'maxpoint) ;_ 取得包容图元的最大点和最小点
(setq minpoint (vlax-safearray->list minpoint)) ;_ 把变体数据转化为表
(setq maxpoint (vlax-safearray->list maxpoint)) ;_ 把变体数据转化为表
(list minpoint maxpoint)
)
)
)
;我做了修改
(DEFUN C:waik ()
(vl-load-com)
(SETVAR "CMDECHO" 0)
(SETQ OLDOS (GETVAR "OSMODE"))
(IF (SETQ S1 (CAR (ENTSEL "\nSelect One Object 选择一个图元 :"))) (PROGN
(vla-getboundingbox (vlax-ename->vla-object S1) 'minpoint 'maxpoint)
(setq pmax (vlax-safearray->list maxpoint)
pmin (vlax-safearray->list minpoint))
(setq bk1 (- 10 (car pmin))
bk2 (- 10 (cadr pmin))
bk3 (+ 10 (car pmax))
bk4 (+ 10 (cadr pmax)))
(setq pmin (list bk1 bk2))
(setq pmax (list bk3 bk4))
(SETVAR "OSMODE" 0)
(COMMAND ".RECTANG" PMIN PMAX)
(SETVAR "OSMODE" OLDOS)
))
(SETVAR "CMDECHO" 1)
(PRINC)
)
为何左下角的坐标偏移10有问题啊。
Gu_xl 发表于 2012-2-18 20:21 static/image/common/back.gif
Spline的最小包围框可以通过精度拟合逼近!
下面是我的求任何物体的最小包围框通用函数:
请问如何才能多选呀
页:
1
[2]