X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_I3DPrimOperations.cxx;h=d9f441df9c69935f268aafa473ad9167152583b3;hb=d3582bad2ba00bbf625d06e8cfbff999d7c38880;hp=f4139be062cb7586fd18a61042a68a30ab94a6d3;hpb=8f2784ea72ee75d3f2574590031abee1db7565f1;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx index f4139be06..d9f441df9 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 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 @@ -22,17 +22,13 @@ #include -#include - #include #include "utilities.h" -#include #include #include #include -#include #include #include @@ -61,6 +57,7 @@ #include #include #include +#include #include #include #include @@ -75,6 +72,7 @@ #include #include +#include #include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC @@ -84,10 +82,11 @@ * constructor: */ //============================================================================= -GEOMImpl_I3DPrimOperations::GEOMImpl_I3DPrimOperations (GEOM_Engine* theEngine, int theDocID) -: GEOM_IOperations(theEngine, theDocID) +GEOMImpl_I3DPrimOperations::GEOMImpl_I3DPrimOperations (GEOM_Engine* theEngine) +: GEOM_IOperations(theEngine) { MESSAGE("GEOMImpl_I3DPrimOperations::GEOMImpl_I3DPrimOperations"); + myGroupOperations = new GEOMImpl_IGroupOperations(GetEngine()); } //============================================================================= @@ -98,6 +97,7 @@ GEOMImpl_I3DPrimOperations::GEOMImpl_I3DPrimOperations (GEOM_Engine* theEngine, GEOMImpl_I3DPrimOperations::~GEOMImpl_I3DPrimOperations() { MESSAGE("GEOMImpl_I3DPrimOperations::~GEOMImpl_I3DPrimOperations"); + delete myGroupOperations; } @@ -111,7 +111,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeBoxDXDYDZ (double theDX, dou SetErrorCode(KO); //Add a new Box object - Handle(GEOM_Object) aBox = GetEngine()->AddObject(GetDocID(), GEOM_BOX); + Handle(GEOM_Object) aBox = GetEngine()->AddObject(GEOM_BOX); //Add a new Box function with DX_DY_DZ parameters Handle(GEOM_Function) aFunction = aBox->AddFunction(GEOMImpl_BoxDriver::GetID(), BOX_DX_DY_DZ); @@ -128,17 +128,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeBoxDXDYDZ (double theDX, dou //Compute the box value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Box driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -164,7 +161,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeBoxTwoPnt (Handle(GEOM_Objec if (thePnt1.IsNull() || thePnt2.IsNull()) return NULL; //Add a new Box object - Handle(GEOM_Object) aBox = GetEngine()->AddObject(GetDocID(), GEOM_BOX); + Handle(GEOM_Object) aBox = GetEngine()->AddObject(GEOM_BOX); //Add a new Box function for creation a box relatively to two points Handle(GEOM_Function) aFunction = aBox->AddFunction(GEOMImpl_BoxDriver::GetID(), BOX_TWO_PNT); @@ -185,17 +182,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeBoxTwoPnt (Handle(GEOM_Objec //Compute the Box value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Box driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -219,7 +213,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFaceHW (double theH, double if (theH == 0 || theW == 0) return NULL; //Add a new Face object - Handle(GEOM_Object) aFace = GetEngine()->AddObject(GetDocID(), GEOM_FACE); + Handle(GEOM_Object) aFace = GetEngine()->AddObject(GEOM_FACE); //Add a new Box function for creation a box relatively to two points Handle(GEOM_Function) aFunction = aFace->AddFunction(GEOMImpl_FaceDriver::GetID(), FACE_H_W); @@ -236,17 +230,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFaceHW (double theH, double //Compute the Face try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Face driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -271,7 +262,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFaceObjHW (Handle(GEOM_Objec if (theObj.IsNull()) return NULL; //Add a new Face object - Handle(GEOM_Object) aFace = GetEngine()->AddObject(GetDocID(), GEOM_FACE); + Handle(GEOM_Object) aFace = GetEngine()->AddObject(GEOM_FACE); //Add a new Box function for creation a box relatively to two points Handle(GEOM_Function) aFunction = aFace->AddFunction(GEOMImpl_FaceDriver::GetID(), FACE_OBJ_H_W); @@ -293,17 +284,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFaceObjHW (Handle(GEOM_Objec //Compute the Face try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Face driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -328,7 +316,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeDiskPntVecR if (thePnt.IsNull() || theVec.IsNull()) return NULL; //Add a new Disk object - Handle(GEOM_Object) aDisk = GetEngine()->AddObject(GetDocID(), GEOM_FACE); + Handle(GEOM_Object) aDisk = GetEngine()->AddObject(GEOM_FACE); //Add a new Disk function for creation a disk relatively to point and vector Handle(GEOM_Function) aFunction = @@ -351,17 +339,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeDiskPntVecR //Compute the Disk value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Disk driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -387,7 +372,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeDiskThreePnt (Handle(GEOM_Ob if (thePnt1.IsNull() || thePnt2.IsNull() || thePnt3.IsNull()) return NULL; //Add a new Disk object - Handle(GEOM_Object) aDisk = GetEngine()->AddObject(GetDocID(), GEOM_FACE); + Handle(GEOM_Object) aDisk = GetEngine()->AddObject(GEOM_FACE); //Add a new Disk function for creation a disk relatively to three points Handle(GEOM_Function) aFunction = @@ -411,17 +396,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeDiskThreePnt (Handle(GEOM_Ob //Compute the Disk value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Disk driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -445,7 +427,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeDiskR (double theR, int theO if (theR == 0 ) return NULL; //Add a new Disk object - Handle(GEOM_Object) aDisk = GetEngine()->AddObject(GetDocID(), GEOM_FACE); + Handle(GEOM_Object) aDisk = GetEngine()->AddObject(GEOM_FACE); //Add a new Box function for creation a box relatively to two points Handle(GEOM_Function) aFunction = aDisk->AddFunction(GEOMImpl_DiskDriver::GetID(), DISK_R); @@ -461,17 +443,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeDiskR (double theR, int theO //Compute the Disk try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Disk driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -488,12 +467,12 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeDiskR (double theR, int theO * MakeCylinderRH */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeCylinderRH (double theR, double theH, double theA) +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeCylinderRH (double theR, double theH) { SetErrorCode(KO); //Add a new Cylinder object - Handle(GEOM_Object) aCylinder = GetEngine()->AddObject(GetDocID(), GEOM_CYLINDER); + Handle(GEOM_Object) aCylinder = GetEngine()->AddObject(GEOM_CYLINDER); //Add a new Cylinder function with R and H parameters Handle(GEOM_Function) aFunction = aCylinder->AddFunction(GEOMImpl_CylinderDriver::GetID(), CYLINDER_R_H); @@ -506,32 +485,73 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeCylinderRH (double theR, dou aCI.SetR(theR); aCI.SetH(theH); - aCI.SetA(theA); //Compute the Cylinder value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Cylinder driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump(aFunction) << aCylinder - << " = geompy.MakeCylinderRH(" << theR << ", " << theH << ", " << theA << ")"; + << " = geompy.MakeCylinderRH(" << theR << ", " << theH << ")"; SetErrorCode(OK); return aCylinder; } +//============================================================================= +/*! + * MakeCylinderRHA + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeCylinderRHA (double theR, double theH, double theA) +{ + SetErrorCode(KO); + + //Add a new Cylinder object + Handle(GEOM_Object) aCylinder = GetEngine()->AddObject(GEOM_CYLINDER); + + //Add a new Cylinder function with R and H parameters + Handle(GEOM_Function) aFunction = aCylinder->AddFunction(GEOMImpl_CylinderDriver::GetID(), CYLINDER_R_H_A); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_CylinderDriver::GetID()) return NULL; + + GEOMImpl_ICylinder aCI (aFunction); + + aCI.SetR(theR); + aCI.SetH(theH); + aCI.SetA(theA); + + //Compute the Cylinder value + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Cylinder driver failed"); + return NULL; + } + } + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aCylinder + << " = geompy.MakeCylinderRHA(" << theR << ", " << theH << ", " << theA*180./M_PI << "*math.pi/180.)"; + + SetErrorCode(OK); + return aCylinder; +} //============================================================================= /*! @@ -540,14 +560,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeCylinderRH (double theR, dou //============================================================================= Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeCylinderPntVecRH (Handle(GEOM_Object) thePnt, Handle(GEOM_Object) theVec, - double theR, double theH, double theA) + double theR, double theH) { SetErrorCode(KO); if (thePnt.IsNull() || theVec.IsNull()) return NULL; //Add a new Cylinder object - Handle(GEOM_Object) aCylinder = GetEngine()->AddObject(GetDocID(), GEOM_CYLINDER); + Handle(GEOM_Object) aCylinder = GetEngine()->AddObject(GEOM_CYLINDER); //Add a new Cylinder function for creation a cylinder relatively to point and vector Handle(GEOM_Function) aFunction = @@ -568,27 +588,81 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeCylinderPntVecRH (Handle(GEO aCI.SetVector(aRefVec); aCI.SetR(theR); aCI.SetH(theH); - aCI.SetA(theA); //Compute the Cylinder value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Cylinder driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump(aFunction) << aCylinder << " = geompy.MakeCylinder(" - << thePnt << ", " << theVec << ", " << theR << ", " << theH << ", " << theA << ")"; + << thePnt << ", " << theVec << ", " << theR << ", " << theH << ")"; + + SetErrorCode(OK); + return aCylinder; +} + +//============================================================================= +/*! + * MakeCylinderPntVecRHA + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeCylinderPntVecRHA (Handle(GEOM_Object) thePnt, + Handle(GEOM_Object) theVec, + double theR, double theH, double theA) +{ + SetErrorCode(KO); + + if (thePnt.IsNull() || theVec.IsNull()) return NULL; + + //Add a new Cylinder object + Handle(GEOM_Object) aCylinder = GetEngine()->AddObject(GEOM_CYLINDER); + + //Add a new Cylinder function for creation a cylinder relatively to point and vector + Handle(GEOM_Function) aFunction = + aCylinder->AddFunction(GEOMImpl_CylinderDriver::GetID(), CYLINDER_PNT_VEC_R_H_A); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_CylinderDriver::GetID()) return NULL; + + GEOMImpl_ICylinder aCI (aFunction); + + Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction(); + Handle(GEOM_Function) aRefVec = theVec->GetLastFunction(); + + if (aRefPnt.IsNull() || aRefVec.IsNull()) return NULL; + + aCI.SetPoint(aRefPnt); + aCI.SetVector(aRefVec); + aCI.SetR(theR); + aCI.SetH(theH); + aCI.SetA(theA); + + //Compute the Cylinder value + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Cylinder driver failed"); + return NULL; + } + } + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aCylinder << " = geompy.MakeCylinderA(" + << thePnt << ", " << theVec << ", " << theR << ", " << theH << ", " << theA*180./M_PI << "*math.pi/180.)"; SetErrorCode(OK); return aCylinder; @@ -606,7 +680,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeConeR1R2H (double theR1, dou SetErrorCode(KO); //Add a new Cone object - Handle(GEOM_Object) aCone = GetEngine()->AddObject(GetDocID(), GEOM_CONE); + Handle(GEOM_Object) aCone = GetEngine()->AddObject(GEOM_CONE); //Add a new Cone function with R and H parameters Handle(GEOM_Function) aFunction = @@ -624,17 +698,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeConeR1R2H (double theR1, dou //Compute the Cone value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Cone driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -662,7 +733,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeConePntVecR1R2H (Handle(GEOM if (thePnt.IsNull() || theVec.IsNull()) return NULL; //Add a new Cone object - Handle(GEOM_Object) aCone = GetEngine()->AddObject(GetDocID(), GEOM_CONE); + Handle(GEOM_Object) aCone = GetEngine()->AddObject(GEOM_CONE); //Add a new Cone function for creation a cone relatively to point and vector Handle(GEOM_Function) aFunction = @@ -687,17 +758,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeConePntVecR1R2H (Handle(GEOM //Compute the Cone value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Cone driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -720,7 +788,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeSphereR (double theR) SetErrorCode(KO); //Add a new Sphere object - Handle(GEOM_Object) aSphere = GetEngine()->AddObject(GetDocID(), GEOM_SPHERE); + Handle(GEOM_Object) aSphere = GetEngine()->AddObject(GEOM_SPHERE); //Add a new Sphere function with R parameter Handle(GEOM_Function) aFunction = aSphere->AddFunction(GEOMImpl_SphereDriver::GetID(), SPHERE_R); @@ -735,17 +803,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeSphereR (double theR) //Compute the Sphere value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Sphere driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -770,7 +835,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeSpherePntR (Handle(GEOM_Obje if (thePnt.IsNull()) return NULL; //Add a new Point object - Handle(GEOM_Object) aSphere = GetEngine()->AddObject(GetDocID(), GEOM_SPHERE); + Handle(GEOM_Object) aSphere = GetEngine()->AddObject(GEOM_SPHERE); //Add a new Sphere function for creation a sphere relatively to point Handle(GEOM_Function) aFunction = aSphere->AddFunction(GEOMImpl_SphereDriver::GetID(), SPHERE_PNT_R); @@ -790,17 +855,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeSpherePntR (Handle(GEOM_Obje //Compute the Sphere value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Sphere driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -824,7 +886,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeTorusRR SetErrorCode(KO); //Add a new Torus object - Handle(GEOM_Object) anEll = GetEngine()->AddObject(GetDocID(), GEOM_TORUS); + Handle(GEOM_Object) anEll = GetEngine()->AddObject(GEOM_TORUS); //Add a new Torus function Handle(GEOM_Function) aFunction = @@ -841,17 +903,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeTorusRR //Compute the Torus value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Torus driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -877,7 +936,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeTorusPntVecRR if (thePnt.IsNull() || theVec.IsNull()) return NULL; //Add a new Torus object - Handle(GEOM_Object) anEll = GetEngine()->AddObject(GetDocID(), GEOM_TORUS); + Handle(GEOM_Object) anEll = GetEngine()->AddObject(GEOM_TORUS); //Add a new Torus function Handle(GEOM_Function) aFunction = @@ -901,17 +960,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeTorusPntVecRR //Compute the Torus value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Torus driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -938,7 +994,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismVecH (Handle(GEOM_Objec if (theBase.IsNull() || theVec.IsNull()) return NULL; //Add a new Prism object - Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GetDocID(), GEOM_PRISM); + Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GEOM_PRISM); //Add a new Prism function for creation a Prism relatively to vector Handle(GEOM_Function) aFunction = @@ -962,18 +1018,15 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismVecH (Handle(GEOM_Objec //Compute the Prism value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { //SetErrorCode("Prism driver failed"); SetErrorCode("Extrusion can not be created, check input data"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -1003,7 +1056,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismVecH2Ways (Handle(GEOM_ if (theBase.IsNull() || theVec.IsNull()) return NULL; //Add a new Prism object - Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GetDocID(), GEOM_PRISM); + Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GEOM_PRISM); //Add a new Prism function for creation a Prism relatively to vector Handle(GEOM_Function) aFunction = @@ -1026,18 +1079,15 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismVecH2Ways (Handle(GEOM_ //Compute the Prism value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { //SetErrorCode("Prism driver failed"); SetErrorCode("Extrusion can not be created, check input data"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -1064,7 +1114,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismTwoPnt if (theBase.IsNull() || thePoint1.IsNull() || thePoint2.IsNull()) return NULL; //Add a new Prism object - Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GetDocID(), GEOM_PRISM); + Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GEOM_PRISM); //Add a new Prism function for creation a Prism relatively to two points Handle(GEOM_Function) aFunction = @@ -1089,18 +1139,15 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismTwoPnt //Compute the Prism value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { //SetErrorCode("Prism driver failed"); SetErrorCode("Extrusion can not be created, check input data"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -1130,7 +1177,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismTwoPnt2Ways if (theBase.IsNull() || thePoint1.IsNull() || thePoint2.IsNull()) return NULL; //Add a new Prism object - Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GetDocID(), GEOM_PRISM); + Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GEOM_PRISM); //Add a new Prism function for creation a Prism relatively to two points Handle(GEOM_Function) aFunction = @@ -1154,18 +1201,15 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismTwoPnt2Ways //Compute the Prism value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { //SetErrorCode("Prism driver failed"); SetErrorCode("Extrusion can not be created, check input data"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -1191,7 +1235,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismDXDYDZ if (theBase.IsNull()) return NULL; //Add a new Prism object - Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GetDocID(), GEOM_PRISM); + Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GEOM_PRISM); //Add a new Prism function for creation a Prism by DXDYDZ Handle(GEOM_Function) aFunction = @@ -1215,17 +1259,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismDXDYDZ //Compute the Prism value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Extrusion can not be created, check input data"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -1255,7 +1296,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismDXDYDZ2Ways if (theBase.IsNull()) return NULL; //Add a new Prism object - Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GetDocID(), GEOM_PRISM); + Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GEOM_PRISM); //Add a new Prism function for creation a Prism by DXDYDZ Handle(GEOM_Function) aFunction = @@ -1278,17 +1319,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismDXDYDZ2Ways //Compute the Prism value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Extrusion can not be created, check input data"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -1306,7 +1344,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismDXDYDZ2Ways */ //============================================================================= Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeDraftPrism - (Handle(GEOM_Object) theInitShape ,Handle(GEOM_Object) theBase, double theHeight, double theAngle, bool theFuse) + (Handle(GEOM_Object) theInitShape ,Handle(GEOM_Object) theBase, double theHeight, double theAngle, bool theFuse, bool theInvert) { SetErrorCode(KO); @@ -1317,12 +1355,12 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeDraftPrism if ( theFuse ) { //Add a new Extruded Boss object - aPrism = GetEngine()->AddObject(GetDocID(), GEOM_EXTRUDED_BOSS); + aPrism = GetEngine()->AddObject(GEOM_EXTRUDED_BOSS); } else { //Add a new Extruded Cut object - aPrism = GetEngine()->AddObject(GetDocID(), GEOM_EXTRUDED_CUT); + aPrism = GetEngine()->AddObject(GEOM_EXTRUDED_CUT); } //Add a new Prism function for the creation of a Draft Prism feature @@ -1349,34 +1387,36 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeDraftPrism aCI.SetFuseFlag(1); else aCI.SetFuseFlag(0); + aCI.SetInvertFlag(theInvert); //Compute the Draft Prism Feature value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Extrusion can not be created, check input data"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } //Make a Python command + GEOM::TPythonDump pd (aFunction); if(theFuse) { - GEOM::TPythonDump(aFunction) << aPrism << " = geompy.MakeExtrudedBoss(" - << theInitShape << ", " << theBase << ", " << theHeight << ", " << theAngle << ")"; + pd << aPrism << " = geompy.MakeExtrudedBoss(" << theInitShape << ", " << theBase << ", " + << theHeight << ", " << theAngle; } else { - GEOM::TPythonDump(aFunction) << aPrism << " = geompy.MakeExtrudedCut(" - << theInitShape << ", " << theBase << ", " << theHeight << ", " << theAngle << ")"; + pd << aPrism << " = geompy.MakeExtrudedCut(" << theInitShape << ", " << theBase << ", " + << theHeight << ", " << theAngle; } + if (theInvert) + pd << ", " << theInvert; + pd << ")"; SetErrorCode(OK); return aPrism; @@ -1387,15 +1427,17 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeDraftPrism * MakePipe */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipe (Handle(GEOM_Object) theBase, - Handle(GEOM_Object) thePath) +Handle(TColStd_HSequenceOfTransient) GEOMImpl_I3DPrimOperations::MakePipe + (const Handle(GEOM_Object) &theBase, + const Handle(GEOM_Object) &thePath, + const bool IsGenerateGroups) { SetErrorCode(KO); if (theBase.IsNull() || thePath.IsNull()) return NULL; //Add a new Pipe object - Handle(GEOM_Object) aPipe = GetEngine()->AddObject(GetDocID(), GEOM_PIPE); + Handle(GEOM_Object) aPipe = GetEngine()->AddObject(GEOM_PIPE); //Add a new Pipe function Handle(GEOM_Function) aFunction = @@ -1414,29 +1456,46 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipe (Handle(GEOM_Object) th aCI.SetBase(aRefBase); aCI.SetPath(aRefPath); + aCI.SetGenerateGroups(IsGenerateGroups); //Compute the Pipe value try { -#if OCC_VERSION_LARGE > 0x06010000 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()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } + // Create the sequence of objects. + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + aSeq->Append(aPipe); + createGroups(aPipe, &aCI, aSeq); + //Make a Python command - GEOM::TPythonDump(aFunction) << aPipe << " = geompy.MakePipe(" - << theBase << ", " << thePath << ")"; + GEOM::TPythonDump pyDump(aFunction); + + if (IsGenerateGroups) { + pyDump << aSeq; + } else { + pyDump << aPipe; + } + + pyDump << " = geompy.MakePipe(" << theBase << ", " << thePath; + + if (IsGenerateGroups) { + pyDump << ", True"; + } + + pyDump << ")"; SetErrorCode(OK); - return aPipe; + return aSeq; } @@ -1454,7 +1513,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeRevolutionAxisAngle (Handle( if (theBase.IsNull() || theAxis.IsNull()) return NULL; //Add a new Revolution object - Handle(GEOM_Object) aRevolution = GetEngine()->AddObject(GetDocID(), GEOM_REVOLUTION); + Handle(GEOM_Object) aRevolution = GetEngine()->AddObject(GEOM_REVOLUTION); //Add a new Revolution function for creation a revolution relatively to axis Handle(GEOM_Function) aFunction = @@ -1477,17 +1536,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeRevolutionAxisAngle (Handle( //Compute the Revolution value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Revolution driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -1512,7 +1568,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeRevolutionAxisAngle2Ways if (theBase.IsNull() || theAxis.IsNull()) return NULL; //Add a new Revolution object - Handle(GEOM_Object) aRevolution = GetEngine()->AddObject(GetDocID(), GEOM_REVOLUTION); + Handle(GEOM_Object) aRevolution = GetEngine()->AddObject(GEOM_REVOLUTION); //Add a new Revolution function for creation a revolution relatively to axis Handle(GEOM_Function) aFunction = @@ -1535,17 +1591,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeRevolutionAxisAngle2Ways //Compute the Revolution value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Revolution driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } @@ -1562,17 +1615,21 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeRevolutionAxisAngle2Ways * MakeFilling */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFilling - (Handle(GEOM_Object) theShape, int theMinDeg, int theMaxDeg, - double theTol2D, double theTol3D, int theNbIter, - int theMethod, bool isApprox) +Handle(GEOM_Object) +GEOMImpl_I3DPrimOperations::MakeFilling (std::list< Handle(GEOM_Object)> & theContours, + int theMinDeg, int theMaxDeg, + double theTol2D, double theTol3D, int theNbIter, + int theMethod, bool isApprox) { SetErrorCode(KO); - if (theShape.IsNull()) return NULL; - + Handle(TColStd_HSequenceOfTransient) contours = GEOM_Object::GetLastFunctions( theContours ); + if ( contours.IsNull() || contours->IsEmpty() ) { + SetErrorCode("NULL argument shape"); + return NULL; + } //Add a new Filling object - Handle(GEOM_Object) aFilling = GetEngine()->AddObject(GetDocID(), GEOM_FILLING); + Handle(GEOM_Object) aFilling = GetEngine()->AddObject(GEOM_FILLING); //Add a new Filling function for creation a filling from a compound Handle(GEOM_Function) aFunction = aFilling->AddFunction(GEOMImpl_FillingDriver::GetID(), BASIC_FILLING); @@ -1582,12 +1639,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFilling if (aFunction->GetDriverGUID() != GEOMImpl_FillingDriver::GetID()) return NULL; GEOMImpl_IFilling aFI (aFunction); - - Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); - - if (aRefShape.IsNull()) return NULL; - - aFI.SetShape(aRefShape); + aFI.SetShapes(contours); aFI.SetMinDeg(theMinDeg); aFI.SetMaxDeg(theMaxDeg); aFI.SetTol2D(theTol2D); @@ -1598,36 +1650,33 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFilling //Compute the Solid value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Filling driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - if (strcmp(aFail->GetMessageString(), "Geom_BSplineSurface") == 0) + catch (Standard_Failure& aFail) { + if (strcmp(aFail.GetMessageString(), "Geom_BSplineSurface") == 0) SetErrorCode("B-Spline surface construction failed"); else - SetErrorCode(aFail->GetMessageString()); + SetErrorCode(aFail.GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump pd (aFunction); - pd << aFilling << " = geompy.MakeFilling(" << theShape ; + pd << aFilling << " = geompy.MakeFilling(" << theContours ; if ( theMinDeg != 2 ) pd << ", theMinDeg=" << theMinDeg ; if ( theMaxDeg != 5 ) pd << ", theMaxDeg=" << theMaxDeg ; if ( fabs(theTol2D-0.0001) > Precision::Confusion() ) - pd << ", theTol2D=" << theTol2D ; + { pd << ", theTol2D=" << theTol2D ; } if ( fabs(theTol3D-0.0001) > Precision::Confusion() ) - pd << ", theTol3D=" << theTol3D ; + { pd << ", theTol3D=" << theTol3D ; } if ( theNbIter != 0 ) pd << ", theNbIter=" << theNbIter ; if ( theMethod==1 ) pd << ", theMethod=GEOM.FOM_UseOri"; else if( theMethod==2 ) pd << ", theMethod=GEOM.FOM_AutoCorrect"; - if(isApprox) pd << ", isApprox=" << isApprox ; + if ( isApprox ) pd << ", isApprox=" << isApprox ; pd << ")"; SetErrorCode(OK); @@ -1655,7 +1704,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThruSections( return anObj; //Add a new ThruSections object - Handle(GEOM_Object) aThruSect = GetEngine()->AddObject(GetDocID(), GEOM_THRUSECTIONS); + Handle(GEOM_Object) aThruSect = GetEngine()->AddObject(GEOM_THRUSECTIONS); //Add a new ThruSections function @@ -1697,17 +1746,14 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThruSections( //Compute the ThruSections value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("ThruSections driver failed"); return anObj; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return anObj; } @@ -1741,41 +1787,43 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThruSections( * MakePipeWithDifferentSections */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( - const Handle(TColStd_HSequenceOfTransient)& theBases, - const Handle(TColStd_HSequenceOfTransient)& theLocations, - const Handle(GEOM_Object)& thePath, - bool theWithContact, - bool theWithCorrections) +Handle(TColStd_HSequenceOfTransient) + GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections + (const Handle(TColStd_HSequenceOfTransient) &theBases, + const Handle(TColStd_HSequenceOfTransient) &theLocations, + const Handle(GEOM_Object) &thePath, + const bool theWithContact, + const bool theWithCorrections, + const bool IsBySteps, + const bool IsGenerateGroups) { - Handle(GEOM_Object) anObj; SetErrorCode(KO); if(theBases.IsNull()) - return anObj; + return NULL; Standard_Integer nbBases = theBases->Length(); if (!nbBases) - return anObj; + return NULL; Standard_Integer nbLocs = (theLocations.IsNull() ? 0 :theLocations->Length()); //Add a new Pipe object - Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GetDocID(), GEOM_PIPE); + Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GEOM_PIPE); //Add a new Pipe function Handle(GEOM_Function) aFunction = aPipeDS->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_DIFFERENT_SECTIONS); - if (aFunction.IsNull()) return anObj; + if (aFunction.IsNull()) return NULL; //Check if the function is set correctly - if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return anObj; + if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return NULL; GEOMImpl_IPipeDiffSect aCI (aFunction); Handle(GEOM_Function) aRefPath = thePath->GetLastFunction(); if(aRefPath.IsNull()) - return anObj; + return NULL; Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient; Handle(TColStd_HSequenceOfTransient) aSeqLocs = new TColStd_HSequenceOfTransient; @@ -1811,33 +1859,53 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( } if(!aSeqBases->Length()) - return anObj; + return NULL; aCI.SetBases(aSeqBases); aCI.SetLocations(aSeqLocs); aCI.SetPath(aRefPath); - aCI.SetWithContactMode(theWithContact); - aCI.SetWithCorrectionMode(theWithCorrections); + + if (!IsBySteps) { + aCI.SetWithContactMode(theWithContact); + aCI.SetWithCorrectionMode(theWithCorrections); + } + + aCI.SetIsBySteps(IsBySteps); + aCI.SetGenerateGroups(IsGenerateGroups); //Compute the Pipe value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { - SetErrorCode("Pipe with defferent section driver failed"); - return anObj; + SetErrorCode("Pipe with different section driver failed"); + return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); - return anObj; + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); + return NULL; } + // Create the sequence of objects. + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + aSeq->Append(aPipeDS); + createGroups(aPipeDS, &aCI, aSeq); + //Make a Python command GEOM::TPythonDump pyDump(aFunction); - pyDump << aPipeDS << " = geompy.MakePipeWithDifferentSections(["; + + if (IsGenerateGroups) { + pyDump << aSeq; + } else { + pyDump << aPipeDS; + } + + if (IsBySteps) { + pyDump << " = geompy.MakePipeWithDifferentSectionsBySteps(["; + } else { + pyDump << " = geompy.MakePipeWithDifferentSections(["; + } for(i =1 ; i <= nbBases; i++) { @@ -1869,10 +1937,20 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( } } - pyDump<< "], "<Length(); if (!nbBases) - return anObj; + return NULL; Standard_Integer nbSubBases = (theSubBases.IsNull() ? 0 :theSubBases->Length()); Standard_Integer nbLocs = (theLocations.IsNull() ? 0 :theLocations->Length()); //Add a new Pipe object - Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GetDocID(), GEOM_PIPE); + Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GEOM_PIPE); //Add a new Pipe function Handle(GEOM_Function) aFunction = aPipeDS->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_SHELL_SECTIONS); - if (aFunction.IsNull()) return anObj; + if (aFunction.IsNull()) return NULL; //Check if the function is set correctly - if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return anObj; + if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return NULL; //GEOMImpl_IPipeDiffSect aCI (aFunction); GEOMImpl_IPipeShellSect aCI (aFunction); Handle(GEOM_Function) aRefPath = thePath->GetLastFunction(); if(aRefPath.IsNull()) - return anObj; + return NULL; Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient; Handle(TColStd_HSequenceOfTransient) aSeqSubBases = new TColStd_HSequenceOfTransient; @@ -1969,7 +2048,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections( } if(!aSeqBases->Length()) - return anObj; + return NULL; aCI.SetBases(aSeqBases); aCI.SetSubBases(aSeqSubBases); @@ -1977,26 +2056,37 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections( aCI.SetPath(aRefPath); aCI.SetWithContactMode(theWithContact); aCI.SetWithCorrectionMode(theWithCorrections); + aCI.SetGenerateGroups(IsGenerateGroups); //Compute the Pipe value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Pipe with shell sections driver failed"); - return anObj; + return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); - return anObj; + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); + return NULL; } + // Create the sequence of objects. + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + aSeq->Append(aPipeDS); + createGroups(aPipeDS, &aCI, aSeq); + //Make a Python command GEOM::TPythonDump pyDump(aFunction); - pyDump << aPipeDS << " = geompy.MakePipeWithShellSections(["; + + if (IsGenerateGroups) { + pyDump << aSeq; + } else { + pyDump << aPipeDS; + } + + pyDump << " = geompy.MakePipeWithShellSections(["; for(i =1 ; i <= nbBases; i++) { @@ -2044,10 +2134,16 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections( } } - pyDump<< "], "<Length(); if (!nbBases) - return anObj; + return NULL; Standard_Integer nbLocs = (theLocations.IsNull() ? 0 :theLocations->Length()); //Add a new Pipe object - Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GetDocID(), GEOM_PIPE); + Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GEOM_PIPE); //Add a new Pipe function Handle(GEOM_Function) aFunction = aPipeDS->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_SHELLS_WITHOUT_PATH); - if (aFunction.IsNull()) return anObj; + if (aFunction.IsNull()) return NULL; //Check if the function is set correctly - if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return anObj; + if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return NULL; GEOMImpl_IPipeShellSect aCI (aFunction); @@ -2120,30 +2217,41 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeShellsWithoutPath( } if(!aSeqBases->Length()) - return anObj; + return NULL; aCI.SetBases(aSeqBases); aCI.SetLocations(aSeqLocs); + aCI.SetGenerateGroups(IsGenerateGroups); //Compute the Pipe value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Pipe with shell sections without path driver failed"); - return anObj; + return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); - return anObj; + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); + return NULL; } + // Create the sequence of objects. + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + aSeq->Append(aPipeDS); + createGroups(aPipeDS, &aCI, aSeq); + //Make a Python command GEOM::TPythonDump pyDump(aFunction); - pyDump << aPipeDS << " = geompy.MakePipeShellsWithoutPath(["; + + if (IsGenerateGroups) { + pyDump << aSeq; + } else { + pyDump << aPipeDS; + } + + pyDump << " = geompy.MakePipeShellsWithoutPath(["; for(i =1 ; i <= nbBases; i++) { @@ -2175,10 +2283,16 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeShellsWithoutPath( } } - pyDump<< "])"; + pyDump<< "]"; + + if (IsGenerateGroups) { + pyDump << ", True"; + } + + pyDump << ")"; SetErrorCode(OK); - return aPipeDS; + return aSeq; } @@ -2187,16 +2301,19 @@ 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) +Handle(TColStd_HSequenceOfTransient) + GEOMImpl_I3DPrimOperations::MakePipeBiNormalAlongVector + (const Handle(GEOM_Object) &theBase, + const Handle(GEOM_Object) &thePath, + const Handle(GEOM_Object) &theVec, + const bool IsGenerateGroups) { 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); + Handle(GEOM_Object) aPipe = GetEngine()->AddObject(GEOM_PIPE); //Add a new Pipe function Handle(GEOM_Function) aFunction = @@ -2217,29 +2334,47 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeBiNormalAlongVector (Han aCI.SetBase(aRefBase); aCI.SetPath(aRefPath); aCI.SetVector(aRefVec); + aCI.SetGenerateGroups(IsGenerateGroups); //Compute the Pipe value try { -#if OCC_VERSION_LARGE > 0x06010000 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()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } + // Create the sequence of objects. + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + aSeq->Append(aPipe); + createGroups(aPipe, &aCI, aSeq); + //Make a Python command - GEOM::TPythonDump(aFunction) << aPipe << " = geompy.MakePipeBiNormalAlongVector(" - << theBase << ", " << thePath << ", " << theVec << ")"; + GEOM::TPythonDump pyDump(aFunction); + + if (IsGenerateGroups) { + pyDump << aSeq; + } else { + pyDump << aPipe; + } + + pyDump << " = geompy.MakePipeBiNormalAlongVector(" + << theBase << ", " << thePath << ", " << theVec; + + if (IsGenerateGroups) { + pyDump << ", True"; + } + + pyDump << ")"; SetErrorCode(OK); - return aPipe; + return aSeq; } //============================================================================= @@ -2247,9 +2382,12 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeBiNormalAlongVector (Han * MakeThickening */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThickening(Handle(GEOM_Object) theObject, - double theOffset, - bool copy = true) +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThickening + (Handle(GEOM_Object) theObject, + const Handle(TColStd_HArray1OfInteger) &theFacesIDs, + double theOffset, + bool isCopy, + bool theInside) { SetErrorCode(KO); @@ -2261,10 +2399,10 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThickening(Handle(GEOM_Objec //Add a new Offset function Handle(GEOM_Function) aFunction; Handle(GEOM_Object) aCopy; - if (copy) + if (isCopy) { //Add a new Copy object - aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + aCopy = GetEngine()->AddObject(theObject->GetType()); aFunction = aCopy->AddFunction(GEOMImpl_OffsetDriver::GetID(), OFFSET_THICKENING_COPY); } else @@ -2278,38 +2416,58 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThickening(Handle(GEOM_Objec GEOMImpl_IOffset aTI (aFunction); aTI.SetShape(anOriginal); aTI.SetValue(theOffset); + aTI.SetParam(theInside); + + if (theFacesIDs.IsNull() == Standard_False) { + aTI.SetFaceIDs(theFacesIDs); + } //Compute the offset try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Offset driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - SetErrorCode(aFail->GetMessageString()); + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); return NULL; } //Make a Python command - if(copy) - { - GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MakeThickSolid(" - << theObject << ", " << theOffset << ")"; - SetErrorCode(OK); - return aCopy; + GEOM::TPythonDump pd (aFunction); + Handle(GEOM_Object) aResult; + + if (isCopy) { + pd << aCopy << " = geompy.MakeThickSolid(" + << theObject << ", " << theOffset; + aResult = aCopy; + } else { + pd << "geompy.Thicken(" << theObject << ", " << theOffset; + aResult = theObject; } - else - { - GEOM::TPythonDump(aFunction) << "geompy.Thicken(" - << theObject << ", " << theOffset << ")"; - SetErrorCode(OK); - return theObject; + + pd << ", ["; + if (theFacesIDs.IsNull() == Standard_False) { + // Dump faces IDs. + Standard_Integer i; + + for (i = theFacesIDs->Lower(); i < theFacesIDs->Upper(); ++i) { + pd << theFacesIDs->Value(i) << ", "; + } + // Dump the last value. + pd << theFacesIDs->Value(i); } + pd << "]"; + + if (theInside) + pd << ", " << theInside; + + pd << ")"; + SetErrorCode(OK); + + return aResult; } //============================================================================= @@ -2326,7 +2484,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::RestorePath (Handle(GEOM_Object) if (theShape.IsNull() || theBase1.IsNull() || theBase2.IsNull()) return NULL; // Add a new Path object - Handle(GEOM_Object) aPath = GetEngine()->AddObject(GetDocID(), GEOM_PIPE_PATH); + Handle(GEOM_Object) aPath = GetEngine()->AddObject(GEOM_PIPE_PATH); // Add a new Path function Handle(GEOM_Function) aFunction = @@ -2350,16 +2508,13 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::RestorePath (Handle(GEOM_Object) // Compute the Path value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("PipePath driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + catch (Standard_Failure& aFail) { SetErrorCode("RestorePath: inappropriate arguments given"); return NULL; } @@ -2393,7 +2548,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::RestorePath return NULL; // Add a new Path object - Handle(GEOM_Object) aPath = GetEngine()->AddObject(GetDocID(), GEOM_PIPE_PATH); + Handle(GEOM_Object) aPath = GetEngine()->AddObject(GEOM_PIPE_PATH); // Add a new Path function Handle(GEOM_Function) aFunction = @@ -2442,16 +2597,13 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::RestorePath // Compute the Path value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("PipePath driver failed"); return NULL; } } - catch (Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + catch (Standard_Failure& aFail) { SetErrorCode("RestorePath: inappropriate arguments given"); return NULL; } @@ -2481,3 +2633,122 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::RestorePath SetErrorCode(OK); return aPath; } + +//============================================================================= +/*! + * createGroup + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::createGroup + (const Handle(GEOM_Object) &theBaseObject, + const Handle(TColStd_HArray1OfInteger) &theGroupIDs, + const TCollection_AsciiString &theName, + const TopTools_IndexedMapOfShape &theIndices) +{ + if (theBaseObject.IsNull() || theGroupIDs.IsNull()) { + return NULL; + } + + // Get the Shape type. + const Standard_Integer anID = theGroupIDs->Value(theGroupIDs->Lower()); + const Standard_Integer aNbShapes = theIndices.Extent(); + + if (anID < 1 || anID > aNbShapes) { + return NULL; + } + + const TopoDS_Shape aSubShape = theIndices.FindKey(anID); + + if (aSubShape.IsNull()) { + return NULL; + } + + // Create a group. + const TopAbs_ShapeEnum aGroupType = aSubShape.ShapeType(); + Handle(GEOM_Object) aGroup = + myGroupOperations->CreateGroup(theBaseObject, aGroupType); + + if (aGroup.IsNull() == Standard_False) { + aGroup->GetLastFunction()->SetDescription(""); + aGroup->SetName(theName.ToCString()); + + Handle(TColStd_HSequenceOfInteger) aSeqIDs = new TColStd_HSequenceOfInteger; + Standard_Integer i; + + for (i = theGroupIDs->Lower(); i <= theGroupIDs->Upper(); ++i) { + // Get and check the index. + const Standard_Integer anIndex = theGroupIDs->Value(i); + + if (anIndex < 1 || anIndex > aNbShapes) { + return NULL; + } + + // Get and check the sub-shape. + const TopoDS_Shape aSubShape = theIndices.FindKey(anIndex); + + if (aSubShape.IsNull()) { + return NULL; + } + + // Check the shape type. + if (aSubShape.ShapeType() != aGroupType) { + return NULL; + } + + aSeqIDs->Append(anIndex); + } + + myGroupOperations->UnionIDs(aGroup, aSeqIDs); + aGroup->GetLastFunction()->SetDescription(""); + } + + return aGroup; +} + +//============================================================================= +/*! + * createGroups + */ +//============================================================================= +void GEOMImpl_I3DPrimOperations::createGroups + (const Handle(GEOM_Object) &theBaseObject, + GEOMImpl_IPipe *thePipe, + Handle(TColStd_HSequenceOfTransient) &theSequence) +{ + if (theBaseObject.IsNull() || thePipe == NULL || theSequence.IsNull()) { + return; + } + + TopoDS_Shape aShape = theBaseObject->GetValue(); + + if (aShape.IsNull()) { + return; + } + + TopTools_IndexedMapOfShape anIndices; + Handle(TColStd_HArray1OfInteger) aGroupIDs; + TopoDS_Shape aShapeType; + const Standard_Integer aNbGroups = 5; + Handle(GEOM_Object) aGrps[aNbGroups]; + Standard_Integer i; + + TopExp::MapShapes(aShape, anIndices); + + // Create groups. + aGroupIDs = thePipe->GetGroupDown(); + aGrps[0] = createGroup(theBaseObject, aGroupIDs, "GROUP_DOWN", anIndices); + aGroupIDs = thePipe->GetGroupUp(); + aGrps[1] = createGroup(theBaseObject, aGroupIDs, "GROUP_UP", anIndices); + aGroupIDs = thePipe->GetGroupSide1(); + aGrps[2] = createGroup(theBaseObject, aGroupIDs, "GROUP_SIDE1", anIndices); + aGroupIDs = thePipe->GetGroupSide2(); + aGrps[3] = createGroup(theBaseObject, aGroupIDs, "GROUP_SIDE2", anIndices); + aGroupIDs = thePipe->GetGroupOther(); + aGrps[4] = createGroup(theBaseObject, aGroupIDs, "GROUP_OTHER", anIndices); + + for (i = 0; i < aNbGroups; ++i) { + if (aGrps[i].IsNull() == Standard_False) { + theSequence->Append(aGrps[i]); + } + } +}