X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=1439438c314fe431a1496e02209fde5369c8fc8a;hb=857b1f72d9703c46c6c8c9bb239821d314344c86;hp=c863177fb495c1dceed15c97976b1fdaeaac5f83;hpb=ace68008dc38022136ba6ed10c7be5e7c8152051;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index c863177fb..1439438c3 100755 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -49,7 +49,7 @@ #include #include #include -#include +#include #include #include @@ -200,15 +200,12 @@ void PartSet_Module::registerValidators() aFactory->registerValidator("PartSet_TangentSelection", new PartSet_TangentSelection); aFactory->registerValidator("PartSet_FilletSelection", new PartSet_FilletSelection); aFactory->registerValidator("PartSet_AngleSelection", new PartSet_AngleSelection); - aFactory->registerValidator("PartSet_DifferentObjects", new PartSet_DifferentObjectsValidator); - aFactory->registerValidator("PartSet_DifferentShapes", new ModelAPI_ShapeValidator); - aFactory->registerValidator("PartSet_CoincidentAttr", new PartSet_CoincidentAttr); + aFactory->registerValidator("GeomValidators_DifferentShapes", new GeomValidators_DifferentShapes); aFactory->registerValidator("GeomValidators_ShapeType", new GeomValidators_ShapeType); aFactory->registerValidator("GeomValidators_Face", new GeomValidators_Face); - aFactory->registerValidator("GeomValidators_Finite", new GeomValidators_Finite); aFactory->registerValidator("GeomValidators_ConstructionComposite", @@ -223,9 +220,6 @@ void PartSet_Module::registerValidators() aFactory->registerValidator("PartSet_SketchEntityValidator", new PartSet_SketchEntityValidator); - aFactory->registerValidator("PartSet_SameTypeAttr", - new PartSet_SameTypeAttrValidator); - aFactory->registerValidator("GeomValidators_Different", new GeomValidators_Different); } @@ -269,8 +263,8 @@ void PartSet_Module::onOperationCommitted(ModuleBase_Operation* theOperation) myRestartingMode == RM_EmptyFeatureUsed)) { myLastOperationId = aFOperation->id(); myLastFeature = myRestartingMode == RM_LastFeatureUsed ? aFOperation->feature() : FeaturePtr(); - - launchOperation(myLastOperationId); + if (!sketchMgr()->sketchSolverError()) + launchOperation(myLastOperationId); } breakOperationSequence(); } @@ -298,12 +292,21 @@ void PartSet_Module::onOperationStarted(ModuleBase_Operation* theOperation) ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); if (aFOperation) - myCustomPrs->activate(aFOperation->feature()); + myCustomPrs->activate(aFOperation->feature(), true); +} + +void PartSet_Module::onOperationResumed(ModuleBase_Operation* theOperation) +{ + ModuleBase_IModule::onOperationResumed(theOperation); + + ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + if (aFOperation) + myCustomPrs->activate(aFOperation->feature(), true); } void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) { - myCustomPrs->deactivate(); + bool isModified = myCustomPrs->deactivate(false); if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { mySketchMgr->stopSketch(theOperation); @@ -311,6 +314,12 @@ void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) else if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { mySketchMgr->stopNestedSketch(theOperation); } + + if (isModified) { + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); + aDisplayer->updateViewer(); + } } ModuleBase_Operation* PartSet_Module::currentOperation() const @@ -523,7 +532,12 @@ void PartSet_Module::onNoMoreWidgets() if (PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) { if (myRestartingMode != RM_Forbided) myRestartingMode = RM_LastFeatureUsed; - anOperation->commit(); + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + XGUI_OperationMgr* anOpMgr = aWorkshop->operationMgr(); + // do nothing if the feature can not be applyed + if (anOpMgr->isApplyEnabled()) + anOperation->commit(); } } } @@ -604,7 +618,11 @@ ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& th bool PartSet_Module::deleteObjects() { - SessionPtr aMgr = ModelAPI_Session::get(); + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + XGUI_OperationMgr* anOpMgr = aWorkshop->operationMgr(); + + //SessionPtr aMgr = ModelAPI_Session::get(); // 1. check whether the delete should be processed in the module ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); bool isSketchOp = PartSet_SketcherMgr::isSketchOperation(anOperation), @@ -613,8 +631,6 @@ bool PartSet_Module::deleteObjects() // 2. find selected presentations // 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 = workshop()->selection(); QObjectPtrList aSelectedObj = aSel->selectedPresentations(); // if there are no selected objects in the viewer, that means that the selection in another @@ -643,25 +659,24 @@ bool PartSet_Module::deleteObjects() // 3. start operation QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text(); - ModuleBase_OperationAction* anAction = new ModuleBase_OperationAction(aDescription, this); + ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction(aDescription, this); - XGUI_OperationMgr* anOpMgr = aConnector->workshop()->operationMgr(); // the active nested sketch operation should be aborted unconditionally - if (isSketchOp) - anOperation->addGrantedOperationId(anAction->id()); - if (!anOpMgr->canStartOperation(anAction->id())) + // the Delete action should be additionally granted for the Sketch operation + // in order to do not abort/commit it + if (!anOpMgr->canStartOperation(anOpAction->id(), isSketchOp/*granted*/)) return true; // the objects are processed but can not be deleted - if (isSketchOp) - anOperation->removeGrantedOperationId(anAction->id()); - anOpMgr->startOperation(anAction); + anOpMgr->startOperation(anOpAction); + // 4. delete features // sketch feature should be skipped, only sub-features can be removed // when sketch operation is active aWorkshop->deleteFeatures(aSketchObjects); // 5. stop operation anOpMgr->commitOperation(); - } else { + } + else { bool isPartRemoved = false; // Delete part with help of PartSet plugin // TODO: the deleted objects has to be processed by multiselection @@ -677,10 +692,17 @@ bool PartSet_Module::deleteObjects() std::dynamic_pointer_cast(aPartResult); DocumentPtr aPartDoc = aPart->partDoc(); if (aPartDoc.get()) { - aMgr->startOperation(PartSetPlugin_Remove::ID()); + ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction + (PartSetPlugin_Remove::ID().c_str(), this); + if (!anOpMgr->canStartOperation(anOpAction->id())) + return true; // the objects are processed but can not be deleted + + anOpMgr->startOperation(anOpAction); + FeaturePtr aFeature = aPartDoc->addFeature(PartSetPlugin_Remove::ID()); aFeature->execute(); - aMgr->finishOperation(); + + anOpMgr->commitOperation(); isPartRemoved = true; } } @@ -730,10 +752,11 @@ void PartSet_Module::onObjectDisplayed(ObjectPtr theObject, AISObjectPtr theAIS) void PartSet_Module::onBeforeObjectErase(ObjectPtr theObject, AISObjectPtr theAIS) { + // this is obsolete // it should be recomputed in order to disappear in the viewer if the corresponded object // is erased - if (myCustomPrs->isActive()) - myCustomPrs->customize(theObject); + //if (myCustomPrs->isActive()) + // myCustomPrs->redisplay(theObject, false); } void PartSet_Module::onViewTransformed(int theTrsfType) @@ -790,10 +813,13 @@ void PartSet_Module::onViewTransformed(int theTrsfType) aDisplayer->updateViewer(); } -void PartSet_Module::customizeObject(ObjectPtr theObject) +bool PartSet_Module::customizeObject(ObjectPtr theObject, const bool theUpdateViewer) { + bool isRedisplayed = false; if (myCustomPrs->isActive()) - myCustomPrs->customize(theObject); + isRedisplayed = myCustomPrs->redisplay(theObject, theUpdateViewer); + + return isRedisplayed; } void PartSet_Module::customizeObjectBrowser(QWidget* theObjectBrowser) @@ -841,6 +867,7 @@ void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const QObjectPtrList aObjects = myWorkshop->selection()->selectedObjects(); int aSelected = aObjects.size(); SessionPtr aMgr = ModelAPI_Session::get(); + QAction* aActivatePartAction = myMenuMgr->action("ACTIVATE_PART_CMD"); if (aSelected == 1) { bool hasResult = false; bool hasFeature = false; @@ -861,10 +888,10 @@ void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const } if (aPart.get()) // this may be null is Part feature is disabled aPartDoc = aPart->partDoc(); - if (aMgr->activeDocument() == aPartDoc) - theMenu->addAction(myMenuMgr->action("DEACTIVATE_PART_CMD")); - else - theMenu->addAction(myMenuMgr->action("ACTIVATE_PART_CMD")); + + theMenu->addAction(aActivatePartAction); + aActivatePartAction->setEnabled((aMgr->activeDocument() != aPartDoc)); + } else if (aObject->document() == aMgr->activeDocument()) { if (hasParameter || hasFeature) theMenu->addAction(myMenuMgr->action("EDIT_CMD")); @@ -872,9 +899,7 @@ void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const ResultBodyPtr aResult = std::dynamic_pointer_cast(aObject); if( aResult.get() ) - { theMenu->addAction(myMenuMgr->action("SELECT_PARENT_CMD")); - } } else { // If feature is 0 the it means that selected root object (document) if (aMgr->activeDocument() != aMgr->moduleDocument()) theMenu->addAction(myMenuMgr->action("ACTIVATE_PARTSET_CMD")); @@ -886,10 +911,10 @@ void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const if (aMgr->activeDocument() != aMgr->moduleDocument()) theMenu->addAction(myMenuMgr->action("ACTIVATE_PARTSET_CMD")); } - bool aCanDeactivate = (myWorkshop->currentOperation() == 0); - myMenuMgr->action("ACTIVATE_PARTSET_CMD")->setEnabled(aCanDeactivate); - myMenuMgr->action("DEACTIVATE_PART_CMD")->setEnabled(aCanDeactivate); - myMenuMgr->action("ACTIVATE_PART_CMD")->setEnabled(aCanDeactivate); + bool aNotDeactivate = (myWorkshop->currentOperation() == 0); + myMenuMgr->action("ACTIVATE_PARTSET_CMD")->setEnabled(aNotDeactivate); + if (!aNotDeactivate) + aActivatePartAction->setEnabled(false); } void PartSet_Module::processEvent(const std::shared_ptr& theMessage)