kucha007 发表于 2022-12-14 23:33:47

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

本帖最后由 kucha007 于 2022-12-15 08:57 编辑

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


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



kucha007 发表于 2022-12-15 20:06:09

本帖最后由 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
(defun C:TT ( / e q a b c r x)
(if
    (and
      (setq e (ssget ":L" '((0 . "LWPOLYLINE") (-4 . "<>") (42 . 0.0))))
      (progn
      (initget 6)
      (setq q (getdist "\nSpecify rounding number: "))
      )
    )
    (progn
      (setq e (vlax-ename->vla-object (ssname e 0))
            a (vlax-curve-getstartparam e)
            c (vlax-curve-getendparam   e)
      )
      (while (< a c)
      (setq b (vla-getbulge e a))
      (if
          (> (setq r (distance '(0.0 0.0 0.0) (vlax-curve-getsecondderiv e a))) (/ q 2.0))
          (progn
            (setq x (/
                      (* q (fix (+ 0.5 (/ r q))))
                      (distance
                        (vlax-curve-getpointatparam e a)
                        (vlax-curve-getpointatparam e (+ 1.0 a))
                      )
                      0.5
                  )
            )
            (vla-setbulge e a
            (*
                ((if (< (abs b) 1) - +) x (sqrt (- (* x x) 1.0)))
                (if (minusp b) -1 1)
            )
            )
          )
      )
      (setq a (1+ a))
      )
    )
)
(princ)
)

tigcat 发表于 2022-12-14 23:33:48

直接重画,先取出需要的各个点的坐标,圆弧方向,半径,将半径归整,再entmakex圆弧
多段线直接来的话 也是取出顶点坐标,两相邻点间的凸度,entmake
多段线也可以选择炸开,用圆弧归整的方法归整,完后合并
仅供参考

kucha007 发表于 2022-12-15 11:47:06

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

简单粗暴:lol

kucha007 发表于 2022-12-15 19:16:07

本帖最后由 kucha007 于 2022-12-15 19:36 编辑

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


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



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



(defun C:TT (/ ent RR)
    (setq ent (entsel "\nSelect a circle, arc or polyline: "))
    (if
      (and
          ent
          (wcmatch (cdr (assoc 0 (entget (car ent)))) "CIRCLE,ARC,*POLYLINE")
      )
      (progn
            (setq RR
                (distance
                  '(0 0 0)
                  (vlax-curve-getsecondderiv (car ent)
                      (vlax-curve-getparamatpoint (car ent)
                        (vlax-curve-getclosestpointto (car ent) (cadr ent))
                      )
                  )
                )
            )
            (princ (strcat "\n半径为:" (rtos RR 2 1)))
            (princ)
      )
    )
    (princ)
)


flowerson 发表于 2022-12-30 16:31:03

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

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

kucha007 发表于 2022-12-30 18:25:21

本帖最后由 kucha007 于 2022-12-30 18:27 编辑

flowerson 发表于 2022-12-30 16:31
这个不错,但是试试了不是真正的切点来的。
如果你又要调整半径又要圆相切,起点和终点就一定会改变,就和这个帖子标题不一样了= =。这个帖子的起点终点不变是对于圆弧来说的

d1742647821 发表于 2023-5-30 23:37:36

本帖最后由 d1742647821 于 2023-5-30 23:41 编辑

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

attach://127345.flv

   
    public static void CS5()
    {
      PromptSelectionOptions pso = new() { MessageForAdding = "\n选择圆或圆弧", RejectObjectsOnLockedLayers = true };
      var sf = OpFilter.Build(e => e.Dxf(0) == "ARC" | e.Dxf(0) == "CIRCLE");
      var r1 = Env.Editor.GetSelection(pso, sf);
      if (r1.Status != PromptStatus.OK)
            return;
      var r2 = Env.Editor.GetInteger("\n选择要取整的数值");
      if (r2.Status != PromptStatus.OK)
            return;
      var sr = r2.Value;

      using var tr = new DBTrans();
      foreach (var id in r1.Value.GetObjectIds())
      {
            var dbo = tr.GetObject(id, OpenMode.ForWrite);
            if (dbo is Circle c)
            {
                var a = Math.Round(c.Radius / sr) * sr;
                c.Radius = a == 0 ? sr : a;
            }
            else if (dbo is Arc arc)
            {
                var a = Math.Round(arc.Radius / sr) * sr;
                arc.Radius = a == 0 ? sr : a;
            }
      }
    }
页: [1]
查看完整版本: 【求助】规整圆弧半径(起点终点不变)