蒹葭_Keirll 发表于 2012-12-7 21:27:03

一个实现梁交线自动断开的程序,非实用(源码)

(defun c:ddd
(/ pfir pt p1 p2 p3 p4 pt lobj1 lobj2 key a b c d dist e1 e2 ept i j k ent
l_int l_p1 l_p2 lay len len_int spt ss ptl)
(vl-load-com)
(command "ucs" "w")
(setq pfir (getpoint "sss"))
(setq pt (polar pfir pi 100))(setq dist 100)
(setq p1 (polar pfir (+ (angle pfir pt) (/ pi 2)) dist))
(setq p2 (polar p1 (angle pfir pt) (distance pfir pt)))
(setq p3 (polar pfir (+ (angle pfir pt) (/ pi 2)) (* dist -1)))
(setq p4 (polar p3 (angle pfir pt) (distance pfir pt)))
(entmake (list '(0 . "LINE") (cons 10 p1) (cons 11 p2)))
;(setq line1 (entlast))
(setq lobj1 (vlax-ename->vla-object (entlast)))
(entmake (list '(0 . "LINE") (cons 10 p3) (cons 11 p4)))
;(setq line2 (entlast))
(setq lobj2 (vlax-ename->vla-object (entlast)))
(setq key nil)
(while (AND (/= (car key) 3) (/= (car key) 11))
    (setq key (grread nil 1 0)
          pt (cadr key)
    ) ;end set
    (setq p1 (polar pfir (+ (angle pfir pt) (/ pi 2)) dist))
    (setq p2 (polar p1 (angle pfir pt) (distance pfir pt)))
    (setq p3 (polar pfir (+ (angle pfir pt) (/ pi 2)) (* dist -1)))
    (setq p4 (polar p3 (angle pfir pt) (distance pfir pt)))
    (vla-put-startpoint lobj1 (vlax-3d-point p1))
    (vla-put-endpoint lobj1 (vlax-3d-point p2))
    (vla-put-startpoint lobj2 (vlax-3d-point p3))
    (vla-put-endpoint lobj2 (vlax-3d-point p4))
); end while

(setq ptl '())
(setq ptl (append (append (append (append ptl (list p1)) (list p2)) (list p4)) (list p3)))
(setq ss (ssget "CP" ptl (list (cons 0 "LINE")(cons 8 "梁虚线,梁实线"))))
(setq i 0
      l_p1 '() l_p2 '() l_int '()
      len (sslength ss)
);end set
(setq lay (vla-get-layer (vlax-ename->vla-object (ssname ss 0))))

(repeat len ;把直线端点存入表中
    (setq ent (vlax-ename->vla-object (ssname ss i))
          i (+ 1 i)
          p1 (vlax-safearray->list (vlax-variant-value (vla-get-startpoint ent)))
          p2 (vlax-safearray->list (vlax-variant-value (vla-get-endpoint ent)))
          l_p1 (cons p1 l_p1)
          l_p2 (cons p2 l_p2)
    );end set
);end repeat
(command "erase" ss "")
(setq i 0)
(repeat len
    (setq p1 (nth i l_p1)
          p2 (nth i l_p2)
          j 0
    );end set
    (repeat len ;计算某线与其他所有线的交点
      (if (/= j i)
      (setq p3 (nth j l_p1)
            p4 (nth j l_p2)
            j (+ 1 j)
            pt (inters p1 p2 p3 p4)
            l_int (if (AND pt (unequal pt p1)(unequal pt p2)) (cons pt l_int) l_int)
      );end set
      (setq j (+ 1 j))
      );end if
    );end repeat
    (setq l_int (cons p2 (cons p1 l_int)))
    (if (< (abs(- (car p1) (car p2))) 0.0001) ;排序
      (setq l_int (vl-sort l_int (function (lambda (e1 e2)(< (cadr e1) (cadr e2)))) ))
      (setq l_int (vl-sort l_int (function (lambda (e1 e2)(< (car e1) (car e2)))) ))
    );end if
    (setq len_int (length l_int)
          a (nth 0 l_int) b (nth 1 l_int)
          c (nth (- len_int 1) l_int)
          d (nth (- len_int 2) l_int)
    ) ;end set
    (if (< (distance a b) (distance c d)) (setq l_int (reverse l_int)))
    (setq k 0)
    (repeat (/ (length l_int) 2) ;画新线
      (setq spt (nth k l_int) ept (nth (+ k 1) l_int) k (+ k 2) )
      (entmake (list '(0 . "LINE") (cons 10 spt) (cons 11 ept) (cons 8 lay)))
    ) ;end repeat
    (setq l_int '() i (+ 1 i))
);end repeat

(command "ucs" "p")
) ;end fun


(defun unequal (a b)
(if (equal a b) nil T)
) ;end fun


http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 蒹葭_Keirll的微博

bai2000 发表于 2018-10-15 12:49:24

18楼挺好,能不能只修建一个方向的短线?

zzc83 发表于 2012-12-7 21:52:18

本帖最后由 zzc83 于 2012-12-7 21:58 编辑

好的东西,好的人品,顶一下
经测试 绘制双线终点不能捕捉,线不会自动断开,是不是要固定图层?
还有就是不能设置梁宽?

tjuzkj 发表于 2012-12-8 09:30:37

有点意思,顶一下

xyp1964 发表于 2012-12-8 10:20:53

可以继续完善

蒹葭_Keirll 发表于 2012-12-8 13:56:53

zzc83 发表于 2012-12-7 21:52 static/image/common/back.gif
好的东西,好的人品,顶一下
经测试 绘制双线终点不能捕捉,线不会自动断开,是不是要固定图层?
还有就 ...

图层是固定的,只能识别“梁虚线”跟“梁实线”这两个图层,但是只要把代码第35行的(cons8 "梁虚线 梁实线")去掉,就不会识别图层了。
因为用了grread函数,所以不能捕捉,这个我也没有好的办法。
至于设置梁宽,这个比较容易加上去,只要把第7行的 dist 变量改为由用户输入就行了。

zyhandw 发表于 2012-12-8 14:26:54

不错,写得很好,学习了

海盗曹 发表于 2012-12-9 12:50:00

结构同行,赞一个~

crazylsp 发表于 2012-12-9 13:35:36

修改了下可以输入梁宽和捕捉了,可惜没有动态

本帖最后由 crazylsp 于 2012-12-9 13:39 编辑

(defun c:ddd
(/ pfir pt p1 p2 p3 p4 pt lobj1 lobj2 key a b c d dist e1 e2 ept i j k ent
l_int l_p1 l_p2 lay len len_int spt ss ptl)
(vl-load-com)
(command "ucs" "w")
(setq pfir (getpoint "sss"))
(setq dist(getreal "输入梁宽: "))
(setq pt (getpoint pfir "sss"))
(setq p1 (polar pfir (+ (angle pfir pt) (/ pi 2)) dist))
(setq p2 (polar p1 (angle pfir pt) (distance pfir pt)))
(setq p3 (polar pfir (+ (angle pfir pt) (/ pi 2)) (* dist -1)))
(setq p4 (polar p3 (angle pfir pt) (distance pfir pt)))
(entmake (list '(0 . "LINE") (cons 10 p1) (cons 11 p2)))
;(setq line1 (entlast))
(setq lobj1 (vlax-ename->vla-object (entlast)))
(entmake (list '(0 . "LINE") (cons 10 p3) (cons 11 p4)))
;(setq line2 (entlast))
(setq lobj2 (vlax-ename->vla-object (entlast)))
(setq key nil)

(setq ptl '())
(setq ptl (append (append (append (append ptl (list p1)) (list p2)) (list p4)) (list p3)))
(setq ss (ssget "CP" ptl (list (cons 0 "LINE")) ) )
(setq i 0
      l_p1 '() l_p2 '() l_int '()
      len (sslength ss)
);end set
(setq lay (vla-get-layer (vlax-ename->vla-object (ssname ss 0))))

(repeat len ;把直线端点存入表中
    (setq ent (vlax-ename->vla-object (ssname ss i))
          i (+ 1 i)
          p1 (vlax-safearray->list (vlax-variant-value (vla-get-startpoint ent)))
          p2 (vlax-safearray->list (vlax-variant-value (vla-get-endpoint ent)))
          l_p1 (cons p1 l_p1)
          l_p2 (cons p2 l_p2)
    );end set
);end repeat
(command "erase" ss "")
(setq i 0)
(repeat len
    (setq p1 (nth i l_p1)
          p2 (nth i l_p2)
          j 0
    );end set
    (repeat len ;计算某线与其他所有线的交点
      (if (/= j i)
      (setq p3 (nth j l_p1)
            p4 (nth j l_p2)
            j (+ 1 j)
            pt (inters p1 p2 p3 p4)
            l_int (if (AND pt (unequal pt p1)(unequal pt p2)) (cons pt l_int) l_int)
      );end set
      (setq j (+ 1 j))
      );end if
    );end repeat
    (setq l_int (cons p2 (cons p1 l_int)))
    (if (< (abs(- (car p1) (car p2))) 0.0001) ;排序
      (setq l_int (vl-sort l_int (function (lambda (e1 e2)(< (cadr e1) (cadr e2)))) ))
      (setq l_int (vl-sort l_int (function (lambda (e1 e2)(< (car e1) (car e2)))) ))
    );end if
    (setq len_int (length l_int)
          a (nth 0 l_int) b (nth 1 l_int)
          c (nth (- len_int 1) l_int)
          d (nth (- len_int 2) l_int)
    ) ;end set
    (if (< (distance a b) (distance c d)) (setq l_int (reverse l_int)))
    (setq k 0)
    (repeat (/ (length l_int) 2) ;画新线
      (setq spt (nth k l_int) ept (nth (+ k 1) l_int) k (+ k 2) )
      (entmake (list '(0 . "LINE") (cons 10 spt) (cons 11 ept) (cons 8 lay)))
    ) ;end repeat
    (setq l_int '() i (+ 1 i))
);end repeat

(command "ucs" "p")
) ;end fun
(defun unequal (a b)
(if (equal a b) nil T)
) ;end fun


江豚大大 发表于 2012-12-10 00:19:29

挺实用的一个啊~~十分感谢

bdboy 发表于 2012-12-10 19:34:57

代码应该反过来用,已有梁线实现自动断开还算有用处,虽然网上有几个但识别率不高
页: [1] 2 3
查看完整版本: 一个实现梁交线自动断开的程序,非实用(源码)