Salome HOME
Task 2.5. Combination operations on Groups (issue #2935)
[modules/shaper.git] / src / Model / Model_ResultGroup.cpp
index 7a4c5cfaf740f12e177ec415a201f3c356e1ab05..87d1620f6b3644f3525ac35273734dda34f595b8 100644 (file)
 //
 
 #include <Model_ResultGroup.h>
+#include <Model_Data.h>
 #include <ModelAPI_AttributeSelectionList.h>
 
 #include <GeomAlgoAPI_CompoundBuilder.h>
 
 #include <Config_PropManager.h>
 
+#include <TDF_Label.hxx>
+#include <TDF_Reference.hxx>
+#include <TNaming_Builder.hxx>
+#include <TNaming_NamedShape.hxx>
+#include <TopoDS_Shape.hxx>
+
 Model_ResultGroup::Model_ResultGroup(std::shared_ptr<ModelAPI_Data> theOwnerData)
 {
   myOwnerData = theOwnerData;
@@ -40,7 +47,25 @@ void Model_ResultGroup::colorConfigInfo(std::string& theSection, std::string& th
 std::shared_ptr<GeomAPI_Shape> Model_ResultGroup::shape()
 {
   std::shared_ptr<GeomAPI_Shape> aResult;
-  if (myOwnerData) {
+  // obtain stored shape
+  std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(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) {
       std::list<std::shared_ptr<GeomAPI_Shape> > aSubs;
@@ -57,3 +82,23 @@ std::shared_ptr<GeomAPI_Shape> Model_ResultGroup::shape()
   }
   return aResult;
 }
+
+void Model_ResultGroup::store(const GeomShapePtr& theShape)
+{
+  std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(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<TopoDS_Shape>();
+    if (aShape.IsNull())
+      return;  // null shape inside
+
+    // store the new shape as primitive
+    TNaming_Builder aBuilder(aShapeLab);
+    aBuilder.Generated(aShape);
+  }
+}