曙光一号 发表于 2002-11-3 13:40:00

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

在《二次开发》中有一个求交点的程序,在这个程序中使用了(vla-intersecteith AOBJ1 AOBJ2 0)的函数,可我在VLisp的帮助文件中确没有找到vla-intersectwith函数。
请问除inters求两个直线段的交点外,还有其它的方法获得两个实体的交点么?

陈伯雄 发表于 2002-11-3 16:33:00

Inters函数不行么?

mccad 发表于 2002-11-3 21:44:00

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

shicai 发表于 2002-11-4 06:00:00

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

曙光一号 发表于 2002-11-4 07:37:00

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

曙光一号 发表于 2002-11-4 08:13:00

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

陈伯雄 发表于 2002-11-4 08:51:00

这样做...

其中,(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:00

查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
)
页: [1]
查看完整版本: [求助]请问在程序中如何获得两个实体的交点?