]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Merge branch 'master' of newgeom:newgeom.git
authorvsv <vsv@coldrex.nnov.opencascade.com>
Mon, 5 May 2014 14:33:21 +0000 (18:33 +0400)
committervsv <vsv@coldrex.nnov.opencascade.com>
Mon, 5 May 2014 14:33:21 +0000 (18:33 +0400)
src/ModuleBase/ModuleBase_Operation.cpp
src/ModuleBase/ModuleBase_Operation.h
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_Module.h
src/PartSet/PartSet_OperationSketch.cpp
src/PartSet/PartSet_OperationSketch.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..4a0c54e5b08f7bdd36ac9d80ede08c07c5558806 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->getSelectionModes(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 b583c1e808eabb794953ee6385b88525504316fe..ee9334b32fef36b549554bf2fb74239981a5be3b 100644 (file)
@@ -30,12 +30,12 @@ PartSet_OperationSketch::~PartSet_OperationSketch()
 {
 }
 
-int PartSet_OperationSketch::getSelectionMode(boost::shared_ptr<ModelAPI_Feature> theFeature) const
+std::list<int> PartSet_OperationSketch::getSelectionModes(boost::shared_ptr<ModelAPI_Feature> theFeature) const
 {
-  int aMode = TopAbs_FACE;
-  if (isEditMode())
-    aMode = TopAbs_VERTEX;
-  return aMode;
+  std::list<int> aModes;
+  if (!isEditMode())
+    aModes.push_back(TopAbs_FACE);
+  return aModes;
 }
 
 void PartSet_OperationSketch::setSelectedShapes(const NCollection_List<TopoDS_Shape>& theList)
index 7818a67cd185fda6787a82d374e60f017c469c1d..e577962bb957c7cf01bc0f27758db3ed00531540 100644 (file)
@@ -28,7 +28,7 @@ public:
   /// Returns the operation local selection mode
   /// \param theFeature the feature object to get the selection mode
   /// \return the selection mode
-  virtual int getSelectionMode(boost::shared_ptr<ModelAPI_Feature> theFeature) const;
+  virtual std::list<int> getSelectionModes(boost::shared_ptr<ModelAPI_Feature> theFeature) const;
 
   /// Gives the current selected objects to be processed by the operation
   /// \param theList a list of interactive selected shapes
index 6b419b08067d9efb8f8598a94186acb255478597..173851cbc3fe4e336ce0fe0ec26d4233e6bc051e 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
@@ -40,7 +43,7 @@ public:
   /// Returns the operation local selection mode
   /// \param theFeature the feature object to get the selection mode
   /// \return the selection mode
-  virtual int getSelectionMode(boost::shared_ptr<ModelAPI_Feature> theFeature) const = 0;
+  virtual std::list<int> getSelectionModes(boost::shared_ptr<ModelAPI_Feature> theFeature) const = 0;
 
   /// Gives the current selected objects to be processed by the operation
   /// \param theList a list of interactive selected shapes
@@ -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..14e0502b55c57256aba4d5d649c4dbf691a7b9b2 100644 (file)
@@ -37,12 +37,12 @@ bool PartSet_OperationSketchLine::isGranted() const
   return true;
 }
 
-int PartSet_OperationSketchLine::getSelectionMode(boost::shared_ptr<ModelAPI_Feature> theFeature) const
+std::list<int> PartSet_OperationSketchLine::getSelectionModes(boost::shared_ptr<ModelAPI_Feature> theFeature) const
 {
-  int aMode = 0;
+  std::list<int> aModes;
   if (theFeature != feature())
-    aMode = TopAbs_VERTEX;
-  return aMode;
+    aModes.push_back(TopAbs_VERTEX);
+  return aModes;
 }
 
 void PartSet_OperationSketchLine::mouseReleased(const gp_Pnt& thePoint)
@@ -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,30 @@ 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();
+      }
+      else
+        myPointSelectionMode = SM_FirstPoint;
+    }
+    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 +132,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..7883143fabccc098298cfa1bfaf8f4743a5db782 100644 (file)
@@ -34,7 +34,7 @@ public:
   /// Returns the operation local selection mode
   /// \param theFeature the feature object to get the selection mode
   /// \return the selection mode
-  virtual int getSelectionMode(boost::shared_ptr<ModelAPI_Feature> theFeature) const;
+  virtual std::list<int> getSelectionModes(boost::shared_ptr<ModelAPI_Feature> theFeature) const;
 
   /// Gives the current selected objects to be processed by the operation
   /// \param thePoint a point clicked in the viewer
@@ -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..c0a57d545ccabd3b0a81eb15c4f231667ffd3fe1 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 std::list<int>& theModes, const bool isUpdateViewer)
 {
   Handle(AIS_InteractiveContext) aContext = AISContext();
   
@@ -92,49 +93,34 @@ 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, false);
+      ic->Load(anAIS, -1, true/*allow decomposition*/);
+      std::list<int>::const_iterator anIt = theModes.begin(), aLast = theModes.end();
+      for (; anIt != aLast; anIt++) 
+        ic->Activate(anAIS, AIS_Shape::SelectionMode((TopAbs_ShapeEnum)*anIt));
     }
   }
   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..ec9d69649151d811a59b6730610082deec7a2562 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <map>
 #include <vector>
+#include <list>
 
 class XGUI_Viewer;
 class ModelAPI_Feature;
@@ -59,9 +60,9 @@ 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);
+                             const std::list<int>& theMode, const bool isUpdateViewer = true);
 
   /// Erase the feature and a shape.
   /// \param theFeature a feature instance
@@ -73,12 +74,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);