明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8467|回复: 84

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

    [复制链接]
发表于 2021-1-25 12:44 | 显示全部楼层 |阅读模式
本帖最后由 start4444 于 2022-2-26 22:11 编辑

“FILLET”命令参数有好几种方式:
1,选集代入:(command "FILLET" (ssget ":S") (ssget ":S"))   多段线有效,直线判断方向有bug
2, 图元名代入: (command "FILLET" entname1 entname2)   方向以长段为准,作用不大
3, 点代入:(command "FILLET" (getpoint) (getpoint))   多段线有效,操作简单,密集线会出错
4, 图元名+点代入:(command "FILLET" (entsel) (entsel))  这是最可靠的方式,但对于两条多段线操作无效


;;批量倒角论坛都有不少,感觉还是栏选方式可靠,角度合适就框选,不行就按 F 线选,完了A,S调整圆角半径

本帖子中包含更多资源

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

x

评分

参与人数 8明经币 +8 金钱 +5 收起 理由
自贡黄明儒 + 1
whophy + 1 + 5 很给力!
xvjiex + 1 赞一个!
lee50310 + 1 很给力!
USER2128 + 1 赞一个!
magicheno + 1 很给力!
tigcat + 1 帮大侠顶一下。
xj6019 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2021-1-26 17:16 | 显示全部楼层
本帖最后由 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-2-1 18:52 | 显示全部楼层
magicheno 发表于 2021-2-1 15:09
大侠有空帮我看看这个问题呢

(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
                (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连接(K)/默认断开(空格)]:"))
                (cond
                        ((= key "k") (setq loop nil))
                        (T (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)
                        )
                );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 很给力!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2021-1-25 21:11 | 显示全部楼层
本帖最后由 xj6019 于 2021-1-25 21:26 编辑

你们都玩起来了呀,我咋没明白咋用的呀,老师 录个gif吧,我看看咋操作呀
使用情况录屏在这个链接里,论坛没法上传图片

https://xj6019.lanzous.com/i3jPjkuhv4h
回复 支持 0 反对 1

使用道具 举报

发表于 2021-1-25 12:59 | 显示全部楼层
谢谢分享,玩了一下,没玩明白,不过感觉不管是倒角还是圆角,论坛里所有的工具在判断方面没几个很完美的,应该这个问题是个大的硬伤,多谢楼主给论坛多一个可以选择使用的工具,给力,谢谢!!
发表于 2021-1-25 14:41 | 显示全部楼层
批量的东西大多都很方便,我复制下试试效果
发表于 2021-1-25 14:52 | 显示全部楼层
本帖最后由 magicheno 于 2021-1-25 15:32 编辑

大侠的东西还是一路既往的实用,这个用的很顺畅,好用,可否在增加一个批量圆角后,两端都是分开选项的呢,比如在A,S后面增加一个选项呢
 楼主| 发表于 2021-1-25 18:36 | 显示全部楼层
magicheno 发表于 2021-1-25 14:52
大侠的东西还是一路既往的实用,这个用的很顺畅,好用,可否在增加一个批量圆角后,两端都是分开选项的呢, ...

两端都是分开的是什么意思?
发表于 2021-1-25 19:31 | 显示全部楼层
start4444 发表于 2021-1-25 18:36
两端都是分开的是什么意思?

就是多段线转折处无缝断开呢,默认是连在一起的
发表于 2021-1-26 08:59 | 显示全部楼层
命令: tt5
框选起点[线选(F)]:
终点:; 错误: 参数类型错误: lselsetp nil
为什么显示错误呢
 楼主| 发表于 2021-1-26 10:50 | 显示全部楼层
magicheno 发表于 2021-1-25 19:31
就是多段线转折处无缝断开呢,默认是连在一起的

后续炸散就行了吧
 楼主| 发表于 2021-1-26 10:51 | 显示全部楼层
xj6019 发表于 2021-1-25 21:11
你们都玩起来了呀,我咋没明白咋用的呀,老师 录个gif吧,我看看咋操作呀
使用情况录屏在这个链接里,论坛 ...

不是这种,是两组线批量倒角那种
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 23:08 , Processed in 0.430699 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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