X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FFeaturesPlugin%2FFeaturesPlugin_CompositeSketch.cpp;h=05d063a504027038f4f39d53d385d3c70d3702ef;hb=cc958db6897ac22fbd029ed613feea4c3f1bd669;hp=6fda4295be7328cdbf861991a92b7b153553b043;hpb=50a8df0c6a66da8067b16155e5ae39f8f26a7ebc;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp index 6fda4295b..05d063a50 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2020 CEA/DEN, EDF R&D +// Copyright (C) 2014-2022 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 @@ -32,6 +32,8 @@ #include +static const std::string COMPOSITESKETCH_VERSION_1("v9.6"); + static void storeSubShape(const std::shared_ptr theMakeShape, ResultBodyPtr theResultBody, const GeomShapePtr theShape, @@ -49,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); + } } } @@ -67,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; @@ -75,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) { @@ -177,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); @@ -252,6 +259,8 @@ void FeaturesPlugin_CompositeSketch::storeShapes( aShapeTypeToExplore = GeomAPI_Shape::COMPOUND; break; } + default: // [to avoid compilation warnings] + break; } // Store shapes. @@ -282,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); + } } } }