X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_SketcherMgr.cpp;h=eddf4b07eb0afb9e2f5d3048ec5bdc18b566b272;hb=0d9a107853208317a6352bb7f8c77eb54d5efbe1;hp=a086aa8685b0dafb1caa80733939b1a2c7697f6b;hpb=bc040d7778dfca67e24a0452ce41f88417799adb;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_SketcherMgr.cpp b/src/PartSet/PartSet_SketcherMgr.cpp old mode 100644 new mode 100755 index a086aa868..eddf4b07e --- a/src/PartSet/PartSet_SketcherMgr.cpp +++ b/src/PartSet/PartSet_SketcherMgr.cpp @@ -5,13 +5,13 @@ // Author: Vitaly SMETANNIKOV #include "PartSet_SketcherMgr.h" +#include "PartSet_SketcherReetntrantMgr.h" #include "PartSet_Module.h" #include "PartSet_WidgetPoint2d.h" #include "PartSet_WidgetPoint2dDistance.h" #include "PartSet_Tools.h" #include "PartSet_WidgetSketchLabel.h" - -#include +#include "PartSet_WidgetEditor.h" #include #include @@ -19,20 +19,21 @@ #include #include #include -#include #include #include #include +#include -#include - +#include +#include #include #include #include +#include #include -#include -#include +#include #include +#include #include @@ -56,6 +57,7 @@ #include #include #include +#include #include #include @@ -69,12 +71,15 @@ #include #include +#include #include #include +#include //#define DEBUG_DO_NOT_BY_ENTER -//#define DEBUG_MOUSE_OVER_WINDOW_FLAGS + +//#define DEBUG_CURSOR /// Returns list of unique objects by sum of objects from List1 and List2 /*QList getSumList(const QList& theList1, @@ -92,9 +97,14 @@ return aRes; }*/ -void fillFeature2Attribute(const QList& theList, - QMap >& theFeature2AttributeMap, - const FeaturePtr theSketch) +// Fills the list of features the list of selected presentations. +// \param theList a list of selected presentations +// \param theSketch a sketch to project a vertex shape of a presentation to the plane +// and find the corresponded attribute +// \param theFeatureList an output list of features +void fillFeatureList(const QList& theList, + const FeaturePtr theSketch, + QList& theFeatureList) { QList aRes; @@ -104,39 +114,56 @@ void fillFeature2Attribute(const QList& theList, { ModuleBase_ViewerPrs aPrs = *anIt; FeaturePtr aFeature = ModelAPI_Feature::feature(aPrs.object()); - if (aFeature.get() == NULL) - continue; + if (aFeature.get() && !theFeatureList.contains(aFeature)) + theFeatureList.append(aFeature); + } +} - QList anAttributes; - if (theFeature2AttributeMap.contains(aFeature)) { - anAttributes = theFeature2AttributeMap[aFeature]; +/// Fills attribute and result lists by the selected owner. In case if the attribute is found, +/// by the owner shape, it is put to the list. Otherwise if type of owner shape is edge, put the function +/// result as is to the list of results. +/// \param theOwner a viewer selected owner +/// \param theFeature a feature, where the attribute is searched +/// \param theSketch a current sketch +/// \param theSelectedAttribute an output list of attributes +/// \param theSelectedResults an output list of edge results +void getAttributesOrResults(const Handle(SelectMgr_EntityOwner)& theOwner, + const FeaturePtr& theFeature, const FeaturePtr& theSketch, + const ResultPtr& theResult, + std::set& aSelectedAttributes, + std::set& aSelectedResults) +{ + Handle(StdSelect_BRepOwner) aBRepOwner = Handle(StdSelect_BRepOwner)::DownCast(theOwner); + if (aBRepOwner.IsNull()) + return; + Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast( + aBRepOwner->Selectable()); + if (aBRepOwner->HasShape()) { + const TopoDS_Shape& aShape = aBRepOwner->Shape(); + TopAbs_ShapeEnum aShapeType = aShape.ShapeType(); + if (aShapeType == TopAbs_VERTEX) { + AttributePtr aPntAttr = PartSet_Tools::findAttributeBy2dPoint(theFeature, + aShape, theSketch); + if (aPntAttr.get() != NULL) + aSelectedAttributes.insert(aPntAttr); } - AttributePtr anAttr; - TopoDS_Shape aShape = aPrs.shape(); - if (!aShape.IsNull()) { - if (aShape.ShapeType() == TopAbs_VERTEX) { - anAttr = PartSet_Tools::findAttributeBy2dPoint(aFeature, aShape, theSketch); - if (anAttr.get() != NULL && !anAttributes.contains(anAttr)) - anAttributes.push_back(anAttr); - } + else if (aShapeType == TopAbs_EDGE && + aSelectedResults.find(theResult) == aSelectedResults.end()) { + aSelectedResults.insert(theResult); } - theFeature2AttributeMap[aFeature] = anAttributes; } } - - - PartSet_SketcherMgr::PartSet_SketcherMgr(PartSet_Module* theModule) : QObject(theModule), myModule(theModule), myIsDragging(false), myDragDone(false), - myIsPropertyPanelValueChanged(false), myIsMouseOverWindow(false), + myIsMouseOverWindow(false), myIsMouseOverViewProcessed(true), myPreviousUpdateViewerEnabled(true), myIsPopupMenuActive(false), myIsConstraintsShown(true) { ModuleBase_IWorkshop* anIWorkshop = myModule->workshop(); ModuleBase_IViewer* aViewer = anIWorkshop->viewer(); - myPreviousSelectionEnabled = true;//aViewer->isSelectionEnabled(); + myPreviousDrawModeEnabled = true;//aViewer->isSelectionEnabled(); connect(aViewer, SIGNAL(mousePress(ModuleBase_IViewWindow*, QMouseEvent*)), this, SLOT(onMousePressed(ModuleBase_IViewWindow*, QMouseEvent*))); @@ -168,27 +195,38 @@ void PartSet_SketcherMgr::onEnterViewPort() // the mouse move and use the cursor position to update own values. If the presentaion is // redisplayed before this update, the feature presentation jumps from reset value to current. myIsMouseOverWindow = true; - myIsPropertyPanelValueChanged = false; -#ifdef DEBUG_MOUSE_OVER_WINDOW_FLAGS - qDebug(QString("onEnterViewPort: %1").arg(mouseOverWindowFlagsInfo()).toStdString().c_str()); -#endif #ifdef DEBUG_DO_NOT_BY_ENTER return; #endif + if (canChangeCursor(getCurrentOperation())) { + QCursor* aCurrentCursor = QApplication::overrideCursor(); + if (!aCurrentCursor || aCurrentCursor->shape() != Qt::CrossCursor) { + QApplication::setOverrideCursor(QCursor(Qt::CrossCursor)); +#ifdef DEBUG_CURSOR + qDebug("onEnterViewPort() : Qt::CrossCursor"); +#endif + } + } + if (!isNestedCreateOperation(getCurrentOperation())) return; + + operationMgr()->onValidateOperation(); + // we need change displayed state of the current operation feature // if the feature is presentable, e.g. distance construction. It has no results, so workshop does // not accept a signal about the result created. Nothing is shown until mouse is moved out/in view // port. If the isDisplayed flag is true, the presentable feature is displayed as soon as the // presentation becomes valid and redisplay happens - ModuleBase_Operation* aOperation = getCurrentOperation(); - if (aOperation) { - FeaturePtr aFeature = aOperation->feature(); + //ModuleBase_Operation* aOperation = getCurrentOperation(); + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (getCurrentOperation()); + if (aFOperation) { + FeaturePtr aFeature = aFOperation->feature(); if (aFeature.get() && aFeature->data()->isValid()) { - visualizeFeature(aOperation, canDisplayObject(aFeature), false); + visualizeFeature(aFeature, aFOperation->isEditOperation(), canDisplayObject(aFeature), false); } } } @@ -197,22 +235,31 @@ void PartSet_SketcherMgr::onLeaveViewPort() { myIsMouseOverViewProcessed = false; myIsMouseOverWindow = false; - myIsPropertyPanelValueChanged = false; -#ifdef DEBUG_MOUSE_OVER_WINDOW_FLAGS - qDebug(QString("onLeaveViewPort: %1").arg(mouseOverWindowFlagsInfo()).toStdString().c_str()); -#endif + // it is important to validate operation here only if sketch entity create operation is active + // because at this operation we reacts to the mouse leave/enter view port + //operationMgr()->onValidateOperation(); #ifdef DEBUG_DO_NOT_BY_ENTER return; #endif + if (canChangeCursor(getCurrentOperation())) { + QApplication::restoreOverrideCursor(); +#ifdef DEBUG_CURSOR + qDebug("onLeaveViewPort() : None"); +#endif + } + 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; + operationMgr()->onValidateOperation(); + // 2. if the mouse IS NOT over window, reset the active widget value and hide the presentation ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); XGUI_ModuleConnector* aConnector = dynamic_cast(aWorkshop); @@ -220,25 +267,28 @@ void PartSet_SketcherMgr::onLeaveViewPort() // disable the viewer update in order to avoid visualization of redisplayed feature in viewer // obtained after reset value bool isEnableUpdateViewer = aDisplayer->enableUpdateViewer(false); - ModuleBase_Operation* aOperation = getCurrentOperation(); - ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); - ModuleBase_ModelWidget* aActiveWgt = aPanel->activeWidget(); - if (aActiveWgt) { - aActiveWgt->reset(); - } - aDisplayer->enableUpdateViewer(isEnableUpdateViewer); + ModuleBase_ModelWidget* anActiveWidget = getActiveWidget(); + if (anActiveWidget) + anActiveWidget->reset(); // hides the presentation of the current operation feature - //myIsPropertyPanelValueChanged = false; // the feature is to be erased here, but it is correct to call canDisplayObject because // there can be additional check (e.g. editor widget in distance constraint) - FeaturePtr aFeature = getCurrentOperation()->feature(); - visualizeFeature(aOperation, canDisplayObject(aFeature)); + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (getCurrentOperation()); + if (aFOperation) { + FeaturePtr aFeature = aFOperation->feature(); + visualizeFeature(aFeature, aFOperation->isEditOperation(), canDisplayObject(aFeature)); + } + // we should update viewer after the presentation are hidden in the viewer + // otherwise the reset presentation(line) appears in the viewer(by quick move from viewer to PP) + aDisplayer->enableUpdateViewer(isEnableUpdateViewer); } void PartSet_SketcherMgr::onBeforeValuesChangedInPropertyPanel() { - if (isNestedCreateOperation(getCurrentOperation())) + if (!isNestedEditOperation(getCurrentOperation()) || + myModule->sketchReentranceMgr()->isInternalEditActive()) return; // it is necessary to save current selection in order to restore it after the values are modifed storeSelection(); @@ -251,7 +301,8 @@ void PartSet_SketcherMgr::onBeforeValuesChangedInPropertyPanel() void PartSet_SketcherMgr::onAfterValuesChangedInPropertyPanel() { - if (isNestedCreateOperation(getCurrentOperation())) + if (!isNestedEditOperation(getCurrentOperation()) || + myModule->sketchReentranceMgr()->isInternalEditActive()) return; // it is necessary to restore current selection in order to restore it after the values are modified restoreSelection(); @@ -267,22 +318,11 @@ void PartSet_SketcherMgr::onAfterValuesChangedInPropertyPanel() aDisplayer->updateViewer(); } -void PartSet_SketcherMgr::onValuesChangedInPropertyPanel() +void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) { - if (!isNestedCreateOperation(getCurrentOperation())) + if (myModule->sketchReentranceMgr()->processMousePressed(theWnd, theEvent)) return; - // visualize the current operation feature - myIsPropertyPanelValueChanged = true; - ModuleBase_Operation* aOperation = getCurrentOperation(); - // the feature is to be erased here, but it is correct to call canDisplayObject because - // there can be additional check (e.g. editor widget in distance constraint) - FeaturePtr aFeature = getCurrentOperation()->feature(); - visualizeFeature(aOperation, canDisplayObject(aFeature)); -} - -void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) -{ get2dPoint(theWnd, theEvent, myClickedPoint); if (!(theEvent->buttons() & Qt::LeftButton)) @@ -296,37 +336,42 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE if (!aViewer->canDragByMouse()) return; - ModuleBase_Operation* aOperation = getCurrentOperation(); - if (aOperation && aOperation->isEditOperation()) { - ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); - ModuleBase_ModelWidget* aActiveWgt = aPanel->activeWidget(); - // If the current widget is a selector, do do nothing, it processes the mouse press - if(aActiveWgt && aActiveWgt->isViewerSelector()) { + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (getCurrentOperation()); + if (!aFOperation) + return; + + if (aFOperation->isEditOperation()) { + // If the current widget is a selector, do nothing, it processes the mouse press + ModuleBase_ModelWidget* anActiveWidget = getActiveWidget(); + if(anActiveWidget && anActiveWidget->isViewerSelector()) { return; } } // Use only for sketch operations - if (aOperation && myCurrentSketch) { + if (myCurrentSketch) { if (!PartSet_Tools::sketchPlane(myCurrentSketch)) return; - bool isSketcher = isSketchOperation(aOperation); - bool isSketchOpe = isNestedSketchOperation(aOperation); + bool isSketcher = isSketchOperation(aFOperation); + bool isSketchOpe = isNestedSketchOperation(aFOperation); // Avoid non-sketch operations if ((!isSketchOpe) && (!isSketcher)) return; - bool isEditing = aOperation->isEditOperation(); + bool isEditing = aFOperation->isEditOperation(); // Ignore creation sketch operation if ((!isSketcher) && (!isEditing)) return; - // MoveTo in order to highlight current object - aViewer->AISContext()->MoveTo(theEvent->x(), theEvent->y(), theWnd->v3dView()); - + Handle(AIS_InteractiveContext) aContext = aViewer->AISContext(); + if (!aContext.IsNull()) { + // MoveTo in order to highlight current object + aContext->MoveTo(theEvent->x(), theEvent->y(), theWnd->v3dView()); + } // Remember highlighted objects for editing ModuleBase_ISelection* aSelect = aWorkshop->selection(); @@ -336,8 +381,8 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE if (myCurrentSelection.empty()) { if (isSketchOpe && (!isSketcher)) // commit previous operation - if (!aOperation->commit()) - aOperation->abort(); + if (!aFOperation->commit()) + aFOperation->abort(); return; } // Init flyout point for radius rotation @@ -347,6 +392,8 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE myIsDragging = true; get2dPoint(theWnd, theEvent, myCurrentPoint); myDragDone = false; + // TODO: Has to be uncommented when SALOME patch on draw mode become avialable + myPreviousDrawModeEnabled = aViewer->enableDrawMode(false); launchEditing(); if (aFeature.get() != NULL) { std::shared_ptr aSPFeature = @@ -361,11 +408,13 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE } } else if (isSketchOpe && isEditing) { // If selected another object commit current result - aOperation->commit(); + aFOperation->commit(); myIsDragging = true; get2dPoint(theWnd, theEvent, myCurrentPoint); myDragDone = false; + // TODO: Has to be uncommented when SALOME patch on draw mode become avialable + myPreviousDrawModeEnabled = aViewer->enableDrawMode(false); // This is necessary in order to finalize previous operation QApplication::processEvents(); @@ -376,6 +425,9 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE void PartSet_SketcherMgr::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) { + if (myModule->sketchReentranceMgr()->processMouseReleased(theWnd, theEvent)) + return; + ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); ModuleBase_IViewer* aViewer = aWorkshop->viewer(); if (!aViewer->canDragByMouse()) @@ -390,44 +442,53 @@ void PartSet_SketcherMgr::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouse if (myDragDone) { //aOp->commit(); myCurrentSelection.clear(); + /*Handle(AIS_InteractiveContext) aContext = aViewer->AISContext(); + if (!aContext.IsNull()) { // Reselect edited object - /*aViewer->AISContext()->MoveTo(theEvent->x(), theEvent->y(), theWnd->v3dView()); + aContext->MoveTo(theEvent->x(), theEvent->y(), theWnd->v3dView()); if (theEvent->modifiers() & Qt::ShiftModifier) - aViewer->AISContext()->ShiftSelect(); + aContext->ShiftSelect(); else - aViewer->AISContext()->Select(); - */ + aContext->Select(); + */ } } } } - aWorkshop->viewer()->enableSelection(myPreviousSelectionEnabled); + // TODO: Has to be uncommented when SALOME patch on draw mode become avialable + aWorkshop->viewer()->enableDrawMode(myPreviousDrawModeEnabled); + //aWorkshop->viewer()->enableSelection(myPreviousDrawModeEnabled); myIsDragging = false; } void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) { + if (myModule->sketchReentranceMgr()->processMouseMoved(theWnd, theEvent)) + return; + if (isNestedCreateOperation(getCurrentOperation()) && !myIsMouseOverViewProcessed) { myIsMouseOverViewProcessed = true; // 1. perform the widget mouse move functionality and display the presentation - ModuleBase_Operation* aOperation = getCurrentOperation(); - ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); - ModuleBase_ModelWidget* anActiveWdg = aPanel->activeWidget(); // the mouse move should be processed in the widget, if it can in order to visualize correct // presentation. These widgets correct the feature attribute according to the mouse position - PartSet_WidgetPoint2D* aPoint2DWdg = dynamic_cast(anActiveWdg); + ModuleBase_ModelWidget* anActiveWidget = getActiveWidget(); + PartSet_WidgetPoint2D* aPoint2DWdg = dynamic_cast(anActiveWidget); if (aPoint2DWdg) { aPoint2DWdg->onMouseMove(theWnd, theEvent); } PartSet_WidgetPoint2dDistance* aDistanceWdg = dynamic_cast - (anActiveWdg); + (anActiveWidget); if (aDistanceWdg) { aDistanceWdg->onMouseMove(theWnd, theEvent); } // the feature is to be erased here, but it is correct to call canDisplayObject because // there can be additional check (e.g. editor widget in distance constraint) - FeaturePtr aFeature = getCurrentOperation()->feature(); - visualizeFeature(aOperation, canDisplayObject(aFeature)); + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (getCurrentOperation()); + if (aFOperation) { + FeaturePtr aFeature = aFOperation->feature(); + visualizeFeature(aFeature, aFOperation->isEditOperation(), canDisplayObject(aFeature)); + } } myClickedPoint.clear(); @@ -437,13 +498,15 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve // 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. - ModuleBase_IViewer* aViewer = myModule->workshop()->viewer(); - aViewer->enableSelection(false); - ModuleBase_Operation* aOperation = getCurrentOperation(); - if (!aOperation) + // TODO: Has to be commented out when SALOME patch on draw mode become avialable + //ModuleBase_IViewer* aViewer = myModule->workshop()->viewer(); + //aViewer->enableSelection(false); + + ModuleBase_Operation* aCurrentOperation = getCurrentOperation(); + if (!aCurrentOperation) return; - if (isSketchOperation(aOperation)) + if (isSketchOperation(aCurrentOperation)) return; // No edit operation activated Handle(V3d_View) aView = theWnd->v3dView(); @@ -466,6 +529,7 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve FeatureToSelectionMap::const_iterator anIt = myCurrentSelection.begin(), aLast = myCurrentSelection.end(); // 4. the features and attributes modification(move) + bool isModified = false; for (; anIt != aLast; anIt++) { FeaturePtr aFeature = anIt.key(); @@ -486,6 +550,7 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve if (aPoint.get() != NULL) { bool isImmutable = aPoint->setImmutable(true); aPoint->move(dX, dY); + isModified = true; ModelAPI_EventCreator::get()->sendUpdated(aFeature, aMoveEvent); aPoint->setImmutable(isImmutable); } @@ -497,10 +562,16 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve std::dynamic_pointer_cast(aFeature); if (aSketchFeature) { aSketchFeature->move(dX, dY); + isModified = true; ModelAPI_EventCreator::get()->sendUpdated(aSketchFeature, aMoveEvent); } } } + // the modified state of the current operation should be updated if there are features, which + // were changed here + if (isModified) { + aCurrentOperation->onValuesChanged(); + } Events_Loop::loop()->flush(aMoveEvent); // up all move events - to be processed in the solver //Events_Loop::loop()->flush(aUpdateEvent); // up update events - to redisplay presentations @@ -517,18 +588,21 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve void PartSet_SketcherMgr::onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) { - ModuleBase_Operation* aOperation = getCurrentOperation(); - if (aOperation && aOperation->isEditOperation()) { - std::string aId = aOperation->id().toStdString(); - if (isDistanceOperation(aOperation)) + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (getCurrentOperation()); + if (aFOperation && aFOperation->isEditOperation()) { + std::string aId = aFOperation->id().toStdString(); + if (isDistanceOperation(aFOperation)) { // Activate dimension value editing on double click - ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + ModuleBase_IPropertyPanel* aPanel = aFOperation->propertyPanel(); QList aWidgets = aPanel->modelWidgets(); // Find corresponded widget to activate value editing foreach (ModuleBase_ModelWidget* aWgt, aWidgets) { if (aWgt->attributeID() == "ConstraintValue") { - aWgt->focusTo(); + PartSet_WidgetEditor* anEditor = dynamic_cast(aWgt); + if (anEditor) + anEditor->showPopupEditor(); return; } } @@ -541,10 +615,17 @@ void PartSet_SketcherMgr::onApplicationStarted() ModuleBase_IWorkshop* anIWorkshop = myModule->workshop(); XGUI_ModuleConnector* aConnector = dynamic_cast(anIWorkshop); XGUI_Workshop* aWorkshop = aConnector->workshop(); + PartSet_SketcherReetntrantMgr* aReentranceMgr = myModule->sketchReentranceMgr(); + XGUI_PropertyPanel* aPropertyPanel = aWorkshop->propertyPanel(); if (aPropertyPanel) { connect(aPropertyPanel, SIGNAL(beforeWidgetActivated(ModuleBase_ModelWidget*)), this, SLOT(onBeforeWidgetActivated(ModuleBase_ModelWidget*))); + + connect(aPropertyPanel, SIGNAL(noMoreWidgets(const std::string&)), + aReentranceMgr, SLOT(onNoMoreWidgets(const std::string&))); + connect(aPropertyPanel, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)), + aReentranceMgr, SLOT(onWidgetActivated())); } XGUI_ViewerProxy* aViewerProxy = aWorkshop->viewer(); @@ -606,6 +687,37 @@ void PartSet_SketcherMgr::launchEditing() } } +bool PartSet_SketcherMgr::sketchSolverError() +{ + bool anError = false; + CompositeFeaturePtr aSketch = activeSketch(); + if (aSketch.get()) { + AttributeStringPtr aAttributeString = aSketch->string(SketchPlugin_Sketch::SOLVER_ERROR()); + anError = !aAttributeString->value().empty(); + } + return anError; +} + +QString PartSet_SketcherMgr::getFeatureError(const FeaturePtr& theFeature) +{ + QString anError = ""; + if (!theFeature.get() || !theFeature->data()->isValid()) + return anError; + + CompositeFeaturePtr aSketch = activeSketch(); + if (aSketch.get() && aSketch == theFeature) { + AttributeStringPtr aAttributeString = aSketch->string(SketchPlugin_Sketch::SOLVER_ERROR()); + anError = aAttributeString->value().c_str(); + } + return anError; +} + +void PartSet_SketcherMgr::clearClickedFlags() +{ + return; + myClickedPoint.clear(); + myCurrentPoint.clear(); +} const QStringList& PartSet_SketcherMgr::sketchOperationIdList() { @@ -637,6 +749,7 @@ const QStringList& PartSet_SketcherMgr::constraintsIdList() aIds << SketchPlugin_ConstraintTangent::ID().c_str(); aIds << SketchPlugin_ConstraintCoincidence::ID().c_str(); aIds << SketchPlugin_ConstraintMirror::ID().c_str(); + aIds << SketchPlugin_ConstraintAngle::ID().c_str(); aIds << SketchPlugin_MultiRotation::ID().c_str(); aIds << SketchPlugin_MultiTranslation::ID().c_str(); } @@ -667,7 +780,16 @@ bool PartSet_SketcherMgr::isNestedSketchOperation(ModuleBase_Operation* theOpera bool PartSet_SketcherMgr::isNestedCreateOperation(ModuleBase_Operation* theOperation) { - return theOperation && !theOperation->isEditOperation() && isNestedSketchOperation(theOperation); + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (theOperation); + return aFOperation && !aFOperation->isEditOperation() && isNestedSketchOperation(aFOperation); +} + +bool PartSet_SketcherMgr::isNestedEditOperation(ModuleBase_Operation* theOperation) +{ + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (theOperation); + return aFOperation && aFOperation->isEditOperation() && isNestedSketchOperation(aFOperation); } bool PartSet_SketcherMgr::isEntity(const std::string& theId) @@ -684,14 +806,23 @@ bool PartSet_SketcherMgr::isDistanceOperation(ModuleBase_Operation* theOperation return (aId == SketchPlugin_ConstraintLength::ID()) || (aId == SketchPlugin_ConstraintDistance::ID()) || - (aId == SketchPlugin_ConstraintRadius::ID()); + (aId == SketchPlugin_ConstraintRadius::ID()) || + (aId == SketchPlugin_ConstraintAngle::ID()); } void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation) { + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (getCurrentOperation()); + if (!aFOperation) + return; + + myModule->onViewTransformed(); + // Display all sketcher sub-Objects - myCurrentSketch = std::dynamic_pointer_cast(theOperation->feature()); + myCurrentSketch = std::dynamic_pointer_cast(aFOperation->feature()); XGUI_ModuleConnector* aConnector = dynamic_cast(myModule->workshop()); + aConnector->workshop()->displayer()->activateTrihedron(true); // Hide sketcher result std::list aResults = myCurrentSketch->results(); @@ -716,16 +847,21 @@ void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation) myPlaneFilter = new ModuleBase_ShapeInPlaneFilter(); myModule->workshop()->viewer()->addSelectionFilter(myPlaneFilter); - if (theOperation->isEditOperation()) { + + bool aHasPlane = false; + std::shared_ptr aPln; + if (aFOperation->isEditOperation()) { // If it is editing of sketch then it means that plane is already defined - std::shared_ptr aPln = PartSet_Tools::sketchPlane(myCurrentSketch); + aPln = PartSet_Tools::sketchPlane(myCurrentSketch); if (aPln.get()) - myPlaneFilter->setPlane(aPln->impl()); + aHasPlane = true; } + myPlaneFilter->setPlane(aPln); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); // all sketch objects should be activated in the sketch selection modes by edit operation start // in case of creation operation, there is an active widget, which activates own selection mode - if (theOperation->isEditOperation()) + if (aFOperation->isEditOperation() && aHasPlane) aConnector->activateModuleSelectionModes(); } @@ -733,9 +869,7 @@ void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation) { myIsMouseOverWindow = false; myIsConstraintsShown = true; -#ifdef DEBUG_MOUSE_OVER_WINDOW_FLAGS - qDebug(QString("stopSketch: %1").arg(mouseOverWindowFlagsInfo()).toStdString().c_str()); -#endif + XGUI_ModuleConnector* aConnector = dynamic_cast(myModule->workshop()); DataPtr aData = myCurrentSketch->data(); @@ -755,56 +889,82 @@ void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation) } } else { - // Hide all sketcher sub-Objects - for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) { - FeaturePtr aFeature = myCurrentSketch->subFeature(i); - std::list aResults = aFeature->results(); + // Hide all sketcher sub-Objects + for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) { + FeaturePtr aFeature = myCurrentSketch->subFeature(i); + std::list aResults = aFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { + (*aIt)->setDisplayed(false); + } + aFeature->setDisplayed(false); + } + // Display sketcher result + std::list aResults = myCurrentSketch->results(); std::list::const_iterator aIt; + Events_Loop* aLoop = Events_Loop::loop(); + static Events_ID aDispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); + + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (theOperation); for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { - (*aIt)->setDisplayed(false); + if (!aFOperation->isDisplayedOnStart(*aIt)) { + (*aIt)->setDisplayed(true); + // this display event is needed because sketch already may have "displayed" state, + // but not displayed while it is still active (issue 613, abort of existing sketch) + ModelAPI_EventCreator::get()->sendUpdated(*aIt, aDispEvent); + } } - aFeature->setDisplayed(false); - } - // Display sketcher result - std::list aResults = myCurrentSketch->results(); - std::list::const_iterator aIt; - for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { - (*aIt)->setDisplayed(true); - } - myCurrentSketch->setDisplayed(true); + if (!aFOperation->isDisplayedOnStart(myCurrentSketch)) + myCurrentSketch->setDisplayed(true); - myCurrentSketch = CompositeFeaturePtr(); - myModule->workshop()->viewer()->removeSelectionFilter(myPlaneFilter); - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); + myCurrentSketch = CompositeFeaturePtr(); + myModule->workshop()->viewer()->removeSelectionFilter(myPlaneFilter); + + Events_Loop::loop()->flush(aDispEvent); } // restore the module selection modes, which were changed on startSketch aConnector->activateModuleSelectionModes(); + aConnector->workshop()->displayer()->activateTrihedron(false); } void PartSet_SketcherMgr::startNestedSketch(ModuleBase_Operation* theOperation) { - if (constraintsIdList().contains(theOperation->id())) { - // Show constraints if a constraint was created - onShowConstraintsToggle(true); + if (canChangeCursor(theOperation) && myIsMouseOverWindow) { + QCursor* aCurrentCursor = QApplication::overrideCursor(); + if (!aCurrentCursor || aCurrentCursor->shape() != Qt::CrossCursor) { + QApplication::setOverrideCursor(QCursor(Qt::CrossCursor)); +#ifdef DEBUG_CURSOR + qDebug("startNestedSketch() : Qt::CrossCursor"); +#endif + } } - connectToPropertyPanel(true); } -void PartSet_SketcherMgr::stopNestedSketch(ModuleBase_Operation* theOp) +void PartSet_SketcherMgr::stopNestedSketch(ModuleBase_Operation* theOperation) { - connectToPropertyPanel(false); - myIsPropertyPanelValueChanged = false; myIsMouseOverViewProcessed = true; + operationMgr()->onValidateOperation(); + if (canChangeCursor(theOperation)) { + QApplication::restoreOverrideCursor(); +#ifdef DEBUG_CURSOR + qDebug("stopNestedSketch() : None"); +#endif + } } void PartSet_SketcherMgr::commitNestedSketch(ModuleBase_Operation* theOperation) { if (isNestedCreateOperation(theOperation)) { - FeaturePtr aFeature = theOperation->feature(); - // it is necessary to check the the feature data validity because - // some kind of features are removed by an operation commit(the macro state of a feature) - if (aFeature.get() && aFeature->data()->isValid()) { - visualizeFeature(theOperation, true); + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (theOperation); + if (aFOperation) { + FeaturePtr aFeature = aFOperation->feature(); + // it is necessary to check the the feature data validity because + // some kind of features are removed by an operation commit(the macro state of a feature) + if (aFeature.get() && aFeature->data()->isValid()) { + visualizeFeature(aFeature, aFOperation->isEditOperation(), true); + } } } } @@ -819,6 +979,28 @@ bool PartSet_SketcherMgr::canRedo() const return isNestedCreateOperation(getCurrentOperation()); } +bool PartSet_SketcherMgr::canEraseObject(const ObjectPtr& theObject) const +{ + bool aCanErase = true; + // when the sketch operation is active, results of sketch sub-feature can not be hidden + if (myCurrentSketch.get()) { + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (aResult.get()) { + // Display sketcher objects + for (int i = 0; i < myCurrentSketch->numberOfSubs() && aCanErase; i++) { + + FeaturePtr aFeature = myCurrentSketch->subFeature(i); + std::list aResults = aFeature->results(); + std::list::const_iterator anIt; + for (anIt = aResults.begin(); anIt != aResults.end() && aCanErase; ++anIt) { + aCanErase = *anIt != aResult; + } + } + } + } + return aCanErase; +} + bool PartSet_SketcherMgr::canDisplayObject(const ObjectPtr& theObject) const { bool aCanDisplay = true; @@ -848,16 +1030,17 @@ bool PartSet_SketcherMgr::canDisplayObject(const ObjectPtr& theObject) const // 3. the method should not filter the objects, which are not related to the current operation. // The object is filtered just if it is a current operation feature or this feature result bool isObjectFound = false; - ModuleBase_Operation* anOperation = getCurrentOperation(); - if (anOperation) { - FeaturePtr aFeature = anOperation->feature(); + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (getCurrentOperation()); + if (aFOperation) { + FeaturePtr aFeature = aFOperation->feature(); if (aFeature.get()) { std::list aResults = aFeature->results(); if (theObject == aFeature) isObjectFound = true; else { std::list::const_iterator anIt = aResults.begin(), aLast = aResults.end(); - for (; anIt != aLast; anIt++) { + for (; anIt != aLast && !isObjectFound; anIt++) { isObjectFound = *anIt == theObject; } } @@ -874,10 +1057,8 @@ bool PartSet_SketcherMgr::canDisplayObject(const ObjectPtr& theObject) const // c. widget editor control #ifndef DEBUG_DO_NOT_BY_ENTER if (aCanDisplay && isNestedCreateOperation(getCurrentOperation())) { - ModuleBase_Operation* aOperation = getCurrentOperation(); - ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); - ModuleBase_ModelWidget* anActiveWdg = aPanel ? aPanel->activeWidget() : 0; - ModuleBase_WidgetEditor* anEditorWdg = anActiveWdg ? dynamic_cast(anActiveWdg) : 0; + ModuleBase_ModelWidget* anActiveWidget = getActiveWidget(); + ModuleBase_WidgetEditor* anEditorWdg = anActiveWidget ? dynamic_cast(anActiveWidget) : 0; // the active widget editor should not influence here. The presentation should be visible always // when this widget is active. if (!anEditorWdg && !myIsPopupMenuActive) { @@ -892,10 +1073,19 @@ bool PartSet_SketcherMgr::canDisplayObject(const ObjectPtr& theObject) const bool PartSet_SketcherMgr::canDisplayCurrentCreatedFeature() const { - return myIsPropertyPanelValueChanged || myIsMouseOverWindow; -#ifdef DEBUG_MOUSE_OVER_WINDOW_FLAGS - qDebug(QString("canDisplayCurrentCreatedFeature: %1").arg(mouseOverWindowFlagsInfo()).toStdString().c_str()); -#endif + bool aCanDisplay = myIsMouseOverWindow; + if (!aCanDisplay) { + ModuleBase_ModelWidget* anActiveWidget = getActiveWidget(); + if (anActiveWidget) + aCanDisplay = anActiveWidget->getValueState() == ModuleBase_ModelWidget::Stored; + } + return aCanDisplay; +} + +bool PartSet_SketcherMgr::canChangeCursor(ModuleBase_Operation* theOperation) const +{ + return isNestedCreateOperation(theOperation) || + myModule->sketchReentranceMgr()->isInternalEditActive(); } bool PartSet_SketcherMgr::isObjectOfSketch(const ObjectPtr& theObject) const @@ -915,7 +1105,10 @@ bool PartSet_SketcherMgr::isObjectOfSketch(const ObjectPtr& theObject) const void PartSet_SketcherMgr::onPlaneSelected(const std::shared_ptr& thePln) { - myPlaneFilter->setPlane(thePln->impl()); + if (myPlaneFilter.IsNull()) + myPlaneFilter = new ModuleBase_ShapeInPlaneFilter(); + + myPlaneFilter->setPlane(thePln); } void PartSet_SketcherMgr::getCurrentSelection(const FeaturePtr& theFeature, @@ -931,42 +1124,35 @@ void PartSet_SketcherMgr::getCurrentSelection(const FeaturePtr& theFeature, ModuleBase_IViewer* aViewer = theWorkshop->viewer(); Handle(AIS_InteractiveContext) aContext = aViewer->AISContext(); - XGUI_ModuleConnector* aConnector = dynamic_cast(theWorkshop); - XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); + if (!aContext.IsNull()) { + XGUI_ModuleConnector* aConnector = dynamic_cast(theWorkshop); + XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); - std::list aResults = theFeature->results(); - std::list::const_iterator aIt; - for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) - { - ResultPtr aResult = *aIt; - AISObjectPtr aAISObj = aDisplayer->getAISObject(aResult); - if (aAISObj.get() == NULL) - continue; - Handle(AIS_InteractiveObject) anAISIO = aAISObj->impl(); - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) + std::list aResults = theFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { - Handle(StdSelect_BRepOwner) aBRepOwner = Handle(StdSelect_BRepOwner)::DownCast( - aContext->SelectedOwner()); - if (aBRepOwner.IsNull()) + ResultPtr aResult = *aIt; + AISObjectPtr aAISObj = aDisplayer->getAISObject(aResult); + if (aAISObj.get() == NULL) continue; - Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast( - aBRepOwner->Selectable()); - if (anIO != anAISIO) - continue; - - if (aBRepOwner->HasShape()) { - const TopoDS_Shape& aShape = aBRepOwner->Shape(); - TopAbs_ShapeEnum aShapeType = aShape.ShapeType(); - if (aShapeType == TopAbs_VERTEX) { - AttributePtr aPntAttr = PartSet_Tools::findAttributeBy2dPoint(theFeature, - aShape, theSketch); - if (aPntAttr.get() != NULL) - aSelectedAttributes.insert(aPntAttr); - } - else if (aShapeType == TopAbs_EDGE && - aSelectedResults.find(aResult) == aSelectedResults.end()) { - aSelectedResults.insert(aResult); - } + Handle(AIS_InteractiveObject) anAISIO = aAISObj->impl(); + for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) + { + Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); + if (anOwner->Selectable() != anAISIO) + continue; + getAttributesOrResults(anOwner, theFeature, theSketch, aResult, + aSelectedAttributes, aSelectedResults); + } + for (aContext->InitDetected(); aContext->MoreDetected(); aContext->NextDetected()) { + Handle(SelectMgr_EntityOwner) anOwner = aContext->DetectedOwner(); + if (anOwner.IsNull()) + continue; + if (anOwner->Selectable() != anAISIO) + continue; + getAttributesOrResults(anOwner, theFeature, theSketch, aResult, + aSelectedAttributes, aSelectedResults); } } } @@ -977,7 +1163,7 @@ void PartSet_SketcherMgr::getSelectionOwners(const FeaturePtr& theFeature, const FeaturePtr& theSketch, ModuleBase_IWorkshop* theWorkshop, const FeatureToSelectionMap& theSelection, - SelectMgr_IndexedMapOfOwner& anOwnersToSelect) + SelectMgr_IndexedMapOfOwner& theOwnersToSelect) { if (theFeature.get() == NULL) return; @@ -987,7 +1173,7 @@ void PartSet_SketcherMgr::getSelectionOwners(const FeaturePtr& theFeature, 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(); @@ -996,12 +1182,12 @@ void PartSet_SketcherMgr::getSelectionOwners(const FeaturePtr& theFeature, if (aAISObj.get() != NULL && aSelectedAttributes.empty() && aSelectedResults.empty()) { Handle(AIS_InteractiveObject) anAISIO = aAISObj->impl(); - SelectMgr_IndexedMapOfOwner aSelectedOwners; + 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); + theOwnersToSelect.Add(anOwner); } } @@ -1028,42 +1214,45 @@ void PartSet_SketcherMgr::getSelectionOwners(const FeaturePtr& theFeature, AttributePtr aPntAttr = PartSet_Tools::findAttributeBy2dPoint(theFeature, aShape, theSketch); if (aPntAttr.get() != NULL && aSelectedAttributes.find(aPntAttr) != aSelectedAttributes.end()) { - anOwnersToSelect.Add(anOwner); + theOwnersToSelect.Add(anOwner); } } else if (aShapeType == TopAbs_EDGE) { bool aFound = aSelectedResults.find(aResult) != aSelectedResults.end(); if (aSelectedResults.find(aResult) != aSelectedResults.end() && - anOwnersToSelect.FindIndex(anOwner) <= 0) - anOwnersToSelect.Add(anOwner); + theOwnersToSelect.FindIndex(anOwner) <= 0) + theOwnersToSelect.Add(anOwner); } } } } -void PartSet_SketcherMgr::connectToPropertyPanel(const bool isToConnect) +void PartSet_SketcherMgr::connectToPropertyPanel(ModuleBase_ModelWidget* theWidget, const bool isToConnect) { - ModuleBase_IWorkshop* anIWorkshop = myModule->workshop(); - XGUI_ModuleConnector* aConnector = dynamic_cast(anIWorkshop); - XGUI_Workshop* aWorkshop = aConnector->workshop(); - XGUI_PropertyPanel* aPropertyPanel = aWorkshop->propertyPanel(); - if (aPropertyPanel) { - const QList& aWidgets = aPropertyPanel->modelWidgets(); - foreach (ModuleBase_ModelWidget* aWidget, aWidgets) { - if (isToConnect) { - connect(aWidget, SIGNAL(beforeValuesChanged()), + if (isToConnect) { + connect(theWidget, SIGNAL(beforeValuesChanged()), + this, SLOT(onBeforeValuesChangedInPropertyPanel())); + connect(theWidget, SIGNAL(afterValuesChanged()), + this, SLOT(onAfterValuesChangedInPropertyPanel())); + } + else { + disconnect(theWidget, SIGNAL(beforeValuesChanged()), this, SLOT(onBeforeValuesChangedInPropertyPanel())); - connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onValuesChangedInPropertyPanel())); - connect(aWidget, SIGNAL(afterValuesChanged()), + disconnect(theWidget, SIGNAL(afterValuesChanged()), this, SLOT(onAfterValuesChangedInPropertyPanel())); - } - else { - disconnect(aWidget, SIGNAL(beforeValuesChanged()), - this, SLOT(onBeforeValuesChangedInPropertyPanel())); - disconnect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onValuesChangedInPropertyPanel())); - disconnect(aWidget, SIGNAL(afterValuesChanged()), - this, SLOT(onAfterValuesChangedInPropertyPanel())); - } + } +} + +void PartSet_SketcherMgr::widgetStateChanged(int thePreviousState) +{ + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (getCurrentOperation()); + if (aFOperation) { + if (PartSet_SketcherMgr::isSketchOperation(aFOperation) || + PartSet_SketcherMgr::isNestedSketchOperation(aFOperation) && + thePreviousState == ModuleBase_ModelWidget::ModifiedInPP) { + FeaturePtr aFeature = aFOperation->feature(); + visualizeFeature(aFeature, aFOperation->isEditOperation(), canDisplayObject(aFeature)); } } } @@ -1073,7 +1262,21 @@ ModuleBase_Operation* PartSet_SketcherMgr::getCurrentOperation() const return myModule->workshop()->currentOperation(); } -void PartSet_SketcherMgr::visualizeFeature(ModuleBase_Operation* theOperation, +//************************************************************** +ModuleBase_ModelWidget* PartSet_SketcherMgr::getActiveWidget() const +{ + ModuleBase_ModelWidget* aWidget = 0; + ModuleBase_Operation* anOperation = getCurrentOperation(); + if (anOperation) { + ModuleBase_IPropertyPanel* aPanel = anOperation->propertyPanel(); + if (aPanel) + aWidget = aPanel->activeWidget(); + } + return aWidget; +} + +void PartSet_SketcherMgr::visualizeFeature(const FeaturePtr& theFeature, + const bool isEditOperation, const bool isToDisplay, const bool isFlushRedisplay) { @@ -1081,7 +1284,7 @@ void PartSet_SketcherMgr::visualizeFeature(ModuleBase_Operation* theOperation, return; #endif - if (!theOperation || theOperation->isEditOperation()) + if (isEditOperation || !theFeature.get()) return; ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); @@ -1089,12 +1292,12 @@ void PartSet_SketcherMgr::visualizeFeature(ModuleBase_Operation* theOperation, // 1. change visibility of the object itself, here the presentable object is processed, // e.g. constraints features - FeaturePtr aFeature = theOperation->feature(); - std::list aResults = aFeature->results(); + //FeaturePtr aFeature = aFOperation->feature(); + std::list aResults = theFeature->results(); if (isToDisplay) - aFeature->setDisplayed(true); + theFeature->setDisplayed(true); else - aFeature->setDisplayed(false); + theFeature->setDisplayed(false); // change visibility of the object results, e.g. non-constraint features std::list::const_iterator aIt; @@ -1115,25 +1318,23 @@ void PartSet_SketcherMgr::storeSelection(const bool theHighlightedOnly) ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); ModuleBase_ISelection* aSelect = aWorkshop->selection(); QList aHighlighted = aSelect->getHighlighted(); - - QMap > aFeature2AttributeMap; + + QList aFeatureList; if (theHighlightedOnly) { - fillFeature2Attribute(aHighlighted, aFeature2AttributeMap, myCurrentSketch); + fillFeatureList(aHighlighted, myCurrentSketch, aFeatureList); } else { - fillFeature2Attribute(aHighlighted, aFeature2AttributeMap, myCurrentSketch); + fillFeatureList(aHighlighted, myCurrentSketch, aFeatureList); - QList aSelected = aSelect->getSelected(); - fillFeature2Attribute(aSelected, aFeature2AttributeMap, myCurrentSketch); + QList aSelected = aSelect->getSelected(ModuleBase_ISelection::AllControls); + fillFeatureList(aSelected, myCurrentSketch, aFeatureList); } // 1. it is necessary to save current selection in order to restore it after the features moving myCurrentSelection.clear(); - QMap >::const_iterator anIt = aFeature2AttributeMap.begin(), - aLast = aFeature2AttributeMap.end(); + QList::const_iterator anIt = aFeatureList.begin(), aLast = aFeatureList.end(); for (; anIt != aLast; anIt++) { - FeaturePtr aFeature = anIt.key(); - getCurrentSelection(aFeature, myCurrentSketch, aWorkshop, myCurrentSelection); + getCurrentSelection(*anIt, myCurrentSketch, aWorkshop, myCurrentSelection); } //qDebug(QString(" storeSelection: %1").arg(myCurrentSelection.size()).toStdString().c_str()); } @@ -1179,8 +1380,12 @@ void PartSet_SketcherMgr::onShowConstraintsToggle(bool theOn) Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); } -QString PartSet_SketcherMgr::mouseOverWindowFlagsInfo() const +XGUI_OperationMgr* PartSet_SketcherMgr::operationMgr() const { - return QString("myIsPropertyPanelValueChanged = %1, myIsMouseOverWindow = %2") - .arg(myIsPropertyPanelValueChanged).arg(myIsMouseOverWindow); + ModuleBase_IWorkshop* anIWorkshop = myModule->workshop(); + XGUI_ModuleConnector* aConnector = dynamic_cast(anIWorkshop); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + + return aWorkshop->operationMgr(); } +