在CAD二次开发中,Tolerance类(或公差类)的核心作用是为几何计算和比较提供一个可配置的精度容差标准,以解决计算机浮点数运算带来的精度误差问题,确保几何判断(如相等、平行、垂直)的准确性和可靠性。
其主要功能和应用场景如下表所示:
| 功能类别 | 具体作用 | 应用场景示例 |
|---|---|---|
| 几何相等性判断 | 设置一个极小的距离值(如` | |
| 1e-10`),当两点或两个向量之间的距离小于此值时,即视为"相等"。 | 判断两个点是否为同一个点;判断两条线段是否共端点。 | |
| 几何关系判断 | 基于设定的角度和距离容差,判断向量间的平行、垂直、共线等关系。 | 检查两条直线是否平行;判断一个点是否在一条直线上。 |
| 全局容差管理 | 通过Tolerance.Global属性设置全局默认公差,影响整个应用程序范围内的几何比较操作。 |
统一设定整个CAD插件或脚本的几何计算精度标准。 |
核心属性与方法在.NET API(如AutoCAD .NET)中,Tolerance类通常包含以下关键属性:
csharp
// 示例:设置和使用全局公差进行点比较
using Autodesk.AutoCAD.Geometry;
// 1. 获取或设置全局公差
Tolerance globalTol = Tolerance.Global;
// 2. 关键容差属性(值通常很小,如1e-10)
double equalPoint = globalTol.EqualPoint; // 点相等距离容差
double equalVector = globalTol.EqualVector; // 向量相等容差
// 3. 使用容差进行几何比较
Point3d pointA = new Point3d(0, 0, 0);
Point3d pointB = new Point3d(0, 0, 0.0000000001); // 一个极近的点
// 不使用容差的直接比较(可能因浮点误差返回false)
bool isExactEqual = pointA == pointB;
// 使用容差进行比较(在容差范围内视为相等)
bool isTolerantEqual = pointA.IsEqualTo(pointB, globalTol);
// 当 pointA 与 pointB 的距离小于 globalTol.EqualPoint 时,返回 true
典型使用场景代码示例
场景:判断两条线段是否平行
csharp
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
public bool AreLinesParallel(Line line1, Line line2)
{
// 获取两条线段的方向向量 Vector3d vector1 = line1.EndPoint - line1.StartPoint;
Vector3d vector2 = line2.EndPoint - line2.StartPoint;
// 归一化向量(可选,但有助于稳定判断)
vector1 = vector1.GetNormal();
vector2 = vector2.GetNormal();
// 使用全局公差判断向量是否平行(包括同向和反向)
// IsParallelTo 方法内部会使用 Tolerance.Global 的容差进行判断
return vector1.IsParallelTo(vector2);
}
// 或者,使用自定义公差进行更严格或更宽松的判断
public bool AreLinesParallelWithCustomTol(Line line1, Line line2, double angleTolerance)
{
Vector3d v1 = (line1.EndPoint - line1.StartPoint).GetNormal();
Vector3d v2 = (line2.EndPoint - line2.StartPoint).GetNormal();
// 计算向量夹角余弦值的绝对值
double dotProduct = Math.Abs(v1.DotProduct(v2));
// 如果余弦值接近1(夹角接近0或180度),则视为平行 // 使用自定义的角度容差(例如,cos(angleTolerance))
return Math.Abs(1.0 - dotProduct) < angleTolerance;
}
场景:在复杂几何操作中确保鲁棒性
csharp
// 在计算两条曲线的交点时,公差至关重要
public Point3dCollection GetIntersectionPoints(Curve curve1, Curve curve2)
{
Point3dCollection intersectionPoints = new Point3dCollection();
// 使用特定的公差进行相交计算 // 如果公差设置过小,可能因浮点误差漏掉实际交点;
// 设置过大,则可能引入错误的交点。
curve1.IntersectWith(curve2, Intersect.OnBothOperands, intersectionPoints, IntPtr.Zero, IntPtr.Zero);
// 后续处理交点时,可能还需要用 Tolerance 来过滤或合并非常接近的点 return intersectionPoints;
}
重要性总结
在CAD二次开发中,由于所有几何坐标均以浮点数表示,直接使用 == 进行相等性比较几乎总是不可靠的。Tolerance 类通过提供一个工程上合理的、可配置的误差允许范围,使得开发者能够:
- 避免误判:防止因微小的浮点误差将几何上相同的元素误判为不同。
- 保证稳定性:确保几何算法(如求交、裁剪、偏移)在各种情况下都能产生一致且符合预期结果。
- 提供灵活性:允许开发者根据具体需求(如机械设计的高精度、建筑设计的相对精度)调整精度标准。
因此,在进行任何涉及几何坐标或向量比较的CAD二次开发时,使用Tolerance类而非直接比较是保证程序正确性的最佳实践。