X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=83f59bfe61bab2cde6132c700e168076a81b57df;hb=571cc113b54efb9fb058a053cd9ac489549a0729;hp=d94e396a6e0cc5f07f361025a851af08daef5463;hpb=2b9a0ebe5b0b562ead8c4516fea9ebdc331e0963;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index d94e396a6..83f59bfe6 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -20,6 +21,7 @@ #include #include #include +#include #include #include @@ -37,6 +39,7 @@ #include #include #include +#include #include #include @@ -52,6 +55,7 @@ //#include #include +#include #include #include @@ -64,6 +68,8 @@ #include #include #include +#include +#include #include #include @@ -96,6 +102,8 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) ModuleBase_IViewer* aViewer = theWshop->viewer(); connect(aViewer, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)), this, SLOT(onKeyRelease(ModuleBase_IViewWindow*, QKeyEvent*))); + + createActions(); } PartSet_Module::~PartSet_Module() @@ -132,10 +140,24 @@ void PartSet_Module::registerFilters() Handle(SelectMgr_Filter) aSelectFilter = new ModuleBase_FilterNoConsructionSubShapes(workshop()); aFactory->registerFilter("NoConstructionSubShapesFilter", new ModuleBase_FilterCustom(aSelectFilter)); + aSelectFilter = new PartSet_FilterSketchEntity(workshop()); + aFactory->registerFilter("SketchEntityFilter", new ModuleBase_FilterCustom(aSelectFilter)); +} + +void PartSet_Module::registerProperties() +{ + Config_PropManager::registerProp("Sketch planes", "planes_size", "Size", Config_Prop::Double, + PLANE_SIZE); + Config_PropManager::registerProp("Sketch planes", "planes_thickness", "Thickness", + Config_Prop::Integer, SKETCH_WIDTH); } void PartSet_Module::operationCommitted(ModuleBase_Operation* theOperation) { + if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { + mySketchMgr->commitNestedSketch(theOperation); + } + if (theOperation->isEditOperation()) return; // the selection is cleared after commit the create operation @@ -173,9 +195,13 @@ void PartSet_Module::operationAborted(ModuleBase_Operation* theOperation) void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation) { - if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) { + if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { mySketchMgr->startSketch(theOperation); } + else if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { + mySketchMgr->startNestedSketch(theOperation); + } + if (myDocumentShapeFilter.IsNull()) myDocumentShapeFilter = new PartSet_GlobalFilter(myWorkshop); myWorkshop->viewer()->addSelectionFilter(myDocumentShapeFilter); @@ -183,24 +209,62 @@ void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation) void PartSet_Module::operationStopped(ModuleBase_Operation* theOperation) { - if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) { + if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { mySketchMgr->stopSketch(theOperation); } + else if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { + mySketchMgr->stopNestedSketch(theOperation); + } myWorkshop->viewer()->removeSelectionFilter(myDocumentShapeFilter); } +ModuleBase_Operation* PartSet_Module::currentOperation() const +{ + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_OperationMgr* anOpMgr = aConnector->workshop()->operationMgr(); + return anOpMgr->currentOperation(); +} + +bool PartSet_Module::canUndo() const +{ + bool aCanUndo = false; + SessionPtr aMgr = ModelAPI_Session::get(); + if (aMgr->hasModuleDocument() && aMgr->canUndo()) { + aCanUndo = !aMgr->isOperation(); + if (!aCanUndo) // check the enable state additionally by sketch manager + aCanUndo = aMgr->canUndo(); + } + return aCanUndo; +} + +bool PartSet_Module::canRedo() const +{ + bool aCanRedo = false; + SessionPtr aMgr = ModelAPI_Session::get(); + if (aMgr->hasModuleDocument() && aMgr->canRedo()) { + aCanRedo = !aMgr->isOperation(); + if (!aCanRedo) // check the enable state additionally by sketch manager + aCanRedo = aMgr->canRedo(); + } + return aCanRedo; +} + bool PartSet_Module::canDisplayObject(const ObjectPtr& theObject) const { bool aCanDisplay = false; + if (!mySketchMgr->canDisplayObject()) + return aCanDisplay; CompositeFeaturePtr aSketchFeature = mySketchMgr->activeSketch(); if (aSketchFeature.get() != NULL) { FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); - if (aFeature.get() != NULL) { + // MPV: the second and third conditions to avoid crash on exit for application + if (aFeature.get() != NULL && aFeature->data().get() && aFeature->data()->isValid()) { if (aFeature == aSketchFeature) { aCanDisplay = false; } - else { + else if (aSketchFeature.get() && aSketchFeature->data().get() && + aSketchFeature->data()->isValid()) { for (int i = 0; i < aSketchFeature->numberOfSubs() && !aCanDisplay; i++) { FeaturePtr aSubFeature = aSketchFeature->subFeature(i); std::list aResults = aSubFeature->results(); @@ -221,11 +285,43 @@ bool PartSet_Module::canDisplayObject(const ObjectPtr& theObject) const return aCanDisplay; } +void PartSet_Module::addViewerItems(QMenu* theMenu) const +{ + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); + if (!PartSet_SketcherMgr::isSketchOperation(anOperation) && + !PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) + return; + + ModuleBase_ISelection* aSelection = myWorkshop->selection(); + QObjectPtrList aObjects = aSelection->selectedPresentations(); + if (aObjects.size() > 0) { + bool hasFeature = false; + foreach(ObjectPtr aObject, aObjects) + { + FeaturePtr aFeature = ModelAPI_Feature::feature(aObject); + if (aFeature.get() != NULL) { + hasFeature = true; + } + } + if (hasFeature) { + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + QAction* anAction = aWorkshop->contextMenuMgr()->action("DELETE_CMD"); + theMenu->addAction(anAction); + } + } + bool isAuxiliary; + if (mySketchMgr->canSetAuxiliary(isAuxiliary)) { + QAction* anAction = action("AUXILIARY_CMD"); + theMenu->addAction(anAction); + anAction->setChecked(isAuxiliary); + } +} + void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) { ModuleBase_IPropertyPanel* aPanel = theOperation->propertyPanel(); - if ((theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) && - (theOperation->isEditOperation())) { + if (PartSet_SketcherMgr::isSketchOperation(theOperation) && (theOperation->isEditOperation())) { // we have to manually activate the sketch label in edit mode aPanel->activateWidget(aPanel->modelWidgets().first()); return; @@ -254,20 +350,17 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) if (theOperation->isEditOperation()) { // TODO: #391 - to be removed std::string aId = theOperation->id().toStdString(); - if (PartSet_SketcherMgr::sketchOperationIdList().contains(QString(aId.c_str()))) { - if ((aId == SketchPlugin_ConstraintRadius::ID()) || - (aId == SketchPlugin_ConstraintLength::ID()) || - (aId == SketchPlugin_ConstraintDistance::ID())) { - // Find and activate widget for management of point for dimension line position - QList aWidgets = aPanel->modelWidgets(); - foreach (ModuleBase_ModelWidget* aWgt, aWidgets) { - PartSet_WidgetPoint2D* aPntWgt = dynamic_cast(aWgt); - if (aPntWgt) { - aPanel->activateWidget(aPntWgt); - return; - } + if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation) && + PartSet_SketcherMgr::isDistanceOperation(theOperation)) { + // Find and activate widget for management of point for dimension line position + QList aWidgets = aPanel->modelWidgets(); + foreach (ModuleBase_ModelWidget* aWgt, aWidgets) { + PartSet_WidgetPoint2D* aPntWgt = dynamic_cast(aWgt); + if (aPntWgt) { + aPanel->activateWidget(aPntWgt); + return; } - } + } } } } @@ -284,7 +377,7 @@ void PartSet_Module::onSelectionChanged() // An edit operation is enable only if the current opeation is the sketch operation if (mySketchMgr->activeSketch()) { if (PartSet_Tools::sketchPlane(mySketchMgr->activeSketch())) - isSketcherOp = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID()); + isSketcherOp = PartSet_SketcherMgr::isSketchOperation(aOperation); } if (isSketcherOp) { // Editing of constraints can be done on selection @@ -320,34 +413,24 @@ void PartSet_Module::onEnterReleased() void PartSet_Module::onOperationActivatedByPreselection() { - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - if (!aOperation) - return; - - // Set final definitions if they are necessary - //propertyPanelDefined(aOperation); + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); + if(anOperation && PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) { + // Set final definitions if they are necessary + //propertyPanelDefined(aOperation); - /// Commit sketcher operations automatically - FeaturePtr aFeature = aOperation->feature(); - std::shared_ptr aSPFeature = - std::dynamic_pointer_cast(aFeature); - if (aSPFeature) { - aOperation->commit(); + /// Commit sketcher operations automatically + anOperation->commit(); } } void PartSet_Module::onNoMoreWidgets() { - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - if (aOperation) { - /// Restart sketcher operations automatically - FeaturePtr aFeature = aOperation->feature(); - std::shared_ptr aSPFeature = - std::dynamic_pointer_cast(aFeature); - if (aSPFeature) { + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); + if (anOperation) { + if (PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) { if (myRestartingMode != RM_Forbided) myRestartingMode = RM_LastFeatureUsed; - aOperation->commit(); + anOperation->commit(); } } } @@ -358,62 +441,201 @@ void PartSet_Module::onVertexSelected() if (aOperation->id().toStdString() == SketchPlugin_Line::ID()) { /// If last line finished on vertex the lines creation sequence has to be break ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget(); const QList& aWidgets = aPanel->modelWidgets(); - if (aWidgets.last() == aPanel->activeWidget()) { - myRestartingMode = RM_Forbided; + QList::const_iterator anIt = aWidgets.begin(), aLast = aWidgets.end(); + bool aFoundWidget = false; + bool aFoundObligatory = false; + for (; anIt != aLast && !aFoundObligatory; anIt++) { + if (!aFoundWidget) + aFoundWidget = *anIt == anActiveWidget; + else + aFoundObligatory = (*anIt)->isObligatory(); } + if (!aFoundObligatory) + myRestartingMode = RM_Forbided; } } -QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* theParent, - Config_WidgetAPI* theWidgetApi, std::string theParentId, - QList& theModelWidgets) +ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* theParent, + Config_WidgetAPI* theWidgetApi, std::string theParentId) { XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); XGUI_Workshop* aWorkshop = aConnector->workshop(); + ModuleBase_ModelWidget* aWgt = NULL; if (theType == "sketch-start-label") { - PartSet_WidgetSketchLabel* aWgt = new PartSet_WidgetSketchLabel(theParent, theWidgetApi, theParentId); - aWgt->setWorkshop(aWorkshop); - connect(aWgt, SIGNAL(planeSelected(const std::shared_ptr&)), + PartSet_WidgetSketchLabel* aLabelWgt = new PartSet_WidgetSketchLabel(theParent, theWidgetApi, theParentId); + aLabelWgt->setWorkshop(aWorkshop); + connect(aLabelWgt, SIGNAL(planeSelected(const std::shared_ptr&)), mySketchMgr, SLOT(onPlaneSelected(const std::shared_ptr&))); - theModelWidgets.append(aWgt); - return aWgt->getControl(); - + aWgt = aLabelWgt; } else if (theType == "sketch-2dpoint_selector") { - PartSet_WidgetPoint2D* aWgt = new PartSet_WidgetPoint2D(theParent, theWidgetApi, theParentId); - aWgt->setWorkshop(aWorkshop); - aWgt->setSketch(mySketchMgr->activeSketch()); + PartSet_WidgetPoint2D* aPointWgt = new PartSet_WidgetPoint2D(theParent, theWidgetApi, theParentId); + aPointWgt->setWorkshop(aWorkshop); + aPointWgt->setSketch(mySketchMgr->activeSketch()); + connect(aPointWgt, SIGNAL(vertexSelected()), this, SLOT(onVertexSelected())); + aWgt = aPointWgt; + } if (theType == "point2ddistance") { + PartSet_WidgetPoint2dDistance* aDistanceWgt = new PartSet_WidgetPoint2dDistance(theParent, theWidgetApi, theParentId); + aDistanceWgt->setWorkshop(aWorkshop); + aDistanceWgt->setSketch(mySketchMgr->activeSketch()); + aWgt = aDistanceWgt; + } if (theType == "sketch_shape_selector") { + PartSet_WidgetShapeSelector* aShapeSelectorWgt = + new PartSet_WidgetShapeSelector(theParent, workshop(), theWidgetApi, theParentId); + aShapeSelectorWgt->setSketcher(mySketchMgr->activeSketch()); + aWgt = aShapeSelectorWgt; + } if (theType == "sketch_constraint_shape_selector") { + PartSet_WidgetConstraintShapeSelector* aConstraintShapeSelectorWgt = + new PartSet_WidgetConstraintShapeSelector(theParent, workshop(), theWidgetApi, theParentId); + aConstraintShapeSelectorWgt->setSketcher(mySketchMgr->activeSketch()); + aWgt = aConstraintShapeSelectorWgt; + } + return aWgt; +} - connect(aWgt, SIGNAL(vertexSelected()), this, SLOT(onVertexSelected())); +void PartSet_Module::createActions() +{ + QAction* anAction; - theModelWidgets.append(aWgt); - return aWgt->getControl(); + anAction = new QAction(tr("Auxiliary"), this); + anAction->setCheckable(true); + addAction("AUXILIARY_CMD", anAction); +} - } if (theType == "point2ddistance") { - PartSet_WidgetPoint2dDistance* aWgt = new PartSet_WidgetPoint2dDistance(theParent, theWidgetApi, theParentId); - aWgt->setWorkshop(aWorkshop); - aWgt->setSketch(mySketchMgr->activeSketch()); +QAction* PartSet_Module::action(const QString& theId) const +{ + if (myActions.contains(theId)) + return myActions[theId]; + return 0; +} - theModelWidgets.append(aWgt); - return aWgt->getControl(); +void PartSet_Module::addAction(const QString& theId, QAction* theAction) +{ + if (myActions.contains(theId)) + qCritical("A command with Id = '%s' already defined!", qPrintable(theId)); + theAction->setData(theId); + connect(theAction, SIGNAL(triggered(bool)), this, SLOT(onAction(bool))); + myActions[theId] = theAction; +} - } if (theType == "sketch_shape_selector") { - PartSet_WidgetShapeSelector* aWgt = - new PartSet_WidgetShapeSelector(theParent, workshop(), theWidgetApi, theParentId); - aWgt->setSketcher(mySketchMgr->activeSketch()); +void PartSet_Module::onAction(bool isChecked) +{ + QAction* aAction = static_cast(sender()); + QString anId = aAction->data().toString(); - theModelWidgets.append(aWgt); - return aWgt->getControl(); + if (anId == "AUXILIARY_CMD") { + mySketchMgr->setAuxiliary(isChecked); + } +} - } if (theType == "sketch_constraint_shape_selector") { - PartSet_WidgetConstraintShapeSelector* aWgt = - new PartSet_WidgetConstraintShapeSelector(theParent, workshop(), theWidgetApi, theParentId); - aWgt->setSketcher(mySketchMgr->activeSketch()); +bool PartSet_Module::deleteObjects() +{ + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); + bool isSketchOp = PartSet_SketcherMgr::isSketchOperation(anOperation), + isNestedOp = PartSet_SketcherMgr::isNestedSketchOperation(anOperation); + if (!isSketchOp && !isNestedOp) + return false; + + // sketch feature should be skipped, only sub-features can be removed + // when sketch operation is active + CompositeFeaturePtr aSketch = mySketchMgr->activeSketch(); + + // selected objects should be collected before the current operation abort because + // the abort leads to selection lost on constraint objects. It can be corrected after #386 issue + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + ModuleBase_ISelection* aSel = aConnector->selection(); + QObjectPtrList aSelectedObj = aSel->selectedPresentations(); + + // if there are no selected objects in the viewer, that means that the selection in another + // place cased this method. It is necessary to return the false value to understande in above + // method that delete is not processed + if (aSelectedObj.count() == 0) + return false; + + if (isNestedOp) + anOperation->abort(); + + // the active nested sketch operation should be aborted unconditionally + if (PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) + anOperation->abort(); + + std::set aRefFeatures; + foreach (ObjectPtr aObj, aSelectedObj) + { + //ResultPartPtr aPart = std::dynamic_pointer_cast(aObj); + //if (aPart) { + // TODO: check for what there is this condition. It is placed here historicaly because + // ther is this condition during remove features. + //} else { + FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); + if (aFeature.get() != NULL) { + aObj->document()->refsToFeature(aFeature, aRefFeatures, false); + } + //} + } - theModelWidgets.append(aWgt); - return aWgt->getControl(); + QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text(); + /** + // according to #355 feature, it is not necessary to inform about dependencies during + // sketch delete operation + // + if (!aRefFeatures.empty()) { + QStringList aRefNames; + std::set::const_iterator anIt = aRefFeatures.begin(), + aLast = aRefFeatures.end(); + for (; anIt != aLast; anIt++) { + FeaturePtr aFeature = (*anIt); + if (aFeature == aSketch) + continue; + aRefNames.append((*anIt)->name().c_str()); + } + if (!aRefNames.empty()) { + QString aNames = aRefNames.join(", "); + aDescription += aNames.prepend(" "); + + QMainWindow* aDesktop = aWorkshop->desktop(); + QMessageBox::StandardButton aRes = QMessageBox::warning( + aDesktop, tr("Delete features"), + QString(tr("Selected features are used in the following features: %1.\ + These features will be deleted also. Would you like to continue?")).arg(aNames), + QMessageBox::No | QMessageBox::Yes, QMessageBox::No); + if (aRes != QMessageBox::Yes) + return; + } + }*/ - } else - return 0; -} + SessionPtr aMgr = ModelAPI_Session::get(); + aMgr->startOperation(aDescription.toStdString()); + std::set::const_iterator anIt = aRefFeatures.begin(), + aLast = aRefFeatures.end(); + for (; anIt != aLast; anIt++) { + FeaturePtr aRefFeature = (*anIt); + if (aRefFeature == aSketch) + continue; + aRefFeature->document()->removeFeature(aRefFeature); + } + foreach (ObjectPtr aObj, aSelectedObj) + { + DocumentPtr aDoc = aObj->document(); + //ResultPartPtr aPart = std::dynamic_pointer_cast(aObj); + //if (aPart) { + // if (aDoc == aMgr->activeDocument()) { + // aDoc->close(); + // } + //} else { + //FeaturePtr aFeature = std::dynamic_pointer_cast(aObj); + FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); + if (aFeature.get() != NULL) { + aDoc->removeFeature(aFeature); + } + //} + } + aWorkshop->displayer()->updateViewer(); + //myDisplayer->updateViewer(); + aMgr->finishOperation(); + + return true; +}