X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Boolean.cpp;h=2932d5e5cce410fa963f068e5579554a3dcfc13c;hb=c65c7a084cf32f54c8d8a93fceace414c3b0fb21;hp=3161b31c22e9cd1978659f88834d512b6ce8dc9c;hpb=ea948b36a6cc9163da5d2324b04572c9dddd5fd5;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Boolean.cpp b/src/FeaturesPlugin/FeaturesPlugin_Boolean.cpp index 3161b31c2..2932d5e5c 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Boolean.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Boolean.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + // File: FeaturesPlugin_Boolean.cpp // Created: 02 Sept 2014 // Author: Vitaly SMETANNIKOV @@ -10,61 +12,104 @@ #include #include #include - using namespace std; +#define FACE 4 +#define _MODIFY_TAG 1 +#define _DELETED_TAG 2 FeaturesPlugin_Boolean::FeaturesPlugin_Boolean() { } void FeaturesPlugin_Boolean::initAttributes() { - data()->addAttribute(FeaturesPlugin_Boolean::TYPE_ID(), ModelAPI_AttributeInteger::type()); - data()->addAttribute(FeaturesPlugin_Boolean::OBJECT_ID(), ModelAPI_AttributeReference::type()); - data()->addAttribute(FeaturesPlugin_Boolean::TOOL_ID(), ModelAPI_AttributeReference::type()); + data()->addAttribute(FeaturesPlugin_Boolean::TYPE_ID(), ModelAPI_AttributeInteger::typeId()); + data()->addAttribute(FeaturesPlugin_Boolean::OBJECT_ID(), ModelAPI_AttributeReference::typeId()); + data()->addAttribute(FeaturesPlugin_Boolean::TOOL_ID(), ModelAPI_AttributeReference::typeId()); } -boost::shared_ptr FeaturesPlugin_Boolean::getShape(const std::string& theAttrName) +std::shared_ptr FeaturesPlugin_Boolean::getShape(const std::string& theAttrName) { - boost::shared_ptr aObjRef = boost::dynamic_pointer_cast< + std::shared_ptr aObjRef = std::dynamic_pointer_cast< ModelAPI_AttributeReference>(data()->attribute(theAttrName)); if (aObjRef) { - boost::shared_ptr aConstr = boost::dynamic_pointer_cast< + std::shared_ptr aConstr = std::dynamic_pointer_cast< ModelAPI_ResultBody>(aObjRef->value()); if (aConstr) return aConstr->shape(); } - return boost::shared_ptr(); + return std::shared_ptr(); } void FeaturesPlugin_Boolean::execute() { - boost::shared_ptr aTypeAttr = boost::dynamic_pointer_cast< + std::shared_ptr aTypeAttr = std::dynamic_pointer_cast< ModelAPI_AttributeInteger>(data()->attribute(FeaturesPlugin_Boolean::TYPE_ID())); if (!aTypeAttr) return; int aType = aTypeAttr->value(); - boost::shared_ptr aObject = this->getShape(FeaturesPlugin_Boolean::OBJECT_ID()); - if (!aObject) + std::shared_ptr anObject = this->getShape(FeaturesPlugin_Boolean::OBJECT_ID()); + if (!anObject) return; - boost::shared_ptr aTool = this->getShape(FeaturesPlugin_Boolean::TOOL_ID()); + std::shared_ptr aTool = this->getShape(FeaturesPlugin_Boolean::TOOL_ID()); if (!aTool) return; - boost::shared_ptr aResult = document()->createBody(data()); - switch (aType) { - case BOOL_CUT: - aResult->store(GeomAlgoAPI_Boolean::makeCut(aObject, aTool)); - break; - case BOOL_FUSE: - aResult->store(GeomAlgoAPI_Boolean::makeFuse(aObject, aTool)); - break; - case BOOL_COMMON: - aResult->store(GeomAlgoAPI_Boolean::makeCommon(aObject, aTool)); - break; + std::shared_ptr aResultBody = document()->createBody(data()); + + GeomAlgoAPI_Boolean* aFeature = new GeomAlgoAPI_Boolean(anObject, aTool, aType); + if(aFeature && !aFeature->isDone()) { + static const std::string aFeatureError = "Boolean feature: algorithm failed"; + setError(aFeatureError); + return; + } + // Check if shape is valid + if (aFeature->shape()->isNull()) { + static const std::string aShapeError = "Boolean feature: resulting shape is Null"; + setError(aShapeError); + return; + } + if(!aFeature->isValid()) { + static const std::string aFeatureError = "Boolean feature: resulting shape is not valid"; + setError(aFeatureError); + return; + } + // if result of Boolean operation is same as was before it means that Boolean operation has no sence + // and naming provides no result, so, generate an error in this case + if (anObject->isEqual(aFeature->shape())) { + static const std::string aFeatureError = "Boolean feature: operation was not performed"; + setError(aFeatureError); + return; } - setResult(aResult); -} \ No newline at end of file + //LoadNamingDS + LoadNamingDS(aFeature, aResultBody, anObject, aTool, aType); + + setResult(aResultBody); +} + +//============================================================================ +void FeaturesPlugin_Boolean::LoadNamingDS(GeomAlgoAPI_Boolean* theFeature, + std::shared_ptr theResultBody, + std::shared_ptr theObject, + std::shared_ptr theTool, + int theType) +{ + + //load result + theResultBody->storeModified(theObject, theFeature->shape()); + + GeomAPI_DataMapOfShapeShape* aSubShapes = new GeomAPI_DataMapOfShapeShape(); + theFeature->mapOfShapes(*aSubShapes); + + // Put in DF modified faces + std::string aModName = "Modified"; + theResultBody->loadAndOrientModifiedShapes(theFeature->makeShape(), theObject, FACE, _MODIFY_TAG, aModName, *aSubShapes); + theResultBody->loadAndOrientModifiedShapes(theFeature->makeShape(), theTool, FACE, _MODIFY_TAG, aModName, *aSubShapes); + + //Put in DF deleted faces + theResultBody->loadDeletedShapes(theFeature->makeShape(), theObject, FACE, _DELETED_TAG); + theResultBody->loadDeletedShapes(theFeature->makeShape(), theTool, FACE, _DELETED_TAG); +}