明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8096|回复: 28

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

  [复制链接]
发表于 2012-12-7 21:27 | 显示全部楼层 |阅读模式
  1. (defun c:ddd
  2.   (/ pfir pt p1 p2 p3 p4 pt lobj1 lobj2 key a b c d dist e1 e2 ept i j k ent
  3.   l_int l_p1 l_p2 lay len len_int spt ss ptl)
  4.   (vl-load-com)
  5.   (command "ucs" "w")
  6.   (setq pfir (getpoint "sss"))
  7.   (setq pt (polar pfir pi 100))(setq dist 100)
  8.   (setq p1 (polar pfir (+ (angle pfir pt) (/ pi 2)) dist))
  9.   (setq p2 (polar p1 (angle pfir pt) (distance pfir pt)))
  10.   (setq p3 (polar pfir (+ (angle pfir pt) (/ pi 2)) (* dist -1)))
  11.   (setq p4 (polar p3 (angle pfir pt) (distance pfir pt)))
  12.   (entmake (list '(0 . "LINE") (cons 10 p1) (cons 11 p2)))
  13.   ;(setq line1 (entlast))
  14.   (setq lobj1 (vlax-ename->vla-object (entlast)))
  15.   (entmake (list '(0 . "LINE") (cons 10 p3) (cons 11 p4)))
  16.   ;(setq line2 (entlast))
  17.   (setq lobj2 (vlax-ename->vla-object (entlast)))
  18.   (setq key nil)
  19.   (while (AND (/= (car key) 3) (/= (car key) 11))
  20.     (setq key (grread nil 1 0)
  21.           pt (cadr key)
  22.     ) ;end set
  23.     (setq p1 (polar pfir (+ (angle pfir pt) (/ pi 2)) dist))
  24.     (setq p2 (polar p1 (angle pfir pt) (distance pfir pt)))
  25.     (setq p3 (polar pfir (+ (angle pfir pt) (/ pi 2)) (* dist -1)))
  26.     (setq p4 (polar p3 (angle pfir pt) (distance pfir pt)))
  27.     (vla-put-startpoint lobj1 (vlax-3d-point p1))
  28.     (vla-put-endpoint lobj1 (vlax-3d-point p2))
  29.     (vla-put-startpoint lobj2 (vlax-3d-point p3))
  30.     (vla-put-endpoint lobj2 (vlax-3d-point p4))
  31.   ); end while

  32.   (setq ptl '())
  33.   (setq ptl (append (append (append (append ptl (list p1)) (list p2)) (list p4)) (list p3)))
  34.   (setq ss (ssget "CP" ptl (list (cons 0 "LINE")(cons 8 "梁虚线,梁实线"))))
  35.   (setq i 0
  36.         l_p1 '() l_p2 '() l_int '()
  37.         len (sslength ss)
  38.   );end set
  39.   (setq lay (vla-get-layer (vlax-ename->vla-object (ssname ss 0))))
  40.   
  41.   (repeat len ;把直线端点存入表中
  42.     (setq ent (vlax-ename->vla-object (ssname ss i))
  43.           i (+ 1 i)
  44.           p1 (vlax-safearray->list (vlax-variant-value (vla-get-startpoint ent)))
  45.           p2 (vlax-safearray->list (vlax-variant-value (vla-get-endpoint ent)))
  46.           l_p1 (cons p1 l_p1)
  47.           l_p2 (cons p2 l_p2)
  48.     );end set
  49.   );end repeat
  50.   (command "erase" ss "")
  51.   (setq i 0)
  52.   (repeat len
  53.     (setq p1 (nth i l_p1)
  54.           p2 (nth i l_p2)
  55.           j 0
  56.     );end set
  57.     (repeat len ;计算某线与其他所有线的交点
  58.       (if (/= j i)
  59.         (setq p3 (nth j l_p1)
  60.               p4 (nth j l_p2)
  61.               j (+ 1 j)
  62.               pt (inters p1 p2 p3 p4)
  63.               l_int (if (AND pt (unequal pt p1)(unequal pt p2)) (cons pt l_int) l_int)
  64.         );end set
  65.         (setq j (+ 1 j))
  66.       );end if
  67.     );end repeat
  68.     (setq l_int (cons p2 (cons p1 l_int)))
  69.     (if (< (abs(- (car p1) (car p2))) 0.0001) ;排序
  70.       (setq l_int (vl-sort l_int (function (lambda (e1 e2)(< (cadr e1) (cadr e2)))) ))
  71.       (setq l_int (vl-sort l_int (function (lambda (e1 e2)(< (car e1) (car e2)))) ))
  72.     );end if
  73.     (setq len_int (length l_int)
  74.           a (nth 0 l_int) b (nth 1 l_int)
  75.           c (nth (- len_int 1) l_int)
  76.           d (nth (- len_int 2) l_int)
  77.     ) ;end set
  78.     (if (< (distance a b) (distance c d)) (setq l_int (reverse l_int)))
  79.     (setq k 0)
  80.     (repeat (/ (length l_int) 2) ;画新线
  81.       (setq spt (nth k l_int) ept (nth (+ k 1) l_int) k (+ k 2) )
  82.       (entmake (list '(0 . "LINE") (cons 10 spt) (cons 11 ept) (cons 8 lay)))
  83.     ) ;end repeat
  84.     (setq l_int '() i (+ 1 i))
  85.   );end repeat
  86.   
  87.   (command "ucs" "p")
  88. ) ;end fun


  89. (defun unequal (a b)
  90.   (if (equal a b) nil T)
  91. ) ;end fun



该贴已经同步到 蒹葭_Keirll的微博

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2018-10-15 12:49 | 显示全部楼层
18楼挺好,能不能只修建一个方向的短线?
发表于 2012-12-7 21:52 | 显示全部楼层
本帖最后由 zzc83 于 2012-12-7 21:58 编辑

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

发表于 2012-12-8 09:30 | 显示全部楼层
有点意思,顶一下
发表于 2012-12-8 10:20 | 显示全部楼层
可以继续完善
 楼主| 发表于 2012-12-8 13:56 | 显示全部楼层
zzc83 发表于 2012-12-7 21:52
好的东西,好的人品,顶一下
经测试 绘制双线终点不能捕捉,线不会自动断开,是不是要固定图层?
还有就 ...

图层是固定的,只能识别“梁虚线”跟“梁实线”这两个图层,但是只要把代码第35行的(cons  8 "梁虚线 梁实线")去掉,就不会识别图层了。
因为用了grread函数,所以不能捕捉,这个我也没有好的办法。
至于设置梁宽,这个比较容易加上去,只要把第7行的 dist 变量改为由用户输入就行了。
发表于 2012-12-8 14:26 | 显示全部楼层
不错,写得很好,学习了
发表于 2012-12-9 12:50 | 显示全部楼层
结构同行,赞一个~
发表于 2012-12-9 13:35 | 显示全部楼层

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

本帖最后由 crazylsp 于 2012-12-9 13:39 编辑
  1. (defun c:ddd
  2.   (/ pfir pt p1 p2 p3 p4 pt lobj1 lobj2 key a b c d dist e1 e2 ept i j k ent
  3.   l_int l_p1 l_p2 lay len len_int spt ss ptl)
  4.   (vl-load-com)
  5.   (command "ucs" "w")
  6.   (setq pfir (getpoint "sss"))
  7.   (setq dist(getreal "输入梁宽: "))
  8.   (setq pt (getpoint pfir "sss"))
  9.   (setq p1 (polar pfir (+ (angle pfir pt) (/ pi 2)) dist))
  10.   (setq p2 (polar p1 (angle pfir pt) (distance pfir pt)))
  11.   (setq p3 (polar pfir (+ (angle pfir pt) (/ pi 2)) (* dist -1)))
  12.   (setq p4 (polar p3 (angle pfir pt) (distance pfir pt)))
  13.   (entmake (list '(0 . "LINE") (cons 10 p1) (cons 11 p2)))
  14.   ;(setq line1 (entlast))
  15.   (setq lobj1 (vlax-ename->vla-object (entlast)))
  16.   (entmake (list '(0 . "LINE") (cons 10 p3) (cons 11 p4)))
  17.   ;(setq line2 (entlast))
  18.   (setq lobj2 (vlax-ename->vla-object (entlast)))
  19.   (setq key nil)
  20.   
  21.   (setq ptl '())
  22.   (setq ptl (append (append (append (append ptl (list p1)) (list p2)) (list p4)) (list p3)))
  23.   (setq ss (ssget "CP" ptl (list (cons 0 "LINE")) ) )
  24.   (setq i 0
  25.         l_p1 '() l_p2 '() l_int '()
  26.         len (sslength ss)
  27.   );end set
  28.   (setq lay (vla-get-layer (vlax-ename->vla-object (ssname ss 0))))
  29.   
  30.   (repeat len ;把直线端点存入表中
  31.     (setq ent (vlax-ename->vla-object (ssname ss i))
  32.           i (+ 1 i)
  33.           p1 (vlax-safearray->list (vlax-variant-value (vla-get-startpoint ent)))
  34.           p2 (vlax-safearray->list (vlax-variant-value (vla-get-endpoint ent)))
  35.           l_p1 (cons p1 l_p1)
  36.           l_p2 (cons p2 l_p2)
  37.     );end set
  38.   );end repeat
  39.   (command "erase" ss "")
  40.   (setq i 0)
  41.   (repeat len
  42.     (setq p1 (nth i l_p1)
  43.           p2 (nth i l_p2)
  44.           j 0
  45.     );end set
  46.     (repeat len ;计算某线与其他所有线的交点
  47.       (if (/= j i)
  48.         (setq p3 (nth j l_p1)
  49.               p4 (nth j l_p2)
  50.               j (+ 1 j)
  51.               pt (inters p1 p2 p3 p4)
  52.               l_int (if (AND pt (unequal pt p1)(unequal pt p2)) (cons pt l_int) l_int)
  53.         );end set
  54.         (setq j (+ 1 j))
  55.       );end if
  56.     );end repeat
  57.     (setq l_int (cons p2 (cons p1 l_int)))
  58.     (if (< (abs(- (car p1) (car p2))) 0.0001) ;排序
  59.       (setq l_int (vl-sort l_int (function (lambda (e1 e2)(< (cadr e1) (cadr e2)))) ))
  60.       (setq l_int (vl-sort l_int (function (lambda (e1 e2)(< (car e1) (car e2)))) ))
  61.     );end if
  62.     (setq len_int (length l_int)
  63.           a (nth 0 l_int) b (nth 1 l_int)
  64.           c (nth (- len_int 1) l_int)
  65.           d (nth (- len_int 2) l_int)
  66.     ) ;end set
  67.     (if (< (distance a b) (distance c d)) (setq l_int (reverse l_int)))
  68.     (setq k 0)
  69.     (repeat (/ (length l_int) 2) ;画新线
  70.       (setq spt (nth k l_int) ept (nth (+ k 1) l_int) k (+ k 2) )
  71.       (entmake (list '(0 . "LINE") (cons 10 spt) (cons 11 ept) (cons 8 lay)))
  72.     ) ;end repeat
  73.     (setq l_int '() i (+ 1 i))
  74.   );end repeat
  75.   
  76.   (command "ucs" "p")
  77. ) ;end fun
  78. (defun unequal (a b)
  79.   (if (equal a b) nil T)
  80. ) ;end fun


点评

画线起点不能捕捉,默认为上一次的末端点  发表于 2012-12-10 13:26
发表于 2012-12-10 00:19 | 显示全部楼层
挺实用的一个啊~~十分感谢
发表于 2012-12-10 19:34 | 显示全部楼层
代码应该反过来用,已有梁线实现自动断开还算有用处,虽然网上有几个但识别率不高
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 22:01 , Processed in 0.613154 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表