]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Create check box "Show constraints"
authorvsv <vitaly.smetannikov@opencascade.com>
Tue, 31 Mar 2015 16:05:03 +0000 (19:05 +0300)
committervsv <vitaly.smetannikov@opencascade.com>
Tue, 31 Mar 2015 16:05:03 +0000 (19:05 +0300)
16 files changed:
src/ModuleBase/ModuleBase_IWorkshop.h
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_SketcherMgr.cpp
src/PartSet/PartSet_SketcherMgr.h
src/PartSet/PartSet_WidgetSketchLabel.cpp
src/PartSet/PartSet_WidgetSketchLabel.h
src/SketcherPrs/SketcherPrs_LengthDimension.cpp
src/SketcherPrs/SketcherPrs_PositionMgr.cpp
src/SketcherPrs/SketcherPrs_PositionMgr.h
src/SketcherPrs/SketcherPrs_Radius.cpp
src/SketcherPrs/SketcherPrs_SymbolPrs.cpp
src/SketcherPrs/SketcherPrs_SymbolPrs.h
src/SketcherPrs/SketcherPrs_Tools.cpp
src/SketcherPrs/SketcherPrs_Tools.h
src/XGUI/XGUI_ModuleConnector.cpp
src/XGUI/XGUI_ModuleConnector.h

index 3646e630c95b18ae5e879150aef6a28f1c18ab98..87da9de589b76ae6357534a30311acb75bb9ca89 100644 (file)
@@ -19,6 +19,7 @@
 class ModuleBase_IModule;
 class ModuleBase_ISelection;
 class ModuleBase_IViewer;
+class ModuleBase_IPropertyPanel;
 class ModuleBase_Operation;
 class ModuleBase_FilterFactory;
 
@@ -53,6 +54,9 @@ Q_OBJECT
   //! Returns current viewer
   virtual ModuleBase_IViewer* viewer() const = 0;
 
+  //! Returns property panel
+  virtual ModuleBase_IPropertyPanel* propertyPanel() const = 0;
+
   /// A filter to process an attribute validators
   /// \return a filter
   Handle(ModuleBase_FilterValidated) validatorFilter();
index 3603d3cd09a53c98ba45dc0944647cc225f0dd7b..0fb0094978c30595b4ab7fc4efca8efb54ce5e9a 100644 (file)
@@ -467,10 +467,13 @@ ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& th
   XGUI_Workshop* aWorkshop = aConnector->workshop();
   ModuleBase_ModelWidget* aWgt = NULL;
   if (theType == "sketch-start-label") {
-    PartSet_WidgetSketchLabel* aLabelWgt = new PartSet_WidgetSketchLabel(theParent, theWidgetApi, theParentId);
+    PartSet_WidgetSketchLabel* aLabelWgt = new PartSet_WidgetSketchLabel(theParent, 
+      theWidgetApi, theParentId, mySketchMgr->isConstraintsShown());
     aLabelWgt->setWorkshop(aWorkshop);
     connect(aLabelWgt, SIGNAL(planeSelected(const std::shared_ptr<GeomAPI_Pln>&)),
       mySketchMgr, SLOT(onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>&)));
+    connect(aLabelWgt, SIGNAL(showConstraintToggled(bool)),
+      mySketchMgr, SLOT(onShowConstraintsToggle(bool)));
     aWgt = aLabelWgt;
   } else if (theType == "sketch-2dpoint_selector") {
     PartSet_WidgetPoint2D* aPointWgt = new PartSet_WidgetPoint2D(theParent, theWidgetApi, theParentId);
@@ -672,7 +675,7 @@ void PartSet_Module::onViewTransformed(int theTrsfType)
   XGUI_Displayer* aDisplayer = aWorkshop->displayer();
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
 
-  double aLen = aView->Convert(25);
+  double aLen = aView->Convert(15);
 
   SketcherPrs_Tools::setArrowSize(aLen);
   bool isModified = false;
index 6a8c084db84ed0be24b157c488aaa3546e502622..10a008fee15c704a0984a6c693dbbedf449301ed 100644 (file)
@@ -9,6 +9,7 @@
 #include "PartSet_WidgetPoint2d.h"
 #include "PartSet_WidgetPoint2dDistance.h"
 #include "PartSet_Tools.h"
+#include "PartSet_WidgetSketchLabel.h"
 
 #include <ModuleBase_WidgetEditor.h>
 
@@ -53,6 +54,8 @@
 #include <SketchPlugin_ConstraintEqual.h>
 #include <SketchPlugin_ConstraintTangent.h>
 #include <SketchPlugin_ConstraintCoincidence.h>
+#include <SketchPlugin_ConstraintFillet.h>
+#include <SketchPlugin_ConstraintMirror.h>
 
 #include <SelectMgr_IndexedMapOfOwner.hxx>
 #include <StdSelect_BRepOwner.hxx>
@@ -122,7 +125,7 @@ PartSet_SketcherMgr::PartSet_SketcherMgr(PartSet_Module* theModule)
   : QObject(theModule), myModule(theModule), myIsDragging(false), myDragDone(false),
     myIsPropertyPanelValueChanged(false), myIsMouseOverWindow(false),
     myIsMouseOverViewProcessed(true), myPreviousUpdateViewerEnabled(true),
-    myIsPopupMenuActive(false)
+    myIsPopupMenuActive(false), myIsConstraintsShown(true)
 {
   ModuleBase_IWorkshop* anIWorkshop = myModule->workshop();
   ModuleBase_IViewer* aViewer = anIWorkshop->viewer();
@@ -572,7 +575,7 @@ void PartSet_SketcherMgr::launchEditing()
 }
 
 
-QStringList PartSet_SketcherMgr::sketchOperationIdList()
+const QStringList& PartSet_SketcherMgr::sketchOperationIdList()
 {
   static QStringList aIds;
   if (aIds.size() == 0) {
@@ -591,10 +594,33 @@ QStringList PartSet_SketcherMgr::sketchOperationIdList()
     aIds << SketchPlugin_ConstraintEqual::ID().c_str();
     aIds << SketchPlugin_ConstraintTangent::ID().c_str();
     aIds << SketchPlugin_ConstraintCoincidence::ID().c_str();
+    aIds << SketchPlugin_ConstraintFillet::ID().c_str();
+    aIds << SketchPlugin_ConstraintMirror::ID().c_str();
   }
   return aIds;
 }
 
+const QStringList& PartSet_SketcherMgr::constraintsIdList()
+{
+  static QStringList aIds;
+  if (aIds.size() == 0) {
+    aIds << SketchPlugin_ConstraintLength::ID().c_str();
+    aIds << SketchPlugin_ConstraintDistance::ID().c_str();
+    aIds << SketchPlugin_ConstraintRigid::ID().c_str();
+    aIds << SketchPlugin_ConstraintRadius::ID().c_str();
+    aIds << SketchPlugin_ConstraintPerpendicular::ID().c_str();
+    aIds << SketchPlugin_ConstraintParallel::ID().c_str();
+    aIds << SketchPlugin_ConstraintHorizontal::ID().c_str();
+    aIds << SketchPlugin_ConstraintVertical::ID().c_str();
+    aIds << SketchPlugin_ConstraintEqual::ID().c_str();
+    aIds << SketchPlugin_ConstraintTangent::ID().c_str();
+    aIds << SketchPlugin_ConstraintCoincidence::ID().c_str();
+    aIds << SketchPlugin_ConstraintMirror::ID().c_str();
+  }
+  return aIds;
+}
+
+
 bool PartSet_SketcherMgr::isSketchOperation(ModuleBase_Operation* theOperation)
 {
   return theOperation && theOperation->id().toStdString() == SketchPlugin_Sketch::ID();
@@ -719,7 +745,7 @@ void PartSet_SketcherMgr::startNestedSketch(ModuleBase_Operation* )
   connectToPropertyPanel(true);
 }
 
-void PartSet_SketcherMgr::stopNestedSketch(ModuleBase_Operation* theOperation)
+void PartSet_SketcherMgr::stopNestedSketch(ModuleBase_Operation* theOp)
 {
   connectToPropertyPanel(false);
   myIsPropertyPanelValueChanged = false;
@@ -730,6 +756,11 @@ void PartSet_SketcherMgr::commitNestedSketch(ModuleBase_Operation* theOperation)
 {
   if (isNestedCreateOperation(theOperation))
     visualizeFeature(theOperation, true);
+
+  if (constraintsIdList().contains(theOperation->id())) {
+    // Show constraints if a constraint was created
+    onShowConstraintsToggle(true);
+  }
 }
 
 bool PartSet_SketcherMgr::canUndo() const
@@ -1127,3 +1158,29 @@ void PartSet_SketcherMgr::restoreSelection()
     aConnector->workshop()->selector()->setSelectedOwners(anOwnersToSelect, false);
   }
 }
+
+void PartSet_SketcherMgr::onShowConstraintsToggle(bool theOn)
+{
+  if (myIsConstraintsShown == theOn)
+    return;
+  if (myCurrentSketch.get() == NULL)
+    return;
+
+  myIsConstraintsShown = theOn;
+
+  ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
+  XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(aWorkshop);
+  XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
+
+  const QStringList& aConstrIds = constraintsIdList();
+  for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
+    FeaturePtr aSubFeature = myCurrentSketch->subFeature(i);
+    if (aConstrIds.contains(QString(aSubFeature->getKind().c_str()))) {
+      if (myIsConstraintsShown) 
+        aDisplayer->display(aSubFeature, false);
+      else
+        aDisplayer->erase(aSubFeature, false);
+    }
+  }
+  aDisplayer->updateViewer();
+}
index dc68f283a36eae66389493b656241dca053e7876..aad09ef0fda92803c1694ca56c514e79711aad5b 100644 (file)
@@ -146,6 +146,16 @@ public:
   /// \param isChecked if true, the feature is a construction
   void setAuxiliary(const bool isChecked);
 
+
+  bool isConstraintsShown() const { return myIsConstraintsShown; }
+
+
+  /// Returns list of strings which contains id's of sketch operations
+  static const QStringList& sketchOperationIdList();
+
+  /// Returns list of strings which contains id's of constraints operations
+  static const QStringList& constraintsIdList();
+
 public slots:
   /// Process sketch plane selected event
   void onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>& thePln);
@@ -174,13 +184,12 @@ private slots:
   void onBeforeContextMenu();
   void onAfterContextMenu();
 
+  void onShowConstraintsToggle(bool);
+
 private:
   /// Launches the operation from current highlighting
   void launchEditing();
 
-  /// Returns list of strings which contains id's of sketch operations
-  static QStringList sketchOperationIdList();
-
   /// Converts mouse position to 2d coordinates. 
   /// Member myCurrentSketch has to be correctly defined
   void get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent, 
@@ -263,6 +272,8 @@ private:
   Handle(ModuleBase_ShapeInPlaneFilter) myPlaneFilter;
   FeatureToSelectionMap myCurrentSelection;
   bool myPreviousUpdateViewerEnabled;
+
+  bool myIsConstraintsShown;
 };
 
 
index e70a8a0975dedcdab221a48d4d8c8ad9fae1e85f..1b645c062821a47d4190355106ae8cb9fa8989a1 100644 (file)
 #include <QTimer>
 #include <QApplication>
 #include <QVBoxLayout>
+#include <QCheckBox>
 
 
 PartSet_WidgetSketchLabel::PartSet_WidgetSketchLabel(QWidget* theParent,
                                                      const Config_WidgetAPI* theData,
-                                                     const std::string& theParentId)
+                                                     const std::string& theParentId,
+                                                     bool toShowConstraints)
     : ModuleBase_WidgetValidated(theParent, theData, theParentId),
       myPreviewDisplayed(false),
       myWorkshop(NULL)
@@ -65,7 +67,13 @@ PartSet_WidgetSketchLabel::PartSet_WidgetSketchLabel(QWidget* theParent,
   QVBoxLayout* aLayout = new QVBoxLayout(this);
   ModuleBase_Tools::zeroMargins(aLayout);
   aLayout->addWidget(myLabel);
+
+  myShowConstraints = new QCheckBox(tr("Show constraints"), this);
+  aLayout->addWidget(myShowConstraints);
+
   setLayout(aLayout);
+  connect(myShowConstraints, SIGNAL(toggled(bool)), this, SIGNAL(showConstraintToggled(bool)));
+  myShowConstraints->setChecked(toShowConstraints);
 }
 
 PartSet_WidgetSketchLabel::~PartSet_WidgetSketchLabel()
@@ -359,3 +367,9 @@ void PartSet_WidgetSketchLabel::setSketchingMode()
 
   aDisp->activateObjects(aModes);
 }
+
+void PartSet_WidgetSketchLabel::showConstraints(bool theOn)
+{
+  myShowConstraints->setChecked(theOn);
+  emit showConstraintToggled(theOn);
+}
index a0a069f785d1248ddd8ae637da275c02dfb82904..0b26103a47bed65f9be334dd6d73b852dfe33b71 100644 (file)
@@ -22,6 +22,7 @@ class QLabel;
 class QTimer;
 class XGUI_OperationMgr;
 class XGUI_Workshop;
+class QCheckBox;
 
 /// the plane edge width
 #define SKETCH_WIDTH        "4"
@@ -43,7 +44,7 @@ Q_OBJECT
   /// \param theData the widget configuation. The attribute of the model widget is obtained from
   /// \param theParentId is Id of a parent of the current attribute
   PartSet_WidgetSketchLabel(QWidget* theParent, const Config_WidgetAPI* theData,
-                            const std::string& theParentId);
+                            const std::string& theParentId, bool toShowConstraints);
 
   virtual ~PartSet_WidgetSketchLabel();
 
@@ -74,10 +75,14 @@ Q_OBJECT
   virtual void setHighlighted(bool) { /*do nothing*/ };
   virtual void enableFocusProcessing();
 
+  void showConstraints(bool theOn);
+
 signals:
   /// Signal on plane selection
   void planeSelected(const std::shared_ptr<GeomAPI_Pln>& thePln);
 
+  void showConstraintToggled(bool);
+
 protected:
   /// Creates a backup of the current values of the attribute
   /// It should be realized in the specific widget because of different
@@ -143,6 +148,8 @@ protected:
   bool myPreviewDisplayed;
 
   QTimer* mySelectionTimer;
+
+  QCheckBox* myShowConstraints;
 };
 
 #endif
index f3220e6b6d1174476a5a4d6b1fb250ecce1bc489..65b067782dcf50b1a9e48efc7241a5c66b3b5ea8 100644 (file)
@@ -27,8 +27,6 @@ static const gp_Pnt MyDefStart(0,0,0);
 static const gp_Pnt MyDefEnd(1,0,0);
 static const gp_Pln MyDefPln(gp_Pnt(0,0,0), gp_Dir(0,0,1));
 
-static const double MyTextHeight = 20;
-
 IMPLEMENT_STANDARD_HANDLE(SketcherPrs_LengthDimension, AIS_LengthDimension);
 IMPLEMENT_STANDARD_RTTIEXT(SketcherPrs_LengthDimension, AIS_LengthDimension);
 
index e7648db53b4df56d42d9c6c313920fb8b1053e37..1e8a9ee7d6a14629b86a7a1839c0f45745570a18 100644 (file)
@@ -28,27 +28,27 @@ SketcherPrs_PositionMgr::SketcherPrs_PositionMgr()
 
 
 int SketcherPrs_PositionMgr::getPositionIndex(ObjectPtr theLine, 
-                                              Handle(SketcherPrs_SymbolPrs) thePrs)
+                                              const SketcherPrs_SymbolPrs* thePrs)
 {
   if (myShapes.count(theLine) == 1) {
     PositionsMap& aPosMap = myShapes[theLine];
-    if (aPosMap.count(thePrs.Access()) == 1) {
-      return aPosMap[thePrs.Access()];
+    if (aPosMap.count(thePrs) == 1) {
+      return aPosMap[thePrs];
     } else {
       int aInd = aPosMap.size();
-      aPosMap[thePrs.Access()] = aInd;
+      aPosMap[thePrs] = aInd;
       return aInd;
     }
   } else {
     PositionsMap aPosMap;
-    aPosMap[thePrs.Access()] = 0;
+    aPosMap[thePrs] = 0;
     myShapes[theLine] = aPosMap;
     return 0;
   }
 }
 
 gp_Pnt SketcherPrs_PositionMgr::getPosition(ObjectPtr theShape, 
-                                            Handle(SketcherPrs_SymbolPrs) thePrs,
+                                            const SketcherPrs_SymbolPrs* thePrs,
                                             double theStep)
 {
   std::shared_ptr<GeomAPI_Shape> aShape = SketcherPrs_Tools::getShape(theShape);
@@ -122,18 +122,20 @@ gp_Pnt SketcherPrs_PositionMgr::getPosition(ObjectPtr theShape,
   return aP;
 }
 
-void SketcherPrs_PositionMgr::deleteConstraint(Handle(SketcherPrs_SymbolPrs) thePrs)
+void SketcherPrs_PositionMgr::deleteConstraint(const SketcherPrs_SymbolPrs* thePrs)
 {
   std::map<ObjectPtr, PositionsMap>::iterator aIt;
+  std::list<ObjectPtr> aToDel;
   for (aIt = myShapes.begin(); aIt != myShapes.end(); ++aIt) {
     PositionsMap& aPosMap = aIt->second;
-    if (aPosMap.count(thePrs.Access()) > 0) 
-      aPosMap.erase(aPosMap.find(thePrs.Access()));
-  }
-  for (aIt = myShapes.begin(); aIt != myShapes.end(); ++aIt) {
-    if (aIt->second.size() == 0) {
-      myShapes.erase(aIt);
-      aIt = myShapes.begin();
+    if (aPosMap.count(thePrs) > 0) {
+      aPosMap.erase(aPosMap.find(thePrs));
+      if (aPosMap.size() == 0)
+        aToDel.push_back(aIt->first);
     }
   }
+  std::list<ObjectPtr>::const_iterator aListIt;
+  for (aListIt = aToDel.cbegin(); aListIt != aToDel.cend(); ++aListIt) {
+    myShapes.erase(*aListIt);
+  }
 }
index fd61fa64ffe90c6e6da3e29e427066ee8b4e7699..d8a956ff9f4398a033ca4b591c50344bc85f1566 100644 (file)
@@ -30,11 +30,11 @@ public:
   /// \param theLine constrained object 
   /// \param thePrs a presentation of constraint
   /// \param theStep step between symbols
-  gp_Pnt getPosition(ObjectPtr theLine, Handle(SketcherPrs_SymbolPrs) thePrs, double theStep = 20);
+  gp_Pnt getPosition(ObjectPtr theLine, const SketcherPrs_SymbolPrs* thePrs, double theStep = 20);
 
   /// Deletes constraint object from internal structures. Has to be called on constraint delete.
   /// \param thePrs a constraint presentation
-  void deleteConstraint(Handle(SketcherPrs_SymbolPrs) thePrs);
+  void deleteConstraint(const SketcherPrs_SymbolPrs* thePrs);
 
 private:
   /// Constructor
@@ -43,10 +43,10 @@ private:
   /// Returns position index of the given constraint
   /// \param theLine constrained object 
   /// \param thePrs a presentation of constraint
-  int getPositionIndex(ObjectPtr theLine, Handle(SketcherPrs_SymbolPrs) thePrs);
+  int getPositionIndex(ObjectPtr theLine, const SketcherPrs_SymbolPrs* thePrs);
 
 private:
-  typedef std::map<void*, int> PositionsMap;
+  typedef std::map<const SketcherPrs_SymbolPrs*, int> PositionsMap;
 
   /// The map which contains position of presentation
   PositionsMap myIndexes;
index bb517cc805b98ee259f01286407a2b456ac107ca..07957c4dbb458f3c812a4e8aa551973c70e6ea0d 100644 (file)
@@ -19,7 +19,6 @@
 #include <ModelAPI_AttributeDouble.h>
 
 static const gp_Circ MyDefCirc(gp_Ax2(gp_Pnt(0,0,0), gp_Dir(0,0,1)), 1);
-static const double MyTextHeight = 20;
 
 IMPLEMENT_STANDARD_HANDLE(SketcherPrs_Radius, AIS_RadiusDimension);
 IMPLEMENT_STANDARD_RTTIEXT(SketcherPrs_Radius, AIS_RadiusDimension);
index b502c47e9be3f3480a16f63bfc2b278197a42240..a74dfc82a763c68c10bebd190dc6902159b3c09d 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "SketcherPrs_SymbolPrs.h"
 #include "SketcherPrs_Tools.h"
+#include "SketcherPrs_PositionMgr.h"
 
 #include <GeomAPI_Edge.h>
 
@@ -225,6 +226,13 @@ SketcherPrs_SymbolPrs::SketcherPrs_SymbolPrs(SketchPlugin_Constraint* theConstra
   SetAutoHilight(Standard_False);
 }
 
+SketcherPrs_SymbolPrs::~SketcherPrs_SymbolPrs()
+{
+  SketcherPrs_PositionMgr* aMgr = SketcherPrs_PositionMgr::get();
+  aMgr->deleteConstraint(this);
+}
+
+
 
 Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon()
 {
index c087ff6bade584393590f52a2ff4c26a1d6c5046..9145705f520bb787310682d5e9a940d17ac6ebee 100644 (file)
@@ -41,6 +41,8 @@ public:
   Standard_EXPORT SketcherPrs_SymbolPrs(SketchPlugin_Constraint* theConstraint, 
                         const std::shared_ptr<GeomAPI_Ax3>& thePlane);
   
+  virtual ~SketcherPrs_SymbolPrs();
+
   //! Method which clear all selected owners belonging
   //! to this selectable object ( for fast presentation draw )
   Standard_EXPORT virtual void ClearSelected();
index e2973e9f9429b52127e21bbbdc0d141aacd889ee..c94864db66134292b2ffa075a1329431bdd3ba04 100644 (file)
@@ -134,7 +134,7 @@ std::shared_ptr<GeomAPI_Pnt2d> getProjectionPoint(
 }
 
 
-static double MyArrowSize = 40.;
+static double MyArrowSize = 30.;
 double getArrowSize()
 {
   return MyArrowSize;
index da29b72bdc3a11a4d8a38fe232f6797205d00565..29446596382d3ccdc54e012871588ec0523fa292 100644 (file)
@@ -17,6 +17,8 @@ class SketchPlugin_Constraint;
 class SketchPlugin_Line;
 class GeomDataAPI_Point2D;
 
+#define MyTextHeight 20
+
 namespace SketcherPrs_Tools {
 
   SKETCHERPRS_EXPORT ObjectPtr getResult(SketchPlugin_Constraint* theFeature,
index c53bc38f41cb3ed50a53b11948f59e96d0ebb6d5..ab9991d503365ecb453e9c9b020e00e6e68d74bd 100644 (file)
@@ -11,6 +11,7 @@
 #include "XGUI_Selection.h"
 #include "XGUI_OperationMgr.h"
 #include "XGUI_Displayer.h"
+#include "XGUI_PropertyPanel.h"
 
 #include <AIS_Shape.hxx>
 
@@ -47,6 +48,11 @@ ModuleBase_IViewer* XGUI_ModuleConnector::viewer() const
   return myWorkshop->viewer();
 }
 
+ModuleBase_IPropertyPanel* XGUI_ModuleConnector::propertyPanel() const
+{
+  return myWorkshop->propertyPanel();
+}
+
 ModuleBase_Operation* XGUI_ModuleConnector::currentOperation() const
 {
   return myWorkshop->operationMgr()->currentOperation();
@@ -102,3 +108,4 @@ bool XGUI_ModuleConnector::canStartOperation(QString theId)
 {
   return myWorkshop->operationMgr()->canStartOperation(theId);
 }
+
index 266967988e30ac953518ffa2c47e704f02e3d26f..e78228378bebf0f455857e6850215cb7fbfc9001 100644 (file)
@@ -46,6 +46,9 @@ Q_OBJECT
   //! Returns current viewer
   virtual ModuleBase_IViewer* viewer() const;
 
+  //! Returns property panel
+  virtual ModuleBase_IPropertyPanel* propertyPanel() const;
+
   //! Returns currently active operation
   virtual ModuleBase_Operation* currentOperation() const;