a中内接的最大圆
你好我是LISP的新手,以下代码对单选非常有效。谁能帮我运行这段代码进行多项选择。
你的帮助会救我一天
提前感谢
(defun C:测试(/Dx Dy Lp List\u vert\u poly List\u p\u int p\u center dist)
(提示“\n选择多段线:”)
(setq POLY_vl(vlax ename->vla对象(ssname(ssget“:S”((0。“POLYLINE,LWPOLYLINE”))0)))
(垂直多边形)
(grid_1)
(Point_int)
(点U中心)
(重复3次
(网格2)
(点U中心)
)
(entmake)
(列表
(0圈)
(cons 8(getvar“clayer”))
(cons 10 P_中心)
(cons 40距离)
)
)
(普林斯)
)
; 返回多段线顶点列表
(defun Vert\u poly(/n\u par pt)
(setq list\u vert\u poly nil)
(setq n\u par(fix(vlax curve getendparam POLY\u vl)))
(重复n\u par
(setq pt(vlax curve getpointatparam POLY\u vl(setq n\u par(1-n\u par)))
(setq list\U vert\U poly(cons pt list\U vert\U poly))
(如果(/=(最后一个点)0.0)
(程序
(警报(strcat“选择的对象无效”
“\nz坐标顶点不=0.0”))
(退出)
)
)
)
)
; 返回选定多边形的边界框内的点网格
(defun grid_1(/P1\uP2\uN P>步骤1)
(setq step1 60)
(vla getboundingbox POLY\u vl‘p1’p2)
(setq P1_(vlax safearray->列表P1))
(setq P2_(vlax safearray->列表P2))
(setq P1_(列表(car P1_)(cadr P1_)))
(setq P2_(列表(car P2_)(cadr P2_)))
(setq Dx(/((car P2_)(car P1_))步骤1))
(setq Dy(/((cadr P2_)(cadr P1_))步骤1))
(setq n 0)
(设置P>P1_)
(setq Lp(列表P1_))
(重复(*(1+步骤1)步骤1)
(setq P>(list(+(car P>)Dx)(cadr P>))
(setq Lp(cons P>Lp))
(setq n(1+n))
(如果(=n步骤1)
(程序
(setq n 0)
(setq P1_(列表(car P1_)(+(cadr P1_)Dy)))
(设置P>P1_)
(setq Lp(cons P>Lp))
)
)
)
)
; 返回围绕中心点的点网格(暂定)
(defun grid\u 2(/P1\uStep2 P>n)
(setq step2 30)
(setq list\u p\u int nil)
(setq P1_(列表(-car P_中心)Dx)((cadr P_中心)Dy)))
(setq Dx(/(*2 Dx)步骤2))
(setq Dy(/(*2 Dy)step2))
(setq n 0)
(设置P>P1_)
(setq list\u p\u int(list P1_))
(重复(*(1+步骤2)步骤2)
(setq P>(list(+(car P>)Dx)(cadr P>))
(setq list\u p\u int(cons p>list\u p\u int))
(setq n(1+n))
(如果(=n步骤2)
(程序
(setq n 0)
(setq P1_(列表(car P1_)(+(cadr P1_)Dy)))
(设置P>P1_)
(setq list\u p\u int(cons p>list\u p\u int))
)
)
)
)
; 返回多段线内的点列表
(defun Point_int(/P\u distance n Pr cont attr P#Pa Pa_upb)
(setq P_Distance(polar(car Lp)0 10000000))
(setq list\u p\u int nil)
(重复(setq n(长度Lp))
(setq Pr(第n个(setq n(1-n))Lp))
(setq cont-1)
(setq属性0)
(setq p#nil)
(setq Pa(第n个(setq cont(1+cont))list\U vert\U poly))
(setq Pa\uPA)
(重复(length list\u vert\u poly)
(setq Pb(第n个(setq cont(1+cont))list\U vert\U poly))
(if(=cont(length list\u vert\u poly))(setq Pb Pa_)
(setq P#(inters Pa Pb Pr P#U距离))
(如果(/=P#nil)(setq attr(1+attr)))
(setq Pa Pb)
)
(if(>(rem attr 2)0)(setq list\u p\u int(cons Pr list\u p\u int)))
)
)
; 返回距多段线最远的点
(defun Point_center(/Pa n Pvic)
(setq Dist 0.0000001)
(setq P_中心零)
(重复(setq n(length list\u p\u int))
(setq Pa(nth(setq n(1-n))list\u p\u int))
(setq Pvic(vlax曲线GetClosestPoint to POLY\u vl Pa))
(if(>(距离Pa Pvic)距离)
(程序
(setq P_center Pa)
(setq Dist(距离Pa Pvic))
)
)
)
)
(vl load com)
(普林斯) 试试这个
(setq POLY_obs (ssget'((0 . "POLYLINE,LWPOLYLINE"))))
(setq len (sslength POLY_obs))
(setq y len)
(repeat len
(setq POLY_vl (vlax-ename->vla-object (ssname POLY_obs (setq y (- y 1)))))
.... your code
....
) ; repeat
非常感谢。我会试试的 非常感谢!!你成就了我的一天。
再次感谢。 无忧无虑的简单解决方案。
页:
[1]