Salome HOME
Fix for #767: correct the internal history structure for nested features
[modules/shaper.git] / src / Model / Model_ResultBody.cpp
index 1fad264d8122ff265b11deea8178ad15d0ce9bce..9c5fa59cc1d25ea72ab16fe652160712dd5bad7c 100644 (file)
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
 // File:        Model_ResultBody.cpp
 // Created:     08 Jul 2014
 // Author:      Mikhail PONIKAROV
 
 #include <Model_ResultBody.h>
-#include <Model_Data.h>
-#include <TNaming_Builder.hxx>
-#include <TNaming_NamedShape.hxx>
-#include <TopoDS_Shape.hxx>
-#include <TDF_ChildIterator.hxx>
-#include <GeomAPI_Shape.h>
+#include <Model_BodyBuilder.h>
+#include <ModelAPI_AttributeIntArray.h>
+#include <Config_PropManager.h>
+// DEB
+//#include <TCollection_AsciiString.hxx>
+//#include <TDF_Tool.hxx>
+//#define DEB_IMPORT 1
 
 Model_ResultBody::Model_ResultBody()
 {
-  setIsConcealed(false);
-}
-
-void Model_ResultBody::store(const boost::shared_ptr<GeomAPI_Shape>& theShape)
-{
-  boost::shared_ptr<Model_Data> aData = boost::dynamic_pointer_cast<Model_Data>(data());
-  if (aData) {
-    TDF_Label& aShapeLab = aData->shapeLab();
-    // remove the previous history
-    clean();
-    aShapeLab.ForgetAttribute(TNaming_NamedShape::GetID());
-    for(TDF_ChildIterator anIter(aShapeLab); anIter.More(); anIter.Next()) {
-      anIter.Value().ForgetAllAttributes();
-    }
-    // store the new shape as primitive
-    TNaming_Builder aBuilder(aShapeLab);
-    if (!theShape)
-      return;  // bad shape
-    TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
-    if (aShape.IsNull())
-      return;  // null shape inside
-
-    aBuilder.Generated(aShape);
-  }
-}
-
-boost::shared_ptr<GeomAPI_Shape> Model_ResultBody::shape()
-{
-  boost::shared_ptr<Model_Data> aData = boost::dynamic_pointer_cast<Model_Data>(data());
-  if (aData) {
-    TDF_Label& aShapeLab = aData->shapeLab();
-    Handle(TNaming_NamedShape) aName;
-    if (aShapeLab.FindAttribute(TNaming_NamedShape::GetID(), aName)) {
-      TopoDS_Shape aShape = aName->Get();
-      if (!aShape.IsNull()) {
-        boost::shared_ptr<GeomAPI_Shape> aRes(new GeomAPI_Shape);
-        aRes->setImpl(new TopoDS_Shape(aShape));
-        return aRes;
-      }
-    }
-  }
-  return boost::shared_ptr<GeomAPI_Shape>();
-}
+  myBuilder = new Model_BodyBuilder(this);
 
-boost::shared_ptr<ModelAPI_Feature> Model_ResultBody::owner()
-{
-  return myOwner;
+  myIsDisabled = true; // by default it is not initialized and false to be after created
+  setIsConcealed(false);
 }
 
-void Model_ResultBody::clean()
+void Model_ResultBody::initAttributes()
 {
-  std::vector<TNaming_Builder*>::iterator aBuilder = myBuilders.begin();
-  for(; aBuilder != myBuilders.end(); aBuilder++)
-    delete *aBuilder;
+  // append the color attribute. It is empty, the attribute will be filled by a request
+  DataPtr aData = data();
+  aData->addAttribute(COLOR_ID(), ModelAPI_AttributeIntArray::typeId());
 }
 
-Model_ResultBody::~Model_ResultBody()
+void Model_ResultBody::colorConfigInfo(std::string& theSection, std::string& theName,
+  std::string& theDefault)
 {
-  clean();
+  theSection = "Visualization";
+  theName = "result_body_color";
+  theDefault = DEFAULT_COLOR();
 }
 
-TNaming_Builder* Model_ResultBody::builder(const int theTag)
+bool Model_ResultBody::setDisabled(std::shared_ptr<ModelAPI_Result> theThis, const bool theFlag)
 {
-  if (myBuilders.size() < (unsigned int)theTag) {
-    myBuilders.insert(myBuilders.end(), theTag - myBuilders.size() + 1, NULL);
+  bool aChanged = ModelAPI_ResultBody::setDisabled(theThis, theFlag);
+  if (aChanged) { // state is changed, so modifications are needed
+    myBuilder->evolutionToSelection(theFlag);
   }
-  if (!myBuilders[theTag]) {
-    boost::shared_ptr<Model_Data> aData = boost::dynamic_pointer_cast<Model_Data>(data());
-    myBuilders[theTag] = new TNaming_Builder(aData->shapeLab().FindChild(theTag));
-  }
-  return myBuilders[theTag];
-}
-
-void Model_ResultBody::generated(
-  const boost::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag)
-{
-  TopoDS_Shape aShape = theNewShape->impl<TopoDS_Shape>();
-  builder(theTag)->Generated(aShape);
-}
-
-void Model_ResultBody::generated(const boost::shared_ptr<GeomAPI_Shape>& theOldShape,
-    const boost::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag)
-{
-  TopoDS_Shape anOldShape = theOldShape->impl<TopoDS_Shape>();
-  TopoDS_Shape aNewShape = theNewShape->impl<TopoDS_Shape>();
-  builder(theTag)->Generated(anOldShape, aNewShape);
-}
-
-
-void Model_ResultBody::modified(const boost::shared_ptr<GeomAPI_Shape>& theOldShape,
-    const boost::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag)
-{
-  TopoDS_Shape anOldShape = theOldShape->impl<TopoDS_Shape>();
-  TopoDS_Shape aNewShape = theNewShape->impl<TopoDS_Shape>();
-  builder(theTag)->Modify(anOldShape, aNewShape);
-}
-
-void Model_ResultBody::deleted(const boost::shared_ptr<GeomAPI_Shape>& theOldShape,
-    const int theTag)
-{
-  TopoDS_Shape aShape = theOldShape->impl<TopoDS_Shape>();
-  builder(theTag)->Delete(aShape);
+  return aChanged;
 }