]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Improve loading of parts
authorvsv <vsv@opencascade.com>
Mon, 3 Feb 2020 15:42:08 +0000 (18:42 +0300)
committervsv <vsv@opencascade.com>
Mon, 3 Feb 2020 15:42:37 +0000 (18:42 +0300)
src/Model/Model_ResultPart.cpp
src/Model/Model_ResultPart.h
src/ModelAPI/ModelAPI_ResultPart.h
src/PartSet/PartSet_MenuMgr.cpp
src/PartSet/PartSet_MenuMgr.h
src/PartSet/PartSet_Module.cpp

index 7bbadba0dc02d707400574092a5cd23bdafb39df..f89eff7d738ec5632febcd3f19e9f44ff4b2046a 100644 (file)
@@ -89,7 +89,8 @@ void Model_ResultPart::activate()
   SessionPtr aMgr = ModelAPI_Session::get();
   if (!aMgr->isOperation()) {
     // open transaction even document is not created to set current docs in setActiveDocument
-    aMgr->startOperation("Activation");
+    std::string aMsg = "Activation " + data()->name();
+    aMgr->startOperation(aMsg);
     isNewTransaction = true;
   }
   if (!aDocRef->value().get()) {  // create (or open) a document if it is not yet created
@@ -113,6 +114,22 @@ void Model_ResultPart::activate()
   }
 }
 
+
+void Model_ResultPart::loadPart()
+{
+  std::shared_ptr<ModelAPI_AttributeDocRef> aDocRef = data()->document(DOC_REF());
+  if (!aDocRef->value().get()) {  // create (or open) a document if it is not yet created
+    Handle(Model_Application) anApp = Model_Application::getApplication();
+    if (anApp->isLoadByDemand(data()->name(), aDocRef->docId())) {
+      anApp->loadDocument(data()->name(), aDocRef->docId()); // if it is just new part, load fails
+    }
+    else {
+      anApp->createDocument(aDocRef->docId());
+    }
+  }
+}
+
+
 std::shared_ptr<ModelAPI_ResultPart> Model_ResultPart::original()
 {
   if (myTrsf.get() && baseRef().get()) {  // the second condition is due to #2035
index fff44ed1c04531e540200fe8d6391d9b2777e916..0f27e9c589cf91b55e358f12e4881d3d0e04c293 100644 (file)
@@ -95,6 +95,9 @@ class Model_ResultPart : public ModelAPI_ResultPart
   /// Returns the shape selected in the selection index
   MODEL_EXPORT virtual std::shared_ptr<GeomAPI_Shape> selectionValue(const int theIndex);
 
+  /// Loading the part from file
+  MODEL_EXPORT virtual void loadPart();
+
 protected:
   /// makes a result on a temporary feature (an action)
   Model_ResultPart();
index 4a4756be5c732fe809d452c238f0529e99ca8111..0ceb0865213f1bc03393d288ac1a985e4e9551b0 100644 (file)
@@ -97,6 +97,9 @@ class ModelAPI_ResultPart : public ModelAPI_Result
 
   /// Updates the shape-result of the part (called on Part feature execution)
   virtual void updateShape() = 0;
+
+  /// Loading the part from file
+  virtual void loadPart() = 0;
 };
 
 //! Pointer on feature object
index 63e88207e7b4ea6f170fb8fc4972a07468ef67bd..f2bace9001a72b74e2a6a815b94bc30cecabf4c7 100644 (file)
@@ -46,6 +46,7 @@
 #include <XGUI_DataModel.h>
 #include <XGUI_OperationMgr.h>
 #include <XGUI_ObjectsBrowser.h>
+#include <XGUI_ViewerProxy.h>
 
 #include <Events_Loop.h>
 #include <ModelAPI_Events.h>
@@ -56,6 +57,7 @@
 #include <QAction>
 #include <QMenu>
 #include <QEvent>
+#include <QApplication>
 
 #include <TopoDS.hxx>
 #include <BRep_Tool.hxx>
@@ -104,6 +106,10 @@ void PartSet_MenuMgr::createActions()
   aAction = ModuleBase_Tools::createAction(QIcon(":icons/edit.png"), tr("Edit..."), aParent,
                          this, SLOT(onEdit(bool)));
   myActions["EDIT_CMD"] = aAction;
+
+  aAction = ModuleBase_Tools::createAction(QIcon(":icons/activate.png"), tr("Load all parts"), aParent,
+                        this, SLOT(onActivateAllParts()));
+  myActions["ACTIVATE_ALL_PARTS_CMD"] = aAction;
 }
 
 
@@ -504,6 +510,39 @@ void PartSet_MenuMgr::activatePart(ResultPartPtr thePart) const
   }
 }
 
+void PartSet_MenuMgr::onActivateAllParts()
+{
+  SessionPtr aMgr = ModelAPI_Session::get();
+  if (aMgr->isOperation())
+    return;
+
+  DocumentPtr aDoc = aMgr->moduleDocument();
+  int aNbParts = aDoc->size(ModelAPI_ResultPart::group());
+  bool isActivated = false;
+  QList<ResultPartPtr> aPartsToLoad;
+  for (int i = 0; i < aNbParts; i++) {
+    ObjectPtr aObj = aDoc->object(ModelAPI_ResultPart::group(), i);
+    ResultPartPtr aPartRes = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
+    if (!aPartRes->partDoc().get())
+      aPartsToLoad.append(aPartRes);
+  }
+  if (!aPartsToLoad.isEmpty()) {
+    QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+    aMgr->startOperation("All Parts loading");
+    foreach(ResultPartPtr aPartRes, aPartsToLoad) {
+      aPartRes->loadPart();
+    }
+    aMgr->finishOperation();
+
+    XGUI_Workshop* aWorkshop = myModule->getWorkshop();
+    XGUI_ObjectsBrowser* aObjBrowser = aWorkshop->objectBrowser();
+    aObjBrowser->update();
+    aWorkshop->viewer()->update();
+    aWorkshop->updateCommandStatus();
+    QApplication::restoreOverrideCursor();
+  }
+}
+
 void PartSet_MenuMgr::onActivatePartSet(bool)
 {
   if (myModule->workshop()->currentOperation())
index 1b7bec76196e60ca2ae872f08bf3e8dd0ef143d3..2bea22d23c92e2bf04ae7d4d83a849dd3e5ddbcc 100644 (file)
@@ -100,6 +100,9 @@ private slots:
   /// A slot called on edit of feature
   void onEdit(bool);
 
+  /// Activates all not loaded parts
+  void onActivateAllParts();
+
 protected:
   /// Redefinition of virtual method
   /// \param theObj an object
index 1c8fbfc230c0fd1a3e653447ba0754549d64c8ad..1e8d2882fcf48db61638328c4d42444f4276c735 100644 (file)
@@ -1313,6 +1313,27 @@ void PartSet_Module::onActiveDocPopup(const QPoint& thePnt)
 
   QMenu aMenu;
   aMenu.addAction(aActivatePartAction);
+
+#ifndef HAVE_SALOME
+  if (aMgr->activeDocument() == aMgr->moduleDocument()) {
+    DocumentPtr aDoc = aMgr->moduleDocument();
+    int aNbParts = aDoc->size(ModelAPI_ResultPart::group());
+    bool aHaveToActivate = false;
+    for (int i = 0; i < aNbParts; i++) {
+      ObjectPtr aObj = aDoc->object(ModelAPI_ResultPart::group(), i);
+      ResultPartPtr aPartRes = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
+      if (!aPartRes->partDoc().get()) {
+        aHaveToActivate = true;
+        break;
+      }
+    }
+    if (aHaveToActivate) {
+      QAction* aActivateAllPartAction = myMenuMgr->action("ACTIVATE_ALL_PARTS_CMD");
+      aMenu.addAction(aActivateAllPartAction);
+    }
+  }
+#endif
+
   aMenu.exec(aHeader->mapToGlobal(thePnt));
 }