Kye 发表于 2014-10-30 14:05:58

如何将圆弧及直线的重合端点放到一个表、非重合端点放到另一个表中

本帖最后由 Kye 于 2014-10-31 16:34 编辑

;;
在USER2128 及namezg 两位老师指导下,可以实现上次贴子的要求,见5楼程序,
但是遇到新问题: 没有重合的端点怎么也弄不到一个表中,继续求老师们给指点如何将没有重合的端点放到另一个表中


;;


这个程序是路人老师的,提取直线的端点及相同端点,我想改成可以提取LINE,ARC类型的所有端点及相同端点,修改了其中的子函数Get_line_point后,获取选取线的所有端点没有问题;但提取同一端点时遇到问题:1.      测试时两根线为LINE类型,可以提取出同一端点2.      一种为ARC类型,另一种为LINE类型时或两线都为ARC类型,程序有时能提取出来同一端点(例如测试附件中的A),有时提取不出来(例如测试附件中的B)

测试很长时间,测试中除XP:Flatten没有被替换,其他函数用过相似函数替换,结果一样,没有找到原因,哪位大侠百忙中抽空帮忙指点指点,谢谢了。附件是测试的DWG文件




;;;选择集转vla图元表
;;;ss->vla List
(defun LM:ss->vla(SS / E I L)

    (if ss
      ((lambda (i / e L)
(while (setq e (ssname ss (setq i (1+ i))))
    (setq L (cons (vlax-ename->vla-object e) L))
)
L
       )
-1
      )
    )
);;;提取线的端点
(defun Get_line_point (SS / PT PTS)(mapcar '(lambda (x / pt pts)
      (progn
      (setq pt (vlax-curve-getendpoint x))
      (setq pts (cons pt pts))
      (setq pt (vlax-curve-getstartpoint x))
      (setq pts (cons pt pts))
      ) ;_progn
    ) ;_lambda
   ss
) ;_mapcar
)

;;;多层表转换单层表
(defun XP:Flatten (lst)
    (if lst
      (if (listp (car lst))
(append (XP:Flatten (car lst)) (XP:Flatten (cdr lst)))
(list lst)
      )
    )
);;;提取相同点, by 阿然
(defun findsame (lst)
    (if lst
      (if (member (car lst) (cdr lst))
(append (list (car lst)) (findsame (cdr lst)))
(findsame (cdr lst))
      )
    )
)(defun findsame2 (l1 / l2) ;_by llsheng_73
;;;查找表中重复元素
(while l1
    (if (member (car l1) (cdr l1))
;_(setq l2 (append l2 (list (car l1))))
      (setq l2 (cons (car l1) l2))    )
    (setq l1 (vl-remove (car l1) l1))
)
l2
)

;;;删除重复制点,保留一个点(defun gxl-delsame (L);_by Gu_lx
    (if L
      (cons (car L) (gxl-delsame (vl-remove (car L) (cdr L))))
    )
)

(defun c:tt (/ SS PTS pts1)
(vl-load-com)
(setvar "cmdecho" 0)
(setq ss (ssget '((0 . "*LINE,ARC"))))(setq ss (LM:ss->vla ss));选择集转vla图元表
(setq pts (Get_line_point ss));提取线的端点(setq pts (XP:Flatten pts));多层表转换单层表,获取所有端点(princ "\n 所有端点\n")
(print pts)
(princ "\n 所有端点\n")(setq pts1 (findsame pts));;提取相同端点 (princ "\n 提取出相同端点\n")
(print pts1)
(princ "\n 提取出相同端点\n")(princ)
)





USER2128 发表于 2014-10-30 15:52:50

查找相同点,须加入误差控制,如:(equal pt1 pt2 1e-6)。

namezg 发表于 2014-10-30 21:11:57

一般(equal pt1 pt2 0.0001)即可。当然允许的误差精度还可以设的更高。

Kye 发表于 2014-10-30 21:32:34

谢谢楼上两位老师指点,容差没有用过,我再学习下试试能否解决

Kye 发表于 2014-10-31 15:13:42

本帖最后由 Kye 于 2014-10-31 15:42 编辑

在二楼和三楼老师的指点下,学习了G版的程序,也没有全看懂,能把重合的端点取出来(多余两根线重合端点,会重复取),但是没有重合的端点怎么也弄不到一个表中,继续求老师们给指点如何将没有重合的端点放到另一个表中


(defun ss2lst (ss / l n) ;_by Gu_lx
(repeat (setq n (sslength ss))
    (setq l (cons (ssname ss (setq n (1- n))) l))
)
l
)
(defun gxl-delsame (L) ;_by Gu_lx
(if L
    (cons (car L) (gxl-delsame (vl-remove (car L) (cdr L))))
)
)

(defun c:dividePoints (/ SS1ss   TOL    SAMEPOINTS
         SELECTCURVESN   LINE    ENDPOINTS
         PT P1P2
      )

(vl-load-com)
(setvar "cmdecho" 0)
(setq ss1 (ssget '((0 . "*LINE,ARC"))))
(setq ss (ss2lst ss1))
(setq tol (getreal "\n 容差值<0.001>:"))
(if (null tol)
    (setq tol 0.001)
) ;_if
(setq SamePoints
'()
;_UnSamePoints '()
;_SelectCurves '()
)
(setq n 0)
(repeat (sslength ss1)
    (setq line (ssname ss1 n))
    (setq endPoints (list (vlax-curve-getstartpoint line)
   (vlax-curve-getendpoint line)
      )
    )
    (setq ss (vl-remove line ss))
;_(setq SelectCurves (cons line SelectCurves))
    (while endPoints
      (setq pt       (car endPoints)
   EndPoints (cdr EndPoints)
      )
      (foreach a ss
(setq p1 (vlax-curve-getstartpoint a)
       p2 (vlax-curve-getendpoint a)
)
(if (equal p1 pt tol)
   (setq SamePoints (cons p1 SamePoints))
)
(if (equal p2 pt tol)
   (setq SamePoints (cons p2 SamePoints))
)
      ) ;_foreach
    )
    (setq n (1+ n))
;_(setq ss (ss2lst ss1))
)
(setq samepoints (gxl-delsame samepoints))
(princ)
samepoints
)

Kye 发表于 2014-11-1 22:23:42

再次感谢USER2128老师 及namezg 老师热心指导,感谢伟大的G版,也感谢浏览此帖的众位老师,程序写的很乱,问题似乎是解决了(defun ss2lst (ss / l n) ;_by Gu_lx
(repeat (setq n (sslength ss))
    (setq l (cons (ssname ss (setq n (1- n))) l))
)
l
)




(defun c:dividePoints (/SS1   SS    TOL   SAMEPOINTS
         UNSAMEPOINTS   N    LINE   ENDPOINTS
         PTP1   P2    TAGLST   X
         TAG
          )



(vl-load-com)
(setvar "cmdecho" 0)
(setq ss1 (ssget '((0 . "*LINE,ARC"))))
(setq ss (ss2lst ss1))

(setq tol (getreal "\n 容差值<0.001>:"))
(if (null tol)
    (setq tol 0.001)
) ;_if
(setqSamePoints
         '()
UnSamePoints '()

)

(setq n 0)

(repeat (sslength ss1)

    (setq line (ssname ss1 n))

    (setq endPoints (list (vlax-curve-getstartpoint line)
      (vlax-curve-getendpoint line)
      )
    )
    (setq ss (vl-remove line ss))
    (while endPoints
      (setq pt      (car endPoints)
      EndPoints (cdr EndPoints)
      )

      (foreach a ss
(setq p1 (vlax-curve-getstartpoint a)
      p2 (vlax-curve-getendpoint a)
)

(if (equal p1 pt tol)
    (progn (foreach x SamePoints
       (if (equal p1 x tol)
         (setq SamePoints (vl-remove x SamePoints))
       )
   )
   (setq SamePoints (cons p1 SamePoints))

    )
)
(if (equal p2 pt tol)
    (progn (foreach x SamePoints
       (if (equal p2 x tol)
         (setq SamePoints (vl-remove x SamePoints))
       )
   )
   (setq SamePoints (cons p2 SamePoints))
    ) ;_PROGN

) ;_IF

      );_foreach


;;;;___________________________________________

      (setq taglst
       (mapcar
         '(lambda(x)
      (progn
      (setq p1 (vlax-curve-getstartpoint x))
      (setq p2 (vlax-curve-getendpoint x))
      (if
          (and (not (equal p1 pt tol)) (not (equal p2 pt tol)))
         (setq x 1)
         (setq x 0)
      ) ;_if
      ) ;_progn
    ) ;_lambda
         ss
       ) ;_mapcar
      ) ;_setq

      (if (null (vl-position (setq tag 0) taglst))

(setq UnSamePoints (cons pt UnSamePoints))
      )

;;;;___________________________________________


    ) ;_while
    (setq n (1+ n))
    (setq ss (ss2lst ss1))
)

(princ)
(list samepoints UnSamePoints)

)
页: [1]
查看完整版本: 如何将圆弧及直线的重合端点放到一个表、非重合端点放到另一个表中