]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
refs #30 - Sketch base GUI: create, draw lines
authornds <natalia.donis@opencascade.com>
Mon, 5 May 2014 11:22:19 +0000 (15:22 +0400)
committernds <natalia.donis@opencascade.com>
Mon, 5 May 2014 11:22:19 +0000 (15:22 +0400)
The "Return", "Escape" buttons processing.

src/ModuleBase/ModuleBase_Operation.cpp
src/ModuleBase/ModuleBase_Operation.h
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_Module.h
src/PartSet/PartSet_OperationSketchBase.h
src/PartSet/PartSet_OperationSketchLine.cpp
src/PartSet/PartSet_OperationSketchLine.h
src/XGUI/XGUI_Displayer.cpp
src/XGUI/XGUI_Displayer.h

index 8c2f4a274f6372e3d2c3739f8e137737b51de1cb..908f2f0c5d11ce91392a4ab8ca94230900d1b49d 100644 (file)
@@ -14,7 +14,6 @@
 #include <ModelAPI_Document.h>
 #include <ModelAPI_Feature.h>
 #include <ModelAPI_Data.h>
-#include <ModelAPI_PluginManager.h>
 #include <ModelAPI_Document.h>
 
 #ifdef _DEBUG
@@ -67,10 +66,7 @@ void ModuleBase_Operation::storeCustomValue()
 
 void ModuleBase_Operation::startOperation()
 {
-  boost::shared_ptr<ModelAPI_Document> aDoc = ModelAPI_PluginManager::get()->rootDocument();
-  myFeature = aDoc->addFeature(getDescription()->operationId().toStdString());
-  if (myFeature) // TODO: generate an error if feature was not created
-    myFeature->execute();
+  createFeature();
   //emit callSlot();
   //commit();
 }
@@ -87,3 +83,11 @@ void ModuleBase_Operation::commitOperation()
 {
   if (myFeature) myFeature->execute();
 }
+
+void ModuleBase_Operation::createFeature()
+{
+  boost::shared_ptr<ModelAPI_Document> aDoc = document();
+  myFeature = aDoc->addFeature(getDescription()->operationId().toStdString());
+  if (myFeature) // TODO: generate an error if feature was not created
+    myFeature->execute();
+}
index c9d7588d55345b3c7b0c97a96d8a8cdc4e71c90a..4632ad455e832f47e6fdc7a2afbb0ef32076b5cb 100644 (file)
@@ -70,6 +70,9 @@ protected:
   /// Virtual method called when operation committed (see commit() method for more description)
   virtual void commitOperation();
 
+  /// Creates a new feature and save it in the operation internal field
+  virtual void createFeature();
+
 private:
   boost::shared_ptr<ModelAPI_Feature> myFeature; /// the operation feature to be handled
 };
index d38cc9f0a59207a7d7dc544b695da693aa6727dc..59cec6d98a237dd4a1ee79ba57814a2b212bff15 100644 (file)
@@ -143,8 +143,8 @@ void PartSet_Module::onOperationStarted()
   if (aPreviewOp) {
     visualizePreview(aPreviewOp->feature(), true);
 
-    connect(aPreviewOp, SIGNAL(featureConstructed(boost::shared_ptr<ModelAPI_Feature>)),
-            this, SLOT(onFeatureConstructed(boost::shared_ptr<ModelAPI_Feature>)));
+    connect(aPreviewOp, SIGNAL(featureConstructed(boost::shared_ptr<ModelAPI_Feature>, int)),
+            this, SLOT(onFeatureConstructed(boost::shared_ptr<ModelAPI_Feature>, int)));
 
     PartSet_OperationSketch* aSketchOp = dynamic_cast<PartSet_OperationSketch*>(aPreviewOp);
     if (aSketchOp) {
@@ -233,9 +233,11 @@ void PartSet_Module::onPlaneSelected(double theX, double theY, double theZ)
   myWorkshop->actionsMgr()->setNestedActionsEnabled(true);
 }
 
-void PartSet_Module::onFeatureConstructed(boost::shared_ptr<ModelAPI_Feature> theFeature)
+void PartSet_Module::onFeatureConstructed(boost::shared_ptr<ModelAPI_Feature> theFeature,
+                                          int theMode)
 {
-  visualizePreview(theFeature, true);
+  bool isDisplay = theMode != PartSet_OperationSketchBase::FM_Abort;
+  visualizePreview(theFeature, isDisplay);
 }
 
 void PartSet_Module::visualizePreview(boost::shared_ptr<ModelAPI_Feature> theFeature, bool isDisplay)
@@ -252,12 +254,12 @@ void PartSet_Module::visualizePreview(boost::shared_ptr<ModelAPI_Feature> theFea
   if (isDisplay) {
     boost::shared_ptr<GeomAPI_Shape> aPreview = aPreviewOp->preview(theFeature);
     if (aPreview) {
-      aDisplayer->DisplayInLocalContext(theFeature, aPreview->impl<TopoDS_Shape>(),
-                                        aPreviewOp->getSelectionMode(theFeature));
+      aDisplayer->RedisplayInLocalContext(theFeature, aPreview->impl<TopoDS_Shape>(),
+                                          aPreviewOp->getSelectionMode(theFeature));
     }
   }
   else {
-    aDisplayer->CloseLocalContexts(false);
+    //aDisplayer->CloseLocalContexts(false);
     aDisplayer->Erase(anOperation->feature());
   }
 }
index a67b8d038633c2ec2d084c0798a160bf91839590..1f3197bd9def09569990acdb8f1b3a39b535dc30 100644 (file)
@@ -71,7 +71,9 @@ public slots:
 
   /// SLOT, to visualize the feature in another local context mode
   /// \param theFeature the feature to be put in another local context mode
-  void onFeatureConstructed(boost::shared_ptr<ModelAPI_Feature> theFeature);
+  /// \param theMode the mode appeared on the feature
+  void onFeatureConstructed(boost::shared_ptr<ModelAPI_Feature> theFeature,
+                            int theMode);
 
 private:
   XGUI_Workshop* myWorkshop;
index 6b419b08067d9efb8f8598a94186acb255478597..0cb2900d77b0af48f9d7cbd75ae9faeb61f73d40 100644 (file)
@@ -25,6 +25,9 @@ class GeomAPI_Shape;
 class PARTSET_EXPORT PartSet_OperationSketchBase : public ModuleBase_Operation
 {
   Q_OBJECT
+public:
+  enum FeatureActionMode { FM_Activation, FM_Deactivation, FM_Abort };
+
 public:
   /// Constructor
   /// \param theId an feature index
@@ -61,7 +64,9 @@ public:
 signals:
   /// Signal about the feature construing is finished
   /// \param theFeature the result feature
-  void featureConstructed(boost::shared_ptr<ModelAPI_Feature> theFeature);
+  /// \param theMode the mode of the feature modification
+  void featureConstructed(boost::shared_ptr<ModelAPI_Feature> theFeature,
+                          int theMode);
 
 public:
   /// temporary code to provide edition mode
index 5bc516c3954a89c2fb15789086d9b229f02a7627..69590f33ae0c2dea94047e9339845d7168d65545 100644 (file)
@@ -88,7 +88,7 @@ void PartSet_OperationSketchLine::mouseMoved(const gp_Pnt& thePoint)
       setLinePoint(aPrevFeature, LINE_ATTR_END, LINE_ATTR_START);
       myPointSelectionMode = SM_SecondPoint;
 
-      emit featureConstructed(aPrevFeature);
+      emit featureConstructed(aPrevFeature, FM_Deactivation);
     }
     break;
     default:
@@ -99,27 +99,28 @@ void PartSet_OperationSketchLine::mouseMoved(const gp_Pnt& thePoint)
 void PartSet_OperationSketchLine::keyReleased(const int theKey)
 {
   switch (theKey) {
-    case Qt::Key_Escape:
+    case Qt::Key_Escape: {
+      if (myPointSelectionMode != SM_None)
+        emit featureConstructed(feature(), FM_Abort);
       abort();
-      break;
-    case Qt::Key_Enter:
-      //myPointSelectionMode = myPointSelectionMode;
-      break;
+    }
+    break;
+    case Qt::Key_Return: {
+      if (myPointSelectionMode != SM_None) {
+        emit featureConstructed(feature(), FM_Abort);
+        myPointSelectionMode = SM_FirstPoint;
+        document()->abortOperation();
+      }
+    }
+    break;
     default:
-      break;
+    break;
   }
 }
 
 void PartSet_OperationSketchLine::startOperation()
 {
   PartSet_OperationSketchBase::startOperation();
-
-  if (mySketch) {
-    boost::shared_ptr<SketchPlugin_Feature> aFeature = 
-                           boost::dynamic_pointer_cast<SketchPlugin_Feature>(mySketch);
-
-    aFeature->addSub(feature());
-  }
   myPointSelectionMode = SM_FirstPoint;
 }
 
@@ -129,6 +130,18 @@ void PartSet_OperationSketchLine::stopOperation()
   myPointSelectionMode = SM_None;
 }
 
+void PartSet_OperationSketchLine::createFeature()
+{
+  PartSet_OperationSketchBase::createFeature();
+  if (mySketch) {
+    boost::shared_ptr<SketchPlugin_Feature> aFeature = 
+                           boost::dynamic_pointer_cast<SketchPlugin_Feature>(mySketch);
+
+    aFeature->addSub(feature());
+  }
+  //emit featureConstructed(aPrevFeature, FM_Activation);
+}
+
 void PartSet_OperationSketchLine::setLinePoint(const gp_Pnt& thePoint,
                                                const std::string& theAttribute)
 {
index 86b1eacebc7cb3b9cb6b2a9a20bb728915543dda..939cdef7f4d2328295835471b80d74c6d040ae34 100644 (file)
@@ -65,6 +65,10 @@ protected:
   /// After the parent operation body perform, reset selection point mode of the operation
   virtual void stopOperation();
 
+  /// Creates a new feature and save it in the operation internal field.
+  /// In addition to the default realization it set a sketch feature to the created feature
+  virtual void createFeature();
+
 protected:
   /// \brief Save the point to the line.
   /// \param thePoint the 3D point in the viewer
index dcfe8385d5091aa11ab59381cb771327fc27a439..8d7b6ef9d8b41f59e0cbbc8449dc515a609377b7 100644 (file)
@@ -70,14 +70,15 @@ void XGUI_Displayer::Erase(boost::shared_ptr<ModelAPI_Feature> theFeature,
       continue;
       aContext->Erase(anAISShape);
   }
+  myFeature2AISObjectMap.erase(theFeature);
 
   if (isUpdateViewer)
     aContext->UpdateCurrentViewer();
 }
 
-void XGUI_Displayer::DisplayInLocalContext(boost::shared_ptr<ModelAPI_Feature> theFeature,
-                                           const TopoDS_Shape& theShape,
-                                           const int theMode, const bool isUpdateViewer)
+void XGUI_Displayer::RedisplayInLocalContext(boost::shared_ptr<ModelAPI_Feature> theFeature,
+                                             const TopoDS_Shape& theShape,
+                                             const int theMode, const bool isUpdateViewer)
 {
   Handle(AIS_InteractiveContext) aContext = AISContext();
   
@@ -92,49 +93,35 @@ void XGUI_Displayer::DisplayInLocalContext(boost::shared_ptr<ModelAPI_Feature> t
   }
   aDispAIS.push_back(anAIS);
   myFeature2AISObjectMap[theFeature] = aDispAIS;
-  aContext->Display(anAIS, Standard_False);
-
-  AIS_ListOfInteractive anAISList;
-  anAISList.Append(anAIS);
-  activateInLocalContext(anAISList, theMode, true);
-}
-
-void XGUI_Displayer::CloseLocalContexts(const bool isUpdateViewer)
-{
-  closeAllContexts(true);
-}
 
-void XGUI_Displayer::activateInLocalContext(const AIS_ListOfInteractive& theAISObjects, const int theMode,
-                                            const bool isUpdateViewer)
-{
   Handle(AIS_InteractiveContext) ic = AISContext();
 
   // Open local context if there is no one
-  bool allObjects = false; // calculate by AIS shape
   if (!ic->HasOpenedContext()) {
     ic->ClearCurrents(false);
-    ic->OpenLocalContext(allObjects, true, true);
+    ic->OpenLocalContext(false/*use displayed objects*/, /*true*/false/*use displayed objects*/,
+                         true/*allow shape decomposition*/);
   }
-
   // Activate selection of objects from prs
-  AIS_ListIteratorOfListOfInteractive aIter(theAISObjects);
-  for (; aIter.More(); aIter.Next()) {
-    Handle(AIS_InteractiveObject) anAIS = aIter.Value();
-    if (!anAIS.IsNull()) {
-      if (anAIS->IsKind(STANDARD_TYPE(AIS_Shape))) {
-        ic->Load(anAIS, -1, false);
-        ic->Activate(anAIS, AIS_Shape::SelectionMode((TopAbs_ShapeEnum)theMode));
-      }
-      else if (anAIS->DynamicType() != STANDARD_TYPE(AIS_Trihedron)) {
-        ic->Load(anAIS, -1, false);
-        ic->Activate(anAIS, theMode);
-      }
+  if (!anAIS.IsNull()) {
+    if (anAIS->IsKind(STANDARD_TYPE(AIS_Shape))) {
+      ic->Display(anAIS, 0/*display mode*/, AIS_Shape::SelectionMode((TopAbs_ShapeEnum)theMode),
+                  false/*update viewer*/, true/*allow decomposition*/);
+      /*if (theMode == TopAbs_VERTEX) {
+        ic->ActivateStandardMode(TopAbs_EDGE);
+        ic->ActivateStandardMode(TopAbs_VERTEX);
+      }*/
     }
   }
   if (isUpdateViewer)
     ic->UpdateCurrentViewer();
 }
 
+void XGUI_Displayer::CloseLocalContexts(const bool isUpdateViewer)
+{
+  closeAllContexts(true);
+}
+
 void XGUI_Displayer::closeAllContexts(const bool isUpdateViewer)
 {
   Handle(AIS_InteractiveContext) ic = AISContext();
index 9299a81983f19bfa01e4d9434daaded33b102cf2..3ca9b964cca77c971ebcf291c7034fe9f5e27969 100644 (file)
@@ -59,7 +59,7 @@ public:
   /// \param theShape a shape
   /// \param theMode a local selection mode
   /// \param isUpdateViewer the parameter whether the viewer should be update immediatelly
-  void DisplayInLocalContext(boost::shared_ptr<ModelAPI_Feature> theFeature,
+  void RedisplayInLocalContext(boost::shared_ptr<ModelAPI_Feature> theFeature,
                              const TopoDS_Shape& theShape,
                              const int theMode, const bool isUpdateViewer = true);
 
@@ -73,12 +73,6 @@ public:
   void CloseLocalContexts(const bool isUpdateViewer = true);
 
 protected:
-  /// Activate local selection
-  /// \param theAIS the list of objects
-  /// \param theMode the selection mode
-  /// \param isUpdateViewer the state wether the viewer should be updated immediatelly
-  void activateInLocalContext(const AIS_ListOfInteractive& theAISObjects, const int theMode,
-                              const bool isUpdateViewer);
   /// Deactivate local selection
   /// \param isUpdateViewer the state wether the viewer should be updated immediatelly
   void closeAllContexts(const bool isUpdateViewer);