明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2422|回复: 11

请各位高手帮帮忙解决一下这个问题

  [复制链接]
发表于 2003-12-29 11:06:00 | 显示全部楼层 |阅读模式

请大家帮帮忙
小弟在这里恭祝大家新年快乐

本帖子中包含更多资源

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

x
发表于 2003-12-29 11:24:00 | 显示全部楼层
两根线的方法:
找出两跟线的所有节点,判断其中一根线的每个节点是否有与另一根的节点相同,如果有就返回其点。。。

很多就循环一下就可以了
 楼主| 发表于 2003-12-29 11:30:00 | 显示全部楼层
谢谢斑竹的解答
可是还有一个问题就是必须要取出这两根线的交点吧
然后比较这两根线或者N根线的节点是否相同吧
可是如何能给已经判断好的排除掉呢
发表于 2003-12-29 11:41:00 | 显示全部楼层
既然节点相同了,就肯定相交了,而且非节点的相交你又不需要,所以不需要求交点。

另一个问题是编程方法问题,你必须得学会程序的设计思路,找到一个解决问题的办法。
比如,你可以建立一个选择集,判断一个后就从这个选择集中去掉。。。

你可以参考一些其他程序的设计方法介绍,这种方法其实都是通用的,而且也是必须掌握的东西
 楼主| 发表于 2003-12-29 12:15:00 | 显示全部楼层
(defun GetListOfPline (EntityName / SSE_Pline N newEntityName)
  (setq SSE_Pline (entget EntityName))
  (setq LastList nil)
  (if (= (cdr (ASSOC 0 SSE_Pline)) "OLYLINE")
      (PROGN
        (setq LastList (list (list 0 0)))
        (setq newEntityName (entnext EntityName))
        (while (= (cdr (assoc 0 (entget newEntityName))) "VERTEX")
               (setq LastList (append LastList (list (list (cadr (assoc 10 (entget newEntityName))) (caddr (assoc 10 (entget newEntityName))) ))))
               (setq newEntityName (entnext newEntityName))
        )
        (setq LastList (cdr LastList))
      )
  )
  (setq LastList LastList)
);_defun

;;
;; main function
;;
(defun c:getpt ( / n entlen entnn ent_name1 pt_list1 ent_name2 pt_list2 i j pta0 pta1 ins_pt pt_ins_list)
  (setq entnn (ssget ))
  (setq entlen (sslength entnn))
  (setq entlen1 (- entlen 1))
  (setq n 0 )
  (while (< n entlen1)
  (setq ent_name1 (ssname entnn n))
  (setq pt_list1 (GetListOfPline ent_name1))
   (setq ent_name2 (ssname entnn (+ 1 n)))
  (setq pt_list2 (GetListOfPline ent_name2))
  (setq i 1 j 1)
  (setq pta0 (nth 0 pt_list1))
  (while (setq pta1 (nth i pt_list1))
    (setq ptb0 (nth 0 pt_list2))
    (while (setq ptb1 (nth j pt_list2))
      (if (and (setq ins_pt (inters pta0 pta1 ptb0 ptb1 t))
        (not (member ins_pt pt_ins_list))
   )
(progn
   (setq pt_ins_list (append pt_ins_list (list ins_pt)))
)
      );_if
      (setq ptb0 ptb1)
      (setq j (+ j 1))
    );_while
    (setq j 1)
    (setq pta0 pta1)
    (setq i (+ i 1))
  );_while
    )
  pt_ins_list
(chuli)
);_defun
(defun chuli(/ m len1 ents2 )
  (setq m 0)
  (setq len1 (length pt_list1))
  (while (< m len1)
   


;;;;;;;;;;;;;;以上是一个取交点的程序如何能利用这个程序完成我的要求呢请大家帮帮忙急用!!!!!!!!!!!!
谢谢了
发表于 2003-12-29 12:35:00 | 显示全部楼层
跟你说过了,不需要求交点。。。。。没看见?
给你的主函数改了一下:
主要看看思路。。。

  1. (defun c:getpt (/ n entnn ent_name1 pt_list1 ent_name2 pt_list2 i j k pts)
  2.   (setq entnn (ssget))
  3.   (setq n (sslength entnn))
  4.   (setq i 0)
  5.   (while (< i n)
  6.     (setq ent_name1 (ssname entnn i))
  7.     (setq pt_list1 (GetListOfPline ent_name1))
  8.     (setq j (1+ i))
  9.     (while (< j n)
  10.       (setq ent_name2 (ssname entnn j))
  11.       (setq pt_list2 (GetListOfPline ent_name2))
  12.       (setq k 0)
  13.       (repeat (length pt_list2)
  14.         (setq pt (nth k pt_list2))
  15.         (if (member pt pt_list1)
  16.           (setq pts (append pts (list pt)))
  17.         )
  18.         (setq k (1+ k))
  19.       )
  20.       (setq j (1+ j))
  21.     )
  22.     (setq i (1+ i))
  23.   )
  24.   pts
  25. )
 楼主| 发表于 2003-12-29 13:30:00 | 显示全部楼层
我必须要取出一个交点因为我要在没有点的地方做一个标记所以这个点是必须取的,如果有交点的话就无所谓了
但是斑竹这个程序有一个毛病
就是当有一根线的终点或者起始点与线相交的时候就算是有节点也返回空
发表于 2003-12-29 14:05:00 | 显示全部楼层
meflying发表于2003-12-29 12:35:00跟你说过了,不需要求交点。。。。。没看见?
给你的主函数改了一下:
主要看看思路。。。



;;meflying
;;pline數量及點數多時執行速度太慢了
发表于 2003-12-29 14:12:00 | 显示全部楼层
to wb0815:关于起点和终点,你自己处理一下不就可以了吗?
我开头就说了,主要提供一种思路,你是要根据你的需要来确定程序的最终结果。

to 龙:这个我也想到了,没细想过程序速度问题。只是想给他提供一个方法,来打开他的思路,一样的功能,方法肯定多种,在实践中找出更好的。。。
发表于 2003-12-29 14:26:00 | 显示全部楼层

  1. ;;BY龙龙仔(LUCAS)
  2. ;;这样会快一点
  3. (defun C:GETPT_LAI (/ SS N P1 P2 PT_LIST PT_LIST1 LEN)
  4.   (setq SS (ssget '((0 . "*POLYLINE"))))
  5.   (if SS
  6.     (progn
  7.       (setq N        0
  8.             LEN        (sslength SS)
  9.       )
  10.       (repeat LEN
  11.         (setq PT_LIST (append PT_LIST (GETLISTOFPLINE (ssname SS N))))
  12.         (setq N (1+ N))
  13.       )
  14.       (setq
  15.         PT_LIST
  16.          (vl-sort PT_LIST
  17.                   (function (lambda (P1 P2)
  18.                               (cond ((< (car P1) (car P2)) t)
  19.                                     ((and (= (car P1) (car P2))
  20.                                           (< (cadr P1) (cadr P2))
  21.                                      )
  22.                                      t
  23.                                     )
  24.                                     (t NIL)
  25.                               )
  26.                             )
  27.                   )
  28.          )
  29.       )
  30.       (setq N        0
  31.             LEN        (- (length PT_LIST) 1)
  32.       )
  33.       (repeat LEN
  34.         (if (and (equal (nth N PT_LIST) (nth (1+ N) PT_LIST))
  35.                  (not (member (nth N PT_LIST) PT_LIST1))
  36.             )
  37.           (setq PT_LIST1 (append PT_LIST1 (list (nth N PT_LIST))))
  38.         )
  39.         (setq N (1+ N))
  40.       )
  41.       PT_LIST1
  42.     )
  43.   )
  44. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 10:42 , Processed in 0.186273 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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