明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3836|回复: 12

按图层打断直线的程序,待优化

  [复制链接]
发表于 2013-1-6 22:58 | 显示全部楼层 |阅读模式
1明经币
本帖最后由 半听可乐 于 2013-1-11 09:18 编辑

求这样的功能:比如有图层a、图层b、图层c、图层d、图层e,按先后顺序选取各图层中一条直线(选择的先后顺序为图层a、图层b、图层c、图层d、图层e),然后框选需要处理的范围,然后范围内所有相交的直线被打断,规则是a层上的直线打断b、c、d、e层上的直线,b层上的直线打断c、d、e层上的直线,依次类推,打断间距默认200,可以设置

提供一个类似的程序如下:
使用步骤为:1.依次选图层(a、b、c、d)--2.框选范围--3.选图层e--4.a、b、c、d图层上的直线打断e  
希望社区的那些热心的朋友能一如既往的帮助我,小弟在此拜谢!
(DEFUN C:ttt()
  (SETVAR "CMDECHO" 0)
  (setvar "osnapcoord" 2)
  (setvar "osmode" 0)
  (PROMPT "\n相交直线打断")
  (setq a 0 b 0 c 0 d 0 x 1 n 0 tol 0)
  (princ "\n设置打断长度<")
  (if(null dis)(setq dis 300) (setq dis2 dis))
  (princ dis)
  (setq dis (getreal ">:"))
  (if(null dis) (setq dis dis2))
  (setq dis1 (/ dis 2))
  (PROMPT "\n依次逐个选择上面的直线所在图层,1次选择不超过20个图层:")
  (setq ss2 (ssget '((0 . "LINE"))))
  (if (ssname ss2 0) (progn (SETQ l1 (CDR (ASSOC 8 (ENTGET (ssname ss2 0))))) (setq d (1+ d))) (setq l1 "ttwenchuandizhen"))
  (if (ssname ss2 1) (progn (SETQ l2 (CDR (ASSOC 8 (ENTGET (ssname ss2 1))))) (setq d (1+ d))) (setq l2 "ttwenchuandizhen"))
  (if (ssname ss2 2) (progn (SETQ l3 (CDR (ASSOC 8 (ENTGET (ssname ss2 2))))) (setq d (1+ d))) (setq l3 "ttwenchuandizhen"))
  (if (ssname ss2 3) (progn (SETQ l4 (CDR (ASSOC 8 (ENTGET (ssname ss2 3))))) (setq d (1+ d))) (setq l4 "ttwenchuandizhen"))
  (if (ssname ss2 4) (progn (SETQ l5 (CDR (ASSOC 8 (ENTGET (ssname ss2 4))))) (setq d (1+ d))) (setq l5 "ttwenchuandizhen"))
  (if (ssname ss2 5) (progn (SETQ l6 (CDR (ASSOC 8 (ENTGET (ssname ss2 5))))) (setq d (1+ d))) (setq l6 "ttwenchuandizhen"))
  (if (ssname ss2 6) (progn (SETQ l7 (CDR (ASSOC 8 (ENTGET (ssname ss2 6))))) (setq d (1+ d))) (setq l7 "ttwenchuandizhen"))
  (if (ssname ss2 7) (progn (SETQ l8 (CDR (ASSOC 8 (ENTGET (ssname ss2 7))))) (setq d (1+ d))) (setq l8 "ttwenchuandizhen"))
  (if (ssname ss2 8) (progn (SETQ l9 (CDR (ASSOC 8 (ENTGET (ssname ss2 8))))) (setq d (1+ d))) (setq l9 "ttwenchuandizhen"))
  (if (ssname ss2 9) (progn (SETQ l10 (CDR (ASSOC 8 (ENTGET (ssname ss2 9))))) (setq d (1+ d))) (setq l10 "ttwenchuandizhen"))
  (if (ssname ss2 10) (progn (SETQ l11 (CDR (ASSOC 8 (ENTGET (ssname ss2 10))))) (setq d (1+ d))) (setq l11 "ttwenchuandizhen"))
  (if (ssname ss2 11) (progn (SETQ l12 (CDR (ASSOC 8 (ENTGET (ssname ss2 11))))) (setq d (1+ d))) (setq l12 "ttwenchuandizhen"))
  (if (ssname ss2 12) (progn (SETQ l13 (CDR (ASSOC 8 (ENTGET (ssname ss2 12))))) (setq d (1+ d))) (setq l13 "ttwenchuandizhen"))
  (if (ssname ss2 13) (progn (SETQ l14 (CDR (ASSOC 8 (ENTGET (ssname ss2 13))))) (setq d (1+ d))) (setq l14 "ttwenchuandizhen"))
  (if (ssname ss2 14) (progn (SETQ l15 (CDR (ASSOC 8 (ENTGET (ssname ss2 14))))) (setq d (1+ d))) (setq l15 "ttwenchuandizhen"))
  (if (ssname ss2 15) (progn (SETQ l16 (CDR (ASSOC 8 (ENTGET (ssname ss2 15))))) (setq d (1+ d))) (setq l16 "ttwenchuandizhen"))
  (if (ssname ss2 16) (progn (SETQ l17 (CDR (ASSOC 8 (ENTGET (ssname ss2 16))))) (setq d (1+ d))) (setq l17 "ttwenchuandizhen"))
  (if (ssname ss2 17) (progn (SETQ l18 (CDR (ASSOC 8 (ENTGET (ssname ss2 17))))) (setq d (1+ d))) (setq l18 "ttwenchuandizhen"))
  (if (ssname ss2 18) (progn (SETQ l19 (CDR (ASSOC 8 (ENTGET (ssname ss2 18))))) (setq d (1+ d))) (setq l19 "ttwenchuandizhen"))
  (if (ssname ss2 19) (progn (SETQ l20 (CDR (ASSOC 8 (ENTGET (ssname ss2 19))))) (setq d (1+ d))) (setq l20 "ttwenchuandizhen"))
  (if (ssname ss2 20) (progn (SETQ l21 (CDR (ASSOC 8 (ENTGET (ssname ss2 20))))) (setq d (1+ d))))
  (if (> d 20) (quit))
  (princ "\n共计选择了")
  (princ d)
  (princ "个图层")
  (setq ss1 (ssget (list (cons 0 "LINE") (cons -4 "<or") (cons 8 l1) (cons 8 l2) (cons 8 l3) (cons 8 l4)
(cons 8 l5) (cons 8 l6) (cons 8 l7) (cons 8 l8) (cons 8 l9) (cons 8 l10) (cons 8 l11) (cons 8 l12) (cons 8 l13)
(cons 8 l14) (cons 8 l15) (cons 8 l16) (cons 8 l17) (cons 8 l18) (cons 8 l19) (cons 8 l20) (cons -4 "or>"))))
  (while (= nil (setq l0 (entsel "\n选择下面的直线所在图层: "))))
  (setq l0 (car l0))
  (setq l0 (entget l0))
  (setq l0 (cdr (assoc 8 l0)))
(while (/= x nil)
  (setq ss3 (ssget "X" (list (cons 8 l0) (cons -4 "<or") (cons 0 "LINE") (cons -4 "or>"))))
  (setq x nil)
  (princ "\n循环第")
  (setq n (1+ n))  
  (princ n)
  (princ "次")
(while
  (< a (sslength ss1))
  (setq ent1 (entget (ssname ss1 a)))
  (setq ent2 (reverse (cdr (reverse (cdr (assoc 10 ent1))))))
  (setq ent3 (reverse (cdr (reverse (cdr (assoc 11 ent1))))))
  
(while
  (< b (sslength ss3))
  (setq s1 (ssname ss3 b))
  (setq ent4 (entget s1))
  (setq ent5 (reverse (cdr (reverse (cdr (assoc 10 ent4))))))
  (setq ent6 (reverse (cdr (reverse (cdr (assoc 11 ent4))))))
  (setq ent7 (angle ent5 ent6))
(if
  (setq ent8 (inters ent2 ent3 ent5 ent6))
(progn
  (setq tol (1+ tol))
  (setq x 1)
  (setq ent9 (polar ent8 ent7 dis1))
  (setq ent10 (polar ent8 (+ PI ent7) dis1))
  (setq ent11 (list s1 ent9))
  (command "break" ent11 ent10)
);progn
  );if
  (setq b (1+ b))
);while
  (setq b 0)
  (setq a (1+ a))
);while
  (setq a 0 b 0)
);while
  (princ "\n共计打断了")
  (princ tol)
  (princ "处。")
  (GC)
  (setvar "osmode" 3839)
  (SETVAR "CMDECHO" 1)
  (princ)
  );defun

最佳答案

查看完整内容

水平太次,费了不少时间,恳切希望得到大侠们的指点.
发表于 2013-1-6 22:58 | 显示全部楼层
本帖最后由 004 于 2013-1-11 21:14 编辑


水平太次,费了不少时间,恳切希望得到大侠们的指点.

  1. (defun c:tt (/           +ANG         -ANG  D     E           EL         ELST  EPT   INT
  2.              INTLST         LAY   LAYLST           LEN         O1    O2    OE
  3.              ONEL  ONELAY      ONELL PT1   PT2         PTLST SS    T1
  4.              T2           TWO         X
  5.             )
  6.             ;|求这样的功能:比如有图层a、图层b、图层c、图层d、图层e,
  7. 按先后顺序选取各图层中一条直线(选择的先后顺序为图层a、图层b、图层c、图层d、图层e),
  8. 然后框选需要处理的范围,然后范围内所有相交的直线被打断,规则是a层上的直线打断b、c、d、e层上的直线,
  9. b层上的直线打断c、d、e层上的直线,依次类推,打断间距默认200,可以设置

  10. 提供一个类似的程序如下:
  11. 使用步骤为:1.依次选图层(a、b、c、d)--2.框选范围--3.选图层e--4.a、b、c、d图层上的直线打断e
  12. |;;;wkq004 2013-01-11
  13.   ;;参考;;画线打断于交点处 By Gu_xl 2012.12.11
  14.   (defun sjzl (e / EL LAY LAYL PT1 PT2)
  15.     (setq el (entget e))
  16.     (setq lay (cdr (assoc 8 el)))
  17.     (setq pt1 (cdr (assoc 10 el)))
  18.     (setq pt1 (list (car pt1) (cadr pt1)))
  19.     (setq pt2 (cdr (assoc 11 el)))
  20.     (setq pt2 (list (car pt2) (cadr pt2)))
  21.     (if        (setq layl (assoc lay elst))
  22.       (if (not (member e (cadr layl)))
  23.         (setq
  24.           elst (subst (append layl (list (list e pt1 pt2))) layl elst)
  25.         )
  26.       )
  27.       (setq elst   (cons (list lay (list e pt1 pt2)) elst)
  28.             laylst (cons lay laylst)
  29.       )
  30.     )
  31.   )
  32.   ;;1.依次选图层(a、b、c、d)
  33.   (while (setq ept (entsel "\n选择直线,确定图层顺序->"))
  34.     (sjzl (car ept))
  35.   )
  36.   (if (cdr elst)
  37.     (progn
  38.       ;;2.框选范围
  39.       (princ "\n框选范围:")
  40.       (setq ss
  41.              (ssget
  42.                (list
  43.                  '(0 . "LINE")
  44.                  (cons 8
  45.                        (apply 'strcat
  46.                               (mapcar '(lambda (x) (strcat x ",")) laylst)
  47.                        )
  48.                  )
  49.                )
  50.              )
  51.       )
  52.       (if ss
  53.         (repeat        (setq len (sslength ss))
  54.           (sjzl (ssname ss (setq len (1- len))))
  55.         )
  56.       )
  57.       ;|3.选图层e--4.a、b、c、d图层上的直线打断e
  58.       (if (setq ept (entsel "\n选择要被直接打断的直线->"))
  59.         (setq e           (car ept)
  60.               el   (entget e)
  61.               lay  (cdr (assoc 8 el))
  62.               pt1  (cdr (assoc 10 el))
  63.               pt1  (list (car pt1) (cadr pt1))
  64.               pt2  (cdr (assoc 11 el))
  65.               pt2  (list (car pt2) (cadr pt2))
  66.               elst (cons (list lay (list e pt1 pt2)) elst)
  67.         )
  68.       )|;
  69.       ;;程序部分
  70.       (if (null *d*)
  71.         (setq *d* 0)
  72.       )
  73.       (setq d (getdist (strcat "\n打断距离<" (rtos *d* 2 2) ">:")))
  74.       (if (null d)
  75.         (setq d *d*)
  76.         (setq *d* d)
  77.       )
  78.       (setq d (* 0.5 d))
  79.       (while (and (setq onell (car elst)) (setq elst (cdr elst)))
  80.         (progn
  81.           (setq onelay (car onell))
  82.           (setq onel (cdr onell))
  83.           (foreach one onel
  84.             (setq intlst '())
  85.             (setq oe (car one))
  86.             (setq o1 (cadr one))
  87.             (setq o2 (caddr one))
  88.             (foreach twoll elst
  89.               (foreach two (cdr twoll)
  90.                 (setq t1 (cadr two))
  91.                 (setq t2 (caddr two))
  92.                 (setq int (inters t1 t2 o1 o2 T))
  93.                 (if int
  94.                   (setq intlst (cons int intlst))
  95.                 )
  96.               )
  97.             )
  98.             (if        intlst
  99.               (progn (entdel oe)
  100.                      (setq intlst
  101.                             (vl-sort intlst
  102.                                      (function
  103.                                        (lambda (a b)
  104.                                          (< (distance o1 a) (distance o1 b)) ;_mapcar apply改写
  105.                                        )
  106.                                      )
  107.                             )
  108.                      )
  109.                      (setq one (car intlst))
  110.                      (setq +ang (angle o1 o2))
  111.                      (setq -ang (angle o2 o1))
  112.                      (setq ptlst '())
  113.                      (foreach two intlst
  114.                        (if (> (distance one two) *d*)
  115.                          (entmake (list        '(0 . "LINE")
  116.                                         (cons 8 onelay)
  117.                                         (cons 10 (polar one +ang d))
  118.                                         (cons 11 (polar two -ang d))
  119.                                   )
  120.                          )
  121.                        )
  122.                        (setq one two)
  123.                      )
  124.                      (if (> (distance o1 (setq one (car intlst))) d)
  125.                        (entmake        (list '(0 . "LINE")
  126.                                       (cons 8 onelay)
  127.                                       (cons 10 o1)
  128.                                       (cons 11 (polar one -ang d))
  129.                                 )
  130.                        )
  131.                      )
  132.                      (if (> (distance o2 (setq two (last intlst))) d)
  133.                        (entmake        (list '(0 . "LINE")
  134.                                       (cons 8 onelay)
  135.                                       (cons 10 (polar two +ang d))
  136.                                       (cons 11 o2)
  137.                                 )
  138.                        )
  139.                      )
  140.               )
  141.             )
  142.           )
  143.         )
  144.       )
  145.     )
  146.   )
  147.   (princ)
  148. )

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-1-7 10:09 | 显示全部楼层
直接一个层里打断不行哇?
回复

使用道具 举报

 楼主| 发表于 2013-1-7 14:09 | 显示全部楼层
crazylsp 发表于 2013-1-7 10:09
直接一个层里打断不行哇?

同层直线不打断
回复

使用道具 举报

 楼主| 发表于 2013-1-10 22:30 | 显示全部楼层
顶起来顶起来冒个泡
回复

使用道具 举报

发表于 2013-1-11 04:56 | 显示全部楼层
好乱的程序,看着头晕
回复

使用道具 举报

发表于 2013-1-11 19:23 | 显示全部楼层
要求写的真好.
回复

使用道具 举报

 楼主| 发表于 2013-1-11 20:46 | 显示全部楼层
004 发表于 2013-1-11 19:23
要求写的真好.

谢谢你的关注,希望“选择要被直接打断的直线”这一步不要出现,直接按开始选择的图层顺序自动断开,有劳继续帮忙
回复

使用道具 举报

发表于 2013-1-11 20:52 来自手机 | 显示全部楼层
直接注释掉这段if即可。
回复

使用道具 举报

 楼主| 发表于 2013-1-11 20:55 | 显示全部楼层
004 发表于 2013-1-11 20:52
直接注释掉这段if即可。

惭愧,不会改~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 14:10 , Processed in 3.308556 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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