明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3637|回复: 7

[求助]请问在程序中如何获得两个实体的交点?

[复制链接]
发表于 2002-11-3 13:40 | 显示全部楼层 |阅读模式
在《二次开发》中有一个求交点的程序,在这个程序中使用了(vla-intersecteith AOBJ1 AOBJ2 0)的函数,可我在VLisp的帮助文件中确没有找到vla-intersectwith函数。
请问除inters求两个直线段的交点外,还有其它的方法获得两个实体的交点么?
发表于 2002-11-3 16:33 | 显示全部楼层

Inters函数不行么?

发表于 2002-11-3 21:44 | 显示全部楼层

这是个ActiveX的方法,可查看对象模型的帮助文件

发表于 2002-11-4 06:00 | 显示全部楼层

INTERS参数只是两条直线的4个点, 那直线与弧或任意实体呢?

 楼主| 发表于 2002-11-4 07:37 | 显示全部楼层

我的意思也是想求任意两个实体的交点,inters只能求两条线段的交点。

 楼主| 发表于 2002-11-4 08:13 | 显示全部楼层

对不起,请问可以详细说一下如何查看对象模型的帮助文件么?

发表于 2002-11-4 08:51 | 显示全部楼层

这样做...

其中,(Polar p3 0 -1) 是返回自 P3 点向左水平位移 1mm得到的点位。用求交叉点的函数 (Inters) 返回想要的交点。有 nil 参数,(Inters)认为所描述的两条线是无限长,返回的交点可以在所描述的直线段之外。这样就把 (Inters) 的返回值直接填充到 LINE 命令的响应序列中,画好内环挡边的轮廓线。这也是在程序中使用 CAGD。
若用解析法,列写直线方程计算交叉点,描述将比较复杂,精度也不如AutoCAD。
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)
)  

t  点评
·  从程序中可以看到,核心函数 (IInt) 并不复杂。而且没有使用数学解析模型。这又是一个CAGD风格的应用程序。
·  主要思路是:修剪这个对象,取出新对象的端点,做位置判断之后返回需要的点位,然后恢复原对象。总之,能推给AutoCAD做的事情,我们决不自己做。要不然,买这个软件做什么?
·  对于修剪之后的 ARC 结果对象,使用了双重 CAGD 风格的端点处理:
     (OSnap (Polar icp iasa icr) "int")
如果仅是 (Polar icp iasa icr),最大误差可达1.42E-14mm。这是因为 ARC 数据库使用了“圆心、角度、半径”的数据结构,表达它的端点位置,因此在计算中将会多次用到Pi这个无限不循环小数,结果会有误差。用 OSanp-int 可以结合第二个对象,进一步修正点位的数据,得到最好的结果。

摘自《Visual LISP程序设计——技巧与范例》第五章
发表于 2002-11-6 11:06 | 显示全部楼层

查ActiveX 与 Vba 参考手册下之方法

;;Intersectwith是对VLAOBJ对象的方法     
(defun TEST (/ IPTS PTS)
  (setq        IPTS (vla-intersectwith
               (vlax-ename->vla-object (car (entsel)))
               (vlax-ename->vla-object (car (entsel)))
               acExtendBoth       
             )
        IPTS (vlax-variant-value IPTS)
  )
  (if (> (vlax-safearray-get-u-bound IPTS 1) 0)
    (progn (setq IPTS
                  (vlax-safearray->list IPTS)
           )
           (while (> (length IPTS) 0)
             (setq PTS        (cons (list (car IPTS)
                                    (cadr IPTS)
                                    (caddr IPTS)
                              )
                              PTS
                        )
                   IPTS        (cdddr IPTS)
             )
           )
    )
  )
  PTS
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 11:10 , Processed in 0.644844 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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