明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1507|回复: 9

[函数] 借用三维命令打断相交线(样条线 多段线 直线 圆 椭圆适用)

[复制链接]
发表于 2022-4-28 10:37:19 | 显示全部楼层 |阅读模式
本帖最后由 guosheyang 于 2022-5-4 23:17 编辑

给朋友们分享优化后的交点打断程序,借用三维命令实现,速度也过得去,关键是打断结果准确(与breakall插件比),可以将打断后的结果直接用region命令生成单独的封闭图元(拓扑多边形对应的面域单元);17版CAD中测试通过,建议高版本适用。

;功能:借用三维命令打断相交线(样条线 多段线 直线 圆 椭圆适用)
;参数:ss 需要打断的相交曲线选择集(注意 不能有自相交线)      

;(ygs_brk_int_cur(setq ss(ssget)))
(defun ygs_brk_int_cur(ss / JX PT SJD SZ UN_SURF YSD YXD ZSD ZXD ZXYS)
(setvar 'cmdecho 0)
(setq sz(getvar  'surfacemodelingmode))
(if(= sz 1)
    (command "_.extrude""MO""SU" ss "" 2 """"
            "_.union" (ssget "A" '((0 . "NURBSURFACE"))) "")
    (command "_.extrude""MO""SU" ss "" 2 """"
           "_.union" (ssget "A" '((0 . "EXTRUDEDSURFACE"))) "")
)
(setq  un_surf(entlast)
        zxys(LM:ssboundingbox ss)  
        zxd(list(-(car (car zxys))100)(-(cadr (car zxys))100)0)
        ysd(list(+(car (cadr zxys))100)(+(cadr (cadr zxys))100)0)
        zsd(list(car zxd)(cadr ysd)0)
        yxd(list(car ysd)(cadr zxd)0)
        sjd(list zxd yxd ysd zsd));四角点
(entmakex(append (list '(0 . "LWPOLYLINE")
                          '(100 . "AcDbEntity")
                          '(100 . "AcDbPolyline")
                          '(62 . 0)
                          (cons 90 (length sjd))
                          (cons 70 1)
                   )
                   (mapcar '(lambda (pt) (cons 10 pt)) sjd)
         )
)
(command "_.REGION"
         (setq jx(entlast))
        ""
        "_.intersect"
           (entlast)
           un_surf
        ""
   "_.erase" ss ""
)
  (entdel jx)
  (princ)
)
;选择集包围盒 -Lee Mac
(defun LM:ssboundingbox(sel / idxllp ls1 ls2 obj urp)
    (repeat (setq idx(sslength sel))
        (setq obj (vlax-ename->vla-object(ssname sel(setq idx (1- idx)))))
        (if (and (vlax-method-applicable-p obj 'getboundingbox)
                 (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list obj 'llp 'urp))))
            )
            (setq ls1 (cons (vlax-safearray->list llp) ls1)
                  ls2 (cons (vlax-safearray->list urp) ls2)
            )
        )
    )
    (if (and ls1 ls2)
        (mapcar '(lambda ( a b ) (apply 'mapcar (cons a b))) '(min max) (list ls1 ls2))
    )
)



本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
USER2128 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-4-28 11:32:39 | 显示全部楼层
原来是羊羊羊大师
感觉您到三维方面很有研究
能不能请您看看
http://bbs.mjtd.com/thread-184565-1-1.html
之前回复的这个
;_栏选起点,切面1第一点pt1
;_栏选终点,切面1第二点pt2
感觉操作不太方便
能不能请您看看,只是选取三维圆管时,就可画出其轴线,或得到轴线上任意两点
谢谢。
发表于 2022-4-29 22:49:44 | 显示全部楼层
试了试,怎么总弹出个对话框,要加载个什么。。。。。
 楼主| 发表于 2022-4-29 23:43:01 | 显示全部楼层
尘缘一生 发表于 2022-4-29 22:49
试了试,怎么总弹出个对话框,要加载个什么。。。。。

请问你用的啥版本的?
发表于 2022-4-29 23:46:25 | 显示全部楼层
guosheyang 发表于 2022-4-29 23:43
请问你用的啥版本的?

WIN7 64位  CAD2020 调出的是 APPLOAD对话框
 楼主| 发表于 2022-4-30 00:07:11 | 显示全部楼层
尘缘一生 发表于 2022-4-29 23:46
WIN7 64位  CAD2020 调出的是 APPLOAD对话框

试下这个看看
;(ygs_brk_int_cur(setq ss(ssget)))
(defun ygs_brk_int_cur(ss / PT SJD UN_SURF YSD YXD ZSD ZXD ZXYS)
  (setvar 'cmdecho 0)
  (vl-cmdf "extrude" "MO" "SU" ss "" 2 "" "")
  (vl-cmdf "union" (ssget "A" '((0 . "EXTRUDEDSURFACE"))) "")
  (setq        un_surf(entlast)
        zxys(LM:ssboundingbox ss)  
        zxd(list(-(car (car zxys))100)(-(cadr (car zxys))100)0)
        ysd(list(+(car (cadr zxys))100)(+(cadr (cadr zxys))100)0)
        zsd(list(car zxd)(cadr ysd)0)
        yxd(list(car ysd)(cadr zxd)0)
        sjd(list zxd yxd ysd zsd));四角点
(entmakex(append (list '(0 . "LWPOLYLINE")
                          '(100 . "AcDbEntity")
                          '(100 . "AcDbPolyline")
                          '(62 . 0)
                          (cons 90 (length sjd))
                          (cons 70 1)
                   )
                   (mapcar '(lambda (pt) (cons 10 pt)) sjd)
            )
  )
  (vl-cmdf "region"
           (entlast)
           "" )
  (vl-cmdf"_intersect"
           (entlast)
           un_surf
           "" )
(vl-cmdf "erase" ss ""
  )
)
;选择集包围盒 -Lee Mac
(defun LM:ssboundingbox(sel / idxllp ls1 ls2 obj urp)
    (repeat (setq idx(sslength sel))
        (setq obj (vlax-ename->vla-object(ssname sel(setq idx (1- idx)))))
        (if (and (vlax-method-applicable-p obj 'getboundingbox)
                 (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list obj 'llp 'urp))))
            )
            (setq ls1 (cons (vlax-safearray->list llp) ls1)
                  ls2 (cons (vlax-safearray->list urp) ls2)
            )
        )
    )
    (if (and ls1 ls2)
        (mapcar '(lambda ( a b ) (apply 'mapcar (cons a b))) '(min max) (list ls1 ls2))
    )
)
发表于 2022-4-30 06:22:53 | 显示全部楼层
本帖最后由 尘缘一生 于 2022-4-30 06:25 编辑
guosheyang 发表于 2022-4-30 00:07
试下这个看看
;(ygs_brk_int_cur(setq ss(ssget)))
(defun ygs_brk_int_cur(ss / PT SJD UN_SURF YSD Y ...

在最后的删除部分,我改了下可以了,
先断开自交线,圆弧转多段线后,扩展下,觉得应该很不错,速度可以。等找下判断自交线代码有没有。
  1. ;功能:借用三维命令打断相交线(样条线 多段线 直线 圆 椭圆适用)
  2. ;参数:ss 需要打断的相交曲线选择集(注意 不能有自相交线)      
  3. (defun c:tt ()
  4.   (setq ss (ssget '((0 . "LINE,*POLYLINE,ARC,CIRCLE,SPLINE,ELLIPSE"))))
  5.   (ygs_brk_int_cur ss)
  6. )
  7. ;;-------------------------
  8. (defun ygs_brk_int_cur(ss / PT SJD UN_SURF YSD YXD ZSD ZXD ZXYS)
  9.   (setvar 'cmdecho 0)
  10.   (vl-cmdf "extrude" "MO" "SU" ss "" 2 "" "")
  11.   (vl-cmdf "union" (ssget "A" '((0 . "EXTRUDEDSURFACE"))) "")
  12.   (setq un_surf (entlast)
  13.     zxys(LM:ssboundingbox ss)  
  14.     zxd(list(-(car (car zxys))100)(-(cadr (car zxys))100)0)
  15.     ysd(list(+(car (cadr zxys))100)(+(cadr (cadr zxys))100)0)
  16.     zsd(list(car zxd)(cadr ysd)0)
  17.     yxd(list(car ysd)(cadr zxd)0)
  18.     sjd(list zxd yxd ysd zsd)
  19.   );四角点
  20.   (entmakex
  21.     (append
  22.       (list
  23.         '(0 . "LWPOLYLINE")
  24.         '(100 . "AcDbEntity")
  25.         '(100 . "AcDbPolyline")
  26.         '(62 . 0)
  27.         (cons 90 (length sjd))
  28.         (cons 70 1)
  29.       )
  30.       (mapcar '(lambda (pt) (cons 10 pt)) sjd)
  31.     )
  32.   )
  33.   (vl-cmdf "region" (entlast) "")
  34.   (vl-cmdf "_intersect" (entlast) un_surf "")
  35.   (sl:-erase ss)
  36. )
  37. ;;ss:实体、选择集或表删除-----(一级)---------
  38. (defun sl:-erase (ss / n)
  39.   (cond
  40.     ((= (type ss) 'ENAME) (entdel ss))
  41.     ((= (type ss) 'VLA-OBJECT) (vla-erase ss))
  42.     ((and (= (type ss) 'PICKSET) (> (sslength ss) 0))
  43.       (repeat (setq n (sslength ss))
  44.         (entdel (ssname ss (setq n (1- n))))
  45.       )
  46.     )
  47.     ((= (type ss) 'LIST)
  48.       (foreach s1 ss (sl:-erase s1))
  49.     )
  50.   )
  51. )
  52. ;选择集包围盒 -Lee Mac
  53. (defun LM:ssboundingbox(sel / idxllp ls1 ls2 obj urp)
  54.   (repeat (setq idx(sslength sel))
  55.     (setq obj (vlax-ename->vla-object(ssname sel(setq idx (1- idx)))))
  56.     (if (and (vlax-method-applicable-p obj 'getboundingbox)
  57.           (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list obj 'llp 'urp))))
  58.         )
  59.       (setq ls1 (cons (vlax-safearray->list llp) ls1)
  60.         ls2 (cons (vlax-safearray->list urp) ls2)
  61.       )
  62.     )
  63.   )
  64.   (if (and ls1 ls2)
  65.     (mapcar '(lambda (a b) (apply 'mapcar (cons a b))) '(min max) (list ls1 ls2))
  66.   )
  67. )


 楼主| 发表于 2022-4-30 08:32:24 | 显示全部楼层
尘缘一生 发表于 2022-4-30 06:22
在最后的删除部分,我改了下可以了,
先断开自交线,圆弧转多段线后,扩展下,觉得应该很不错,速度可以 ...

嗯 首先要处理掉 自交线 pl线炸开  spl 线 自交的也要 先处理   因为是调用 command  不同版本 可能有区别 能调的可用  就可以了   祝贺!
 楼主| 发表于 2022-4-30 16:17:27 | 显示全部楼层
尘缘一生 发表于 2022-4-30 06:22
在最后的删除部分,我改了下可以了,
先断开自交线,圆弧转多段线后,扩展下,觉得应该很不错,速度可以 ...

圆 圆弧 椭圆  椭圆弧 样条线  不用转多段线  带圆弧的多段线也适用   
发表于 2022-4-30 18:02:22 | 显示全部楼层
本帖最后由 尘缘一生 于 2022-4-30 18:05 编辑
guosheyang 发表于 2022-4-30 16:17
圆 圆弧 椭圆  椭圆弧 样条线  不用转多段线  带圆弧的多段线也适用

我试了,自交的样条曲线,还是不行的。

代码没完成,先保留这里备用。判断SPLINE自交没有找到函数,不判断,直接转PLINE为PLIN,代码看太繁杂,还没修改好。
  1. ;打断相交线----------------   
  2. (defun c:tt (/ ss ss1 ss2 nam n i obj tp e_lst temp xk)
  3.   (setq e_lst (sysvar '("osmode" "cmdecho" "PELLIPSE" "CLAYER" "peditaccept")) ss1 (ssadd))
  4.   (setvar "CMDECHO" 0) (setvar "OSMODE" 0) (setvar "peditaccept" 1)
  5.   (setq ss (ssget '((0 . "LINE,*POLYLINE,ARC,CIRCLE,SPLINE,ELLIPSE,REGION"))))
  6.   (repeat (setq n (sslength ss))
  7.     (setq nam (ssname ss (setq n (1- n))) tp (dxf1 nam 0) obj (en2obj nam))
  8.     (cond
  9.       ((= tp "ARC")
  10.         (command "pedit" nam "w" 0 "")
  11.         (ssdel nam ss)
  12.         (ssadd (entlast) ss1)
  13.       )
  14.       ((= tp "SPLINE")
  15.         (command "pedit" nam 10 "w" 0 "")
  16.         (ssdel nam ss)
  17.         (ssadd (entlast) ss1)
  18.       )
  19.       ((= tp "REGION")
  20.         (setq xk (linwind nam))
  21.         (reg2pline nam)
  22.         (vla-put-ConstantWidth (en2obj (entlast)) xk)
  23.         (ssdel nam ss)
  24.         (ssadd (entlast) ss1)
  25.       )
  26.       ((or (= tp "POLYLINE")
  27.          (and (= tp "LWPOLYLINE" tp) (= (_polyselfintersect-p obj) t)) ;自交
  28.        )
  29.         (setq xk (linwind nam))
  30.         (setq temp (entlast))
  31.         (vla-explode obj)
  32.         (vla-delete obj)
  33.         (setq ss2 (last_ent temp))
  34.         (repeat (setq i (sslength ss2))
  35.           (vla-put-ConstantWidth (en2obj (ssname ss2 (setq i (1- i)))) xk)
  36.         )
  37.         (ssdel nam ss)
  38.         (setq ss2 (last_ent temp))
  39.       )
  40.     )
  41.   )
  42.   (ygs_brk_int_cur (sl:pickset-join (sl:pickset-join ss1 ss1) ss))
  43.   (mapcar 'eval e_lst)
  44. )

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

本版积分规则

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

GMT+8, 2024-11-14 14:31 , Processed in 0.284818 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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