Salome HOME
Issue #1343. Improvement of Extrusion and Revolution operations: Bug correction:...
[modules/shaper.git] / src / PartSet / PartSet_MenuMgr.cpp
index b840d7b373f8a7b5d7aceeebcaec3ab49a5517a3..a970e4979bb85fa6464b2d42c0d4c6c440d26f37 100644 (file)
@@ -39,6 +39,7 @@
 
 #include <QAction>
 #include <QMenu>
+#include <QEvent>
 
 #include <TopoDS.hxx>
 #include <BRep_Tool.hxx>
@@ -119,14 +120,13 @@ bool PartSet_MenuMgr::addViewerMenu(QMenu* theMenu, const QMap<QString, QAction*
   bool hasFeature = false;
 
   QList<ModuleBase_ViewerPrs> aPrsList = aSelection->getSelected(ModuleBase_ISelection::Viewer);
-  TopoDS_Shape aShape;
   ResultPtr aResult;
   FeaturePtr aFeature;
   foreach(ModuleBase_ViewerPrs aPrs, aPrsList) {
     aResult = std::dynamic_pointer_cast<ModelAPI_Result>(aPrs.object());
     if (aResult.get() != NULL) {
-      aShape = aPrs.shape();
-      if (aShape.IsEqual(aResult->shape()->impl<TopoDS_Shape>()))
+      const GeomShapePtr& aShape = aPrs.shape();
+      if (aShape.get() && aShape->isEqual(aResult->shape()))
         hasFeature = true;
       else
         hasAttribute = true;
@@ -137,12 +137,13 @@ bool PartSet_MenuMgr::addViewerMenu(QMenu* theMenu, const QMap<QString, QAction*
   }
 
   if (aPrsList.size() == 1) {
-    TopoDS_Shape aShape = aPrsList.first().shape();
-    if ((!aShape.IsNull()) && aShape.ShapeType() == TopAbs_VERTEX) {
+    const GeomShapePtr& aShape = aPrsList.first().shape();
+    if (aShape.get() && !aShape->isNull() && aShape->shapeType() == GeomAPI_Shape::VERTEX) {
       // Find 2d coordinates
       FeaturePtr aSketchFea = myModule->sketchMgr()->activeSketch();
       if (aSketchFea->getKind() == SketchPlugin_Sketch::ID()) {
-        gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aShape));
+        const TopoDS_Shape& aTDShape = aShape->impl<TopoDS_Shape>();
+        gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aTDShape));
         std::shared_ptr<GeomAPI_Pnt> aPnt3d(new GeomAPI_Pnt(aPnt.X(), aPnt.Y(), aPnt.Z()));
         std::shared_ptr<GeomAPI_Pnt2d> aSelPnt = PartSet_Tools::convertTo2D(aSketchFea, aPnt3d);
 
@@ -152,10 +153,11 @@ bool PartSet_MenuMgr::addViewerMenu(QMenu* theMenu, const QMap<QString, QAction*
         FeaturePtr aCoincident = PartSet_Tools::findFirstCoincidence(aFeature, aSelPnt);
         // If we have coincidence then add Detach menu
         if (aCoincident.get() != NULL) {
+          QList<FeaturePtr> aCoins;
           mySelectedFeature = aCoincident;
-          PartSet_Tools::findCoincidences(mySelectedFeature, myCoinsideLines,
+          PartSet_Tools::findCoincidences(mySelectedFeature, myCoinsideLines, aCoins,
                                           SketchPlugin_ConstraintCoincidence::ENTITY_A());
-          PartSet_Tools::findCoincidences(mySelectedFeature, myCoinsideLines,
+          PartSet_Tools::findCoincidences(mySelectedFeature, myCoinsideLines, aCoins,
                                           SketchPlugin_ConstraintCoincidence::ENTITY_B());
           if (myCoinsideLines.size() > 0) {
             aIsDetach = true;
@@ -351,8 +353,6 @@ void PartSet_MenuMgr::setAuxiliary(const bool isChecked)
 
     anOpMgr->startOperation(anOpAction);
   }
-  myModule->sketchMgr()->storeSelection();
-
   if (anObjects.size() > 0) {
     QObjectPtrList::const_iterator anIt = anObjects.begin(), aLast = anObjects.end();
     for (; anIt != aLast; anIt++) {
@@ -375,7 +375,6 @@ void PartSet_MenuMgr::setAuxiliary(const bool isChecked)
     anOpMgr->commitOperation();
 
   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
-  myModule->sketchMgr()->restoreSelection();
 }
 
 bool PartSet_MenuMgr::canSetAuxiliary(bool& theValue) const
@@ -446,6 +445,7 @@ void PartSet_MenuMgr::onActivatePart(bool)
     }
     if (aPart.get())
       aPart->activate();
+      myModule->workshop()->updateCommandStatus();
   }
 }
 
@@ -464,6 +464,8 @@ void PartSet_MenuMgr::activatePartSet() const
   if (isNewTransaction) aMgr->startOperation("Activation");
   aMgr->setActiveDocument(aMgr->moduleDocument());
   if (isNewTransaction) aMgr->finishOperation();
+
+  myModule->workshop()->updateCommandStatus();
 }
 
 void PartSet_MenuMgr::grantedOperationIds(ModuleBase_Operation* theOperation,
@@ -506,3 +508,13 @@ void PartSet_MenuMgr::onSelectParentFeature()
   aSelection.append( aParentFeature );
   myModule->workshop()->selection()->setSelectedObjects( aSelection );
 }
+
+bool PartSet_MenuMgr::eventFilter(QObject* theObj, QEvent* theEvent)
+{
+  if (theEvent->type() == QEvent::MouseButtonDblClick) {
+    SessionPtr aMgr = ModelAPI_Session::get();
+    if (aMgr->activeDocument() != aMgr->moduleDocument())
+      activatePartSet();
+  }
+  return QObject::eventFilter(theObj, theEvent);
+}
\ No newline at end of file