wb0815 发表于 2003-12-29 11:06:00

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


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

meflying 发表于 2003-12-29 11:24:00

两根线的方法:
找出两跟线的所有节点,判断其中一根线的每个节点是否有与另一根的节点相同,如果有就返回其点。。。

很多就循环一下就可以了

wb0815 发表于 2003-12-29 11:30:00

谢谢斑竹的解答
可是还有一个问题就是必须要取出这两根线的交点吧
然后比较这两根线或者N根线的节点是否相同吧
可是如何能给已经判断好的排除掉呢

meflying 发表于 2003-12-29 11:41:00

既然节点相同了,就肯定相交了,而且非节点的相交你又不需要,所以不需要求交点。

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

你可以参考一些其他程序的设计方法介绍,这种方法其实都是通用的,而且也是必须掌握的东西

wb0815 发表于 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)) "POLYLINE")
      (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)
   


;;;;;;;;;;;;;;以上是一个取交点的程序如何能利用这个程序完成我的要求呢请大家帮帮忙急用!!!!!!!!!!!!
谢谢了

meflying 发表于 2003-12-29 12:35:00

跟你说过了,不需要求交点。。。。。没看见?
给你的主函数改了一下:
主要看看思路。。。

(defun c:getpt (/ n entnn ent_name1 pt_list1 ent_name2 pt_list2 i j k pts)
(setq entnn (ssget))
(setq n (sslength entnn))
(setq i 0)
(while (< i n)
    (setq ent_name1 (ssname entnn i))
    (setq pt_list1 (GetListOfPline ent_name1))
    (setq j (1+ i))
    (while (< j n)
      (setq ent_name2 (ssname entnn j))
      (setq pt_list2 (GetListOfPline ent_name2))
      (setq k 0)
      (repeat (length pt_list2)
        (setq pt (nth k pt_list2))
        (if (member pt pt_list1)
          (setq pts (append pts (list pt)))
        )
        (setq k (1+ k))
      )
      (setq j (1+ j))
    )
    (setq i (1+ i))
)
pts
)

wb0815 发表于 2003-12-29 13:30:00

我必须要取出一个交点因为我要在没有点的地方做一个标记所以这个点是必须取的,如果有交点的话就无所谓了
但是斑竹这个程序有一个毛病
就是当有一根线的终点或者起始点与线相交的时候就算是有节点也返回空

龙龙仔 发表于 2003-12-29 14:05:00

meflying发表于2003-12-29 12:35:00static/image/common/back.gif跟你说过了,不需要求交点。。。。。没看见?
给你的主函数改了一下:
主要看看思路。。。



;;meflying
;;pline數量及點數多時執行速度太慢了

meflying 发表于 2003-12-29 14:12:00

to wb0815:关于起点和终点,你自己处理一下不就可以了吗?
我开头就说了,主要提供一种思路,你是要根据你的需要来确定程序的最终结果。

to 龙:这个我也想到了,没细想过程序速度问题。只是想给他提供一个方法,来打开他的思路,一样的功能,方法肯定多种,在实践中找出更好的。。。

龙龙仔 发表于 2003-12-29 14:26:00


;;BY龙龙仔(LUCAS)
;;这样会快一点
(defun C:GETPT_LAI (/ SS N P1 P2 PT_LIST PT_LIST1 LEN)
(setq SS (ssget '((0 . "*POLYLINE"))))
(if SS
    (progn
      (setq N        0
          LEN        (sslength SS)
      )
      (repeat LEN
        (setq PT_LIST (append PT_LIST (GETLISTOFPLINE (ssname SS N))))
        (setq N (1+ N))
      )
      (setq
        PT_LIST
       (vl-sort PT_LIST
                  (function (lambda (P1 P2)
                              (cond ((< (car P1) (car P2)) t)
                                  ((and (= (car P1) (car P2))
                                          (< (cadr P1) (cadr P2))
                                     )
                                     t
                                  )
                                  (t NIL)
                              )
                          )
                  )
       )
      )
      (setq N        0
          LEN        (- (length PT_LIST) 1)
      )
      (repeat LEN
        (if (and (equal (nth N PT_LIST) (nth (1+ N) PT_LIST))
               (not (member (nth N PT_LIST) PT_LIST1))
          )
          (setq PT_LIST1 (append PT_LIST1 (list (nth N PT_LIST))))
        )
        (setq N (1+ N))
      )
      PT_LIST1
    )
)
)
页: [1] 2
查看完整版本: 请各位高手帮帮忙解决一下这个问题