X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_SketcherMgr.cpp;h=a6ae7a8a5bcb4f656210a239a4d08275dbb4878f;hb=0b503091623876eda1ae9214e32f8831ef03778b;hp=30f1523b975c0a7b427234c22bf4dedde442742f;hpb=12385f8af09b5ffbdf68bb42124ef76f1d034957;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_SketcherMgr.cpp b/src/PartSet/PartSet_SketcherMgr.cpp index 30f1523b9..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; @@ -486,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) @@ -506,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) { @@ -557,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; } @@ -572,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() : ""; @@ -710,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 @@ -717,6 +763,113 @@ bool PartSet_SketcherMgr::canDisplayObject() const return aCanDisplay; } +bool PartSet_SketcherMgr::canSetAuxiliary(bool& theValue) const +{ + 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::setAuxiliary(const bool isChecked) +{ + 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()); @@ -877,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) { @@ -917,7 +1065,6 @@ void PartSet_SketcherMgr::visualizeFeature(ModuleBase_Operation* theOperation, void PartSet_SketcherMgr::storeSelection(const bool theHighlightedOnly) { ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); - ModuleBase_ISelection* aSelect = aWorkshop->selection(); QList aHighlighted = aSelect->getHighlighted(); @@ -940,12 +1087,12 @@ void PartSet_SketcherMgr::storeSelection(const bool theHighlightedOnly) FeaturePtr aFeature = anIt.key(); getCurrentSelection(aFeature, myCurrentSketch, aWorkshop, myCurrentSelection); } - qDebug(QString(" storeSelection: %1").arg(myCurrentSelection.size()).toStdString().c_str()); + //qDebug(QString(" storeSelection: %1").arg(myCurrentSelection.size()).toStdString().c_str()); } void PartSet_SketcherMgr::restoreSelection() { - qDebug(QString("restoreSelection: %1").arg(myCurrentSelection.size()).toStdString().c_str()); + //qDebug(QString("restoreSelection: %1").arg(myCurrentSelection.size()).toStdString().c_str()); ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); XGUI_ModuleConnector* aConnector = dynamic_cast(aWorkshop); FeatureToSelectionMap::const_iterator aSIt = myCurrentSelection.begin(),