明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: start4444

[源码] 批量倒角-可调圆角半径【多对多】-批量倒圆角/斜角合并版-(多段线/直线 )【 多对一】

    [复制链接]
 楼主| 发表于 2021-1-26 10:51:38 | 显示全部楼层
edsion24 发表于 2021-1-26 08:59
命令: tt5
框选起点[线选(F)]:
终点:; 错误: 参数类型错误: lselsetp nil

两组线倒角
发表于 2021-1-26 12:41:23 | 显示全部楼层
start4444 发表于 2021-1-26 10:50
后续炸散就行了吧

炸散后就想成了line线,再重新加宽,又多了很多步了额,能给个选项断开,多段线宽度不变吗
发表于 2021-1-26 12:58:25 | 显示全部楼层
多段线批量倒角如何实现?
 楼主| 发表于 2021-1-26 13:49:40 | 显示全部楼层
mahuan1279 发表于 2021-1-26 12:58
多段线批量倒角如何实现?

这个是两组线两两倒角,如果是单根多段线倒圆角直接命令 ”FILLET“ “p”
 楼主| 发表于 2021-1-26 13:50:36 | 显示全部楼层
magicheno 发表于 2021-1-26 12:41
炸散后就想成了line线,再重新加宽,又多了很多步了额,能给个选项断开,多段线宽度不变吗

意思是两根多段线宽度不一样,想延伸到倒角那个交点?
发表于 2021-1-26 14:20:32 | 显示全部楼层
本帖最后由 magicheno 于 2021-1-26 14:37 编辑

不是呢,多段线的宽度保持不变,转折处的是分开的,比如下图的附件呢,论坛里的图片发不上来,有点表达不清楚哈

 楼主| 发表于 2021-1-26 17:16:49 | 显示全部楼层
本帖最后由 start4444 于 2021-1-26 17:21 编辑
magicheno 发表于 2021-1-26 14:20
不是呢,多段线的宽度保持不变,转折处的是分开的,比如下图的附件呢,论坛里的图片发不上来,有点表达不清 ...

加入断开选项:

(defun c:tt5 (/ entname1 entname2 fi1 fi2 i key key2 loop lst1 lst2 p1 p1a p2 p3 p4 pa1 pa2 pb1 pb2 ptx ptx1 ptx2 r ss1 ss2);;批量倒角-多段线有效
        (vl-load-com)
        (setvar "cmdecho" 0)
        (command "undo" "be")
        (initget "F")
        (setq p1 (getpoint"\n框选起点[线选(F)]:"))
        (if (= p1 "F") (setq p3 (getpoint"\n线选起点1:") p1 (getpoint p3 "\n线选终点1:") p1a (getpoint"\n线选起点2:") p4 (getpoint p1a "\n线选终点2:") ss1 (ssget "f" (list p1 p3) '((0 . "*line"))) ss2 (ssget "f" (list p4 p1a) '((0 . "*line"))) key2 1)
                (setq p2 (getcorner p1"\n终点:") p3 (list (car p1) (cadr p2)) p4 (list (car p2) (cadr p1)) ss1 (ssget "f" (list p1 p3) '((0 . "*line"))) ss2 (ssget "f" (list p1 p4) '((0 . "*line"))) key2 2)
        );if
        (setq loop T r 0)
        (while loop
                (command "undo" "m")
                (setq i 0)
                (repeat (sslength ss1)
                        (setq entname1 (ssname ss1 i) entname2 (ssname ss2 i))
                        (setq ptx1 (cadar (cdddr (car (ssnamex ss1 i)))))
                        (setq ptx2 (cadar (cdddr (car (ssnamex ss2 i)))))
                        (if (and (equal (cdr (assoc 0 (entget entname1))) "LWPOLYLINE") (equal (cdr (assoc 0 (entget entname2))) "LWPOLYLINE"))
                                (setq fi1 ptx1 fi2 ptx2)
                          (setq fi1 (list entname1 ptx1) fi2 (list entname2 ptx2))
                        );if
                        (command "FILLET" "r" r)
                        (command "FILLET" "non"  fi1 "non"  fi2)
                        (setq i (1+ i))
                );re
                (setq key (getstring "\n[加大半径(A)/减小半径(S)/断开(K)/退出(空格)]:"))
                (cond ((= key "a") (setq r (+ r 100)) (command "undo" "b"))
                        ((= key "s") (setq r (- r 100)) (if (< r 0) (progn (setq r 0) (alert "半径已经为0!"))) (command "undo" "b"))
                        ((= key "k") (if (= key2 1) (setq ss1 (ssget "f" (list p1 p3) '((0 . "LWPOLYLINE"))) ss2 (ssget "f" (list p4 p1a) '((0 . "LWPOLYLINE")))) (setq ss1 (ssget "f" (list p1 p3) '((0 . "LWPOLYLINE"))) ss2 (ssget "f" (list p1 p4) '((0 . "LWPOLYLINE")))))                          
                                (if ss1
                                        (progn
                                                (setq i 0)
                                                (repeat (sslength ss1)
                                                        (setq entname1 (ssname ss1 i) entname2 (ssname ss2 i))
                                                        (setq ptx1 (cadar (cdddr (car (ssnamex ss1 i)))) lst1 (HH:pickSegEndPt entname1 ptx1) pa1 (car lst1) pb1 (cadr lst1))
                                                        (setq ptx2 (cadar (cdddr (car (ssnamex ss2 i)))) lst2 (HH:pickSegEndPt entname2 ptx2) pa2 (car lst2) pb2 (cadr lst2))
                                                        (setq ptx (inters pa1 pb1 pa2 pb2 nil))
                                                        (if (= r 0) (command "BREAK" entname1 "non" ptx "non" ptx)
                                                                (command "BREAK" entname1 "non" (vlax-curve-getclosestpointto entname1 (trans ptx 1 0)) "non" (vlax-curve-getclosestpointto entname1 (trans ptx 1 0)))
                                                        );if
                                                        (setq i (1+ i))
                                                );re
                                        );pr
                                );if
                                (setq loop nil)
                        )
                        (t (setq loop nil))
                );cond
        );while
        (command "undo" "e")
        (setvar "cmdecho" 1)
        (princ)
)
;;[功能] 多段线所点击子段的两端点列表By 自贡黄明儒
;;示例(HH:pickSegEndPt (car(setq en(entsel))) (cadr en))
(defun HH:pickSegEndPt (obj p / pp n)
  (setq        pp (vlax-curve-getclosestpointto obj (trans p 1 0))
                n  (fix (vlax-curve-getparamatpoint obj pp))
  )
  (list        (vlax-curve-getPointAtParam obj n)
                (vlax-curve-getPointAtParam obj (1+ n))
  )
)

评分

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

查看全部评分

回复 支持 3 反对 0

使用道具 举报

发表于 2021-1-26 17:25:34 | 显示全部楼层
start4444 发表于 2021-1-26 17:16
加入断开选项:

(defun c:tt5 (/ entname1 entname2 fi1 fi2 i key key2 loop lst1 lst2 p1 p1a p2 p3 ...

好用大侠牛逼了
发表于 2021-1-26 18:29:47 | 显示全部楼层
本帖最后由 magicheno 于 2021-1-26 20:46 编辑

大侠如果想把这个多段线功能打断的单独列出来要怎么操作呢,我乱整了下好像不大行,还有就是如果我想直接空格就断开而不是输入K断开,该怎么调呢
(defun c:tt6 ( entname1 entname2 fi1 fi2 i key key2 loop lst1 lst2 p1 p1a p2 p3 p4 pa1 pa2 pb1 pb2 ptx ptx1 ptx2 r ss1 ss2)
(vl-load-com)

(setq ss1 (ssget "f" (list p1 p3) '((0 . "LWPOLYLINE"))) ss2 (ssget "f" (list p4 p1a) '((0 . "LWPOLYLINE")))) (setq ss1 (ssget "f" (list p1 p3) '((0 . "LWPOLYLINE"))) ss2 (ssget "f" (list p1 p4) '((0 . "LWPOLYLINE")))))                          
                                (if ss1
                                        (progn
                                                (setq i 0)
                                                (repeat (sslength ss1)
                                                        (setq entname1 (ssname ss1 i) entname2 (ssname ss2 i))
                                                        (setq ptx1 (cadar (cdddr (car (ssnamex ss1 i)))) lst1 (HH:pickSegEndPt entname1 ptx1) pa1 (car lst1) pb1 (cadr lst1))
                                                        (setq ptx2 (cadar (cdddr (car (ssnamex ss2 i)))) lst2 (HH:pickSegEndPt entname2 ptx2) pa2 (car lst2) pb2 (cadr lst2))
                                                        (setq ptx (inters pa1 pb1 pa2 pb2 nil))
                                                        (if (= r 0) (command "BREAK" entname1 "non" ptx "non" ptx)
                                                                (command "BREAK" entname1 "non" (vlax-curve-getclosestpointto entname1 (trans ptx 1 0)) "non" (vlax-curve-getclosestpointto entname1 (trans ptx 1 0)))
                                                        );if
                                                        (setq i (1+ i))
                                                );re
                                        );pr
                                );if
                                (setq loop nil)
                        )

;;[功能] 多段线所点击子段的两端点列表By 自贡黄明儒
;;示例(HH:pickSegEndPt (car(setq en(entsel))) (cadr en))
(defun HH:pickSegEndPt (obj p / pp n)
  (setq        pp (vlax-curve-getclosestpointto obj (trans p 1 0))
                n  (fix (vlax-curve-getparamatpoint obj pp))
  )
  (list        (vlax-curve-getPointAtParam obj n)
                (vlax-curve-getPointAtParam obj (1+ n))
  )
)
发表于 2021-1-26 22:01:36 | 显示全部楼层
感谢老大又出山了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-25 09:35 , Processed in 0.154583 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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