X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=1439438c314fe431a1496e02209fde5369c8fc8a;hb=857b1f72d9703c46c6c8c9bb239821d314344c86;hp=3731b80fd3ee57b3c3dad0a482aaef03b4c7f8ac;hpb=7bb747315debb04bb5d709e8e4663859a20dfd29;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 3731b80fd..1439438c3 100755 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -36,6 +36,7 @@ #include #include +#include #include #include #include @@ -48,7 +49,7 @@ #include #include #include -#include +#include #include #include @@ -199,14 +200,13 @@ 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", new GeomValidators_ConstructionComposite); @@ -220,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); } @@ -266,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(); } @@ -295,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); @@ -308,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 @@ -360,6 +372,12 @@ bool PartSet_Module::canCommitOperation() const return mySketchMgr->canCommitOperation(); } +bool PartSet_Module::canEraseObject(const ObjectPtr& theObject) const +{ + // the sketch manager put the restriction to the objects erase + return mySketchMgr->canEraseObject(theObject); +} + bool PartSet_Module::canDisplayObject(const ObjectPtr& theObject) const { // the sketch manager put the restriction to the objects display @@ -514,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(); } } } @@ -595,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), @@ -604,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 @@ -634,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 @@ -668,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; } } @@ -721,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) @@ -781,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) @@ -832,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; @@ -852,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")); @@ -863,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")); @@ -877,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)