X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Intersection.cpp;h=b4407c86dd28aca88a89152a349707d367a52eab;hb=19fe731f66ec15a60da87d8287ad0d189052b2b4;hp=b5fd9982b875dbafe8d635575e5724b9f3af1791;hpb=bc68c24f2be18a091832a8215428c4039bac5ddf;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Intersection.cpp b/src/FeaturesPlugin/FeaturesPlugin_Intersection.cpp index b5fd9982b..b4407c86d 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Intersection.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Intersection.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2020 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 @@ -12,10 +12,9 @@ // // 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 +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "FeaturesPlugin_Intersection.h" @@ -27,10 +26,14 @@ #include #include +#include +#include #include #include +static const std::string INTERSECTION_VERSION_1("v9.5"); + //================================================================================================= FeaturesPlugin_Intersection::FeaturesPlugin_Intersection() { @@ -39,28 +42,19 @@ FeaturesPlugin_Intersection::FeaturesPlugin_Intersection() //================================================================================================= void FeaturesPlugin_Intersection::initAttributes() { - data()->addAttribute(OBJECT_LIST_ID(), + AttributePtr anObjectsAttr = data()->addAttribute(OBJECT_LIST_ID(), ModelAPI_AttributeSelectionList::typeId()); + + initVersion(INTERSECTION_VERSION_1, anObjectsAttr, AttributePtr()); } //================================================================================================= void FeaturesPlugin_Intersection::execute() { - ListOfShape anObjects; - + GeomAPI_ShapeHierarchy anObjectsHierarchy; + ListOfShape aPlanes; // Getting objects. - AttributeSelectionListPtr anObjectsSelList = selectionList(OBJECT_LIST_ID()); - for (int anObjectsIndex = 0; anObjectsIndex < anObjectsSelList->size(); anObjectsIndex++) { - std::shared_ptr anObjectAttr = - anObjectsSelList->value(anObjectsIndex); - std::shared_ptr anObject = anObjectAttr->value(); - if (!anObject.get()) { - return; - } - anObjects.push_back(anObject); - } - - if(anObjects.empty()) { + if (!processAttribute(OBJECT_LIST_ID(), anObjectsHierarchy, aPlanes)) { setError("Error: Objects or tools are empty."); return; } @@ -68,90 +62,42 @@ void FeaturesPlugin_Intersection::execute() int aResultIndex = 0; // Create result. - GeomAlgoAPI_Intersection anIntersectionAlgo(anObjects); + const ListOfShape& anObjects = anObjectsHierarchy.objects(); + GeomMakeShapePtr anIntersectionAlgo(new GeomAlgoAPI_Intersection(anObjects)); // Checking that the algorithm worked properly. - if (!anIntersectionAlgo.isDone()) { - static const std::string aFeatureError = "Error: Intersection algorithm failed."; - setError(aFeatureError); + std::string anError; + if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(anIntersectionAlgo, getKind(), anError)) { + setError(anError); return; } - if (anIntersectionAlgo.shape()->isNull()) { - static const std::string aShapeError = "Error: Resulting shape is Null."; - setError(aShapeError); - return; - } - if (!anIntersectionAlgo.isValid()) { - std::string aFeatureError = "Error: Resulting shape is not valid."; - setError(aFeatureError); - return; + + std::shared_ptr aMakeShapeList(new GeomAlgoAPI_MakeShapeList); + aMakeShapeList->appendAlgo(anIntersectionAlgo); + + GeomShapePtr aResShape = anIntersectionAlgo->shape(); + if (data()->version() == INTERSECTION_VERSION_1) { + // merge hierarchies of compounds containing objects and tools + // and append the result of the FUSE operation + aResShape = keepUnusedSubsOfCompound(aResShape, anObjectsHierarchy, + GeomAPI_ShapeHierarchy(), aMakeShapeList); } std::shared_ptr aResultBody = document()->createBody(data(), aResultIndex); - loadNamingDS(aResultBody, anObjects, anIntersectionAlgo); + FeaturesPlugin_Tools::loadModifiedShapes(aResultBody, + anObjects, + ListOfShape(), + aMakeShapeList, + aResShape); setResult(aResultBody, aResultIndex); aResultIndex++; + FeaturesPlugin_Tools::loadDeletedShapes(aResultBody, + GeomShapePtr(), + anObjects, + aMakeShapeList, + aResShape); // remove the rest results if there were produced in the previous pass removeResults(aResultIndex); } - -//================================================================================================= -void FeaturesPlugin_Intersection::loadNamingDS(std::shared_ptr theResultBody, - const ListOfShape& theObjects, - GeomAlgoAPI_MakeShape& theMakeShape) -{ - std::shared_ptr aResultShape = theMakeShape.shape(); - theResultBody->storeModified(theObjects.front(), aResultShape); - - GeomAPI_DataMapOfShapeShape aShapesMap; // Map to store {result_shape, original_shape} - const int aShapeTypesNb = 2; - const GeomAPI_Shape::ShapeType aShapeTypes[aShapeTypesNb] = - {GeomAPI_Shape::VERTEX, GeomAPI_Shape::EDGE}; - for (ListOfShape::const_iterator anIt = theObjects.cbegin(); anIt != theObjects.cend(); ++anIt) { - const GeomShapePtr aShape = *anIt; - for(int anIndex = 0; anIndex < aShapeTypesNb; ++anIndex) { - for(GeomAPI_ShapeExplorer anOrigShapeExp(aShape, aShapeTypes[anIndex]); - anOrigShapeExp.more(); - anOrigShapeExp.next()) { - ListOfShape aHistory; - const GeomShapePtr aSubShape = anOrigShapeExp.current(); - theMakeShape.modified(aSubShape, aHistory); - for(ListOfShape::const_iterator aHistoryIt = aHistory.cbegin(); - aHistoryIt != aHistory.cend(); - ++aHistoryIt) { - aShapesMap.bind(*aHistoryIt, aSubShape); - } - } - } - } - - int aModifiedVertexIndex(1), - aGeneratedVertexIndex(1), - aModifiedEdgeIndex(1), - aGeneratedEdgeIndex(1); - int aTag = 4; - GeomAPI_DataMapOfShapeShape aStoredShapes; - for(int anIndex = 0; anIndex < aShapeTypesNb; ++anIndex) { - for(GeomAPI_ShapeExplorer aShapeExp(aResultShape, aShapeTypes[anIndex]); - aShapeExp.more(); - aShapeExp.next()) { - const GeomShapePtr aSubShape = aShapeExp.current(); - if(aStoredShapes.isBound(aSubShape)) { - continue; - } - if(aShapesMap.isBound(aSubShape)) { - theResultBody->modified(aShapesMap.find(aSubShape), aSubShape); - } else { - theResultBody->generated( - aSubShape, - std::string("Generated_") - + (anIndex == 0 ? "Vertex_" : "Edge_") - + std::to_string((long long)(anIndex == 0 ? aGeneratedVertexIndex++ - : aGeneratedEdgeIndex++))); - } - aStoredShapes.bind(aSubShape, aSubShape); - } - } -}