注册 登录
明经CAD社区 返回首页

Gu_xl的个人空间 http://www.mjtd.com/?161460 [收藏] [复制] [分享] [RSS]

日志

计算多段线自交点函数

热度 17已有 3823 次阅读2014-6-21 21:21 |个人分类:Lisp公用函数|系统分类:开发| 联系方式, 源代码, Email

计算多段线自交点.LSP

计算多段线自交点.LSP

本源代码由 Gu_xl 编写发布! 联系方式: Email: Gu_xl@sohu.com
;;计算多段线自交点 By 明经通道 Gu_xl 2014.06.21
(defun gxl-polyselfinters (OBJ	  /	 LST	I      ISCLOSED
			   FLAG	  OBJ1	 LST1	FLAG1  OBJ2   L
			   LL	  PS	 P	RESULT lst0
			  )
  (if (= 'ename (type obj))
    (setq obj (vlax-ename->vla-object obj))
  )
  (setq lst (vlax-invoke obj 'explode))
  (setq lst0 lst)
  (setq i (length lst))
  (setq	isclosed (equal	(vlax-curve-getstartpoint obj)
			(vlax-curve-getendpoint obj)
			1e-6
		 )
  )
  (if (> i 1)
    (progn
      (setq flag t)
      (while lst
	(setq obj1  (car lst)
	      lst   (cdr lst)
	      lst1  lst
	      flag1 t
	)
	(while lst1
	  (setq	obj2 (car lst1)
		lst1 (cdr lst1)
	  )
	  (setq l (vlax-invoke obj1 'IntersectWith obj2 0))
	  (setq ll nil)
	  (while l
	    (setq p  (list (car l) (cadr l) (caddr l))
		  l  (cdddr l)
		  ll (cons p ll)
	    )
	  )
	  (if flag1
	    (progn
	      (foreach p ll
		(if
		  (not (or
			 (equal p (vlax-curve-getStartPoint obj2) 1e-6)
			 (equal p (vlax-curve-getendPoint obj2) 1e-6)
		       )
		  )
		   (setq result (cons p result))
		)
	      )
	      (setq flag1 nil)
	    )
	    (progn
	      (if lst1
		(setq result (append result ll))
		(progn
		  (if (and flag isclosed)
		    (foreach p ll
		      (if
			(not
			  (or
			    (equal p
				   (vlax-curve-getStartPoint obj1)
				   1e-6
			    )
			    (equal p (vlax-curve-getendPoint obj1) 1e-6)
			  )
			)
			 (setq result (cons p result))
		      )
		    )
		    (setq result (append result ll))
		  )
		  (setq flag nil)
		)
	      )
	    )
	  )

	)
      )
    )
  )
  (foreach a lst0 (vla-delete a))
  ;;除重点
  (setq	result
	 (vl-sort
	   result
	   '(lambda (a b)
	      (if (equal (car a) (car b) 1e-6)
		(< (cadr a) (cadr b))
		(< (car a) (car b))
	      )
	    )
	 )
  )
  (setq l nil)
  (while result
    (setq l	 (cons (setq n (car result)) l)
	  result (cdr result)
    )
    (while (and result (equal n (car result) 1e-6))
      (setq result (cdr result))
    )
  )
  (reverse l)
)
(defun c:tt ()
  (while
    (setq e (car (entsel "\n选择多段线:")))
     (setq pl (gxl-polyselfinters e))
    (setvar 'pdsize 5)
    ;;绘制交点
     (mapcar '(lambda (x)
		(vl-cmdf "point" "non" (trans x 0 1) )
	      )
	     pl
     )
    ;;显示焦点坐标
     (princ pl)
  )
  (princ)
)

路过

雷人
12

握手
3

鲜花

鸡蛋

刚表态过的朋友 (15 人)

发表评论 评论 (3 个评论)

回复 duanshui83 2014-7-3 12:42
错误: ActiveX 服务器返回错误: 未知名称: "EXPLODE"
回复 陈进佳 2016-2-20 22:41
(defun c:tt (/ en en1 ptlst lst nlst);多段线自交点
  (defun N5-divide-list(lst  / nlst)
(repeat (/(length lst)3)
  (setq nlst(cons (list(car lst)(cadr lst)(caddr lst))nlst))
  (setq lst(cdddr lst))
  )
  (reverse nlst)
          
)
(defun n5-inters-pt(ss0 ss1 /  )
  (vl-load-com)
  (N5-divide-list (vlax-invoke (vlax-ename->vla-object ss0) 'IntersectWith (vlax-ename->vla-object ss1) 0) )
)
  (setq en (car (entsel)))
  (setvar "osmode" 0)
  (command "copy" en "" '(0 0) '(0 0))
  (setq en1 (entlast))
  (setq ptlst (mapcar 'cdr(vl-remove-if-not '(lambda(x)(=(car x) 10))(entget en))))
  (setq        lst (mapcar '(lambda (x) (list (car x) (cadr x)))
                    (n5-inters-pt en en1)
            )
  )
  (while (setq a (car lst))
    (if        (not (member a ptlst))
      (setq nlst (cons a nlst))
    )
    (setq lst (cdr lst))
  )
  (setq nlst (reverse nlst))
  (command"erase"en1"")
  (foreach b nlst (command "circle" b 5))
)
这是我写的多段线求交点函数;唯一的缺陷是交点如果在多段线顶点上就无法得到交点了,由于刚接触lsp水平有限,希望能帮忙改进
回复 yuanziyou 2021-1-29 23:08
如果线上两个节点距离小于0.1,会出现误判,没有自相交也会判断为相交

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

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

GMT+8, 2024-4-20 20:51 , Processed in 0.169724 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部