X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_IBooleanOperations.cxx;h=e6ba7ff3012b65853766a9535e6cf8a9cb48bdee;hb=3059f9d5521dd7c91c35c50afbd6beb18b8826fd;hp=ad6fba6f4992e19bb78f8b9213d4886535da2556;hpb=d3dd282390888d7dc091ba2c2ffe7923bd7458e6;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx b/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx index ad6fba6f4..e6ba7ff30 100644 --- a/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx @@ -1,20 +1,45 @@ -using namespace std; - -#include "GEOMImpl_IBooleanOperations.hxx" - -#include "GEOM_Function.hxx" -#include "GEOMImpl_Types.hxx" - -#include "GEOMImpl_BooleanDriver.hxx" -#include "GEOMImpl_IBoolean.hxx" - -#include "GEOMImpl_PartitionDriver.hxx" -#include "GEOMImpl_IPartition.hxx" +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + +#include + +#include +#include + +#include + +#include +#include + +#include +#include #include #include "utilities.h" +#include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC //============================================================================= @@ -22,7 +47,7 @@ using namespace std; * constructor: */ //============================================================================= -GEOMImpl_IBooleanOperations::GEOMImpl_IBooleanOperations (GEOM_Engine* theEngine, int theDocID) +GEOMImpl_IBooleanOperations::GEOMImpl_IBooleanOperations (GEOM_Engine* theEngine, int theDocID) : GEOM_IOperations(theEngine, theDocID) { MESSAGE("GEOMImpl_IBooleanOperations::GEOMImpl_IBooleanOperations"); @@ -51,10 +76,10 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object SetErrorCode(KO); if (theShape1.IsNull() || theShape2.IsNull()) return NULL; - - //Add a new Boolean object + + //Add a new Boolean object Handle(GEOM_Object) aBool = GetEngine()->AddObject(GetDocID(), GEOM_BOOLEAN); - + //Add a new Boolean function Handle(GEOM_Function) aFunction; if (theOp == 1) { @@ -70,10 +95,10 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object if (aFunction.IsNull()) return NULL; //Check if the function is set correctly - if (aFunction->GetDriverGUID() != GEOMImpl_BooleanDriver::GetID()) return NULL; + if (aFunction->GetDriverGUID() != GEOMImpl_BooleanDriver::GetID()) return NULL; GEOMImpl_IBoolean aCI (aFunction); - + Handle(GEOM_Function) aRef1 = theShape1->GetLastFunction(); Handle(GEOM_Function) aRef2 = theShape2->GetLastFunction(); @@ -84,6 +109,9 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object //Compute the Boolean value try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Boolean driver failed"); return NULL; @@ -95,21 +123,18 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object return NULL; } - //Make a Python command - TCollection_AsciiString anEntry, aDescr(""); - TDF_Tool::Entry(aBool->GetEntry(), anEntry); - aDescr += anEntry; - aDescr += " = IBooleanOperations.MakeBoolean("; - TDF_Tool::Entry(theShape1->GetEntry(), anEntry); - aDescr += (anEntry+", "); - TDF_Tool::Entry(theShape2->GetEntry(), anEntry); - aDescr += (anEntry+", "); - aDescr += (TCollection_AsciiString(theOp)+")"); - - aFunction->SetDescription(aDescr); + //Make a Python command + GEOM::TPythonDump pd (aFunction); + pd << aBool; + if (theOp == 1) pd << " = geompy.MakeCommon("; + else if (theOp == 2) pd << " = geompy.MakeCut("; + else if (theOp == 3) pd << " = geompy.MakeFuse("; + else if (theOp == 4) pd << " = geompy.MakeSection("; + else {} + pd << theShape1 << ", " << theShape2 << ")"; SetErrorCode(OK); - return aBool; + return aBool; } //============================================================================= @@ -118,31 +143,33 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object */ //============================================================================= Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition - (const Handle(TColStd_HSequenceOfTransient)& theShapes, + (const Handle(TColStd_HSequenceOfTransient)& theShapes, const Handle(TColStd_HSequenceOfTransient)& theTools, const Handle(TColStd_HSequenceOfTransient)& theKeepIns, const Handle(TColStd_HSequenceOfTransient)& theRemoveIns, - const Standard_Integer theLimit, - const Standard_Boolean theRemoveWebs, - const Handle(TColStd_HArray1OfInteger)& theMaterials) + const Standard_Integer theLimit, + const Standard_Boolean theRemoveWebs, + const Handle(TColStd_HArray1OfInteger)& theMaterials, + const Standard_Integer theKeepNonlimitShapes, + const Standard_Boolean thePerformSelfIntersections) { SetErrorCode(KO); - //Add a new Partition object + //Add a new Partition object Handle(GEOM_Object) aPartition = GetEngine()->AddObject(GetDocID(), GEOM_PARTITION); - + //Add a new Partition function - Handle(GEOM_Function) aFunction = - aPartition->AddFunction(GEOMImpl_PartitionDriver::GetID(), PARTITION_PARTITION); + Handle(GEOM_Function) aFunction; + if (thePerformSelfIntersections) + aFunction = aPartition->AddFunction(GEOMImpl_PartitionDriver::GetID(), PARTITION_PARTITION); + else + aFunction = aPartition->AddFunction(GEOMImpl_PartitionDriver::GetID(), PARTITION_NO_SELF_INTERSECTIONS); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly - if (aFunction->GetDriverGUID() != GEOMImpl_PartitionDriver::GetID()) return NULL; + if (aFunction->GetDriverGUID() != GEOMImpl_PartitionDriver::GetID()) return NULL; GEOMImpl_IPartition aCI (aFunction); - -// int aLen = theShapes.size(); -// aCI.SetLength(aLen); Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; Handle(TColStd_HSequenceOfTransient) aToolsSeq = new TColStd_HSequenceOfTransient; @@ -227,12 +254,14 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition // Limit aCI.SetLimit(theLimit); + aCI.SetKeepNonlimitShapes(theKeepNonlimitShapes); // Materials if (theRemoveWebs) { if (theMaterials.IsNull()) { Handle(TColStd_HArray1OfInteger) aMaterials = new TColStd_HArray1OfInteger (1, aShapesSeq->Length()); + aMaterials->Init(0); aCI.SetMaterials(aMaterials); } else { aCI.SetMaterials(theMaterials); @@ -241,6 +270,9 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition //Compute the Partition try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Partition driver failed"); return NULL; @@ -252,40 +284,32 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition return NULL; } - //Make a Python command - TCollection_AsciiString aDescr; - TDF_Tool::Entry(aPartition->GetEntry(), anEntry); - aDescr += anEntry; - aDescr += " = IBooleanOperations.MakePartition(["; - // Shapes - aDescr += aShapesDescr + "], ["; - // Tools - aDescr += aToolsDescr + "], ["; - // Keep Ins - aDescr += aKeepInsDescr + "], ["; - // Remove Ins - aDescr += aRemoveInsDescr + "], "; - // Limit - aDescr += TCollection_AsciiString(theLimit) + ", "; - // Remove Webs - if (theRemoveWebs) aDescr += "1, ["; - else aDescr += "0, ["; + //Make a Python command + GEOM::TPythonDump pd (aFunction); + if (thePerformSelfIntersections) + pd << aPartition << " = geompy.MakePartition(["; + else + pd << aPartition << " = geompy.MakePartitionNonSelfIntersectedShape(["; + + // Shapes, Tools + pd << aShapesDescr.ToCString() << "], [" << aToolsDescr.ToCString() << "], ["; + // Keep Ins, Remove Ins + pd << aKeepInsDescr.ToCString() << "], [" << aRemoveInsDescr.ToCString() << "], "; + // Limit, Remove Webs + pd << TopAbs_ShapeEnum(theLimit) << ", " << (int)theRemoveWebs << ", ["; // Materials - if (theMaterials->Length() > 0) { + if (!theMaterials.IsNull() && theMaterials->Length() > 0) { int i = theMaterials->Lower(); - aDescr += TCollection_AsciiString(theMaterials->Value(i)); + pd << theMaterials->Value(i); i++; for (; i <= theMaterials->Upper(); i++) { - aDescr += ", "; - aDescr += TCollection_AsciiString(theMaterials->Value(i)); + pd << ", " << theMaterials->Value(i); } } - aDescr += "])"; - - aFunction->SetDescription(aDescr); + pd << "], " << theKeepNonlimitShapes <<")"; SetErrorCode(OK); - return aPartition; + return aPartition; } //============================================================================= @@ -299,20 +323,20 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeHalfPartition SetErrorCode(KO); if (theShape.IsNull() || thePlane.IsNull()) return NULL; - - //Add a new Boolean object - Handle(GEOM_Object) aPart = GetEngine()->AddObject(GetDocID(), GEOM_BOOLEAN); - + + //Add a new Boolean object + Handle(GEOM_Object) aPart = GetEngine()->AddObject(GetDocID(), GEOM_PARTITION); + //Add a new Partition function Handle(GEOM_Function) aFunction = aPart->AddFunction(GEOMImpl_PartitionDriver::GetID(), PARTITION_HALF); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly - if (aFunction->GetDriverGUID() != GEOMImpl_PartitionDriver::GetID()) return NULL; + if (aFunction->GetDriverGUID() != GEOMImpl_PartitionDriver::GetID()) return NULL; GEOMImpl_IPartition aCI (aFunction); - + Handle(GEOM_Function) aRef1 = theShape->GetLastFunction(); Handle(GEOM_Function) aRef2 = thePlane->GetLastFunction(); @@ -323,6 +347,9 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeHalfPartition //Compute the Partition value try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Partition driver failed"); return NULL; @@ -334,18 +361,10 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeHalfPartition return NULL; } - //Make a Python command - TCollection_AsciiString anEntry, aDescr; - TDF_Tool::Entry(aPart->GetEntry(), anEntry); - aDescr += anEntry; - aDescr += " = IBooleanOperations.MakePartition("; - TDF_Tool::Entry(theShape->GetEntry(), anEntry); - aDescr += (anEntry+", "); - TDF_Tool::Entry(thePlane->GetEntry(), anEntry); - aDescr += (anEntry+")"); - - aFunction->SetDescription(aDescr); + //Make a Python command + GEOM::TPythonDump(aFunction) << aPart << " = geompy.MakeHalfPartition(" + << theShape << ", " << thePlane << ")"; SetErrorCode(OK); - return aPart; + return aPart; }