明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 906|回复: 7

【求助】规整圆弧半径(起点终点不变)

[复制链接]
发表于 2022-12-14 23:33 | 显示全部楼层 |阅读模式
10明经币
本帖最后由 kucha007 于 2022-12-15 08:57 编辑

偶尔会遇到需要规整圆弧半径的情况,但每次都只能手动规整。
一般来说我会规整成10/50的倍数,但手动实在是太难受了,属于那种平时用不上,但一遇到适用场景就恨不得能快速规整。
我搜了一下没有看到类似的帖子,不知道大佬有合适的程序或者思路分享一下啊。


规整需求:在起点和终点不变的情况下,规整圆弧半径。
如果多段线可以在不用分解的情况下规整就更好了。各位大佬有相关的想法可以畅所欲言,我先挖个坑,有时间会继续学习~



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

最佳答案

查看完整内容

直接重画,先取出需要的各个点的坐标,圆弧方向,半径,将半径归整,再entmakex圆弧 多段线直接来的话 也是取出顶点坐标,两相邻点间的凸度,entmake 多段线也可以选择炸开,用圆弧归整的方法归整,完后合并 仅供参考
 楼主| 发表于 2022-12-15 20:06 | 显示全部楼层
本帖最后由 kucha007 于 2022-12-15 20:07 编辑

无意中找到了几乎满足需求的程序,分享出来一起学习!
https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/auto-edit-bulge-radius-pline-to-even-odd/td-p/7932740
  1. (defun C:TT ( / e q a b c r x)
  2.   (if
  3.     (and
  4.       (setq e (ssget ":L" '((0 . "LWPOLYLINE") (-4 . "<>") (42 . 0.0))))
  5.       (progn
  6.         (initget 6)
  7.         (setq q (getdist "\nSpecify rounding number: "))
  8.       )
  9.     )
  10.     (progn
  11.       (setq e (vlax-ename->vla-object (ssname e 0))
  12.             a (vlax-curve-getstartparam e)
  13.             c (vlax-curve-getendparam   e)
  14.       )
  15.       (while (< a c)
  16.         (setq b (vla-getbulge e a))
  17.         (if
  18.           (> (setq r (distance '(0.0 0.0 0.0) (vlax-curve-getsecondderiv e a))) (/ q 2.0))
  19.           (progn
  20.             (setq x (/
  21.                       (* q (fix (+ 0.5 (/ r q))))
  22.                       (distance
  23.                         (vlax-curve-getpointatparam e a)
  24.                         (vlax-curve-getpointatparam e (+ 1.0 a))
  25.                       )
  26.                       0.5
  27.                     )
  28.             )
  29.             (vla-setbulge e a
  30.               (*
  31.                 ((if (< (abs b) 1) - +) x (sqrt (- (* x x) 1.0)))
  32.                 (if (minusp b) -1 1)
  33.               )
  34.             )
  35.           )
  36.         )
  37.         (setq a (1+ a))
  38.       )
  39.     )
  40.   )
  41.   (princ)
  42. )

回复

使用道具 举报

发表于 2022-12-14 23:33 | 显示全部楼层
直接重画,先取出需要的各个点的坐标,圆弧方向,半径,将半径归整,再entmakex圆弧
多段线直接来的话 也是取出顶点坐标,两相邻点间的凸度,entmake
多段线也可以选择炸开,用圆弧归整的方法归整,完后合并
仅供参考
回复

使用道具 举报

 楼主| 发表于 2022-12-15 11:47 | 显示全部楼层
tigcat 发表于 2022-12-15 10:59
直接重画,先取出需要的各个点的坐标,圆弧方向,半径,将半径归整,再entmakex圆弧
多段线直接来的话 也 ...

简单粗暴
回复

使用道具 举报

 楼主| 发表于 2022-12-15 19:16 | 显示全部楼层
本帖最后由 kucha007 于 2022-12-15 19:36 编辑

参考帖子01:调整圆弧半径(代码已简化)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=185495&highlight=%D4%B2%BB%A1

  1. (defun C:TT (/ BJRC SS i obj )
  2.     (setq BJRC 10);设置容差
  3.     (if (setq ss (ssget '((0 . "arc"))))
  4.       (repeat (setq i (sslength ss))
  5.         (setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i))))
  6.               rr  (* (fix (/ (vla-get-radius obj) BJRC)) BJRC)
  7.         )
  8.         (vla-put-radius obj (if (= rr 0) BJRC rr))
  9.       )
  10.     )
  11.     (princ)
  12. )



参考帖子02:获取曲线半径
https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/get-polyline-segment-radius/td-p/5592665

  1. (defun C:TT (/ ent RR)
  2.     (setq ent (entsel "\nSelect a circle, arc or polyline: "))
  3.     (if
  4.         (and
  5.           ent
  6.           (wcmatch (cdr (assoc 0 (entget (car ent)))) "CIRCLE,ARC,*POLYLINE")
  7.         )
  8.         (progn
  9.             (setq RR
  10.                 (distance
  11.                     '(0 0 0)
  12.                     (vlax-curve-getsecondderiv (car ent)
  13.                       (vlax-curve-getparamatpoint (car ent)
  14.                         (vlax-curve-getclosestpointto (car ent) (cadr ent))
  15.                       )
  16.                     )
  17.                 )
  18.             )
  19.             (princ (strcat "\n半径为:" (rtos RR 2 1)))
  20.             (princ)
  21.         )
  22.     )
  23.     (princ)
  24. )


回复

使用道具 举报

发表于 2022-12-30 16:31 | 显示全部楼层
kucha007 发表于 2022-12-15 20:06
无意中找到了几乎满足需求的程序,分享出来一起学习!
https://forums.autodesk.com/t5/visual-lisp-autol ...

这个不错,但是试试了不是真正的切点来的。
回复

使用道具 举报

 楼主| 发表于 2022-12-30 18:25 | 显示全部楼层
本帖最后由 kucha007 于 2022-12-30 18:27 编辑
flowerson 发表于 2022-12-30 16:31
这个不错,但是试试了不是真正的切点来的。

如果你又要调整半径又要圆相切,起点和终点就一定会改变,就和这个帖子标题不一样了= =。这个帖子的起点终点不变是对于圆弧来说的
回复

使用道具 举报

发表于 2023-5-30 23:37 | 显示全部楼层
本帖最后由 d1742647821 于 2023-5-30 23:41 编辑

规整圆弧 powered by IFoxCad version v0.7
视频举例规整为25的倍数



  1.     [CommandMethod(nameof(CS5),CommandFlags.UsePickSet)]
  2.     public static void CS5()
  3.     {
  4.         PromptSelectionOptions pso = new() { MessageForAdding = "\n选择圆或圆弧", RejectObjectsOnLockedLayers = true };
  5.         var sf = OpFilter.Build(e => e.Dxf(0) == "ARC" | e.Dxf(0) == "CIRCLE");
  6.         var r1 = Env.Editor.GetSelection(pso, sf);
  7.         if (r1.Status != PromptStatus.OK)
  8.             return;
  9.         var r2 = Env.Editor.GetInteger("\n选择要取整的数值");
  10.         if (r2.Status != PromptStatus.OK)
  11.             return;
  12.         var sr = r2.Value;

  13.         using var tr = new DBTrans();
  14.         foreach (var id in r1.Value.GetObjectIds())
  15.         {
  16.             var dbo = tr.GetObject(id, OpenMode.ForWrite);
  17.             if (dbo is Circle c)
  18.             {
  19.                 var a = Math.Round(c.Radius / sr) * sr;
  20.                 c.Radius = a == 0 ? sr : a;
  21.             }
  22.             else if (dbo is Arc arc)
  23.             {
  24.                 var a = Math.Round(arc.Radius / sr) * sr;
  25.                 arc.Radius = a == 0 ? sr : a;
  26.             }
  27.         }
  28.     }

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 05:56 , Processed in 0.188075 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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