X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_CompositeSketch.cpp;h=3d5b66c2ad879c391dd64ee0a8abb2a4f099982f;hb=06e7f5859095193fc7f498bd89a7d28009794f53;hp=1a2d4589f5e3a0cf0a1a009065e8c767dd218b9f;hpb=6e421e939851e0de46554ae45a3ca0e1f67cd91d;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp index 1a2d4589f..3d5b66c2a 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// Copyright (C) 2014-2023 CEA, EDF // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -18,6 +18,7 @@ // #include +#include #include #include @@ -26,16 +27,12 @@ #include #include -#include #include -#include -#include -#include #include -#include -#include + +static const std::string COMPOSITESKETCH_VERSION_1("v9.6"); static void storeSubShape(const std::shared_ptr theMakeShape, ResultBodyPtr theResultBody, @@ -54,7 +51,15 @@ void FeaturesPlugin_CompositeSketch::initCompositeSketchAttribtues(const int the // Initialize selection list. if(theInitFlags & InitBaseObjectsList) { - data()->addAttribute(BASE_OBJECTS_ID(), ModelAPI_AttributeSelectionList::typeId()); + AttributeSelectionListPtr anObjectsAttr = + std::dynamic_pointer_cast( + data()->addAttribute(BASE_OBJECTS_ID(), ModelAPI_AttributeSelectionList::typeId())); + myCurrentSelectionType = selectionList(BASE_OBJECTS_ID())->selectionType(); + anObjectsAttr->setWholeResultAllowed(true); + if (!anObjectsAttr->isInitialized()) { + // new feature, specify the version + data()->setVersion(COMPOSITESKETCH_VERSION_1); + } } } @@ -72,7 +77,7 @@ std::shared_ptr FeaturesPlugin_CompositeSketch::addFeature(std } //================================================================================================= -int FeaturesPlugin_CompositeSketch::numberOfSubs(bool forTree) const +int FeaturesPlugin_CompositeSketch::numberOfSubs(bool /*forTree*/) const { ObjectPtr aObj = data()->reference(SKETCH_ID())->value(); return aObj.get() ? 1 : 0; @@ -80,7 +85,7 @@ int FeaturesPlugin_CompositeSketch::numberOfSubs(bool forTree) const //================================================================================================= std::shared_ptr FeaturesPlugin_CompositeSketch::subFeature(const int theIndex, - bool forTree) + bool /*forTree*/) { FeaturePtr aSubFeature; if(theIndex == 0) { @@ -132,101 +137,12 @@ void FeaturesPlugin_CompositeSketch::removeFeature(std::shared_ptr aSketchWiresMap; AttributeSelectionListPtr aBaseObjectsSelectionList = selectionList(BASE_OBJECTS_ID()); - if(!aBaseObjectsSelectionList.get()) { - setError("Error: Could not get base objects selection list."); - return; - } - if(aBaseObjectsSelectionList->size() == 0) { - setError("Error: Base objects list is empty."); - return; - } - for(int anIndex = 0; anIndex < aBaseObjectsSelectionList->size(); anIndex++) { - AttributeSelectionPtr aBaseObjectSelection = aBaseObjectsSelectionList->value(anIndex); - if(!aBaseObjectSelection.get()) { - setError("Error: Selected base object is empty."); - return; - } - GeomShapePtr aBaseShape = aBaseObjectSelection->value(); - if(aBaseShape.get() && !aBaseShape->isNull()) { - GeomAPI_Shape::ShapeType aST = aBaseShape->shapeType(); - if(aST == GeomAPI_Shape::SOLID || aST == GeomAPI_Shape::COMPSOLID) { - setError("Error: Selected shapes has unsupported type."); - return; - } - ResultConstructionPtr aConstruction = - std::dynamic_pointer_cast(aBaseObjectSelection->context()); - if(aConstruction.get() && !aBaseShape->isEqual(aConstruction->shape()) && - aST == GeomAPI_Shape::WIRE) { - // It is a wire on the sketch, store it to make face later. - aSketchWiresMap[aConstruction].push_back(aBaseShape); - continue; - } else { - aST == GeomAPI_Shape::FACE ? aBaseFacesList.push_back(aBaseShape) : - theBaseShapesList.push_back(aBaseShape); - } - } else { - // This may be the whole sketch result selected, check and get faces. - ResultConstructionPtr aConstruction = - std::dynamic_pointer_cast(aBaseObjectSelection->context()); - if(!aConstruction.get()) { - setError("Error: Selected sketches does not have results."); - return; - } - int aFacesNum = aConstruction->facesNum(); - if(aFacesNum == 0) { - // Probably it can be construction. - aBaseShape = aConstruction->shape(); - if(aBaseShape.get() && !aBaseShape->isNull()) { - GeomAPI_Shape::ShapeType aST = aBaseShape->shapeType(); - if(aST != GeomAPI_Shape::VERTEX && aST != GeomAPI_Shape::EDGE && - aST != GeomAPI_Shape::WIRE && - aST != GeomAPI_Shape::FACE && aST != GeomAPI_Shape::SHELL) { - setError("Error: Selected shapes has unsupported type."); - return; - } - aST == GeomAPI_Shape::FACE ? aBaseFacesList.push_back(aBaseShape) : - theBaseShapesList.push_back(aBaseShape); - } - } else { - for(int aFaceIndex = 0; aFaceIndex < aFacesNum; aFaceIndex++) { - GeomShapePtr aBaseFace = aConstruction->face(aFaceIndex); - if(!aBaseFace.get() || aBaseFace->isNull()) { - setError("Error: One of the faces on selected sketch is null."); - return; - } - aBaseFacesList.push_back(aBaseFace); - } - } - } - } - - // Make faces from sketch wires. - for(std::map::const_iterator anIt = aSketchWiresMap.cbegin(); - anIt != aSketchWiresMap.cend(); ++anIt) { - const std::shared_ptr aSketchPlanarEdges = - std::dynamic_pointer_cast((*anIt).first->shape()); - const ListOfShape& aWiresList = (*anIt).second; - ListOfShape aFaces; - GeomAlgoAPI_ShapeTools::makeFacesWithHoles(aSketchPlanarEdges->origin(), - aSketchPlanarEdges->norm(), - aWiresList, - aFaces); - aBaseFacesList.insert(aBaseFacesList.end(), aFaces.begin(), aFaces.end()); - } - - // Searching faces with common edges. - if(theIsMakeShells && aBaseFacesList.size() > 1) { - GeomShapePtr aFacesCompound = GeomAlgoAPI_CompoundBuilder::compound(aBaseFacesList); - GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL, theBaseShapesList); - } else { - theBaseShapesList.insert(theBaseShapesList.end(), aBaseFacesList.begin(), - aBaseFacesList.end()); - } + std::string anError; + bool isOk = FeaturesPlugin_Tools::getShape( + aBaseObjectsSelectionList, theIsMakeShells, theBaseShapesList, anError); + if (!isOk) + setError(anError); } //================================================================================================= @@ -271,13 +187,10 @@ void FeaturesPlugin_CompositeSketch::storeGenerationHistory(ResultBodyPtr theRes case GeomAPI_Shape::COMPOUND: { aShapeTypeToExplode = GeomAPI_Shape::COMPOUND; } + default: // [to avoid compilation warnings] + break; } - int aLateralIndex = 1; - int aBaseEdgeIndex = 1; - int aVertexIndex = 1; - int aBaseVertexIndex = 1; - if(aShapeTypeToExplode == GeomAPI_Shape::VERTEX || aShapeTypeToExplode == GeomAPI_Shape::COMPOUND) { theResultBody->loadGeneratedShapes(theMakeShape, theBaseShape, GeomAPI_Shape::VERTEX); @@ -346,6 +259,8 @@ void FeaturesPlugin_CompositeSketch::storeShapes( aShapeTypeToExplore = GeomAPI_Shape::COMPOUND; break; } + default: // [to avoid compilation warnings] + break; } // Store shapes. @@ -376,9 +291,30 @@ void storeSubShape( for(GeomAPI_ShapeExplorer anExp(theShape, theType); anExp.more(); anExp.next()) { GeomShapePtr aSubShape = anExp.current(); if (!theResultBody->generated(aSubShape, theName)) { - // store from/to shapes as primitives and then store modification of them by the boolean - theResultBody->generated(aSubShape, theName, false); - theResultBody->loadModifiedShapes(theMakeShape, aSubShape, theType); + int aNbSubs = theResultBody->numberOfSubs(); + if (aNbSubs > 0) { + // check the modified shape is in the result body, don't store it if not + ListOfShape aNewShapes; + theMakeShape->modified(aSubShape, aNewShapes); + for (int i = 0; i < aNbSubs; ++i) { + ResultBodyPtr aSubRes = theResultBody->subResult(i); + GeomShapePtr aShape = aSubRes->shape(); + ListOfShape::iterator aNewIt = aNewShapes.begin(); + for (; aNewIt != aNewShapes.end(); ++aNewIt) + if (aShape->isSubShape(*aNewIt, false)) + break; + if (aNewIt != aNewShapes.end()) { + // store from/to shapes as primitives and then store modification of them by the boolean + aSubRes->generated(aSubShape, theName, false); + aSubRes->loadModifiedShapes(theMakeShape, aSubShape, theType); + } + } + } + else { + // store from/to shapes as primitives and then store modification of them by the boolean + theResultBody->generated(aSubShape, theName, false); + theResultBody->loadModifiedShapes(theMakeShape, aSubShape, theType); + } } } }