fwdll 发表于 2003-6-28 16:37:00

[求助]用AUTOLISP怎么求一个圆和一条线(LINE、PLINE)的交点

mccad 发表于 2003-6-28 16:50:00

用vla-lntersectwith函数。
具体的说明请见:http://www.mjtd.com/object/acad2004/idh_intersectwith.htm
里面有一个VBA的例子,你可以把他转成VL。

陈伯雄 发表于 2003-6-30 11:40:00

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程序设计——技巧与范例》

前生 发表于 2003-6-30 12:57:00

ding

xazhji 发表于 2003-6-30 17:32:00

我认为,也可以列方程,用平面几何 的方式来求解。

陈伯雄 发表于 2003-7-1 08:40:00

xazhji:
当然。
但是,就没必要在AutoCAD中了,自己写个CAD就是了...

xazhji 发表于 2003-7-1 17:33:00

什么?自己写cad?
你是认为,不可能写出这样的方程吗?
其实,我在我的《让我们共同走进 CAD 的动画世界!》 里的程序,就是将方程变为lisp表格式的。

cxzr8 发表于 2004-2-20 17:56:00

顶~~

无痕 发表于 2004-2-20 19:04:00

陈老师,我觉得用vla-lntersectwith已经很好了。你写的模拟程序是一种思路,但是通用性受到限制,对于圆还好说,对于pl,spline和line有多个交点,甚至曲线和曲线有多个交点就没法求了。而且,一般大点的程序在开头结尾要设置undo标志,以便以后能一步“U”回退,如果在程序中用命令u,有可能破坏程序的恢复点设置。我建议如果要用命令来达到求交点的效果,最好用entmake恢复,或者拷贝一份,用完删除。


拙见,请各位赐教。

酥果 发表于 2011-9-15 11:41:28

板凳楼上,陈老师的程序怎么调用的?我放到文本加了lisp后缀,加载了,就是不知道怎么调用啊?
页: [1] 2
查看完整版本: [求助]用AUTOLISP怎么求一个圆和一条线(LINE、PLINE)的交点