借用三维命令打断相交线(样条线 多段线 直线 圆 椭圆适用)
本帖最后由 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"))) "")
)
(setqun_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))
)
)
原来是羊羊羊大师
感觉您到三维方面很有研究
能不能请您看看
http://bbs.mjtd.com/thread-184565-1-1.html
之前回复的这个
;_栏选起点,切面1第一点pt1
;_栏选终点,切面1第二点pt2
感觉操作不太方便
能不能请您看看,只是选取三维圆管时,就可画出其轴线,或得到轴线上任意两点
谢谢。 试了试,怎么总弹出个对话框,要加载个什么。。。。。 尘缘一生 发表于 2022-4-29 22:49
试了试,怎么总弹出个对话框,要加载个什么。。。。。
请问你用的啥版本的? guosheyang 发表于 2022-4-29 23:43
请问你用的啥版本的?
WIN7 64位CAD2020 调出的是 APPLOAD对话框 尘缘一生 发表于 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: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 ...
在最后的删除部分,我改了下可以了,
先断开自交线,圆弧转多段线后,扩展下,觉得应该很不错,速度可以。等找下判断自交线代码有没有。
;功能:借用三维命令打断相交线(样条线 多段线 直线 圆 椭圆适用)
;参数:ss 需要打断的相交曲线选择集(注意 不能有自相交线)
(defun c:tt ()
(setq ss (ssget '((0 . "LINE,*POLYLINE,ARC,CIRCLE,SPLINE,ELLIPSE"))))
(ygs_brk_int_cur ss)
)
;;-------------------------
(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 "")
(sl:-erase ss)
)
;;ss:实体、选择集或表删除-----(一级)---------
(defun sl:-erase (ss / n)
(cond
((= (type ss) 'ENAME) (entdel ss))
((= (type ss) 'VLA-OBJECT) (vla-erase ss))
((and (= (type ss) 'PICKSET) (> (sslength ss) 0))
(repeat (setq n (sslength ss))
(entdel (ssname ss (setq n (1- n))))
)
)
((= (type ss) 'LIST)
(foreach s1 ss (sl:-erase s1))
)
)
)
;选择集包围盒 -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
在最后的删除部分,我改了下可以了,
先断开自交线,圆弧转多段线后,扩展下,觉得应该很不错,速度可以 ...
嗯 首先要处理掉 自交线 pl线炸开spl 线 自交的也要 先处理 因为是调用 command不同版本 可能有区别 能调的可用就可以了 祝贺! 尘缘一生 发表于 2022-4-30 06:22
在最后的删除部分,我改了下可以了,
先断开自交线,圆弧转多段线后,扩展下,觉得应该很不错,速度可以 ...
圆 圆弧 椭圆椭圆弧 样条线不用转多段线带圆弧的多段线也适用 本帖最后由 尘缘一生 于 2022-4-30 18:05 编辑
guosheyang 发表于 2022-4-30 16:17
圆 圆弧 椭圆椭圆弧 样条线不用转多段线带圆弧的多段线也适用
我试了,自交的样条曲线,还是不行的。
代码没完成,先保留这里备用。判断SPLINE自交没有找到函数,不判断,直接转PLINE为PLIN,代码看太繁杂,还没修改好。;打断相交线----------------
(defun c:tt (/ ss ss1 ss2 nam n i obj tp e_lst temp xk)
(setq e_lst (sysvar '("osmode" "cmdecho" "PELLIPSE" "CLAYER" "peditaccept")) ss1 (ssadd))
(setvar "CMDECHO" 0) (setvar "OSMODE" 0) (setvar "peditaccept" 1)
(setq ss (ssget '((0 . "LINE,*POLYLINE,ARC,CIRCLE,SPLINE,ELLIPSE,REGION"))))
(repeat (setq n (sslength ss))
(setq nam (ssname ss (setq n (1- n))) tp (dxf1 nam 0) obj (en2obj nam))
(cond
((= tp "ARC")
(command "pedit" nam "w" 0 "")
(ssdel nam ss)
(ssadd (entlast) ss1)
)
((= tp "SPLINE")
(command "pedit" nam 10 "w" 0 "")
(ssdel nam ss)
(ssadd (entlast) ss1)
)
((= tp "REGION")
(setq xk (linwind nam))
(reg2pline nam)
(vla-put-ConstantWidth (en2obj (entlast)) xk)
(ssdel nam ss)
(ssadd (entlast) ss1)
)
((or (= tp "POLYLINE")
(and (= tp "LWPOLYLINE" tp) (= (_polyselfintersect-p obj) t)) ;自交
)
(setq xk (linwind nam))
(setq temp (entlast))
(vla-explode obj)
(vla-delete obj)
(setq ss2 (last_ent temp))
(repeat (setq i (sslength ss2))
(vla-put-ConstantWidth (en2obj (ssname ss2 (setq i (1- i)))) xk)
)
(ssdel nam ss)
(setq ss2 (last_ent temp))
)
)
)
(ygs_brk_int_cur (sl:pickset-join (sl:pickset-join ss1 ss1) ss))
(mapcar 'eval e_lst)
)
页:
[1]