]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Make initialization plugin:
authormpv <mpv@opencascade.com>
Tue, 17 Mar 2015 08:21:15 +0000 (11:21 +0300)
committermpv <mpv@opencascade.com>
Tue, 17 Mar 2015 08:21:15 +0000 (11:21 +0300)
- make features in every new document (not loaded)
- called for PartSet without checking the transactions
- creates features without history

12 files changed:
src/Config/plugins.xml
src/InitializationPlugin/InitializationPlugin_Plugin.cpp
src/InitializationPlugin/InitializationPlugin_Plugin.h
src/Model/Model_Application.cpp
src/Model/Model_Document.cpp
src/Model/Model_Document.h
src/Model/Model_Session.cpp
src/ModelAPI/ModelAPI_Document.h
src/ModelAPI/ModelAPI_Feature.cpp
src/ModelAPI/ModelAPI_Feature.h
src/ModelAPI/ModelAPI_Object.cpp
src/ModelAPI/ModelAPI_Object.h

index 7ac11fe50f01d1a432fc2f0f2113d0b556614341..212647ecebe1226f313e2423781aa2d9d96fc084 100644 (file)
@@ -1,13 +1,14 @@
 <!-- Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
 
 <plugins module="PartSet">
+  <!-- Initialization plugin must be first here to initialize the PartSet document -->
+  <plugin library="InitializationPlugin"/>
   <plugin library="PartSetPlugin" configuration="plugin-PartSet.xml"/>
   <plugin library="SketchPlugin" configuration="plugin-Sketch.xml"/>
   <plugin library="ConstructionPlugin" configuration="plugin-Construction.xml"/>
   <plugin library="FeaturesPlugin" configuration="plugin-Features.xml"/>
   <plugin library="ExchangePlugin" configuration="plugin-Exchange.xml"/>
   <plugin script="ConnectorPlugin" configuration="plugin-Connector.xml" dependency="Geometry"/>
-  <plugin library="InitializationPlugin"/>
   <plugin library="SketchSolver"/>
   <plugin library="GeomValidators"/>
   <plugin library="DFBrowser" internal="true"/>
index fce2a1a2d8df17ee50abaf0649ec92396b485464..4ad9d0a95edfbbf51a5c45f7ec92992c3af317b6 100644 (file)
@@ -1,4 +1,3 @@
-
 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
 
 #include <InitializationPlugin_Plugin.h>
@@ -7,38 +6,23 @@
 #include <ModelAPI_Document.h>
 #include <ModelAPI_AttributeDouble.h>
 #include <ModelAPI_AttributeString.h>
-
+#include <ModelAPI_Events.h>
 
 #include <Events_Message.h>
-
-#include <ModelAPI_Events.h>
-#include <ModelAPI_Session.h>
+#include <Events_Error.h>
 
 #include <memory>
 
-#ifdef _DEBUG
-#include <iostream>
-#endif
-
 // the only created instance of this plugin
 static InitializationPlugin_Plugin* MY_INITIALIZATIONPLUGIN_INSTANCE = new InitializationPlugin_Plugin();
 
 InitializationPlugin_Plugin::InitializationPlugin_Plugin()
 {
-  // register this plugin
-  SessionPtr aSession = ModelAPI_Session::get();
-  aSession->registerPlugin(this);
-
   Events_Loop* aLoop = Events_Loop::loop();
   const Events_ID kDocCreatedEvent = ModelAPI_DocumentCreatedMessage::eventId();
   aLoop->registerListener(this, kDocCreatedEvent, NULL, true);
 }
 
-FeaturePtr InitializationPlugin_Plugin::createFeature(std::string theFeatureID)
-{
-  return FeaturePtr();
-}
-
 void InitializationPlugin_Plugin::processEvent(const std::shared_ptr<Events_Message>& theMessage)
 {
   const Events_ID kDocCreatedEvent = ModelAPI_DocumentCreatedMessage::eventId();
@@ -50,11 +34,12 @@ void InitializationPlugin_Plugin::processEvent(const std::shared_ptr<Events_Mess
     createPlane(aDoc, 1., 0., 0.);
     createPlane(aDoc, 0., 1., 0.);
     createPlane(aDoc, 0., 0., 1.);
+    // for PartSet it is done outside of the transaction, so explicitly flush this creation
+    Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
   } else if (theMessage.get()) {
-    #ifdef _DEBUG
-    std::cout << "InitializationPlugin_Plugin::processEvent: unhandled message caught: " << std::endl
-              << theMessage->eventID().eventText() << std::endl;
-    #endif
+    Events_Error::send(
+      std::string("InitializationPlugin_Plugin::processEvent: unhandled message caught: ") + 
+      theMessage->eventID().eventText());
   }
 }
 
@@ -74,6 +59,7 @@ void InitializationPlugin_Plugin::createPlane(DocumentPtr theDoc, double theA, d
   } else if (theC) {
     aPlane->data()->setName("X0Y");
   }
+  aPlane->setInHistory(aPlane, false); // don't show automatically created feature in the features history
 }
 
 void InitializationPlugin_Plugin::createPoint(DocumentPtr theDoc)
@@ -83,5 +69,5 @@ void InitializationPlugin_Plugin::createPoint(DocumentPtr theDoc)
   aPoint->real("y")->setValue(0.);
   aPoint->real("z")->setValue(0.);
   aPoint->data()->setName("Origin");
+  aPoint->setInHistory(aPoint, false); // don't show automatically created feature in the features history
 }
-
index bd5c1a2198fea7af006835a1a2a95bd728e199e0..bbd9e4aa02ad6922f40febfb252f08904daf61d7 100644 (file)
@@ -6,7 +6,6 @@
 
 #include <InitializationPlugin.h>
 
-#include <ModelAPI_Plugin.h>
 #include <ModelAPI_Feature.h>
 
 #include <Events_Loop.h>
 /**\class InitializationPlugin_Plugin
  * TODO: Add documentation
  */
-class INITIALIZATIONPLUGIN_EXPORT InitializationPlugin_Plugin : public ModelAPI_Plugin,
-                                                                public Events_Listener
+class INITIALIZATIONPLUGIN_EXPORT InitializationPlugin_Plugin : public Events_Listener
 {
  public:
   InitializationPlugin_Plugin();
   ~InitializationPlugin_Plugin() {}
-  /// Creates the feature object of this plugin by the feature string ID
-  virtual FeaturePtr createFeature(std::string theFeatureID);
   virtual void processEvent(const std::shared_ptr<Events_Message>& theMessage);
 
   void createPlane(DocumentPtr theDoc, double theA, double theB, double theC);
index f8955ce59d5da228b8bd276828f1a1a914f6a964..a825e747104b6482f68a0b14a7bbbbcc4b13d182 100644 (file)
@@ -30,19 +30,21 @@ const std::shared_ptr<Model_Document>& Model_Application::getDocument(string the
 
   static const std::string thePartSetKind("PartSet");
   static const std::string thePartKind("Part");
+  bool isRoot = theDocID == "root"; // the document is root
   std::shared_ptr<Model_Document> aNew(
-    new Model_Document(theDocID, theDocID == "root" ? thePartSetKind : thePartKind));
+    new Model_Document(theDocID, isRoot ? thePartSetKind : thePartKind));
   myDocs[theDocID] = aNew;
 
-  Events_ID anId = ModelAPI_DocumentCreatedMessage::eventId();
-  std::shared_ptr<ModelAPI_DocumentCreatedMessage> aMessage =
-        std::shared_ptr<ModelAPI_DocumentCreatedMessage>(new ModelAPI_DocumentCreatedMessage(anId, this));
-  aMessage->setDocument(aNew);
-  Events_Loop::loop()->send(aMessage);
   // load it if it must be loaded by demand
   if (myLoadedByDemand.find(theDocID) != myLoadedByDemand.end() && !myPath.empty()) {
     aNew->load(myPath.c_str());
     myLoadedByDemand.erase(theDocID);  // done, don't do it anymore
+  } else {
+    static Events_ID anId = ModelAPI_DocumentCreatedMessage::eventId();
+    std::shared_ptr<ModelAPI_DocumentCreatedMessage> aMessage = std::shared_ptr
+      <ModelAPI_DocumentCreatedMessage>(new ModelAPI_DocumentCreatedMessage(anId, this));
+    aMessage->setDocument(aNew);
+    Events_Loop::loop()->send(aMessage);
   }
 
   return myDocs[theDocID];
index fb00ed5bf3f3c43e29ecf690de1d39317e8ca79b..8f4ac4cb17ef7eb62a3dc7ee4db6b4bcd8e64802 100644 (file)
@@ -548,8 +548,12 @@ FeaturePtr Model_Document::addFeature(std::string theID)
   FeaturePtr aFeature = ModelAPI_Session::get()->createFeature(theID);
   if (!aFeature)
     return aFeature;
-  std::shared_ptr<Model_Document> aDocToAdd = std::dynamic_pointer_cast<Model_Document>(
-      aFeature->documentToAdd());
+  Model_Document* aDocToAdd;
+  if (aFeature->documentToAdd().get()) { // use the customized document to add
+    aDocToAdd = std::dynamic_pointer_cast<Model_Document>(aFeature->documentToAdd()).get();
+  } else { // if customized is not presented, add to "this" document
+    aDocToAdd = this;
+  }
   if (aFeature) {
     TDF_Label aFeatureLab;
     if (!aFeature->isAction()) {  // do not add action to the data model
@@ -577,7 +581,7 @@ FeaturePtr Model_Document::addFeature(std::string theID)
 }
 
 /// Appenad to the array of references a new referenced label.
-/// If theIndex is not -1, removes element at thisindex, not theReferenced.
+/// If theIndex is not -1, removes element at this index, not theReferenced.
 /// \returns the index of removed element
 static int RemoveFromRefArray(TDF_Label theArrayLab, TDF_Label theReferenced, const int theIndex =
                                   -1)
@@ -685,6 +689,22 @@ void Model_Document::removeFeature(FeaturePtr theFeature/*, const bool theCheck*
   }
 }
 
+void Model_Document::addToHistory(const std::shared_ptr<ModelAPI_Object> theObject)
+{
+  TDF_Label aFeaturesLab = featuresLabel();
+  std::shared_ptr<Model_Data> aData = std::static_pointer_cast<Model_Data>(theObject->data());
+  if (!aData) {
+      return;  // not found feature => do not remove
+  }
+  TDF_Label aFeatureLabel = aData->label().Father();
+  // store feature in the history of features array
+  if (theObject->isInHistory()) {
+    AddToRefArray(aFeaturesLab, aFeatureLabel);
+  } else {
+    RemoveFromRefArray(aFeaturesLab, aFeatureLabel);
+  }
+}
+
 FeaturePtr Model_Document::feature(TDF_Label& theLabel) const
 {
   if (myObjs.IsBound(theLabel))
index bffcc81bcf5012b1f32ceec10658c328d3f52394..7ec9e073ec262be0a5a82217f35cabf9c7f15418 100644 (file)
@@ -208,6 +208,9 @@ class Model_Document : public ModelAPI_Document
   //! Returns the list of Ids of the operations that can be redoed (called for the root document)
   std::list<std::string> redoList() const;
 
+  /// Internally makes document know that feature was removed or added in history after creation
+  MODEL_EXPORT virtual void addToHistory(const std::shared_ptr<ModelAPI_Object> theObject);
+
   friend class Model_Application;
   friend class Model_Session;
   friend class Model_Update;
index 1791c3ad604bff088905e8da1e7ad73c0b23d156..9618362e823e60de18874e85d6efd33650ca7035 100644 (file)
@@ -172,8 +172,18 @@ FeaturePtr Model_Session::createFeature(string theFeatureID)
 
 std::shared_ptr<ModelAPI_Document> Model_Session::moduleDocument()
 {
-  return std::shared_ptr<ModelAPI_Document>(
+  bool aFirstCall = !Model_Application::getApplication()->hasDocument("root");
+  if (aFirstCall) {
+    // creation of the root document is always outside of the transaction, so, avoid checking it
+    setCheckTransactions(false);
+  }
+  std::shared_ptr<ModelAPI_Document> aDoc = std::shared_ptr<ModelAPI_Document>(
       Model_Application::getApplication()->getDocument("root"));
+  if (aFirstCall) {
+    // creation of the root document is always outside of the transaction, so, avoid checking it
+    setCheckTransactions(true);
+  }
+  return aDoc;
 }
 
 std::shared_ptr<ModelAPI_Document> Model_Session::document(std::string theDocID)
index bf1fa3832d33882d18817394b605a244e24a81cc..9ce3ccd48d6551ade979980b86edbd5fb28ebe20 100644 (file)
@@ -98,6 +98,11 @@ public:
 protected:
   /// Only for SWIG wrapping it is here
   MODELAPI_EXPORT ModelAPI_Document();
+
+  /// Internally makes document know that feature was removed or added in history after creation
+  MODELAPI_EXPORT virtual void addToHistory(const std::shared_ptr<ModelAPI_Object> theObject) = 0;
+
+  friend class ModelAPI_Object; // to add or remove from the history
 };
 
 //! Pointer on document object
index 65cfa361ed3e8645cbf3812d45a90d83f5e31f68..1a2e641a2981aa18d740c5963c742d56ce8f9418 100644 (file)
@@ -111,7 +111,8 @@ void ModelAPI_Feature::eraseResults()
 
 std::shared_ptr<ModelAPI_Document> ModelAPI_Feature::documentToAdd()
 {
-  return ModelAPI_Session::get()->activeDocument();
+  // null pointer t ouse the current document
+  return std::shared_ptr<ModelAPI_Document>();
 }
 
 void ModelAPI_Feature::erase()
index e5701200fedbc8755f1c58c1f104aca8ffe4d825..c338e151fd76fe95ed6e1a83a61692fe65ae8987 100644 (file)
@@ -92,7 +92,7 @@ class ModelAPI_Feature : public ModelAPI_Object
   }
 
   /// Must return document where the new feature must be added to
-  /// By default it is current document
+  /// By default it is null document: it is added to the document this method is called to
   MODELAPI_EXPORT virtual std::shared_ptr<ModelAPI_Document> documentToAdd();
 
   /// To virtually destroy the fields of successors
index 410c410c742f8d1f736aa8d646f6e7568b378784..573b2d12fa83a7abf599b3b48e23ec5e35a83643 100644 (file)
@@ -5,11 +5,20 @@
 // Author:      Mikhail PONIKAROV
 
 #include "ModelAPI_Object.h"
-
+#include "ModelAPI_Document.h"
 
 bool ModelAPI_Object::isInHistory()
 {
-  return true;
+  return myInHistory;
+}
+
+void ModelAPI_Object::setInHistory(
+  const std::shared_ptr<ModelAPI_Object> theObject, const bool theFlag)
+{
+  if (myInHistory != theFlag) {
+    myInHistory = theFlag;
+    myDoc->addToHistory(theObject);
+  }
 }
 
 std::shared_ptr<ModelAPI_Data> ModelAPI_Object::data() const
@@ -31,6 +40,10 @@ void ModelAPI_Object::attributeChanged(const std::string& theID)
 {
 }
 
+ModelAPI_Object::ModelAPI_Object() : myInHistory(true)
+{
+}
+
 ModelAPI_Object::~ModelAPI_Object()
 {
 }
index 485cf2ee1bc3775906dea0052f0376dc240270e2..6abadf9eae52ddd84ac98a2816e9493c2f1f239c 100644 (file)
@@ -28,10 +28,17 @@ class ModelAPI_Object
 {
   std::shared_ptr<ModelAPI_Data> myData;  ///< manager of the data model of a feature
   std::shared_ptr<ModelAPI_Document> myDoc;  ///< document this object belongs to
+  bool myInHistory; ///< keep the information about the presense of the object in the history tree
  public:
   /// By default object is displayed in the object browser.
   MODELAPI_EXPORT virtual bool isInHistory();
 
+  /// Makes object presented or not in the history of the created objects
+  /// \param theObject is shared pointer to "this"
+  /// \param theFlag is boolean value: to add or remove from the history
+  MODELAPI_EXPORT virtual void setInHistory(
+    const std::shared_ptr<ModelAPI_Object> theObject, const bool theFlag);
+
   /// Returns the data manager of this object: attributes
   MODELAPI_EXPORT virtual std::shared_ptr<ModelAPI_Data> data() const;
 
@@ -52,6 +59,9 @@ class ModelAPI_Object
   // MODELAPI_EXPORT
   MODELAPI_EXPORT virtual void attributeChanged(const std::string& theID);
 
+  /// Initializes the default states of the object
+  MODELAPI_EXPORT ModelAPI_Object();
+
   /// To use virtuality for destructors
   MODELAPI_EXPORT virtual ~ModelAPI_Object();