Salome HOME
updated copyright message
[modules/shaper.git] / src / InitializationPlugin / InitializationPlugin_Plugin.cpp
index 5920c21a7f720cdb6d1edc9f76631bc392619264..fcd5bd56b19cf11b2c01b2b13704aea950d3c892 100644 (file)
@@ -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
@@ -33,6 +33,7 @@
 
 #include <Events_Message.h>
 #include <Events_InfoMessage.h>
+#include <Events_MessageBool.h>
 
 #include <memory>
 
 static InitializationPlugin_Plugin* MY_INITIALIZATIONPLUGIN_INSTANCE =
     new InitializationPlugin_Plugin();
 
-InitializationPlugin_Plugin::InitializationPlugin_Plugin()
+InitializationPlugin_Plugin::InitializationPlugin_Plugin() :
+  myCreatePartOnStart(false) // by default in TUI mode part is not created on start of PartSet
 {
+  char* isUnitTest = getenv("SHAPER_UNIT_TEST_IN_PROGRESS");
+  myInitDataModel = (!isUnitTest || isUnitTest[0] != '1');
+
   Events_Loop* aLoop = Events_Loop::loop();
-  const Events_ID kDocCreatedEvent = ModelAPI_DocumentCreatedMessage::eventId();
+  static const Events_ID kDocCreatedEvent = ModelAPI_DocumentCreatedMessage::eventId();
   aLoop->registerListener(this, kDocCreatedEvent, NULL, true);
+  static const Events_ID kCreatePartEvent = Events_Loop::eventByName(EVENT_CREATE_PART_ON_START);
+  aLoop->registerListener(this, kCreatePartEvent, NULL, true);
 
   myEvalListener =
     std::shared_ptr<InitializationPlugin_EvalListener>(new InitializationPlugin_EvalListener());
@@ -52,7 +59,8 @@ InitializationPlugin_Plugin::InitializationPlugin_Plugin()
 
 void InitializationPlugin_Plugin::processEvent(const std::shared_ptr<Events_Message>& theMessage)
 {
-  const Events_ID kDocCreatedEvent = ModelAPI_DocumentCreatedMessage::eventId();
+  static const Events_ID kDocCreatedEvent = ModelAPI_DocumentCreatedMessage::eventId();
+  static const Events_ID kCreatePartEvent = Events_Loop::eventByName(EVENT_CREATE_PART_ON_START);
   if (theMessage->eventID() == kDocCreatedEvent) {
     std::shared_ptr<ModelAPI_DocumentCreatedMessage> aMessage = std::dynamic_pointer_cast<
         ModelAPI_DocumentCreatedMessage>(theMessage);
@@ -60,10 +68,15 @@ void InitializationPlugin_Plugin::processEvent(const std::shared_ptr<Events_Mess
 
     /// Issue 431: for the current moment create planes only in the module document,
     /// Later if it is needed we may create special initial planes in Parts (may be different)
-    if (aDoc != ModelAPI_Session::get()->moduleDocument())
+    SessionPtr aMgr = ModelAPI_Session::get();
+    if (aDoc != aMgr->moduleDocument() || aMgr->isLoading())
       return;
 
+    if (myInitDataModel)
+      myEvalListener->initDataModel();
+
     std::list<FeaturePtr> aFeatures;
+    aMgr->startOperation("Initialization");
 
     // the viewer update should be blocked in order to avoid the features blinking before they are
     // hidden
@@ -71,7 +84,7 @@ void InitializationPlugin_Plugin::processEvent(const std::shared_ptr<Events_Mess
         new Events_Message(Events_Loop::eventByName(EVENT_UPDATE_VIEWER_BLOCKED)));
     Events_Loop::loop()->send(aMsg);
 
-    FeaturePtr aOrigin = createPoint(aDoc, "Origin", 0., 0., 0.);
+    FeaturePtr aOrigin = createPoint(aDoc, L"Origin", 0., 0., 0.);
     aFeatures.push_back(aOrigin);
     aFeatures.push_back(createAxis(aDoc, aOrigin, 100., 0., 0.));
     aFeatures.push_back(createAxis(aDoc, aOrigin, 0., 100., 0.));
@@ -79,6 +92,8 @@ void InitializationPlugin_Plugin::processEvent(const std::shared_ptr<Events_Mess
     aFeatures.push_back(createPlane(aDoc, 1., 0., 0.));
     aFeatures.push_back(createPlane(aDoc, 0., -1., 0.));
     aFeatures.push_back(createPlane(aDoc, 0., 0., 1.));
+    if (myCreatePartOnStart)
+      createPart(aDoc);
     // for PartSet it is done outside of the transaction, so explicitly flush this creation
     Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
 
@@ -94,13 +109,21 @@ void InitializationPlugin_Plugin::processEvent(const std::shared_ptr<Events_Mess
       }
     }
     Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
-    // the viewer update should be unblocked in order to avoid the features blinking before they are
-    // hidden
+
+    aMgr->finishOperation(); // before last message flush to update the title, make it not-modified
+    aMgr->clearUndoRedo(); // to forbid undo of auxiliary elements and initial part
+
+    // the viewer update should be unblocked to avoid the features blinking before they are hidden
     aMsg = std::shared_ptr<Events_Message>(
                   new Events_Message(Events_Loop::eventByName(EVENT_UPDATE_VIEWER_UNBLOCKED)));
 
     Events_Loop::loop()->send(aMsg);
   }
+  else if (theMessage->eventID() == kCreatePartEvent)
+  {
+    std::shared_ptr<Events_MessageBool> aMsg = std::dynamic_pointer_cast<Events_MessageBool>(theMessage);
+    myCreatePartOnStart = aMsg->value();
+  }
 }
 
 FeaturePtr InitializationPlugin_Plugin::createPlane(DocumentPtr theDoc, double theX, double theY,
@@ -114,11 +137,11 @@ FeaturePtr InitializationPlugin_Plugin::createPlane(DocumentPtr theDoc, double t
   aPlane->real("D")->setValue(0.);
 
   if (theX) {
-    aPlane->data()->setName("YOZ");
+    aPlane->data()->setName(L"YOZ");
   } else if (theY) {
-    aPlane->data()->setName("XOZ");
+    aPlane->data()->setName(L"XOZ");
   } else if (theZ) {
-    aPlane->data()->setName("XOY");
+    aPlane->data()->setName(L"XOY");
   }
     // don't show automatically created feature in the features history
   aPlane->setInHistory(aPlane, false);
@@ -134,7 +157,7 @@ FeaturePtr InitializationPlugin_Plugin::createPlane(DocumentPtr theDoc, double t
   return aPlane;
 }
 
-FeaturePtr InitializationPlugin_Plugin::createPoint(DocumentPtr theDoc, const std::string& theName,
+FeaturePtr InitializationPlugin_Plugin::createPoint(DocumentPtr theDoc, const std::wstring& theName,
                                                     double theX, double theY, double theZ)
 {
   std::shared_ptr<ModelAPI_Feature> aPoint = theDoc->addFeature("Point");
@@ -169,11 +192,11 @@ FeaturePtr InitializationPlugin_Plugin::createAxis(DocumentPtr theDoc, FeaturePt
   aAxis->real("Z_Direction")->setValue(theZ);
 
   if (theX != 0) {
-    aAxis->data()->setName("OX");
+    aAxis->data()->setName(L"OX");
   } else if (theY != 0) {
-    aAxis->data()->setName("OY");
+    aAxis->data()->setName(L"OY");
   } else if (theZ != 0) {
-    aAxis->data()->setName("OZ");
+    aAxis->data()->setName(L"OZ");
   }
    // don't show automatically created feature in the features history
   aAxis->setInHistory(aAxis, false);
@@ -183,3 +206,10 @@ FeaturePtr InitializationPlugin_Plugin::createAxis(DocumentPtr theDoc, FeaturePt
 
   return aAxis;
 }
+
+void InitializationPlugin_Plugin::createPart(DocumentPtr thePartSet)
+{
+  std::shared_ptr<ModelAPI_Feature> aPart = thePartSet->addFeature("Part");
+  if (aPart.get())
+    aPart->execute(); // to initialize and activate this part document
+}