From: akl Date: Mon, 29 Sep 2008 07:20:49 +0000 (+0000) Subject: To implement issue 0019962: MakePipeBiNormalAlongAxis implementation. X-Git-Tag: V5_1_0a2~5 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=dc0102b3ab0ff8a529af04d910892bc7bea8d592;p=modules%2Fgeom.git To implement issue 0019962: MakePipeBiNormalAlongAxis implementation. --- diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 6220952c2..0cf8d8573 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -1107,6 +1107,22 @@ module GEOM */ GEOM_Object MakePipeShellsWithoutPath (in ListOfGO theSeqBases, in ListOfGO theLocations); + + /*! + * Create a shape by extrusion of the base shape along + * the path shape with constant bi-normal direction along the given vector. + * The path shape can be a wire or an edge. + * \param theBase Base shape to be extruded. + * \param thePath Path shape to extrude the base shape along it. + * \param theVec Vector defines a constant binormal direction to keep the + * same angle beetween the Direction and the sections + * along the sweep surface. + * \return New GEOM_Object, containing the created pipe. + */ + GEOM_Object MakePipeBiNormalAlongVector (in GEOM_Object theBase, + in GEOM_Object thePath, + in GEOM_Object theVec); + }; /*! diff --git a/idl/GEOM_Superv.idl b/idl/GEOM_Superv.idl index 0c1b2252d..5ca45ef11 100644 --- a/idl/GEOM_Superv.idl +++ b/idl/GEOM_Superv.idl @@ -212,6 +212,10 @@ module GEOM GEOM_Object MakePipeShellsWithoutPath (in ListOfGO theSeqBases, in ListOfGO theLocations ); + GEOM_Object MakePipeBiNormalAlongVector (in GEOM_Object theBase, + in GEOM_Object thePath, + in GEOM_Object theVec); + //-----------------------------------------------------------// // BooleanOperations // //-----------------------------------------------------------// diff --git a/resources/Makefile.am b/resources/Makefile.am index 8a5787ddf..bce407e4a 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -110,6 +110,7 @@ partition.png \ partitionkeep.png \ partitionplane.png \ pipe.png \ +pipebinormal.png \ plane.png \ planeWorking.png \ plane3points.png \ diff --git a/resources/pipebinormal.png b/resources/pipebinormal.png new file mode 100644 index 000000000..bc83f8d80 Binary files /dev/null and b/resources/pipebinormal.png differ diff --git a/src/GEOMGUI/GEOM_images.ts b/src/GEOMGUI/GEOM_images.ts index 8f5801fd1..ddeb05af5 100644 --- a/src/GEOMGUI/GEOM_images.ts +++ b/src/GEOMGUI/GEOM_images.ts @@ -306,6 +306,10 @@ ICON_DLG_PIPE pipe.png + + ICON_DLG_PIPE_BINORMAL + pipebinormal.png + ICON_DLG_PLANE_3PNTS plane3points.png diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx index 983974343..77c960320 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx @@ -64,6 +64,7 @@ #include #include #include +#include #include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC @@ -2122,3 +2123,64 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeShellsWithoutPath( } + +//============================================================================= +/*! + * MakePipeBiNormalAlongVector + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeBiNormalAlongVector (Handle(GEOM_Object) theBase, + Handle(GEOM_Object) thePath, + Handle(GEOM_Object) theVec) +{ + SetErrorCode(KO); + + if (theBase.IsNull() || thePath.IsNull() || theVec.IsNull()) return NULL; + + //Add a new Pipe object + Handle(GEOM_Object) aPipe = GetEngine()->AddObject(GetDocID(), GEOM_PIPE); + + //Add a new Pipe function + Handle(GEOM_Function) aFunction = + aPipe->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_BI_NORMAL_ALONG_VECTOR); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return NULL; + + GEOMImpl_IPipeBiNormal aCI (aFunction); + + Handle(GEOM_Function) aRefBase = theBase->GetLastFunction(); + Handle(GEOM_Function) aRefPath = thePath->GetLastFunction(); + Handle(GEOM_Function) aRefVec = theVec->GetLastFunction(); + + if (aRefBase.IsNull() || aRefPath.IsNull() || aRefVec.IsNull()) return NULL; + + aCI.SetBase(aRefBase); + aCI.SetPath(aRefPath); + aCI.SetVector(aRefVec); + + //Compute the Pipe value + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Pipe driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aPipe << " = geompy.MakePipeBiNormalAlongVector(" + << theBase << ", " << thePath << ", " << theVec << ")"; + + SetErrorCode(OK); + return aPipe; +} + diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx index 5099605fc..77bbe19a0 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx @@ -124,6 +124,10 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations { const Handle(TColStd_HSequenceOfTransient)& theBases, const Handle(TColStd_HSequenceOfTransient)& theLocations); + Standard_EXPORT Handle(GEOM_Object) MakePipeBiNormalAlongVector (Handle(GEOM_Object) theBase, + Handle(GEOM_Object) thePath, + Handle(GEOM_Object) theVec); + }; #endif diff --git a/src/GEOMImpl/GEOMImpl_IPipeBiNormal.hxx b/src/GEOMImpl/GEOMImpl_IPipeBiNormal.hxx new file mode 100644 index 000000000..38d62fa2e --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IPipeBiNormal.hxx @@ -0,0 +1,47 @@ +// Copyright (C) 2005 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 +// +//NOTE: This is an interface to a function for the Pipe creation. + +#ifndef _GEOMImpl_IPIPEBINORMAL_HXX_ +#define _GEOMImpl_IPIPEBINORMAL_HXX_ + +#include "GEOM_Function.hxx" + +#ifndef _GEOMImpl_IPIPE_HXX_ +#include "GEOMImpl_IPipe.hxx" +#endif + +#define PIPE_ARG_BASE 1 +#define PIPE_ARG_PATH 2 +#define PIPE_ARG_VEC 3 + +class GEOMImpl_IPipeBiNormal : public GEOMImpl_IPipe +{ + public: + + GEOMImpl_IPipeBiNormal(Handle(GEOM_Function)& theFunction):GEOMImpl_IPipe(theFunction) {} + + void SetVector(Handle(GEOM_Function) theVec) { _func->SetReference(PIPE_ARG_VEC, theVec); } + + Handle(GEOM_Function) GetVector() { return _func->GetReference(PIPE_ARG_VEC); } + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx index 41aec4758..f93e069ad 100644 --- a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -1851,6 +1852,72 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) } +//======================================================================= +//function : CreatePipeBiNormalAlongVector +//purpose : auxilary for Execute() +//======================================================================= +static TopoDS_Shape CreatePipeBiNormalAlongVector(const TopoDS_Wire& aWirePath, + GEOMImpl_IPipe* aCI) +{ + GEOMImpl_IPipeBiNormal* aCIBN = (GEOMImpl_IPipeBiNormal*)aCI; + + Handle(GEOM_Function) aRefBase = aCIBN->GetBase(); + Handle(GEOM_Function) aRefVec = aCIBN->GetVector(); + TopoDS_Shape aShapeBase = aRefBase->GetValue(); + TopoDS_Shape aShapeVec = aRefVec->GetValue(); + + if (aShapeBase.IsNull()) { + if(aCIBN) delete aCIBN; + Standard_NullObject::Raise("MakePipe aborted : null base argument"); + } + + TopoDS_Shape aProf; + if( aShapeBase.ShapeType() == TopAbs_VERTEX ) { + aProf = aShapeBase; + } + else if( aShapeBase.ShapeType() == TopAbs_EDGE) { + aProf = BRepBuilderAPI_MakeWire(TopoDS::Edge(aShapeBase)).Shape(); + } + else if( aShapeBase.ShapeType() == TopAbs_WIRE) { + aProf = aShapeBase; + } + else if( aShapeBase.ShapeType() == TopAbs_FACE) { + TopExp_Explorer wexp(aShapeBase,TopAbs_WIRE); + aProf = wexp.Current(); + } + else { + Standard_TypeMismatch::Raise + ("MakePipe aborted : invalid type of base"); + } + BRepOffsetAPI_MakePipeShell PipeBuilder(aWirePath); + PipeBuilder.Add(aProf); + + if (aShapeVec.IsNull()) { + if(aCIBN) delete aCIBN; + Standard_NullObject::Raise + ("MakePipe aborted : null vector argument"); + } + if (aShapeVec.ShapeType() != TopAbs_EDGE) + Standard_TypeMismatch::Raise + ("MakePipe aborted: invalid type of vector"); + TopoDS_Edge anEdge = TopoDS::Edge(aShapeVec); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anEdge, V1, V2, Standard_True); + if (V1.IsNull() || V2.IsNull()) + Standard_NullObject::Raise + ("MakePipe aborted: vector is not defined"); + gp_Vec aVec(BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + gp_Dir BiNormal(aVec); + PipeBuilder.SetMode(BiNormal); + PipeBuilder.Build(); + if( aShapeBase.ShapeType() == TopAbs_FACE) { + PipeBuilder.MakeSolid(); + } + + return PipeBuilder.Shape(); +} + + //======================================================================= //function : Execute //purpose : @@ -1870,6 +1937,8 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const aCI = new GEOMImpl_IPipeShellSect(aFunction); else if(aType == PIPE_SHELLS_WITHOUT_PATH) aCI = new GEOMImpl_IPipeShellSect(aFunction); + else if(aType == PIPE_BI_NORMAL_ALONG_VECTOR) + aCI = new GEOMImpl_IPipeBiNormal(aFunction); else return 0; @@ -2293,6 +2362,11 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const aShape = CreatePipeShellsWithoutPath(aCI); } + //building a pipe with constant bi-normal along given vector + else if (aType == PIPE_BI_NORMAL_ALONG_VECTOR) { + aShape = CreatePipeBiNormalAlongVector(aWirePath, aCI); + } + if (aCI) { delete aCI; aCI = 0; diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 4220d7488..56bdc81e4 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -188,6 +188,7 @@ #define PIPE_DIFFERENT_SECTIONS 2 #define PIPE_SHELL_SECTIONS 3 #define PIPE_SHELLS_WITHOUT_PATH 4 +#define PIPE_BI_NORMAL_ALONG_VECTOR 5 #define THRUSECTIONS_RULED 1 #define THRUSECTIONS_SMOOTHED 2 diff --git a/src/GEOMImpl/Makefile.am b/src/GEOMImpl/Makefile.am index 8bd5c417e..b0113b6ca 100644 --- a/src/GEOMImpl/Makefile.am +++ b/src/GEOMImpl/Makefile.am @@ -92,6 +92,7 @@ salomeinclude_HEADERS = \ GEOMImpl_IPartition.hxx \ GEOMImpl_IPipeDiffSect.hxx \ GEOMImpl_IPipeShellSect.hxx \ + GEOMImpl_IPipeBiNormal.hxx \ GEOMImpl_VectorDriver.hxx \ GEOMImpl_LineDriver.hxx \ GEOMImpl_DiskDriver.hxx \