我认为李的代码对于ACAD的早期版本是不正确的。。。如果您不需要精确但近似的结果,请尝试此。。。
- (defun SplineBoundingBox ( ent / xmin xmax ymin ymax res cmde )
- (setq cmde (getvar 'cmdecho))
- (setvar 'cmdecho 0)
- (vl-cmdf "_.ucs" "w")
- (vl-cmdf "_.plan" "")
- (vl-cmdf "_.zoom" "o" ent "")
- (setq ymin (- (cadr (getvar 'viewctr)) (/ (getvar 'viewsize) 2.0)) ymax (+ (cadr (getvar 'viewctr)) (/ (getvar 'viewsize) 2.0)))
- (vl-cmdf "_.ucs" "z" 90)
- (vl-cmdf "_.plan" "")
- (vl-cmdf "_.zoom" "o" ent "")
- (setq xmax (- (car (trans (getvar 'viewctr) 1 0)) (/ (getvar 'viewsize) 2.0)) xmin (+ (car (trans (getvar 'viewctr) 1 0)) (/ (getvar 'viewsize) 2.0)))
- (vl-cmdf "_.zoom" "p")
- (vl-cmdf "_.zoom" "p")
- (vl-cmdf "_.zoom" "p")
- (vl-cmdf "_.zoom" "p")
- (vl-cmdf "_.zoom" "p")
- (vl-cmdf "_.ucs" "p")
- (vl-cmdf "_.ucs" "p")
- (setvar 'cmdecho cmde)
- (setq res (list (list xmin ymin 0.0) (list xmax ymax 0.0)))
- res
- )
- (defun c:test ( / bb en )
- (princ "\nSelect a Spline: ")
- (if (setq en (ssget "_+.:E:S:L" '((0 . "SPLINE"))))
- (if (setq bb (SplineBoundingBox (ssname en 0)))
- (entmakex
- (list
- (cons 0 "LWPOLYLINE")
- (cons 100 "AcDbEntity")
- (cons 100 "AcDbPolyline")
- (cons 90 4)
- (cons 70 1)
- (list 10 (caar bb) (cadar bb))
- (list 10 (caadr bb) (cadar bb))
- (list 10 (caadr bb) (cadadr bb))
- (list 10 (caar bb) (cadadr bb))
- )
- )
- (princ "\nUnable to retrieve Bounding Box.")
- )
- )
- (princ)
- )
如果您想要精确的结果,请考虑像Mircea建议的那样将样条线转换为多段线,或者如果您有A2010或更高版本(不确定A2009)A2008不支持-尝试SPLINEDIT->转换为多段线并从pline获取边界框-删除虚拟pline后。。。如果你有一个2010年或以上,然后尝试也李的代码-刚刚检查了我的A2012和它的工作。。。
还可以从Swamp中检查此线程。。。
M、 R。 |