[求助]用AUTOLISP怎么求一个圆和一条线(LINE、PLINE)的交点
用vla-lntersectwith函数。具体的说明请见:http://www.mjtd.com/object/acad2004/idh_intersectwith.htm
里面有一个VBA的例子,你可以把他转成VL。 AutoLISP 中标准求交仅有此函数,但利用程序设计,可以制出圆、圆求交,线圆求交的功能,以补充标准函数在这方面的不足。模拟程序如下:(参见Tools.LSP)
(Defun IIntP (ic1 ic2)
(SetQ icel (EntGet (Car ic2))
icp (Cdr (Assoc 10 icel))
icr (Cdr (Assoc 40 icel))
ica (Angle icp (Cadr ic2))
)
(Command "trim" ic1 "" ic2 "")
(SetQ iael (EntGet (Car ic2))
iasa (Cdr (Assoc 50 iael))
iaea (Cdr (Assoc 51 iael))
)
(Command "u")
(If (And iasa iaea)
(If (< (Abs (- ica iasa)) (Abs (- ica iaea)))
(Osnap (Polar icp iasa icr) "int")
(Osnap (Polar icp iaea icr) "int")
)
nil
)
; (Osnap) and (Polar) 误差-> 0.0
; (Polar) only 误差-> 1.42E-14
)
(Defun C:IInt (/ c1 c2 k)
(SetIErr)
(New_Dialog "IInt" dclcode)
(Start_Image "CC")
(Slide_Image 0 0
(DimX_Tile "CC") (DimY_Tile "CC")
"tools(iint-cc)"
)
(End_Image)
(Start_Image "CL")
(Slide_Image 0 0
(DimX_Tile "CL") (DimY_Tile "CL")
"tools(iint-lc)"
)
(End_Image)
(SetQ k "CC")
(Mode_Tile "CC" 2)
(ForEach kn '("CC" "CL")
(Action_Tile kn
(StrCat "(SetQ k $Key)"
"(If (= 4 $Reason)(Done_Dialog 1))"
)
)
)
(If (= 1 (Start_Dialog))
(Progn (If (= "CC" k)
(Progn (SetQ c1 (EntSel "指定一个圆: ")
c2 (EntSel "在接近交点附近指定另一个圆: ")
)
(SetQ intp (IIntP (Car c1) c2))
)
(Progn (SetQ c1 (EntSel "指定一条直线: ")
c2 (EntSel "接近交点附近指定另一条直线: ")
)
(SetQ intp (IIntP (Car c1) c2))
)
)
(If intp
(Progn (Alert (StrCat "交叉点在 ("
(RToS (Car intp)) (RToS (Cadr intp))
")"
)
)
(Command "circle" intp 2)
)
(Alert "没有找到交点...")
)
)
)
(ReErr) (PrinC)
)
点评
•从程序中可以看到,核心函数 (IInt) 并不复杂。而且没有使用数学解析模型。这又是一个CAGD风格的应用程序。
•主要思路是:修剪这个对象,取出新对象的端点,做位置判断之后返回需要的点位,然后恢复原对象。总之,能推给AutoCAD做的事情,我们决不自己做。要不然,买这个软件做什么?
摘自《VisualLISP程序设计——技巧与范例》 ding 我认为,也可以列方程,用平面几何 的方式来求解。 xazhji:
当然。
但是,就没必要在AutoCAD中了,自己写个CAD就是了... 什么?自己写cad?
你是认为,不可能写出这样的方程吗?
其实,我在我的《让我们共同走进 CAD 的动画世界!》 里的程序,就是将方程变为lisp表格式的。 顶~~ 陈老师,我觉得用vla-lntersectwith已经很好了。你写的模拟程序是一种思路,但是通用性受到限制,对于圆还好说,对于pl,spline和line有多个交点,甚至曲线和曲线有多个交点就没法求了。而且,一般大点的程序在开头结尾要设置undo标志,以便以后能一步“U”回退,如果在程序中用命令u,有可能破坏程序的恢复点设置。我建议如果要用命令来达到求交点的效果,最好用entmake恢复,或者拷贝一份,用完删除。
拙见,请各位赐教。 板凳楼上,陈老师的程序怎么调用的?我放到文本加了lisp后缀,加载了,就是不知道怎么调用啊?
页:
[1]
2