明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6850|回复: 14

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

  [复制链接]
发表于 2003-6-28 16:37:00 | 显示全部楼层 |阅读模式
发表于 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)
)  

&#61556;  点评
&#8226;  从程序中可以看到,核心函数 (IInt) 并不复杂。而且没有使用数学解析模型。这又是一个CAGD风格的应用程序。
&#8226;  主要思路是:修剪这个对象,取出新对象的端点,做位置判断之后返回需要的点位,然后恢复原对象。总之,能推给AutoCAD做的事情,我们决不自己做。要不然,买这个软件做什么?

摘自《VisualLISP程序设计——技巧与范例》

评分

参与人数 1威望 +1 金钱 +2 贡献 +1 激情 +2 收起 理由
mccad + 1 + 2 + 1 + 2 【好评】好文章好程序

查看全部评分

发表于 2003-6-30 12:57:00 | 显示全部楼层
ding
发表于 2003-6-30 17:32:00 | 显示全部楼层
我认为,也可以列方程,用  平面几何 的方式来求解。
发表于 2003-7-1 08:40:00 | 显示全部楼层
xazhji:
当然。
但是,就没必要在AutoCAD中了,自己写个CAD就是了...
发表于 2003-7-1 17:33:00 | 显示全部楼层
什么?自己写cad?
你是认为,不可能写出这样的方程吗?
其实,我在我的  《让我们共同走进 CAD 的动画世界!》 里的程序,就是将方程变为lisp表格式的。
发表于 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后缀,加载了,就是不知道怎么调用啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-30 19:41 , Processed in 0.180364 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表