objectarx 批量倒角
Posted helloqlq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了objectarx 批量倒角相关的知识,希望对你有一定的参考价值。
这个插件支持AcDbPolyline的倒角,封闭的和没封闭的都可以。刚开始做的时候,发现倒一个角借助云幽课堂里的代码就可以做,后来做一条从左开始画的非封闭的多段线,发现向上凹和向下凹的角不能同时被倒,代码只能倒向上凹的,向下凹的代码时反着的,后来我把凸度取反,向下凹的又可以倒角了。这时我觉得就行了,后来又出现问题,发现顺时针或逆时针画个半包围的图形时,在顶上的角或者底下的角倒出的角又是反着的。最后是画只有一个角的多段线,根据代码的bug,一个个的写判断条件瞎做出来的。光是if else 我都写了一两百行吧。因为自己不懂凸度,没有深入的去想课堂里学的倒角功能的代码,觉得只要会用,有得抄就可以了,根本不去下功夫理解。也不想在写代码的过程中停下来先学会凸度在做,自己就瞎写,我现在觉得这样是不对的,所谓磨刀不误砍柴功,这些道理知道是知道,但真正做的时候,就做不到了。这里我就不想贴出我写的代码了,主要思路是:
判断要倒角的点所在的两条边的向量,根据终边的向量所处与起边的向量的位置关系,根据向量的x,y值确定它是在哪一个象限的,加入向量vec1是1象限,我就把vec2处于2象限的情况都写倒条件里面去,然后写上凸度,跑程序,画线,看结果这样试出来的。还要考虑90度的情况,判断的时候最好不要用等于去判断,用个误差范围去判断。
把云幽课堂的代码倒一个角的代码拿出来,是.C#语言写的的,但改成C++的也很简单。
/// <summary> /// 倒圆角。生成两点,按左右上下序。 /// </summary> /// <param name="vertex">要被倒角的点</param> /// <param name="vec1">角两边的向量,向量的起点是vertex</param> /// <param name="vec2"></param> /// <param name="radius">倒角半径</param> /// <returns>生成的点</returns> public static Point2d[] Fillet(Point2d vertex, Vector2d vec1, Vector2d vec2, double radius) { var uvec1 = vec1.GetNormal(); var uvec2 = vec2.GetNormal(); var vecToCenterUnit = (uvec1 + uvec2).GetNormal(); var vecToCenter = vecToCenterUnit * radius / Math.Sin(Math.Min(vecToCenterUnit.GetAngleTo(uvec1), vecToCenterUnit.GetAngleTo(uvec2))); var projVec1 = uvec1 * uvec1.DotProduct(vecToCenter); var projVec2 = uvec2 * uvec2.DotProduct(vecToCenter); return new[] { vertex + projVec1, vertex + projVec2 } .OrderBy(p => p.X) .ThenBy(p => p.Y) .ToArray(); }
凸度的计算:
bulge = tan((CMathUtil::PI() - vec2.angleTo(vec1)) / 4);
最后总结平时自己写的代码 大部分都是东平西凑,没有百度,我根本就做不出来。
以上是关于objectarx 批量倒角的主要内容,如果未能解决你的问题,请参考以下文章