]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #389 Undo/redo problem on sketch line creation
authornds <natalia.donis@opencascade.com>
Thu, 29 Jan 2015 09:57:51 +0000 (12:57 +0300)
committernds <natalia.donis@opencascade.com>
Thu, 29 Jan 2015 09:57:51 +0000 (12:57 +0300)
The Sketch result was displayed after Redo operation, sub-Sketch feature(line) was not displayed.

src/ModuleBase/ModuleBase_IModule.cpp
src/ModuleBase/ModuleBase_IModule.h
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_Module.h
src/PartSet/PartSet_SketcherMgr.h
src/XGUI/XGUI_Displayer.cpp
src/XGUI/XGUI_Workshop.cpp

index e44ee809d41445db6e624d3b3c6f8ab862377cb4..fd2686df308b3bc672761701127e048f974182b7 100644 (file)
@@ -109,6 +109,11 @@ void ModuleBase_IModule::actionCreated(QAction* theFeature)
   connect(theFeature, SIGNAL(triggered(bool)), this, SLOT(onFeatureTriggered()));
 }
 
+bool ModuleBase_IModule::canDisplayObject(const ObjectPtr& theObject) const
+{
+  ModuleBase_Operation* anOperation = myWorkshop->currentOperation();
+  return anOperation && anOperation->hasObject(theObject);
+}
 
 void ModuleBase_IModule::onFeatureTriggered()
 {
index 29cdc430d099e3f81ecf3258f6c6b681ae90d610..202ad5dd2e67e75dab5814097f567410f991b116 100644 (file)
@@ -87,6 +87,11 @@ class MODULEBASE_EXPORT ModuleBase_IModule : public QObject
   /// It is called as on clearing of property panel as on filling with new widgets\r
   virtual void propertyPanelDefined(ModuleBase_Operation* theOperation) {}\r
 \r
+  /// Returns whether the object can be displayed at the bounds of the active operation.\r
+  /// Display only current operation results\r
+  /// \param theObject a model object\r
+  virtual bool canDisplayObject(const ObjectPtr& theObject) const;\r
+\r
 public slots:\r
   /// Called on call of command corresponded to a feature\r
   void onFeatureTriggered();\r
index 7b14c01d9b544c822a58a49bce6e4c14f710c723..b05715c3847463a83df72c4fdda44ae894ae3c8d 100644 (file)
@@ -187,6 +187,26 @@ void PartSet_Module::operationStopped(ModuleBase_Operation* theOperation)
   myWorkshop->viewer()->removeSelectionFilter(myDocumentShapeFilter);
 }
 
+bool PartSet_Module::canDisplayObject(const ObjectPtr& theObject) const
+{
+  bool aCanDisplay = false;
+  if (mySketchMgr->activeSketch()) {
+    FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
+
+    if (aFeature.get() != NULL) {
+      if (aFeature == mySketchMgr->activeSketch()) {
+        aCanDisplay = false;
+      }
+      else {
+        aCanDisplay = mySketchMgr->sketchOperationIdList().contains(aFeature->getKind().c_str());
+      }
+    }
+  }
+  else {
+    aCanDisplay = ModuleBase_IModule::canDisplayObject(theObject);
+  }
+  return aCanDisplay;
+}
 
 void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation)
 {
index 9723d53e3684b01f6fb42840e34ff0bdcd32c86d..afefc6a0af6e6afccb4c93a763e200103f8f2a83 100644 (file)
@@ -71,6 +71,12 @@ public:
   /// \param theOperation a stopped operation
   virtual void operationStopped(ModuleBase_Operation* theOperation);
 
+  /// Returns whether the object can be displayed at the bounds of the active operation.
+  /// Display only current operation results for usual operation and ask the sketcher manager
+  /// if it is a sketch operation
+  /// \param theObject a model object
+  virtual bool canDisplayObject(const ObjectPtr& theObject) const;
+
 public slots:
   /// SLOT, that is called by no more widget signal emitted by property panel
   /// Set a specific flag to restart the sketcher operation
index 0b79b084e0b18dd31deab0e8e67835c622e0b9a4..8ad6e0be4815a979369ae70d0babe2641f35d429 100644 (file)
@@ -32,6 +32,9 @@ class QMouseEvent;
 
 /**
 * A class for management of sketch operations
+  At the time of the sketcher operation active, only the sketch sub-feature results are
+  displayed in the viewer. After the sketch create/edit operation is finished, the sub-feature
+  are hidden, the sketch feature result is displayed
 */
 class PARTSET_EXPORT PartSet_SketcherMgr : public QObject
 {
index cab65bc08482e14ab69d345d0552761245f01289..b68482a9dfb77b2f0936225be42c61327d596213 100644 (file)
@@ -41,6 +41,7 @@
 
 const int MOUSE_SENSITIVITY_IN_PIXEL = 10;  ///< defines the local context mouse selection sensitivity
 
+//#ifdef DEBUG_DISPLAY
 
 // Workaround for bug #25637
 void displayedObjects(const Handle(AIS_InteractiveContext)& theAIS, AIS_ListOfInteractive& theList)
@@ -85,6 +86,14 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer)
   if (isVisible(theObject)) {
     redisplay(theObject, isUpdateViewer);
   } else {
+#ifdef DEBUG_DISPLAY
+    FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
+    if (aFeature.get() != NULL) {
+      qDebug(QString("display feature: %1, displayed: %2").
+        arg(aFeature->data()->name().c_str()).
+        arg(displayedObjects().size()).toStdString().c_str());
+    }
+#endif
     AISObjectPtr anAIS;
 
     GeomPresentablePtr aPrs = std::dynamic_pointer_cast<GeomAPI_IPresentable>(theObject);
index 7b234a365de7ce5416e7f0a0d24af7a410d6e226..ef5c0de7ca817ca7fb1c7278d9d7ecc5b0a61cc1 100644 (file)
@@ -480,6 +480,7 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptr<ModelAPI_ObjectU
   std::set<ObjectPtr>::const_iterator aIt;
   for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) {
     ObjectPtr aObj = (*aIt);
+
     bool aHide = !aObj->data() || !aObj->data()->isValid();
     if (!aHide) { // check that this is not hidden result
       ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(aObj);
@@ -499,8 +500,7 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptr<ModelAPI_ObjectU
       } else {
         if (myOperationMgr->hasOperation()) {
           ModuleBase_Operation* aOperation = myOperationMgr->currentOperation();
-          // Display only current operation results if operation has preview
-          if (aOperation->hasObject(aObj)/* && aOperation->hasPreview()*/) {
+          if (myModule->canDisplayObject(aObj)) {
             displayObject(aObj);
             // Deactivate object of current operation from selection
             if (myDisplayer->isActive(aObj))
@@ -522,17 +522,15 @@ void XGUI_Workshop::onFeatureCreatedMsg(const std::shared_ptr<ModelAPI_ObjectUpd
   bool aHasPart = false;
   bool isDisplayed = false;
   for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) {
+
     ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(*aIt);
     if (aPart) {
       aHasPart = true;
       // If a feature is created from the aplication's python console  
       // it doesn't stored in the operation mgr and doesn't displayed
-    } else if (myOperationMgr->hasOperation()) {
-      ModuleBase_Operation* aOperation = myOperationMgr->currentOperation();
-      if (aOperation->hasObject(*aIt)) {  // Display only current operation results
-        displayObject(*aIt);
-        isDisplayed = true;
-      }
+    } else if (myModule->canDisplayObject(*aIt)) {
+      displayObject(*aIt);
+      isDisplayed = true;
     }
   }
   if (myObjectBrowser)