如何创建边界框
嗨,专家。任何人都可以帮助我如何编写lisp,可以用样条线实体创建边界框吗大声笑: 不知道你所说的“边界盒”是什么意思-如果是关于“边界盒”,那么请检查这个例程写的李Mac。 是的,我的意思是像李·麦克写的套路。但此Lisp无法正确生成样条曲线的边界框。我需要非常接近样条==>“平均无间隙”。
提前谢谢。 实际上,边界盒方法对于样条曲线是不准确的。
另一种方法可能是使用适当的点列表近似样条,然后计算此类点列表的边界;尽管如此,该算法无疑会比边界盒方法慢。
以下是演示此方法的示例(您需要下载我的实体到点列表函数):
(defun BoundingBox ( ent / l )
(if (setq l (LM:Entity->PointList ent))
(mapcar '(lambda ( a ) (apply 'mapcar (cons a l))) '(min max))
)
) 或者,可以创建一个副本来代替样条线,对其应用展平命令,并使用Lee的例程作为边界框;删除后面的辅助多段线。 好主意Mircea!
下面是另一种方法(请原谅代码混乱):
测试功能:
(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 (caarbb) (cadarbb))
(list 10 (caadr bb) (cadarbb))
(list 10 (caadr bb) (cadadr bb))
(list 10 (caarbb) (cadadr bb))
)
)
(princ "\nUnable to retrieve Bounding Box.")
)
)
(princ)
)
(vl-load-com) (princ) 我认为李的代码对于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 (caarbb) (cadarbb))
(list 10 (caadr bb) (cadarbb))
(list 10 (caadr bb) (cadadr bb))
(list 10 (caarbb) (cadadr bb))
)
)
(princ "\nUnable to retrieve Bounding Box.")
)
)
(princ)
)
如果您想要精确的结果,请考虑像Mircea建议的那样将样条线转换为多段线,或者如果您有A2010或更高版本(不确定A2009)A2008不支持-尝试SPLINEDIT->转换为多段线并从pline获取边界框-删除虚拟pline后。。。如果你有一个2010年或以上,然后尝试也李的代码-刚刚检查了我的A2012和它的工作。。。
还可以从Swamp中检查此线程。。。
M、 R。 谢谢李和马尔科·里巴尔·里斯普。在我的AutoCAD 2007上试用后,仍然不能很好地工作。可能我的AutoCAD版本太旧了。您的两个代码都不支持。无论如何,谢谢你们。我仍然需要找出如何突破它。 请检查此解决方案,以使用AutoCAD版本将所述样条线转换为多段线。
kwwong6,
据我所知,我在回复#4中发布的解决方案应该可以在AutoCAD 2007中使用。
页:
[1]
2