From a7a6f0422622aefc5cc8e397b54a207c19ce2b67 Mon Sep 17 00:00:00 2001 From: dbv Date: Mon, 20 Aug 2018 10:48:12 +0300 Subject: [PATCH 1/1] Issue #2563: CEA 2018-1 Common Added simple mode with one Objects field in Common feature. --- src/FeaturesAPI/FeaturesAPI_BooleanCommon.cpp | 45 ++- src/FeaturesAPI/FeaturesAPI_BooleanCommon.h | 19 +- src/FeaturesPlugin/CMakeLists.txt | 2 + .../FeaturesPlugin_BooleanCommon.cpp | 294 ++++++++++++++++++ .../FeaturesPlugin_BooleanCommon.h | 57 +++- .../FeaturesPlugin_BooleanFuse.cpp | 11 +- src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp | 4 + .../FeaturesPlugin_Validators.cpp | 110 ++++++- .../FeaturesPlugin_Validators.h | 36 +++ src/FeaturesPlugin/Test/Test2394.py | 258 --------------- src/FeaturesPlugin/boolean_common_widget.xml | 64 ++++ src/FeaturesPlugin/plugin-Features.xml | 2 +- src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp | 11 + src/GeomAlgoAPI/GeomAlgoAPI_Boolean.h | 5 + 14 files changed, 647 insertions(+), 271 deletions(-) create mode 100644 src/FeaturesPlugin/FeaturesPlugin_BooleanCommon.cpp delete mode 100644 src/FeaturesPlugin/Test/Test2394.py create mode 100644 src/FeaturesPlugin/boolean_common_widget.xml diff --git a/src/FeaturesAPI/FeaturesAPI_BooleanCommon.cpp b/src/FeaturesAPI/FeaturesAPI_BooleanCommon.cpp index bd53854ef..b1af67688 100644 --- a/src/FeaturesAPI/FeaturesAPI_BooleanCommon.cpp +++ b/src/FeaturesAPI/FeaturesAPI_BooleanCommon.cpp @@ -32,6 +32,20 @@ FeaturesAPI_BooleanCommon::FeaturesAPI_BooleanCommon( initialize(); } +//================================================================================================== +FeaturesAPI_BooleanCommon::FeaturesAPI_BooleanCommon( + const std::shared_ptr& theFeature, + const std::list& theMainObjects) +: ModelHighAPI_Interface(theFeature) +{ + if(initialize()) { + fillAttribute(FeaturesPlugin_BooleanCommon::CREATION_METHOD_SIMPLE(), mycreationMethod); + fillAttribute(theMainObjects, mymainObjects); + + execute(false); + } +} + //================================================================================================== FeaturesAPI_BooleanCommon::FeaturesAPI_BooleanCommon( const std::shared_ptr& theFeature, @@ -40,6 +54,7 @@ FeaturesAPI_BooleanCommon::FeaturesAPI_BooleanCommon( : ModelHighAPI_Interface(theFeature) { if(initialize()) { + fillAttribute(FeaturesPlugin_BooleanCommon::CREATION_METHOD_ADVANCED(), mycreationMethod); fillAttribute(theMainObjects, mymainObjects); fillAttribute(theToolObjects, mytoolObjects); @@ -66,11 +81,24 @@ void FeaturesAPI_BooleanCommon::setMainObjects( void FeaturesAPI_BooleanCommon::setToolObjects( const std::list& theToolObjects) { + fillAttribute(FeaturesPlugin_BooleanCommon::CREATION_METHOD_ADVANCED(), mycreationMethod); fillAttribute(theToolObjects, mytoolObjects); execute(); } +//================================================================================================== +void FeaturesAPI_BooleanCommon::setAdvancedMode(const bool theMode) +{ + if (theMode) { + fillAttribute(FeaturesPlugin_BooleanCommon::CREATION_METHOD_ADVANCED(), mycreationMethod); + } else { + fillAttribute(FeaturesPlugin_BooleanCommon::CREATION_METHOD_SIMPLE(), mycreationMethod); + } + + execute(); +} + //================================================================================================== void FeaturesAPI_BooleanCommon::dump(ModelHighAPI_Dumper& theDumper) const { @@ -79,12 +107,27 @@ void FeaturesAPI_BooleanCommon::dump(ModelHighAPI_Dumper& theDumper) const theDumper << aBase << " = model.addCommon"; const std::string& aDocName = theDumper.name(aBase->document()); + AttributeStringPtr aMode = aBase->string(FeaturesPlugin_BooleanCommon::CREATION_METHOD()); AttributeSelectionListPtr anObjects = aBase->selectionList(FeaturesPlugin_BooleanCommon::OBJECT_LIST_ID()); AttributeSelectionListPtr aTools = aBase->selectionList(FeaturesPlugin_BooleanCommon::TOOL_LIST_ID()); - theDumper << "(" << aDocName << ", " << anObjects << ", " << aTools << ")" << std::endl; + theDumper << "(" << aDocName << ", " << anObjects; + + if (aMode->value() == FeaturesPlugin_BooleanCommon::CREATION_METHOD_ADVANCED()) { + theDumper << ", " << aTools; + } + + theDumper << ")" << std::endl; +} + +//================================================================================================== +BooleanCommonPtr addCommon(const std::shared_ptr& thePart, + const std::list& theMainObjects) +{ + std::shared_ptr aFeature = thePart->addFeature(FeaturesAPI_BooleanCommon::ID()); + return BooleanCommonPtr(new FeaturesAPI_BooleanCommon(aFeature, theMainObjects)); } //================================================================================================== diff --git a/src/FeaturesAPI/FeaturesAPI_BooleanCommon.h b/src/FeaturesAPI/FeaturesAPI_BooleanCommon.h index 56e49bb79..e6e20576d 100644 --- a/src/FeaturesAPI/FeaturesAPI_BooleanCommon.h +++ b/src/FeaturesAPI/FeaturesAPI_BooleanCommon.h @@ -41,6 +41,11 @@ public: FEATURESAPI_EXPORT explicit FeaturesAPI_BooleanCommon(const std::shared_ptr& theFeature); + /// Constructor with values. + FEATURESAPI_EXPORT + FeaturesAPI_BooleanCommon(const std::shared_ptr& theFeature, + const std::list& theMainObjects); + /// Constructor with values. FEATURESAPI_EXPORT FeaturesAPI_BooleanCommon(const std::shared_ptr& theFeature, @@ -51,7 +56,9 @@ public: FEATURESAPI_EXPORT virtual ~FeaturesAPI_BooleanCommon(); - INTERFACE_2(FeaturesPlugin_BooleanCommon::ID(), + INTERFACE_3(FeaturesPlugin_BooleanCommon::ID(), + creationMethod, FeaturesPlugin_BooleanCommon::CREATION_METHOD(), + ModelAPI_AttributeString, /** Creation method */, mainObjects, FeaturesPlugin_BooleanCommon::OBJECT_LIST_ID(), ModelAPI_AttributeSelectionList, /** Main objects */, toolObjects, FeaturesPlugin_BooleanCommon::TOOL_LIST_ID(), @@ -65,6 +72,10 @@ public: FEATURESAPI_EXPORT void setToolObjects(const std::list& theToolObjects); + /// Set mode. + FEATURESAPI_EXPORT + void setAdvancedMode(const bool theMode); + /// Dump wrapped feature FEATURESAPI_EXPORT virtual void dump(ModelHighAPI_Dumper& theDumper) const; @@ -73,6 +84,12 @@ public: /// Pointer on Boolean object. typedef std::shared_ptr BooleanCommonPtr; +/// \ingroup CPPHighAPI +/// \brief Create Boolean Common feature. +FEATURESAPI_EXPORT +BooleanCommonPtr addCommon(const std::shared_ptr& thePart, + const std::list& theMainObjects); + /// \ingroup CPPHighAPI /// \brief Create Boolean Common feature. FEATURESAPI_EXPORT diff --git a/src/FeaturesPlugin/CMakeLists.txt b/src/FeaturesPlugin/CMakeLists.txt index a49cd84fd..a4d80e857 100644 --- a/src/FeaturesPlugin/CMakeLists.txt +++ b/src/FeaturesPlugin/CMakeLists.txt @@ -70,6 +70,7 @@ SET(PROJECT_SOURCES FeaturesPlugin_Boolean.cpp FeaturesPlugin_BooleanCut.cpp FeaturesPlugin_BooleanFuse.cpp + FeaturesPlugin_BooleanCommon.cpp FeaturesPlugin_BooleanSmash.cpp FeaturesPlugin_Intersection.cpp FeaturesPlugin_Partition.cpp @@ -108,6 +109,7 @@ SET(XML_RESOURCES translation_widget.xml boolean_widget.xml boolean_fuse_widget.xml + boolean_common_widget.xml boolean_smash_widget.xml recover_widget.xml partition_widget.xml diff --git a/src/FeaturesPlugin/FeaturesPlugin_BooleanCommon.cpp b/src/FeaturesPlugin/FeaturesPlugin_BooleanCommon.cpp new file mode 100644 index 000000000..c180f725d --- /dev/null +++ b/src/FeaturesPlugin/FeaturesPlugin_BooleanCommon.cpp @@ -0,0 +1,294 @@ +// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// +// 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, 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 +// 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 "FeaturesPlugin_BooleanCommon.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +//================================================================================================== +FeaturesPlugin_BooleanCommon::FeaturesPlugin_BooleanCommon() +: FeaturesPlugin_Boolean(FeaturesPlugin_Boolean::BOOL_COMMON) +{ +} + +//================================================================================================== +void FeaturesPlugin_BooleanCommon::initAttributes() +{ + data()->addAttribute(CREATION_METHOD(), ModelAPI_AttributeString::typeId()); + + data()->addAttribute(OBJECT_LIST_ID(), ModelAPI_AttributeSelectionList::typeId()); + data()->addAttribute(TOOL_LIST_ID(), ModelAPI_AttributeSelectionList::typeId()); +} + +//================================================================================================== +void FeaturesPlugin_BooleanCommon::execute() +{ + ListOfShape anObjects, aTools, aPlanes; + std::map, ListOfShape> aCompSolidsObjects; + + bool isSimpleMode = false; + + AttributeStringPtr aCreationMethodAttr = string(CREATION_METHOD()); + if (aCreationMethodAttr.get() + && aCreationMethodAttr->value() == CREATION_METHOD_SIMPLE()) { + isSimpleMode = true; + } + + // Getting objects. + AttributeSelectionListPtr anObjectsSelList = + selectionList(FeaturesPlugin_Boolean::OBJECT_LIST_ID()); + for (int anObjectsIndex = 0; anObjectsIndex < anObjectsSelList->size(); anObjectsIndex++) { + AttributeSelectionPtr anObjectAttr = anObjectsSelList->value(anObjectsIndex); + std::shared_ptr anObject = anObjectAttr->value(); + if (!anObject.get()) { + return; + } + ResultPtr aContext = anObjectAttr->context(); + ResultBodyPtr aResCompSolidPtr = ModelAPI_Tools::bodyOwner(aContext); + if (!isSimpleMode + && aResCompSolidPtr.get() + && aResCompSolidPtr->shape()->shapeType() == GeomAPI_Shape::COMPSOLID) { + std::shared_ptr aContextShape = aResCompSolidPtr->shape(); + std::map, ListOfShape>::iterator + anIt = aCompSolidsObjects.begin(); + for (; anIt != aCompSolidsObjects.end(); anIt++) { + if (anIt->first->isEqual(aContextShape)) { + aCompSolidsObjects[anIt->first].push_back(anObject); + break; + } + } + if (anIt == aCompSolidsObjects.end()) { + aCompSolidsObjects[aContextShape].push_back(anObject); + } + } else { + anObjects.push_back(anObject); + } + } + + // Getting tools. + if (!isSimpleMode) { + AttributeSelectionListPtr aToolsSelList = selectionList(FeaturesPlugin_Boolean::TOOL_LIST_ID()); + for (int aToolsIndex = 0; aToolsIndex < aToolsSelList->size(); aToolsIndex++) { + AttributeSelectionPtr aToolAttr = aToolsSelList->value(aToolsIndex); + GeomShapePtr aTool = aToolAttr->value(); + if (!aTool.get()) { + // It could be a construction plane. + ResultPtr aContext = aToolAttr->context(); + aPlanes.push_back(aToolAttr->context()->shape()); + } else { + aTools.push_back(aTool); + } + } + } + + if ((anObjects.empty() && aCompSolidsObjects.empty()) + || (!isSimpleMode && aTools.empty() && aPlanes.empty())) { + std::string aFeatureError = "Error: Not enough objects for boolean operation."; + setError(aFeatureError); + return; + } + + int aResultIndex = 0; + GeomAlgoAPI_MakeShapeList aMakeShapeList; + GeomAPI_DataMapOfShapeShape aMapOfShapes; + + if (isSimpleMode) + { + ListOfShape::iterator anObjectsIt = anObjects.begin(); + GeomShapePtr aShape = *anObjectsIt; + for (++anObjectsIt; anObjectsIt != anObjects.end(); ++anObjectsIt) { + std::shared_ptr aCommonAlgo( + new GeomAlgoAPI_Boolean(aShape, + *anObjectsIt, + GeomAlgoAPI_Boolean::BOOL_COMMON)); + + if (!aCommonAlgo->isDone()) { + std::string aFeatureError = "Error: An algorithm failed."; + setError(aFeatureError); + return; + } + if (aCommonAlgo->shape()->isNull()) { + static const std::string aShapeError = "Error: Resulting shape is Null."; + setError(aShapeError); + return; + } + if (!aCommonAlgo->isValid()) { + std::string aFeatureError = "Error: Resulting shape is not valid."; + setError(aFeatureError); + return; + } + + aShape = aCommonAlgo->shape(); + aMakeShapeList.appendAlgo(aCommonAlgo); + aMapOfShapes.merge(aCommonAlgo->mapOfSubShapes()); + } + + GeomAPI_ShapeIterator aShapeIt(aShape); + if (aShapeIt.more() || aShape->shapeType() == GeomAPI_Shape::VERTEX) { + std::shared_ptr aResultBody = + document()->createBody(data(), aResultIndex); + + loadNamingDS(aResultBody, anObjects.front(), anObjects, aShape, aMakeShapeList, aMapOfShapes); + setResult(aResultBody, aResultIndex); + aResultIndex++; + } + } else { + for (ListOfShape::iterator anObjectsIt = anObjects.begin(); + anObjectsIt != anObjects.end(); + ++anObjectsIt) + { + std::shared_ptr anObject = *anObjectsIt; + ListOfShape aListWithObject; + aListWithObject.push_back(anObject); + GeomAlgoAPI_MakeShapeList aMakeShapeList; + std::shared_ptr aBoolAlgo; + GeomShapePtr aResShape; + + std::list > aBoundingPoints = + GeomAlgoAPI_ShapeTools::getBoundingBox(aListWithObject, 1.0); + + // Resize planes. + ListOfShape aToolsWithPlanes = aTools; + for (ListOfShape::const_iterator anIt = aPlanes.cbegin(); + anIt != aPlanes.cend(); + ++anIt) { + GeomShapePtr aPlane = *anIt; + GeomShapePtr aTool = GeomAlgoAPI_ShapeTools::fitPlaneToBox(aPlane, aBoundingPoints); + std::shared_ptr aMkShCustom( + new GeomAlgoAPI_MakeShapeCustom); + aMkShCustom->addModified(aPlane, aTool); + aMakeShapeList.appendAlgo(aMkShCustom); + aToolsWithPlanes.push_back(aTool); + } + + aBoolAlgo.reset(new GeomAlgoAPI_Boolean(aListWithObject, + aToolsWithPlanes, + GeomAlgoAPI_Boolean::BOOL_COMMON)); + aResShape = aBoolAlgo->shape(); + + // Checking that the algorithm worked properly. + if (!aBoolAlgo->isDone()) { + static const std::string aFeatureError = "Error: Boolean algorithm failed."; + setError(aFeatureError); + return; + } + if (aResShape->isNull()) { + static const std::string aShapeError = "Error: Resulting shape is Null."; + setError(aShapeError); + return; + } + if (!aBoolAlgo->isValid()) { + std::string aFeatureError = "Error: Resulting shape is not valid."; + setError(aFeatureError); + return; + } + + aMakeShapeList.appendAlgo(aBoolAlgo); + + GeomAPI_ShapeIterator aShapeIt(aResShape); + if (aShapeIt.more() || aResShape->shapeType() == GeomAPI_Shape::VERTEX) { + std::shared_ptr aResultBody = + document()->createBody(data(), aResultIndex); + + loadNamingDS(aResultBody, anObject, aTools, aResShape, + aMakeShapeList, *(aBoolAlgo->mapOfSubShapes())); + setResult(aResultBody, aResultIndex); + aResultIndex++; + } + } + } + + // remove the rest results if there were produced in the previous pass + removeResults(aResultIndex); +} + +//================================================================================================== +void FeaturesPlugin_BooleanCommon::loadNamingDS(ResultBodyPtr theResultBody, + const GeomShapePtr theBaseShape, + const ListOfShape& theTools, + const GeomShapePtr theResultShape, + GeomAlgoAPI_MakeShape& theMakeShape, + GeomAPI_DataMapOfShapeShape& theMapOfShapes) +{ + //load result + if (theBaseShape->isEqual(theResultShape)) { + theResultBody->store(theResultShape, false); + } else { + const int aModifyVTag = 1; + const int aModifyETag = 2; + const int aModifyFTag = 3; + const int aDeletedTag = 4; + /// sub solids will be placed at labels 5, 6, etc. if result is compound of solids + const int aSubsolidsTag = 5; + + theResultBody->storeModified(theBaseShape, theResultShape, aSubsolidsTag); + + const std::string aModVName = "Modified_Vertex"; + const std::string aModEName = "Modified_Edge"; + const std::string aModFName = "Modified_Face"; + + theResultBody->loadAndOrientModifiedShapes(&theMakeShape, theBaseShape, GeomAPI_Shape::VERTEX, + aModifyVTag, aModVName, theMapOfShapes, false, + false, true); + theResultBody->loadAndOrientModifiedShapes(&theMakeShape, theBaseShape, GeomAPI_Shape::EDGE, + aModifyETag, aModEName, theMapOfShapes, false, + false, true); + theResultBody->loadAndOrientModifiedShapes(&theMakeShape, theBaseShape, GeomAPI_Shape::FACE, + aModifyFTag, aModFName, theMapOfShapes, false, + false, true); + + theResultBody->loadDeletedShapes(&theMakeShape, theBaseShape, + GeomAPI_Shape::VERTEX, aDeletedTag); + theResultBody->loadDeletedShapes(&theMakeShape, theBaseShape, + GeomAPI_Shape::EDGE, aDeletedTag); + theResultBody->loadDeletedShapes(&theMakeShape, theBaseShape, + GeomAPI_Shape::FACE, aDeletedTag); + + for (ListOfShape::const_iterator anIter = theTools.begin(); anIter != theTools.end(); anIter++) + { + theResultBody->loadAndOrientModifiedShapes(&theMakeShape, *anIter, GeomAPI_Shape::VERTEX, + aModifyVTag, aModVName, theMapOfShapes, false, + false, true); + + theResultBody->loadAndOrientModifiedShapes(&theMakeShape, *anIter, GeomAPI_Shape::EDGE, + aModifyETag, aModEName, theMapOfShapes, false, + false, true); + + theResultBody->loadAndOrientModifiedShapes(&theMakeShape, *anIter, GeomAPI_Shape::FACE, + aModifyFTag, aModFName, theMapOfShapes, false, + false, true); + + theResultBody->loadDeletedShapes(&theMakeShape, *anIter, GeomAPI_Shape::VERTEX, aDeletedTag); + theResultBody->loadDeletedShapes(&theMakeShape, *anIter, GeomAPI_Shape::EDGE, aDeletedTag); + theResultBody->loadDeletedShapes(&theMakeShape, *anIter, GeomAPI_Shape::FACE, aDeletedTag); + } + } +} diff --git a/src/FeaturesPlugin/FeaturesPlugin_BooleanCommon.h b/src/FeaturesPlugin/FeaturesPlugin_BooleanCommon.h index 7acab2e31..caf67d38e 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_BooleanCommon.h +++ b/src/FeaturesPlugin/FeaturesPlugin_BooleanCommon.h @@ -23,6 +23,8 @@ #include "FeaturesPlugin_Boolean.h" +#include + /// \class FeaturesPlugin_BooleanCommon /// \ingroup Plugins /// \brief Feature for applying of Boolean Common operation. @@ -44,10 +46,61 @@ public: return MY_KIND; } + /// Attribute name for creation method. + inline static const std::string& CREATION_METHOD() + { + static const std::string MY_CREATION_METHOD_ID("creation_method"); + return MY_CREATION_METHOD_ID; + } + + /// Attribute name for creation method. + inline static const std::string& CREATION_METHOD_SIMPLE() + { + static const std::string MY_CREATION_METHOD_ID("simple"); + return MY_CREATION_METHOD_ID; + } + + /// Attribute name for creation method. + inline static const std::string& CREATION_METHOD_ADVANCED() + { + static const std::string MY_CREATION_METHOD_ID("advanced"); + return MY_CREATION_METHOD_ID; + } + + /// Attribute name of main objects. + inline static const std::string& OBJECT_LIST_ID() + { + static const std::string MY_OBJECT_LIST_ID("main_objects"); + return MY_OBJECT_LIST_ID; + } + + /// Attribute name of tool objects. + inline static const std::string& TOOL_LIST_ID() + { + static const std::string MY_TOOL_LIST_ID("tool_objects"); + return MY_TOOL_LIST_ID; + } + + /// Request for initialization of data model of the feature: adding all attributes. + FEATURESPLUGIN_EXPORT virtual void initAttributes(); + + /// Creates a new part document if needed. + FEATURESPLUGIN_EXPORT virtual void execute(); + public: - /// Use plugin manager for features creation. - FeaturesPlugin_BooleanCommon(): FeaturesPlugin_Boolean(BOOL_COMMON) {}; + /// Use plugin manager for features creation. + FeaturesPlugin_BooleanCommon(); + +private: + + /// Load Naming data structure of the feature to the document + void loadNamingDS(ResultBodyPtr theResultBody, + const GeomShapePtr theBaseShape, + const ListOfShape& theTools, + const GeomShapePtr theResultShape, + GeomAlgoAPI_MakeShape& theMakeShape, + GeomAPI_DataMapOfShapeShape& theMapOfShapes); }; diff --git a/src/FeaturesPlugin/FeaturesPlugin_BooleanFuse.cpp b/src/FeaturesPlugin/FeaturesPlugin_BooleanFuse.cpp index 0319ee264..341eb82ba 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_BooleanFuse.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_BooleanFuse.cpp @@ -58,7 +58,7 @@ void FeaturesPlugin_BooleanFuse::initAttributes() //================================================================================================== void FeaturesPlugin_BooleanFuse::execute() { - ListOfShape anObjects, aTools, anEdgesAndFaces, aPlanes; + ListOfShape anObjects, aTools, anEdgesAndFaces; std::map, ListOfShape> aCompSolidsObjects; bool isSimpleCreation = false; @@ -111,12 +111,9 @@ void FeaturesPlugin_BooleanFuse::execute() for (int aToolsIndex = 0; aToolsIndex < aToolsSelList->size(); aToolsIndex++) { AttributeSelectionPtr aToolAttr = aToolsSelList->value(aToolsIndex); GeomShapePtr aTool = aToolAttr->value(); - if (!aTool.get()) { - // It could be a construction plane. - ResultPtr aContext = aToolAttr->context(); - aPlanes.push_back(aToolAttr->context()->shape()); - } else if (aTool->shapeType() == GeomAPI_Shape::EDGE - || aTool->shapeType() == GeomAPI_Shape::FACE) { + if (aTool->shapeType() == GeomAPI_Shape::EDGE + || aTool->shapeType() == GeomAPI_Shape::FACE) + { anEdgesAndFaces.push_back(aTool); } else { aTools.push_back(aTool); diff --git a/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp b/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp index a53331c23..89c83bbef 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp @@ -104,6 +104,10 @@ FeaturesPlugin_Plugin::FeaturesPlugin_Plugin() new FeaturesPlugin_ValidatorBooleanFuseSelection); aFactory->registerValidator("FeaturesPlugin_ValidatorBooleanFuseArguments", new FeaturesPlugin_ValidatorBooleanFuseArguments); + aFactory->registerValidator("FeaturesPlugin_ValidatorBooleanCommonSelection", + new FeaturesPlugin_ValidatorBooleanCommonSelection); + aFactory->registerValidator("FeaturesPlugin_ValidatorBooleanCommonArguments", + new FeaturesPlugin_ValidatorBooleanCommonArguments); // register this plugin ModelAPI_Session::get()->registerPlugin(this); diff --git a/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp b/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp index 4ab4e48cc..0b33e4c1f 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp @@ -22,6 +22,7 @@ #include "FeaturesPlugin_Boolean.h" #include "FeaturesPlugin_BooleanFuse.h" +#include "FeaturesPlugin_BooleanCommon.h" #include "FeaturesPlugin_BooleanSmash.h" #include "FeaturesPlugin_Union.h" @@ -1509,4 +1510,111 @@ bool FeaturesPlugin_ValidatorBooleanFuseArguments::isNotObligatory( } return false; -} \ No newline at end of file +} + +//================================================================================================== +bool FeaturesPlugin_ValidatorBooleanCommonSelection::isValid( + const AttributePtr& theAttribute, + const std::list& theArguments, + Events_InfoMessage& theError) const +{ + AttributeSelectionListPtr anAttrSelectionList = + std::dynamic_pointer_cast(theAttribute); + if (!anAttrSelectionList.get()) { + theError = + "Error: This validator can only work with selection list attributes in \"Boolean\" feature."; + return false; + } + + for (int anIndex = 0; anIndex < anAttrSelectionList->size(); ++anIndex) { + AttributeSelectionPtr anAttrSelection = anAttrSelectionList->value(anIndex); + if (!anAttrSelection.get()) { + theError = "Error: Empty attribute selection."; + return false; + } + ResultPtr aContext = anAttrSelection->context(); + if (!aContext.get()) { + theError = "Error: Empty selection context."; + return false; + } + ResultConstructionPtr aResultConstruction = + std::dynamic_pointer_cast(aContext); + if (aResultConstruction.get()) { + if (theAttribute->id() != FeaturesPlugin_BooleanCommon::TOOL_LIST_ID()) { + theError = "Error: Result construction not allowed for selection."; + return false; + } + } + std::shared_ptr aShape = anAttrSelection->value(); + GeomShapePtr aContextShape = aContext->shape(); + if (!aShape.get()) { + aShape = aContextShape; + } + if (!aShape.get()) { + theError = "Error: Empty shape."; + return false; + } + if (!aShape->isEqual(aContextShape)) { + theError = "Error: Local selection not allowed."; + return false; + } + + if (aResultConstruction.get() && aShape->shapeType() != GeomAPI_Shape::FACE) { + theError = "Error: Result construction should be plane."; + return false; + } + } + + return true; +} + +//================================================================================================= +bool FeaturesPlugin_ValidatorBooleanCommonArguments::isValid( + const std::shared_ptr& theFeature, + const std::list& theArguments, + Events_InfoMessage& theError) const +{ + if (theArguments.size() != 2) { + theError = "Wrong number of arguments (expected 2)."; + return false; + } + + std::shared_ptr aFeature = + std::dynamic_pointer_cast(theFeature); + + int anObjectsNb = 0, aToolsNb = 0; + + std::list::const_iterator anIt = theArguments.begin(), aLast = theArguments.end(); + + bool isAllInSameCompSolid = true; + ResultBodyPtr aCompSolid; + + AttributeSelectionListPtr anAttrSelList = theFeature->selectionList(*anIt); + if (anAttrSelList) { + anObjectsNb = anAttrSelList->size(); + } + + bool isSimpleMode = aFeature->string(FeaturesPlugin_BooleanCommon::CREATION_METHOD())->value() + == FeaturesPlugin_BooleanCommon::CREATION_METHOD_SIMPLE(); + + if (!isSimpleMode) { + anAttrSelList = theFeature->selectionList(*anIt); + if (anAttrSelList) { + aToolsNb = anAttrSelList->size(); + } + } + + if ((isSimpleMode && anObjectsNb < 2) + || (!isSimpleMode && (anObjectsNb == 0 || aToolsNb == 0))) { + theError = "Not enough arguments for Fuse operation."; + return false; + } +} + +//================================================================================================= +bool FeaturesPlugin_ValidatorBooleanCommonArguments::isNotObligatory( + std::string theFeature, + std::string theAttribute) +{ + return false; +} diff --git a/src/FeaturesPlugin/FeaturesPlugin_Validators.h b/src/FeaturesPlugin/FeaturesPlugin_Validators.h index 389ebb261..18e1c241d 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Validators.h +++ b/src/FeaturesPlugin/FeaturesPlugin_Validators.h @@ -354,4 +354,40 @@ public: virtual bool isNotObligatory(std::string theFeature, std::string theAttribute); }; +/// \class FeaturesPlugin_ValidatorBooleanCommonSelection +/// \ingroup Validators +/// \brief Verifies the selected object for boolean common feature +class FeaturesPlugin_ValidatorBooleanCommonSelection: public ModelAPI_AttributeValidator +{ +public: + //! \return True if the attribute is valid. + //! \param[in] theAttribute the checked attribute. + //! \param[in] theArguments arguments of the attribute. + //! \param[out] theError error message. + virtual bool isValid(const AttributePtr& theAttribute, + const std::list& theArguments, + Events_InfoMessage& theError) const; +}; + +/** \class FeaturesPlugin_ValidatorBooleanCommonArguments +* \ingroup Validators +* \brief Validates that boolean operation have enough arguments. +*/ +class FeaturesPlugin_ValidatorBooleanCommonArguments: public ModelAPI_FeatureValidator +{ +public: + /** \brief Returns true if feature and/or attributes are valid. + * \param[in] theFeature the validated feature. + * \param[in] theArguments the arguments in the configuration file for this validator. + * \param[out] theError error message. + * \returns true if feature is valid. + */ + virtual bool isValid(const std::shared_ptr& theFeature, + const std::list& theArguments, + Events_InfoMessage& theError) const; + + /// \return true if the attribute in feature is not obligatory for the feature execution. + virtual bool isNotObligatory(std::string theFeature, std::string theAttribute); +}; + #endif diff --git a/src/FeaturesPlugin/Test/Test2394.py b/src/FeaturesPlugin/Test/Test2394.py deleted file mode 100644 index 13639bba7..000000000 --- a/src/FeaturesPlugin/Test/Test2394.py +++ /dev/null @@ -1,258 +0,0 @@ -# -*- coding: utf-8 -*- - -## Copyright (C) 2018-20xx CEA/DEN, EDF R&D -## -## 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, 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 -## 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 -## - -from GeomAPI import * -from SketchAPI import * - -from salome.shaper import model - -model.begin() -partSet = model.moduleDocument() -Part_1 = model.addPart(partSet) -Part_1_doc = Part_1.document() - -model.addParameter(Part_1_doc, "R", "58") -model.addParameter(Part_1_doc, "cote_cube", "R/2") -model.addParameter(Part_1_doc, "theta", "54") -model.addParameter(Part_1_doc, "phi", "36") -model.addParameter(Part_1_doc, "pi", "3.141592653589793") -model.addParameter(Part_1_doc, "x", "R*sin(phi/180*pi)*cos(theta/180*pi)") -model.addParameter(Part_1_doc, "y", "R*sin(phi/180*pi)*sin(theta/180*pi)") -model.addParameter(Part_1_doc, "z", "R*cos(phi/180*pi)") -model.addParameter(Part_1_doc, "haut_ext_tuyau", "5") -model.addParameter(Part_1_doc, "haut_int_tuyau", "14") -Param_Diam = model.addParameter(Part_1_doc, "diam_tuyau", "10") - -Revolution_1 = model.addRevolution(Part_1_doc, [], model.selection("EDGE", "PartSet/OZ"), 90, 0) -Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOZ")) -SketchProjection_1 = Sketch_1.addProjection(model.selection("VERTEX", "PartSet/Origin"), False) -SketchPoint_1 = SketchProjection_1.createdFeature() -SketchProjection_2 = Sketch_1.addProjection(model.selection("EDGE", "PartSet/OX"), False) -SketchLine_1 = SketchProjection_2.createdFeature() -SketchArc_1 = Sketch_1.addArc(0, 0, 58, 0, 0, -58, True) -SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchPoint_1.result(), SketchArc_1.center()) -SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_1.result(), SketchArc_1.startPoint()) -SketchLine_2 = Sketch_1.addLine(0, -58, 0, 0) -SketchConstraintCoincidence_3 = Sketch_1.setCoincident(SketchArc_1.endPoint(), SketchLine_2.startPoint()) -SketchConstraintCoincidence_4 = Sketch_1.setCoincident(SketchAPI_Point(SketchPoint_1).coordinates(), SketchLine_2.endPoint()) -SketchLine_3 = Sketch_1.addLine(0, 0, 58, 0) -SketchConstraintCoincidence_5 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint()) -SketchConstraintCoincidence_6 = Sketch_1.setCoincident(SketchArc_1.startPoint(), SketchLine_3.endPoint()) -SketchConstraintVertical_1 = Sketch_1.setVertical(SketchLine_2.result()) -SketchConstraintLength_1 = Sketch_1.setLength(SketchLine_2.result(), "R") -Revolution_1.setNestedSketch(Sketch_1) - -Extrusion_1 = model.addExtrusion(Part_1_doc, [], model.selection(), 0, "cote_cube") -Sketch_2 = model.addSketch(Part_1_doc, model.selection("FACE", "Revolution_1_1/Generated_Face_2")) -SketchLine_4 = Sketch_2.addLine(29, 0, 0, 0) -SketchLine_5 = Sketch_2.addLine(0, 0, 0, 29) -SketchLine_6 = Sketch_2.addLine(0, 29, 29, 29) -SketchLine_7 = Sketch_2.addLine(29, 29, 29, 0) -SketchConstraintCoincidence_7 = Sketch_2.setCoincident(SketchLine_7.endPoint(), SketchLine_4.startPoint()) -SketchConstraintCoincidence_8 = Sketch_2.setCoincident(SketchLine_4.endPoint(), SketchLine_5.startPoint()) -SketchConstraintCoincidence_9 = Sketch_2.setCoincident(SketchLine_5.endPoint(), SketchLine_6.startPoint()) -SketchConstraintCoincidence_10 = Sketch_2.setCoincident(SketchLine_6.endPoint(), SketchLine_7.startPoint()) -SketchConstraintHorizontal_1 = Sketch_2.setHorizontal(SketchLine_4.result()) -SketchConstraintVertical_2 = Sketch_2.setVertical(SketchLine_5.result()) -SketchConstraintHorizontal_2 = Sketch_2.setHorizontal(SketchLine_6.result()) -SketchConstraintVertical_3 = Sketch_2.setVertical(SketchLine_7.result()) -SketchConstraintLength_2 = Sketch_2.setLength(SketchLine_6.result(), "cote_cube") -SketchConstraintEqual_1 = Sketch_2.setEqual(SketchLine_6.result(), SketchLine_7.result()) -SketchProjection_3 = Sketch_2.addProjection(model.selection("EDGE", "Revolution_1_1/Generated_Face_2&Revolution_1_1/To_Face_1"), False) -SketchLine_8 = SketchProjection_3.createdFeature() -SketchConstraintCoincidence_11 = Sketch_2.setCoincident(SketchLine_5.endPoint(), SketchLine_8.result()) -SketchProjection_4 = Sketch_2.addProjection(model.selection("EDGE", "Revolution_1_1/Generated_Face_2&Revolution_1_1/From_Face_1"), False) -SketchLine_9 = SketchProjection_4.createdFeature() -SketchConstraintCoincidence_12 = Sketch_2.setCoincident(SketchLine_4.startPoint(), SketchLine_9.result()) -Extrusion_1.setNestedSketch(Sketch_2) - -Fill_1 = model.addFill(Part_1_doc, [model.selection("SOLID", "Revolution_1_1")], [model.selection("SOLID", "Extrusion_1_1")]) - -Point_2 = model.addPoint(Part_1_doc, "x", "y", "-z") -Axis_4 = model.addAxis(Part_1_doc, model.selection("VERTEX", "Point_1"), model.selection("VERTEX", "Fill_1_1_2/Modified_Face_3&Fill_1_1_2/Modified_Face_2&Fill_1_1_2/Modified_Face_1")) -Plane_4 = model.addPlane(Part_1_doc, model.selection("EDGE", "Axis_1"), model.selection("VERTEX", "Point_1"), True) -Plane_5 = model.addPlane(Part_1_doc, model.selection("FACE", "Plane_1"), "haut_ext_tuyau", True) -Plane_5.result().setName("Plane_2 arrivee tuyau") -Plane_6 = model.addPlane(Part_1_doc, model.selection("FACE", "Extrusion_1_1/Generated_Face_3"), model.selection("EDGE", "Extrusion_1_1/Generated_Face_3&Extrusion_1_1/From_Face_1"), 45) -Plane_7 = model.addPlane(Part_1_doc, model.selection("FACE", "Extrusion_1_1/Generated_Face_4"), model.selection("EDGE", "Extrusion_1_1/Generated_Face_4&Extrusion_1_1/From_Face_1"), 45) -Plane_8 = model.addPlane(Part_1_doc, model.selection("FACE", "Extrusion_1_1/Generated_Face_4"), model.selection("EDGE", "Extrusion_1_1/Generated_Face_3&Extrusion_1_1/Generated_Face_4"), "90+45") - -Fill_2 = model.addFill(Part_1_doc, [model.selection("SOLID", "Fill_1_1_1")], [model.selection("FACE", "Plane_5")]) -Fill_3 = model.addFill(Part_1_doc, [model.selection("SOLID", "Fill_2_1_2")], [model.selection("FACE", "Plane_3")]) -Fill_4 = model.addFill(Part_1_doc, [model.selection("SOLID", "Fill_3_1_2")], [model.selection("FACE", "Plane_4")]) -Fill_4.result().setColor(102, 51, 51) -Fill_4.result().subResult(0).setColor(153, 153, 76) -Fill_4.result().subResult(1).setColor(0, 204, 204) -Fill_4.result().subResult(2).setColor(51, 51, 102) -Fill_4.result().subResult(3).setColor(102, 204, 102) -Fill_4.result().subResult(4).setColor(204, 204, 0) - -Union_1 = model.addUnion(Part_1_doc, [model.selection("SOLID", "Fill_4_1_4"), model.selection("SOLID", "Fill_4_1_2")]) - -Point_3 = model.addPoint(Part_1_doc, model.selection("EDGE", "Axis_1"), model.selection("FACE", "Plane_2 arrivee tuyau")) - -Sketch_3 = model.addSketch(Part_1_doc, model.selection("FACE", "Plane_2 arrivee tuyau")) -SketchProjection_5 = Sketch_3.addProjection(model.selection("VERTEX", "Point_2"), False) -SketchPoint_2 = SketchProjection_5.createdFeature() -SketchCircle_1 = Sketch_3.addCircle(0, 0, 10) -SketchConstraintCoincidence_13 = Sketch_3.setCoincident(SketchPoint_2.result(), SketchCircle_1.center()) -SketchConstraintRadius_1 = Sketch_3.setRadius(SketchCircle_1.results()[1], "diam_tuyau") -SketchLine_10 = Sketch_3.addLine(-5, 5, 5, 5) -SketchLine_11 = Sketch_3.addLine(5, 5, 5, -5) -SketchLine_12 = Sketch_3.addLine(5, -5, -5, -5) -SketchLine_13 = Sketch_3.addLine(-5, -5, -5, 5) -SketchConstraintCoincidence_14 = Sketch_3.setCoincident(SketchLine_13.endPoint(), SketchLine_10.startPoint()) -SketchConstraintCoincidence_15 = Sketch_3.setCoincident(SketchLine_10.endPoint(), SketchLine_11.startPoint()) -SketchConstraintCoincidence_16 = Sketch_3.setCoincident(SketchLine_11.endPoint(), SketchLine_12.startPoint()) -SketchConstraintCoincidence_17 = Sketch_3.setCoincident(SketchLine_12.endPoint(), SketchLine_13.startPoint()) -SketchConstraintHorizontal_3 = Sketch_3.setHorizontal(SketchLine_10.result()) -SketchConstraintVertical_4 = Sketch_3.setVertical(SketchLine_11.result()) -SketchConstraintHorizontal_4 = Sketch_3.setHorizontal(SketchLine_12.result()) -SketchConstraintVertical_5 = Sketch_3.setVertical(SketchLine_13.result()) -SketchConstraintEqual_2 = Sketch_3.setEqual(SketchLine_10.result(), SketchLine_13.result()) -SketchLine_14 = Sketch_3.addLine(5, 5, 7.071067811865479, 7.071067811865475) -SketchConstraintCoincidence_18 = Sketch_3.setCoincident(SketchLine_10.endPoint(), SketchLine_14.startPoint()) -SketchConstraintCoincidence_19 = Sketch_3.setCoincident(SketchLine_14.endPoint(), SketchCircle_1.results()[1]) -SketchLine_15 = Sketch_3.addLine(-5, -5, -7.071067811865472, -7.071067811865476) -SketchConstraintCoincidence_20 = Sketch_3.setCoincident(SketchLine_12.endPoint(), SketchLine_15.startPoint()) -SketchConstraintCoincidence_21 = Sketch_3.setCoincident(SketchLine_15.endPoint(), SketchCircle_1.results()[1]) -SketchConstraintCollinear_1 = Sketch_3.setCollinear(SketchLine_14.result(), SketchLine_15.result()) -SketchLine_16 = Sketch_3.addLine(7.071067811865478, -7.071067811865476, 5, -5) -SketchConstraintCoincidence_22 = Sketch_3.setCoincident(SketchLine_16.startPoint(), SketchCircle_1.results()[1]) -SketchConstraintCoincidence_23 = Sketch_3.setCoincident(SketchLine_11.endPoint(), SketchLine_16.endPoint()) -SketchLine_17 = Sketch_3.addLine(-5, 5, -7.071067811865472, 7.071067811865476) -SketchConstraintCoincidence_24 = Sketch_3.setCoincident(SketchLine_10.startPoint(), SketchLine_17.startPoint()) -SketchConstraintCoincidence_25 = Sketch_3.setCoincident(SketchLine_17.endPoint(), SketchCircle_1.results()[1]) -SketchConstraintCollinear_2 = Sketch_3.setCollinear(SketchLine_17.result(), SketchLine_16.result()) -SketchConstraintEqual_3 = Sketch_3.setEqual(SketchLine_14.result(), SketchLine_15.result()) -SketchConstraintEqual_4 = Sketch_3.setEqual(SketchLine_17.result(), SketchLine_16.result()) -SketchConstraintLength_3 = Sketch_3.setLength(SketchLine_10.result(), "diam_tuyau") -model.do() - -Extrusion_2_objects = [model.selection("FACE", "Sketch_3/Face-SketchCircle_1_2f-SketchLine_11f-SketchLine_14r-SketchLine_16r"), model.selection("FACE", "Sketch_3/Face-SketchCircle_1_2f-SketchLine_10f-SketchLine_14f-SketchLine_17r"), model.selection("FACE", "Sketch_3/Face-SketchCircle_1_2f-SketchLine_13f-SketchLine_15r-SketchLine_17f"), model.selection("FACE", "Sketch_3/Face-SketchCircle_1_2f-SketchLine_12f-SketchLine_15f-SketchLine_16f")] -Extrusion_2 = model.addExtrusion(Part_1_doc, Extrusion_2_objects, model.selection(), 10, 0) -Extrusion_3 = model.addExtrusion(Part_1_doc, [model.selection("FACE", "Sketch_3/Face-SketchLine_10r-SketchLine_11r-SketchLine_12r-SketchLine_13r")], model.selection(), "haut_int_tuyau", 0) - -Sketch_4 = model.addSketch(Part_1_doc, model.selection("FACE", "Extrusion_2_1/To_Face_3")) -SketchProjection_6 = Sketch_4.addProjection(model.selection("VERTEX", "Extrusion_2_1/Generated_Face_2&Extrusion_2_1/Generated_Face_4&Extrusion_2_1/To_Face_4"), False) -SketchPoint_3 = SketchProjection_6.createdFeature() -SketchProjection_7 = Sketch_4.addProjection(model.selection("VERTEX", "Extrusion_2_1/Generated_Face_5&Extrusion_2_1/Generated_Face_7&Extrusion_2_1/To_Face_3"), False) -SketchPoint_4 = SketchProjection_7.createdFeature() -SketchArc_2 = Sketch_4.addArc(0, 0, -7.071067811865476, -7.071067811865472, 7.071067811865476, 7.071067811865472, True) -SketchConstraintCoincidence_26 = Sketch_4.setCoincident(SketchPoint_3.result(), SketchArc_2.startPoint()) -SketchConstraintCoincidence_27 = Sketch_4.setCoincident(SketchPoint_4.result(), SketchArc_2.results()[1]) -SketchLine_18 = Sketch_4.addLine(7.071067811865476, 7.071067811865472, -7.071067811865476, -7.071067811865472) -SketchConstraintCoincidence_28 = Sketch_4.setCoincident(SketchArc_2.endPoint(), SketchLine_18.startPoint()) -SketchConstraintCoincidence_29 = Sketch_4.setCoincident(SketchAPI_Point(SketchPoint_3).coordinates(), SketchLine_18.endPoint()) -SketchProjection_8 = Sketch_4.addProjection(model.selection("VERTEX", "Extrusion_2_1/Generated_Face_13&Extrusion_2_1/Generated_Face_12&Extrusion_2_1/To_Face_1"), False) -SketchPoint_5 = SketchProjection_8.createdFeature() -SketchConstraintCoincidence_30 = Sketch_4.setCoincident(SketchArc_2.endPoint(), SketchAPI_Point(SketchPoint_5).coordinates()) -model.do() - -Revolution_2 = model.addRevolution(Part_1_doc, [model.selection("FACE", "Sketch_4/Face-SketchArc_2_2f-SketchLine_18r")], model.selection("EDGE", "Sketch_4/Edge-SketchLine_18"), 0, 180) - -Cut_1 = model.addCut(Part_1_doc, [model.selection("SOLID", "Revolution_2_1")], [model.selection("SOLID", "Extrusion_3_1")]) -Cut_1.result().setName("demi-sphere") - -Plane_9 = model.addPlane(Part_1_doc, model.selection("VERTEX", "Extrusion_2_1/Generated_Face_10&Extrusion_2_1/Generated_Face_1&Extrusion_2_1/From_Face_4"), model.selection("VERTEX", "Extrusion_2_1/Generated_Face_10&Extrusion_2_1/Generated_Face_1&Extrusion_2_1/To_Face_4"), model.selection("VERTEX", "Extrusion_2_1/Generated_Face_2&Extrusion_2_1/Generated_Face_10&Extrusion_2_1/To_Face_4")) -Plane_10 = model.addPlane(Part_1_doc, model.selection("VERTEX", "Extrusion_2_1/Generated_Face_12&Extrusion_2_1/Generated_Face_11&Extrusion_2_1/To_Face_1"), model.selection("VERTEX", "Extrusion_2_1/Generated_Face_13&Extrusion_2_1/Generated_Face_12&Extrusion_2_1/To_Face_1"), model.selection("VERTEX", "Extrusion_2_1/Generated_Face_13&Extrusion_2_1/Generated_Face_12&Extrusion_2_1/From_Face_1")) -Plane_11 = model.addPlane(Part_1_doc, model.selection("VERTEX", "Extrusion_2_1/Generated_Face_5&Extrusion_2_1/Generated_Face_7&Extrusion_2_1/To_Face_3"), model.selection("VERTEX", "Extrusion_2_1/Generated_Face_3&Extrusion_2_1/Generated_Face_7&Extrusion_2_1/To_Face_3"), model.selection("VERTEX", "Extrusion_2_1/Generated_Face_5&Extrusion_2_1/Generated_Face_7&Extrusion_2_1/From_Face_3")) -Plane_12 = model.addPlane(Part_1_doc, model.selection("VERTEX", "Extrusion_2_1/Generated_Face_1&Extrusion_2_1/Generated_Face_4&Extrusion_2_1/To_Face_4"), model.selection("VERTEX", "Extrusion_2_1/Generated_Face_2&Extrusion_2_1/Generated_Face_4&Extrusion_2_1/To_Face_4"), model.selection("VERTEX", "Extrusion_2_1/Generated_Face_2&Extrusion_2_1/Generated_Face_4&Extrusion_2_1/From_Face_4")) - -Recover_1 = model.addRecover(Part_1_doc, Cut_1, [Extrusion_3.result()]) - -Plane_13 = model.addPlane(Part_1_doc, model.selection("FACE", "Recover_1_1/Shape4"), model.selection("EDGE", "Recover_1_1/Shape4&Recover_1_1/Shape6"), "90+45") -Plane_14 = model.addPlane(Part_1_doc, model.selection("FACE", "Recover_1_1/Shape1"), model.selection("EDGE", "Recover_1_1/Shape1&Recover_1_1/Shape6"), "90+45") -Plane_15 = model.addPlane(Part_1_doc, model.selection("FACE", "Recover_1_1/Shape2"), model.selection("EDGE", "Recover_1_1/Shape2&Recover_1_1/Shape6"), "90+45") -Plane_16 = model.addPlane(Part_1_doc, model.selection("FACE", "Recover_1_1/Shape6"), model.selection("EDGE", "Recover_1_1/Shape3&Recover_1_1/Shape6"), 45) - -Fill_5_objects_2 = [model.selection("FACE", "Plane_6"), model.selection("FACE", "Plane_7"), model.selection("FACE", "Plane_8"), model.selection("FACE", "Plane_9"), model.selection("FACE", "Plane_10"), model.selection("FACE", "Plane_11"), model.selection("FACE", "Plane_12"), model.selection("FACE", "Plane_13")] -Fill_5 = model.addFill(Part_1_doc, [model.selection("SOLID", "demi-sphere")], Fill_5_objects_2) - -Union_2_objects = [model.selection("SOLID", "Fill_5_1_14"), model.selection("SOLID", "Fill_5_1_15"), model.selection("SOLID", "Fill_5_1_16")] -Union_2 = model.addUnion(Part_1_doc, Union_2_objects) -Union_3_objects = [model.selection("SOLID", "Fill_5_1_8/Fill_5_1_8"), model.selection("SOLID", "Fill_5_1_4/Fill_5_1_4"), model.selection("SOLID", "Fill_5_1_9/Fill_5_1_9"), model.selection("SOLID", "Fill_5_1_11/Fill_5_1_11")] -Union_3 = model.addUnion(Part_1_doc, Union_3_objects) -Union_4_objects = [model.selection("SOLID", "Fill_5_1_6/Fill_5_1_6"), model.selection("SOLID", "Fill_5_1_10/Fill_5_1_10"), model.selection("SOLID", "Fill_5_1_13/Fill_5_1_13")] -Union_4 = model.addUnion(Part_1_doc, Union_4_objects) -Union_5_objects = [model.selection("SOLID", "Fill_5_1_2/Fill_5_1_2"), model.selection("SOLID", "Fill_5_1_1/Fill_5_1_1"), model.selection("SOLID", "Fill_5_1_3/Fill_5_1_3")] -Union_5 = model.addUnion(Part_1_doc, Union_5_objects) -Union_6_objects = [model.selection("SOLID", "Fill_5_1_5/Fill_5_1_5"), model.selection("SOLID", "Fill_5_1_7/Fill_5_1_7"), model.selection("SOLID", "Fill_5_1_12/Fill_5_1_12")] -Union_6 = model.addUnion(Part_1_doc, Union_6_objects) -Union_6.result().setColor(0, 0, 204) -Union_6.result().subResult(0).setColor(204, 102, 102) -Union_6.result().subResult(1).setColor(127, 254, 127) -Union_6.result().subResult(2).setColor(102, 51, 102) -Union_6.result().subResult(3).setColor(76, 76, 153) -Union_6.result().subResult(4).setColor(0, 0, 254) - -Partition_1_objects = [model.selection("SOLID", "Recover_1_1"), model.selection("COMPSOLID", "Union_1_1"), model.selection("COMPSOLID", "Extrusion_2_1"), model.selection("COMPSOLID", "demi-sphere")] -Partition_1 = model.addPartition(Part_1_doc, Partition_1_objects) -Partition_1.result().setColor(102, 0, 0) -Partition_1.result().subResult(0).setColor(255, 255, 0) -Partition_1.result().subResult(1).setColor(0, 254, 0) -Partition_1.result().subResult(2).setColor(0, 255, 255) -Partition_1.result().subResult(3).setColor(255, 85, 0) -Partition_1.result().subResult(4).setColor(153, 0, 0) -Partition_1.result().subResult(5).setColor(254, 0, 254) -Partition_1.result().subResult(6).setColor(127, 127, 254) -Partition_1.result().subResult(7).setColor(102, 204, 102) -Partition_1.result().subResult(8).setColor(127, 254, 127) -Partition_1.result().subResult(9).setColor(153, 153, 76) -Partition_1.result().subResult(10).setColor(204, 102, 102) -Partition_1.result().subResult(11).setColor(127, 254, 254) -Partition_1.result().subResult(12).setColor(255, 255, 0) -Partition_1.result().subResult(13).setColor(102, 51, 102) -Partition_1.result().subResult(14).setColor(102, 204, 204) -Partition_1.result().subResult(15).setColor(254, 127, 254) -Partition_1.result().subResult(16).setColor(153, 153, 0) -Partition_1.result().subResult(17).setColor(153, 153, 0) -Partition_1.result().subResult(18).setColor(204, 0, 204) - -Folder_1 = model.addFolder(Part_1_doc, Revolution_1, Union_1) -Folder_2 = model.addFolder(Part_1_doc, Point_3, Union_6) -model.do() - -# check the result -model.testNbResults(Partition_1, 1) -model.testNbSubResults(Partition_1, [19]) -model.testNbSubShapes(Partition_1, GeomAPI_Shape.SOLID, [19]) -model.testNbSubShapes(Partition_1, GeomAPI_Shape.FACE, [199]) -model.testNbSubShapes(Partition_1, GeomAPI_Shape.EDGE, [814]) -model.testNbSubShapes(Partition_1, GeomAPI_Shape.VERTEX, [1628]) -model.testResultsVolumes(Partition_1, [103867.289635450288187712430953979]) - -# change parameter and check validity of the result -Param_Diam.setValue(8) -model.do() - -model.testNbResults(Partition_1, 1) -model.testNbSubResults(Partition_1, [19]) -model.testNbSubShapes(Partition_1, GeomAPI_Shape.SOLID, [19]) -model.testNbSubShapes(Partition_1, GeomAPI_Shape.FACE, [191]) -model.testNbSubShapes(Partition_1, GeomAPI_Shape.EDGE, [744]) -model.testNbSubShapes(Partition_1, GeomAPI_Shape.VERTEX, [1488]) -model.testResultsVolumes(Partition_1, [103221.354557478349306620657444]) - -model.end() - -#assert(model.checkPythonDump()) diff --git a/src/FeaturesPlugin/boolean_common_widget.xml b/src/FeaturesPlugin/boolean_common_widget.xml new file mode 100644 index 000000000..9065d1e2d --- /dev/null +++ b/src/FeaturesPlugin/boolean_common_widget.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/FeaturesPlugin/plugin-Features.xml b/src/FeaturesPlugin/plugin-Features.xml index 36433dec5..bb13f70af 100644 --- a/src/FeaturesPlugin/plugin-Features.xml +++ b/src/FeaturesPlugin/plugin-Features.xml @@ -75,7 +75,7 @@ email : webmaster.salome@opencascade.com - + #include +//================================================================================================= +GeomAlgoAPI_Boolean::GeomAlgoAPI_Boolean(const GeomShapePtr theObject, + const GeomShapePtr theTool, + const OperationType theOperationType) +{ + ListOfShape aListWithObject, aListWithTool; + aListWithObject.push_back(theObject); + aListWithTool.push_back(theTool); + build(aListWithObject, aListWithTool, theOperationType); +} + //================================================================================================= GeomAlgoAPI_Boolean::GeomAlgoAPI_Boolean(const GeomShapePtr theObject, const ListOfShape& theTools, diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.h b/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.h index 3cb2d6e92..54a5d9428 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.h @@ -41,6 +41,11 @@ public: public: + /// Constructor. + GEOMALGOAPI_EXPORT GeomAlgoAPI_Boolean(const GeomShapePtr theObject, + const GeomShapePtr theTool, + const OperationType theOperationType); + /// Constructor. GEOMALGOAPI_EXPORT GeomAlgoAPI_Boolean(const GeomShapePtr theObject, const ListOfShape& theTools, -- 2.30.2