cxs259 发表于 2010-9-25 14:38:00

[求助]请求完善下面批量交点打断程序,1、可以打断PLINE线,2、内部断线可以自动删

[求助]请求完善下面批量交点打断程序,1、可以打断PLINE线,2、内部断线可以自动删除.<div class="cnt" id="blog_text">
<p><font face="宋体" color="#0000ff" size="1">;;;;;;;;;批量交点打断程序,by:fools<br/>;;支持line arc circle ELLIPSE<br/>(defun c:MB (/ elist ssg n t0)<br/>(VL-LOAD-COM)<br/>(prompt "\n支持line arc circle ELLIPSE!")<br/>(setq t0 (xdl-getutime))<br/>(if (setq ssg (ssget '((0 . "line,arc,circle,ellipse"))))<br/>&nbsp;&nbsp;&nbsp; (vlax-for obj (vla-get-activeselectionset<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-get-activedocument (vlax-get-acad-object))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq elist (cons obj elist)) ; ssg-&gt;elist<br/>&nbsp;&nbsp;&nbsp; )<br/>)<br/>(DoEntMake (InterSort (ssinter elist)))<br/>(princ (strcat "\n*****找到交点"<br/>&nbsp;&nbsp; (itoa n)<br/>&nbsp;&nbsp; "个,交点断开操作共耗时"<br/>&nbsp;&nbsp; (rtos (- (xdl-getutime) t0) 2 3)<br/>&nbsp;&nbsp; "秒。*****"<br/>)<br/>)<br/>(princ)<br/>(princ)<br/>)<br/>;;求交点集函数-nth<br/>;;经过测试,nth函数仅比assoc函数快一点点。<br/>;;故此函数也可取消i,j变量,直接使用assoc函数<br/>(defun ssinter (el / el1 obj1 obj2 ipts pts list1 outlst i j)<br/>(setq outlst (mapcar 'list el)<br/>i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp;&nbsp;&nbsp; ;obj1位置指针 <br/>n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; ;交点数计数器<br/>)<br/>(while el<br/>&nbsp;&nbsp;&nbsp; (setq obj1 (car el)<br/>&nbsp;&nbsp; list1 (nth (setq i (1+ i)) outlst) ;obj1已有的交点列表<br/>&nbsp;&nbsp; el (cdr el)<br/>&nbsp;&nbsp; el1 el<br/>&nbsp;&nbsp; j i&nbsp;&nbsp;&nbsp; ;obj2位置指针<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (while el1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq obj2 (car el1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; el1 (cdr el1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; j (1+ j)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;;取交点<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (and (setq ipts (vla-intersectwith obj1 obj2 0))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ipts (vlax-variant-value ipts))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&gt; (vlax-safearray-get-u-bound ipts 1) 0)</font></p>
<p><font face="宋体" color="#0000ff" size="1">&nbsp;&nbsp; )<br/>(progn<br/>&nbsp;&nbsp; (setq ipts (vlax-safearray-&gt;list ipts)<br/>&nbsp;&nbsp; pts '()&nbsp;&nbsp; ;obj1,obj2交点临时列表变量<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (while (&gt; (length ipts) 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq pts (cons (list (car ipts)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cadr ipts)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (caddr ipts)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pts<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; ipts (cdddr ipts)<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (setq list1 (append list1 pts)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;存obj1交点表,循环结束后再更新<br/>&nbsp;&nbsp; n&nbsp;&nbsp;&nbsp;&nbsp; (+ n (length pts)) ;交点计数累加<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; ;;obj2的交点列表立即更新<br/>&nbsp;&nbsp; (setq<br/>&nbsp;&nbsp;&nbsp;&nbsp; outlst (subst (append (nth j outlst) pts)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (nth j outlst)<br/>&nbsp;&nbsp;&nbsp;&nbsp; outlst<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp; )<br/>)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; ;;当obj1存在交点,且非封闭曲线,添加两端点<br/>&nbsp;&nbsp;&nbsp; (if (and (cdr list1) (not (vlax-curve-isClosed obj1)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq list1 (append list1<br/>&nbsp;&nbsp;&nbsp;&nbsp; (list (vlax-curve-getEndPoint obj1))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (list (vlax-curve-getStartPoint obj1))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (setq outlst (subst list1 (nth i outlst) outlst))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;更新obj1交点列表<br/>)<br/>outlst<br/>)</font></p>
<p><font face="宋体" color="#0000ff" size="1">;;点集排序及删除重复点函数<br/>(defun InterSort (el / obj1 pts plst outlst)<br/>(setq outlst '())&nbsp;&nbsp;&nbsp; ;empty list<br/>(foreach item el<br/>&nbsp;&nbsp;&nbsp; (setq obj1 (car item)<br/>&nbsp;&nbsp; pts (cdr item)<br/>&nbsp;&nbsp; plst '()&nbsp;&nbsp;&nbsp; ;empty list<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (if pts&nbsp;&nbsp;&nbsp;&nbsp; ;若无交点,则不修改该实体<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>;;交点排序,列表为逆序<br/>(setq<br/>&nbsp;&nbsp; pts (vl-sort<br/>&nbsp;&nbsp; pts<br/>&nbsp;&nbsp; (function (lambda (p1 p2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&lt; (vlax-curve-getParamAtPoint obj1 p1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vlax-curve-getParamAtPoint obj1 p2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>)<br/>;;剔除重复点并将列表顺序转正<br/>(foreach p pts<br/>&nbsp;&nbsp; (if plst<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (not (equal p (car plst) 0.00001))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq plst (cons p plst))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq plst (cons p plst))<br/>&nbsp;&nbsp; )<br/>)<br/>;;闭合曲线需再添加首个交点以使新实体完全封闭<br/>(if (vlax-curve-isClosed obj1)<br/>&nbsp;&nbsp; (setq plst (cons (last plst) plst))<br/>)<br/>(setq plst&nbsp;&nbsp; (cons (vlax-vla-object-&gt;ename obj1) plst)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outlst (cons plst outlst)<br/>)</font></p>
<p><font face="宋体" color="#0000ff" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>)<br/>outlst<br/>)</font></p>
<p><font face="宋体" color="#0000ff" size="1">;;调用entmake生成新实体<br/>(defun DoEntMake (el / obj objlst objname objcen objratio objaxis)<br/>(foreach e el<br/>&nbsp;&nbsp;&nbsp; (setq obj&nbsp;&nbsp; (car e)<br/>&nbsp;&nbsp; objlst (entget obj)<br/>&nbsp;&nbsp; objlst (vl-remove (assoc -1 objlst) objlst) ;去除图元名<br/>&nbsp;&nbsp; objlst (vl-remove (assoc 330 objlst) objlst) ;去除id<br/>&nbsp;&nbsp; objlst (vl-remove (assoc 5 objlst) objlst) ;去除句柄<br/>&nbsp;&nbsp; objname (cdr (assoc 0 objlst))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (cond<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= objname "LINE")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (repeat (- (length e) 2)<br/>(setq e (cdr e))<br/>(setq<br/>&nbsp;&nbsp;&nbsp; objlst (subst (cons 10 (car e)) (assoc 10 objlst) objlst)<br/>)<br/>(setq objlst<br/>&nbsp;&nbsp; (subst (cons 11 (cadr e)) (assoc 11 objlst) objlst)<br/>)<br/>(entmake objlst)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (entdel obj)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= objname "CIRCLE")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq objcen (cdr (assoc 10 objlst)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq objlst (subst (cons 0 "ARC") (assoc 0 objlst) objlst))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq objlst (append objlst<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list (cons 100 "AcDbArc")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cons 50 0.0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cons 51 0.0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (repeat (- (length e) 2)<br/>(setq e (cdr e))<br/>(setq objlst (subst (cons 50 (angle objcen (cadr e)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (assoc 50 objlst)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objlst<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>)<br/>(setq objlst (subst (cons 51 (angle objcen (car e)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (assoc 51 objlst)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objlst<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>)<br/>(entmake objlst)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (entdel obj)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= objname "ARC")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq objcen (cdr (assoc 10 objlst)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (repeat (- (length e) 2)<br/>(setq e (cdr e))<br/>(setq objlst (subst (cons 50 (angle objcen (cadr e)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (assoc 50 objlst)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objlst<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>)<br/>(setq objlst (subst (cons 51 (angle objcen (car e)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (assoc 51 objlst)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objlst<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>)<br/>(entmake objlst)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (entdel obj)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= objname "ELLIPSE")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;;椭圆圆心<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq objcen (cdr (assoc 10 objlst)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;;相对于中心的长轴矢量<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq objaxis (cdr (assoc 11 objlst)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;;短轴与长轴的比例<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq objratio (cdr (assoc 40 objlst)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (repeat (- (length e) 2)<br/>(setq e (cdr e))<br/>(setq objlst<br/>&nbsp;&nbsp; (subst<br/>&nbsp;&nbsp;&nbsp; (cons 41<br/>&nbsp;&nbsp;&nbsp; (pt-&gt;param (cadr e) objcen objaxis objratio)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (assoc 41 objlst)<br/>&nbsp;&nbsp;&nbsp; objlst<br/>&nbsp;&nbsp; )<br/>)<br/>(setq objlst<br/>&nbsp;&nbsp; (subst<br/>&nbsp;&nbsp;&nbsp; (cons 42<br/>&nbsp;&nbsp;&nbsp; (pt-&gt;param (car e) objcen objaxis objratio)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (assoc 42 objlst)<br/>&nbsp;&nbsp;&nbsp; objlst<br/>&nbsp;&nbsp; )<br/>)<br/>(entmake objlst)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (entdel obj)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>)<br/>)</font></p>
<p><font face="宋体" color="#0000ff" size="1">;;计算耗时<br/>(defun xdl-getutime ()<br/>(* 86400 (getvar "tdusrtimer"))<br/>)</font></p>
<p><font face="宋体" color="#0000ff" size="1">;;求椭圆曲线参数<br/>(defun pt-&gt;param (pt cen axis ratio / ang param)<br/>(setq ang (- (angle cen pt) (angle '(0. 0. 0.) axis)))<br/>(cond ((= (cos ang) 0.0)&nbsp;&nbsp; ;防止分母cos为零出错<br/>(if (&gt; (sin ang) 0.0)<br/>&nbsp;&nbsp;&nbsp; (setq param (* 0.5 PI))<br/>&nbsp;&nbsp;&nbsp; (setq param (* 1.5 PI))<br/>)<br/>)<br/>((= (sin ang) 0.0)<br/>(if (&gt; (cos ang) 0.0)<br/>&nbsp;&nbsp;&nbsp; (setq param 0.0)<br/>&nbsp;&nbsp;&nbsp; (setq param PI)<br/>)<br/>)<br/>(T<br/>(setq param (atan (/ (sin ang) (* (cos ang) ratio))))<br/>(if (&lt; (cos ang) 0.0)<br/>&nbsp;&nbsp;&nbsp; (setq param (+ pi param))<br/>)<br/>)<br/>)<br/>param<br/>)</font></p></div><br/>

hehoubin 发表于 2017-11-14 12:21:30

你这个程序完善了吗?

pengfei2010 发表于 2018-1-6 22:12:24

恩 ,思路不错,我看看能不能重写
页: [1]
查看完整版本: [求助]请求完善下面批量交点打断程序,1、可以打断PLINE线,2、内部断线可以自动删