X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=1439438c314fe431a1496e02209fde5369c8fc8a;hb=857b1f72d9703c46c6c8c9bb239821d314344c86;hp=03b29dd75a50a4cc255b261bb270f8bd7b171b29;hpb=8f09d362a50ccbc085841c24af2e755121e458ba;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 03b29dd75..1439438c3 100755 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -32,8 +33,10 @@ #include #include #include -#include +#include +#include +#include #include #include #include @@ -46,7 +49,7 @@ #include #include #include -#include +#include #include #include @@ -197,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); @@ -218,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); } @@ -246,7 +245,8 @@ void PartSet_Module::onOperationCommitted(ModuleBase_Operation* theOperation) mySketchMgr->commitNestedSketch(theOperation); } - if (theOperation->isEditOperation()) + ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + if (!aFOperation || aFOperation->isEditOperation()) return; // the selection is cleared after commit the create operation // in order to do not use the same selected objects in the restarted operation @@ -256,15 +256,15 @@ void PartSet_Module::onOperationCommitted(ModuleBase_Operation* theOperation) aWorkshop->selector()->clearSelection(); /// Restart sketcher operations automatically - FeaturePtr aFeature = theOperation->feature(); + FeaturePtr aFeature = aFOperation->feature(); std::shared_ptr aSPFeature = std::dynamic_pointer_cast(aFeature); if (aSPFeature && (myRestartingMode == RM_LastFeatureUsed || myRestartingMode == RM_EmptyFeatureUsed)) { - myLastOperationId = theOperation->id(); - myLastFeature = myRestartingMode == RM_LastFeatureUsed ? theOperation->feature() : FeaturePtr(); - - launchOperation(myLastOperationId); + myLastOperationId = aFOperation->id(); + myLastFeature = myRestartingMode == RM_LastFeatureUsed ? aFOperation->feature() : FeaturePtr(); + if (!sketchMgr()->sketchSolverError()) + launchOperation(myLastOperationId); } breakOperationSequence(); } @@ -290,12 +290,23 @@ void PartSet_Module::onOperationStarted(ModuleBase_Operation* theOperation) mySketchMgr->startNestedSketch(theOperation); } - myCustomPrs->activate(theOperation->feature()); + ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + if (aFOperation) + 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); @@ -303,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 @@ -355,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 @@ -371,7 +394,8 @@ bool PartSet_Module::canActivateSelection(const ObjectPtr& theObject) const if (isSketchOp || isNestedOp) { // in active sketch operation it is possible to activate operation object in selection // in the edit operation, e.g. points of the line can be moved when the line is edited - aCanActivate = aCanActivate || anOperation->isEditOperation(); + ModuleBase_OperationFeature* aFOperation = dynamic_cast(anOperation); + aCanActivate = aCanActivate || (aFOperation && aFOperation->isEditOperation()); } return aCanActivate; } @@ -399,19 +423,33 @@ bool PartSet_Module::isMouseOverWindow() return mySketchMgr->isMouseOverWindow(); } +void PartSet_Module::closeDocument() +{ + clearViewer(); +} + +void PartSet_Module::clearViewer() +{ + myCustomPrs->clearPrs(); +} + void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) { - ModuleBase_IPropertyPanel* aPanel = theOperation->propertyPanel(); - if (PartSet_SketcherMgr::isSketchOperation(theOperation) && (theOperation->isEditOperation())) { + ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + if (!aFOperation) + return; + + ModuleBase_IPropertyPanel* aPanel = aFOperation->propertyPanel(); + if (PartSet_SketcherMgr::isSketchOperation(aFOperation) && (aFOperation->isEditOperation())) { // we have to manually activate the sketch label in edit mode aPanel->activateWidget(aPanel->modelWidgets().first()); return; } // Restart last operation type - if ((theOperation->id() == myLastOperationId) && myLastFeature) { + if ((aFOperation->id() == myLastOperationId) && myLastFeature) { ModuleBase_ModelWidget* aWgt = aPanel->activeWidget(); - if (theOperation->id().toStdString() == SketchPlugin_Line::ID()) { + if (aFOperation->id().toStdString() == SketchPlugin_Line::ID()) { // Initialise new line with first point equal to end of previous PartSet_WidgetPoint2D* aPnt2dWgt = dynamic_cast(aWgt); if (aPnt2dWgt) { @@ -420,7 +458,7 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) std::dynamic_pointer_cast(aData->attribute(SketchPlugin_Line::END_ID())); if (aPoint) { aPnt2dWgt->setPoint(aPoint->x(), aPoint->y()); - PartSet_Tools::setConstraints(mySketchMgr->activeSketch(), theOperation->feature(), + PartSet_Tools::setConstraints(mySketchMgr->activeSketch(), aFOperation->feature(), aWgt->attributeID(), aPoint->x(), aPoint->y()); aPanel->activateNextWidget(aPnt2dWgt); } @@ -494,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(); } } } @@ -575,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), @@ -584,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 @@ -612,22 +657,26 @@ bool PartSet_Module::deleteObjects() if (aSketchObjects.size() == 0) return true; - // the active nested sketch operation should be aborted unconditionally - if (isNestedOp) - anOperation->abort(); - // 3. start operation QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text(); - aMgr->startOperation(aDescription.toStdString()); + ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction(aDescription, this); + + // the active nested sketch operation should be aborted unconditionally + // 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 + + 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 - aWorkshop->displayer()->updateViewer(); - aMgr->finishOperation(); - } else { + anOpMgr->commitOperation(); + } + else { bool isPartRemoved = false; // Delete part with help of PartSet plugin // TODO: the deleted objects has to be processed by multiselection @@ -643,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; } } @@ -659,24 +715,20 @@ bool PartSet_Module::deleteObjects() void PartSet_Module::onFeatureTriggered() { - SessionPtr aMgr = ModelAPI_Session::get(); - // 1. check whether the delete should be processed in the module - ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); - bool isNestedOp = PartSet_SketcherMgr::isNestedCreateOperation(anOperation); - if (isNestedOp) { - // in case if in the viewer nothing is displayed, the create operation should not be - // comitted even if all values of the feature are initialized - if (!mySketchMgr->canDisplayCurrentCreatedFeature()) { - QAction* aCmd = dynamic_cast(sender()); - //Do nothing on uncheck - if (aCmd->isCheckable() && !aCmd->isChecked()) - return; - - // the action information should be saved before the operation is aborted - // because this abort leads to update command status, which unchecks this action - anOperation->abort(); - - launchOperation(aCmd->data().toString()); + QAction* aCmd = dynamic_cast(sender()); + if (aCmd->isCheckable() && aCmd->isChecked()) { + // 1. check whether the delete should be processed in the module + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); + bool isNestedOp = PartSet_SketcherMgr::isNestedCreateOperation(anOperation); + if (isNestedOp) { + // in case if in the viewer nothing is displayed, the create operation should not be + // comitted even if all values of the feature are initialized + if (!mySketchMgr->canDisplayCurrentCreatedFeature()) { + // the action information should be saved before the operation is aborted + // because this abort leads to update command status, which unchecks this action + anOperation->abort(); + launchOperation(aCmd->data().toString()); + } } } ModuleBase_IModule::onFeatureTriggered(); @@ -700,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) @@ -760,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) @@ -811,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; @@ -831,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")); @@ -842,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")); @@ -856,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)