diff --git a/src/GEOMImpl/GEOMImpl_ShapeProximityDriver.cxx b/src/GEOMImpl/GEOMImpl_ShapeProximityDriver.cxx index 7ee771171..58bb409dd 100644 --- a/src/GEOMImpl/GEOMImpl_ShapeProximityDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ShapeProximityDriver.cxx @@ -274,157 +274,161 @@ const Standard_GUID& GEOMImpl_ShapeProximityDriver::GetID() //======================================================================= Standard_Integer GEOMImpl_ShapeProximityDriver::Execute(Handle(TFunction_Logbook)& log) const { - // if (Label().IsNull()) - // return 0; +#ifndef __EMSCRIPTEN__ // BRepExtrema_ProximityDistTool not compiled as part of OCCT - // Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); - // GEOMImpl_IProximity aProximity (aFunction); + if (Label().IsNull()) + return 0; - // Handle(GEOM_Function) aShapeFunc1, aShapeFunc2; - // aProximity.GetShapes(aShapeFunc1, aShapeFunc2); - // if (aShapeFunc1.IsNull() || aShapeFunc2.IsNull()) - // return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + GEOMImpl_IProximity aProximity (aFunction); - // TopoDS_Shape aShape1 = aShapeFunc1->GetValue(); - // TopoDS_Shape aShape2 = aShapeFunc2->GetValue(); + Handle(GEOM_Function) aShapeFunc1, aShapeFunc2; + aProximity.GetShapes(aShapeFunc1, aShapeFunc2); + if (aShapeFunc1.IsNull() || aShapeFunc2.IsNull()) + return 0; - // Standard_Real aValue = -1.0; + TopoDS_Shape aShape1 = aShapeFunc1->GetValue(); + TopoDS_Shape aShape2 = aShapeFunc2->GetValue(); - // if (aFunction->GetType() == PROXIMITY_COARSE) - // { - // // tessellate shapes if there is no mesh exists - // tessellateShape(aShape1); - // tessellateShape(aShape2); + Standard_Real aValue = -1.0; - // // compute proximity basing on the tessellation - // BRepExtrema_ShapeProximity aCalcProx; - // aCalcProx.LoadShape1(aShape1); - // aCalcProx.LoadShape2(aShape2); - // aCalcProx.SetNbSamples1(aProximity.GetNbSamples(PROXIMITY_ARG_SAMPLES1)); - // aCalcProx.SetNbSamples2(aProximity.GetNbSamples(PROXIMITY_ARG_SAMPLES2)); - // aCalcProx.Perform(); + if (aFunction->GetType() == PROXIMITY_COARSE) + { + // tessellate shapes if there is no mesh exists + tessellateShape(aShape1); + tessellateShape(aShape2); - // if (aCalcProx.IsDone()) - // { - // aValue = aCalcProx.Proximity(); - // aProximity.SetProximityPoints(aCalcProx.ProximityPoint1(), - // aCalcProx.ProximityPoint2()); - // aProximity.SetStatusOfPoints((Standard_Integer)aCalcProx.ProxPntStatus1(), - // (Standard_Integer)aCalcProx.ProxPntStatus2()); - // } - // else - // Standard_ConstructionError::Raise("Failed to compute coarse proximity"); - // } - // else if (aFunction->GetType() == PROXIMITY_PRECISE) - // { - // // coarse proximity value - // // in some cases this value cannot be precised - // // it can be precised only if at least one point is in the middle of the shape - // aValue = aProximity.GetValue(); + // compute proximity basing on the tessellation + BRepExtrema_ShapeProximity aCalcProx; + aCalcProx.LoadShape1(aShape1); + aCalcProx.LoadShape2(aShape2); + aCalcProx.SetNbSamples1(aProximity.GetNbSamples(PROXIMITY_ARG_SAMPLES1)); + aCalcProx.SetNbSamples2(aProximity.GetNbSamples(PROXIMITY_ARG_SAMPLES2)); + aCalcProx.Perform(); - // TopAbs_ShapeEnum aType1 = aShape1.ShapeType(); - // TopAbs_ShapeEnum aType2 = aShape2.ShapeType(); + if (aCalcProx.IsDone()) + { + aValue = aCalcProx.Proximity(); + aProximity.SetProximityPoints(aCalcProx.ProximityPoint1(), + aCalcProx.ProximityPoint2()); + aProximity.SetStatusOfPoints((Standard_Integer)aCalcProx.ProxPntStatus1(), + (Standard_Integer)aCalcProx.ProxPntStatus2()); + } + else + Standard_ConstructionError::Raise("Failed to compute coarse proximity"); + } + else if (aFunction->GetType() == PROXIMITY_PRECISE) + { + // coarse proximity value + // in some cases this value cannot be precised + // it can be precised only if at least one point is in the middle of the shape + aValue = aProximity.GetValue(); - // gp_Pnt aPnt1, aPnt2; - // BRepExtrema_ProximityDistTool::ProxPnt_Status aStatus1, aStatus2; - // Standard_Integer intStatus1, intStatus2; - // aProximity.GetProximityPoints(aPnt1, aPnt2); - // aProximity.GetStatusOfPoints(intStatus1, intStatus2); - // aStatus1 = (BRepExtrema_ProximityDistTool::ProxPnt_Status)intStatus1; - // aStatus2 = (BRepExtrema_ProximityDistTool::ProxPnt_Status)intStatus2; + TopAbs_ShapeEnum aType1 = aShape1.ShapeType(); + TopAbs_ShapeEnum aType2 = aShape2.ShapeType(); - // if (aType1 == TopAbs_EDGE) - // { - // if (aType2 == TopAbs_EDGE) - // { - // if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && - // aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) - // { - // aValue = extremaEE(TopoDS::Edge(aShape1), TopoDS::Edge(aShape2), aPnt1, aPnt2); - // } - // else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER && - // aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) - // { - // aValue = extremaPE(aPnt1, TopoDS::Edge(aShape2), aPnt2); - // } - // else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && - // aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER) - // { - // aValue = extremaPE(aPnt2, TopoDS::Edge(aShape1), aPnt1); - // } - // } - // else if (aType2 == TopAbs_FACE) - // { - // if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && - // aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) - // { - // aValue = extremaEF(TopoDS::Edge(aShape1), TopoDS::Face(aShape2), aPnt1, aPnt2); - // } - // else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER && - // aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) - // { - // aValue = extremaPF(aPnt1, TopoDS::Face(aShape2), aPnt2); - // } - // else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && - // aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER) - // { - // aValue = extremaPE(aPnt2, TopoDS::Edge(aShape1), aPnt1); - // } - // } - // } - // else if (aType1 == TopAbs_FACE) - // { - // if (aType2 == TopAbs_EDGE) - // { - // if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && - // aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) - // { - // aValue = extremaEF(TopoDS::Edge(aShape2), TopoDS::Face(aShape1), aPnt2, aPnt1); - // } - // else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER && - // aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) - // { - // aValue = extremaPE(aPnt1, TopoDS::Edge(aShape2), aPnt2); - // } - // else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && - // aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER) - // { - // aValue = extremaPF(aPnt2, TopoDS::Face(aShape1), aPnt1); - // } - // } - // else if (aType2 == TopAbs_FACE) - // { - // if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && - // aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) - // { - // aValue = extremaFF(TopoDS::Face(aShape1), TopoDS::Face(aShape2), aPnt1, aPnt2); - // } - // else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER && - // aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) - // { - // aValue = extremaPF(aPnt1, TopoDS::Face(aShape2), aPnt2); - // } - // else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && - // aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER) - // { - // aValue = extremaPF(aPnt2, TopoDS::Face(aShape1), aPnt1); - // } - // } - // } + gp_Pnt aPnt1, aPnt2; + BRepExtrema_ProximityDistTool::ProxPnt_Status aStatus1, aStatus2; + Standard_Integer intStatus1, intStatus2; + aProximity.GetProximityPoints(aPnt1, aPnt2); + aProximity.GetStatusOfPoints(intStatus1, intStatus2); + aStatus1 = (BRepExtrema_ProximityDistTool::ProxPnt_Status)intStatus1; + aStatus2 = (BRepExtrema_ProximityDistTool::ProxPnt_Status)intStatus2; - // if (aValue >= 0) - // aProximity.SetProximityPoints(aPnt1, aPnt2); - // else - // Standard_ConstructionError::Raise("Failed to compute precise proximity"); - // } - // else - // { - // Standard_ConstructionError::Raise("incorrect algorithm"); - // } + if (aType1 == TopAbs_EDGE) + { + if (aType2 == TopAbs_EDGE) + { + if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && + aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) + { + aValue = extremaEE(TopoDS::Edge(aShape1), TopoDS::Edge(aShape2), aPnt1, aPnt2); + } + else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER && + aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) + { + aValue = extremaPE(aPnt1, TopoDS::Edge(aShape2), aPnt2); + } + else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && + aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER) + { + aValue = extremaPE(aPnt2, TopoDS::Edge(aShape1), aPnt1); + } + } + else if (aType2 == TopAbs_FACE) + { + if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && + aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) + { + aValue = extremaEF(TopoDS::Edge(aShape1), TopoDS::Face(aShape2), aPnt1, aPnt2); + } + else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER && + aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) + { + aValue = extremaPF(aPnt1, TopoDS::Face(aShape2), aPnt2); + } + else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && + aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER) + { + aValue = extremaPE(aPnt2, TopoDS::Edge(aShape1), aPnt1); + } + } + } + else if (aType1 == TopAbs_FACE) + { + if (aType2 == TopAbs_EDGE) + { + if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && + aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) + { + aValue = extremaEF(TopoDS::Edge(aShape2), TopoDS::Face(aShape1), aPnt2, aPnt1); + } + else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER && + aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) + { + aValue = extremaPE(aPnt1, TopoDS::Edge(aShape2), aPnt2); + } + else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && + aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER) + { + aValue = extremaPF(aPnt2, TopoDS::Face(aShape1), aPnt1); + } + } + else if (aType2 == TopAbs_FACE) + { + if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && + aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) + { + aValue = extremaFF(TopoDS::Face(aShape1), TopoDS::Face(aShape2), aPnt1, aPnt2); + } + else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER && + aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE) + { + aValue = extremaPF(aPnt1, TopoDS::Face(aShape2), aPnt2); + } + else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE && + aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER) + { + aValue = extremaPF(aPnt2, TopoDS::Face(aShape1), aPnt1); + } + } + } + if (aValue >= 0) + aProximity.SetProximityPoints(aPnt1, aPnt2); + else + Standard_ConstructionError::Raise("Failed to compute precise proximity"); + } + else + { + Standard_ConstructionError::Raise("incorrect algorithm"); + } - // aProximity.SetValue(aValue); - // log->SetTouched(Label()); + aProximity.SetValue(aValue); + log->SetTouched(Label()); return 1; +#else + return 0; +#endif } //=======================================================================