X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=9b380a839de031128e1b0311af90b67a7373f389;hb=24f9658d6e124a268c6a3abcf24f07aa2dc6d268;hp=0ea84ee283cb821bf2bb941df7413fb57c6a4c6f;hpb=1a03e0f323e0c5133085557f8a9f7ad626e11dfa;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp old mode 100644 new mode 100755 index 0ea84ee28..9b380a839 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -4,9 +4,9 @@ #include "PartSet_WidgetSketchLabel.h" #include "PartSet_Validators.h" #include "PartSet_Tools.h" -#include "ModuleBase_WidgetValidated.h" #include "PartSet_WidgetPoint2d.h" #include "PartSet_WidgetPoint2dDistance.h" +#include "PartSet_WidgetPoint2DFlyout.h" #include "PartSet_WidgetShapeSelector.h" #include "PartSet_WidgetPoint2dAngle.h" #include "PartSet_WidgetMultiSelector.h" @@ -14,8 +14,11 @@ #include "PartSet_WidgetFileSelector.h" #include "PartSet_WidgetSketchCreator.h" #include "PartSet_SketcherMgr.h" +#include "PartSet_SketcherReetntrantMgr.h" #include "PartSet_MenuMgr.h" -#include +#include "PartSet_CustomPrs.h" +#include "PartSet_IconFactory.h" +#include "PartSet_WidgetChoice.h" #include "PartSet_Filters.h" #include "PartSet_FilterInfinite.h" @@ -25,27 +28,23 @@ #include #include +#include #include #include #include #include +#include #include #include -#include - -#include -#include -#include -#include -#include - +#include #include #include #include #include #include -#include +#include +#include #include #include @@ -60,13 +59,12 @@ #include #include #include +#include +#include #include #include -#include -#include -#include -#include +#include #include #include #include @@ -105,8 +103,6 @@ #include #endif - - /*!Create and return new instance of XGUI_Module*/ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop) { @@ -114,17 +110,18 @@ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* } PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) - : ModuleBase_IModule(theWshop), - myRestartingMode(RM_None), myVisualLayerId(0) +: ModuleBase_IModule(theWshop), + myVisualLayerId(0), myHasConstraintShown(true) { + new PartSet_IconFactory(); + mySketchMgr = new PartSet_SketcherMgr(this); - myDataModel = new PartSet_DocumentDataModel(this); + mySketchReentrantMgr = new PartSet_SketcherReetntrantMgr(theWshop); XGUI_ModuleConnector* aConnector = dynamic_cast(theWshop); XGUI_Workshop* aWorkshop = aConnector->workshop(); XGUI_OperationMgr* anOpMgr = aWorkshop->operationMgr(); - connect(anOpMgr, SIGNAL(keyEnterReleased()), this, SLOT(onEnterReleased())); connect(anOpMgr, SIGNAL(operationActivatedByPreselection()), this, SLOT(onOperationActivatedByPreselection())); @@ -133,6 +130,8 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) this, SLOT(onKeyRelease(ModuleBase_IViewWindow*, QKeyEvent*))); connect(aViewer, SIGNAL(viewTransformed(int)), SLOT(onViewTransformed(int))); + connect(aViewer, SIGNAL(viewCreated(ModuleBase_IViewWindow*)), + SLOT(onViewCreated(ModuleBase_IViewWindow*))); myMenuMgr = new PartSet_MenuMgr(this); myCustomPrs = new PartSet_CustomPrs(theWshop); @@ -190,30 +189,11 @@ void PartSet_Module::registerValidators() aFactory->registerValidator("PartSet_HVDirSelection", new PartSet_HVDirSelection); aFactory->registerValidator("PartSet_TangentSelection", new PartSet_TangentSelection); aFactory->registerValidator("PartSet_FilletSelection", new PartSet_FilletSelection); - + aFactory->registerValidator("PartSet_AngleSelection", new PartSet_AngleSelection); + aFactory->registerValidator("PartSet_EqualSelection", new PartSet_EqualSelection); aFactory->registerValidator("PartSet_DifferentObjects", new PartSet_DifferentObjectsValidator); - aFactory->registerValidator("PartSet_DifferentShapes", new ModelAPI_ShapeValidator); - - aFactory->registerValidator("GeomValidators_ShapeType", new GeomValidators_ShapeType); - aFactory->registerValidator("GeomValidators_Face", new GeomValidators_Face); - - aFactory->registerValidator("GeomValidators_ConstructionComposite", - new GeomValidators_ConstructionComposite); - - aFactory->registerValidator("GeomValidators_ZeroOffset", - new GeomValidators_ZeroOffset); - - aFactory->registerValidator("GeomValidators_BooleanArguments", - new GeomValidators_BooleanArguments); - - aFactory->registerValidator("PartSet_SketchEntityValidator", - new PartSet_SketchEntityValidator); - - aFactory->registerValidator("PartSet_SameTypeAttr", - new PartSet_SameTypeAttrValidator); - - aFactory->registerValidator("GeomValidators_Different", - new GeomValidators_Different); + aFactory->registerValidator("PartSet_CoincidentAttr", new PartSet_CoincidentAttr); + aFactory->registerValidator("PartSet_SketchEntityValidator", new PartSet_SketchEntityValidator); } void PartSet_Module::registerFilters() @@ -229,55 +209,46 @@ void PartSet_Module::registerProperties() PLANE_SIZE); Config_PropManager::registerProp("Sketch planes", "planes_thickness", "Thickness", Config_Prop::Integer, SKETCH_WIDTH); + Config_PropManager::registerProp("Sketch planes", "rotate_to_plane", "Rotate to plane when selected", + Config_Prop::Boolean, "false"); } -void PartSet_Module::onOperationCommitted(ModuleBase_Operation* theOperation) +void PartSet_Module::connectToPropertyPanel(ModuleBase_ModelWidget* theWidget, const bool isToConnect) +{ + mySketchMgr->connectToPropertyPanel(theWidget, isToConnect); +} + +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 - // in order to do not use the same selected objects in the restarted operation - // for common behaviour, the selection is cleared even if the operation is not restarted - XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); - XGUI_Workshop* aWorkshop = aConnector->workshop(); - aWorkshop->selector()->clearSelection(); - /// Restart sketcher operations automatically - FeaturePtr aFeature = theOperation->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); + if (!mySketchReentrantMgr->operationCommitted(theOperation)) { + + ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + if (aFOperation && !aFOperation->isEditOperation()) { + // the selection is cleared after commit the create operation + // in order to do not use the same selected objects in the restarted operation + // for common behaviour, the selection is cleared even if the operation is not restarted + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + aWorkshop->selector()->clearSelection(); + } } - breakOperationSequence(); -} - -void PartSet_Module::breakOperationSequence() -{ - myLastOperationId = ""; - myLastFeature = FeaturePtr(); - myRestartingMode = RM_None; } -void PartSet_Module::onOperationAborted(ModuleBase_Operation* theOperation) +void PartSet_Module::operationAborted(ModuleBase_Operation* theOperation) { - breakOperationSequence(); + /// Restart sketcher operations automatically + mySketchReentrantMgr->operationAborted(theOperation); } -void PartSet_Module::onOperationStarted(ModuleBase_Operation* theOperation) +void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation) { - // z layer is created for all started operations in order to visualize operation AIS presentation - // over the object - Handle(V3d_Viewer) aViewer = myWorkshop->viewer()->AISContext()->CurrentViewer(); - aViewer->AddZLayer(myVisualLayerId); + /// Restart sketcher operations automatically + mySketchReentrantMgr->operationStarted(theOperation); if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { mySketchMgr->startSketch(theOperation); @@ -286,17 +257,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::onOperationStopped(ModuleBase_Operation* theOperation) +void PartSet_Module::operationResumed(ModuleBase_Operation* theOperation) { - // the custom presentation should be deactivated before stop sketch, - // because it uses the active sketch of the sketch manager without checking if it is not null - Handle(V3d_Viewer) aViewer = myWorkshop->viewer()->AISContext()->CurrentViewer(); - aViewer->RemoveZLayer(myVisualLayerId); - myVisualLayerId = 0; - myCustomPrs->deactivate(); + ModuleBase_IModule::operationResumed(theOperation); + + ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + if (aFOperation) + myCustomPrs->activate(aFOperation->feature(), true); +} + +void PartSet_Module::operationStopped(ModuleBase_Operation* theOperation) +{ + bool isModified = myCustomPrs->deactivate(false); if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { mySketchMgr->stopSketch(theOperation); @@ -304,6 +281,14 @@ void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) else if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { mySketchMgr->stopNestedSketch(theOperation); } + + //VSV: Viewer is updated on feature update and redisplay + //if (isModified) { + // XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + // XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); + // aDisplayer->updateViewer(); + //} + mySketchMgr->onShowConstraintsToggle(myHasConstraintShown); } ModuleBase_Operation* PartSet_Module::currentOperation() const @@ -337,9 +322,24 @@ bool PartSet_Module::canRedo() const return aCanRedo; } -bool PartSet_Module::canCommitOperation() const +bool PartSet_Module::canApplyAction(const ObjectPtr& theObject, const QString& theActionId) const { - return mySketchMgr->canCommitOperation(); + bool aValid = true; + if (theActionId == "DELETE_CMD" || theActionId == "MOVE_CMD") { + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + if (aFeature) { + // part features are removed in the PartSet module only. + if (aFeature->getKind() == PartSetPlugin_Part::ID()) + aValid = false; + } + } + return aValid; +} + +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 @@ -358,7 +358,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; } @@ -368,6 +369,33 @@ bool PartSet_Module::addViewerMenu(QMenu* theMenu, const QMap return myMenuMgr->addViewerMenu(theMenu, theStdActions); } +void PartSet_Module::updateViewerMenu(const QMap& theStdActions) +{ + myMenuMgr->updateViewerMenu(theStdActions); +} + +QString PartSet_Module::getFeatureError(const FeaturePtr& theFeature) +{ + QString anError = ModuleBase_IModule::getFeatureError(theFeature); + if (anError.isEmpty()) + anError = sketchMgr()->getFeatureError(theFeature); + + return anError; +} + +void PartSet_Module::grantedOperationIds(ModuleBase_Operation* theOperation, + QStringList& theIds) const +{ + myMenuMgr->grantedOperationIds(theOperation, theIds); + + if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + + theIds.append(aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text()); + } +} + void PartSet_Module::activeSelectionModes(QIntList& theModes) { theModes.clear(); @@ -380,34 +408,31 @@ bool PartSet_Module::isMouseOverWindow() return mySketchMgr->isMouseOverWindow(); } +void PartSet_Module::closeDocument() +{ + clearViewer(); +} + +void PartSet_Module::clearViewer() +{ + myCustomPrs->clearPrs(); + + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + XGUI_Displayer* aDisplayer = aWorkshop->displayer(); + aDisplayer->deactivateSelectionFilters(); +} + void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) { - ModuleBase_IPropertyPanel* aPanel = theOperation->propertyPanel(); - if (PartSet_SketcherMgr::isSketchOperation(theOperation) && (theOperation->isEditOperation())) { - // we have to manually activate the sketch label in edit mode - aPanel->activateWidget(aPanel->modelWidgets().first()); - return; - } + ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + if (!aFOperation) + return; - // Restart last operation type - if ((theOperation->id() == myLastOperationId) && myLastFeature) { - ModuleBase_ModelWidget* aWgt = aPanel->activeWidget(); - if (theOperation->id().toStdString() == SketchPlugin_Line::ID()) { - // Initialise new line with first point equal to end of previous - PartSet_WidgetPoint2D* aPnt2dWgt = dynamic_cast(aWgt); - if (aPnt2dWgt) { - std::shared_ptr aData = myLastFeature->data(); - std::shared_ptr aPoint = - 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(), - aWgt->attributeID(), aPoint->x(), aPoint->y()); - aPanel->activateNextWidget(aPnt2dWgt); - } - } - } - } + ModuleBase_IPropertyPanel* aPanel = aFOperation->propertyPanel(); + // we have to manually activate the sketch label in edit mode + if (PartSet_SketcherMgr::isSketchOperation(aFOperation) && (aFOperation->isEditOperation())) + aPanel->activateWidget(aPanel->modelWidgets().first()); } @@ -435,7 +460,8 @@ void PartSet_Module::onSelectionChanged() std::string aId = aFeature->getKind(); if ((aId == SketchPlugin_ConstraintRadius::ID()) || (aId == SketchPlugin_ConstraintLength::ID()) || - (aId == SketchPlugin_ConstraintDistance::ID())) { + (aId == SketchPlugin_ConstraintDistance::ID()) || + (aId == SketchPlugin_ConstraintAngle::ID())) { editFeature(aFeature); } } @@ -450,13 +476,11 @@ void PartSet_Module::onKeyRelease(ModuleBase_IViewWindow* theWnd, QKeyEvent* the anOpMgr->onKeyReleased(theEvent); } -void PartSet_Module::onEnterReleased() -{ - myRestartingMode = RM_EmptyFeatureUsed; -} - void PartSet_Module::onOperationActivatedByPreselection() { + if (!mySketchReentrantMgr->canBeCommittedByPreselection()) + return; + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); if(anOperation && PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) { // Set final definitions if they are necessary @@ -467,40 +491,6 @@ void PartSet_Module::onOperationActivatedByPreselection() } } -void PartSet_Module::onNoMoreWidgets() -{ - ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); - if (anOperation) { - if (PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) { - if (myRestartingMode != RM_Forbided) - myRestartingMode = RM_LastFeatureUsed; - anOperation->commit(); - } - } -} - -void PartSet_Module::onVertexSelected() -{ - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - 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(); - 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; - } -} - ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* theParent, Config_WidgetAPI* theWidgetApi, std::string theParentId) { @@ -520,7 +510,13 @@ ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& th PartSet_WidgetPoint2D* aPointWgt = new PartSet_WidgetPoint2D(theParent, aWorkshop, theWidgetApi, theParentId); aPointWgt->setSketch(mySketchMgr->activeSketch()); - connect(aPointWgt, SIGNAL(vertexSelected()), this, SLOT(onVertexSelected())); + connect(aPointWgt, SIGNAL(vertexSelected()), sketchReentranceMgr(), SLOT(onVertexSelected())); + aWgt = aPointWgt; + } else if (theType == "sketch-2dpoint_flyout_selector") { + PartSet_WidgetPoint2DFlyout* aPointWgt = new PartSet_WidgetPoint2DFlyout(theParent, aWorkshop, + theWidgetApi, theParentId); + aPointWgt->setSketch(mySketchMgr->activeSketch()); + connect(aPointWgt, SIGNAL(vertexSelected()), sketchReentranceMgr(), SLOT(onVertexSelected())); aWgt = aPointWgt; } else if (theType == "point2ddistance") { PartSet_WidgetPoint2dDistance* aDistanceWgt = new PartSet_WidgetPoint2dDistance(theParent, @@ -548,14 +544,35 @@ ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& th aWgt = new PartSet_WidgetFileSelector(theParent, aWorkshop, theWidgetApi, theParentId); } else if (theType == "sketch_launcher") { aWgt = new PartSet_WidgetSketchCreator(theParent, this, theWidgetApi, theParentId); + } else if (theType == "module_choice") { + aWgt = new PartSet_WidgetChoice(theParent, theWidgetApi, theParentId); + connect(aWgt, SIGNAL(itemSelected(int)), SLOT(onBooleanOperationChange(int))); } return aWgt; } +ModuleBase_ModelWidget* PartSet_Module::activeWidget() const +{ + ModuleBase_ModelWidget* anActiveWidget = 0; + + anActiveWidget = mySketchReentrantMgr->internalActiveWidget(); + if (!anActiveWidget) { + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (aOperation) { + ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + anActiveWidget = aPanel->activeWidget(); + } + } + return anActiveWidget; +} 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), @@ -564,8 +581,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 @@ -592,25 +607,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())) + 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 - std::set anIgnoredFeatures; - anIgnoredFeatures.insert(mySketchMgr->activeSketch()); - aWorkshop->deleteFeatures(aSketchObjects, anIgnoredFeatures); - + 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 @@ -626,10 +642,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; } } @@ -642,29 +665,36 @@ 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(); } +void PartSet_Module::launchOperation(const QString& theCmdId) +{ + if (PartSet_SketcherMgr::constraintsIdList().contains(theCmdId)) { + // Show constraints if a constraint was anOperation + myHasConstraintShown = mySketchMgr->isConstraintsShown(); + mySketchMgr->onShowConstraintsToggle(true); + } + ModuleBase_IModule::launchOperation(theCmdId); +} + + void PartSet_Module::onObjectDisplayed(ObjectPtr theObject, AISObjectPtr theAIS) { Handle(AIS_InteractiveObject) anAIS = theAIS->impl(); @@ -681,21 +711,31 @@ 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->redisplay(theObject, false); +} + void PartSet_Module::onViewTransformed(int theTrsfType) { // Set length of arrows constant in pixel size // if the operation is panning or rotate or panglobal then do nothing if ((theTrsfType == 1) || (theTrsfType == 3) || (theTrsfType == 4)) return; - ModuleBase_IViewer* aViewer = myWorkshop->viewer(); + Handle(AIS_InteractiveContext) aContext = aViewer->AISContext(); + if (aContext.IsNull()) + return; + //Handle(V3d_View) aView = aViewer->activeView(); XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); XGUI_Workshop* aWorkshop = aConnector->workshop(); XGUI_Displayer* aDisplayer = aWorkshop->displayer(); - Handle(AIS_InteractiveContext) aContext = aViewer->AISContext(); - Handle(V3d_Viewer) aV3dViewer = aContext->CurrentViewer(); Handle(V3d_View) aView; double aScale = 0; @@ -735,30 +775,49 @@ 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) { XGUI_ObjectsBrowser* aOB = dynamic_cast(theObjectBrowser); if (aOB) { - QLineEdit* aLabel = aOB->activeDocLabel(); - QPalette aPalet = aLabel->palette(); - aPalet.setColor(QPalette::Text, QColor(0, 72, 140)); - aLabel->setPalette(aPalet); + QLabel* aLabel = aOB->activeDocLabel(); + aLabel->installEventFilter(myMenuMgr); + connect(aLabel, SIGNAL(customContextMenuRequested(const QPoint&)), + SLOT(onActiveDocPopup(const QPoint&))); + //QPalette aPalet = aLabel->palette(); + //aPalet.setColor(QPalette::Text, QColor(0, 72, 140)); + //aLabel->setPalette(aPalet); aOB->treeView()->setExpandsOnDoubleClick(false); connect(aOB->treeView(), SIGNAL(doubleClicked(const QModelIndex&)), SLOT(onTreeViewDoubleClick(const QModelIndex&))); - connect(aOB, SIGNAL(headerMouseDblClicked(const QModelIndex&)), - SLOT(onTreeViewDoubleClick(const QModelIndex&))); - connect(aOB->treeView(), SIGNAL(doubleClicked(const QModelIndex&)), - myDataModel, SLOT(onMouseDoubleClick(const QModelIndex&))); } } +void PartSet_Module::onActiveDocPopup(const QPoint& thePnt) +{ + SessionPtr aMgr = ModelAPI_Session::get(); + QAction* aActivatePartAction = myMenuMgr->action("ACTIVATE_PARTSET_CMD"); + + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + QLabel* aHeader = aWorkshop->objectBrowser()->activeDocLabel(); + + aActivatePartAction->setEnabled((aMgr->activeDocument() != aMgr->moduleDocument())); + + QMenu aMenu; + aMenu.addAction(aActivatePartAction); + aMenu.exec(aHeader->mapToGlobal(thePnt)); +} + + ObjectPtr PartSet_Module::findPresentedObject(const AISObjectPtr& theAIS) const { ObjectPtr anObject; @@ -784,6 +843,9 @@ 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"); + + ModuleBase_Operation* aCurrentOp = myWorkshop->currentOperation(); if (aSelected == 1) { bool hasResult = false; bool hasFeature = false; @@ -794,39 +856,40 @@ void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const ObjectPtr aObject = aObjects.first(); if (aObject) { ResultPartPtr aPart = std::dynamic_pointer_cast(aObject); - FeaturePtr aPartFeature = std::dynamic_pointer_cast(aObject); + FeaturePtr aFeature = std::dynamic_pointer_cast(aObject); bool isPart = aPart.get() || - (aPartFeature.get() && (aPartFeature->getKind() == PartSetPlugin_Part::ID())); + (aFeature.get() && (aFeature->getKind() == PartSetPlugin_Part::ID())); if (isPart) { DocumentPtr aPartDoc; if (!aPart.get()) { - aPart = std::dynamic_pointer_cast(aPartFeature->firstResult()); + aPart = std::dynamic_pointer_cast(aFeature->firstResult()); } 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) + if (hasParameter || hasFeature) { + myMenuMgr->action("EDIT_CMD")->setEnabled(true); theMenu->addAction(myMenuMgr->action("EDIT_CMD")); + if (aCurrentOp && aFeature.get()) { + if (aCurrentOp->id().toStdString() == aFeature->getKind()) + myMenuMgr->action("EDIT_CMD")->setEnabled(false); + } + } } - } 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")); + + ResultBodyPtr aResult = std::dynamic_pointer_cast(aObject); + if( aResult.get() ) + theMenu->addAction(myMenuMgr->action("SELECT_PARENT_CMD")); } - } else if (aSelected == 0) { - // if there is no selection then it means that upper label is selected - QModelIndexList aIndexes = myWorkshop->selection()->selectedIndexes(); - if (aIndexes.size() == 0) // it means that selection happens in top label outside of tree view - 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 = (aCurrentOp == 0); + if (!aNotDeactivate) { + aActivatePartAction->setEnabled(false); + } } void PartSet_Module::processEvent(const std::shared_ptr& theMessage) @@ -845,42 +908,32 @@ void PartSet_Module::processEvent(const std::shared_ptr& theMess XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); XGUI_Workshop* aWorkshop = aConnector->workshop(); XGUI_DataTree* aTreeView = aWorkshop->objectBrowser()->treeView(); - QLineEdit* aLabel = aWorkshop->objectBrowser()->activeDocLabel(); + QLabel* aLabel = aWorkshop->objectBrowser()->activeDocLabel(); QPalette aPalet = aLabel->palette(); SessionPtr aMgr = ModelAPI_Session::get(); DocumentPtr aActiveDoc = aMgr->activeDocument(); - DocumentPtr aDoc = aMgr->moduleDocument(); - QModelIndex aOldIndex = myDataModel->activePartTree(); - if (aActiveDoc == aDoc) { - if (aOldIndex.isValid()) - aTreeView->setExpanded(aOldIndex, false); - myDataModel->deactivatePart(); - aPalet.setColor(QPalette::Text, QColor(0, 72, 140)); - } else { - std::string aGrpName = ModelAPI_ResultPart::group(); - for (int i = 0; i < aDoc->size(aGrpName); i++) { - ResultPartPtr aPart = std::dynamic_pointer_cast(aDoc->object(aGrpName, i)); - if (aPart->partDoc() == aActiveDoc) { - QModelIndex aIndex = myDataModel->partIndex(aPart); - if (myDataModel->activatePart(aIndex)) { - if (aOldIndex.isValid()) - aTreeView->setExpanded(aOldIndex, false); - aTreeView->setExpanded(myDataModel->activePartTree(), true); - aPalet.setColor(QPalette::Text, Qt::black); - } - break; - } - } - } + if (aActivePartIndex.isValid()) + aTreeView->setExpanded(aActivePartIndex, false); + XGUI_DataModel* aDataModel = aWorkshop->objectBrowser()->dataModel(); + aActivePartIndex = aDataModel->documentRootIndex(aActiveDoc); + if (aActivePartIndex.isValid()) + aTreeView->setExpanded(aActivePartIndex, true); + aLabel->setPalette(aPalet); aWorkshop->updateCommandStatus(); // Update displayed objects in order to update active color XGUI_Displayer* aDisplayer = aWorkshop->displayer(); QObjectPtrList aObjects = aDisplayer->displayedObjects(); - foreach(ObjectPtr aObj, aObjects) - aDisplayer->redisplay(aObj, false); + bool aHidden; + foreach(ObjectPtr aObj, aObjects) { + //TODO: replace by redisplay event. + aHidden = !aObj->data() || !aObj->data()->isValid() || + aObj->isDisabled() || (!aObj->isDisplayed()); + if (!aHidden) + aDisplayer->redisplay(aObj, false); + } aDisplayer->updateViewer(); } } @@ -896,7 +949,15 @@ void PartSet_Module::onTreeViewDoubleClick(const QModelIndex& theIndex) } if (theIndex.column() != 0) // Use only first column return; - ObjectPtr aObj = myDataModel->object(theIndex); + + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + XGUI_DataModel* aDataModel = aWorkshop->objectBrowser()->dataModel(); + // De not use non editable Indexes + if ((aDataModel->flags(theIndex) & Qt::ItemIsSelectable) == 0) + return; + ObjectPtr aObj = aDataModel->object(theIndex); + ResultPartPtr aPart = std::dynamic_pointer_cast(aObj); if (!aPart.get()) { // Probably this is Feature FeaturePtr aPartFeature = std::dynamic_pointer_cast(aObj); @@ -906,9 +967,80 @@ void PartSet_Module::onTreeViewDoubleClick(const QModelIndex& theIndex) } if (aPart.get()) { // if this is a part if (aPart->partDoc() == aMgr->activeDocument()) { - aMgr->setActiveDocument(aMgr->moduleDocument()); + myMenuMgr->activatePartSet(); } else { aPart->activate(); } } } + + +void PartSet_Module::onViewCreated(ModuleBase_IViewWindow*) +{ + // z layer is created for all started operations in order to visualize operation AIS presentation + // over the object + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if (aContext.IsNull()) + return; + + Handle(V3d_Viewer) aViewer = aContext->CurrentViewer(); + if (myVisualLayerId == 0) { + if (myVisualLayerId == 0) + aViewer->AddZLayer(myVisualLayerId); + } else { + TColStd_SequenceOfInteger aZList; + aViewer->GetAllZLayers(aZList); + bool aFound = false; + for (int i = 1; i <= aZList.Length(); i++) { + if (aZList(i) == myVisualLayerId) { + aFound = true; + break; + } + } + if (!aFound) + aViewer->AddZLayer(myVisualLayerId); + } + // if there is an active operation with validated widget, + // the filters of this widget should be activated in the created view + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (aOperation) { + ModuleBase_ModelWidget* anActiveWidget = activeWidget(); + if (anActiveWidget) { + ModuleBase_WidgetSelector* aWSelector = dynamic_cast(anActiveWidget); + if (aWSelector) + aWSelector->activateSelectionAndFilters(true); + } + } +} + +//****************************************************** +void PartSet_Module::widgetStateChanged(int thePreviousState) +{ + mySketchMgr->widgetStateChanged(thePreviousState); +} + +bool PartSet_Module::processEnter(const std::string& thePreviousAttributeID) +{ + return mySketchReentrantMgr->processEnter(thePreviousAttributeID); +} + + +//****************************************************** +void PartSet_Module::onBooleanOperationChange(int theOperation) +{ + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (!aOperation) + return; + ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + switch (theOperation) { + case 0: + aPanel->setWindowTitle(tr("Cut")); + break; + case 1: + aPanel->setWindowTitle(tr("Fuse")); + break; + case 2: + aPanel->setWindowTitle(tr("Common")); + break; + } +}