X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_IBooleanOperations.cxx;h=3cd0f6b40e899e38f996bbdc97f6ad6140d7f330;hb=001d93f1ef3a53aa9df53b3589a0c72849b22a4e;hp=a96b1810bf54d3cd0680e0ca0a9a851d3baf3508;hpb=af323ccd1d47fe27b941822a729014c33859acfe;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx b/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx index a96b1810b..3cd0f6b40 100644 --- a/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -6,7 +6,7 @@ // 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. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -35,8 +35,6 @@ #include #include -#include - #include #include "utilities.h" @@ -49,8 +47,8 @@ * constructor: */ //============================================================================= -GEOMImpl_IBooleanOperations::GEOMImpl_IBooleanOperations (GEOM_Engine* theEngine, int theDocID) -: GEOM_IOperations(theEngine, theDocID) +GEOMImpl_IBooleanOperations::GEOMImpl_IBooleanOperations (GEOM_Engine* theEngine) +: GEOM_IOperations(theEngine) { MESSAGE("GEOMImpl_IBooleanOperations::GEOMImpl_IBooleanOperations"); } @@ -71,16 +69,18 @@ GEOMImpl_IBooleanOperations::~GEOMImpl_IBooleanOperations() * MakeBoolean */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object) theShape1, - Handle(GEOM_Object) theShape2, - Standard_Integer theOp) +Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean + (Handle(GEOM_Object) theShape1, + Handle(GEOM_Object) theShape2, + const Standard_Integer theOp, + const Standard_Boolean IsCheckSelfInte) { SetErrorCode(KO); if (theShape1.IsNull() || theShape2.IsNull()) return NULL; //Add a new Boolean object - Handle(GEOM_Object) aBool = GetEngine()->AddObject(GetDocID(), GEOM_BOOLEAN); + Handle(GEOM_Object) aBool = GetEngine()->AddObject(GEOM_BOOLEAN); //Add a new Boolean function Handle(GEOM_Function) aFunction; @@ -108,20 +108,18 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object aCI.SetShape1(aRef1); aCI.SetShape2(aRef2); + aCI.SetCheckSelfIntersection(IsCheckSelfInte); //Compute the Boolean value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Boolean 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; } @@ -133,7 +131,76 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object else if (theOp == 3) pd << " = geompy.MakeFuse("; else if (theOp == 4) pd << " = geompy.MakeSection("; else {} - pd << theShape1 << ", " << theShape2 << ")"; + pd << theShape1 << ", " << theShape2; + + if (IsCheckSelfInte) { + pd << ", True"; + } + + pd << ")"; + + SetErrorCode(OK); + return aBool; +} + +//============================================================================= +/*! + * MakeFuse + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuse + (Handle(GEOM_Object) theShape1, + Handle(GEOM_Object) theShape2, + const bool IsCheckSelfInte, + const bool IsRmExtraEdges) +{ + SetErrorCode(KO); + + if (theShape1.IsNull() || theShape2.IsNull()) return NULL; + + //Add a new Boolean object + Handle(GEOM_Object) aBool = GetEngine()->AddObject(GEOM_BOOLEAN); + + //Add a new Boolean function + Handle(GEOM_Function) aFunction = + aBool->AddFunction(GEOMImpl_BooleanDriver::GetID(), BOOLEAN_FUSE); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BooleanDriver::GetID()) return NULL; + + GEOMImpl_IBoolean aCI (aFunction); + + Handle(GEOM_Function) aRef1 = theShape1->GetLastFunction(); + Handle(GEOM_Function) aRef2 = theShape2->GetLastFunction(); + + if (aRef1.IsNull() || aRef2.IsNull()) return NULL; + + aCI.SetShape1(aRef1); + aCI.SetShape2(aRef2); + aCI.SetCheckSelfIntersection(IsCheckSelfInte); + aCI.SetRmExtraEdges(IsRmExtraEdges); + + //Compute the Boolean value + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Boolean driver failed"); + return NULL; + } + } + catch (Standard_Failure& aFail) { + SetErrorCode(aFail.GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump pd (aFunction); + + pd << aBool << " = geompy.MakeFuse("; + pd << theShape1 << ", " << theShape2 << ", " + << IsCheckSelfInte << ", " << IsRmExtraEdges << ")"; SetErrorCode(OK); return aBool; @@ -145,14 +212,16 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object */ //============================================================================= Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuseList - (const Handle(TColStd_HSequenceOfTransient)& theShapes) + (const Handle(TColStd_HSequenceOfTransient)& theShapes, + const bool IsCheckSelfInte, + const bool IsRmExtraEdges) { SetErrorCode(KO); if (theShapes.IsNull()) return NULL; //Add a new Boolean object - Handle(GEOM_Object) aBool = GetEngine()->AddObject(GetDocID(), GEOM_BOOLEAN); + Handle(GEOM_Object) aBool = GetEngine()->AddObject(GEOM_BOOLEAN); //Add a new Boolean function Handle(GEOM_Function) aFunction = @@ -172,26 +241,27 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuseList if (aShapesSeq.IsNull()) return NULL; aCI.SetShapes(aShapesSeq); + aCI.SetCheckSelfIntersection(IsCheckSelfInte); + aCI.SetRmExtraEdges(IsRmExtraEdges); //Compute the Boolean value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Boolean 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) << aBool << - " = geompy.MakeFuseList([" << aDescription.ToCString() << "])"; + GEOM::TPythonDump pd (aFunction); + + pd << aBool << " = geompy.MakeFuseList([" << aDescription.ToCString() << "], " + << IsCheckSelfInte << ", " << IsRmExtraEdges << ")"; SetErrorCode(OK); return aBool; @@ -203,14 +273,15 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuseList */ //============================================================================= Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCommonList - (const Handle(TColStd_HSequenceOfTransient)& theShapes) + (const Handle(TColStd_HSequenceOfTransient)& theShapes, + const Standard_Boolean IsCheckSelfInte) { SetErrorCode(KO); if (theShapes.IsNull()) return NULL; //Add a new Boolean object - Handle(GEOM_Object) aBool = GetEngine()->AddObject(GetDocID(), GEOM_BOOLEAN); + Handle(GEOM_Object) aBool = GetEngine()->AddObject(GEOM_BOOLEAN); //Add a new Boolean function Handle(GEOM_Function) aFunction = @@ -230,26 +301,32 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCommonList if (aShapesSeq.IsNull()) return NULL; aCI.SetShapes(aShapesSeq); + aCI.SetCheckSelfIntersection(IsCheckSelfInte); //Compute the Boolean value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Boolean 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) << aBool << - " = geompy.MakeCommonList([" << aDescription.ToCString() << "])"; + GEOM::TPythonDump pd (aFunction); + + pd << aBool << + " = geompy.MakeCommonList([" << aDescription.ToCString() << "]"; + + if (IsCheckSelfInte) { + pd << ", True"; + } + + pd << ")"; SetErrorCode(OK); return aBool; @@ -262,14 +339,15 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCommonList //============================================================================= Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCutList (Handle(GEOM_Object) theMainShape, - const Handle(TColStd_HSequenceOfTransient)& theShapes) + const Handle(TColStd_HSequenceOfTransient)& theShapes, + const Standard_Boolean IsCheckSelfInte) { SetErrorCode(KO); if (theShapes.IsNull()) return NULL; //Add a new Boolean object - Handle(GEOM_Object) aBool = GetEngine()->AddObject(GetDocID(), GEOM_BOOLEAN); + Handle(GEOM_Object) aBool = GetEngine()->AddObject(GEOM_BOOLEAN); //Add a new Boolean function Handle(GEOM_Function) aFunction = @@ -293,26 +371,32 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCutList aCI.SetShape1(aMainRef); aCI.SetShapes(aShapesSeq); + aCI.SetCheckSelfIntersection(IsCheckSelfInte); //Compute the Boolean value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Boolean 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) << aBool << " = geompy.MakeCutList(" - << theMainShape << ", [" << aDescription.ToCString() << "])"; + GEOM::TPythonDump pd (aFunction); + + pd << aBool << " = geompy.MakeCutList(" + << theMainShape << ", [" << aDescription.ToCString() << "]"; + + if (IsCheckSelfInte) { + pd << ", True"; + } + + pd << ")"; SetErrorCode(OK); return aBool; @@ -332,12 +416,13 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition const Standard_Boolean theRemoveWebs, const Handle(TColStd_HArray1OfInteger)& theMaterials, const Standard_Integer theKeepNonlimitShapes, - const Standard_Boolean thePerformSelfIntersections) + const Standard_Boolean thePerformSelfIntersections, + const Standard_Boolean IsCheckSelfInte) { SetErrorCode(KO); //Add a new Partition object - Handle(GEOM_Object) aPartition = GetEngine()->AddObject(GetDocID(), GEOM_PARTITION); + Handle(GEOM_Object) aPartition = GetEngine()->AddObject(GEOM_PARTITION); //Add a new Partition function Handle(GEOM_Function) aFunction; @@ -398,6 +483,7 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition // Limit aCI.SetLimit(theLimit); aCI.SetKeepNonlimitShapes(theKeepNonlimitShapes); + aCI.SetCheckSelfIntersection(IsCheckSelfInte); // Materials if (theRemoveWebs) { @@ -413,17 +499,14 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition //Compute the Partition try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Partition 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; } @@ -449,7 +532,13 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition pd << ", " << theMaterials->Value(i); } } - pd << "], " << theKeepNonlimitShapes <<")"; + pd << "], " << theKeepNonlimitShapes; + + if (IsCheckSelfInte && !thePerformSelfIntersections) { + pd << ", True"; + } + + pd << ")"; SetErrorCode(OK); return aPartition; @@ -468,7 +557,7 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeHalfPartition if (theShape.IsNull() || thePlane.IsNull()) return NULL; //Add a new Boolean object - Handle(GEOM_Object) aPart = GetEngine()->AddObject(GetDocID(), GEOM_PARTITION); + Handle(GEOM_Object) aPart = GetEngine()->AddObject(GEOM_PARTITION); //Add a new Partition function Handle(GEOM_Function) aFunction = @@ -490,23 +579,21 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeHalfPartition //Compute the Partition value try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Partition 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) << aPart << " = geompy.MakeHalfPartition(" - << theShape << ", " << thePlane << ")"; + GEOM::TPythonDump pd (aFunction); + pd << aPart << " = geompy.MakeHalfPartition(" + << theShape << ", " << thePlane << ")"; SetErrorCode(OK); return aPart;