From a1c7d39dc6435d8b032ff51d974a5d63c9d9b00c Mon Sep 17 00:00:00 2001 From: company-desktop-computer Date: Fri, 16 Oct 2026 13:11:21 +0800 Subject: [PATCH] =?UTF-8?q?fix(HLR):=20=E6=B8=85=E7=90=86=E5=89=96?= =?UTF-8?q?=E5=88=87=E7=BB=93=E6=9E=9C=E4=B8=AD=E7=9A=84=E9=80=80=E5=8C=96?= =?UTF-8?q?=E5=9C=86=E5=BC=A7=EF=BC=8C=E9=81=BF=E5=85=8D=E5=9C=86=E5=BF=83?= =?UTF-8?q?=E8=A7=92=E6=BA=A2=E5=87=BA=E7=94=9F=E6=88=90=E5=8F=8D=E5=90=91?= =?UTF-8?q?=E5=A4=A7=E5=9C=86=E5=BC=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AecDbXCamera::hlrCalc 在 HLR 计算后新增 isDegenerateArc 判定:结果为 AcDbArc 且 弧长/半径 < 1e-6 时视为退化圆弧(圆心角极小),从 result1/result2 中删除,防止数值溢出把"很小一段"翻转成"反向的大圆弧"。 --- .../Code2026/CoreLibrary/AecDbCamera.cpp | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/SourceCode/Code2026/CoreLibrary/AecDbCamera.cpp b/SourceCode/Code2026/CoreLibrary/AecDbCamera.cpp index 6210726..aeb0ab9 100644 --- a/SourceCode/Code2026/CoreLibrary/AecDbCamera.cpp +++ b/SourceCode/Code2026/CoreLibrary/AecDbCamera.cpp @@ -534,6 +534,26 @@ namespace //#endif } + // 弧长/半径 的比值小于此值即视为"退化圆弧"(圆心角极小)。 + const double kMinArcLengthRadiusRatio = 1e-6; + + // 判断 HLR 结果实体是否为"退化圆弧":实体是 AcDbArc,且 弧长/半径 的比值极小。 + // 这类圆弧的圆心角极小,HLR 计算时圆心角会溢出,使结果由"很小一段"变成 + // "反向的大圆弧",需要从结果中删除。 + bool isDegenerateArc(AcDbEntity *pEnt) + { + AcDbArc *pArc(AcDbArc::cast(pEnt)); + if (pArc == NULL) + return false; + + double dRadius(pArc->radius()); + if (COMPARE_DOUBLE::equal_zero(dRadius, 1e-9)) + return true; // 半径≈0,本身即退化 + + double dRatio(pArc->length() / dRadius); + return dRatio < kMinArcLengthRadiusRatio; + } + bool zeroLength(AcDbCurve *pCrv, const double &tol) { double dPEnd(.0), dDist(.0); @@ -1966,6 +1986,36 @@ void AecDbXCamera::hlrCalc(AcDbObjectIdArray &arIds HlrCalc(arIds, arAdditional_all, pVp.get(), control, result1, result2); + // 删除 HLR 计算中"退化"的圆弧(弧长/半径 比值极小)。 + // 这类圆弧圆心角极小,计算时会溢出,由"很小一段"变成"反向的大圆弧"。 + { + IDMapEntities::iterator it(result1.begin()); + for (; it != result1.end(); ++it) + { + for (int i(it->second.length() - 1); i >= 0; --i) + { + if (isDegenerateArc(it->second[i])) + { + delete it->second[i]; + it->second.removeAt(i); + } + } + } + + EntMapEntities::iterator it2(result2.begin()); + for (; it2 != result2.end(); ++it2) + { + for (int i(it2->second.length() - 1); i >= 0; --i) + { + if (isDegenerateArc(it2->second[i])) + { + delete it2->second[i]; + it2->second.removeAt(i); + } + } + } + } + if (result1.empty() && result2.empty()) { // 如果实体的PreprocessForHlr函数内,设置了 HLR_CALC,从而影响实体的 Draw3d 函数的返回 -- 2.54.0