Salome HOME
Activation objects redesign.
[modules/shaper.git] / src / PartSet / PartSet_WidgetSketchCreator.cpp
1 // Copyright (C) 2014-2017  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or
18 // email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
19 //
20
21 #include "PartSet_WidgetSketchCreator.h"
22 #include "PartSet_Module.h"
23 #include "PartSet_WidgetSketchLabel.h"
24 #include "PartSet_PreviewPlanes.h"
25
26 #include <Config_Keywords.h>
27
28 #include <XGUI_ModuleConnector.h>
29 #include <XGUI_Workshop.h>
30 #include <XGUI_Displayer.h>
31 #include <XGUI_SelectionMgr.h>
32 #include <XGUI_OperationMgr.h>
33 #include <XGUI_PropertyPanel.h>
34 #include <XGUI_Tools.h>
35 #include <XGUI_ViewerProxy.h>
36
37 #include <GeomAPI_Face.h>
38
39 #include <Events_InfoMessage.h>
40
41 #include <ModelAPI_Session.h>
42 #include <ModelAPI_ResultBody.h>
43 #include <ModelAPI_AttributeSelection.h>
44 #include <ModelAPI_AttributeSelectionList.h>
45 #include <ModelAPI_Validator.h>
46 #include <ModelAPI_Events.h>
47 #include <ModelAPI_ResultConstruction.h>
48
49 #include <SketchPlugin_SketchEntity.h>
50 #include <FeaturesPlugin_CompositeBoolean.h>
51
52 #include <ModuleBase_Tools.h>
53 #include <ModuleBase_Operation.h>
54 #include <ModuleBase_IPropertyPanel.h>
55 #include <ModuleBase_OperationFeature.h>
56 #include <ModuleBase_ViewerPrs.h>
57
58 #include <Config_WidgetAPI.h>
59
60 #include <Events_Loop.h>
61
62 #include <QLabel>
63 #include <QLineEdit>
64 #include <QDoubleValidator>
65 //#include <QFormLayout>
66 #include <QVBoxLayout>
67 #include <QMessageBox>
68 #include <QMainWindow>
69
70 #define DEBUG_UNDO_INVALID_SKETCH
71
72 PartSet_WidgetSketchCreator::PartSet_WidgetSketchCreator(QWidget* theParent,
73                                                          PartSet_Module* theModule,
74                                                          const Config_WidgetAPI* theData)
75 : ModuleBase_WidgetSelector(theParent, theModule->workshop(), theData),
76   myModule(theModule), myIsCustomAttribute(false)
77 {
78   myAttributeListID = theData->getProperty("attribute_list_id");
79
80   //QFormLayout* aLayout = new QFormLayout(this);
81   QVBoxLayout* aLayout = new QVBoxLayout(this);
82   ModuleBase_Tools::zeroMargins(aLayout);
83
84   ModuleBase_Tools::adjustMargins(aLayout);
85
86   QString aLabelText = QString::fromStdString(theData->widgetLabel());
87   QString aLabelIcon = QString::fromStdString(theData->widgetIcon());
88
89   // Size of the View control
90   mySizeOfViewWidget = new QWidget(this);
91   QHBoxLayout* aSizeLayout = new QHBoxLayout(mySizeOfViewWidget);
92   aSizeLayout->addWidget(new QLabel("Size of the view", mySizeOfViewWidget));
93   mySizeOfView = new QLineEdit(mySizeOfViewWidget);
94
95   QDoubleValidator* aValidator = new QDoubleValidator(0, DBL_MAX, 12, mySizeOfView);
96   aValidator->setLocale(ModuleBase_Tools::doubleLocale());
97   aValidator->setNotation(QDoubleValidator::StandardNotation);
98   mySizeOfView->setValidator(aValidator);
99   aSizeLayout->addWidget(mySizeOfView);
100
101   myLabel = new QLabel(aLabelText, this);
102   myLabel->setWordWrap(true);
103
104   aLayout->addWidget(mySizeOfViewWidget);
105   aLayout->addWidget(myLabel);
106   aLayout->addStretch(1);
107
108   std::string aTypes = theData->getProperty("shape_types");
109   myShapeTypes = QString(aTypes.c_str()).split(' ', QString::SkipEmptyParts);
110
111   myPreviewPlanes = new PartSet_PreviewPlanes();
112 }
113
114 PartSet_WidgetSketchCreator::~PartSet_WidgetSketchCreator()
115 {
116   // we need to deactivate here in order to hide preview planes if the selection mode is
117   // active
118   deactivate();
119 }
120
121 QList<QWidget*> PartSet_WidgetSketchCreator::getControls() const
122 {
123   QList<QWidget*> aControls;
124   aControls.append(myLabel);
125   return aControls;
126 }
127
128 bool PartSet_WidgetSketchCreator::restoreValueCustom()
129 {
130   return true;
131 }
132
133 bool PartSet_WidgetSketchCreator::storeValueCustom()
134 {
135   return true;
136 }
137
138 AttributePtr PartSet_WidgetSketchCreator::attribute() const
139 {
140   AttributePtr anAttribute;
141   if (myIsCustomAttribute)
142     anAttribute = myFeature->attribute(myAttributeListID);
143   else
144     anAttribute = ModuleBase_WidgetSelector::attribute();
145
146   return anAttribute;
147 }
148
149 //********************************************************************
150 void PartSet_WidgetSketchCreator::openExtrusionTransaction()
151 {
152   SessionPtr aMgr = ModelAPI_Session::get();
153   bool aIsOp = aMgr->isOperation();
154   if (!aIsOp) {
155     const static std::string aNestedOpID("Parameters modification");
156     aMgr->startOperation(aNestedOpID, true);
157   }
158 }
159
160 //********************************************************************
161 bool PartSet_WidgetSketchCreator::isValidSelection(const ModuleBase_ViewerPrsPtr& theValue)
162 {
163   bool aValid = false;
164   if (myIsCustomAttribute) {
165     // check only suiting of the value to custom attribute (myAttributeListID)
166     // do not cash of validation to avoid using states, stored for XML attribute
167     // there is an alternative is to call clearValidatedCash() in setSelection()
168     aValid = isValidSelectionForAttribute(theValue, attribute());
169   }
170   else { /// if the validated attribute is already custom
171     if (getValidState(theValue, aValid)) {
172       return aValid;
173     }
174     aValid = isValidSelectionCustom(theValue);
175     if (!aValid)
176       // check selection to create new sketh (XML current attribute)
177       aValid = isValidSelectionForAttribute(theValue, attribute());
178     if (!aValid) {
179       // check selection to fill list attribute (myAttributeListID)
180       bool isCustomAttribute = myIsCustomAttribute;
181       myIsCustomAttribute = true;
182       aValid = isValidSelectionForAttribute(theValue, attribute());
183       myIsCustomAttribute = isCustomAttribute;
184     }
185   }
186   storeValidState(theValue, aValid);
187   return aValid;
188 }
189
190 //********************************************************************
191 bool PartSet_WidgetSketchCreator::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr& theValue)
192 {
193   return PartSet_WidgetSketchLabel::canFillSketch(theValue);
194 }
195
196 void PartSet_WidgetSketchCreator::activateSelectionControl()
197 {
198   // reset previously set size of view needed on restart extrusion after Sketch
199   if (myModule->sketchMgr()->previewSketchPlane()->isUseSizeOfView())
200     myModule->sketchMgr()->previewSketchPlane()->setSizeOfView(0, false);
201
202   // we need to call activate here as the widget has no focus accepted controls
203   // if these controls are added here, activate will happens automatically after focusIn()
204   XGUI_Workshop* aWorkshop = XGUI_Tools::workshop(myModule->workshop());
205   XGUI_PropertyPanel* aPanel = aWorkshop->propertyPanel();
206   aPanel->activateWidget(this, false);
207 }
208
209 void PartSet_WidgetSketchCreator::setVisibleSelectionControl(const bool theSelectionControl)
210 {
211   // hide current widget, activate the next widget
212   XGUI_Workshop* aWorkshop = XGUI_Tools::workshop(myModule->workshop());
213   XGUI_PropertyPanel* aPanel = aWorkshop->propertyPanel();
214   const QList<ModuleBase_ModelWidget*>& aWidgets = aPanel->modelWidgets();
215   foreach(ModuleBase_ModelWidget* aWidget, aWidgets) {
216     if (theSelectionControl) { // hide other controls
217       if (aWidget != this)
218         aWidget->setVisible(false);
219     }
220     else { // hide current control
221       if (aWidget == this)
222         aWidget->setVisible(false);
223       else {
224         aWidget->setVisible(true);
225         if (aWidget->attributeID() == myAttributeListID)
226           setEnabledModelWidget(aWidget, !hasSubObjects());
227       }
228     }
229   }
230
231   if (theSelectionControl) {
232     bool aBodyIsVisualized = myPreviewPlanes->hasVisualizedBodies(myWorkshop);
233     bool aSketchIsVisualized = myPreviewPlanes->hasVisualizedSketch(myWorkshop);
234     if (!aBodyIsVisualized && !aSketchIsVisualized) {
235       // We have to select a plane before any operation
236       myPreviewPlanes->showPreviewPlanes(myWorkshop);
237       mySizeOfViewWidget->setVisible(true);
238     }
239     else {
240       mySizeOfViewWidget->setVisible(false);
241     }
242
243   } else {
244     bool aHidePreview = myPreviewPlanes->isPreviewDisplayed();
245     myPreviewPlanes->erasePreviewPlanes(myWorkshop);
246     if (aHidePreview)
247       aWorkshop->viewer()->update();
248   }
249 }
250
251 QIntList PartSet_WidgetSketchCreator::shapeTypes() const
252 {
253   QIntList aShapeTypes;
254   foreach(QString aType, myShapeTypes) {
255     aShapeTypes.append(ModuleBase_Tools::shapeType(aType));
256   }
257   return aShapeTypes;
258 }
259
260 void PartSet_WidgetSketchCreator::setEditingMode(bool isEditing)
261 {
262   ModuleBase_ModelWidget::setEditingMode(isEditing);
263   if (isEditing) {
264     setVisibleSelectionControl(false);
265
266     ModuleBase_ModelWidget* anAttributeListWidget = 0;
267     XGUI_Workshop* aWorkshop = XGUI_Tools::workshop(myModule->workshop());
268     XGUI_PropertyPanel* aPanel = aWorkshop->propertyPanel();
269     const QList<ModuleBase_ModelWidget*>& aWidgets = aPanel->modelWidgets();
270     foreach(ModuleBase_ModelWidget* aWidget, aWidgets) {
271       if (aWidget->attributeID() == myAttributeListID) {
272         anAttributeListWidget = aWidget;
273         break;
274       }
275     }
276     if (anAttributeListWidget)
277       setEnabledModelWidget(anAttributeListWidget, !hasSubObjects());
278   }
279 }
280
281 bool PartSet_WidgetSketchCreator::isSelectionMode() const
282 {
283   AttributeSelectionListPtr anAttrList = myFeature->data()->selectionList(myAttributeListID);
284   bool aHasValueInList = anAttrList.get() && anAttrList->size() > 0;
285
286   return !aHasValueInList;
287 }
288
289 bool PartSet_WidgetSketchCreator::hasSubObjects() const
290 {
291   bool aHasSubObjects = false;
292
293   bool aCanSetFocus = true;
294   CompositeFeaturePtr aComposite = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myFeature);
295   if (aComposite.get())
296     aHasSubObjects = aComposite->numberOfSubs() > 0;
297   return aHasSubObjects;
298 }
299
300 bool PartSet_WidgetSketchCreator::setSelection(QList<ModuleBase_ViewerPrsPtr>& theValues,
301                                                const bool theToValidate)
302 {
303   bool aDone = false;
304   if (!startSketchOperation(theValues)) {
305     myIsCustomAttribute = true;
306     QList<ModuleBase_ViewerPrsPtr>::const_iterator
307       anIt = theValues.begin(), aLast = theValues.end();
308     bool aProcessed = false;
309     for (; anIt != aLast; anIt++) {
310       ModuleBase_ViewerPrsPtr aValue = *anIt;
311       if (!theToValidate || isValidInFilters(aValue))
312         aProcessed = setSelectionCustom(aValue) || aProcessed;
313     }
314     myIsCustomAttribute = false;
315     aDone = aProcessed;
316     if (aProcessed) {
317       emit valuesChanged();
318       updateObject(myFeature);
319       setVisibleSelectionControl(false);
320       // manually deactivation because the widget was
321       // not activated as has no focus acceptin controls
322       deactivate();
323       emit focusOutWidget(this);
324     }
325   }
326   return aDone;
327 }
328
329 //********************************************************************
330 bool PartSet_WidgetSketchCreator::processSelection()
331 {
332   QList<ModuleBase_ViewerPrsPtr> aSelected = getFilteredSelected();
333   bool isDone = setSelection(aSelected, true/*false*/);
334
335   return isDone;
336 }
337
338 //********************************************************************
339 void PartSet_WidgetSketchCreator::updateOnSelectionChanged(const bool theDone)
340 {
341 }
342
343 bool PartSet_WidgetSketchCreator::startSketchOperation(
344                               const QList<ModuleBase_ViewerPrsPtr>& theValues)
345 {
346   bool aSketchStarted = false;
347
348   if (theValues.size() != 1)
349     return aSketchStarted;
350
351   ModuleBase_ViewerPrsPtr aValue = theValues.front();
352   if (!aValue.get() || !PartSet_WidgetSketchLabel::canFillSketch(aValue))
353     return aSketchStarted;
354
355   ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(aValue->object());
356   /// sketch should not started by object(face) selected as global. If Local face is selected,
357   /// sketch is started
358   if (aResult.get() && aValue->shape().get() && aResult->shape()->isEqual(aValue->shape())) {
359     ResultConstructionPtr aConstruction =
360       std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aResult);
361     if (!aConstruction.get() || !aConstruction->isInfinite())
362       return aSketchStarted;
363   }
364   aSketchStarted = true;
365   // Set View size if a plane is selected
366   if (myPreviewPlanes->isPreviewDisplayed() &&
367       myPreviewPlanes->isPreviewShape(aValue->shape())) {
368     // set default plane size
369     bool isSetSizeOfView = false;
370     double aSizeOfView = 0;
371     QString aSizeOfViewStr = mySizeOfView->text();
372     if (!aSizeOfViewStr.isEmpty()) {
373       aSizeOfView = aSizeOfViewStr.toDouble(&isSetSizeOfView);
374       if (isSetSizeOfView && aSizeOfView <= 0) {
375         isSetSizeOfView = false;
376       }
377     }
378     if (isSetSizeOfView)
379       myModule->sketchMgr()->previewSketchPlane()->setSizeOfView(aSizeOfView, true);
380   }
381   // manually deactivation because the widget was not activated as has no focus acceptin controls
382   deactivate();
383   bool aHidePreview = myPreviewPlanes->isPreviewDisplayed();
384   myPreviewPlanes->erasePreviewPlanes(myWorkshop);
385
386   // Launch Sketch operation
387   CompositeFeaturePtr aCompFeature =
388     std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myFeature);
389
390   // start edit operation for the sketch
391   ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
392                                                             (myModule->createOperation("Sketch"));
393   QList<ModuleBase_ViewerPrsPtr> aValues;
394   aValues.push_back(aValue);
395   aFOperation->setPreselection(aValues);
396
397   myWorkshop->processLaunchOperation(aFOperation);
398
399   return aSketchStarted;
400 }
401
402 bool PartSet_WidgetSketchCreator::focusTo()
403 {
404   // this method is called only in creation mode. In Edition mode this widget is hidden
405   if (isSelectionMode() && !hasSubObjects()) {
406     setVisibleSelectionControl(true);
407     activateSelectionControl();
408     openExtrusionTransaction();
409     return true;
410   }
411   else
412     connect(myModule, SIGNAL(resumed(ModuleBase_Operation*)),
413             SLOT(onResumed(ModuleBase_Operation*)));
414
415   return true;
416 }
417
418 void PartSet_WidgetSketchCreator::deactivate()
419 {
420   ModuleBase_WidgetSelector::deactivate();
421
422   bool aHidePreview = myPreviewPlanes->isPreviewDisplayed();
423   myPreviewPlanes->erasePreviewPlanes(myWorkshop);
424   if (aHidePreview)
425     XGUI_Tools::workshop(myWorkshop)->viewer()->update();
426
427 }
428
429 void PartSet_WidgetSketchCreator::onResumed(ModuleBase_Operation* theOp)
430 {
431   SessionPtr aMgr = ModelAPI_Session::get();
432   bool aIsOp = aMgr->isOperation();
433   if (aIsOp) {
434     // in current implementation, all transactions are closed when resume happens
435     // so, this is a wrong case, which is not checked.
436     // To provide it, make correction in later rows about abort/undo transactions
437     return;
438   }
439   // Set visible only selection control
440   setVisibleSelectionControl(true);
441
442   // Validate the created sketch. If it is valid, it is set into the composite feature selection
443   // list, otherwise it is removed
444   CompositeFeaturePtr aCompFeature =
445     std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myFeature);
446   AttributeSelectionListPtr anAttrList = myFeature->data()->selectionList(myAttributeListID);
447   if (aCompFeature->numberOfSubs() > 0) {
448     // set the sub feature to attribute selection list and check whether sketch is valid
449     SessionPtr aMgr = ModelAPI_Session::get();
450     const static std::string aNestedOpID("Set Sketch result into Selection list");
451     aMgr->startOperation(aNestedOpID, false); // false to not attach to Extrusion operation
452     setSketchObjectToList(aCompFeature, anAttrList);
453     aMgr->finishOperation();
454
455     if (!validateSelectionList()) {
456 #ifdef DEBUG_UNDO_INVALID_SKETCH
457       aMgr->undo(); // Extrusion modification parameters: setSketchObjectToList()
458       aMgr->undo(); /// Sketch creation
459 #else
460       aMgr->startOperation("Delete invalid Sketch feature", false);
461
462       // delete invalid sketch
463       CompositeFeaturePtr aSketchFeature =
464               std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(aCompFeature->subFeature(0));
465       QObjectPtrList anObjects;
466       anObjects.append(aSketchFeature);
467
468       XGUI_Workshop* aWorkshop = XGUI_Tools::workshop(myModule->workshop());
469       aWorkshop->deleteFeatures(anObjects);
470
471       aMgr->finishOperation();
472 #endif
473     }
474   }
475   openExtrusionTransaction();
476
477   if (aCompFeature->numberOfSubs() == 0) {
478     // call activateWidget() of the parent to connect to the viewer seleciton
479     activateSelectionControl();
480   }
481   else {
482     // check if the created sketch is valid. If it is invalid, it will be deleted with warning else
483     /// the attribute selection list will be filled by result of this sketch.
484     setVisibleSelectionControl(false);
485
486     // Update value in attribute selection list
487     XGUI_Workshop* aWorkshop = XGUI_Tools::workshop(myModule->workshop());
488     XGUI_PropertyPanel* aPropertyPanel = aWorkshop->propertyPanel();
489     const QList<ModuleBase_ModelWidget*>& aWidgets = aPropertyPanel->modelWidgets();
490     ModuleBase_ModelWidget* aListWidget = 0;
491     foreach(ModuleBase_ModelWidget* aWidget, aWidgets) {
492       if (aWidget->attributeID() == myAttributeListID) {
493         aListWidget = aWidget;
494         break;
495       }
496     }
497     if (aListWidget) {
498       aListWidget->restoreValue();
499       aPropertyPanel->activateNextWidget(aListWidget);
500     }
501
502     // Hide sketcher result
503     CompositeFeaturePtr aSketchFeature =
504       std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(aCompFeature->subFeature(0));
505     std::list<ResultPtr> aResults = aSketchFeature->results();
506     std::list<ResultPtr>::const_iterator aIt;
507     for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
508       (*aIt)->setDisplayed(false);
509     }
510     aSketchFeature->setDisplayed(false);
511     static Events_Loop* aLoop = Events_Loop::loop();
512     aLoop->flush(aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY));
513
514     // Add Selected body were created the sketcher to list of selected objects
515     std::string anObjectsAttribute = FeaturesPlugin_CompositeBoolean::OBJECTS_ID();
516     AttributeSelectionListPtr aSelList = aCompFeature->data()->selectionList(anObjectsAttribute);
517     if (aSelList.get()) {
518       DataPtr aData = aSketchFeature->data();
519       AttributeSelectionPtr aSelAttr = std::dynamic_pointer_cast<ModelAPI_AttributeSelection>
520                                     (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID()));
521       ResultPtr aRes = aSelAttr.get() ? aSelAttr->context() : ResultPtr();
522       if (aRes.get()) {
523         SessionPtr aMgr = ModelAPI_Session::get();
524         ModelAPI_ValidatorsFactory* aFactory = aMgr->validators();
525         AttributePtr anAttribute = myFeature->attribute(anObjectsAttribute);
526         std::string aValidatorID;
527         Events_InfoMessage anError;
528         aSelList->append(aRes, GeomShapePtr());
529         if (aFactory->validate(anAttribute, aValidatorID, anError))
530           updateObject(aCompFeature);
531         else
532           aSelList->clear();
533       }
534     }
535   }
536   restoreValue();
537 }
538
539 bool PartSet_WidgetSketchCreator::validateSelectionList() const
540 {
541   AttributeSelectionListPtr anAttrList = myFeature->data()->selectionList(myAttributeListID);
542
543   SessionPtr aMgr = ModelAPI_Session::get();
544   ModelAPI_ValidatorsFactory* aFactory = aMgr->validators();
545   std::string aValidatorID;
546   Events_InfoMessage anError;
547   bool isValidPComposite = aFactory->validate(anAttrList, aValidatorID, anError);
548   if (!isValidPComposite) {
549     XGUI_Workshop* aWorkshop = XGUI_Tools::workshop(myModule->workshop());
550     // TODO(spo): translate
551     QMessageBox::question(aWorkshop->desktop(), tr("Apply current feature"),
552                   tr("Sketch is invalid and will be deleted.\nError: %1")
553                   .arg(anError.messageString().c_str()),
554                   QMessageBox::Ok);
555   }
556   return isValidPComposite;
557 }
558
559 void PartSet_WidgetSketchCreator::setSketchObjectToList(
560                             const CompositeFeaturePtr& theCompositeFeature,
561                             const AttributePtr& theAttribute)
562 {
563   if (!theCompositeFeature.get() || theCompositeFeature->numberOfSubs() != 1)
564     return;
565
566   AttributeSelectionListPtr aBaseObjectsSelectionList =
567                      std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(theAttribute);
568   if(!aBaseObjectsSelectionList.get() || aBaseObjectsSelectionList->isInitialized()) {
569     return;
570   }
571
572   FeaturePtr aSketchFeature = theCompositeFeature->subFeature(0);
573   if(!aSketchFeature.get() || aSketchFeature->results().empty()) {
574     return;
575   }
576
577   ResultPtr aSketchRes = aSketchFeature->results().front();
578   ResultConstructionPtr aConstruction =
579     std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aSketchRes);
580   if(!aConstruction.get()) {
581     return;
582   }
583
584   if(aBaseObjectsSelectionList->size() == 0) {
585     aBaseObjectsSelectionList->append(aSketchRes, GeomShapePtr());
586   }
587 }
588
589 void PartSet_WidgetSketchCreator::setEnabledModelWidget(ModuleBase_ModelWidget* theModelWidget,
590                                                         const bool theEnabled)
591 {
592   QList<QWidget*> aMyControls = theModelWidget->getControls();
593   foreach(QWidget*  eachControl, aMyControls) {
594     eachControl->setEnabled(theEnabled);
595   }
596 }