【求助】规整圆弧半径(起点终点不变)
本帖最后由 kucha007 于 2022-12-15 08:57 编辑偶尔会遇到需要规整圆弧半径的情况,但每次都只能手动规整。
一般来说我会规整成10/50的倍数,但手动实在是太难受了,属于那种平时用不上,但一遇到适用场景就恨不得能快速规整。
我搜了一下没有看到类似的帖子,不知道大佬有合适的程序或者思路分享一下啊。
规整需求:在起点和终点不变的情况下,规整圆弧半径。
如果多段线可以在不用分解的情况下规整就更好了。各位大佬有相关的想法可以畅所欲言,我先挖个坑,有时间会继续学习~
本帖最后由 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)
)
直接重画,先取出需要的各个点的坐标,圆弧方向,半径,将半径归整,再entmakex圆弧
多段线直接来的话 也是取出顶点坐标,两相邻点间的凸度,entmake
多段线也可以选择炸开,用圆弧归整的方法归整,完后合并
仅供参考 tigcat 发表于 2022-12-15 10:59
直接重画,先取出需要的各个点的坐标,圆弧方向,半径,将半径归整,再entmakex圆弧
多段线直接来的话 也 ...
简单粗暴:lol 本帖最后由 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)
)
kucha007 发表于 2022-12-15 20:06
无意中找到了几乎满足需求的程序,分享出来一起学习!
https://forums.autodesk.com/t5/visual-lisp-autol ...
这个不错,但是试试了不是真正的切点来的。 本帖最后由 kucha007 于 2022-12-30 18:27 编辑
flowerson 发表于 2022-12-30 16:31
这个不错,但是试试了不是真正的切点来的。
如果你又要调整半径又要圆相切,起点和终点就一定会改变,就和这个帖子标题不一样了= =。这个帖子的起点终点不变是对于圆弧来说的 本帖最后由 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]