X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FGEOMImpl%2FGEOMImpl_IBooleanOperations.cxx;h=be4bfb3d3757ff306d8725eb3181a79e247c8753;hb=982407874b25696ca989bf21ce96e1d309045fcf;hp=3be15dbeb6e0887738e5637370613187e1ec46d6;hpb=73555c78ebf12a1fdb85157b8e7934ad566ae90a;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx b/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx index 3be15dbeb..be4bfb3d3 100644 --- a/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2013 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 @@ -71,9 +71,11 @@ 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); @@ -108,6 +110,7 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object aCI.SetShape1(aRef1); aCI.SetShape2(aRef2); + aCI.SetCheckSelfIntersection(IsCheckSelfInte); //Compute the Boolean value try { @@ -133,7 +136,222 @@ 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; +} + +//============================================================================= +/*! + * MakeFuseList + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuseList + (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); + + //Add a new Boolean function + Handle(GEOM_Function) aFunction = + aBool->AddFunction(GEOMImpl_BooleanDriver::GetID(), BOOLEAN_FUSE_LIST); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BooleanDriver::GetID()) return NULL; + + GEOMImpl_IBoolean aCI (aFunction); + + TCollection_AsciiString aDescription; + Handle(TColStd_HSequenceOfTransient) aShapesSeq = + getShapeFunctions(theShapes, aDescription); + + 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()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump pd (aFunction); + + pd << aBool << + " = geompy.MakeFuseList([" << aDescription.ToCString() << "]"; + + if (IsCheckSelfInte) { + pd << ", True"; + } + + pd << ")"; + + SetErrorCode(OK); + return aBool; +} + +//============================================================================= +/*! + * MakeCommonList + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCommonList + (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); + + //Add a new Boolean function + Handle(GEOM_Function) aFunction = + aBool->AddFunction(GEOMImpl_BooleanDriver::GetID(), BOOLEAN_COMMON_LIST); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BooleanDriver::GetID()) return NULL; + + GEOMImpl_IBoolean aCI (aFunction); + + TCollection_AsciiString aDescription; + Handle(TColStd_HSequenceOfTransient) aShapesSeq = + getShapeFunctions(theShapes, aDescription); + + 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()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump pd (aFunction); + + pd << aBool << + " = geompy.MakeCommonList([" << aDescription.ToCString() << "]"; + + if (IsCheckSelfInte) { + pd << ", True"; + } + + pd << ")"; + + SetErrorCode(OK); + return aBool; +} + +//============================================================================= +/*! + * MakeCutList + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCutList + (Handle(GEOM_Object) theMainShape, + 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); + + //Add a new Boolean function + Handle(GEOM_Function) aFunction = + aBool->AddFunction(GEOMImpl_BooleanDriver::GetID(), BOOLEAN_CUT_LIST); + + 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) aMainRef = theMainShape->GetLastFunction(); + + if (aMainRef.IsNull()) return NULL; + + TCollection_AsciiString aDescription; + Handle(TColStd_HSequenceOfTransient) aShapesSeq = + getShapeFunctions(theShapes, aDescription); + + if (aShapesSeq.IsNull()) return NULL; + + 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()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump pd (aFunction); + + pd << aBool << " = geompy.MakeCutList(" + << theMainShape << ", [" << aDescription.ToCString() << "]"; + + if (IsCheckSelfInte) { + pd << ", True"; + } + + pd << ")"; SetErrorCode(OK); return aBool; @@ -173,85 +391,47 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition GEOMImpl_IPartition aCI (aFunction); - Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; - Handle(TColStd_HSequenceOfTransient) aToolsSeq = new TColStd_HSequenceOfTransient; - Handle(TColStd_HSequenceOfTransient) aKeepInsSeq = new TColStd_HSequenceOfTransient; - Handle(TColStd_HSequenceOfTransient) aRemInsSeq = new TColStd_HSequenceOfTransient; - - Standard_Integer ind, aLen; - TCollection_AsciiString anEntry; + Handle(TColStd_HSequenceOfTransient) aShapesSeq; + Handle(TColStd_HSequenceOfTransient) aToolsSeq; + Handle(TColStd_HSequenceOfTransient) aKeepInsSeq; + Handle(TColStd_HSequenceOfTransient) aRemInsSeq; TCollection_AsciiString aShapesDescr, aToolsDescr, aKeepInsDescr, aRemoveInsDescr; // Shapes - aLen = theShapes->Length(); - for (ind = 1; ind <= aLen; ind++) { - Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theShapes->Value(ind)); - Handle(GEOM_Function) aRefSh = anObj->GetLastFunction(); - if (aRefSh.IsNull()) { - SetErrorCode("NULL shape for Partition"); - return NULL; - } - aShapesSeq->Append(aRefSh); + aShapesSeq = getShapeFunctions(theShapes, aShapesDescr); - // For Python command - TDF_Tool::Entry(anObj->GetEntry(), anEntry); - if (ind > 1) aShapesDescr += ", "; - aShapesDescr += anEntry; + if (aShapesSeq.IsNull()) { + SetErrorCode("NULL shape for Partition"); + return NULL; } - aCI.SetShapes(aShapesSeq); // Tools - aLen = theTools->Length(); - for (ind = 1; ind <= aLen; ind++) { - Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theTools->Value(ind)); - Handle(GEOM_Function) aRefSh = anObj->GetLastFunction(); - if (aRefSh.IsNull()) { - SetErrorCode("NULL tool shape for Partition"); - return NULL; - } - aToolsSeq->Append(aRefSh); + aToolsSeq = getShapeFunctions(theTools, aToolsDescr); - // For Python command - TDF_Tool::Entry(anObj->GetEntry(), anEntry); - if (ind > 1) aToolsDescr += ", "; - aToolsDescr += anEntry; + if (aToolsSeq.IsNull()) { + SetErrorCode("NULL tool shape for Partition"); + return NULL; } - aCI.SetTools(aToolsSeq); // Keep Inside - aLen = theKeepIns->Length(); - for (ind = 1; ind <= aLen; ind++) { - Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theKeepIns->Value(ind)); - Handle(GEOM_Function) aRefSh = anObj->GetLastFunction(); - if (aRefSh.IsNull()) { - SetErrorCode("NULL shape for Partition"); - return NULL; - } - aKeepInsSeq->Append(aRefSh); + aKeepInsSeq = getShapeFunctions(theKeepIns, aKeepInsDescr); - // For Python command - TDF_Tool::Entry(anObj->GetEntry(), anEntry); - if (ind > 1) aKeepInsDescr += ", "; - aKeepInsDescr += anEntry; + if (aKeepInsSeq.IsNull()) { + SetErrorCode("NULL shape for Partition"); + return NULL; } - aCI.SetKeepIns(aKeepInsSeq); // Remove Inside - aLen = theRemoveIns->Length(); - for (ind = 1; ind <= aLen; ind++) { - Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theRemoveIns->Value(ind)); - Handle(GEOM_Function) aRefSh = anObj->GetLastFunction(); - if (aRefSh.IsNull()) { - SetErrorCode("NULL shape for Partition"); - return NULL; - } - aRemInsSeq->Append(aRefSh); + aRemInsSeq = getShapeFunctions(theRemoveIns, aRemoveInsDescr); - // For Python command - TDF_Tool::Entry(anObj->GetEntry(), anEntry); - if (ind > 1) aRemoveInsDescr += ", "; - aRemoveInsDescr += anEntry; + if (aRemInsSeq.IsNull()) { + SetErrorCode("NULL shape for Partition"); + return NULL; } + + aCI.SetShapes(aShapesSeq); + aCI.SetTools(aToolsSeq); + aCI.SetKeepIns(aKeepInsSeq); aCI.SetRemoveIns(aRemInsSeq); // Limit @@ -370,3 +550,46 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeHalfPartition SetErrorCode(OK); return aPart; } + +//============================================================================= +/*! + * getShapeFunctions + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) + GEOMImpl_IBooleanOperations::getShapeFunctions + (const Handle(TColStd_HSequenceOfTransient)& theObjects, + TCollection_AsciiString &theDescription) +{ + Handle(TColStd_HSequenceOfTransient) aResult = + new TColStd_HSequenceOfTransient; + Standard_Integer aNbObjects = theObjects->Length(); + Standard_Integer i; + TCollection_AsciiString anEntry; + Handle(GEOM_Object) anObj; + Handle(GEOM_Function) aRefObj; + + // Shapes + for (i = 1; i <= aNbObjects; i++) { + anObj = Handle(GEOM_Object)::DownCast(theObjects->Value(i)); + aRefObj = anObj->GetLastFunction(); + + if (aRefObj.IsNull()) { + aResult.Nullify(); + break; + } + + aResult->Append(aRefObj); + + // For Python command + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + + if (i > 1) { + theDescription += ", "; + } + + theDescription += anEntry; + } + + return aResult; +}