X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultGroup.cpp;h=91513f7eb499dd65096347243ab7062ad126477d;hb=refs%2Fheads%2FV9_11_BR;hp=7a4c5cfaf740f12e177ec415a201f3c356e1ab05;hpb=6e421e939851e0de46554ae45a3ca0e1f67cd91d;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultGroup.cpp b/src/Model/Model_ResultGroup.cpp index 7a4c5cfaf..91513f7eb 100644 --- a/src/Model/Model_ResultGroup.cpp +++ b/src/Model/Model_ResultGroup.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,12 +18,20 @@ // #include +#include #include #include +#include #include +#include +#include +#include +#include +#include + Model_ResultGroup::Model_ResultGroup(std::shared_ptr theOwnerData) { myOwnerData = theOwnerData; @@ -40,14 +48,54 @@ void Model_ResultGroup::colorConfigInfo(std::string& theSection, std::string& th std::shared_ptr Model_ResultGroup::shape() { std::shared_ptr aResult; - if (myOwnerData) { + // obtain stored shape + std::shared_ptr aData = std::dynamic_pointer_cast(data()); + if (aData && aData->isValid()) { + TDF_Label aShapeLab = aData->shapeLab(); + Handle(TDF_Reference) aRef; + if (aShapeLab.FindAttribute(TDF_Reference::GetID(), aRef)) { + aShapeLab = aRef->Get(); + } + Handle(TNaming_NamedShape) aName; + if (aShapeLab.FindAttribute(TNaming_NamedShape::GetID(), aName)) { + TopoDS_Shape aShape = aName->Get(); + if (!aShape.IsNull()) { + aResult.reset(new GeomAPI_Shape); + aResult->setImpl(new TopoDS_Shape(aShape)); + } + } + } + // collect shapes selected in group + if (!aResult && myOwnerData) { AttributeSelectionListPtr aList = myOwnerData->selectionList("group_list"); if (aList) { + GeomAPI_DataMapOfShapeShape aShapesMap; // to avoid shapes duplication std::list > aSubs; for(int a = aList->size() - 1; a >= 0; a--) { std::shared_ptr aSelection = aList->value(a)->value(); - if (aSelection && !aSelection->isNull()) { - aSubs.push_back(aSelection); + if (aList->isWholeResultAllowed()) { // whole result selection, explode to sub-shapes + if (!aSelection.get() || aSelection->isNull()) { + ResultPtr aContext = aList->value(a)->context(); + if (aContext) + aSelection = aContext->shape(); + } + if (aSelection && !aSelection->isNull()) { + GeomAPI_Shape::ShapeType aType = GeomAPI_Shape::shapeTypeByStr(aList->selectionType()); + if (aType == aSelection->shapeType()) { + if (aShapesMap.bind(aSelection, aSelection)) + aSubs.push_back(aSelection); + } else { + for(GeomAPI_ShapeExplorer anExp(aSelection, aType); anExp.more(); anExp.next()) { + if (aShapesMap.bind(anExp.current(), anExp.current())) + aSubs.push_back(anExp.current()); + } + } + } + } else { // take selection as it is + if (aSelection && !aSelection->isNull()) { + if (aShapesMap.bind(aSelection, aSelection)) + aSubs.push_back(aSelection); + } } } if (!aSubs.empty()) { @@ -57,3 +105,23 @@ std::shared_ptr Model_ResultGroup::shape() } return aResult; } + +void Model_ResultGroup::store(const GeomShapePtr& theShape) +{ + std::shared_ptr aData = std::dynamic_pointer_cast(data()); + if (aData) { + TDF_Label aShapeLab = aData->shapeLab(); + aShapeLab.ForgetAttribute(TDF_Reference::GetID()); + aShapeLab.ForgetAttribute(TNaming_NamedShape::GetID()); + + if (!theShape) + return; // bad shape + TopoDS_Shape aShape = theShape->impl(); + if (aShape.IsNull()) + return; // null shape inside + + // store the new shape as primitive + TNaming_Builder aBuilder(aShapeLab); + aBuilder.Generated(aShape); + } +}