>>李,你的示例程序说不出话来,非常感谢
>>你的程序很好,我必须选择多个对象,所以我要考虑李的程序
也非常感谢你的花费
有价值的
是时候解决我的问题了 非常欢迎gS7-
但是,请注意,我的程序和GP的程序正在计算两个不同的点:GP的程序正在计算三维多段线上的交点,而我的程序返回LW多段线上的交点。 不客气,gS7
Lee,small clarification,my lisp计算第一条选定多段线(二维/三维)上的交点。
谢谢GP
以下是计算三维多段线上交点的另一种方法,允许进行多次选择:
(defun c:test ( / e i j s1 s2 )
(if
(and
(princ "\nSelect LWPolylines...")
(setq s1 (ssget '((0 . "LWPOLYLINE"))))
(princ "\nSelect 3D Polylines...")
(setq s2 (ssget '((0 . "POLYLINE") (-4 . "&=") (70 . )))
)
(repeat (setq i (sslength s1))
(setq e (ssname s1 (setq i (1- i))))
(repeat (setq j (sslength s2))
(foreach x (3D-poly-inters e (ssname s2 (setq j (1- j))))
(entmake (list '(0 . "CIRCLE") '(40 . 1.0) (cons 10 x)))
)
)
)
)
(princ)
)
(defun 3D-poly-inters ( lwp 3dp / enx ls1 ls2 )
(setq ls1 (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget lwp)))
3dp (entnext 3dp)
enx (entget3dp)
)
(while (= "VERTEX" (cdr (assoc 0 enx)))
(setq ls2 (cons (cdr (assoc 10 enx)) ls2)
3dp (entnext 3dp)
enx (entget3dp)
)
)
(if (= 1 (logand 1 (cdr (assoc 70 (entget (cdr (assoc 330 enx)))))))
(setq ls2 (cons (last ls2) ls2))
)
(if (= 1 (logand 1 (cdr (assoc 70 (entget lwp)))))
(setq ls1 (cons (last ls1) ls1))
)
(apply 'append
(mapcar
(function
(lambda ( a b )
(vl-remove nil
(mapcar
(function
(lambda ( c d / p )
(if (setq p (inters a b c d))
(inters a b (append p '(0.0)) (append p '(1.0)) nil)
)
)
)
ls1 (cdr ls1)
)
)
)
)
ls2 (cdr ls2)
)
)
)
在这里,我做了一些小改动,以获取3d点
用李的示例程序。。
(defun c:test ( / e i j s1 s2 )
(if
(and
(princ "\nSelect LWPolylines...")
(setq s1 (ssget '((0 . "LWPOLYLINE"))))
(princ "\nSelect 3D Polylines...")
(setq s2 (ssget '((0 . "POLYLINE") (-4 . "&=") (70 . )))
)
(repeat (setq i (sslength s1))
(setq e (ssname s1 (setq i (1- i))))
(repeat (setq j (sslength s2))
(foreach x (2D-poly-inters e (setq e2 (ssname s2 (setq j (1- j)))))
(entmake (list '(0 . "CIRCLE") '(40 . 1.0) (cons 10 (vlax-curve-getclosestpointto e2 x))))
)
)
)
)
(princ)
)
(defun 2D-poly-inters ( lwp 3dp / enx ls1 ls2 vtx )
(setq ls1 (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget lwp)))
3dp (entnext 3dp)
enx (entget3dp)
)
(while (= "VERTEX" (cdr (assoc 0 enx)))
(setq vtx (assoc 10 enx)
ls2 (cons (list (cadr vtx) (caddr vtx)) ls2)
3dp (entnext 3dp)
enx (entget3dp)
)
)
(if (= 1 (logand 1 (cdr (assoc 70 (entget (cdr (assoc 330 enx)))))))
(setq ls2 (cons (last ls2) ls2))
)
(if (= 1 (logand 1 (cdr (assoc 70 (entget lwp)))))
(setq ls1 (cons (last ls1) ls1))
)
(apply 'append
(mapcar
(function
(lambda ( a b )
(vl-remove nil
(mapcar
(function
(lambda ( c d )
(inters a b c d)
)
)
ls1 (cdr ls1)
)
)
)
)
ls2 (cdr ls2)
)
)
)
请注意,如果三维多段线的任何部分比“明显”交点更接近LWD多段线,则修改后的代码将返回错误的点,这在交点不位于顶点的任何情况下都很可能发生。
我建议要么使用vlax curve getclosestpointtoprojection函数,要么使用上面第14篇文章中的代码。
李
页:
1
[2]