diff --git a/src/measure/measure_tool_brep.cpp b/src/measure/measure_tool_brep.cpp index 0b5c5a13..66e28b46 100644 --- a/src/measure/measure_tool_brep.cpp +++ b/src/measure/measure_tool_brep.cpp @@ -147,7 +147,7 @@ gp_Pnt computeShapeCenter(const TopoDS_Shape& shape) const MeasureCircle circle = MeasureToolBRep::brepCircle(shape); return circle.value.Location(); } - catch (const BRepMeasureError&) { + catch (const IMeasureError&) { BRepGProp::LinearProperties(shape, shapeProps); } } @@ -276,10 +276,10 @@ MeasureCircle MeasureToolBRep::brepCircleFromGeometricEdge(const TopoDS_Edge& ed const GCPnts_QuasiUniformAbscissa pnts(curve, 4); // More points to avoid confusion throwErrorIf(!pnts.IsDone() || pnts.NbPoints() < 3); const GC_MakeCircle makeCirc( - GeomUtils::d0(curve, pnts.Parameter(1)), - GeomUtils::d0(curve, pnts.Parameter(2)), - GeomUtils::d0(curve, pnts.Parameter(3)) - ); + GeomUtils::d0(curve, pnts.Parameter(1)), + GeomUtils::d0(curve, pnts.Parameter(2)), + GeomUtils::d0(curve, pnts.Parameter(3)) + ); throwErrorIf(!makeCirc.IsDone()); circle = makeCirc.Value()->Circ(); } @@ -312,10 +312,10 @@ MeasureCircle MeasureToolBRep::brepCircleFromPolygonEdge(const TopoDS_Edge& edge throwErrorIf(polyline.IsNull() || polyline->NbNodes() < 7); // Try to create a circle from 3 sample points const GC_MakeCircle makeCirc( - polyline->Nodes().First(), - polyline->Nodes().Value(1 + polyline->NbNodes() / 3), - polyline->Nodes().Value(1 + 2 * polyline->NbNodes() / 3) - ); + polyline->Nodes().First(), + polyline->Nodes().Value(1 + polyline->NbNodes() / 3), + polyline->Nodes().Value(1 + 2 * polyline->NbNodes() / 3) + ); throwErrorIf(!makeCirc.IsDone()); const gp_Circ circle = makeCirc.Value()->Circ(); @@ -345,12 +345,21 @@ MeasureCircle MeasureToolBRep::brepCircle(const TopoDS_Shape& shape) } MeasureDistance MeasureToolBRep::brepMinDistance( - const TopoDS_Shape& shape1, const TopoDS_Shape& shape2) + const TopoDS_Shape& shape1, const TopoDS_Shape& shape2 + ) { throwErrorIf(shape1.IsNull()); throwErrorIf(shape2.IsNull()); - const BRepExtrema_DistShapeShape dist(shape1, shape2); + BRepExtrema_DistShapeShape dist; + try { + dist.LoadS1(shape1); + dist.LoadS2(shape2); + dist.Perform(); + } catch (...) { + throw BRepMeasureError(); + } + throwErrorIf(!dist.IsDone()); MeasureDistance distResult; @@ -362,7 +371,8 @@ MeasureDistance MeasureToolBRep::brepMinDistance( } MeasureDistance MeasureToolBRep::brepCenterDistance( - const TopoDS_Shape& shape1, const TopoDS_Shape& shape2) + const TopoDS_Shape& shape1, const TopoDS_Shape& shape2 + ) { throwErrorIf(shape1.IsNull()); throwErrorIf(shape2.IsNull()); @@ -507,8 +517,8 @@ MeasureArea MeasureToolBRep::brepArea(const TopoDS_Shape& shape) const BRepAdaptor_Surface surface(face); areaResult.middlePnt = surface.Value( - (surface.FirstUParameter() + surface.LastUParameter()) / 2., - (surface.FirstVParameter() + surface.LastVParameter()) / 2. + (surface.FirstUParameter() + surface.LastUParameter()) / 2., + (surface.FirstVParameter() + surface.LastVParameter()) / 2. ); } else { diff --git a/tests/test_measure.cpp b/tests/test_measure.cpp index d8f6ea63..b7e57c1d 100644 --- a/tests/test_measure.cpp +++ b/tests/test_measure.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -146,6 +147,18 @@ void TestMeasure::BRepMinDistance_TwoBoxes_test() QCOMPARE(UnitSystem::millimeters(minDist.value).value, minDist.pnt1.Distance(minDist.pnt2)); } +void TestMeasure::BRepMinDistance_TwoConfusedFaces_test() +{ + const TopoDS_Face face1 = BRepBuilderAPI_MakeFace(gp_Pln(gp::XOY())); + const TopoDS_Face face2 = BRepBuilderAPI_MakeFace(gp_Pln(gp::XOY())); + try { + const MeasureDistance minDist = MeasureToolBRep::brepMinDistance(face1, face2); + QCOMPARE(minDist.value.value(), 0.); + } catch (const IMeasureError& err) { + qDebug() << QString::fromUtf8(err.message().data(), err.message().length()); + } +} + void TestMeasure::BRepAngle_TwoLinesIntersect_test() { const TopoDS_Shape shape1 = BRepBuilderAPI_MakeEdge(gp_Lin(gp::Origin(), gp::DX())); diff --git a/tests/test_measure.h b/tests/test_measure.h index 21324679..ea4965a6 100644 --- a/tests/test_measure.h +++ b/tests/test_measure.h @@ -26,6 +26,7 @@ private slots: void BRepMinDistance_TwoPoints_test(); void BRepMinDistance_TwoBoxes_test(); + void BRepMinDistance_TwoConfusedFaces_test(); void BRepAngle_TwoLinesIntersect_test(); void BRepAngle_TwoLinesParallelError_test();