X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_SketcherMgr.cpp;h=a6ae7a8a5bcb4f656210a239a4d08275dbb4878f;hb=0b503091623876eda1ae9214e32f8831ef03778b;hp=3427122e99717b7df556a511a6181add9d9e198b;hpb=47aefba9ed96153cab39ebfc4aa7fecc51942f21;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_SketcherMgr.cpp b/src/PartSet/PartSet_SketcherMgr.cpp index 3427122e9..a6ae7a8a5 100644 --- a/src/PartSet/PartSet_SketcherMgr.cpp +++ b/src/PartSet/PartSet_SketcherMgr.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -47,6 +48,10 @@ #include #include #include +#include +#include +#include +#include #include #include @@ -55,6 +60,7 @@ //#include #include +#include #include #include @@ -114,7 +120,8 @@ void fillFeature2Attribute(const QList& theList, PartSet_SketcherMgr::PartSet_SketcherMgr(PartSet_Module* theModule) : QObject(theModule), myModule(theModule), myIsDragging(false), myDragDone(false), myIsPropertyPanelValueChanged(false), myIsMouseOverWindow(false), - myIsMouseOverViewProcessed(true), myPreviousUpdateViewerEnabled(true) + myIsMouseOverViewProcessed(true), myPreviousUpdateViewerEnabled(true), + myIsPopupMenuActive(false) { ModuleBase_IWorkshop* anIWorkshop = myModule->workshop(); ModuleBase_IViewer* aViewer = anIWorkshop->viewer(); @@ -160,6 +167,10 @@ void PartSet_SketcherMgr::onLeaveViewPort() { if (!isNestedCreateOperation(getCurrentOperation())) return; + // the method should be performed if the popup menu is called, + // the reset of the current widget should not happen + if (myIsPopupMenuActive) + return; myIsMouseOverViewProcessed = false; myIsMouseOverWindow = false; @@ -190,14 +201,31 @@ void PartSet_SketcherMgr::onBeforeValuesChangedInPropertyPanel() { if (isNestedCreateOperation(getCurrentOperation())) return; + // it is necessary to save current selection in order to restore it after the values are modifed storeSelection(); + + ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); + XGUI_ModuleConnector* aConnector = dynamic_cast(aWorkshop); + XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); + myPreviousUpdateViewerEnabled = aDisplayer->enableUpdateViewer(false); } void PartSet_SketcherMgr::onAfterValuesChangedInPropertyPanel() { if (isNestedCreateOperation(getCurrentOperation())) return; + // it is necessary to restore current selection in order to restore it after the values are modified restoreSelection(); + myCurrentSelection.clear(); + + // 3. the flag to disable the update viewer should be set in order to avoid blinking in the + // viewer happens by deselect/select the modified objects. The flag should be restored after + // the selection processing. The update viewer should be also called. + ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); + XGUI_ModuleConnector* aConnector = dynamic_cast(aWorkshop); + XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); + aDisplayer->enableUpdateViewer(myPreviousUpdateViewerEnabled); + aDisplayer->updateViewer(); } void PartSet_SketcherMgr::onValuesChangedInPropertyPanel() @@ -261,20 +289,11 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE // Remember highlighted objects for editing ModuleBase_ISelection* aSelect = aWorkshop->selection(); - QList aHighlighted = aSelect->getHighlighted(); - QList aSelected = aSelect->getSelected(); - myFeature2AttributeMap.clear(); bool aHasShift = (theEvent->modifiers() & Qt::ShiftModifier); - if (aHasShift) { - fillFeature2Attribute(aHighlighted, myFeature2AttributeMap, myCurrentSketch); - fillFeature2Attribute(aSelected, myFeature2AttributeMap, myCurrentSketch); - } - else { - fillFeature2Attribute(aHighlighted, myFeature2AttributeMap, myCurrentSketch); - } + storeSelection(!aHasShift); - if (myFeature2AttributeMap.empty()) { + if (myCurrentSelection.empty()) { if (isSketchOpe && (!isSketcher)) // commit previous operation if (!aOperation->commit()) @@ -318,8 +337,7 @@ void PartSet_SketcherMgr::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouse if (myIsDragging) { if (myDragDone) { //aOp->commit(); - myFeature2AttributeMap.clear(); - + myCurrentSelection.clear(); // Reselect edited object /*aViewer->AISContext()->MoveTo(theEvent->x(), theEvent->y(), theWnd->v3dView()); if (theEvent->modifiers() & Qt::ShiftModifier) @@ -362,11 +380,7 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve myClickedPoint.clear(); if (myIsDragging) { - ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); - // 1. it is necessary to save current selection in order to restore it after the features moving - FeatureToSelectionMap aCurrentSelection; - getCurrentSelection(myFeature2AttributeMap, myCurrentSketch, aWorkshop, aCurrentSelection); - + // 1. the current selection is saved in the mouse press method in order to restore it after moving // 2. the enable selection in the viewer should be temporary switched off in order to ignore // mouse press signal in the viewer(it call Select for AIS context and the dragged objects are // deselected). This flag should be restored in the slot, processed the mouse release signal. @@ -386,6 +400,7 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve double dX = aX - myCurrentPoint.myCurX; double dY = aY - myCurrentPoint.myCurY; + ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); XGUI_ModuleConnector* aConnector = dynamic_cast(aWorkshop); XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); // 3. the flag to disable the update viewer should be set in order to avoid blinking in the @@ -395,17 +410,17 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve static Events_ID aMoveEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED); //static Events_ID aUpdateEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); - - FeatureToAttributesMap::const_iterator anIt = myFeature2AttributeMap.begin(), - aLast = myFeature2AttributeMap.end(); + FeatureToSelectionMap::const_iterator anIt = myCurrentSelection.begin(), + aLast = myCurrentSelection.end(); // 4. the features and attributes modification(move) for (; anIt != aLast; anIt++) { FeaturePtr aFeature = anIt.key(); - AttributeList anAttributes = anIt.value(); + std::set anAttributes = anIt.value().first; // Process selection by attribute: the priority to the attribute if (!anAttributes.empty()) { - AttributeList::const_iterator anAttIt = anAttributes.begin(), anAttLast = anAttributes.end(); + std::set::const_iterator anAttIt = anAttributes.begin(), + anAttLast = anAttributes.end(); for (; anAttIt != anAttLast; anAttIt++) { AttributePtr anAttr = *anAttIt; if (anAttr.get() == NULL) @@ -437,19 +452,11 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve //Events_Loop::loop()->flush(aUpdateEvent); // up update events - to redisplay presentations // 5. it is necessary to save current selection in order to restore it after the features moving - FeatureToSelectionMap::const_iterator aSIt = aCurrentSelection.begin(), - aSLast = aCurrentSelection.end(); - SelectMgr_IndexedMapOfOwner anOwnersToSelect; - for (; aSIt != aSLast; aSIt++) { - anOwnersToSelect.Clear(); - getSelectionOwners(aSIt->first, myCurrentSketch, aWorkshop, aCurrentSelection, - anOwnersToSelect); - aConnector->workshop()->selector()->setSelectedOwners(anOwnersToSelect, false); - } - + restoreSelection(); // 6. restore the update viewer flag and call this update aDisplayer->enableUpdateViewer(isEnableUpdateViewer); aDisplayer->updateViewer(); + myDragDone = true; myCurrentPoint.setValue(aX, aY); } @@ -490,6 +497,10 @@ void PartSet_SketcherMgr::onApplicationStarted() XGUI_ViewerProxy* aViewerProxy = aWorkshop->viewer(); connect(aViewerProxy, SIGNAL(enterViewPort()), this, SLOT(onEnterViewPort())); connect(aViewerProxy, SIGNAL(leaveViewPort()), this, SLOT(onLeaveViewPort())); + + XGUI_ContextMenuMgr* aContextMenuMgr = aWorkshop->contextMenuMgr(); + connect(aContextMenuMgr, SIGNAL(beforeContextMenu()), this, SLOT(onBeforeContextMenu())); + connect(aContextMenuMgr, SIGNAL(afterContextMenu()), this, SLOT(onAfterContextMenu())); } void PartSet_SketcherMgr::onBeforeWidgetActivated(ModuleBase_ModelWidget* theWidget) @@ -510,6 +521,16 @@ void PartSet_SketcherMgr::onBeforeWidgetActivated(ModuleBase_ModelWidget* theWid } } +void PartSet_SketcherMgr::onBeforeContextMenu() +{ + myIsPopupMenuActive = true; +} + +void PartSet_SketcherMgr::onAfterContextMenu() +{ + myIsPopupMenuActive = false; +} + void PartSet_SketcherMgr::get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent, Point& thePoint) { @@ -535,8 +556,8 @@ void PartSet_SketcherMgr::launchEditing() XGUI_ModuleConnector* aConnector = dynamic_cast(myModule->workshop()); aConnector->activateSubShapesSelection(aModes); - if (!myFeature2AttributeMap.empty()) { - FeaturePtr aFeature = myFeature2AttributeMap.begin().key(); + if (!myCurrentSelection.empty()) { + FeaturePtr aFeature = myCurrentSelection.begin().key(); std::shared_ptr aSPFeature = std::dynamic_pointer_cast(aFeature); if (aSPFeature) { @@ -561,6 +582,10 @@ QStringList PartSet_SketcherMgr::sketchOperationIdList() aIds << SketchPlugin_ConstraintRadius::ID().c_str(); aIds << SketchPlugin_ConstraintPerpendicular::ID().c_str(); aIds << SketchPlugin_ConstraintParallel::ID().c_str(); + aIds << SketchPlugin_ConstraintHorizontal::ID().c_str(); + aIds << SketchPlugin_ConstraintVertical::ID().c_str(); + aIds << SketchPlugin_ConstraintEqual::ID().c_str(); + aIds << SketchPlugin_ConstraintTangent::ID().c_str(); } return aIds; } @@ -576,6 +601,21 @@ bool PartSet_SketcherMgr::isNestedSketchOperation(ModuleBase_Operation* theOpera PartSet_SketcherMgr::sketchOperationIdList().contains(theOperation->id()); } +bool PartSet_SketcherMgr::isNestedCreateOperation(ModuleBase_Operation* theOperation) +{ + return theOperation && !theOperation->isEditOperation() && isNestedSketchOperation(theOperation); +} + +bool PartSet_SketcherMgr::isEntityOperation(ModuleBase_Operation* theOperation) +{ + std::string aId = theOperation ? theOperation->id().toStdString() : ""; + + return (aId == SketchPlugin_Line::ID()) || + (aId == SketchPlugin_Point::ID()) || + (aId == SketchPlugin_Arc::ID()) || + (aId == SketchPlugin_Circle::ID()); +} + bool PartSet_SketcherMgr::isDistanceOperation(ModuleBase_Operation* theOperation) { std::string aId = theOperation ? theOperation->id().toStdString() : ""; @@ -714,6 +754,8 @@ bool PartSet_SketcherMgr::canDisplayObject() const return aCanDisplay; } } + if (myIsPopupMenuActive) + return aCanDisplay; // during a nested create operation, the feature is redisplayed only if the mouse over view // of there was a value modified in the property panel after the mouse left the view @@ -721,22 +763,116 @@ bool PartSet_SketcherMgr::canDisplayObject() const return aCanDisplay; } -void PartSet_SketcherMgr::onPlaneSelected(const std::shared_ptr& thePln) +bool PartSet_SketcherMgr::canSetAuxiliary(bool& theValue) const { - myPlaneFilter->setPlane(thePln->impl()); + bool anEnabled = false; + ModuleBase_Operation* anOperation = getCurrentOperation(); + + bool isActiveSketch = PartSet_SketcherMgr::isSketchOperation(anOperation) || + PartSet_SketcherMgr::isNestedSketchOperation(anOperation); + if (!isActiveSketch) + return anEnabled; + + QObjectPtrList anObjects; + // 1. change auxiliary type of a created feature + if (PartSet_SketcherMgr::isNestedCreateOperation(anOperation) && + PartSet_SketcherMgr::isEntityOperation(anOperation) ) { + anObjects.append(anOperation->feature()); + } + else { + /// The operation should not be aborted here, because the method does not changed + /// the auxilliary state, but checks the possibility to perform this + ///if (PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) + /// anOperation->abort(); + // 2. change auxiliary type of selected sketch entities + ModuleBase_ISelection* aSelection = myModule->workshop()->selection(); + anObjects = aSelection->selectedPresentations(); + } + anEnabled = anObjects.size() > 0; + + bool isNotAuxiliaryFound = false; + if (anObjects.size() > 0) { + QObjectPtrList::const_iterator anIt = anObjects.begin(), aLast = anObjects.end(); + for (; anIt != aLast && !isNotAuxiliaryFound; anIt++) { + FeaturePtr aFeature = ModelAPI_Feature::feature(*anIt); + if (aFeature.get() != NULL) { + std::shared_ptr aSketchFeature = + std::dynamic_pointer_cast(aFeature); + if (aSketchFeature.get() != NULL) { + std::string anAttribute = SketchPlugin_SketchEntity::AUXILIARY_ID(); + + std::shared_ptr anAuxiliaryAttr = + std::dynamic_pointer_cast(aSketchFeature->data()->attribute(anAttribute)); + if (anAuxiliaryAttr) + isNotAuxiliaryFound = !anAuxiliaryAttr->value(); + } + } + } + } + theValue = anObjects.size() && !isNotAuxiliaryFound; + return anEnabled; } - -void PartSet_SketcherMgr::getCurrentSelection(const FeatureToAttributesMap& theFeatureToAttributes, - const FeaturePtr& theSketch, - ModuleBase_IWorkshop* theWorkshop, - FeatureToSelectionMap& theSelection) + +void PartSet_SketcherMgr::setAuxiliary(const bool isChecked) { - FeatureToAttributesMap::const_iterator anIt = theFeatureToAttributes.begin(), - aLast = theFeatureToAttributes.end(); - for (; anIt != aLast; anIt++) { - FeaturePtr aFeature = anIt.key(); - getCurrentSelection(aFeature, theSketch, theWorkshop, theSelection); + ModuleBase_Operation* anOperation = getCurrentOperation(); + + bool isActiveSketch = PartSet_SketcherMgr::isSketchOperation(anOperation) || + PartSet_SketcherMgr::isNestedSketchOperation(anOperation); + if (!isActiveSketch) + return; + + QObjectPtrList anObjects; + bool isUseTransaction = false; + // 1. change auxiliary type of a created feature + if (PartSet_SketcherMgr::isNestedCreateOperation(anOperation) && + PartSet_SketcherMgr::isEntityOperation(anOperation) ) { + anObjects.append(anOperation->feature()); } + else { + isUseTransaction = true; + // 2. change auxiliary type of selected sketch entities + ModuleBase_ISelection* aSelection = myModule->workshop()->selection(); + anObjects = aSelection->selectedPresentations(); + } + + QAction* anAction = myModule->action("AUXILIARY_CMD"); + SessionPtr aMgr = ModelAPI_Session::get(); + if (isUseTransaction) { + if (PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) + anOperation->abort(); + aMgr->startOperation(anAction->text().toStdString()); + } + storeSelection(); + + if (anObjects.size() > 0) { + QObjectPtrList::const_iterator anIt = anObjects.begin(), aLast = anObjects.end(); + for (; anIt != aLast; anIt++) { + FeaturePtr aFeature = ModelAPI_Feature::feature(*anIt); + if (aFeature.get() != NULL) { + std::shared_ptr aSketchFeature = + std::dynamic_pointer_cast(aFeature); + if (aSketchFeature.get() != NULL) { + std::string anAttribute = SketchPlugin_SketchEntity::AUXILIARY_ID(); + + std::shared_ptr anAuxiliaryAttr = + std::dynamic_pointer_cast(aSketchFeature->data()->attribute(anAttribute)); + if (anAuxiliaryAttr) + anAuxiliaryAttr->setValue(isChecked); + } + } + } + } + if (isUseTransaction) { + aMgr->finishOperation(); + } + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); + restoreSelection(); +} + +void PartSet_SketcherMgr::onPlaneSelected(const std::shared_ptr& thePln) +{ + myPlaneFilter->setPlane(thePln->impl()); } void PartSet_SketcherMgr::getCurrentSelection(const FeaturePtr& theFeature, @@ -804,14 +940,29 @@ void PartSet_SketcherMgr::getSelectionOwners(const FeaturePtr& theFeature, return; FeatureToSelectionMap::const_iterator anIt = theSelection.find(theFeature); - std::set aSelectedAttributes = anIt->second.first; - std::set aSelectedResults = anIt->second.second; + std::set aSelectedAttributes = anIt.value().first; + std::set aSelectedResults = anIt.value().second; ModuleBase_IViewer* aViewer = theWorkshop->viewer(); Handle(AIS_InteractiveContext) aContext = aViewer->AISContext(); XGUI_ModuleConnector* aConnector = dynamic_cast(theWorkshop); XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); + // 1. found the feature's owners. Check the AIS objects of the constructions + AISObjectPtr aAISObj = aDisplayer->getAISObject(theFeature); + if (aAISObj.get() != NULL && aSelectedAttributes.empty() && aSelectedResults.empty()) { + Handle(AIS_InteractiveObject) anAISIO = aAISObj->impl(); + + SelectMgr_IndexedMapOfOwner aSelectedOwners; + aConnector->workshop()->selector()->selection()->entityOwners(anAISIO, aSelectedOwners); + for (Standard_Integer i = 1, n = aSelectedOwners.Extent(); i <= n; i++) { + Handle(SelectMgr_EntityOwner) anOwner = aSelectedOwners(i); + if (!anOwner.IsNull()) + anOwnersToSelect.Add(anOwner); + } + } + + // 2. found the feature results's owners std::list aResults = theFeature->results(); std::list::const_iterator aIt; for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) @@ -879,11 +1030,6 @@ ModuleBase_Operation* PartSet_SketcherMgr::getCurrentOperation() const return myModule->workshop()->currentOperation(); } -bool PartSet_SketcherMgr::isNestedCreateOperation(ModuleBase_Operation* theOperation) const -{ - return theOperation && !theOperation->isEditOperation() && isNestedSketchOperation(theOperation); -} - void PartSet_SketcherMgr::visualizeFeature(ModuleBase_Operation* theOperation, const bool isToDisplay) { @@ -916,43 +1062,46 @@ void PartSet_SketcherMgr::visualizeFeature(ModuleBase_Operation* theOperation, aDisplayer->updateViewer(); } -void PartSet_SketcherMgr::storeSelection() +void PartSet_SketcherMgr::storeSelection(const bool theHighlightedOnly) { - //qDebug(" storeSelection"); ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); + ModuleBase_ISelection* aSelect = aWorkshop->selection(); + QList aHighlighted = aSelect->getHighlighted(); + + QMap > aFeature2AttributeMap; + if (theHighlightedOnly) { + fillFeature2Attribute(aHighlighted, aFeature2AttributeMap, myCurrentSketch); + } + else { + fillFeature2Attribute(aHighlighted, aFeature2AttributeMap, myCurrentSketch); + + QList aSelected = aSelect->getSelected(); + fillFeature2Attribute(aSelected, aFeature2AttributeMap, myCurrentSketch); + } + // 1. it is necessary to save current selection in order to restore it after the features moving - //FeatureToSelectionMap aCurrentSelection; myCurrentSelection.clear(); - getCurrentSelection(myFeature2AttributeMap, myCurrentSketch, aWorkshop, myCurrentSelection); - - XGUI_ModuleConnector* aConnector = dynamic_cast(aWorkshop); - XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); - // 3. the flag to disable the update viewer should be set in order to avoid blinking in the - // viewer happens by deselect/select the modified objects. The flag should be restored after - // the selection processing. The update viewer should be also called. - myPreviousUpdateViewerEnabled = aDisplayer->enableUpdateViewer(false); + QMap >::const_iterator anIt = aFeature2AttributeMap.begin(), + aLast = aFeature2AttributeMap.end(); + for (; anIt != aLast; anIt++) { + FeaturePtr aFeature = anIt.key(); + getCurrentSelection(aFeature, myCurrentSketch, aWorkshop, myCurrentSelection); + } + //qDebug(QString(" storeSelection: %1").arg(myCurrentSelection.size()).toStdString().c_str()); } void PartSet_SketcherMgr::restoreSelection() { - //qDebug("restoreSelection"); + //qDebug(QString("restoreSelection: %1").arg(myCurrentSelection.size()).toStdString().c_str()); ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); XGUI_ModuleConnector* aConnector = dynamic_cast(aWorkshop); - // 5. it is necessary to save current selection in order to restore it after the features moving FeatureToSelectionMap::const_iterator aSIt = myCurrentSelection.begin(), aSLast = myCurrentSelection.end(); SelectMgr_IndexedMapOfOwner anOwnersToSelect; for (; aSIt != aSLast; aSIt++) { anOwnersToSelect.Clear(); - getSelectionOwners(aSIt->first, myCurrentSketch, aWorkshop, myCurrentSelection, + getSelectionOwners(aSIt.key(), myCurrentSketch, aWorkshop, myCurrentSelection, anOwnersToSelect); aConnector->workshop()->selector()->setSelectedOwners(anOwnersToSelect, false); } - XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); - // 3. the flag to disable the update viewer should be set in order to avoid blinking in the - // viewer happens by deselect/select the modified objects. The flag should be restored after - // the selection processing. The update viewer should be also called. - aDisplayer->enableUpdateViewer(myPreviousUpdateViewerEnabled); - //if (myPreviousUpdateViewerEnabled) - aDisplayer->updateViewer(); }