[求助]请问在程序中如何获得两个实体的交点?
在《二次开发》中有一个求交点的程序,在这个程序中使用了(vla-intersecteith AOBJ1 AOBJ2 0)的函数,可我在VLisp的帮助文件中确没有找到vla-intersectwith函数。请问除inters求两个直线段的交点外,还有其它的方法获得两个实体的交点么?
Inters函数不行么?
这是个ActiveX的方法,可查看对象模型的帮助文件
INTERS参数只是两条直线的4个点, 那直线与弧或任意实体呢?
我的意思也是想求任意两个实体的交点,inters只能求两条线段的交点。
对不起,请问可以详细说一下如何查看对象模型的帮助文件么?
这样做...
其中,(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程序设计——技巧与范例》第五章
查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]