gS7 发表于 2022-7-6 02:56:43

>>pBe谢谢你的提示
 
>>李,你的示例程序说不出话来,非常感谢
 
>>你的程序很好,我必须选择多个对象,所以我要考虑李的程序
也非常感谢你的花费
有价值的
是时候解决我的问题了

Lee Mac 发表于 2022-7-6 02:59:31

非常欢迎gS7-
 
但是,请注意,我的程序和GP的程序正在计算两个不同的点:GP的程序正在计算三维多段线上的交点,而我的程序返回LW多段线上的交点。

GP_ 发表于 2022-7-6 03:07:06

不客气,gS7
 
Lee,small clarification,my lisp计算第一条选定多段线(二维/三维)上的交点。

Lee Mac 发表于 2022-7-6 03:09:00

 
谢谢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)
       )
   )
)

gS7 发表于 2022-7-6 03:13:54

在这里,我做了一些小改动,以获取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)
       )
   )
)

Lee Mac 发表于 2022-7-6 03:16:31

 
请注意,如果三维多段线的任何部分比“明显”交点更接近LWD多段线,则修改后的代码将返回错误的点,这在交点不位于顶点的任何情况下都很可能发生。
 
我建议要么使用vlax curve getclosestpointtoprojection函数,要么使用上面第14篇文章中的代码。
 
页: 1 [2]
查看完整版本: Vla中与f相交的问题