/// 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);
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)
aContext->RemoveFilters();
}
}
+
+//***************************************
+void NewGeom_SalomeViewer::update()
+{
+ Handle(AIS_InteractiveContext) aContext = AISContext();
+ if (!aContext.IsNull()) {
+ aContext->UpdateCurrentViewer();
+ }
+}
return mySelector;
}
+ /// Update current viewer
+ virtual void update();
+
+
private slots:
void onMousePress(SUIT_ViewWindow*, QMouseEvent*);
void onMouseRelease(SUIT_ViewWindow*, QMouseEvent*);
PartSet_WidgetPoint2dDistance.h
PartSet_WidgetShapeSelector.h
PartSet_Filters.h
+ PartSet_SketcherMgr.h
)
SET(PROJECT_SOURCES
PartSet_WidgetPoint2dDistance.cpp
PartSet_WidgetShapeSelector.cpp
PartSet_Filters.cpp
+ PartSet_SketcherMgr.cpp
)
SET(PROJECT_RESOURCES
#include <PartSet_WidgetPoint2d.h>
#include <PartSet_WidgetPoint2dDistance.h>
#include <PartSet_WidgetShapeSelector.h>
+#include <PartSet_SketcherMgr.h>
#include <ModuleBase_Operation.h>
#include <ModuleBase_IViewer.h>
#include <XGUI_ModuleConnector.h>
#include <XGUI_Tools.h>
-#include <SketchPlugin_Line.h>
+#include <SketchPlugin_Feature.h>
#include <SketchPlugin_Sketch.h>
-#include <SketchPlugin_Point.h>
-#include <SketchPlugin_Arc.h>
-#include <SketchPlugin_Circle.h>
+#include <SketchPlugin_Line.h>
+//#include <SketchPlugin_Arc.h>
+//#include <SketchPlugin_Circle.h>
#include <SketchPlugin_ConstraintLength.h>
#include <SketchPlugin_ConstraintDistance.h>
#include <SketchPlugin_ConstraintParallel.h>
#include <SketchPlugin_ConstraintPerpendicular.h>
#include <SketchPlugin_ConstraintRadius.h>
-#include <SketchPlugin_ConstraintRigid.h>
+//#include <SketchPlugin_ConstraintRigid.h>
#include <Events_Loop.h>
#include <QDebug>
#endif
-
-/// Returns list of unique objects by sum of objects from List1 and List2
-QList<ObjectPtr> getSumList(const QList<ModuleBase_ViewerPrs>& theList1,
- const QList<ModuleBase_ViewerPrs>& theList2)
-{
- QList<ObjectPtr> 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)
{
PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop)
: ModuleBase_IModule(theWshop),
- myIsDragging(false), myRestartingMode(RM_None), myDragDone(false)
+ myRestartingMode(RM_None)
{
//myWorkshop = dynamic_cast<XGUI_Workshop*>(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<XGUI_ModuleConnector*>(theWshop);
XGUI_Workshop* aWorkshop = aConnector->workshop();
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*)));
}
{
if (!myDocumentShapeFilter.IsNull())
myDocumentShapeFilter.Nullify();
- if (!myPlaneFilter.IsNull())
- myPlaneFilter.Nullify();
}
void PartSet_Module::registerValidators()
void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation)
{
if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) {
- // Display all sketcher sub-Objects
- myCurrentSketch = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(theOperation->feature());
- XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(workshop());
- XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
-
- for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
- FeaturePtr aFeature = myCurrentSketch->subFeature(i);
- std::list<ResultPtr> aResults = aFeature->results();
- std::list<ResultPtr>::const_iterator aIt;
- for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
- aDisplayer->display((*aIt), false);
- }
- aDisplayer->display(aFeature);
- }
- // Hide sketcher result
- std::list<ResultPtr> aResults = myCurrentSketch->results();
- std::list<ResultPtr>::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<GeomAPI_Pln> aPln = PartSet_Tools::sketchPlane(myCurrentSketch);
- myPlaneFilter->setPlane(aPln->impl<gp_Pln>());
- }
+ mySketchMgr->startSketch(theOperation);
}
if (myDocumentShapeFilter.IsNull())
myDocumentShapeFilter = new PartSet_GlobalFilter(myWorkshop);
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<XGUI_ModuleConnector*>(workshop());
- XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
- for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
- FeaturePtr aFeature = myCurrentSketch->subFeature(i);
- std::list<ResultPtr> aResults = aFeature->results();
- std::list<ResultPtr>::const_iterator aIt;
- for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
- aDisplayer->erase((*aIt), false);
- }
- aDisplayer->erase(aFeature, false);
- }
- // Display sketcher result
- std::list<ResultPtr> aResults = myCurrentSketch->results();
- std::list<ResultPtr>::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<GeomAPI_Pln>& thePln)
-{
- myPlaneFilter->setPlane(thePln->impl<gp_Pln>());
-}
-
void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation)
{
std::dynamic_pointer_cast<GeomDataAPI_Point2D>(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);
}
// 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())) {
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)
}
}
-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<ModuleBase_ViewerPrs> aHighlighted = aSelect->getHighlighted();
- QList<ModuleBase_ViewerPrs> 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<SketchPlugin_Feature> aSPFeature =
- std::dynamic_pointer_cast<SketchPlugin_Feature>(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<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
- // Find corresponded widget to provide dragging
- foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
- if (aWgt->attributeID() == aAttrId) {
- PartSet_WidgetPoint2D* aWgt2d = dynamic_cast<PartSet_WidgetPoint2D*>(aWgt);
- if (aWgt2d) {
- aWgt2d->setPoint(aWgt2d->x() + dX, aWgt2d->y() + dY);
- break;
- }
- }
- }
- } else {
- foreach(FeaturePtr aFeature, myEditingFeatures) {
- std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
- std::dynamic_pointer_cast<SketchPlugin_Feature>(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<ModuleBase_ModelWidget*> 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)
{
}
}
-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();
PartSet_WidgetSketchLabel* aWgt = new PartSet_WidgetSketchLabel(theParent, theWidgetApi, theParentId);
aWgt->setWorkshop(aWorkshop);
connect(aWgt, SIGNAL(planeSelected(const std::shared_ptr<GeomAPI_Pln>&)),
- this, SLOT(onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>&)));
+ mySketchMgr, SLOT(onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>&)));
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&)));
} 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();
} 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();
} 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;
}
#define PartSet_Module_H
#include "PartSet.h"
-#include <PartSet_Filters.h>
+#include "PartSet_Filters.h"
+#include "PartSet_SketcherMgr.h"
#include <ModuleBase_IModule.h>
#include <ModuleBase_Definitions.h>
#include <ModelAPI_Attribute.h>
#include <ModelAPI_CompositeFeature.h>
-#include <StdSelect_FaceFilter.hxx>
+//#include <StdSelect_FaceFilter.hxx>
#include <TopoDS_Shape.hxx>
#include <QMap>
/// 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
/// 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.
/// 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
private slots:
void onVertexSelected(ObjectPtr theObject, const TopoDS_Shape& theShape);
- void onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>& 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();
QString myLastOperationId;
FeaturePtr myLastFeature;
- bool myIsDragging;
- bool myDragDone;
-
// Automatical restarting mode flag
RestartingMode myRestartingMode;
- double myCurX, myCurY;
- CompositeFeaturePtr myCurrentSketch;
- QList<FeaturePtr> myEditingFeatures;
- QList<AttributePtr> 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
--- /dev/null
+// 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 <XGUI_ModuleConnector.h>
+#include <XGUI_Displayer.h>
+#include <XGUI_Workshop.h>
+
+#include <ModuleBase_IViewer.h>
+#include <ModuleBase_IWorkshop.h>
+#include <ModuleBase_IViewWindow.h>
+#include <ModuleBase_Operation.h>
+#include <ModuleBase_ISelection.h>
+#include <ModuleBase_IPropertyPanel.h>
+#include <ModuleBase_Operation.h>
+
+#include <Events_Loop.h>
+
+#include <SketchPlugin_Line.h>
+#include <SketchPlugin_Sketch.h>
+#include <SketchPlugin_Point.h>
+#include <SketchPlugin_Arc.h>
+#include <SketchPlugin_Circle.h>
+#include <SketchPlugin_ConstraintLength.h>
+#include <SketchPlugin_ConstraintDistance.h>
+#include <SketchPlugin_ConstraintParallel.h>
+#include <SketchPlugin_ConstraintPerpendicular.h>
+#include <SketchPlugin_ConstraintRadius.h>
+#include <SketchPlugin_ConstraintRigid.h>
+
+#include <ModelAPI_Events.h>
+
+#include <QMouseEvent>
+#include <QApplication>
+
+
+
+
+/// Returns list of unique objects by sum of objects from List1 and List2
+QList<ObjectPtr> getSumList(const QList<ModuleBase_ViewerPrs>& theList1,
+ const QList<ModuleBase_ViewerPrs>& theList2)
+{
+ QList<ObjectPtr> 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<ModuleBase_ViewerPrs> aHighlighted = aSelect->getHighlighted();
+ QList<ModuleBase_ViewerPrs> 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<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
+ // Find corresponded widget to provide dragging
+ foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
+ if (aWgt->attributeID() == aAttrId) {
+ PartSet_WidgetPoint2D* aWgt2d = dynamic_cast<PartSet_WidgetPoint2D*>(aWgt);
+ if (aWgt2d) {
+ aWgt2d->setPoint(aWgt2d->x() + dX, aWgt2d->y() + dY);
+ break;
+ }
+ }
+ }
+ } else {
+ foreach(FeaturePtr aFeature, myEditingFeatures) {
+ std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
+ std::dynamic_pointer_cast<SketchPlugin_Feature>(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<ModuleBase_ModelWidget*> 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<SketchPlugin_Feature> aSPFeature =
+ std::dynamic_pointer_cast<SketchPlugin_Feature>(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<ModelAPI_CompositeFeature>(theOperation->feature());
+ XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myModule->workshop());
+ XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
+
+ // Hide sketcher result
+ std::list<ResultPtr> aResults = myCurrentSketch->results();
+ std::list<ResultPtr>::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<ResultPtr> aResults = aFeature->results();
+ std::list<ResultPtr>::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<GeomAPI_Pln> aPln = PartSet_Tools::sketchPlane(myCurrentSketch);
+ myPlaneFilter->setPlane(aPln->impl<gp_Pln>());
+ }
+ 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<XGUI_ModuleConnector*>(myModule->workshop());
+ XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
+ for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
+ FeaturePtr aFeature = myCurrentSketch->subFeature(i);
+ std::list<ResultPtr> aResults = aFeature->results();
+ std::list<ResultPtr>::const_iterator aIt;
+ for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
+ aDisplayer->erase((*aIt), false);
+ }
+ aDisplayer->erase(aFeature, false);
+ }
+ // Display sketcher result
+ std::list<ResultPtr> aResults = myCurrentSketch->results();
+ std::list<ResultPtr>::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<GeomAPI_Pln>& thePln)
+{
+ myPlaneFilter->setPlane(thePln->impl<gp_Pln>());
+}
--- /dev/null
+// 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 <ModelAPI_Feature.h>
+#include <ModelAPI_Attribute.h>
+#include <ModelAPI_CompositeFeature.h>
+
+#include <ModuleBase_ViewerFilters.h>
+
+#include <GeomAPI_Pln.h>
+
+#include <QObject>
+#include <QList>
+
+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<GeomAPI_Pln>& 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<FeaturePtr> myEditingFeatures;
+ QList<AttributePtr> myEditingAttr;
+
+ Handle(ModuleBase_ShapeInPlaneFilter) myPlaneFilter;
+};
+
+
+#endif
\ No newline at end of file
#include <Config_PropManager.h>
#include <QLabel>
+#include <QTimer>
#define PLANE_SIZE "200"
#define SKETCH_WIDTH "4"
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()
{
std::shared_ptr<GeomAPI_Pln> 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();
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);
void PartSet_WidgetSketchLabel::setSketchingMode()
{
+ qDebug("### Set sketching mode");
+
XGUI_Displayer* aDisp = myWorkshop->displayer();
QIntList aModes;
// Clear standard selection modes if they are defined
#include <TopoDS_Shape.hxx>
class QLabel;
+class QTimer;
class XGUI_OperationMgr;
class XGUI_Workshop;
-//class PartSet_OperationSketch;
class PARTSET_EXPORT PartSet_WidgetSketchLabel : public ModuleBase_ModelWidget
{
private slots:
void onPlaneSelected();
+ void setSketchingMode();
private:
AISObjectPtr createPreviewPlane(std::shared_ptr<GeomAPI_Pnt> theOrigin,
void erasePreviewPlanes();
void showPreviewPlanes();
- void setSketchingMode();
QLabel* myLabel;
QString myText;
bool myPreviewDisplayed;
Handle(StdSelect_FaceFilter) myFaceFilter;
- //Handle(ModuleBase_ShapeInPlaneFilter) mySketchFilter;
+
+ QTimer* mySelectionTimer;
};
#endif
if (aContext->HasOpenedContext()) {
aContext->Load(anAIS, -1, true);
}
+ aContext->Deactivate(anAIS);
if (theModes.size() > 0) {
foreach(int aMode, theModes) {
aContext->Activate(anAIS, aMode);
// 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;
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) {
aContext->Display(anAISIO, isUpdate);
if (aContext->HasOpenedContext()) {
if (myUseExternalObjects) {
+ aContext->Deactivate(anAISIO);
if (myActiveSelectionModes.size() == 0)
aContext->Activate(anAISIO);
else {
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);
+ }
}
}
}
{
myWorkshop->displayer()->removeFilters();
}
+
+//***************************************
+void XGUI_ViewerProxy::update()
+{
+ myWorkshop->displayer()->updateViewer();
+}
/// 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*);