明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1227|回复: 6

加速>> 批量交点断开!

  [复制链接]
发表于 2024-1-22 22:22:01 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2024-1-23 12:33 编辑

批量交点断开,需要加速的,然而这个缺不好加速理想化,目前三领也没有做到全部抛弃BREAK方式。
从前发过几次改写的,应该说,一次次都有提高。

关于这个问题,代码方面也各不相同,怎么合理的规划是个大事,什么样的实体,采取怎么集成处理
三领在使用过程中,也一直在构思优化,下面贴上三领使用的源码,期待更好的优化下去。
  1. ;;交点断开程序----【开始】-----
  2. ;三领设计 V3.0 Modify by 尘缘一声  QQ:15290049
  3. (defun c:sl-break (/ e_lst ss)
  4.   (_undo1)
  5.   (setq e_lst (sysvar '("OSMODE" "CMDECHO" "ORTHOMODE" "DRAWORDERCTL")))
  6.   (setvar "CMDECHO" 0)
  7.   (setvar "OSMODE" 0) ;;捕捉关闭
  8.   (setvar "ORTHOMODE" 0) ;;正交关闭
  9.   (setvar "DRAWORDERCTL" 0)
  10.   (prompt
  11.     (slmsg
  12.       "\n 支持 LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE!"
  13.       "\n や LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE!"
  14.       "\n Support LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE!"
  15.     )
  16.   )
  17.   (prompt
  18.     (slmsg
  19.       "\n 选择交点断开的实体,ENTER 键继续-->:"
  20.       "\n 匡拒ユ翴耞秨龟砰ENTER 龄膥尿-->:"
  21.       "\n Select the entity whose intersection is broken, and press ENTER to continue-->:"
  22.     )
  23.   )
  24.   (if (setq ss (sstoslss (ssget '((0 . "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"))))) ;sstoslss 选择集整理函数,
  25.     (sl_break_with ss t)
  26.   )
  27.   (mapcar 'eval e_lst)
  28.   (_undo2)
  29.   (princ)
  30. )
  31. ;;实体与其交点处断开----(一级)------
  32. ;;nam 实体名 lis 实体上断开点集表(已包含必要的端点)
  33. (defun ssbrkpoint (nam lis / ent lis1 tp namcen objaxis objratio w ly cl lt p0 p1 p2 enlst)
  34.   (setq tp (dxf1 nam 0))
  35.   (cond
  36.     ((member tp '("LWPOLYLINE" "POLYLINE")) ;整合决定此时已是:共线的
  37.       (setq w (linwind nam) ly (dxf1 nam 8) cl (sl-getcolor nam) lt (sl-linetype nam))
  38.       (if (> w 0.0)
  39.         (while (> (length lis) 1)
  40.           (slch:lwpolyline (list (car lis) (cadr lis)) nil w ly cl nil)
  41.           (vla-put-linetype (en2obj (entlast)) lt)
  42.           (setq lis (cdr lis))
  43.         )
  44.         (while (> (length lis) 1)
  45.           (slch:line (car lis) (cadr lis) ly cl nil)
  46.           (vla-put-linetype (en2obj (entlast)) lt)
  47.           (setq lis (cdr lis))
  48.         )
  49.       )
  50.       (entdel nam)
  51.     )
  52.     ((member tp '("LINE" "ARC"))
  53.       (setq
  54.         lis1 lis
  55.         ent (entget nam)
  56.         ent (vl-remove (assoc -1 ent) ent) ;去除图元名
  57.         ent (vl-remove (assoc 330 ent) ent) ;去除id
  58.         ent (vl-remove (assoc 5 ent) ent) ;去除句柄
  59.       )
  60.       (cond
  61.         ((= tp "LINE")
  62.           (while (> (length lis) 1)
  63.             (setq ent (subst (cons 10 (car lis)) (assoc 10 ent) ent))
  64.             (setq ent (subst (cons 11 (cadr lis)) (assoc 11 ent) ent))
  65.             (entmake ent)
  66.             (setq lis (cdr lis))
  67.           )
  68.         )
  69.         ((= tp "ARC")
  70.           (setq namcen (dxf1 ent 10))
  71.           (while (> (length lis) 1)
  72.             (setq ent (subst (cons 50 (angle namcen (cadr lis))) (assoc 50 ent) ent))
  73.             (setq ent (subst (cons 51 (angle namcen (car lis))) (assoc 51 ent) ent))
  74.             (entmake ent)
  75.             (setq lis (cdr lis))
  76.           )
  77.         )
  78.       )
  79.       (if (> (length lis1) 1) (entdel nam))
  80.     )
  81.     (t
  82.       ;;去除端点(此步重要)
  83.       (setq p1 (vlax-curve-getstartpoint nam) p2 (vlax-curve-getendpoint nam))
  84.       (if (equal (car lis) p1 1e-9)
  85.         (setq lis (cdr lis))
  86.       )
  87.       (if (equal (last lis) p2 1e-9)
  88.         (setq lis (reverse (cdr (reverse lis))))
  89.       )
  90.       ;;以上去除端点
  91.       (vl-catch-all-apply 'sl_break_obj (list nam lis))
  92.     )
  93.   )
  94.   (princ)
  95. )
  96. ;;求交点集函数-------------
  97. ;;参数 el (obj1 obj2 obj3)
  98. ;;返回 ((obj1 pt1 pt2...交点n) (obj2 pt1 pt2...交点n)....) ;包含实体端点
  99. (defun ssinter (el / el1 obj1 obj2 ipts pts list1 outlst i j)
  100.   (setq outlst (mapcar 'list el) i -1)
  101.   (while el
  102.     (setq obj1 (car el)
  103.       list1 (nth (setq i (1+ i)) outlst) ;obj1已有的交点列表
  104.       el (cdr el)
  105.       el1 el
  106.       j i
  107.     )
  108.     (while el1
  109.       (setq obj2 (car el1) el1 (cdr el1) j (1+ j))
  110.       (if (and
  111.             (setq ipts (vla-intersectwith obj1 obj2 0))
  112.             (setq ipts (vlax-variant-value ipts))
  113.             (> (vlax-safearray-get-u-bound ipts 1) 0)
  114.           )
  115.         (progn
  116.           (setq ipts (vlax-safearray->list ipts) pts '())  ;obj1,obj2交点临时列表变量
  117.           (while (> (length ipts) 0)
  118.             (setq pts (cons (list (car ipts) (cadr ipts) (caddr ipts)) pts) ipts (cdddr ipts))
  119.           )
  120.           (setq list1 (append list1 pts)) ;存obj1交点表,循环结束后再更新
  121.           (setq outlst (subst (append (nth j outlst) pts) (nth j outlst) outlst));;obj2的交点列表立即更新
  122.         )
  123.       )
  124.     )
  125.     (if (and (cdr list1) (not (vlax-curve-isClosed obj1)))
  126.       (setq list1 (append list1 (list (vlax-curve-getEndPoint obj1)) (list (vlax-curve-getStartPoint obj1))));;当obj1存在交点,且非封闭曲线,添加两端点
  127.     )
  128.     (setq outlst (subst list1 (nth i outlst) outlst));更新obj1交点列表
  129.   )
  130.   outlst
  131. )
  132. ;;点集排序及删除重复点函数---(一级)----
  133. ;;参数 ((obj1 pt1 pt2...交点n) (obj2 pt1 pt2...交点n)....)
  134. ;;返回 ((nam1 pt1 pt2...) (nam2 pt1 pt2...)....)
  135. (defun InterSort (el / obj1 pts plst outlst item)
  136.   (foreach item el
  137.     (setq obj1 (car item) pts (cdr item))
  138.     (if pts
  139.       (progn
  140.         (setq pts (vl-sort pts (function (lambda (p1 p2) (< (vlax-curve-getParamAtPoint obj1 p1) (vlax-curve-getParamAtPoint obj1 p2))))));;交点排序,列表为逆序
  141.         (setq plst (reverse (gps->lst-delsame pts)))
  142.         (if (vlax-curve-isClosed obj1) ;;闭合曲线需再添加首个交点以使新实体完全封闭
  143.           (setq plst (cons (last plst) plst))
  144.         )
  145.         (setq plst (cons (obj2en obj1) plst)
  146.           outlst (cons plst outlst)
  147.         )
  148.       )
  149.     )
  150.   )
  151.   outlst
  152. )
  153. ;;实体与其交点处断开--------(一级)------
  154. ;;nam 实体名  ptlst 实体上交点表(并未包含端点)
  155. (defun sl_break_obj (nam ptlst / enlst p0 p1 p2 tp maxparam minparam obj)
  156.   (setq tp (dxf1 nam 0) enlst (list nam))
  157.   (if (= tp "CIRCLE")
  158.     (progn
  159.       (arccirtopl nam) ;转为2点多段线圆
  160.       (setq nam (entlast))
  161.     )
  162.   )
  163.   (foreach p0 ptlst
  164.     (if enlst
  165.       (if (not (numberp (vl-catch-all-apply 'vlax-curve-getdistatpoint (list nam p0))))
  166.         (foreach obj enlst
  167.           (if (numberp (vl-catch-all-apply 'vlax-curve-getdistatpoint (list obj p0)))
  168.             (setq nam obj)
  169.           )
  170.         )
  171.       )
  172.     )
  173.     (cond
  174.       ((and (= tp "SPLINE") (vlax-curve-isclosed nam))
  175.         (setq
  176.           p1 (vlax-curve-getparamatpoint nam p0)
  177.           p2 (vlax-curve-getpointatparam nam (+ p1 0.000001))
  178.         )
  179.         (command "._break" nam "_non" (trans p0 0 1) "_non" (trans p2 0 1))
  180.       )
  181.       ((and (= tp "ELLIPSE") (vlax-curve-isclosed nam))
  182.         (setq
  183.           p1 (vlax-curve-getparamatpoint nam p0)
  184.           p2 (+ p1 0.000001)
  185.           minparam (min p1 p2)
  186.           maxparam (max p1 p2)
  187.           obj (en2obj nam)
  188.         )
  189.         (vlax-put obj 'startparameter maxparam)
  190.         (vlax-put obj 'endparameter (+ minparam 2pi))
  191.       )
  192.       (t
  193.         (command "._break" nam "_non" (trans p0 0 1) "_non" (trans p0 0 1))
  194.         (if (not (vlax-curve-isclosed nam))
  195.           (setq enlst (cons (entlast) enlst))
  196.         )
  197.       )
  198.     )
  199.   )
  200. )
  201. ;;选择集交点断开-------(一级)-------
  202. ;;支持line arc circle ellipse spline polyline lwpolyline
  203. ;self t 自交断  nil 自交不断
  204. (defun sl_break_with (ss self / ss1 ss2 nam e lis n tp)
  205.   (setq ss1 (ssadd) ss2 (ssadd))
  206.   (repeat (setq n (sslength ss))
  207.     (setq nam (ssname ss (setq n (1- n))) tp (dxf1 nam 0))
  208.     (cond
  209.       ((= tp "CIRCLE") ;转为2段多段线处理
  210.         (arccirtopl nam)
  211.         (ssadd (entlast) ss1)
  212.       )
  213.       ((or
  214.          (member tp '("LINE" "ARC"))
  215.          (= (sl:pts-onLine (getpt (ssadd nam))) t)
  216.        )
  217.         (ssadd nam ss2)
  218.       )
  219.       (t
  220.         (ssadd nam ss1)
  221.       )
  222.     )
  223.   )
  224.   (if (> (sslength ss2) 0)
  225.     (progn
  226.       (setq e (entlast))
  227.       (mapcar '(lambda (x) (ssbrkpoint (car x) (cdr x))) (InterSort (ssinter (ssget->vla-list ss2))))
  228.       (setq ss2 (last_ent e))
  229.     )
  230.   )
  231.   (if (> (sslength ss1) 0)
  232.     (if (> (sslength ss2) 0)
  233.       (progn
  234.         (setq ss1 (sl:pickset-join ss1 ss2))
  235.         (break_with_include_pl_sl ss1 ss1 self)
  236.       )
  237.       (break_with_include_pl_sl ss1 ss1 self)
  238.     )
  239.   )
  240. )
  241. ;;对象是否在锁定层上-----(一级)-----
  242. (defun onlockedlayer (nam / entlst)
  243.   (setq entlst (tblsearch "LAYER" (dxf1 nam 8)))
  244.   (= 4 (logand 4 (dxf1 entlst 70)))
  245. )
  246. ;;坐标表--->三维点表------(一级)---
  247. (defun list->3pair (old / new)
  248.   (while (setq new (cons (list (car old) (cadr old) (caddr old)) new) old (cdddr old)))
  249.   (reverse new)
  250. )
  251. ;;选择集交点断开-------(一级)-------
  252. ;self t 自交断  nil 自交不断
  253. (defun break_with_include_pl_sl (ss2brk ss2brkwith self / intpts lst masterlist obj intobj obj2brk)
  254.   (foreach obj (ssget->vla-list ss2brk)
  255.     (if (not (onlockedlayer (obj2en obj)))
  256.       (progn
  257.         (setq lst nil)
  258.         (foreach intobj (ssget->vla-list ss2brkwith)
  259.           (if (and (or self (not (equal obj intobj))) (setq intpts (get_interpts obj intobj 0)))
  260.             (setq lst (append (list->3pair intpts) lst))
  261.           )
  262.         )
  263.         (if lst (setq masterlist (cons (cons (obj2en obj) lst) masterlist)))
  264.       )
  265.     )
  266.   )
  267.   (if masterlist
  268.     (foreach obj2brk masterlist
  269.       (vl-catch-all-apply 'sl_break_obj (list (car obj2brk) (cdr obj2brk)))
  270.     )
  271.   )
  272. )
  273. ;;交点断开程序【结束】-------



本帖子中包含更多资源

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

x
 楼主| 发表于 2024-1-23 03:33:53 | 显示全部楼层
本帖最后由 尘缘一生 于 2024-1-23 04:08 编辑

再次改写压缩,

  1. ;;交点断开程序----【开始】-----
  2. ;三领设计 V3.0 Modify by 尘缘一声  QQ:15290049
  3. (defun c:sl-break (/ e_lst ss)
  4.   (_undo1)
  5.   (setq e_lst (sysvar '("OSMODE" "CMDECHO" "ORTHOMODE" "DRAWORDERCTL")))
  6.   (setvar "CMDECHO" 0)
  7.   (setvar "OSMODE" 0) ;;捕捉关闭
  8.   (setvar "ORTHOMODE" 0) ;;正交关闭
  9.   (setvar "DRAWORDERCTL" 0)
  10.   (prompt
  11.     (slmsg
  12.       "\n 支持 LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE!"
  13.       "\n や LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE!"
  14.       "\n Support LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE!"
  15.     )
  16.   )
  17.   (prompt
  18.     (slmsg
  19.       "\n 选择交点断开的实体,ENTER 键继续-->:"
  20.       "\n 匡拒ユ翴耞秨龟砰ENTER 龄膥尿-->:"
  21.       "\n Select the entity whose intersection is broken, and press ENTER to continue-->:"
  22.     )
  23.   )
  24.   (if (setq ss (ssget '((0 . "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"))))
  25.     (sl_break_with ss t)
  26.   )
  27.   (mapcar 'eval e_lst)
  28.   (_undo2)
  29.   (princ)
  30. )
  31. ;;实体与其交点处断开----(一级)------
  32. ;;nam 实体名 lis 实体上断开点集表(已包含必要的端点)
  33. (defun ssbrkpoint (nam lis / ent lis1 tp namcen objaxis objratio w ly cl lt p0 p1 p2 enlst)
  34.   (setq tp (dxf1 nam 0))
  35.   (if (= tp "CIRCLE") ;转为2段多段线处理
  36.     (progn (arccirtopl nam) (setq nam (entlast)))
  37.   )
  38.   (cond
  39.     ((and (member tp '("LWPOLYLINE" "POLYLINE")) (= (sl:pts-onLine lis) t) (= (checkarc nam) nil)) ;共线、不带圆弧的
  40.       (setq w (linwind nam) ly (dxf1 nam 8) cl (sl-getcolor nam) lt (sl-linetype nam))
  41.       (if (> w 0.0)
  42.         (while (> (length lis) 1)
  43.           (slch:lwpolyline (list (car lis) (cadr lis)) nil w ly cl nil)
  44.           (vla-put-linetype (en2obj (entlast)) lt)
  45.           (setq lis (cdr lis))
  46.           )
  47.         (while (> (length lis) 1)
  48.           (slch:line (car lis) (cadr lis) ly cl nil)
  49.           (vla-put-linetype (en2obj (entlast)) lt)
  50.           (setq lis (cdr lis))
  51.           )
  52.         )
  53.       (entdel nam)
  54.     )
  55.     ((member tp '("LINE" "ARC")) ;(member tp '("LINE" "ARC" "CIRCLE"))
  56.       (setq
  57.         lis1 lis
  58.         ent (entget nam)
  59.         ent (vl-remove (assoc -1 ent) ent) ;去除图元名
  60.         ent (vl-remove (assoc 330 ent) ent) ;去除id
  61.         ent (vl-remove (assoc 5 ent) ent) ;去除句柄
  62.         )
  63.       (cond
  64.         ((= tp "LINE")
  65.           (while (> (length lis) 1)
  66.             (setq ent (subst (cons 10 (car lis)) (assoc 10 ent) ent))
  67.             (setq ent (subst (cons 11 (cadr lis)) (assoc 11 ent) ent))
  68.             (entmake ent)
  69.             (setq lis (cdr lis))
  70.             )
  71.           )
  72.         ;((= tp "CIRCLE")
  73.         ;  (setq objcen (dxf1 ent 10))
  74.         ;  (setq ent (subst (cons 0 "ARC") (assoc 0 ent) ent))
  75.         ;  (setq ent (append ent (list (cons 100 "AcDbArc") (cons 50 0.0) (cons 51 0.0))))
  76.         ;  (while (> (length lis) 1)
  77.         ;    (setq ent (subst (cons 50 (angle objcen (cadr lis))) (assoc 50 ent) ent))
  78.         ;    (setq ent (subst (cons 51 (angle objcen (car lis))) (assoc 51 ent) ent))
  79.         ;    (entmake ent)
  80.         ;    (setq lis (cdr lis))
  81.         ;  )
  82.         ;)
  83.         ((= tp "ARC")
  84.           (setq namcen (dxf1 ent 10))
  85.           (while (> (length lis) 1)
  86.             (setq ent (subst (cons 50 (angle namcen (cadr lis))) (assoc 50 ent) ent))
  87.             (setq ent (subst (cons 51 (angle namcen (car lis))) (assoc 51 ent) ent))
  88.             (entmake ent)
  89.             (setq lis (cdr lis))
  90.             )
  91.           )
  92.         )
  93.       (if (> (length lis1) 1) (entdel nam))
  94.     )
  95.     (t
  96.       (setq p1 (vlax-curve-getstartpoint nam) p2 (vlax-curve-getendpoint nam))
  97.       (setq lis (remove_ite_list lis p1));;去除端点
  98.       (setq lis (remove_ite_list lis p2))
  99.       (vl-catch-all-apply 'sl_break_obj (list nam lis))
  100.     )
  101.   )
  102.   (princ)
  103. )
  104. ;;求交点集函数-------------
  105. ;;参数 el (obj1 obj2 obj3)
  106. ;;返回 ((obj1 pt1 pt2...交点n) (obj2 pt1 pt2...交点n)....) ;包含实体端点
  107. (defun ssinter (el / el1 obj1 obj2 ipts pts list1 outlst i j)
  108.   (setq outlst (mapcar 'list el) i -1)
  109.   (while el
  110.     (setq obj1 (car el)
  111.       list1 (nth (setq i (1+ i)) outlst) ;obj1已有的交点列表
  112.       el (cdr el)
  113.       el1 el
  114.       j i
  115.     )
  116.     (while el1
  117.       (setq obj2 (car el1) el1 (cdr el1) j (1+ j))
  118.       (if (and
  119.             (setq ipts (vla-intersectwith obj1 obj2 0))
  120.             (setq ipts (vlax-variant-value ipts))
  121.             (> (vlax-safearray-get-u-bound ipts 1) 0)
  122.             )
  123.         (progn
  124.           (setq ipts (vlax-safearray->list ipts) pts '())  ;obj1,obj2交点临时列表变量
  125.           (while (> (length ipts) 0)
  126.             (setq pts (cons (list (car ipts) (cadr ipts) (caddr ipts)) pts) ipts (cdddr ipts))
  127.             )
  128.           (setq list1 (append list1 pts)) ;存obj1交点表,循环结束后再更新
  129.           (setq outlst (subst (append (nth j outlst) pts) (nth j outlst) outlst));;obj2的交点列表立即更新
  130.           )
  131.         )
  132.     )
  133.     (if (and (cdr list1) (not (vlax-curve-isClosed obj1)))
  134.       (setq list1 (append list1 (list (vlax-curve-getEndPoint obj1)) (list (vlax-curve-getStartPoint obj1))));;当obj1存在交点,且非封闭曲线,添加两端点
  135.     )
  136.     (setq outlst (subst list1 (nth i outlst) outlst));更新obj1交点列表
  137.   )
  138.   outlst
  139. )
  140. ;;点集排序及删除重复点函数---(一级)----
  141. ;;参数 ((obj1 pt1 pt2...交点n) (obj2 pt1 pt2...交点n)....)
  142. ;;返回 ((nam1 pt1 pt2...) (nam2 pt1 pt2...)....)
  143. (defun InterSort (el / obj1 pts plst outlst item)
  144.   (foreach item el
  145.     (setq obj1 (car item) pts (cdr item))
  146.     (if pts
  147.       (progn
  148.         (setq pts (vl-sort pts (function (lambda (p1 p2) (< (vlax-curve-getParamAtPoint obj1 p1) (vlax-curve-getParamAtPoint obj1 p2))))));;交点排序,列表为逆序
  149.         (setq plst (reverse (gps->lst-delsame pts)))
  150.         (if (vlax-curve-isClosed obj1) ;;闭合曲线需再添加首个交点以使新实体完全封闭
  151.           (setq plst (cons (last plst) plst))
  152.           )
  153.         (setq plst (cons (obj2en obj1) plst)
  154.           outlst (cons plst outlst)
  155.           )
  156.         )
  157.     )
  158.   )
  159.   outlst
  160. )
  161. ;;实体与其交点处断开--------(一级)------
  162. ;;nam 实体名  ptlst 实体上交点表(并未包含端点)
  163. (defun sl_break_obj (nam ptlst / enlst p0 p1 p2 tp maxparam minparam obj closif)
  164.   (setq tp (dxf1 nam 0) enlst (list nam))
  165.   (foreach p0 ptlst
  166.     (if enlst
  167.       (if (not (numberp (vl-catch-all-apply 'vlax-curve-getdistatpoint (list nam p0))))
  168.         (foreach obj enlst
  169.           (if (numberp (vl-catch-all-apply 'vlax-curve-getdistatpoint (list obj p0)))
  170.             (setq nam obj)
  171.             )
  172.           )
  173.         )
  174.     )
  175.     (setq closif (vlax-curve-isclosed nam))
  176.     (cond
  177.       ((and (member tp '("SPLINE" "CIRCLE")) closif)
  178.         (setq
  179.           p1 (vlax-curve-getparamatpoint nam p0)
  180.           p2 (vlax-curve-getpointatparam nam (+ p1 0.000001))
  181.           )
  182.         (command "._break" nam "_non" (trans p0 0 1) "_non" (trans p2 0 1))
  183.         (if (= tp "CIRCLE") (setq tp "ARC"))
  184.         )
  185.       ((and (= tp "ELLIPSE") closif)
  186.         (setq
  187.           p1 (vlax-curve-getparamatpoint nam p0)
  188.           p2 (+ p1 0.000001)
  189.           minparam (min p1 p2)
  190.           maxparam (max p1 p2)
  191.           obj (en2obj nam)
  192.           )
  193.         (vlax-put obj 'startparameter maxparam)
  194.         (vlax-put obj 'endparameter (+ minparam 2pi))
  195.         )
  196.       (t
  197.         (command "._break" nam "_non" (trans p0 0 1) "_non" (trans p0 0 1))
  198.         (if (not closif)
  199.           (setq enlst (cons (entlast) enlst))
  200.           )
  201.         )
  202.     )
  203.   )
  204. )
  205. ;;对象是否在锁定层上-----(一级)-----
  206. (defun onlockedlayer (nam / entlst)
  207.   (setq entlst (tblsearch "LAYER" (dxf1 nam 8)))
  208.   (= 4 (logand 4 (dxf1 entlst 70)))
  209. )
  210. ;;选择集交点断开-------(一级)-------
  211. ;;支持line arc circle ellipse spline polyline lwpolyline
  212. ;self t 自交断  nil 自交不断
  213. (defun sl_break_with (ss self / obj lis lis1)
  214.   (setq lis (ssget->vla-list ss))
  215.   (if self
  216.     (foreach obj lis
  217.       (if (not (onlockedlayer (obj2en obj)))
  218.         (setq lis (cons obj lis))
  219.         )
  220.     )
  221.   )
  222.   (mapcar '(lambda (x) (vl-catch-all-apply 'ssbrkpoint (list (car x) (cdr x)))) (InterSort (ssinter lis)))
  223. )
  224. ;;交点断开程序【结束】-------


回复 支持 1 反对 0

使用道具 举报

发表于 2024-1-23 15:59:33 | 显示全部楼层
看着不错,支持一下,虽然有自定义函数:
(progn (arccirtopl nam) (setq nam (entlast)))
  )
  (cond
    ((and (member tp '("LWPOLYLINE" "POLYLINE")) (= (sl:pts-onLine lis) t) (= (checkarc nam) nil)) ;共线、不带圆弧的
      (setq w (linwind nam) ly (dxf1 nam 8) cl (sl-getcolor nam) lt (sl-linetype nam))
 楼主| 发表于 2024-1-24 00:21:47 | 显示全部楼层
bai2000 发表于 2024-1-23 15:59
看着不错,支持一下,虽然有自定义函数:
(progn (arccirtopl nam) (setq nam (entlast)))
  )

还在修改,思考加速的深挖一下,目前,想合并两部分交点问题,还没有做到。
发表于 2024-1-24 11:56:26 | 显示全部楼层
看着不错,支持一下。。
发表于 2024-2-13 19:39:10 | 显示全部楼层
批量交点断开,期待更新
发表于 2024-2-20 11:43:41 | 显示全部楼层
这个国外很多大神写过,leemac 和 cab 的最出名
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 05:45 , Processed in 0.203425 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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