-using namespace std;
-
-#include "GEOMImpl_I3DPrimOperations.hxx"
+// 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
+//
+#include <Standard_Stream.hxx>
+
+#include <GEOMImpl_I3DPrimOperations.hxx>
#include "utilities.h"
-#include "OpUtil.hxx"
-#include "Utils_ExceptHandlers.hxx"
+#include <OpUtil.hxx>
+#include <Utils_ExceptHandlers.hxx>
#include <TFunction_DriverTable.hxx>
#include <TFunction_Driver.hxx>
#include <TFunction_Logbook.hxx>
#include <TDF_Tool.hxx>
-#include "GEOM_Function.hxx"
-#include "GEOMImpl_Types.hxx"
-
-#include "GEOMImpl_BoxDriver.hxx"
-#include "GEOMImpl_CylinderDriver.hxx"
-#include "GEOMImpl_ConeDriver.hxx"
-#include "GEOMImpl_SphereDriver.hxx"
-#include "GEOMImpl_TorusDriver.hxx"
-#include "GEOMImpl_PrismDriver.hxx"
-#include "GEOMImpl_PipeDriver.hxx"
-#include "GEOMImpl_RevolutionDriver.hxx"
-#include "GEOMImpl_ShapeDriver.hxx"
-#include "GEOMImpl_FillingDriver.hxx"
-
-#include "GEOMImpl_IBox.hxx"
-#include "GEOMImpl_ICylinder.hxx"
-#include "GEOMImpl_ICone.hxx"
-#include "GEOMImpl_ISphere.hxx"
-#include "GEOMImpl_ITorus.hxx"
-#include "GEOMImpl_IPrism.hxx"
-#include "GEOMImpl_IPipe.hxx"
-#include "GEOMImpl_IRevolution.hxx"
-#include "GEOMImpl_IShapes.hxx"
-#include "GEOMImpl_IFilling.hxx"
-
+#include <GEOM_Function.hxx>
+#include <GEOM_PythonDump.hxx>
+
+#include <GEOMImpl_Types.hxx>
+
+#include <GEOMImpl_BoxDriver.hxx>
+#include <GEOMImpl_CylinderDriver.hxx>
+#include <GEOMImpl_ConeDriver.hxx>
+#include <GEOMImpl_SphereDriver.hxx>
+#include <GEOMImpl_TorusDriver.hxx>
+#include <GEOMImpl_PrismDriver.hxx>
+#include <GEOMImpl_PipeDriver.hxx>
+#include <GEOMImpl_RevolutionDriver.hxx>
+#include <GEOMImpl_ShapeDriver.hxx>
+#include <GEOMImpl_FillingDriver.hxx>
+#include <GEOMImpl_ThruSectionsDriver.hxx>
+
+#include <GEOMImpl_IBox.hxx>
+#include <GEOMImpl_ICylinder.hxx>
+#include <GEOMImpl_ICone.hxx>
+#include <GEOMImpl_ISphere.hxx>
+#include <GEOMImpl_ITorus.hxx>
+#include <GEOMImpl_IPrism.hxx>
+#include <GEOMImpl_IPipe.hxx>
+#include <GEOMImpl_IRevolution.hxx>
+#include <GEOMImpl_IShapes.hxx>
+#include <GEOMImpl_IFilling.hxx>
+#include <GEOMImpl_IThruSections.hxx>
+#include <GEOMImpl_IPipeDiffSect.hxx>
+#include <GEOMImpl_IPipeShellSect.hxx>
+
+#include <Standard_Failure.hxx>
#include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
//=============================================================================
//Compute the box value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Box driver failed");
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aBox->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = I3DPrimOperations.MakeBoxDXDYDZ(";
- aDescr += (TCollection_AsciiString(theDX)+", ");
- aDescr += (TCollection_AsciiString(theDY)+", ");
- aDescr += (TCollection_AsciiString(theDZ)+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aBox << " = geompy.MakeBoxDXDYDZ("
+ << theDX << ", " << theDY << ", " << theDZ << ")";
SetErrorCode(OK);
return aBox;
//Compute the Box value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Box driver failed");
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aBox->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = I3DPrimOperations.MakeBoxTwoPnt(";
- TDF_Tool::Entry(thePnt1->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- TDF_Tool::Entry(thePnt2->GetEntry(), anEntry);
- aDescr += (anEntry+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aBox << " = geompy.MakeBoxTwoPnt("
+ << thePnt1 << ", " << thePnt2 << ")";
SetErrorCode(OK);
return aBox;
//Compute the Cylinder value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Cylinder driver failed");
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aCylinder->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = I3DPrimOperations.MakeCylinderRH(";
- aDescr += (TCollection_AsciiString(theR)+", ");
- aDescr += (TCollection_AsciiString(theH)+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aCylinder
+ << " = geompy.MakeCylinderRH(" << theR << ", " << theH << ")";
SetErrorCode(OK);
return aCylinder;
//Compute the Cylinder value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Cylinder driver failed");
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aCylinder->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = I3DPrimOperations.MakeCylinderPntVecRH(";
- TDF_Tool::Entry(thePnt->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- TDF_Tool::Entry(theVec->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- aDescr += (TCollection_AsciiString(theR)+", ");
- aDescr += (TCollection_AsciiString(theH)+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aCylinder << " = geompy.MakeCylinder("
+ << thePnt << ", " << theVec << ", " << theR << ", " << theH << ")";
SetErrorCode(OK);
return aCylinder;
//Compute the Cone value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Cone driver failed");
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aCone->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = I3DPrimOperations.MakeConeR1R2H(";
- aDescr += (TCollection_AsciiString(theR1)+", ");
- aDescr += (TCollection_AsciiString(theR2)+", ");
- aDescr += (TCollection_AsciiString(theH)+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aCone << " = geompy.MakeConeR1R2H("
+ << theR1 << ", " << theR2 << ", " << theH << ")";
SetErrorCode(OK);
return aCone;
//Compute the Cone value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Cone driver failed");
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aCone->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = I3DPrimOperations.MakeConePntVecR1R2H(";
- TDF_Tool::Entry(thePnt->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- TDF_Tool::Entry(theVec->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- aDescr += (TCollection_AsciiString(theR1)+", ");
- aDescr += (TCollection_AsciiString(theR2)+", ");
- aDescr += (TCollection_AsciiString(theH)+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aCone << " = geompy.MakeCone(" << thePnt
+ << ", " << theVec << ", " << theR1 << ", " << theR2 << ", " << theH << ")";
SetErrorCode(OK);
return aCone;
//Compute the Sphere value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Sphere driver failed");
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aSphere->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = I3DPrimOperations.MakeSphereR(";
- aDescr += (TCollection_AsciiString(theR)+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aSphere << " = geompy.MakeSphereR(" << theR << ")";
SetErrorCode(OK);
return aSphere;
//Compute the Sphere value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Sphere driver failed");
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aSphere->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = I3DPrimOperations.MakeSpherePntR(";
- TDF_Tool::Entry(thePnt->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- aDescr += (TCollection_AsciiString(theR)+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aSphere
+ << " = geompy.MakeSpherePntR(" << thePnt << ", " << theR << ")";
SetErrorCode(OK);
return aSphere;
//Compute the Torus value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Torus driver failed");
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(anEll->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = ICurvesOperations.MakeTorusRR(";
- aDescr += (TCollection_AsciiString(theRMajor)+", ");
- aDescr += (TCollection_AsciiString(theRMinor)+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << anEll << " = geompy.MakeTorusRR("
+ << theRMajor << ", " << theRMinor << ")";
SetErrorCode(OK);
return anEll;
//Compute the Torus value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Torus driver failed");
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(anEll->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = ICurvesOperations.MakeTorusPntVecRR(";
- TDF_Tool::Entry(thePnt->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- TDF_Tool::Entry(theVec->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- aDescr += (TCollection_AsciiString(theRMajor)+", ");
- aDescr += (TCollection_AsciiString(theRMinor)+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << anEll << " = geompy.MakeTorus(" << thePnt
+ << ", " << theVec << ", " << theRMajor << ", " << theRMinor << ")";
SetErrorCode(OK);
return anEll;
//Compute the Prism value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
- SetErrorCode("Prism driver failed");
+ //SetErrorCode("Prism driver failed");
+ SetErrorCode("Extrusion can not be created, check input data");
return NULL;
}
}
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aPrism->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = I3DPrimOperations.MakePrismVecH(";
- TDF_Tool::Entry(theBase->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- TDF_Tool::Entry(theVec->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- aDescr += (TCollection_AsciiString(theH)+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aPrism << " = geompy.MakePrismVecH("
+ << theBase << ", " << theVec << ", " << theH << ")";
SetErrorCode(OK);
return aPrism;
//Compute the Prism value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
- SetErrorCode("Prism driver failed");
+ //SetErrorCode("Prism driver failed");
+ SetErrorCode("Extrusion can not be created, check input data");
return NULL;
}
}
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aPrism->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = I3DPrimOperations.MakePrismVecH(";
- TDF_Tool::Entry(theBase->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- TDF_Tool::Entry(thePoint1->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- TDF_Tool::Entry(thePoint2->GetEntry(), anEntry);
- aDescr += (anEntry+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aPrism << " = geompy.MakePrism("
+ << theBase << ", " << thePoint1 << ", " << thePoint2 << ")";
SetErrorCode(OK);
return aPrism;
//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;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr;
- TDF_Tool::Entry(aPipe->GetEntry(), anEntry);
- aDescr += (anEntry + " = I3DPrimOperations.MakePipe(");
- TDF_Tool::Entry(theBase->GetEntry(), anEntry);
- aDescr += (anEntry + ", ");
- TDF_Tool::Entry(thePath->GetEntry(), anEntry);
- aDescr += (anEntry + ")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aPipe << " = geompy.MakePipe("
+ << theBase << ", " << thePath << ")";
SetErrorCode(OK);
return aPipe;
//Compute the Revolution value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Revolution driver failed");
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aRevolution->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = I3DPrimOperations.MakeRevolutionAxisAngle(";
- TDF_Tool::Entry(theBase->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- TDF_Tool::Entry(theAxis->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- aDescr += (TCollection_AsciiString(theAngle)+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aRevolution << " = geompy.MakeRevolution("
+ << theBase << ", " << theAxis << ", " << theAngle * 180.0 / PI << "*math.pi/180.0)";
SetErrorCode(OK);
return aRevolution;
//Compute the Solid value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Solid driver failed");
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aSolid->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = I3DPrimOperations.MakeSolidShell(";
- TDF_Tool::Entry(theShell->GetEntry(), anEntry);
- aDescr += (anEntry+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aSolid << " = geompy.MakeSolid(" << theShell << ")";
SetErrorCode(OK);
return aSolid;
* MakeFilling
*/
//=============================================================================
-Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFilling (Handle(GEOM_Object) theShape, int theMinDeg, int theMaxDeg, double theTol2D, double theTol3D, int theNbIter)
+Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFilling
+ (Handle(GEOM_Object) theShape, int theMinDeg, int theMaxDeg,
+ double theTol2D, double theTol3D, int theNbIter)
{
SetErrorCode(KO);
//Compute the Solid value
try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ OCC_CATCH_SIGNALS;
+#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
- SetErrorCode("Fiiling driver failed");
+ SetErrorCode("Filling driver failed");
return NULL;
}
}
catch (Standard_Failure) {
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
- SetErrorCode(aFail->GetMessageString());
+ if (strcmp(aFail->GetMessageString(), "Geom_BSplineSurface") == 0)
+ SetErrorCode("B-Spline surface construction failed");
+ else
+ SetErrorCode(aFail->GetMessageString());
return NULL;
}
//Make a Python command
- TCollection_AsciiString anEntry, aDescr("");
- TDF_Tool::Entry(aFilling->GetEntry(), anEntry);
- aDescr += anEntry;
- aDescr += " = ICurvesOperations.MakeFilling(";
- TDF_Tool::Entry(theShape->GetEntry(), anEntry);
- aDescr += (anEntry+", ");
- aDescr += (TCollection_AsciiString(theMinDeg)+", ");
- aDescr += (TCollection_AsciiString(theMaxDeg)+", ");
- aDescr += (TCollection_AsciiString(theTol2D)+", ");
- aDescr += (TCollection_AsciiString(theTol3D)+", ");
- aDescr += (TCollection_AsciiString(theNbIter)+")");
-
- aFunction->SetDescription(aDescr);
+ GEOM::TPythonDump(aFunction) << aFilling << " = geompy.MakeFilling("
+ << theShape << ", " << theMinDeg << ", " << theMaxDeg << ", "
+ << theTol2D << ", " << theTol3D << ", " << theNbIter << ")";
SetErrorCode(OK);
return aFilling;
}
+
+//=============================================================================
+/*!
+ * MakeThruSections
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThruSections(
+ const Handle(TColStd_HSequenceOfTransient)& theSeqSections,
+ bool theModeSolid,
+ double thePreci,
+ bool theRuled)
+{
+ Handle(GEOM_Object) anObj;
+ SetErrorCode(KO);
+ if(theSeqSections.IsNull())
+ return anObj;
+
+ Standard_Integer nbObj = theSeqSections->Length();
+ if (!nbObj)
+ return anObj;
+
+ //Add a new ThruSections object
+ Handle(GEOM_Object) aThruSect = GetEngine()->AddObject(GetDocID(), GEOM_THRUSECTIONS);
+
+
+ //Add a new ThruSections function
+
+ int aTypeFunc = (theRuled ? THRUSECTIONS_RULED : THRUSECTIONS_SMOOTHED);
+ Handle(GEOM_Function) aFunction =
+ aThruSect->AddFunction(GEOMImpl_ThruSectionsDriver::GetID(), aTypeFunc);
+ if (aFunction.IsNull()) return anObj;
+
+ //Check if the function is set correctly
+ if (aFunction->GetDriverGUID() != GEOMImpl_ThruSectionsDriver::GetID()) return NULL;
+
+ GEOMImpl_IThruSections aCI (aFunction);
+
+ Handle(TColStd_HSequenceOfTransient) aSeqSections = new TColStd_HSequenceOfTransient;
+
+ Standard_Integer i =1;
+ for( ; i <= nbObj; i++) {
+
+ Handle(Standard_Transient) anItem = theSeqSections->Value(i);
+ if(anItem.IsNull())
+ continue;
+
+ Handle(GEOM_Object) aSectObj = Handle(GEOM_Object)::DownCast(anItem);
+ if(!aSectObj.IsNull())
+ {
+ Handle(GEOM_Function) aRefSect = aSectObj->GetLastFunction();
+ if(!aRefSect.IsNull())
+ aSeqSections->Append(aRefSect);
+ }
+ }
+
+ if(!aSeqSections->Length())
+ return anObj;
+
+ aCI.SetSections(aSeqSections);
+ aCI.SetSolidMode(theModeSolid);
+ aCI.SetPrecision(thePreci);
+
+ //Compute the ThruSections value
+ try {
+#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+ 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());
+ return anObj;
+ }
+
+ //Make a Python command
+ GEOM::TPythonDump pyDump(aFunction);
+ pyDump << aThruSect << " = geompy.MakeThruSections([";
+
+ for(i =1 ; i <= nbObj; i++) {
+
+ Handle(Standard_Transient) anItem = theSeqSections->Value(i);
+ if(anItem.IsNull())
+ continue;
+
+ Handle(GEOM_Object) aSectObj = Handle(GEOM_Object)::DownCast(anItem);
+ if(!aSectObj.IsNull()) {
+ pyDump<< aSectObj;
+ if(i < nbObj)
+ pyDump<<", ";
+ }
+ }
+
+ pyDump<< "],"<<theModeSolid << "," << thePreci <<","<< theRuled <<")";
+
+ SetErrorCode(OK);
+ return aThruSect;
+
+
+}
+
+
+//=============================================================================
+/*!
+ * 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(GEOM_Object) anObj;
+ SetErrorCode(KO);
+ if(theBases.IsNull())
+ return anObj;
+
+ Standard_Integer nbBases = theBases->Length();
+
+ if (!nbBases)
+ return anObj;
+
+ Standard_Integer nbLocs = (theLocations.IsNull() ? 0 :theLocations->Length());
+ //Add a new Pipe object
+ Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GetDocID(), GEOM_PIPE);
+
+ //Add a new Pipe function
+
+ Handle(GEOM_Function) aFunction =
+ aPipeDS->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_DIFFERENT_SECTIONS);
+ if (aFunction.IsNull()) return anObj;
+
+ //Check if the function is set correctly
+ if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return anObj;
+
+ GEOMImpl_IPipeDiffSect aCI (aFunction);
+
+ Handle(GEOM_Function) aRefPath = thePath->GetLastFunction();
+ if(aRefPath.IsNull())
+ return anObj;
+
+ Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient;
+ Handle(TColStd_HSequenceOfTransient) aSeqLocs = new TColStd_HSequenceOfTransient;
+
+ Standard_Integer i =1;
+ for( ; i <= nbBases; i++) {
+
+ Handle(Standard_Transient) anItem = theBases->Value(i);
+ if(anItem.IsNull())
+ continue;
+
+ Handle(GEOM_Object) aBase = Handle(GEOM_Object)::DownCast(anItem);
+ if(aBase.IsNull())
+ continue;
+ Handle(GEOM_Function) aRefBase = aBase->GetLastFunction();
+ if(aRefBase.IsNull())
+ continue;
+ if(nbLocs)
+ {
+ Handle(Standard_Transient) anItemLoc = theLocations->Value(i);
+ if(anItemLoc.IsNull())
+ continue;
+
+ Handle(GEOM_Object) aLoc = Handle(GEOM_Object)::DownCast(anItemLoc);
+ if(aLoc.IsNull())
+ continue;
+ Handle(GEOM_Function) aRefLoc = aLoc->GetLastFunction();
+ if(aRefLoc.IsNull())
+ continue;
+ aSeqLocs->Append(aRefLoc);
+ }
+ aSeqBases->Append(aRefBase);
+ }
+
+ if(!aSeqBases->Length())
+ return anObj;
+
+ aCI.SetBases(aSeqBases);
+ aCI.SetLocations(aSeqLocs);
+ aCI.SetPath(aRefPath);
+ aCI.SetWithContactMode(theWithContact);
+ aCI.SetWithCorrectionMode(theWithCorrections);
+
+ //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 with defferent section driver failed");
+ return anObj;
+ }
+ }
+ catch (Standard_Failure) {
+ Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+ SetErrorCode(aFail->GetMessageString());
+ return anObj;
+ }
+
+ //Make a Python command
+ GEOM::TPythonDump pyDump(aFunction);
+ pyDump << aPipeDS << " = geompy.MakePipeWithDifferentSections([";
+
+ for(i =1 ; i <= nbBases; i++) {
+
+ Handle(Standard_Transient) anItem = theBases->Value(i);
+ if(anItem.IsNull())
+ continue;
+
+ Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem);
+ if(!anObj.IsNull()) {
+ pyDump<< anObj;
+ if(i < nbBases)
+ pyDump<<", ";
+ }
+
+ }
+
+ pyDump<< "], [";
+
+ for(i =1 ; i <= nbLocs; i++) {
+
+ Handle(Standard_Transient) anItem = theLocations->Value(i);
+ if(anItem.IsNull())
+ continue;
+
+ Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem);
+ if(!anObj.IsNull()) {
+ pyDump<< anObj;
+ if(i < nbLocs)
+ pyDump<<", ";
+ }
+ }
+
+ pyDump<< "], "<<thePath<<","<<theWithContact << "," << theWithCorrections<<")";
+
+ SetErrorCode(OK);
+ return aPipeDS;
+
+
+}
+
+
+//=============================================================================
+/*!
+ * MakePipeWithShellSections
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections(
+ const Handle(TColStd_HSequenceOfTransient)& theBases,
+ const Handle(TColStd_HSequenceOfTransient)& theSubBases,
+ const Handle(TColStd_HSequenceOfTransient)& theLocations,
+ const Handle(GEOM_Object)& thePath,
+ bool theWithContact,
+ bool theWithCorrections)
+{
+ Handle(GEOM_Object) anObj;
+ SetErrorCode(KO);
+ if(theBases.IsNull())
+ return anObj;
+
+ Standard_Integer nbBases = theBases->Length();
+
+ if (!nbBases)
+ return anObj;
+
+ 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);
+
+ //Add a new Pipe function
+
+ Handle(GEOM_Function) aFunction =
+ aPipeDS->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_SHELL_SECTIONS);
+ if (aFunction.IsNull()) return anObj;
+
+ //Check if the function is set correctly
+ if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return anObj;
+
+ //GEOMImpl_IPipeDiffSect aCI (aFunction);
+ GEOMImpl_IPipeShellSect aCI (aFunction);
+
+ Handle(GEOM_Function) aRefPath = thePath->GetLastFunction();
+ if(aRefPath.IsNull())
+ return anObj;
+
+ Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient;
+ Handle(TColStd_HSequenceOfTransient) aSeqSubBases = new TColStd_HSequenceOfTransient;
+ Handle(TColStd_HSequenceOfTransient) aSeqLocs = new TColStd_HSequenceOfTransient;
+
+ Standard_Integer i =1;
+ for( ; i <= nbBases; i++) {
+
+ Handle(Standard_Transient) anItem = theBases->Value(i);
+ if(anItem.IsNull())
+ continue;
+ Handle(GEOM_Object) aBase = Handle(GEOM_Object)::DownCast(anItem);
+ if(aBase.IsNull())
+ continue;
+ Handle(GEOM_Function) aRefBase = aBase->GetLastFunction();
+ if(aRefBase.IsNull())
+ continue;
+
+ if( nbSubBases >= nbBases ) {
+ Handle(Standard_Transient) aSubItem = theSubBases->Value(i);
+ if(aSubItem.IsNull())
+ continue;
+ Handle(GEOM_Object) aSubBase = Handle(GEOM_Object)::DownCast(aSubItem);
+ if(aSubBase.IsNull())
+ continue;
+ Handle(GEOM_Function) aRefSubBase = aSubBase->GetLastFunction();
+ if(aRefSubBase.IsNull())
+ continue;
+ aSeqSubBases->Append(aRefSubBase);
+ }
+
+ if(nbLocs) {
+ Handle(Standard_Transient) anItemLoc = theLocations->Value(i);
+ if(anItemLoc.IsNull())
+ continue;
+ Handle(GEOM_Object) aLoc = Handle(GEOM_Object)::DownCast(anItemLoc);
+ if(aLoc.IsNull())
+ continue;
+ Handle(GEOM_Function) aRefLoc = aLoc->GetLastFunction();
+ if(aRefLoc.IsNull())
+ continue;
+ aSeqLocs->Append(aRefLoc);
+ }
+
+ aSeqBases->Append(aRefBase);
+ }
+
+ if(!aSeqBases->Length())
+ return anObj;
+
+ aCI.SetBases(aSeqBases);
+ aCI.SetSubBases(aSeqSubBases);
+ aCI.SetLocations(aSeqLocs);
+ aCI.SetPath(aRefPath);
+ aCI.SetWithContactMode(theWithContact);
+ aCI.SetWithCorrectionMode(theWithCorrections);
+
+ //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 with shell sections driver failed");
+ return anObj;
+ }
+ }
+ catch (Standard_Failure) {
+ Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+ SetErrorCode(aFail->GetMessageString());
+ return anObj;
+ }
+
+ //Make a Python command
+ GEOM::TPythonDump pyDump(aFunction);
+ pyDump << aPipeDS << " = geompy.MakePipeWithShellSections([";
+
+ for(i =1 ; i <= nbBases; i++) {
+
+ Handle(Standard_Transient) anItem = theBases->Value(i);
+ if(anItem.IsNull())
+ continue;
+
+ Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem);
+ if(!anObj.IsNull()) {
+ pyDump<< anObj;
+ if(i < nbBases)
+ pyDump<<", ";
+ }
+
+ }
+
+ pyDump<< "], [";
+
+ for(i =1 ; i <= nbLocs; i++) {
+
+ Handle(Standard_Transient) anItem = theLocations->Value(i);
+ if(anItem.IsNull())
+ continue;
+
+ Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem);
+ if(!anObj.IsNull()) {
+ pyDump<< anObj;
+ if(i < nbLocs)
+ pyDump<<", ";
+ }
+ }
+
+ pyDump<< "], "<<thePath<<","<<theWithContact << "," << theWithCorrections<<")";
+
+ SetErrorCode(OK);
+ return aPipeDS;
+
+}
+