]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #101: Fixed editing of nested features
authorvsv <vitaly.smetannikov@opencascade.com>
Mon, 1 Sep 2014 13:52:34 +0000 (17:52 +0400)
committervsv <vitaly.smetannikov@opencascade.com>
Mon, 1 Sep 2014 13:52:34 +0000 (17:52 +0400)
14 files changed:
src/Config/Config_FeatureMessage.h
src/ModuleBase/ModuleBase_IOperation.cpp
src/ModuleBase/ModuleBase_IOperation.h
src/PartSet/PartSet_OperationFeatureCreate.cpp
src/PartSet/PartSet_OperationFeatureCreate.h
src/PartSet/PartSet_OperationFeatureEdit.cpp
src/PartSet/PartSet_OperationFeatureEdit.h
src/PartSet/PartSet_OperationFeatureEditMulti.cpp
src/PartSet/PartSet_OperationFeatureEditMulti.h
src/PartSet/PartSet_OperationSketch.cpp
src/PartSet/PartSet_OperationSketch.h
src/XGUI/XGUI_Displayer.cpp
src/XGUI/XGUI_OperationMgr.cpp
src/XGUI/XGUI_Workshop.cpp

index 4c32b0b8639f666c2bb287e2ac4ba68581ef77c0..be79646a93eec09996e1d0cbfb872e6aeea15c15 100644 (file)
@@ -48,4 +48,4 @@ class Config_FeatureMessage : public Events_Message
       bool isInternal);\r
 };\r
 \r
-#endif // CONFIG_MESSAGE_H\r
\ No newline at end of file
+#endif // CONFIG_MESSAGE_H\r
index f8aacb9c18e37adf10b8aef650a1741f13b4eca7..e873562e5c4fc930f423a112c082e22aadd9c56f 100644 (file)
@@ -39,11 +39,6 @@ bool ModuleBase_IOperation::canBeCommitted() const
   return true;
 }
 
-bool ModuleBase_IOperation::isGranted(ModuleBase_IOperation* /*theOperation*/) const
-{
-  return false;
-}
-
 /*void ModuleBase_IOperation::setModelWidgets(const std::string& theXmlRepresentation,
  QList<ModuleBase_ModelWidget*> theWidgets)
  {
index 8d738763e0ae598d39e412c9ea1f779462232112..28822efa51b9cda21a4ed3a221641271020d7c69 100644 (file)
@@ -13,6 +13,7 @@
 #include <QObject>
 #include <QString>
 #include <QList>
+#include <QStringList>
 
 #include <boost/shared_ptr.hpp>
 
@@ -56,14 +57,20 @@ Q_OBJECT
   /// /returns the instance of the description class
   ModuleBase_OperationDescription* getDescription() const;
 
-  /// Verifies whether this operator can be always started above any already running one
-  /// \return Returns TRUE if current operation must not be checked for ActiveOperation->IsValid( this )
-  /// This method must be redefined in derived operation if operation of derived class
-  /// must be always can start above any launched one. Default impl returns FALSE,
-  /// so it is being checked for IsValid, but some operations may overload IsGranted()
-  /// In this case they will always start, no matter what operation is running.
-  /// \param theOperation the previous running operation
-  virtual bool isGranted(ModuleBase_IOperation* theOperation) const;
+  /**
+  * Must return true if this operation can be launched as nested for any current operation
+  * and it is not necessary to check this operation on validity. By default 
+  * the operation is not granted.
+  * The method has to be redefined for granted operations.
+  */
+  virtual bool isGranted() const  { return false; }
+
+  /**
+  * Must return True if the given opertation can be launched as nested to current one.
+  * By default it returns false and it has to be redefined for operations which expect
+  * launching of nested operations
+  */
+  virtual bool isValid(ModuleBase_IOperation* theOperation) const { return false; }
 
   /// Sets a list of model widgets, according to the operation feature xml definition
   /// \param theXmlRepresentation an xml feature definition
@@ -83,6 +90,12 @@ Q_OBJECT
     return myIsEditing;
   }
 
+  /// Returns list of nested features
+  QStringList nestedFeatures() const { return myNestedFeatures; }
+
+  /// Sets list of nested features
+  void setNestedFeatures(const QStringList& theList) { myNestedFeatures = theList; }
+
 signals:
   void started();  /// the operation is started
   void aborted();  /// the operation is aborted
@@ -157,6 +170,8 @@ signals:
 
  private:
   ModuleBase_OperationDescription* myDescription;  /// the container to have the operation description
+
+  QStringList myNestedFeatures;
 };
 
 #endif
index a673476898429619f4a57143cfcf2f10287415ad..6a405901a8ae558c41676590daa307bede32c862 100644 (file)
@@ -73,12 +73,6 @@ bool PartSet_OperationFeatureCreate::canBeCommitted() const
   return false;
 }
 
-bool PartSet_OperationFeatureCreate::isGranted(ModuleBase_IOperation* theOperation) const
-{
-  return theOperation->getDescription()->operationId().toStdString()
-      == PartSet_OperationSketch::Type();
-}
-
 std::list<int> PartSet_OperationFeatureCreate::getSelectionModes(ObjectPtr theFeature) const
 {
   std::list<int> aModes;
index cedf301a76eb51b4aa8b1b8ed9abc058e95d57e9..a6e3aa8771c80fc2691f4da2440609eaa8f2d944 100644 (file)
@@ -39,11 +39,6 @@ Q_OBJECT
   /// Destructor
   virtual ~PartSet_OperationFeatureCreate();
 
-  /// Returns that this operator can be started above already running one.
-  /// The runned operation should be the sketch feature modified operation
-  /// \param theOperation the previous running operation
-  virtual bool isGranted(ModuleBase_IOperation* theOperation) const;
-
   /// Returns the operation local selection mode
   /// \param theFeature the feature object to get the selection mode
   /// \return the selection mode
index b1752472582bc3851b56da996d92d26bb0a99fce..4d3edb9e917ea7362bed23aa90faa4e73151ff67 100644 (file)
@@ -49,12 +49,6 @@ PartSet_OperationFeatureEdit::~PartSet_OperationFeatureEdit()
 {
 }
 
-bool PartSet_OperationFeatureEdit::isGranted(ModuleBase_IOperation* theOperation) const
-{
-  return theOperation->getDescription()->operationId().toStdString()
-      == PartSet_OperationSketch::Type();
-}
-
 std::list<int> PartSet_OperationFeatureEdit::getSelectionModes(ObjectPtr theFeature) const
 {
   return PartSet_OperationSketchBase::getSelectionModes(theFeature);
index eadd73f10f9802aa3260ae61b7863bbcd9441815..3d73b3bd388ce8600be5b417edfafd0093dc72d6 100644 (file)
@@ -69,11 +69,6 @@ Q_OBJECT
   /// Destructor
   virtual ~PartSet_OperationFeatureEdit();
 
-  /// Returns that this operator can be started above already running one.
-  /// The runned operation should be the sketch feature modified operation
-  /// \param theOperation the previous running operation
-  virtual bool isGranted(ModuleBase_IOperation* theOperation) const;
-
   /// Returns the operation local selection mode
   /// \param theFeature the feature object to get the selection mode
   /// \return the selection mode
index 0c4a71697d6aca7e5234d1a919a76a8d563e668f..cd0de892541cc01ab7374816c9431d9f165cf55a 100644 (file)
@@ -45,11 +45,6 @@ PartSet_OperationFeatureEditMulti::~PartSet_OperationFeatureEditMulti()
 {
 }
 
-bool PartSet_OperationFeatureEditMulti::isGranted(ModuleBase_IOperation* theOperation) const
-{
-  return theOperation->getDescription()->operationId().toStdString()
-      == PartSet_OperationSketch::Type();
-}
 
 void PartSet_OperationFeatureEditMulti::initSelection(
     const std::list<ModuleBase_ViewerPrs>& theSelected,
index f49d0480bcbcb2763f060373759526ca4db50c5e..0f21f34ab0dd099c7b432dde41526778fc3919b8 100644 (file)
@@ -70,11 +70,6 @@ Q_OBJECT
   /// Destructor
   virtual ~PartSet_OperationFeatureEditMulti();
 
-  /// Returns that this operator can be started above already running one.
-  /// The runned operation should be the sketch feature modified operation
-  /// \param theOperation the previous running operation
-  virtual bool isGranted(ModuleBase_IOperation* theOperation) const;
-
   /// Initializes the operation with previously created feature. It is used in sequental operations
   virtual void initFeature(FeaturePtr theFeature);
 
index 4ff87cae1414d760c31a3e2f7bcddacf5b8df636..ece230157c94da4da77546438e8eab2b52385497 100644 (file)
@@ -113,9 +113,16 @@ void PartSet_OperationSketch::mouseReleased(QMouseEvent* theEvent, Handle_V3d_Vi
     /// It is empty and we have to use the process mouse release to start edition operation
     /// for these objects
     if (theSelected.size() == 1) {
-      ObjectPtr aFeature = theSelected.front().object();
-      if (aFeature)
-        restartOperation(PartSet_OperationFeatureEdit::Type(), aFeature);
+      ObjectPtr aObject = theSelected.front().object();
+      if (aObject) {
+        FeaturePtr aFeature = ModelAPI_Feature::feature(aObject);
+        if (aFeature) {
+          QStringList aNested = this->nestedFeatures();
+          if ((!aNested.isEmpty()) && aNested.contains(QString(aFeature->getKind().c_str()))) {
+            restartOperation(PartSet_OperationFeatureEdit::Type(), aObject);
+          }
+        }
+      }
     }
   }
 }
@@ -250,3 +257,10 @@ void PartSet_OperationSketch::setSketchPlane(const TopoDS_Shape& theShape)
   emit closeLocalContext();
   emit planeSelected(aDir->x(), aDir->y(), aDir->z());
 }
+
+
+bool PartSet_OperationSketch::isValid(ModuleBase_IOperation* theOperation) const
+{
+  PartSet_OperationSketchBase* aPreviewOp = dynamic_cast<PartSet_OperationSketchBase*>(theOperation);
+  return aPreviewOp != NULL;
+}
\ No newline at end of file
index 04604ef0cce20d7856488eb80e51c3df5617b2cf..cc11518779a435404e7f152dbb846b0ab72f21bc 100644 (file)
@@ -37,6 +37,10 @@ Q_OBJECT
   /// Destructor
   virtual ~PartSet_OperationSketch();
 
+  /// Returns True if the given operation is a Sketcher operation
+  virtual bool isValid(ModuleBase_IOperation* theOperation) const;
+
+
   /// Returns the operation local selection mode
   /// \param theFeature the feature object to get the selection mode
   /// \return the selection mode
index 57befeb24cb8958c3aac8acd0b1f935a1452cf8d..7d397b1960925b772b7f6357634e2982db1d1c58 100644 (file)
@@ -170,7 +170,16 @@ void XGUI_Displayer::activateInLocalContext(ObjectPtr theResult, const std::list
   if (!aContext->HasOpenedContext()) {
     aContext->ClearCurrents(false);
     aContext->OpenLocalContext(false/*use displayed objects*/, true/*allow shape decomposition*/);
+    //aContext->OpenLocalContext();
+    //aContext->NotUseDisplayedObjects();
   }
+  //!!! Test
+  //aContext->UseDisplayedObjects();
+  //std::list<int>::const_iterator anIt = theModes.begin(), aLast = theModes.end();
+  //for (; anIt != aLast; anIt++) {
+  //  aContext->ActivateStandardMode((TopAbs_ShapeEnum)(*anIt));
+  //}
+  //!!! Test end
   // display or redisplay presentation
   Handle(AIS_InteractiveObject) anAIS;
   if (isVisible(theResult)) {
index 4a93b9d47c770272bb5eb4a3c35c3e06e9369460..e6855819a4a9853dc5f9062215183edd0296a8a8 100644 (file)
@@ -133,11 +133,15 @@ bool XGUI_OperationMgr::canStartOperation(ModuleBase_Operation* theOperation)
 {
   bool aCanStart = true;
   ModuleBase_Operation* aCurrentOp = currentOperation();
-  if (aCurrentOp && !theOperation->isGranted(aCurrentOp)) {
-    if (canStopOperation()) {
-      aCurrentOp->abort();
-    } else {
-      aCanStart = false;
+  if (aCurrentOp) {
+    if (!theOperation->isGranted()) {
+      if (!aCurrentOp->isValid(theOperation)) {
+        if (canStopOperation()) {
+          aCurrentOp->abort();
+        } else {
+          aCanStart = false;
+        }
+      }
     }
   }
   return aCanStart;
index ad35f6f8106b90f4139421454325e3c0c9a470e8..d91f4d98e759ccfa0493909f562e566e544df7f3 100644 (file)
@@ -395,6 +395,7 @@ void XGUI_Workshop::onObjectDeletedMsg(const ModelAPI_ObjectDeletedMessage* theM
 void XGUI_Workshop::onOperationStarted()
 {
   ModuleBase_Operation* aOperation = myOperationMgr->currentOperation();
+  aOperation->setNestedFeatures(myActionsMgr->nestedCommands(aOperation->id()));
 
   if (aOperation->getDescription()->hasXmlRepresentation()) {  //!< No need for property panel
     connectWithOperation(aOperation);