X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_PointDriver.cxx;h=8af5452e656926f7ee8b4e056f7339b0019e7109;hb=25b91b8d9df5a001f75eb1355412124cb85d8d87;hp=accc93779831f70536f256e6681b999134903a69;hpb=392885c1a8d50369708bbe5e6b44033ed8b8ba51;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_PointDriver.cxx b/src/GEOMImpl/GEOMImpl_PointDriver.cxx index accc93779..8af5452e6 100644 --- a/src/GEOMImpl/GEOMImpl_PointDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PointDriver.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -19,6 +19,7 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + #include #include @@ -29,12 +30,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include @@ -62,6 +65,35 @@ GEOMImpl_PointDriver::GEOMImpl_PointDriver() { } +//======================================================================= +//function : getExtremaSolution +//purpose : local function +//======================================================================= +static Standard_Boolean getExtremaSolution +(GEOMImpl_IPoint& thePI, + TopoDS_Shape& theRefShape, + gp_Pnt& thePnt) +{ + gp_Pnt anInitPnt( thePI.GetX(), thePI.GetY(), thePI.GetZ() ); + BRepBuilderAPI_MakeVertex mkVertex (anInitPnt); + TopoDS_Vertex anInitV = TopoDS::Vertex(mkVertex.Shape()); + + BRepExtrema_DistShapeShape anExt( anInitV, theRefShape ); + if ( !anExt.IsDone() || anExt.NbSolution() < 1 ) + return Standard_False; + thePnt = anExt.PointOnShape2(1); + Standard_Real aMinDist2 = anInitPnt.SquareDistance( thePnt ); + for ( Standard_Integer j = 2, jn = anExt.NbSolution(); j <= jn; j++ ) + { + gp_Pnt aPnt = anExt.PointOnShape2(j); + Standard_Real aDist2 = anInitPnt.SquareDistance( aPnt ); + if ( aDist2 > aMinDist2) + continue; + aMinDist2 = aDist2; + thePnt = aPnt; + } + return Standard_True; +} //======================================================================= //function : Execute @@ -76,6 +108,8 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const Standard_Integer aType = aFunction->GetType(); gp_Pnt aPnt; + TopoDS_Compound aCompound; + bool retCompound = false; if (aType == POINT_XYZ) { aPnt = gp_Pnt(aPI.GetX(), aPI.GetY(), aPI.GetZ()); @@ -91,7 +125,6 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const } gp_Pnt P = BRep_Tool::Pnt(TopoDS::Vertex(aRefShape)); aPnt = gp_Pnt(P.X() + aPI.GetX(), P.Y() + aPI.GetY(), P.Z() + aPI.GetZ()); - } else if (aType == POINT_CURVE_PAR) { Handle(GEOM_Function) aRefCurve = aPI.GetCurve(); @@ -105,6 +138,18 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const aP = aFP + (aLP - aFP) * aPI.GetParameter(); aPnt = aCurve->Value(aP); } + else if (aType == POINT_CURVE_COORD) { + Handle(GEOM_Function) aRefCurve = aPI.GetCurve(); + TopoDS_Shape aRefShape = aRefCurve->GetValue(); + if (aRefShape.ShapeType() != TopAbs_EDGE) { + Standard_TypeMismatch::Raise + ("Point On Curve creation aborted : curve shape is not an edge"); + } + if (!getExtremaSolution( aPI, aRefShape, aPnt ) ) { + Standard_ConstructionError::Raise + ("Point On Curve creation aborted : cannot project point"); + } + } else if (aType == POINT_SURFACE_PAR) { Handle(GEOM_Function) aRefCurve = aPI.GetSurface(); TopoDS_Shape aRefShape = aRefCurve->GetValue(); @@ -121,6 +166,18 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const Standard_Real V = V1 + (V2-V1) * aPI.GetParameter2(); aPnt = aSurf->Value(U,V); } + else if (aType == POINT_SURFACE_COORD) { + Handle(GEOM_Function) aRefCurve = aPI.GetSurface(); + TopoDS_Shape aRefShape = aRefCurve->GetValue(); + if (aRefShape.ShapeType() != TopAbs_FACE) { + Standard_TypeMismatch::Raise + ("Point On Surface creation aborted : surface shape is not a face"); + } + if (!getExtremaSolution( aPI, aRefShape, aPnt ) ) { + Standard_ConstructionError::Raise + ("Point On Surface creation aborted : cannot project point"); + } + } else if (aType == POINT_LINES_INTERSECTION) { Handle(GEOM_Function) aRef1 = aPI.GetLine1(); Handle(GEOM_Function) aRef2 = aPI.GetLine2(); @@ -128,33 +185,50 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const TopoDS_Shape aRefShape1 = aRef1->GetValue(); TopoDS_Shape aRefShape2 = aRef2->GetValue(); - if (aRefShape1.ShapeType() != TopAbs_EDGE || aRefShape2.ShapeType() != TopAbs_EDGE ) { + if ( (aRefShape1.ShapeType() != TopAbs_EDGE && aRefShape1.ShapeType() != TopAbs_WIRE) + || (aRefShape2.ShapeType() != TopAbs_EDGE && aRefShape2.ShapeType() != TopAbs_WIRE) ) { Standard_TypeMismatch::Raise - ("Creation Point On Lines Intersection Aborted : Line shape is not an edge"); + ("Creation Point On Lines Intersection Aborted : Line shape is not an edge or wire"); } + + if (aRefShape1.IsSame(aRefShape2)) + Standard_ConstructionError::Raise("The lines to make intersection must be different"); + //Calculate Lines Intersection Point BRepExtrema_DistShapeShape dst (aRefShape1, aRefShape2); - if (dst.IsDone()) - { - gp_Pnt P1, P2; - for (int i = 1; i <= dst.NbSolution(); i++) { - P1 = dst.PointOnShape1(i); - P2 = dst.PointOnShape2(i); - Standard_Real Dist = P1.Distance(P2); - if ( Dist <= Precision::Confusion() ) - aPnt = P1; - else - Standard_TypeMismatch::Raise ("Lines not have an Intersection Point"); - } + if (dst.IsDone()) { + gp_Pnt P1, P2; + BRep_Builder B; + B.MakeCompound( aCompound ); + for (int i = 1; i <= dst.NbSolution(); i++) { + P1 = dst.PointOnShape1(i); + P2 = dst.PointOnShape2(i); + Standard_Real Dist = P1.Distance(P2); + if ( Dist <= Precision::Confusion() && dst.NbSolution() > 1) { + BRepBuilderAPI_MakeVertex mkVertex (P1); + B.Add(aCompound, mkVertex.Shape()); + retCompound = true; + } else if ( Dist <= Precision::Confusion() ) { + aPnt = P1; + } else { + Standard_TypeMismatch::Raise ("Shapes have not an Intersection Point"); + } } + } } else { return 0; } - BRepBuilderAPI_MakeVertex mkVertex (aPnt); - TopoDS_Shape aShape = mkVertex.Shape(); - aShape.Infinite(Standard_True); + TopoDS_Shape aShape; + if ( retCompound ) { + aShape = aCompound; + } else { + BRepBuilderAPI_MakeVertex mkVertex (aPnt); + aShape = mkVertex.Shape(); + } + + //aShape.Infinite(Standard_True); // VSR: 05/04/2010: Fix 20668 (Fit All for points & lines) aFunction->SetValue(aShape); log.SetTouched(Label()); @@ -180,10 +254,10 @@ Standard_EXPORT Handle_Standard_Type& GEOMImpl_PointDriver_Type_() static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PointDriver", - sizeof(GEOMImpl_PointDriver), - 1, - (Standard_Address)_Ancestors, - (Standard_Address)NULL); + sizeof(GEOMImpl_PointDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); return _aType; } @@ -205,5 +279,3 @@ const Handle(GEOMImpl_PointDriver) Handle(GEOMImpl_PointDriver)::DownCast(const return _anOtherObject ; } - -