明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 34771|回复: 79

[求助]请问如何求出两条多义线的交点?

  [复制链接]
发表于 2003-7-20 22:17:00 | 显示全部楼层 |阅读模式
发表于 2003-7-21 11:10:00 | 显示全部楼层
Trim->读出新点-〉回退。
发表于 2003-7-21 14:27:00 | 显示全部楼层

回复

用下面的代码试试:

  1. ;;
  2. ;; Get all nodes of the LWPolyline, Polyline.
  3. ;;
  4. (defun GetListOfPline (EntityName / SSE_Pline N newEntityName)
  5.   (setq SSE_Pline (entget EntityName))
  6.   (setq LastList nil)
  7.   (if (= (cdr (assoc 0 SSE_Pline)) "LWPOLYLINE")
  8.       (progn
  9.         (setq LastList (LIST (LIST 0 0)))
  10.         (setq N 0)
  11.         (while (/= (nth N SSE_Pline) nil)
  12.                (if (= (car (nth N SSE_Pline)) 10)
  13.                    (setq LastList (append LastList (list (list (cadr (nth N SSE_Pline)) (caddr (nth N SSE_Pline)) )) ))
  14.                )
  15.                (setq N (+ N 1))
  16.         )
  17.         (setq LastList (cdr LastList))
  18.       )
  19.   )
  20.   (if (= (cdr (ASSOC 0 SSE_Pline)) "POLYLINE")
  21.       (PROGN
  22.         (setq LastList (list (list 0 0)))
  23.         (setq newEntityName (entnext EntityName))
  24.         (while (= (cdr (assoc 0 (entget newEntityName))) "VERTEX")
  25.                (setq LastList (append LastList (list (list (cadr (assoc 10 (entget newEntityName))) (caddr (assoc 10 (entget newEntityName))) ))))
  26.                (setq newEntityName (entnext newEntityName))
  27.         )
  28.         (setq LastList (cdr LastList))
  29.       )
  30.   )
  31.   (setq LastList LastList)
  32. );_defun

  33. ;;
  34. ;; main function
  35. ;;
  36. (defun c:getInsPtOfPl ( / ent_name1 pt_list1 ent_name2 pt_list2 i j pta0 pta1 ins_pt pt_ins_list)
  37.   (setq ent_name1 (car (entsel "\nSelect first entity:")))
  38.   (setq pt_list1 (GetListOfPline ent_name1))
  39.   (setq ent_name2 (car (entsel "\nSecond entity:")))
  40.   (setq pt_list2 (GetListOfPline ent_name2))

  41.   (setq i 1 j 1)
  42.   (setq pta0 (nth 0 pt_list1))
  43.   (while (setq pta1 (nth i pt_list1))
  44.     (setq ptb0 (nth 0 pt_list2))
  45.     (while (setq ptb1 (nth j pt_list2))
  46.       (if (and (setq ins_pt (inters pta0 pta1 ptb0 ptb1 t))
  47.                (not (member ins_pt pt_ins_list))
  48.           )
  49.         (progn
  50.           (setq pt_ins_list (append pt_ins_list (list ins_pt)))
  51.         )
  52.       );_if
  53.       (setq ptb0 ptb1)
  54.       (setq j (+ j 1))
  55.     );_while
  56.     (setq j 1)
  57.     (setq pta0 pta1)
  58.     (setq i (+ i 1))
  59.   );_while
  60.   pt_ins_list
  61. );_defun


没有错误处理,不过应该可以说明一定问题了,主函数中pt_ins_list变量返回两条多义线的交点表.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1威望 +1 金钱 +10 贡献 +5 激情 +5 收起 理由
meflying + 1 + 10 + 5 + 5 【好评】好文章

查看全部评分

发表于 2003-7-21 20:07:00 | 显示全部楼层
提供一个用ax的方法,对所有曲线均有效

  1. (defun c:GIP ()
  2.   (c:getinterpoint)
  3. )
  4. (defun C:GetInterPoint (/        ent1     ent2     ent_1    ent_2
  5.                         ax_ent_1 ax_ent_2 intpoints         i
  6.                         j        k        disp
  7.                        )
  8.   (setq ent1 (entsel "\n选择第一条曲线:"))
  9.   (setq ent2 (entsel "\n选择第二条曲线:"))
  10.   (setq ent_1 (car ent1)
  11.         ent_2 (car ent2)
  12.   )
  13.   (setq ax_ent_1 (vlax-ename->vla-object ent_1)
  14.         ax_ent_2 (vlax-ename->vla-object ent_2)
  15.   )
  16.   (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
  17.   (setq intpoints (vlax-variant-value intpoints))
  18.   (if (> (vlax-safearray-get-u-bound intpoints 1) 0)
  19.     (progn
  20.       (setq i 0)
  21.       (setq j 0)
  22.       (setq k 0)
  23.       (setq disp "")
  24.       (repeat
  25.         (/ (+ 1
  26.               (- (vlax-safearray-get-u-bound intpoints 1)
  27.                  (vlax-safearray-get-l-bound intpoints 1)
  28.               )
  29.            )
  30.            3
  31.         )
  32.          (setq
  33.            disp (strcat
  34.                   disp
  35.                   "\n交点"
  36.                   (itoa (+ k 1))
  37.                   "坐标为:"
  38.                   (rtos (vlax-safearray-get-element intpoints j))
  39.                   " , "
  40.                   (rtos (vlax-safearray-get-element intpoints (+ 1 j)))
  41.                   " , "
  42.                   (rtos (vlax-safearray-get-element intpoints (+ 2 j)))
  43.                 )
  44.          )
  45.          (setq i (+ 2 i)
  46.                j (+ 3 j)
  47.                k (+ 1 k)
  48.          )
  49.       )
  50.       (princ disp)
  51.     )
  52.     (princ "\n两曲线没有交点")
  53.   )
  54.   (princ "\n明经通道LISP示例-求两曲线交点")
  55.   (princ)
  56. )
发表于 2003-7-22 04:57:00 | 显示全部楼层
  1. (defun c:test ()
  2.   (vl-load-com)
  3.   (setq a (car (entsel "\nSelect First Object: ")))
  4.   (setq b (car (entsel "\nSelect Second Object: ")))
  5.   (setq pts (vla-IntersectWith
  6.                (vlax-ename->vla-object a)
  7.                (vlax-ename->vla-object b)
  8.                acExtendnone
  9.         ))
  10.   (setq ins (not (minusp (vlax-safearray-get-u-bound (vlax-variant-value pts) 1))))
  11.   (cond
  12.     ((ins
  13.        (setq plist (vlax-safearray->list (vlax-variant-value pts)))
  14.        (repeat (/ (length plist) 3)
  15.          (setq pl (cons (list (car plist)(cadr plist)(caddr plist)) pl)
  16.             plist (cdddr plist))
  17.        );r
  18.     ))
  19.   );c
  20.   ins
  21. );
pl-insection point
发表于 2003-7-24 14:07:00 | 显示全部楼层
mccad 的代码很完善了
 楼主| 发表于 2003-7-24 21:58:00 | 显示全部楼层

谢谢各位

 楼主| 发表于 2003-7-28 10:47:00 | 显示全部楼层
谢谢 mccad,你的程序要经VL编译后才能用,还有就是如两条曲线是空间相交(标高不同,但有视觉交点)就求不出交点了



 楼主| 发表于 2003-7-28 10:53:00 | 显示全部楼层
你好,为什么不编译就会出现函数定义错误?
发表于 2003-7-28 11:00:00 | 显示全部楼层
只要加载(vl-load-com)
再加载程序就可以了,不需要编译
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-23 10:56 , Processed in 0.226237 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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