X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_PlaneDriver.cxx;h=54dd73686ec40b67d00e5cc31fa338d5526b2791;hb=32e56a241f21859130edcfcc7a9d9c452c8d00d4;hp=510d7a291627ced379ae462366183c84d5e5985a;hpb=d3dd282390888d7dc091ba2c2ffe7923bd7458e6;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_PlaneDriver.cxx b/src/GEOMImpl/GEOMImpl_PlaneDriver.cxx index 510d7a291..54dd73686 100644 --- a/src/GEOMImpl/GEOMImpl_PlaneDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PlaneDriver.cxx @@ -1,12 +1,39 @@ +// 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 +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// -using namespace std; -#include "GEOMImpl_PlaneDriver.hxx" -#include "GEOMImpl_IPlane.hxx" -#include "GEOMImpl_Types.hxx" -#include "GEOM_Function.hxx" +#include +#include +#include +#include +#include + +#include + +// OCCT Includes #include #include +#include +#include #include #include @@ -22,6 +49,8 @@ using namespace std; #include #include #include +#include +#include #include #include @@ -29,29 +58,29 @@ using namespace std; //======================================================================= //function : GetID //purpose : -//======================================================================= +//======================================================================= const Standard_GUID& GEOMImpl_PlaneDriver::GetID() { static Standard_GUID aPlaneDriver("FF1BBB05-5D14-4df2-980B-3A668264EA16"); - return aPlaneDriver; + return aPlaneDriver; } //======================================================================= //function : GEOMImpl_PlaneDriver -//purpose : +//purpose : //======================================================================= -GEOMImpl_PlaneDriver::GEOMImpl_PlaneDriver() +GEOMImpl_PlaneDriver::GEOMImpl_PlaneDriver() { } //======================================================================= //function : Execute //purpose : -//======================================================================= +//======================================================================= Standard_Integer GEOMImpl_PlaneDriver::Execute(TFunction_Logbook& log) const { - if (Label().IsNull()) return 0; + if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); GEOMImpl_IPlane aPI (aFunction); @@ -100,20 +129,112 @@ Standard_Integer GEOMImpl_PlaneDriver::Execute(TFunction_Logbook& log) const } else if (aType == PLANE_FACE) { Handle(GEOM_Function) aRef = aPI.GetFace(); TopoDS_Shape aRefShape = aRef->GetValue(); - if (aRefShape.ShapeType() != TopAbs_FACE) return 0; - Handle(Geom_Surface) aGS = BRep_Tool::Surface(TopoDS::Face(aRefShape)); - if (!aGS->IsKind(STANDARD_TYPE(Geom_Plane))) { - Standard_TypeMismatch::Raise("Plane creation aborted: non-planar face given as argument"); + //if (aRefShape.ShapeType() != TopAbs_FACE) return 0; + //Handle(Geom_Surface) aGS = BRep_Tool::Surface(TopoDS::Face(aRefShape)); + //if (!aGS->IsKind(STANDARD_TYPE(Geom_Plane))) { + // Standard_TypeMismatch::Raise("Plane creation aborted: non-planar face given as argument"); + //} + //aShape = BRepBuilderAPI_MakeFace(aGS, -aSize, +aSize, -aSize, +aSize).Shape(); + gp_Ax3 anAx3 = GEOMImpl_IMeasureOperations::GetPosition(aRefShape); + gp_Pln aPln (anAx3); + aShape = BRepBuilderAPI_MakeFace(aPln, -aSize, +aSize, -aSize, +aSize).Shape(); + } + else if (aType == PLANE_TANGENT_FACE) + { + Handle(GEOM_Function) aRefFace = aPI.GetFace(); + TopoDS_Shape aShape1 = aRefFace->GetValue(); + if(aShape1.IsNull()) + Standard_TypeMismatch::Raise("Plane was not created.Basis face was not specified"); + TopoDS_Face aFace = TopoDS::Face(aShape1); + + Standard_Real aKoefU = aPI.GetParameterU(); + Standard_Real aKoefV = aPI.GetParameterV(); + Standard_Real aUmin,aUmax,aVmin,aVmax; + ShapeAnalysis::GetFaceUVBounds(aFace,aUmin,aUmax,aVmin,aVmax); + Standard_Real aDeltaU = aUmax - aUmin; + Standard_Real aDeltaV = aVmax - aVmin; + Standard_Real aParamU = aUmin + aDeltaU*aKoefU; + Standard_Real aParamV = aVmin + aDeltaV*aKoefV; + Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace); + if(aSurf.IsNull()) + Standard_TypeMismatch::Raise("Plane was not created.Base surface is absent"); + gp_Vec aVecU,aVecV; + gp_Pnt aPLoc; + aSurf->D1(aParamU,aParamV,aPLoc,aVecU,aVecV); + BRepTopAdaptor_FClass2d clas(aFace,Precision::PConfusion()); + + TopAbs_State stOut= clas.PerformInfinitePoint(); + gp_Pnt2d aP2d(aParamU,aParamV); + TopAbs_State st= clas.Perform(aP2d); + if(st == stOut) + Standard_TypeMismatch::Raise("Plane was not created.Point lies outside the face"); + gp_Vec aNorm = aVecU^aVecV; + gp_Ax3 anAxis(aPLoc,gp_Dir(aNorm),gp_Dir(aVecU)); + gp_Pln aPlane(anAxis); + BRepBuilderAPI_MakeFace aTool(aPlane, -aSize, +aSize, -aSize, +aSize); + if(aTool.IsDone()) + aShape = aTool.Shape(); + } + else if (aType == PLANE_2_VEC) { + Handle(GEOM_Function) aRefVec1 = aPI.GetVector1(); + Handle(GEOM_Function) aRefVec2 = aPI.GetVector2(); + TopoDS_Shape aShape1 = aRefVec1->GetValue(); + TopoDS_Shape aShape2 = aRefVec2->GetValue(); + if (aShape1.ShapeType() != TopAbs_EDGE || + aShape2.ShapeType() != TopAbs_EDGE) return 0; + TopoDS_Edge aVectX = TopoDS::Edge(aShape1); + TopoDS_Edge aVectZ = TopoDS::Edge(aShape2); + + TopoDS_Vertex VX1, VX2, VZ1, VZ2; + TopExp::Vertices( aVectX, VX1, VX2, Standard_True ); + TopExp::Vertices( aVectZ, VZ1, VZ2, Standard_True ); + + gp_Vec aVX = gp_Vec( BRep_Tool::Pnt( VX1 ), BRep_Tool::Pnt( VX2 ) ); + gp_Vec aVZ = gp_Vec( BRep_Tool::Pnt( VZ1 ), BRep_Tool::Pnt( VZ2 ) ); + + if ( aVX.Magnitude() < Precision::Confusion() || aVZ.Magnitude() < Precision::Confusion()) + Standard_TypeMismatch::Raise("Invalid vector selected"); + + gp_Dir aDirX = gp_Dir( aVX.X(), aVX.Y(), aVX.Z() ); + gp_Dir aDirZ = gp_Dir( aVZ.X(), aVZ.Y(), aVZ.Z() ); + + if ( aDirX.IsParallel( aDirZ, Precision::Angular() ) ) + Standard_TypeMismatch::Raise("Parallel vectors selected"); + + gp_Ax3 aPlane = gp_Ax3( BRep_Tool::Pnt( VX1 ), aDirZ, aDirX ); + BRepBuilderAPI_MakeFace aTool(aPlane, -aSize, +aSize, -aSize, +aSize); + if(aTool.IsDone()) + aShape = aTool.Shape(); + } else if (aType == PLANE_LCS) { + Handle(GEOM_Function) aRef = aPI.GetLCS(); + double anOrientation = aPI.GetOrientation(); + gp_Ax3 anAx3; + if (aRef.IsNull()) { + gp_Ax2 anAx2 = gp::XOY(); + anAx3 = gp_Ax3( anAx2 ); + } else { + TopoDS_Shape aRefShape = aRef->GetValue(); + if (aRefShape.ShapeType() != TopAbs_FACE) + return 0; + anAx3 = GEOMImpl_IMeasureOperations::GetPosition(aRefShape); } - aShape = BRepBuilderAPI_MakeFace(aGS, -aSize, +aSize, -aSize, +aSize).Shape(); - } else { + + if ( anOrientation == 2) + anAx3 = gp_Ax3(anAx3.Location(), anAx3.XDirection(), anAx3.YDirection() ); + else if ( anOrientation == 3 ) + anAx3 = gp_Ax3(anAx3.Location(), anAx3.YDirection(), anAx3.XDirection() ); + + gp_Pln aPln(anAx3); + aShape = BRepBuilderAPI_MakeFace(aPln, -aSize, +aSize, -aSize, +aSize).Shape(); + } + else { } if (aShape.IsNull()) return 0; aFunction->SetValue(aShape); - log.SetTouched(Label()); + log.SetTouched(Label()); return 1; } @@ -122,24 +243,24 @@ Standard_Integer GEOMImpl_PlaneDriver::Execute(TFunction_Logbook& log) const //======================================================================= //function : GEOMImpl_PlaneDriver_Type_ //purpose : -//======================================================================= +//======================================================================= Standard_EXPORT Handle_Standard_Type& GEOMImpl_PlaneDriver_Type_() { static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); - if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); - + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PlaneDriver", - sizeof(GEOMImpl_PlaneDriver), - 1, - (Standard_Address)_Ancestors, - (Standard_Address)NULL); + sizeof(GEOMImpl_PlaneDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); return _aType; } @@ -147,7 +268,7 @@ Standard_EXPORT Handle_Standard_Type& GEOMImpl_PlaneDriver_Type_() //======================================================================= //function : DownCast //purpose : -//======================================================================= +//======================================================================= const Handle(GEOMImpl_PlaneDriver) Handle(GEOMImpl_PlaneDriver)::DownCast (const Handle(Standard_Transient)& AnObject) {