amook147 发表于 2025-11-30 15:11:53

高手看看这个例子能否用lisp实现?

本帖最后由 amook147 于 2025-11-30 15:13 编辑

红色0.25半径的小R角 能否实现批量框选,一次性修改成其他R值?修改完成以后保持和白色的圆弧相切关系。





amook147 发表于 2025-12-3 11:03:23

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)

guosheyang 发表于 2025-12-2 14:15:31

amook147 发表于 2025-12-2 09:21
大佬能分享下源码吗?学习学习自己试了好多天了 都不行

这个是就是一个fillet命令的应用而已; 首先搞懂两个圆弧间的圆角,圆角前先设置filletrad变量,比如(setvar "filletrad" 0.3)   然后再(command "FILLET"点1   点2) )   这个点1、点2可以用 (list图元名点坐标) 的形式;图元名就是圆弧的图元名,点坐标, 我选择的是圆弧的中点坐标。这样就可以实现两个圆弧间的圆角      然后就是相同步骤的循环而已   

amook147 发表于 2025-12-1 11:09:48

阿猪蛋 发表于 2025-12-1 09:35
pe 编辑把这些断线连成一个完整的线,再offset

那样的话白色的大圆弧的半径就不对了啊,,我要的效果是 白色大圆弧不动的情况下修改红色小圆弧的R值,并且修改完成以后保持和白色圆弧的相切关系。。。

yegucheng0129 发表于 2025-11-30 17:45:52

见人工具箱里有个圆角功能,批量的
可以试下

kozmosovia 发表于 2025-11-30 19:53:29

全部连成pline,然后圆角pline

xsmabbs 发表于 2025-11-30 21:34:28

pe 编辑把这些断线连成一个完整的线,再offset

孤独荒原狼 发表于 2025-12-1 08:35:56

圆心切点圆心在一条线,这样连接圆心后就增加了可操作性,不过程序不怎么会做。

阿猪蛋 发表于 2025-12-1 09:35:36

pe 编辑把这些断线连成一个完整的线,再offset

kozmosovia 发表于 2025-12-1 12:33:42

先取消红色圆弧,直接fillet白色圆弧并join成一整个pline,然后用fillet指定半径。
以后可以指定新半径直接fillet

guosheyang 发表于 2025-12-1 16:27:39

将红色圆弧删除然后白色圆弧按照与几何中心所成角度排序,设置好filletrad变量然后调用圆角命令,两两圆角即可

guosheyang 发表于 2025-12-1 18:58:04

测试了下 好像不排序也是可以实现
页: [1] 2
查看完整版本: 高手看看这个例子能否用lisp实现?