X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=9b380a839de031128e1b0311af90b67a7373f389;hb=4d3ed04028394a778cbba218593158d0f84c6607;hp=7e940adefe097a97258d4a0724d1014b6bffd219;hpb=19dff6c8fb965bccbe6060ea4fcbaa97a1e9da80;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 7e940adef..9b380a839 100755 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -14,9 +14,11 @@ #include "PartSet_WidgetFileSelector.h" #include "PartSet_WidgetSketchCreator.h" #include "PartSet_SketcherMgr.h" +#include "PartSet_SketcherReetntrantMgr.h" #include "PartSet_MenuMgr.h" #include "PartSet_CustomPrs.h" #include "PartSet_IconFactory.h" +#include "PartSet_WidgetChoice.h" #include "PartSet_Filters.h" #include "PartSet_FilterInfinite.h" @@ -36,22 +38,11 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include - - #include #include #include #include #include -#include #include #include @@ -73,10 +64,6 @@ #include #include -#include -#include -#include -#include #include #include #include @@ -123,19 +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), myHasConstraintShown(true), - myIsInternalEditOperation(false) +: ModuleBase_IModule(theWshop), + myVisualLayerId(0), myHasConstraintShown(true) { new PartSet_IconFactory(); mySketchMgr = new PartSet_SketcherMgr(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())); @@ -207,29 +193,7 @@ void PartSet_Module::registerValidators() aFactory->registerValidator("PartSet_EqualSelection", new PartSet_EqualSelection); aFactory->registerValidator("PartSet_DifferentObjects", new PartSet_DifferentObjectsValidator); 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); - - aFactory->registerValidator("GeomValidators_ZeroOffset", - new GeomValidators_ZeroOffset); - - aFactory->registerValidator("GeomValidators_BooleanArguments", - new GeomValidators_BooleanArguments); - - aFactory->registerValidator("PartSet_SketchEntityValidator", - new PartSet_SketchEntityValidator); - - aFactory->registerValidator("GeomValidators_Different", - new GeomValidators_Different); - - aFactory->registerValidator("GeomValidators_PartitionArguments", - new GeomValidators_PartitionArguments); + aFactory->registerValidator("PartSet_SketchEntityValidator", new PartSet_SketchEntityValidator); } void PartSet_Module::registerFilters() @@ -245,94 +209,47 @@ 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); } - ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); - if (!aFOperation) - return; - // the clear selection is obsolete because during restart of the creation operation - // we would like to use selected object, e.g. a line in a parallel constraint - - // 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 = aFOperation->feature(); - std::shared_ptr aSPFeature = - std::dynamic_pointer_cast(aFeature); - if (aSPFeature && (myRestartingMode == RM_LastFeatureUsed || - myRestartingMode == RM_EmptyFeatureUsed)) { - myLastOperationId = aFOperation->id(); - myLastFeature = myRestartingMode == RM_LastFeatureUsed ? aFOperation->feature() : FeaturePtr(); - if (!sketchMgr()->sketchSolverError()) { - if (!aFOperation->isEditOperation()) { - FeaturePtr anOperationFeature = aFOperation->feature(); - if (anOperationFeature.get() != NULL) { - editFeature(anOperationFeature); - myIsInternalEditOperation = true; - onInternalActivateFirstWidgetSelection(); - - // activate the last active widget in the Property Panel - if (!myPreviousAttributeID.empty()) { - ModuleBase_Operation* anEditOperation = currentOperation(); - if (anEditOperation) { - ModuleBase_IPropertyPanel* aPanel = aFOperation->propertyPanel(); - ModuleBase_ModelWidget* aPreviousAttributeWidget = 0; - QList aWidgets = aPanel->modelWidgets(); - for (int i = 0, aNb = aWidgets.size(); i < aNb && !aPreviousAttributeWidget; i++) { - if (aWidgets[i]->attributeID() == myPreviousAttributeID) - aPreviousAttributeWidget = aWidgets[i]; - } - // If the current widget is a selector, do nothing, it processes the mouse press - if (aPreviousAttributeWidget && !aPreviousAttributeWidget->isViewerSelector()) - aPreviousAttributeWidget->focusTo(); - } - } - } - } - else { - // the flag should be reset before start to do not react to the widget deactivate - myIsInternalEditOperation = false; - launchOperation(myLastOperationId); - breakOperationSequence(); - } + 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(); } } } -void PartSet_Module::breakOperationSequence() +void PartSet_Module::operationAborted(ModuleBase_Operation* theOperation) { - myLastOperationId = ""; - myLastFeature = FeaturePtr(); - myRestartingMode = RM_None; + /// Restart sketcher operations automatically + mySketchReentrantMgr->operationAborted(theOperation); } -void PartSet_Module::onOperationAborted(ModuleBase_Operation* theOperation) +void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation) { - if (myIsInternalEditOperation) { - // abort the created feature, which is currently edited - SessionPtr aMgr = ModelAPI_Session::get(); - if (aMgr->hasModuleDocument() && aMgr->canUndo()) { - aMgr->undo(); - } - } - - myIsInternalEditOperation = false; - breakOperationSequence(); -} + /// Restart sketcher operations automatically + mySketchReentrantMgr->operationStarted(theOperation); -void PartSet_Module::onOperationStarted(ModuleBase_Operation* theOperation) -{ if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { mySketchMgr->startSketch(theOperation); } @@ -345,16 +262,16 @@ void PartSet_Module::onOperationStarted(ModuleBase_Operation* theOperation) myCustomPrs->activate(aFOperation->feature(), true); } -void PartSet_Module::onOperationResumed(ModuleBase_Operation* theOperation) +void PartSet_Module::operationResumed(ModuleBase_Operation* theOperation) { - ModuleBase_IModule::onOperationResumed(theOperation); + ModuleBase_IModule::operationResumed(theOperation); ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); if (aFOperation) myCustomPrs->activate(aFOperation->feature(), true); } -void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) +void PartSet_Module::operationStopped(ModuleBase_Operation* theOperation) { bool isModified = myCustomPrs->deactivate(false); @@ -419,11 +336,6 @@ bool PartSet_Module::canApplyAction(const ObjectPtr& theObject, const QString& t return aValid; } -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 @@ -465,21 +377,9 @@ void PartSet_Module::updateViewerMenu(const QMap& theStdActio QString PartSet_Module::getFeatureError(const FeaturePtr& theFeature) { QString anError = ModuleBase_IModule::getFeatureError(theFeature); - if (anError.isEmpty()) anError = sketchMgr()->getFeatureError(theFeature); - if (anError.isEmpty()) { - XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); - XGUI_OperationMgr* anOpMgr = aConnector->workshop()->operationMgr(); - - if (anOpMgr->isValidationLocked()) { - ModuleBase_OperationFeature* aFOperation = dynamic_cast - (anOpMgr->currentOperation()); - if (!aFOperation || theFeature == aFOperation->feature()) - anError = "Validation is locked by the current operation"; - } - } return anError; } @@ -530,31 +430,9 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) 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 ((aFOperation->id() == myLastOperationId) && myLastFeature) { - ModuleBase_ModelWidget* aWgt = aPanel->activeWidget(); - 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) { - 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(), aFOperation->feature(), - aWgt->attributeID(), aPoint->x(), aPoint->y()); - aPanel->activateNextWidget(aPnt2dWgt); - } - } - } - } + // we have to manually activate the sketch label in edit mode + if (PartSet_SketcherMgr::isSketchOperation(aFOperation) && (aFOperation->isEditOperation())) + aPanel->activateWidget(aPanel->modelWidgets().first()); } @@ -598,17 +476,9 @@ void PartSet_Module::onKeyRelease(ModuleBase_IViewWindow* theWnd, QKeyEvent* the anOpMgr->onKeyReleased(theEvent); } -void PartSet_Module::onEnterReleased() -{ - ModuleBase_OperationFeature* aFOperation = dynamic_cast - (currentOperation()); - if (/*!aFOperation->isEditOperation() || */myIsInternalEditOperation) - myRestartingMode = RM_EmptyFeatureUsed; -} - void PartSet_Module::onOperationActivatedByPreselection() { - if (myRestartingMode != RM_None) + if (!mySketchReentrantMgr->canBeCommittedByPreselection()) return; ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); @@ -621,61 +491,6 @@ void PartSet_Module::onOperationActivatedByPreselection() } } -void PartSet_Module::onNoMoreWidgets(const std::string& thePreviousAttributeID) -{ - ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); - if (anOperation) { - if (PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) { - if (myRestartingMode != RM_Forbided) { - myRestartingMode = RM_LastFeatureUsed; - myPreviousAttributeID = thePreviousAttributeID; - } - 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(); - } - } -} - -void PartSet_Module::onInternalActivateFirstWidgetSelection() -{ - if (!myIsInternalEditOperation) - return; - - ModuleBase_ModelWidget* aFirstWidget = activeWidget(); - ModuleBase_IPropertyPanel* aPanel = currentOperation()->propertyPanel(); - if (aFirstWidget != aPanel->activeWidget()) { - ModuleBase_WidgetSelector* aWSelector = dynamic_cast(aFirstWidget); - if (aWSelector) - aWSelector->activateSelectionAndFilters(true); - } -} - -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) { @@ -695,13 +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()), this, SLOT(onVertexSelected())); + connect(aPointWgt, SIGNAL(vertexSelected()), sketchReentranceMgr(), SLOT(onVertexSelected())); aWgt = aPointWgt; } else if (theType == "point2ddistance") { PartSet_WidgetPoint2dDistance* aDistanceWgt = new PartSet_WidgetPoint2dDistance(theParent, @@ -729,6 +544,9 @@ 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; } @@ -736,26 +554,15 @@ ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& th ModuleBase_ModelWidget* PartSet_Module::activeWidget() const { ModuleBase_ModelWidget* anActiveWidget = 0; - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - if (aOperation) { - ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); - anActiveWidget = aPanel->activeWidget(); - if (myIsInternalEditOperation && (!anActiveWidget || !anActiveWidget->isViewerSelector())) { - // finds the first widget which can accept a value - QList aWidgets = aPanel->modelWidgets(); - ModuleBase_ModelWidget* aFirstWidget = 0; - ModuleBase_ModelWidget* aWgt; - QList::const_iterator aWIt; - for (aWIt = aWidgets.begin(); aWIt != aWidgets.end() && !aFirstWidget; ++aWIt) { - aWgt = (*aWIt); - if (aWgt->canSetValue()) - aFirstWidget = aWgt; - } - if (aFirstWidget) - anActiveWidget = aFirstWidget; + + anActiveWidget = mySketchReentrantMgr->internalActiveWidget(); + if (!anActiveWidget) { + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (aOperation) { + ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + anActiveWidget = aPanel->activeWidget(); } } - return anActiveWidget; } @@ -981,7 +788,10 @@ void PartSet_Module::customizeObjectBrowser(QWidget* theObjectBrowser) { XGUI_ObjectsBrowser* aOB = dynamic_cast(theObjectBrowser); if (aOB) { - //QLineEdit* aLabel = aOB->activeDocLabel(); + 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); @@ -991,6 +801,23 @@ void PartSet_Module::customizeObjectBrowser(QWidget* theObjectBrowser) } } +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; @@ -1017,7 +844,6 @@ void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const int aSelected = aObjects.size(); SessionPtr aMgr = ModelAPI_Session::get(); QAction* aActivatePartAction = myMenuMgr->action("ACTIVATE_PART_CMD"); - QAction* aActivatePartSetAction = myMenuMgr->action("ACTIVATE_PARTSET_CMD"); ModuleBase_Operation* aCurrentOp = myWorkshop->currentOperation(); if (aSelected == 1) { @@ -1058,21 +884,11 @@ 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) - theMenu->addAction(aActivatePartSetAction); - aActivatePartSetAction->setEnabled((aMgr->activeDocument() != aMgr->moduleDocument())); } - } 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 - theMenu->addAction(aActivatePartSetAction); - aActivatePartSetAction->setEnabled((aMgr->activeDocument() != aMgr->moduleDocument())); } bool aNotDeactivate = (aCurrentOp == 0); if (!aNotDeactivate) { aActivatePartAction->setEnabled(false); - aActivatePartSetAction->setEnabled(false); } } @@ -1092,7 +908,7 @@ 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(); @@ -1196,3 +1012,35 @@ void PartSet_Module::onViewCreated(ModuleBase_IViewWindow*) } } } + +//****************************************************** +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; + } +}