明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 412|回复: 1

[提问] 不够边长倒圆角 有时出错倒反方向左右 请帮忙改一改

[复制链接]
发表于 2025-6-18 17:39:18 | 显示全部楼层 |阅读模式
(defun c:FRR (/ *error* oldCmdEcho oldOsmode en1 en2 obj1 obj2 rad lastRad pickPt intPt pt1 pt2 pt3 pt4 len1 len2 side1 side2)

    (vl-load-com)

    (defun *error* (msg)
        (if oldCmdEcho (setvar "CMDECHO" oldCmdEcho))
        (if oldOsmode (setvar "OSMODE" oldOsmode))
        (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
            (princ (strcat "\n错误: " msg))
        )
    )

    ; 获取或设置上一次的半径值
    (if (setq lastRad (getenv "FRR_LastRadius"))
        (setq lastRad (atof lastRad))
        (setq lastRad 5.0) ; 默认半径5.0
    )

    (setq oldCmdEcho (getvar "CMDECHO"))
    (setq oldOsmode (getvar "OSMODE"))
    (setvar "CMDECHO" 0)
    (setvar "OSMODE" 0)

    ; 获取圆角半径,使用上一次的值作为默认
    (initget 6)
    (setq rad (getdist (strcat "\n请输入圆角半径 <" (rtos lastRad 2 2) ">: ")))
    (if (not rad) (setq rad lastRad))
    (setenv "FRR_LastRadius" (rtos rad 2 8))

    ; 选择第一条线
    (setq en1 (car (entsel "\n选择第一条线: ")))
    (while (not (wcmatch (cdr (assoc 0 (entget en1))) "LINE,*POLYLINE"))
        (princ "\n所选对象不是直线或多段线,请重新选择第一条线: ")
        (setq en1 (car (entsel)))
    )

    ; 获取鼠标点击位置(用于判断方向)
    (setq pickPt (getvar "LASTPOINT"))

    ; 选择第二条线
    (setq en2 (car (entsel "\n选择第二条线: ")))
    (while (not (wcmatch (cdr (assoc 0 (entget en2))) "LINE,*POLYLINE"))
        (princ "\n所选对象不是直线或多段线,请重新选择第二条线: ")
        (setq en2 (car (entsel)))
    )

    (setq obj1 (vlax-ename->vla-object en1))
    (setq obj2 (vlax-ename->vla-object en2))

    ; 获取线的端点
    (setq pt1 (vlax-curve-getStartPoint obj1))
    (setq pt2 (vlax-curve-getEndPoint obj1))
    (setq pt3 (vlax-curve-getStartPoint obj2))
    (setq pt4 (vlax-curve-getEndPoint obj2))

    ; 计算交点
    (setq intPt (inters pt1 pt2 pt3 pt4 nil))

    (if (not intPt)
        (progn
            (princ "\n错误: 所选两条线不相交!")
            (setvar "CMDECHO" oldCmdEcho)
            (setvar "OSMODE" oldOsmode)
            (exit)
        )
    )

    ; 根据鼠标位置判断圆弧方向
    (setq side1 (if (< (distance pt1 pickPt) (distance pt2 pickPt)) pt1 pt2))
    (setq side2 (if (< (distance pt3 pickPt) (distance pt4 pickPt)) pt3 pt4))

    ; 计算需要延长的长度
    (setq len1 (distance intPt side1))
    (setq len2 (distance intPt side2))

    ; 延长第一条线
    (if (< len1 rad)
        (progn
            (command "_.lengthen" "_de" (- rad len1) (list en1 side1) "")
            (princ (strcat "\n第一条线已延长 " (rtos (- rad len1) 2 2)))
        )
    )

    ; 延长第二条线
    (if (< len2 rad)
        (progn
            (command "_.lengthen" "_de" (- rad len2) (list en2 side2) "")
            (princ (strcat "\n第二条线已延长 " (rtos (- rad len2) 2 2)))
        )
    )

    ; 执行圆角命令(使用标准AutoCAD选线方式)
    (command "_.fillet" "_r" rad "_fillet" en1 en2)

    (setvar "CMDECHO" oldCmdEcho)
    (setvar "OSMODE" oldOsmode)
    (princ)
)

(princ "\n自动延长倒圆角程序已加载,输入 FRR 运行。")
(princ)

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 2025-6-18 18:12:27 | 显示全部楼层
这 么复杂,为什么不直接用命令_.fillet?两条平行线也可以倒角的。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 09:19 , Processed in 0.165539 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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