明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7010|回复: 25

多段线,圆,弧,直线,曲线相交点打断。大量的话速度比较慢,希望大神优化

[复制链接]
发表于 2016-1-1 19:50:48 | 显示全部楼层 |阅读模式
  1. (defun tt (ss0 ss1 / e1 e2 @pt2 pt1 ptn)
  2.   (vl-load-com)
  3.   (setq ptn '())
  4.   (setq  e1 (vlax-ename->vla-object ss0)
  5.   e2 (vlax-ename->vla-object ss1)
  6.   )
  7.   (setq @pt2 (vlax-invoke e1 'IntersectWith e2 0))
  8.   (repeat (/ (length @pt2) 3)
  9.     (setq pt1 (list (car @pt2) (cadr @pt2) (caddr @pt2)))
  10.     (setq @pt2 (cdddr @pt2))
  11.     (setq ptn (cons pt1 ptn))
  12.   )
  13.   (reverse ptn)
  14. )
  15. (defun enjddd (ent ptlst / e entlst id tement tempt pt l)
  16.   (if (= (cdr (assoc 0 (entget ent))) "CIRCLE")
  17.     (progn
  18.       (setq
  19.   l (+ (angle (cdr (assoc 10 (entget ent))) (car ptlst)) 0.00000001)
  20.       )
  21.       (setq pt (polar (cdr (assoc 10 (entget ent)))
  22.           l
  23.           (cdr (assoc 40 (entget ent)))
  24.          )
  25.       )
  26.       (command "break" ent (car ptlst) pt)
  27.       
  28.       )
  29.    
  30.   )
  31.   

  32.   (setq  entlst (cons ent entlst)
  33.   id     (entlast)
  34.   )
  35.   (while (setq tempt (car ptlst))
  36.     (foreach e entlst
  37.       (command "BREAK" e tempt tempt)
  38.       (if (setq tement (entnext id))
  39.   (setq entlst (cons tement entlst)
  40.         id     tement
  41.   )
  42.       )
  43.     )
  44.     (setq ptlst (cdr ptlst))
  45.   )
  46. )
  47. (defun c:tr (/ ss1 ssn ssm i j k ssc ptlst ptls)
  48.   (vl-load-com)
  49.   (setq  ptlst nil
  50.   ptls  nil
  51.   ol(getvar "osmode")
  52.   
  53.   ss1   (ssget)
  54.   i     -1
  55.   )
  56.   (setvar "osmode" 0)
  57.   (while (setq ssn (ssname ss1 (setq i (1+ i))))
  58.     (setq j 0)
  59.     (setq ptlst nil)
  60.     (repeat (sslength ss1)
  61.       (setq ssm    (ssname ss1 j)
  62.       ptlst (append (tt ssn ssm) ptlst)
  63.       j    (1+ j)
  64.       )
  65.     )
  66.     (setq ptls (cons ptlst ptls))
  67.   )
  68.   (setq ptls (reverse ptls))
  69.   (setq k 0)
  70.   (while (setq ssc (ssname ss1 k))
  71.     (enjddd ssc (nth k ptls))
  72.     (setq k (1+ k))
  73.   )
  74.   (setvar "osmode" 0)
  75. )
发表于 2022-5-5 01:08:38 | 显示全部楼层
本帖最后由 尘缘一生 于 2022-5-5 01:23 编辑

速度问题,就是用的COMMAND 原因,抛弃command 程序会写很长,本坛有部分代码,我整合过,整理下,并没有解决速度问题。
http://bbs.mjtd.com/thread-185383-1-1.html
  1. ;选择集交点断开  modify by 尘缘一生  QQ:15290049

  2. ;;两实体(en1 en2) 为实体名 -------交点------(一级)----------------
  3. ;;k:(0--不延伸,1--延伸基本对象,2--延伸参数传递的对象,3--延伸)
  4. (defun sl-Curveinters (en1 en2 k / pl pts)
  5.   (setq pl (vlax-invoke (vlax-ename->vla-object en1) 'IntersectWith (vlax-ename->vla-object en2) k))  
  6.   (while pl
  7.     (setq pts (append pts (list (list (car pl) (cadr pl) (caddr pl))))
  8.       pl (cdr (cdr (cdr pl)))
  9.     )
  10.   )
  11.   pts
  12. )
  13. ;;实体与其交点打断--------(一级)------------
  14. (defun break_obj (ent brkptlst / brkobjlst en tp maxparam closedobj minparam obj obj2break p1param p2 p2param)
  15.   (setq obj2break ent brkobjlst (list ent) tp (cdr (assoc 0 (entget ent))))
  16.   (foreach brkpt brkptlst
  17.     (if brkobjlst
  18.       (progn
  19.         (if (not (numberp (vl-catch-all-apply 'vlax-curve-getdistatpoint (list obj2break brkpt))))
  20.           (foreach obj brkobjlst
  21.             (if (numberp (vl-catch-all-apply 'vlax-curve-getdistatpoint (list obj brkpt)))
  22.               (setq obj2break obj)
  23.             )
  24.           )
  25.         )
  26.       )
  27.     )
  28.     ;;---------------------------------
  29.     (cond
  30.       ((and (= "SPLINE" tp)
  31.          (vlax-curve-isclosed obj2break))
  32.         (setq p1param (vlax-curve-getparamatpoint obj2break brkpt)
  33.           p2 (vlax-curve-getpointatparam obj2break (+ p1param 0.000001))
  34.         )
  35.         (command "._break" obj2break (trans brkpt 0 1) (trans p2 0 1))
  36.       )
  37.       ((= "CIRCLE" tp)
  38.         (setq p1param (vlax-curve-getparamatpoint obj2break brkpt)
  39.           p2 (vlax-curve-getpointatparam obj2break (+ p1param 0.000001))
  40.         )
  41.         (command "._break" obj2break (trans brkpt 0 1) (trans p2 0 1))
  42.         (setq tp "ARC")
  43.       )
  44.       ((and (= "ELLIPSE" tp) (vlax-curve-isclosed obj2break))
  45.         (setq p1param  (vlax-curve-getparamatpoint obj2break brkpt)
  46.           p2param  (+ p1param 0.000001)
  47.           minparam (min p1param p2param)
  48.           maxparam (max p1param p2param)
  49.           obj (vlax-ename->vla-object obj2break)
  50.         )
  51.         (vlax-put obj 'startparameter maxparam)
  52.         (vlax-put obj 'endparameter (+ minparam 2pi))
  53.       )
  54.       (t   
  55.         (setq closedobj (vlax-curve-isclosed obj2break))
  56.         (command "._break" obj2break (trans brkpt 0 1) (trans brkpt 0 1))
  57.         (if (not closedobj)
  58.           (setq brkobjlst (cons (entlast) brkobjlst))
  59.         )
  60.       )
  61.     )
  62.   )
  63. )
  64. ;;主程序------------------
  65. ;支持 LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
  66. (defun c:tr (/ ss1 ssn ssm i j k ssc ptlst ptls)
  67.   (vl-load-com)
  68.   (prompt "\n 支持 LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE")
  69.   (setq ss1 (ssget '((0 . "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"))))
  70.   (setq ptlst nil ptls nil ol (getvar "osmode") i -1)
  71.   (setvar "osmode" 0)
  72.   (while (setq ssn (ssname ss1 (setq i (1+ i))))
  73.     (setq j 0)
  74.     (setq ptlst nil)
  75.     (repeat (sslength ss1)
  76.       (setq ssm (ssname ss1 j)
  77.         ptlst (append (sl-Curveinters ssn ssm 0) ptlst)
  78.         j (1+ j)
  79.       )
  80.     )
  81.     (setq ptls (cons ptlst ptls))
  82.   )
  83.   (setq ptls (reverse ptls))
  84.   (setq k 0)
  85.   (while (setq ssc (ssname ss1 k))
  86.     (break_obj ssc (nth k ptls))
  87.     (setq k (1+ k))
  88.   )
  89.   (setvar "osmode" 0)
  90. )


回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-30 09:45:10 | 显示全部楼层
尘缘一生 发表于 2022-5-5 01:08
速度问题,就是用的COMMAND 原因,抛弃command 程序会写很长,本坛有部分代码,我整合过,整理下,并没有解 ...

能添加打断后删除吗?

类似下面这样

本帖子中包含更多资源

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

x
发表于 2016-1-12 20:56:18 | 显示全部楼层
厉害!!!!
发表于 2016-2-21 10:19:46 | 显示全部楼层
真是太牛了
发表于 2016-2-24 17:12:33 | 显示全部楼层
高手出手那纯属娱乐。只是热心帮忙
发表于 2016-4-10 23:14:11 | 显示全部楼层
请问出现这个no function definition: XLR_JDLB_SS,该怎么解决
 楼主| 发表于 2016-4-11 23:20:52 | 显示全部楼层
凡海涛在石大 发表于 2016-4-10 23:14
请问出现这个no function definition: XLR_JDLB_SS,该怎么解决

回复错地方了
发表于 2019-12-24 17:09:29 | 显示全部楼层
真是太牛了,高手出手那纯属娱乐。只是热心帮忙
发表于 2020-5-4 21:13:12 | 显示全部楼层
太厉害了    终于找到了      我之前找到的    只能打断直线  现在这个很全面    很好用
 楼主| 发表于 2020-9-20 16:23:52 | 显示全部楼层
小小的人 发表于 2020-5-4 21:13
太厉害了    终于找到了      我之前找到的    只能打断直线  现在这个很全面    很好用

发表于 2020-12-10 13:11:42 | 显示全部楼层
顶起,上班时试一试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 07:21 , Processed in 0.201807 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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