高手看看这个例子能否用lisp实现?
本帖最后由 amook147 于 2025-11-30 15:13 编辑红色0.25半径的小R角 能否实现批量框选,一次性修改成其他R值?修改完成以后保持和白色的圆弧相切关系。
guosheyang 发表于 2025-12-2 14:15
这个是就是一个fillet命令的应用而已; 首先搞懂两个圆弧间的圆角,圆角前先设置filletrad变量,比如(set ...
感谢大佬指点,弄了一个不过有点小问题。。。圆角以后 旧的圆弧没有被删除 。。。怎么回事?
(defun c:ttt (/ *error* ss i ent obj p1 p2 rad old_rad)
(defun *error* (msg)
(if (and old_rad (not (equal old_rad (getvar "FILLETRAD"))))
(setvar "FILLETRAD" old_rad)
)
(princ (strcat "\n错误: " msg))
)
(setq old_rad (getvar "FILLETRAD"))
(initget 7)
(setq rad (getdist "\n请输入新的圆角半径: "))
(setvar "FILLETRAD" rad)
(princ "\n请框选要修改圆角的图形: ")
(setq ss (ssget '((0 . "ARC"))))
(if ss
(progn
(setq i 0)
(repeat (sslength ss)
(setq ent (ssname ss i))
(setq obj (vlax-ename->vla-object ent))
(setq p1 (vlax-curve-getPointAtParam obj
(/ (+ (vlax-curve-getStartParam obj)
(vlax-curve-getEndParam obj))
2.0)))
(if (< (1+ i) (sslength ss))
(progn
(setq ent2 (ssname ss (1+ i)))
(setq obj2 (vlax-ename->vla-object ent2))
(setq p2 (vlax-curve-getPointAtParam obj2
(/ (+ (vlax-curve-getStartParam obj2)
(vlax-curve-getEndParam obj2))
2.0)))
(command "_.FILLET" "_non" p1 "_non" p2)
)
)
(setq i (1+ i))
)
(if (and (> (sslength ss) 1)
(equal (vlax-curve-getStartPoint (vlax-ename->vla-object (ssname ss 0)))
(vlax-curve-getEndPoint (vlax-ename->vla-object (ssname ss (- (sslength ss) 1))))
1e-6))
(progn
(setq ent1 (ssname ss 0))
(setq obj1 (vlax-ename->vla-object ent1))
(setq p1 (vlax-curve-getPointAtParam obj1
(/ (+ (vlax-curve-getStartParam obj1)
(vlax-curve-getEndParam obj1))
2.0)))
(setq ent2 (ssname ss (- (sslength ss) 1)))
(setq obj2 (vlax-ename->vla-object ent2))
(setq p2 (vlax-curve-getPointAtParam obj2
(/ (+ (vlax-curve-getStartParam obj2)
(vlax-curve-getEndParam obj2))
2.0)))
(command "_.FILLET" "_non" p1 "_non" p2)
)
)
(princ (strcat "\n已完成 " (itoa (sslength ss)) " 个圆弧的圆角修改"))
)
(princ "\n未选择到任何圆弧对象")
)
(setvar "FILLETRAD" old_rad)
(princ)
)
(princ "\n圆弧圆角修改插件已加载,命令: TTT")
(princ)
amook147 发表于 2025-12-2 09:21
大佬能分享下源码吗?学习学习自己试了好多天了 都不行
这个是就是一个fillet命令的应用而已; 首先搞懂两个圆弧间的圆角,圆角前先设置filletrad变量,比如(setvar "filletrad" 0.3) 然后再(command "FILLET"点1 点2) ) 这个点1、点2可以用 (list图元名点坐标) 的形式;图元名就是圆弧的图元名,点坐标, 我选择的是圆弧的中点坐标。这样就可以实现两个圆弧间的圆角 然后就是相同步骤的循环而已 阿猪蛋 发表于 2025-12-1 09:35
pe 编辑把这些断线连成一个完整的线,再offset
那样的话白色的大圆弧的半径就不对了啊,,我要的效果是 白色大圆弧不动的情况下修改红色小圆弧的R值,并且修改完成以后保持和白色圆弧的相切关系。。。 见人工具箱里有个圆角功能,批量的
可以试下 全部连成pline,然后圆角pline pe 编辑把这些断线连成一个完整的线,再offset 圆心切点圆心在一条线,这样连接圆心后就增加了可操作性,不过程序不怎么会做。 pe 编辑把这些断线连成一个完整的线,再offset
先取消红色圆弧,直接fillet白色圆弧并join成一整个pline,然后用fillet指定半径。
以后可以指定新半径直接fillet 将红色圆弧删除然后白色圆弧按照与几何中心所成角度排序,设置好filletrad变量然后调用圆角命令,两两圆角即可 测试了下 好像不排序也是可以实现
页:
[1]
2