Salome HOME
#816 In multi-rotation, be able to put the total angle or the step angle (Rotation...
[modules/shaper.git] / src / PartSet / PartSet_WidgetSketchCreator.cpp
index 7f08fe33e3d90ac2f1da0f3789ce28e062d2417d..6bc043eb449df089d233010bd42d0ab6e673dabc 100644 (file)
@@ -7,6 +7,8 @@
 #include "PartSet_WidgetSketchCreator.h"
 #include "PartSet_Module.h"
 
+#include <Config_Keywords.h>
+
 #include <XGUI_ModuleConnector.h>
 #include <XGUI_Workshop.h>
 #include <XGUI_Displayer.h>
@@ -19,6 +21,7 @@
 #include <ModelAPI_ResultBody.h>
 #include <ModelAPI_AttributeSelection.h>
 #include <ModelAPI_AttributeSelectionList.h>
+#include <ModelAPI_Validator.h>
 
 #include <SketchPlugin_SketchEntity.h>
 #include <FeaturesPlugin_CompositeBoolean.h>
@@ -26,6 +29,7 @@
 #include <ModuleBase_Tools.h>
 #include <ModuleBase_Operation.h>
 #include <ModuleBase_IPropertyPanel.h>
+#include <ModuleBase_OperationFeature.h>
 #include <Config_WidgetAPI.h>
 
 #include <QLabel>
@@ -37,7 +41,7 @@ PartSet_WidgetSketchCreator::PartSet_WidgetSketchCreator(QWidget* theParent,
                                                          PartSet_Module* theModule,
                                                          const Config_WidgetAPI* theData,
                                                          const std::string& theParentId)
-: ModuleBase_ModelWidget(theParent, theData, theParentId), myModule(theModule)
+: ModuleBase_ModelWidget(theParent, theData, theParentId), myModule(theModule), myUseBody(true)
 {
   QFormLayout* aLayout = new QFormLayout(this);
   ModuleBase_Tools::adjustMargins(aLayout);
@@ -55,6 +59,13 @@ PartSet_WidgetSketchCreator::PartSet_WidgetSketchCreator(QWidget* theParent,
   myTextLine->setToolTip(aToolTip);
   myTextLine->installEventFilter(this);
 
+  myLabel->setToolTip(aToolTip);
+
+  QString aUseBody = QString::fromStdString(theData->getProperty(USE_BODY));
+  if(!aUseBody.isEmpty()) {
+    myUseBody = QVariant(aUseBody).toBool();
+  }
+
   aLayout->addRow(myLabel, myTextLine);
 }
 
@@ -69,7 +80,7 @@ QList<QWidget*> PartSet_WidgetSketchCreator::getControls() const
   return aControls;
 }
 
-bool PartSet_WidgetSketchCreator::restoreValue()
+bool PartSet_WidgetSketchCreator::restoreValueCustom()
 {
   CompositeFeaturePtr aCompFeature = 
     std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myFeature);
@@ -102,13 +113,15 @@ void PartSet_WidgetSketchCreator::onStarted()
   XGUI_Workshop* aWorkshop = aConnector->workshop();
   XGUI_Displayer* aDisp = aWorkshop->displayer();
   QObjectPtrList aObjList = aDisp->displayedObjects();
-  bool aHasBody = false;
+  bool aHasBody = !myUseBody;
   ResultBodyPtr aBody;
-  foreach(ObjectPtr aObj, aObjList) {
-    aBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(aObj);
-    if (aBody.get() != NULL) {
-      aHasBody = true;
-      break;
+  if(!aHasBody) {
+    foreach(ObjectPtr aObj, aObjList) {
+      aBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(aObj);
+      if (aBody.get() != NULL) {
+        aHasBody = true;
+        break;
+      }
     }
   }
 
@@ -116,15 +129,28 @@ void PartSet_WidgetSketchCreator::onStarted()
     // Launch Sketch operation
     CompositeFeaturePtr aCompFeature = 
       std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myFeature);
-    FeaturePtr aSketch = aCompFeature->addFeature("Sketch");
 
-    ModuleBase_Operation* anOperation = myModule->createOperation("Sketch");
-    anOperation->setFeature(aSketch);
-    myModule->sendOperation(anOperation);
+    /// add sketch feature without current feature change.
+    /// it is important to do not change the current feature in order to
+    /// after sketch edition, the extrusion cut feature becomes current
+    SessionPtr aMgr = ModelAPI_Session::get();
+    DocumentPtr aDoc = aMgr->activeDocument();
+    FeaturePtr aPreviousCurrentFeature = aDoc->currentFeature(false);
+    FeaturePtr aSketch = aCompFeature->addFeature("Sketch");
+    aDoc->setCurrentFeature(aPreviousCurrentFeature, false);
+
+    // start edit operation for the sketch
+    ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
+                                                             (myModule->createOperation("Sketch"));
+    if (aFOperation)
+      aFOperation->setFeature(aSketch);
+    myModule->sendOperation(aFOperation);
     //connect(anOperation, SIGNAL(aborted()), aWorkshop->operationMgr(), SLOT(abortAllOperations()));
   } else {
     // Break current operation
-    QMessageBox::warning(this, tr("Extrusion Cut"),
+    std::string anOperationName = feature()->getKind();
+    QString aTitle = tr( anOperationName.c_str() );
+    QMessageBox::warning(this, aTitle,
         tr("There are no bodies found. Operation aborted."), QMessageBox::Ok);
     ModuleBase_Operation* aOp = myModule->workshop()->currentOperation();
     aOp->abort();
@@ -138,7 +164,7 @@ bool PartSet_WidgetSketchCreator::focusTo()
   if (aCompFeature->numberOfSubs() == 0)
     return ModuleBase_ModelWidget::focusTo(); 
 
-  connect(myModule, SIGNAL(operationResumed(ModuleBase_Operation*)), SLOT(onResumed(ModuleBase_Operation*)));
+  connect(myModule, SIGNAL(resumed(ModuleBase_Operation*)), SLOT(onResumed(ModuleBase_Operation*)));
   SessionPtr aMgr = ModelAPI_Session::get();
   // Open transaction that is general for the previous nested one: it will be closed on nested commit
   bool aIsOp = aMgr->isOperation();
@@ -178,19 +204,28 @@ void PartSet_WidgetSketchCreator::onResumed(ModuleBase_Operation* theOp)
     }
     aSketchFeature->setDisplayed(false);
 
-    // Add Selected body were created the sketcher to list of selected objects
-    DataPtr aData = aSketchFeature->data();
-    AttributeSelectionPtr aSelAttr = 
-      std::dynamic_pointer_cast<ModelAPI_AttributeSelection>
-      (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID()));
-    if (aSelAttr.get()) {
-      ResultPtr aRes = aSelAttr->context();
-      GeomShapePtr aShape = aSelAttr->value();
-      if (aRes.get()) {
-        AttributeSelectionListPtr aSelList = 
-          aCompFeature->data()->selectionList(FeaturesPlugin_CompositeBoolean::BOOLEAN_OBJECTS_ID());
-        aSelList->append(aRes, GeomShapePtr());
-        updateObject(aCompFeature);
+    if(myUseBody) {
+      // Add Selected body were created the sketcher to list of selected objects
+      DataPtr aData = aSketchFeature->data();
+      AttributeSelectionPtr aSelAttr = 
+        std::dynamic_pointer_cast<ModelAPI_AttributeSelection>
+        (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID()));
+      if (aSelAttr.get()) {
+        ResultPtr aRes = aSelAttr->context();
+        GeomShapePtr aShape = aSelAttr->value();
+        if (aRes.get()) {
+          std::string anObjectsAttribute = FeaturesPlugin_CompositeBoolean::BOOLEAN_OBJECTS_ID();
+          SessionPtr aMgr = ModelAPI_Session::get();
+          ModelAPI_ValidatorsFactory* aFactory = aMgr->validators();
+          AttributePtr anAttribute = myFeature->attribute(anObjectsAttribute);
+          std::string aValidatorID, anError;
+          AttributeSelectionListPtr aSelList = aCompFeature->data()->selectionList(anObjectsAttribute);
+          aSelList->append(aRes, GeomShapePtr());
+          if (aFactory->validate(anAttribute, aValidatorID, anError))
+            updateObject(aCompFeature);
+          else
+            aSelList->clear();
+        }
       }
     }
   }