From: vsv Date: Mon, 22 Dec 2014 09:40:19 +0000 (+0300) Subject: A sketcher operations manager is created X-Git-Tag: V_0.7.0_rc1~56^2~9 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=47ed5645c9784f62ffe5d706a0d48539f192beb0;p=modules%2Fshaper.git A sketcher operations manager is created --- diff --git a/src/ModuleBase/ModuleBase_IViewer.h b/src/ModuleBase/ModuleBase_IViewer.h index d3028d42d..33205b817 100644 --- a/src/ModuleBase/ModuleBase_IViewer.h +++ b/src/ModuleBase/ModuleBase_IViewer.h @@ -65,6 +65,9 @@ Q_OBJECT /// Remove all selection filters from the viewer virtual void clearSelectionFilters() = 0; + /// Update current viewer + virtual void update() = 0; + signals: void lastViewClosed(); void tryCloseView(ModuleBase_IViewWindow* theWnd); diff --git a/src/ModuleBase/ModuleBase_IWorkshop.h b/src/ModuleBase/ModuleBase_IWorkshop.h index 84af1145f..3679e30d2 100644 --- a/src/ModuleBase/ModuleBase_IWorkshop.h +++ b/src/ModuleBase/ModuleBase_IWorkshop.h @@ -38,7 +38,7 @@ Q_OBJECT virtual ModuleBase_ISelection* selection() const = 0; /// Activate sub-shapes selection (opens local context) - /// Types has to be dined according to TopAbs_ShapeEnum + /// Types has to be defined according to TopAbs_ShapeEnum virtual void activateSubShapesSelection(const QIntList& theTypes) = 0; /// Deactivate sub-shapes selection (closes local context) diff --git a/src/NewGeom/NewGeom_SalomeViewer.cpp b/src/NewGeom/NewGeom_SalomeViewer.cpp index a1a640e5e..8fe9bd862 100644 --- a/src/NewGeom/NewGeom_SalomeViewer.cpp +++ b/src/NewGeom/NewGeom_SalomeViewer.cpp @@ -265,3 +265,12 @@ void NewGeom_SalomeViewer::clearSelectionFilters() aContext->RemoveFilters(); } } + +//*************************************** +void NewGeom_SalomeViewer::update() +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (!aContext.IsNull()) { + aContext->UpdateCurrentViewer(); + } +} diff --git a/src/NewGeom/NewGeom_SalomeViewer.h b/src/NewGeom/NewGeom_SalomeViewer.h index f3b6243f8..7ac8ea6a3 100644 --- a/src/NewGeom/NewGeom_SalomeViewer.h +++ b/src/NewGeom/NewGeom_SalomeViewer.h @@ -89,6 +89,10 @@ Q_OBJECT return mySelector; } + /// Update current viewer + virtual void update(); + + private slots: void onMousePress(SUIT_ViewWindow*, QMouseEvent*); void onMouseRelease(SUIT_ViewWindow*, QMouseEvent*); diff --git a/src/PartSet/CMakeLists.txt b/src/PartSet/CMakeLists.txt index fc2f4b0b8..9f0f38e8b 100644 --- a/src/PartSet/CMakeLists.txt +++ b/src/PartSet/CMakeLists.txt @@ -16,6 +16,7 @@ SET(PROJECT_HEADERS PartSet_WidgetPoint2dDistance.h PartSet_WidgetShapeSelector.h PartSet_Filters.h + PartSet_SketcherMgr.h ) SET(PROJECT_SOURCES @@ -28,6 +29,7 @@ SET(PROJECT_SOURCES PartSet_WidgetPoint2dDistance.cpp PartSet_WidgetShapeSelector.cpp PartSet_Filters.cpp + PartSet_SketcherMgr.cpp ) SET(PROJECT_RESOURCES diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 146dfa692..309c6a607 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -35,17 +36,17 @@ #include #include -#include +#include #include -#include -#include -#include +#include +//#include +//#include #include #include #include #include #include -#include +//#include #include @@ -68,23 +69,6 @@ #include #endif - -/// Returns list of unique objects by sum of objects from List1 and List2 -QList getSumList(const QList& theList1, - const QList& theList2) -{ - QList aRes; - foreach (ModuleBase_ViewerPrs aPrs, theList1) { - if (!aRes.contains(aPrs.object())) - aRes.append(aPrs.object()); - } - foreach (ModuleBase_ViewerPrs aPrs, theList2) { - if (!aRes.contains(aPrs.object())) - aRes.append(aPrs.object()); - } - return aRes; -} - /*!Create and return new instance of XGUI_Module*/ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop) { @@ -93,21 +77,10 @@ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) : ModuleBase_IModule(theWshop), - myIsDragging(false), myRestartingMode(RM_None), myDragDone(false) + myRestartingMode(RM_None) { //myWorkshop = dynamic_cast(theWshop); - ModuleBase_IViewer* aViewer = aViewer = theWshop->viewer(); - connect(aViewer, SIGNAL(mousePress(ModuleBase_IViewWindow*, QMouseEvent*)), - this, SLOT(onMousePressed(ModuleBase_IViewWindow*, QMouseEvent*))); - - connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)), - this, SLOT(onMouseReleased(ModuleBase_IViewWindow*, QMouseEvent*))); - - connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), - this, SLOT(onMouseMoved(ModuleBase_IViewWindow*, QMouseEvent*))); - - connect(aViewer, SIGNAL(mouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)), - this, SLOT(onMouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*))); + mySketchMgr = new PartSet_SketcherMgr(this); XGUI_ModuleConnector* aConnector = dynamic_cast(theWshop); XGUI_Workshop* aWorkshop = aConnector->workshop(); @@ -117,6 +90,7 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) connect(anOpMgr, SIGNAL(operationActivatedByPreselection()), this, SLOT(onOperationActivatedByPreselection())); + ModuleBase_IViewer* aViewer = theWshop->viewer(); connect(aViewer, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)), this, SLOT(onKeyRelease(ModuleBase_IViewWindow*, QKeyEvent*))); } @@ -125,8 +99,6 @@ PartSet_Module::~PartSet_Module() { if (!myDocumentShapeFilter.IsNull()) myDocumentShapeFilter.Nullify(); - if (!myPlaneFilter.IsNull()) - myPlaneFilter.Nullify(); } void PartSet_Module::registerValidators() @@ -185,37 +157,7 @@ void PartSet_Module::operationAborted(ModuleBase_Operation* theOperation) void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation) { if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) { - // Display all sketcher sub-Objects - myCurrentSketch = std::dynamic_pointer_cast(theOperation->feature()); - XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); - XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); - - 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) { - aDisplayer->display((*aIt), false); - } - aDisplayer->display(aFeature); - } - // Hide sketcher result - std::list aResults = myCurrentSketch->results(); - std::list::const_iterator aIt; - for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { - aDisplayer->erase((*aIt), false); - } - aDisplayer->erase(myCurrentSketch); - - - if (myPlaneFilter.IsNull()) - myPlaneFilter = new ModuleBase_ShapeInPlaneFilter(); - myWorkshop->viewer()->addSelectionFilter(myPlaneFilter); - if (theOperation->isEditOperation()) { - // If it is editing of sketch then it means that plane is already defined - std::shared_ptr aPln = PartSet_Tools::sketchPlane(myCurrentSketch); - myPlaneFilter->setPlane(aPln->impl()); - } + mySketchMgr->startSketch(theOperation); } if (myDocumentShapeFilter.IsNull()) myDocumentShapeFilter = new PartSet_GlobalFilter(myWorkshop); @@ -225,43 +167,11 @@ void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation) void PartSet_Module::operationStopped(ModuleBase_Operation* theOperation) { if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) { - DataPtr aData = myCurrentSketch->data(); - if ((!aData) || (!aData->isValid())) { - // The sketch was aborted - myCurrentSketch = CompositeFeaturePtr(); - return; - } - // Hide all sketcher sub-Objects - XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); - XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); - 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) { - aDisplayer->erase((*aIt), false); - } - aDisplayer->erase(aFeature, false); - } - // Display sketcher result - std::list aResults = myCurrentSketch->results(); - std::list::const_iterator aIt; - for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { - aDisplayer->display((*aIt), false); - } - aDisplayer->display(myCurrentSketch); - - myCurrentSketch = CompositeFeaturePtr(); - myWorkshop->viewer()->removeSelectionFilter(myPlaneFilter); + mySketchMgr->stopSketch(theOperation); } myWorkshop->viewer()->removeSelectionFilter(myDocumentShapeFilter); } -void PartSet_Module::onPlaneSelected(const std::shared_ptr& thePln) -{ - myPlaneFilter->setPlane(thePln->impl()); -} - void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) { @@ -285,7 +195,7 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) std::dynamic_pointer_cast(aData->attribute(SketchPlugin_Line::END_ID())); if (aPoint) { aPnt2dWgt->setPoint(aPoint->x(), aPoint->y()); - PartSet_Tools::setConstraints(myCurrentSketch, theOperation->feature(), + PartSet_Tools::setConstraints(mySketchMgr->activeSketch(), theOperation->feature(), aWgt->attributeID(), aPoint->x(), aPoint->y()); theOperation->propertyPanel()->activateNextWidget(aPnt2dWgt); } @@ -295,7 +205,7 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) // Start editing constraint if (theOperation->isEditOperation()) { std::string aId = theOperation->id().toStdString(); - if (sketchOperationIdList().contains(QString(aId.c_str()))) { + if (PartSet_SketcherMgr::sketchOperationIdList().contains(QString(aId.c_str()))) { if ((aId == SketchPlugin_ConstraintRadius::ID()) || (aId == SketchPlugin_ConstraintLength::ID()) || (aId == SketchPlugin_ConstraintDistance::ID())) { @@ -320,8 +230,8 @@ void PartSet_Module::onSelectionChanged() ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); bool isSketcherOp = false; // An edit operation is enable only if the current opeation is the sketch operation - if (aOperation && myCurrentSketch) { - if (PartSet_Tools::sketchPlane(myCurrentSketch)) + if (aOperation && mySketchMgr->activeSketch()) { + if (PartSet_Tools::sketchPlane(mySketchMgr->activeSketch())) isSketcherOp = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID()); } if (!isSketcherOp) @@ -345,214 +255,6 @@ void PartSet_Module::onSelectionChanged() } } -void PartSet_Module::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) -{ - if (!(theEvent->buttons() & Qt::LeftButton)) - return; - - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - // Use only for sketch operations - if (aOperation && myCurrentSketch) { - if (!PartSet_Tools::sketchPlane(myCurrentSketch)) - return; - - bool isSketcher = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID()); - bool isSketchOpe = sketchOperationIdList().contains(aOperation->id()); - - // Avoid non-sketch operations - if ((!isSketchOpe) && (!isSketcher)) - return; - - bool isEditing = aOperation->isEditOperation(); - - // Ignore creation sketch operation - if ((!isSketcher) && (!isEditing)) - return; - - if (theEvent->modifiers()) { - // If user performs multiselection - if (isSketchOpe && (!isSketcher)) - if (!aOperation->commit()) - aOperation->abort(); - return; - } - // Remember highlighted objects for editing - ModuleBase_ISelection* aSelect = myWorkshop->selection(); - QList aHighlighted = aSelect->getHighlighted(); - QList aSelected = aSelect->getSelected(); - myEditingFeatures.clear(); - myEditingAttr.clear(); - if ((aHighlighted.size() == 0) && (aSelected.size() == 0)) { - if (isSketchOpe && (!isSketcher)) - // commit previous operation - if (!aOperation->commit()) - aOperation->abort(); - return; - } - - QObjectPtrList aSelObjects = getSumList(aHighlighted, aSelected); - if ((aHighlighted.size() == 1) && (aSelected.size() == 0)) { - // Move by selected shape (vertex). Can be used only for single selection - foreach(ModuleBase_ViewerPrs aPrs, aHighlighted) { - FeaturePtr aFeature = ModelAPI_Feature::feature(aHighlighted.first().object()); - if (aFeature) { - myEditingFeatures.append(aFeature); - TopoDS_Shape aShape = aPrs.shape(); - if (!aShape.IsNull()) { - if (aShape.ShapeType() == TopAbs_VERTEX) { - AttributePtr aAttr = PartSet_Tools::findAttributeBy2dPoint(myEditingFeatures.first(), - aShape, myCurrentSketch); - if (aAttr) - myEditingAttr.append(aAttr); - } - } - } - } - } else { - // Provide multi-selection. Can be used only for features - foreach (ObjectPtr aObj, aSelObjects) { - FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); - if (aFeature && (!myEditingFeatures.contains(aFeature))) - myEditingFeatures.append(aFeature); - } - - } - // If nothing highlighted - return - if (myEditingFeatures.size() == 0) - return; - - if (isSketcher) { - myIsDragging = true; - get2dPoint(theWnd, theEvent, myCurX, myCurY); - myDragDone = false; - myWorkshop->viewer()->enableSelection(false); - launchEditing(); - - } else if (isSketchOpe && isEditing) { - // If selected another object - aOperation->abort(); - - myIsDragging = true; - get2dPoint(theWnd, theEvent, myCurX, myCurY); - myDragDone = false; - myWorkshop->viewer()->enableSelection(false); - - // This is necessary in order to finalize previous operation - QApplication::processEvents(); - launchEditing(); - } - } -} - - -void PartSet_Module::get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent, - double& theX, double& theY) -{ - Handle(V3d_View) aView = theWnd->v3dView(); - gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView); - PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, theX, theY); -} - - -void PartSet_Module::launchEditing() -{ - if (myEditingFeatures.size() > 0) { - FeaturePtr aFeature = myEditingFeatures.first(); - std::shared_ptr aSPFeature = - std::dynamic_pointer_cast(aFeature); - if (aSPFeature) { - editFeature(aSPFeature); - } - } -} - -void PartSet_Module::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) -{ - myWorkshop->viewer()->enableSelection(true); - if (myIsDragging) { - myIsDragging = false; - if (myDragDone) { - myWorkshop->currentOperation()->commit(); - myEditingFeatures.clear(); - myEditingAttr.clear(); - } - } -} - - -void PartSet_Module::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) -{ - if (myIsDragging) { - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - if (aOperation->id().toStdString() == SketchPlugin_Sketch::ID()) - return; // No edit operation activated - - static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED); - Handle(V3d_View) aView = theWnd->v3dView(); - gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView); - double aX, aY; - PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, aX, aY); - double dX = aX - myCurX; - double dY = aY - myCurY; - - if ((aOperation->id().toStdString() == SketchPlugin_Line::ID()) && - (myEditingAttr.size() == 1) && - myEditingAttr.first()) { - // probably we have prehighlighted point - AttributePtr aAttr = myEditingAttr.first(); - std::string aAttrId = aAttr->id(); - ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); - QList aWidgets = aPanel->modelWidgets(); - // Find corresponded widget to provide dragging - foreach (ModuleBase_ModelWidget* aWgt, aWidgets) { - if (aWgt->attributeID() == aAttrId) { - PartSet_WidgetPoint2D* aWgt2d = dynamic_cast(aWgt); - if (aWgt2d) { - aWgt2d->setPoint(aWgt2d->x() + dX, aWgt2d->y() + dY); - break; - } - } - } - } else { - foreach(FeaturePtr aFeature, myEditingFeatures) { - std::shared_ptr aSketchFeature = - std::dynamic_pointer_cast(aFeature); - if (aSketchFeature) { - aSketchFeature->move(dX, dY); - ModelAPI_EventCreator::get()->sendUpdated(aSketchFeature, anEvent); - } - } - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_MOVED)); - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); - } - myDragDone = true; - myCurX = aX; - myCurY = aY; - } -} - -void PartSet_Module::onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) -{ - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - if (aOperation && aOperation->isEditOperation()) { - std::string aId = aOperation->id().toStdString(); - if ((aId == SketchPlugin_ConstraintLength::ID()) || - (aId == SketchPlugin_ConstraintDistance::ID()) || - (aId == SketchPlugin_ConstraintRadius::ID())) - { - // Activate dimension value editing on double click - ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); - QList aWidgets = aPanel->modelWidgets(); - // Find corresponded widget to activate value editing - foreach (ModuleBase_ModelWidget* aWgt, aWidgets) { - if (aWgt->attributeID() == "ConstraintValue") { - aWgt->focusTo(); - return; - } - } - } - } -} void PartSet_Module::onKeyRelease(ModuleBase_IViewWindow* theWnd, QKeyEvent* theEvent) { @@ -600,22 +302,6 @@ void PartSet_Module::onNoMoreWidgets() } } -QStringList PartSet_Module::sketchOperationIdList() const -{ - QStringList aIds; - aIds << SketchPlugin_Line::ID().c_str(); - aIds << SketchPlugin_Point::ID().c_str(); - aIds << SketchPlugin_Arc::ID().c_str(); - aIds << SketchPlugin_Circle::ID().c_str(); - aIds << SketchPlugin_ConstraintLength::ID().c_str(); - aIds << SketchPlugin_ConstraintDistance::ID().c_str(); - aIds << SketchPlugin_ConstraintRigid::ID().c_str(); - aIds << SketchPlugin_ConstraintRadius::ID().c_str(); - aIds << SketchPlugin_ConstraintPerpendicular::ID().c_str(); - aIds << SketchPlugin_ConstraintParallel::ID().c_str(); - return aIds; -} - void PartSet_Module::onVertexSelected(ObjectPtr theObject, const TopoDS_Shape& theShape) { ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); @@ -639,14 +325,14 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* PartSet_WidgetSketchLabel* aWgt = new PartSet_WidgetSketchLabel(theParent, theWidgetApi, theParentId); aWgt->setWorkshop(aWorkshop); connect(aWgt, SIGNAL(planeSelected(const std::shared_ptr&)), - this, SLOT(onPlaneSelected(const std::shared_ptr&))); + mySketchMgr, SLOT(onPlaneSelected(const std::shared_ptr&))); theModelWidgets.append(aWgt); return aWgt->getControl(); } else if (theType == "sketch-2dpoint_selector") { PartSet_WidgetPoint2D* aWgt = new PartSet_WidgetPoint2D(theParent, theWidgetApi, theParentId); aWgt->setWorkshop(aWorkshop); - aWgt->setSketch(myCurrentSketch); + aWgt->setSketch(mySketchMgr->activeSketch()); connect(aWgt, SIGNAL(vertexSelected(ObjectPtr, const TopoDS_Shape&)), this, SLOT(onVertexSelected(ObjectPtr, const TopoDS_Shape&))); @@ -657,7 +343,7 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* } if (theType == "point2ddistance") { PartSet_WidgetPoint2dDistance* aWgt = new PartSet_WidgetPoint2dDistance(theParent, theWidgetApi, theParentId); aWgt->setWorkshop(aWorkshop); - aWgt->setSketch(myCurrentSketch); + aWgt->setSketch(mySketchMgr->activeSketch()); theModelWidgets.append(aWgt); return aWgt->getControl(); @@ -665,7 +351,7 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* } if (theType == "sketch_shape_selector") { PartSet_WidgetShapeSelector* aWgt = new PartSet_WidgetShapeSelector(theParent, workshop(), theWidgetApi, theParentId); - aWgt->setSketcher(myCurrentSketch); + aWgt->setSketcher(mySketchMgr->activeSketch()); theModelWidgets.append(aWgt); return aWgt->getControl(); @@ -673,12 +359,12 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* } if (theType == "sketch_constraint_shape_selector") { PartSet_WidgetConstraintShapeSelector* aWgt = new PartSet_WidgetConstraintShapeSelector(theParent, workshop(), theWidgetApi, theParentId); - aWgt->setSketcher(myCurrentSketch); + aWgt->setSketcher(mySketchMgr->activeSketch()); theModelWidgets.append(aWgt); return aWgt->getControl(); - }else + } else return 0; } diff --git a/src/PartSet/PartSet_Module.h b/src/PartSet/PartSet_Module.h index e04148a1d..8fa932b39 100644 --- a/src/PartSet/PartSet_Module.h +++ b/src/PartSet/PartSet_Module.h @@ -4,7 +4,8 @@ #define PartSet_Module_H #include "PartSet.h" -#include +#include "PartSet_Filters.h" +#include "PartSet_SketcherMgr.h" #include #include @@ -12,7 +13,7 @@ #include #include -#include +//#include #include #include @@ -49,7 +50,6 @@ public: /// Call back forlast tuning of property panel before operation performance virtual void propertyPanelDefined(ModuleBase_Operation* theOperation); - QStringList sketchOperationIdList() const; /// Realizes some functionality by an operation start /// Displays all sketcher sub-Objects, hides sketcher result, appends selection filters @@ -83,22 +83,22 @@ protected slots: /// SLOT, that is called by mouse press in the viewer. /// \param theWnd - the window where the event happens /// \param theEvent the mouse event - void onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent); + //void onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent); /// SLOT, that is called by mouse release in the viewer. /// \param theWnd - the window where the event happens /// \param theEvent the mouse event - void onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent); + //void onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent); /// SLOT, that is called by mouse move in the viewer. /// \param theWnd - the window where the event happens /// \param theEvent the mouse event - void onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent); + //void onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent); /// SLOT, that is called by mouse double click in the viewer. /// \param theWnd - the window where the event happens /// \param theEvent the mouse event - void onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent); + //void onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent); /// SLOT, that is called by key release in the viewer. /// The mouse moved point is sent to the current operation to be processed. @@ -113,8 +113,6 @@ protected slots: /// It commits the operation of it is can be committed void onOperationActivatedByPreselection(); - /// Launches the operation from current highlighting - void launchEditing(); protected: /// Register validators for this module @@ -126,13 +124,8 @@ protected slots: private slots: void onVertexSelected(ObjectPtr theObject, const TopoDS_Shape& theShape); - void onPlaneSelected(const std::shared_ptr& thePln); private: - /// Converts mouse position to 2d coordinates. - /// Member myCurrentSketch has to be correctly defined - void get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent, - double& theX, double& theY); /// Breaks sequense of automatically resterted operations void breakOperationSequence(); @@ -141,20 +134,13 @@ protected slots: QString myLastOperationId; FeaturePtr myLastFeature; - bool myIsDragging; - bool myDragDone; - // Automatical restarting mode flag RestartingMode myRestartingMode; - double myCurX, myCurY; - CompositeFeaturePtr myCurrentSketch; - QList myEditingFeatures; - QList myEditingAttr; - - Handle(ModuleBase_ShapeInPlaneFilter) myPlaneFilter; /// A filter which provides selection within a current document or whole PartSet Handle(PartSet_GlobalFilter) myDocumentShapeFilter; + + PartSet_SketcherMgr* mySketchMgr; }; #endif diff --git a/src/PartSet/PartSet_SketcherMgr.cpp b/src/PartSet/PartSet_SketcherMgr.cpp new file mode 100644 index 000000000..200297b9c --- /dev/null +++ b/src/PartSet/PartSet_SketcherMgr.cpp @@ -0,0 +1,414 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + +// File: PartSet_SketcherMgr.cpp +// Created: 19 Dec 2014 +// Author: Vitaly SMETANNIKOV + +#include "PartSet_SketcherMgr.h" +#include "PartSet_Module.h" +#include "PartSet_WidgetPoint2D.h" +#include "PartSet_Tools.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + + + + +/// Returns list of unique objects by sum of objects from List1 and List2 +QList getSumList(const QList& theList1, + const QList& theList2) +{ + QList aRes; + foreach (ModuleBase_ViewerPrs aPrs, theList1) { + if (!aRes.contains(aPrs.object())) + aRes.append(aPrs.object()); + } + foreach (ModuleBase_ViewerPrs aPrs, theList2) { + if (!aRes.contains(aPrs.object())) + aRes.append(aPrs.object()); + } + return aRes; +} + + + + +PartSet_SketcherMgr::PartSet_SketcherMgr(PartSet_Module* theModule) + : QObject(theModule), myModule(theModule), myIsDragging(false), myDragDone(false) +{ + ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); + ModuleBase_IViewer* aViewer = aWorkshop->viewer(); + + connect(aViewer, SIGNAL(mousePress(ModuleBase_IViewWindow*, QMouseEvent*)), + this, SLOT(onMousePressed(ModuleBase_IViewWindow*, QMouseEvent*))); + + connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)), + this, SLOT(onMouseReleased(ModuleBase_IViewWindow*, QMouseEvent*))); + + connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), + this, SLOT(onMouseMoved(ModuleBase_IViewWindow*, QMouseEvent*))); + + connect(aViewer, SIGNAL(mouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)), + this, SLOT(onMouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*))); +} + +PartSet_SketcherMgr::~PartSet_SketcherMgr() +{ + if (!myPlaneFilter.IsNull()) + myPlaneFilter.Nullify(); +} + +void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) +{ + // + if (!(theEvent->buttons() & Qt::LeftButton)) + return; + + ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); + ModuleBase_Operation* aOperation = aWorkshop->currentOperation(); + // Use only for sketch operations + if (aOperation && myCurrentSketch) { + if (!PartSet_Tools::sketchPlane(myCurrentSketch)) + return; + + bool isSketcher = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID()); + bool isSketchOpe = sketchOperationIdList().contains(aOperation->id()); + + // Avoid non-sketch operations + if ((!isSketchOpe) && (!isSketcher)) + return; + + bool isEditing = aOperation->isEditOperation(); + + // Ignore creation sketch operation + if ((!isSketcher) && (!isEditing)) + return; + + if (theEvent->modifiers()) { + // If user performs multiselection + if (isSketchOpe /* && (!isSketcher)*/) + if (!aOperation->commit()) + aOperation->abort(); + return; + } + // Remember highlighted objects for editing + ModuleBase_ISelection* aSelect = aWorkshop->selection(); + QList aHighlighted = aSelect->getHighlighted(); + QList aSelected = aSelect->getSelected(); + myEditingFeatures.clear(); + myEditingAttr.clear(); + if ((aHighlighted.size() == 0) && (aSelected.size() == 0)) { + if (isSketchOpe && (!isSketcher)) + // commit previous operation + if (!aOperation->commit()) + aOperation->abort(); + return; + } + + QObjectPtrList aSelObjects = getSumList(aHighlighted, aSelected); + //foreach (ModuleBase_ViewerPrs aPrs, aHighlighted) { + // aSelObjects.append(aPrs.object()); + //} + + if ((aHighlighted.size() == 1) && (aSelected.size() == 0)) { + // Move by selected shape (vertex). Can be used only for single selection + foreach(ModuleBase_ViewerPrs aPrs, aHighlighted) { + FeaturePtr aFeature = ModelAPI_Feature::feature(aHighlighted.first().object()); + if (aFeature) { + myEditingFeatures.append(aFeature); + TopoDS_Shape aShape = aPrs.shape(); + if (!aShape.IsNull()) { + if (aShape.ShapeType() == TopAbs_VERTEX) { + AttributePtr aAttr = PartSet_Tools::findAttributeBy2dPoint(myEditingFeatures.first(), + aShape, myCurrentSketch); + if (aAttr) + myEditingAttr.append(aAttr); + } + } + } + } + } else { + // Provide multi-selection. Can be used only for features + foreach (ObjectPtr aObj, aSelObjects) { + FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); + if (aFeature && (!myEditingFeatures.contains(aFeature))) + myEditingFeatures.append(aFeature); + } + + } + // If nothing highlighted - return + if (myEditingFeatures.size() == 0) + return; + + if (isSketcher) { + myIsDragging = true; + get2dPoint(theWnd, theEvent, myCurX, myCurY); + myDragDone = false; + aWorkshop->viewer()->enableMultiselection(false); + launchEditing(); + + } else if (isSketchOpe && isEditing) { + // If selected another object + aOperation->abort(); + + myIsDragging = true; + get2dPoint(theWnd, theEvent, myCurX, myCurY); + myDragDone = false; + aWorkshop->viewer()->enableMultiselection(false); + + // This is necessary in order to finalize previous operation + QApplication::processEvents(); + launchEditing(); + } + } +} + +void PartSet_SketcherMgr::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) +{ + ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); + ModuleBase_Operation* aOp = aWorkshop->currentOperation(); + if (!aOp) + return; + if (!sketchOperationIdList().contains(aOp->id())) + return; + + // Only for sketcher operations + ModuleBase_IViewer* aViewer = aWorkshop->viewer(); + if (myIsDragging) { + myIsDragging = false; + if (myDragDone) { + aViewer->enableMultiselection(true); + aOp->commit(); + myEditingFeatures.clear(); + myEditingAttr.clear(); + return; + } + } + if (!aViewer->isMultiSelectionEnabled()) { + aViewer->enableMultiselection(true); + } + aViewer->AISContext()->MoveTo(theEvent->x(), theEvent->y(), theWnd->v3dView()); + if (theEvent->modifiers() & Qt::ShiftModifier) + aViewer->AISContext()->ShiftSelect(); + else + aViewer->AISContext()->Select(); +} + +void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) +{ + if (myIsDragging) { + ModuleBase_Operation* aOperation = myModule->workshop()->currentOperation(); + if (aOperation->id().toStdString() == SketchPlugin_Sketch::ID()) + return; // No edit operation activated + + static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED); + Handle(V3d_View) aView = theWnd->v3dView(); + gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView); + double aX, aY; + PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, aX, aY); + double dX = aX - myCurX; + double dY = aY - myCurY; + + if ((aOperation->id().toStdString() == SketchPlugin_Line::ID()) && + (myEditingAttr.size() == 1) && + myEditingAttr.first()) { + // probably we have prehighlighted point + AttributePtr aAttr = myEditingAttr.first(); + std::string aAttrId = aAttr->id(); + ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + QList aWidgets = aPanel->modelWidgets(); + // Find corresponded widget to provide dragging + foreach (ModuleBase_ModelWidget* aWgt, aWidgets) { + if (aWgt->attributeID() == aAttrId) { + PartSet_WidgetPoint2D* aWgt2d = dynamic_cast(aWgt); + if (aWgt2d) { + aWgt2d->setPoint(aWgt2d->x() + dX, aWgt2d->y() + dY); + break; + } + } + } + } else { + foreach(FeaturePtr aFeature, myEditingFeatures) { + std::shared_ptr aSketchFeature = + std::dynamic_pointer_cast(aFeature); + if (aSketchFeature) { + aSketchFeature->move(dX, dY); + ModelAPI_EventCreator::get()->sendUpdated(aSketchFeature, anEvent); + } + } + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_MOVED)); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); + } + myDragDone = true; + myCurX = aX; + myCurY = aY; + } +} + +void PartSet_SketcherMgr::onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) +{ + ModuleBase_Operation* aOperation = myModule->workshop()->currentOperation(); + if (aOperation && aOperation->isEditOperation()) { + std::string aId = aOperation->id().toStdString(); + if ((aId == SketchPlugin_ConstraintLength::ID()) || + (aId == SketchPlugin_ConstraintDistance::ID()) || + (aId == SketchPlugin_ConstraintRadius::ID())) + { + // Activate dimension value editing on double click + ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + QList aWidgets = aPanel->modelWidgets(); + // Find corresponded widget to activate value editing + foreach (ModuleBase_ModelWidget* aWgt, aWidgets) { + if (aWgt->attributeID() == "ConstraintValue") { + aWgt->focusTo(); + return; + } + } + } + } +} + +void PartSet_SketcherMgr::get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent, + double& theX, double& theY) +{ + Handle(V3d_View) aView = theWnd->v3dView(); + gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView); + PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, theX, theY); +} + +void PartSet_SketcherMgr::launchEditing() +{ + if (myEditingFeatures.size() > 0) { + FeaturePtr aFeature = myEditingFeatures.first(); + std::shared_ptr aSPFeature = + std::dynamic_pointer_cast(aFeature); + if (aSPFeature) { + myModule->editFeature(aSPFeature); + } + } +} + + +QStringList PartSet_SketcherMgr::sketchOperationIdList() +{ + static QStringList aIds; + if (aIds.size() == 0) { + aIds << SketchPlugin_Line::ID().c_str(); + aIds << SketchPlugin_Point::ID().c_str(); + aIds << SketchPlugin_Arc::ID().c_str(); + aIds << SketchPlugin_Circle::ID().c_str(); + aIds << SketchPlugin_ConstraintLength::ID().c_str(); + aIds << SketchPlugin_ConstraintDistance::ID().c_str(); + aIds << SketchPlugin_ConstraintRigid::ID().c_str(); + aIds << SketchPlugin_ConstraintRadius::ID().c_str(); + aIds << SketchPlugin_ConstraintPerpendicular::ID().c_str(); + aIds << SketchPlugin_ConstraintParallel::ID().c_str(); + } + return aIds; +} + +void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation) +{ + // Display all sketcher sub-Objects + myCurrentSketch = std::dynamic_pointer_cast(theOperation->feature()); + XGUI_ModuleConnector* aConnector = dynamic_cast(myModule->workshop()); + XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); + + // Hide sketcher result + std::list aResults = myCurrentSketch->results(); + std::list::const_iterator aIt; + for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { + aDisplayer->erase((*aIt), false); + } + aDisplayer->erase(myCurrentSketch, false); + + // Display sketcher 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) { + aDisplayer->display((*aIt), false); + } + aDisplayer->display(aFeature, false); + } + + if (myPlaneFilter.IsNull()) + myPlaneFilter = new ModuleBase_ShapeInPlaneFilter(); + + myModule->workshop()->viewer()->addSelectionFilter(myPlaneFilter); + if (theOperation->isEditOperation()) { + // If it is editing of sketch then it means that plane is already defined + std::shared_ptr aPln = PartSet_Tools::sketchPlane(myCurrentSketch); + myPlaneFilter->setPlane(aPln->impl()); + } + aDisplayer->updateViewer(); +} + +void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation) +{ + DataPtr aData = myCurrentSketch->data(); + if ((!aData) || (!aData->isValid())) { + // The sketch was aborted + myCurrentSketch = CompositeFeaturePtr(); + return; + } + // Hide all sketcher sub-Objects + XGUI_ModuleConnector* aConnector = dynamic_cast(myModule->workshop()); + XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); + 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) { + aDisplayer->erase((*aIt), false); + } + aDisplayer->erase(aFeature, false); + } + // Display sketcher result + std::list aResults = myCurrentSketch->results(); + std::list::const_iterator aIt; + for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { + aDisplayer->display((*aIt), false); + } + aDisplayer->display(myCurrentSketch); + + myCurrentSketch = CompositeFeaturePtr(); + myModule->workshop()->viewer()->removeSelectionFilter(myPlaneFilter); + aDisplayer->updateViewer(); +} + + +void PartSet_SketcherMgr::onPlaneSelected(const std::shared_ptr& thePln) +{ + myPlaneFilter->setPlane(thePln->impl()); +} diff --git a/src/PartSet/PartSet_SketcherMgr.h b/src/PartSet/PartSet_SketcherMgr.h new file mode 100644 index 000000000..813157829 --- /dev/null +++ b/src/PartSet/PartSet_SketcherMgr.h @@ -0,0 +1,86 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + +// File: PartSet_SketcherMgr.h +// Created: 19 Dec 2014 +// Author: Vitaly SMETANNIKOV + +#ifndef PartSet_SketcherMgr_H +#define PartSet_SketcherMgr_H + +#include "PartSet.h" + +#include +#include +#include + +#include + +#include + +#include +#include + +class PartSet_Module; +class ModuleBase_IViewWindow; +class ModuleBase_Operation; +class QMouseEvent; + + +/** +* A class for management of sketch operations +*/ +class PARTSET_EXPORT PartSet_SketcherMgr : public QObject +{ + Q_OBJECT +public: + PartSet_SketcherMgr(PartSet_Module* theModule); + + virtual ~PartSet_SketcherMgr(); + + static QStringList sketchOperationIdList(); + + /// Launches the operation from current highlighting + void launchEditing(); + + // Returns current Sketch feature/ Returns NULL if there is no launched sketch operation + CompositeFeaturePtr activeSketch() const { return myCurrentSketch; } + + /// Starts sketch operation + void startSketch(ModuleBase_Operation* theOperation); + + /// Stops sketch operation + void stopSketch(ModuleBase_Operation* theOperation); + +public slots: + void onPlaneSelected(const std::shared_ptr& thePln); + + +private slots: + void onMousePressed(ModuleBase_IViewWindow*, QMouseEvent*); + void onMouseReleased(ModuleBase_IViewWindow*, QMouseEvent*); + void onMouseMoved(ModuleBase_IViewWindow*, QMouseEvent*); + void onMouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*); + +private: + /// Converts mouse position to 2d coordinates. + /// Member myCurrentSketch has to be correctly defined + void get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent, + double& theX, double& theY); + + +private: + PartSet_Module* myModule; + + bool myIsDragging; + bool myDragDone; + double myCurX, myCurY; + + CompositeFeaturePtr myCurrentSketch; + QList myEditingFeatures; + QList myEditingAttr; + + Handle(ModuleBase_ShapeInPlaneFilter) myPlaneFilter; +}; + + +#endif \ No newline at end of file diff --git a/src/PartSet/PartSet_WidgetSketchLabel.cpp b/src/PartSet/PartSet_WidgetSketchLabel.cpp index d5aa73b6b..454d0e1fc 100644 --- a/src/PartSet/PartSet_WidgetSketchLabel.cpp +++ b/src/PartSet/PartSet_WidgetSketchLabel.cpp @@ -35,6 +35,7 @@ #include #include +#include #define PLANE_SIZE "200" #define SKETCH_WIDTH "4" @@ -51,6 +52,10 @@ PartSet_WidgetSketchLabel::PartSet_WidgetSketchLabel(QWidget* theParent, myTooltip = QString::fromStdString(theData->getProperty("tooltip")); myLabel->setToolTip(""); myLabel->setIndent(5); + + mySelectionTimer = new QTimer(this); + connect(mySelectionTimer, SIGNAL(timeout()), SLOT(setSketchingMode())); + mySelectionTimer->setSingleShot(true); } PartSet_WidgetSketchLabel::~PartSet_WidgetSketchLabel() @@ -128,7 +133,9 @@ void PartSet_WidgetSketchLabel::activate() { std::shared_ptr aPlane = plane(); if (aPlane) { - setSketchingMode(); + //setSketchingMode(); + // In order to avoid Opening/Closing of context too often + mySelectionTimer->start(20); } else { // We have to select a plane before any operation showPreviewPlanes(); @@ -153,7 +160,8 @@ void PartSet_WidgetSketchLabel::activate() void PartSet_WidgetSketchLabel::deactivate() { - + // Do not set selection mode if the widget was activated for a small moment + mySelectionTimer->stop(); XGUI_Displayer* aDisp = myWorkshop->displayer(); aDisp->removeSelectionFilter(myFaceFilter); //aDisp->removeSelectionFilter(mySketchFilter); @@ -264,6 +272,8 @@ std::shared_ptr PartSet_WidgetSketchLabel::setSketchPlane(const Top void PartSet_WidgetSketchLabel::setSketchingMode() { + qDebug("### Set sketching mode"); + XGUI_Displayer* aDisp = myWorkshop->displayer(); QIntList aModes; // Clear standard selection modes if they are defined diff --git a/src/PartSet/PartSet_WidgetSketchLabel.h b/src/PartSet/PartSet_WidgetSketchLabel.h index 58816ee4c..0dbc1da33 100644 --- a/src/PartSet/PartSet_WidgetSketchLabel.h +++ b/src/PartSet/PartSet_WidgetSketchLabel.h @@ -20,9 +20,9 @@ #include class QLabel; +class QTimer; class XGUI_OperationMgr; class XGUI_Workshop; -//class PartSet_OperationSketch; class PARTSET_EXPORT PartSet_WidgetSketchLabel : public ModuleBase_ModelWidget { @@ -68,6 +68,7 @@ signals: private slots: void onPlaneSelected(); + void setSketchingMode(); private: AISObjectPtr createPreviewPlane(std::shared_ptr theOrigin, @@ -79,7 +80,6 @@ signals: void erasePreviewPlanes(); void showPreviewPlanes(); - void setSketchingMode(); QLabel* myLabel; QString myText; @@ -93,7 +93,8 @@ signals: bool myPreviewDisplayed; Handle(StdSelect_FaceFilter) myFaceFilter; - //Handle(ModuleBase_ShapeInPlaneFilter) mySketchFilter; + + QTimer* mySelectionTimer; }; #endif diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 17f52eb5f..dfed75b1f 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -191,6 +191,7 @@ void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes) if (aContext->HasOpenedContext()) { aContext->Load(anAIS, -1, true); } + aContext->Deactivate(anAIS); if (theModes.size() > 0) { foreach(int aMode, theModes) { aContext->Activate(anAIS, aMode); @@ -358,8 +359,11 @@ void XGUI_Displayer::openLocalContext() // in the closeLocalContex, which restore the global context filters aContext->RemoveFilters(); - aContext->ClearCurrents(); + //aContext->ClearCurrents(); aContext->OpenLocalContext(); + + qDebug("### Open Local context"); + aContext->NotUseDisplayedObjects(); myUseExternalObjects = false; @@ -391,9 +395,11 @@ void XGUI_Displayer::closeLocalContexts(const bool isUpdateViewer) SelectMgr_ListOfFilter aFilters; aFilters.Assign(aContext->Filters()); - aContext->ClearSelected(); + //aContext->ClearSelected(); aContext->CloseAllContexts(false); + qDebug("### Close Local context"); + // Redisplay all object if they were displayed in localContext Handle(AIS_InteractiveObject) aAISIO; foreach (AISObjectPtr aAIS, myResult2AISObjectMap) { @@ -481,6 +487,7 @@ void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool isUpdate) aContext->Display(anAISIO, isUpdate); if (aContext->HasOpenedContext()) { if (myUseExternalObjects) { + aContext->Deactivate(anAISIO); if (myActiveSelectionModes.size() == 0) aContext->Activate(anAISIO); else { @@ -517,34 +524,21 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes) AIS_ListOfInteractive aPrsList; aContext->DisplayedObjects(aPrsList, true); - Handle(AIS_Trihedron) aTrihedron; AIS_ListIteratorOfListOfInteractive aLIt(aPrsList); - for(; aLIt.More(); aLIt.Next()){ - aTrihedron = Handle(AIS_Trihedron)::DownCast(aLIt.Value()); - if (!aTrihedron.IsNull()) { - aContext->Deactivate(aTrihedron); - break; - } - } - - //Activate all displayed objects with the module modes - //AIS_ListOfInteractive aPrsList; - //aContext->DisplayedObjects(aPrsList, true); - - //AIS_ListIteratorOfListOfInteractive aLIt(aPrsList); Handle(AIS_InteractiveObject) anAISIO; + Handle(AIS_Trihedron) aTrihedron; for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){ anAISIO = aLIt.Value(); aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO); - if (!aTrihedron.IsNull()) - continue; - - aContext->Load(anAISIO, -1, true); - if (theModes.size() == 0) - aContext->Activate(anAISIO); - else { - foreach(int aMode, theModes) { - aContext->Activate(anAISIO, aMode); + aContext->Deactivate(anAISIO); + if (aTrihedron.IsNull()) { + aContext->Load(anAISIO, -1, true); + if (theModes.size() == 0) + aContext->Activate(anAISIO); + else { + foreach(int aMode, theModes) { + aContext->Activate(anAISIO, aMode); + } } } } diff --git a/src/XGUI/XGUI_ViewerProxy.cpp b/src/XGUI/XGUI_ViewerProxy.cpp index 25baff9a7..a4a55cca5 100644 --- a/src/XGUI/XGUI_ViewerProxy.cpp +++ b/src/XGUI/XGUI_ViewerProxy.cpp @@ -257,3 +257,9 @@ void XGUI_ViewerProxy::clearSelectionFilters() { myWorkshop->displayer()->removeFilters(); } + +//*************************************** +void XGUI_ViewerProxy::update() +{ + myWorkshop->displayer()->updateViewer(); +} diff --git a/src/XGUI/XGUI_ViewerProxy.h b/src/XGUI/XGUI_ViewerProxy.h index 1f20b281b..7cd1f90d6 100644 --- a/src/XGUI/XGUI_ViewerProxy.h +++ b/src/XGUI/XGUI_ViewerProxy.h @@ -63,6 +63,9 @@ Q_OBJECT /// Remove all selection filters from the viewer virtual void clearSelectionFilters(); + /// Update current viewer + virtual void update(); + private slots: void onTryCloseView(AppElements_ViewWindow*); void onDeleteView(AppElements_ViewWindow*);