明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: ljfei82050

修剪十字交叉线段

    [复制链接]
发表于 2010-11-14 18:01:00 | 显示全部楼层

[求助]如何实现这个功能?

这个简单啊

发表于 2010-12-14 16:50:17 | 显示全部楼层
估计一个也没发

点评

这个你有没有搞定?发一份给我  发表于 2011-12-11 00:35
发表于 2011-3-18 14:49:48 | 显示全部楼层
下载了xyp的修理墙角可是用不了,也希望楼主可以发一份给我
312958411@qq.com
发表于 2011-3-22 11:57:28 | 显示全部楼层
强悍,可以给咱也发一个不,兄台
357785519@163.COM
发表于 2011-5-5 19:42:38 | 显示全部楼层
只聞雷聲~~不見雨點.....
那些高人怎不發源代碼共享一下?
发表于 2011-5-6 08:08:50 | 显示全部楼层
呵呵,只有想不到的,没有做不到的啊,
发表于 2011-5-6 10:59:00 | 显示全部楼层
我也想要~~~~~~~~
发表于 2011-12-10 19:53:48 | 显示全部楼层
下面是我以前收藏的一个东东,忘了出处,共享:
  1. ;#字线段修剪
  2. (defun l_layer( / i lyname sat)      ;去掉被锁住的层上的实体
  3.    (setq i 0)
  4.    (while (< i (sslength ul))
  5.      (setq lyname nil)
  6.      (setq sat nil)
  7.      (setq lyname (cdr (assoc 8 (entget (ssname ul i)))))
  8.      (setq sat(cdr (assoc 70 (tblsearch "layer" lyname))))
  9.      (if (eq 68 sat)
  10.        (progn
  11.          (ssdel (ssname ul i) ul)
  12.          (setq i (- i 1))
  13.        )
  14.      )
  15.      (setq i (1+ i))
  16.    )               
  17. )

  18. (defun ver_line( / i uu ln)        ;检查实体是否是直线
  19.    (setq i 0)
  20.    (setq uu(ssadd))
  21.    (while (< i (sslength ul))
  22.      (setq ln(ssname ul i))
  23.      (if (= "LINE" (cdr(assoc 0(entget ln))))
  24.        (ssadd ln uu)
  25.      )
  26.      (setq i(1+ i))
  27.    )
  28.    (setq ul uu)
  29. )


  30. (defun pplayer(ull / i lyname  uul)         ;仅在"BEAM"层上的实体被选
  31.    (setq i 0)
  32.    (while (< i (sslength ull))
  33.      (setq lyname (cdr (assoc 8 (entget (ssname ull i)))))
  34.      (if (/= "BEAM" lyname)
  35.        (progn
  36.          (ssdel (ssname ull i) ull)
  37.          (setq i (- i 1))
  38.        )
  39.      )
  40.      (setq i (1+ i))
  41.    )               
  42.    (setq uul ull)
  43. )


  44. (defun in_w(tul sp ep / spu epu ppu pp ang il sett seet pt1x pt1y pt2x pt2y
  45.                        pt1xu pt1yu pt1xuu pt1yuu pt2xu pt2yu pt2xuu pt2yuu
  46.                        ppxu ppyu epxu epyu ptt1 ptt2)
  47.                      
  48.    (setq entb nil)  
  49.    (setq spu(trans sp 1 0 0))
  50.    (setq epu(trans ep 1 0 0))
  51.    (if (and (> (cadr epu) (cadr spu)) (> (car epu) (car spu)))
  52.       (setq ppu (list (car epu) (cadr spu) (caddr spu)))
  53.    )   
  54.    (if (and (> (cadr epu) (cadr spu)) (< (car epu) (car spu)))
  55.       (setq ppu (list (car spu) (cadr epu) (caddr spu)))
  56.    )   
  57.    (if (and (< (cadr epu) (cadr spu)) (> (car epu) (car spu)))
  58.       (setq ppu (list (car spu) (cadr epu) (caddr spu)))
  59.    )   
  60.    (if (and (< (cadr epu) (cadr spu)) (< (car epu) (car spu)))
  61.       (setq ppu (list (car epu) (cadr spu) (caddr spu)))
  62.    )   
  63.    (setq pp(trans ppu 0 1 0))  
  64.    (setq ang (angle sp pp))
  65.    (setq il 0)
  66.    (setq sett (ssadd))
  67.    (setq seet nil)
  68.    (while (< il (sslength tul))
  69.      (setq pt1x (car(cdr(assoc 10 (entget(ssname ul il))))))
  70.      (setq pt1y (cadr(cdr(assoc 10(entget(ssname ul il))))))
  71.      (setq pt2x (car(cdr(assoc 11 (entget(ssname ul il))))))
  72.      (setq pt2y (cadr(cdr(assoc 11(entget(ssname ul il))))))
  73.      (setq ptt1(trans (list pt1x pt1y (caddr sp)) 0 1 0))  
  74.      (setq ptt2(trans (list pt2x pt2y (caddr sp)) 0 1 0))   
  75.      (setq pt1xuu (car ptt1))                 
  76.      (setq pt1yuu (cadr ptt1))
  77.      (setq pt2xuu (car ptt2))
  78.      (setq pt2yuu (cadr ptt2))                           
  79.      (setq pt1xu(+ (* (- pt1xuu (car sp)) (cos ang))
  80.                    (* (- pt1yuu (cadr sp)) (sin ang))))   
  81.      (setq pt1yu(- (* (- pt1yuu (cadr sp)) (cos ang))
  82.                    (* (- pt1xuu (car sp)) (sin ang))))
  83.      (setq pt2xu(+ (* (- pt2xuu (car sp)) (cos ang))
  84.                    (* (- pt2yuu (cadr sp)) (sin ang))))
  85.      (setq pt2yu(- (* (- pt2yuu (cadr sp)) (cos ang))
  86.                    (* (- pt2xuu (car sp)) (sin ang))))
  87.      (setq ppxu(+ (* (- (car pp) (car sp)) (cos ang))
  88.                    (* (- (cadr pp) (cadr sp)) (sin ang))))
  89.      (setq ppyu(- (* (- (cadr pp) (cadr sp)) (cos ang))
  90.                    (* (- (car pp) (car sp)) (sin ang))))
  91.      (setq epxu(+ (* (- (car ep) (car sp)) (cos ang))
  92.                    (* (- (cadr ep) (cadr sp)) (sin ang))))
  93.      (setq epyu(- (* (- (cadr ep) (cadr sp)) (cos ang))
  94.                    (* (- (car ep) (car sp)) (sin ang))))
  95.      (if (and (and (<= 0 pt1xu) (<= pt1xu ppxu))
  96.               (and (<= 0 pt1yu) (<= pt1yu epyu)))
  97.         (progn
  98.            (ssadd (ssname tul il) sett)
  99.            (setq entb (cons ptt1 entb))
  100.            (setq entb (cons ptt2 entb))
  101.         )
  102.      )
  103.      (if (and (and (<= 0 pt2xu) (<= pt2xu ppxu))
  104.               (and (<= 0 pt2yu) (<= pt2yu epyu)))
  105.         (progn
  106.            (if (ssmemb (ssname tul il) sett)
  107.               (progn
  108.                 (ssdel (ssname tul il) sett)
  109.                 ;(setq il (- il 1))
  110.                 (setq entb (cdr entb))
  111.                 (setq entb (cdr entb))
  112.               )
  113.               (progn
  114.                 (ssadd (ssname tul il) sett)
  115.                 (setq entb (cons ptt2 entb))
  116.                 (setq entb (cons ptt1 entb))
  117.               )
  118.            )
  119.         )
  120.      )
  121.      (setq il (1+ il))
  122.    )
  123.    (setq entb (reverse entb))
  124.    (setq seet sett) ;(exit)
  125. )                  

  126. (defun sub_set(sst1 sst2 / tt i set)
  127.    (setq tt (sslength sst2))
  128.    (setq i 0)
  129.    (while (< i tt)
  130.      (ssdel (ssname sst2 i) sst1 )
  131.      (setq i (1+ i))     
  132.    )  
  133.    (setq set sst1)  
  134. )
  135.    

  136. (defun int1( set2 / entn1 entn2 i ii pp1 pp2 p1 p2 it ptbb)
  137.    (setq i 0)
  138.    (setq newtb1 (ssadd))
  139.    (setq ptb1 nil)            
  140.    (while (< i (sslength set1))
  141.      (setq entn1 (ssname set1 i))
  142.      (setq pp1 (trans(cdr (assoc 10 (entget entn1))) 0 1 0))
  143.      (setq pp2 (trans(cdr (assoc 11 (entget entn1))) 0 1 0))
  144.      (setq ii 0)
  145.      (setq it nil)
  146.      (setq ptbb nil)
  147.      (while (< ii (sslength set2))
  148.        (setq entn2(ssname set2 ii))
  149.        (setq p1 (trans(cdr (assoc 10 (entget entn2))) 0 1 0))
  150.        (setq p2 (trans(cdr (assoc 11 (entget entn2))) 0 1 0))
  151.        (setq it(inters pp1 pp2 p1 p2))
  152.        (if it
  153.          (setq ptbb(cons it  ptbb))
  154.        )
  155.        (setq ii (1+ ii))
  156.      )                       
  157.      (if (= 2 (length ptbb))
  158.        (progn
  159.          (ssadd entn1 newtb1)
  160.          (setq ptb1(cons (nth 0 ptbb) ptb1))
  161.          (setq ptb1(cons (nth 1 ptbb) ptb1))
  162.        )
  163.      )
  164.      (setq i (1+ i))
  165.    )
  166. )

  167. (defun int2( set2 / i ii l ptbb entn1 entn2 entnn it pp1 pp2 pt1 pt2
  168.                     p1 p2)
  169.    (setq i 0)
  170.    (setq newtb2 (ssadd))
  171.    (setq ptb2  nil)
  172.    (while (< i (sslength set2))
  173.      (setq entn1(ssname set2  i))
  174.      (setq pt1 (trans(cdr (assoc 10 (entget entn1))) 0 1 0))
  175.      (setq pt2 (trans(cdr (assoc 11 (entget entn1))) 0 1 0))
  176.      (setq ii 0)
  177.      (setq it nil)
  178.      (setq ptbb nil)
  179.      (while (< ii (sslength set1))
  180.        (setq entn2(ssname set1 ii))
  181.        (setq pp1 (trans(cdr (assoc 10 (entget entn2))) 0 1 0))
  182.        (setq pp2 (trans(cdr (assoc 11 (entget entn2))) 0 1 0))
  183.        (setq it(inters pt1 pt2 pp1 pp2))
  184.        (if it
  185.          (setq ptbb (cons it ptbb))
  186.        )
  187.        (setq ii (1+ ii))      
  188.      )
  189.      (if (and (> 3 (length ptbb)) (< 0 (length ptbb)))
  190.        (progn
  191.          (ssadd entn1 newtb2)
  192.          (if (= 1 (length ptbb))
  193.            (progn
  194.              (setq pppp ptbb)
  195.              (setq pppp (cons (nth (* 2 i) entb) pppp))
  196.            )
  197.          )
  198.          (if (= 2 (length ptbb))
  199.            (progn
  200.              (setq pppp ptbb)
  201.              (if (< (distance (nth 0 pppp) (nth (* 2 i) entb))
  202.                     (distance (nth 1 pppp) (nth (* 2 i) entb)))
  203.                (progn
  204.                  (setq pppp (list (nth 1 pppp) (nth (* 2 i) entb)))
  205.                  (setq l 0)                        
  206.                  (while (< l (sslength set1))
  207.                    (setq entnn(ssname set1 l))
  208.                    (setq p1(trans(cdr(assoc 10 (entget entnn))) 0 1 0))
  209.                    (setq p2(trans(cdr(assoc 11 (entget entnn))) 0 1 0))
  210.                    (if (> 0.0000001 (abs (- (angle (nth 0 ptbb) p1) (angle p2 p1))))
  211.                      (progn
  212.                        (ssdel entnn set1)
  213.                        (setq l (- l 1))
  214.                      )
  215.                    )
  216.                    (setq l (1+ l))
  217.                  )
  218.                )
  219.                (progn
  220.                  (setq pppp (list (nth 0 pppp) (nth (* 2 i) entb)))
  221.                  (setq l 0)
  222.                  (while (< l (sslength set1))
  223.                    (setq entnn(ssname set1 l))
  224.                    (setq p1(trans(cdr(assoc 10 (entget entnn))) 0 1 0))
  225.                    (setq p2(trans(cdr(assoc 11 (entget entnn))) 0 1 0))
  226.                    (if (> 0.0000001 (abs (- (angle (nth 1 ptbb) p1) (angle p2 p1))))
  227.                      (progn
  228.                        (ssdel entnn set1)
  229.                        (setq l (- l 1))
  230.                      )
  231.                    )
  232.                    (setq l (1+ l))
  233.                  )
  234.                )
  235.              )
  236.            )
  237.          )
  238.          (setq ptb2 (cons (nth 0 pppp) ptb2))
  239.          (setq ptb2 (cons (nth 1 pppp) ptb2))
  240.        )
  241.      )
  242.      (setq i (1+ i))
  243.    )     
  244.    (setq ptb2(reverse ptb2))
  245. )               

  246. (defun int3(ul / i ii itt ptbb2 tp1 tp2 tp3 tp4 eet1 eet2 )
  247.   (setq i 0)   
  248.   (setq newtb1 (ssadd))
  249.   (setq ptb2 nil)
  250.   (while (< i (sslength ul))
  251.     (setq eet1 (ssname ul i))
  252.     (setq tp1 (trans(cdr (assoc 10(entget eet1))) 0 1 0))
  253.     (setq tp2 (trans(cdr (assoc 11(entget eet1))) 0 1 0))
  254.     (setq ii 0)
  255.     (setq itt nil)
  256.     (setq ptbb2 nil)
  257.     (while (< ii (sslength ul))
  258.       (setq eet2 (ssname ul ii))
  259.       (setq tp3 (trans(cdr (assoc 10(entget eet2))) 0 1 0))
  260.       (setq tp4 (trans(cdr (assoc 11(entget eet2))) 0 1 0))
  261.       (setq itt(inters tp1 tp2 tp3 tp4))  
  262.       (if itt
  263.         (setq ptbb2 (cons itt ptbb2))
  264.       )
  265.       (setq ii (1+ ii))
  266.     )                        
  267.     (if (= 2 (length ptbb2))
  268.       (progn
  269.         (setq ptb2(cons (nth 0 ptbb2) ptb2))
  270.         (setq ptb2(cons (nth 1 ptbb2) ptb2))
  271.         (ssadd eet1 newtb1)
  272.       )
  273.     )
  274.     (setq i (1+ i))           
  275.   )  
  276.   (setq ptb2 (reverse ptb2))   
  277. )  

  278. (defun c:KK( / sp ep set1 entb  tl i ptb1 ptb2 newtb1 newtb2 set
  279.                  stt cx_er cx_oe cx_oc gg ppp1 ppp2  ul)
  280.      (PRINC "\n【#字形线段修剪功能")
  281.    (defun cx_er(msg)
  282.      (if (/= msg "Function cancelled")
  283.        (if (= msg "quit / exit abort")
  284.          (princ)  
  285.          (princ (strcat "\n error :" msg))
  286.        )
  287.        (progn (setvar "osmode" gg) (princ))
  288.      )
  289.      (if cx_oe (setq *error* cx_oe))        
  290.      (setvar "cmdecho" 0)
  291.      (princ)
  292.    )
  293.    (if *error*
  294.      (setq cx_oe *error* *error* cx_er)
  295.      (setq *error* cx_er)
  296.    )
  297.    (setvar "CMDECHO" 0)
  298.    (setq gg (getvar "osmode"))
  299.    (setvar "osmode" 0)
  300.    (setq sp (getpoint "\n-->请指定修剪的第一角点:"))
  301.    (setq ep (getcorner sp "\n-->请指定修剪的对角点:"))
  302.    (setvar "osmode" gg)
  303.    ;(setq ul (ssadd))  
  304.    (setq set1 (ssadd))
  305.    (setq ul (ssget "C" sp ep))   
  306.    (if (not ul)
  307.        (exit)
  308.    )              
  309.    (l_layer)   
  310.    (ver_line)
  311.    ;(setq ul (pplayer ul))
  312.    (setq tl (in_w ul sp ep))         
  313.    (if (/= 0 (sslength tl))
  314.      (progn
  315.        (setq set1(sub_set ul tl))     
  316.        (int2 tl)     
  317.        (int1 tl)   
  318.        (setq i 0)           
  319.        (while (< i (sslength newtb2))
  320.          (ssadd (ssname newtb2 i) newtb1)
  321.          (setq i (1+ i))
  322.        )
  323.        (setq ptb1 (reverse ptb1))
  324.        (setq ptb2 (append ptb1 ptb2))
  325.      )
  326.      (int3 ul)
  327.    )                       
  328.    (if (/= 0 (sslength newtb1))
  329.      (progn
  330.        (setq i 0)
  331.        (while (< i (sslength newtb1))
  332.          (setq stt nil)
  333.          (setq stt(ssadd))
  334.          (ssadd (ssname newtb1 i) stt)
  335.          (setq ppp1 (nth (* 2 i) ptb2))
  336.          (setq ppp2(nth (+ 1 (* 2 i)) ptb2))
  337.          (command "break"stt ppp1 ppp2)
  338.          (setq i (1+ i))
  339.        )
  340.      )
  341.    )
  342.      (PRINC "\n#字形线段修剪完成!")(PRINC))
发表于 2011-12-10 20:24:08 | 显示全部楼层
楼上这个不太好用,仅适用于 双十字交叉的情况, 三岔路口就不行
发表于 2011-12-12 01:56:12 | 显示全部楼层
对好东西总忍不住要模仿。。。。。。


本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-16 06:30 , Processed in 0.176837 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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