X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FXGUI%2FXGUI_ViewerProxy.cpp;h=cc73e969d09231ad0ad0395bbafac7ddddb253ee;hb=77ce6d35ac8d2f0fdaecb4f23e0870bf74e36103;hp=d763573e353fb6cccda447eec738675b03c3ffdf;hpb=d14f608e765948eb2f0a37fedb8a1ef44abf2610;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ViewerProxy.cpp b/src/XGUI/XGUI_ViewerProxy.cpp index d763573e3..cc73e969d 100644 --- a/src/XGUI/XGUI_ViewerProxy.cpp +++ b/src/XGUI/XGUI_ViewerProxy.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2024 CEA, EDF // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "XGUI_ViewerProxy.h" @@ -31,11 +30,21 @@ #endif #include +#include #include +#include +#include + +#include #include +#include #include +#include + + +#define HIGHLIGHT_COLOR Quantity_NOC_YELLOW XGUI_ViewerProxy::XGUI_ViewerProxy(XGUI_Workshop* theParent) : ModuleBase_IViewer(theParent), @@ -113,7 +122,7 @@ void XGUI_ViewerProxy::setViewProjection(double theX, double theY, double theZ, aView3d->SetProj(theX, theY, theZ); aView3d->SetTwist( theTwist ); aView3d->FitAll(0.01, false); - aView3d->SetZSize(0.); + //aView3d->SetZSize(0.); if (aView3d->Depth() < 0.1) aView3d->DepthFitAll(); } @@ -166,13 +175,13 @@ void XGUI_ViewerProxy::connectToViewer() SIGNAL(mouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*))); connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), - this, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*))); + this, SLOT(onMouseMove(ModuleBase_IViewWindow*, QMouseEvent*))); connect(aViewer, SIGNAL(keyPress(ModuleBase_IViewWindow*, QKeyEvent*)), - this, SIGNAL(keyPress(ModuleBase_IViewWindow*, QKeyEvent*))); + this, SLOT(onKeyPress(ModuleBase_IViewWindow*, QKeyEvent*))); connect(aViewer, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)), - this, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*))); + this, SLOT(onKeyRelease(ModuleBase_IViewWindow*, QKeyEvent*))); connect(aViewer, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged())); @@ -180,6 +189,7 @@ void XGUI_ViewerProxy::connectToViewer() connect(aViewer, SIGNAL(contextMenuRequested(QContextMenuEvent*)), this, SIGNAL(contextMenuRequested(QContextMenuEvent*))); + #else AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer(); @@ -235,9 +245,7 @@ bool XGUI_ViewerProxy::eventFilter(QObject *theObject, QEvent *theEvent) void XGUI_ViewerProxy::onViewCreated(ModuleBase_IViewWindow* theWnd) { theWnd->viewPort()->installEventFilter(this); - myWindowScale.insert (theWnd->v3dView(), theWnd->v3dView()->Camera()->Scale()); - emit viewCreated(theWnd); } @@ -286,67 +294,42 @@ void XGUI_ViewerProxy::onMouseDoubleClick(AppElements_ViewWindow* theWnd, QMouse emit mouseDoubleClick(theWnd, theEvent); } -void XGUI_ViewerProxy::displayHighlight() -{ - Handle(AIS_InteractiveContext) aContext = AISContext(); - std::list aResults = myFeature->results(); - std::list::const_iterator aIt; - ResultPtr aRes; - Handle(AIS_Shape) aAis; - for (aIt = aResults.cbegin(); aIt != aResults.cend(); aIt++) { - aRes = (*aIt); - TopoDS_Shape aTShape = aRes->shape()->impl(); - aAis = new AIS_Shape(aTShape); - aAis->SetColor(Quantity_NOC_CYAN3); - aAis->SetZLayer(Graphic3d_ZLayerId_Topmost); - myHighlights.Append(aAis); - aContext->Display(aAis, false); - aContext->Deactivate(aAis); - } -} - -void XGUI_ViewerProxy::eraseHighlight() -{ - Handle(AIS_InteractiveContext) aContext = AISContext(); - Handle(AIS_InteractiveObject) anAISIO; - AIS_ListIteratorOfListOfInteractive aLIt; - for (aLIt.Initialize(myHighlights); aLIt.More(); aLIt.Next()) { - anAISIO = aLIt.Value(); - aContext->Remove(anAISIO, false); - } - myHighlights.Clear(); -} - void XGUI_ViewerProxy::onMouseMove(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent) { - Handle(AIS_InteractiveContext) aContext = AISContext(); - if (!aContext.IsNull()) { - Handle(SelectMgr_EntityOwner) aOwner; - Handle(AIS_InteractiveObject) anIO; - ObjectPtr aObj; - bool isDisplayed = false; - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - for (aContext->InitDetected(); aContext->MoreDetected(); aContext->NextDetected()) { - aOwner = aContext->DetectedOwner(); - anIO = Handle(AIS_InteractiveObject)::DownCast(aOwner->Selectable()); - aObj = aDisplayer->getObject(anIO); - if (aObj.get()) { - FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); - if (aFeature.get()) { - if (aFeature != myFeature) { - eraseHighlight(); - myFeature = aFeature; - displayHighlight(); - aContext->UpdateCurrentViewer(); - } - isDisplayed = true; - } + if (theEvent->buttons() != Qt::NoButton) + eraseHighlight(); + else { + if (myIs2dMode) { + bool aHighlight2d = + ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "highlighting-2d", true); + if (aHighlight2d) { + if (myShowHighlight) + eraseHighlight(); + else + updateHighlight(); + } + else { + if (myShowHighlight) + updateHighlight(); + else + eraseHighlight(); } } - if (!isDisplayed) { - eraseHighlight(); - aContext->UpdateCurrentViewer(); - myFeature = FeaturePtr(); + else { + bool aHighlight3d = + ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "highlighting-3d", false); + if (aHighlight3d) { + if (myShowHighlight) + eraseHighlight(); + else + updateHighlight(); + } + else { + if (myShowHighlight) + updateHighlight(); + else + eraseHighlight(); + } } } emit mouseMove(theWnd, theEvent); @@ -354,11 +337,15 @@ void XGUI_ViewerProxy::onMouseMove(AppElements_ViewWindow* theWnd, QMouseEvent* void XGUI_ViewerProxy::onKeyPress(AppElements_ViewWindow* theWnd, QKeyEvent* theEvent) { + myShowHighlight = theEvent->key() == Qt::Key_H; emit keyPress(theWnd, theEvent); } void XGUI_ViewerProxy::onKeyRelease(AppElements_ViewWindow* theWnd, QKeyEvent* theEvent) { + if (theEvent->key() == Qt::Key_H) { + myShowHighlight = false; + } emit keyRelease(theWnd, theEvent); } @@ -461,20 +448,310 @@ bool XGUI_ViewerProxy::canDragByMouse() const } } +//*************************************** +Handle(AIS_Shape) createPresentation(const TopoDS_Shape& theShape, double theDeviation) +{ + Handle(AIS_Shape) aAis = new AIS_Shape(theShape); + aAis->SetColor(HIGHLIGHT_COLOR); + aAis->SetZLayer(Graphic3d_ZLayerId_Top); //Graphic3d_ZLayerId_Topmost + aAis->Attributes()->SetDeviationCoefficient(theDeviation); + aAis->Attributes()->SetIsoOnPlane(false); + return aAis; +} //*************************************** -//void XGUI_ViewerProxy::Zfitall() -//{ -//#ifdef HAVE_SALOME -// myWorkshop->salomeConnector()->viewer()->Zfitall(); -//#else -// AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer(); -// AppElements_ViewWindow* aView = aViewer->activeViewWindow(); -// if (aView) { -// Handle(V3d_View) aView3d = aView->v3dView(); -// aView3d->ZFitAll(); -// if (aView3d->Depth() < 0.1) -// aView3d->DepthFitAll(); -// } -//#endif -//} \ No newline at end of file +void XGUI_ViewerProxy::createPresentations(const ResultPtr& theRes, + const TopoDS_Shape& theIgnoreShape) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + Handle(AIS_Shape) aAis; + Handle(AIS_InteractiveObject) anAISIO; + double aDeviation = 0.001; + + TopoDS_Shape aTShape = theRes->shape()->impl(); + if (!aTShape.IsSame(theIgnoreShape)) { + AISObjectPtr aAISPrs = aDisplayer->getAISObject(theRes); + if (aAISPrs.get()) { + anAISIO = aAISPrs->impl(); + aDeviation = anAISIO->Attributes()->DeviationCoefficient(); + } + else { + aDeviation = Config_PropManager::real("Visualization", "construction_deflection"); + } + aAis = createPresentation(aTShape, aDeviation); + myHighlights.Append(aAis); + aContext->Display(aAis, false); + aContext->Deactivate(aAis); + } +} + + +void XGUI_ViewerProxy::displayHighlight(FeaturePtr theFeature, const TopoDS_Shape& theIgnoreShape) +{ + if (theFeature.get()) { + std::list aResults = theFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResults.cbegin(); aIt != aResults.cend(); aIt++) { + createPresentations((*aIt), theIgnoreShape); + } + } +} + +bool XGUI_ViewerProxy::eraseHighlight() +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + Handle(AIS_InteractiveObject) anAISIO; + AIS_ListIteratorOfListOfInteractive aLIt; + bool isErased = myHighlights.Extent() > 0; + for (aLIt.Initialize(myHighlights); aLIt.More(); aLIt.Next()) { + anAISIO = aLIt.Value(); + aContext->Remove(anAISIO, false); + } + myHighlights.Clear(); + return isErased; +} + +void XGUI_ViewerProxy::updateHighlight() +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (!aContext.IsNull()) { + Handle(StdSelect_BRepOwner) aOwner; + Handle(AIS_InteractiveObject) anIO; + bool isDisplayed = false; + TopoDS_Shape aShape, aShp; + ResultPtr aRes; + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + for (aContext->InitDetected(); aContext->MoreDetected(); aContext->NextDetected()) { + aOwner = Handle(StdSelect_BRepOwner)::DownCast(aContext->DetectedOwner()); + if ((!aOwner.IsNull()) && aOwner->HasShape()) { + aShape = aOwner->Shape(); + anIO = Handle(AIS_InteractiveObject)::DownCast(aOwner->Selectable()); + aRes = std::dynamic_pointer_cast(aDisplayer->getObject(anIO)); + if (aRes.get() && (aRes != myResult)) { + eraseHighlight(); + FeaturePtr aFeature = ModelAPI_Feature::feature(aRes); + aShp = aRes->shape()->impl(); + if ((aFeature->results().size() > 1) || (!aShp.IsSame(aShape))) { + myResult = aRes; + displayHighlight(aFeature, aShape); + } + else { + myResult = ResultPtr(); + } + update(); + } + isDisplayed = aRes.get(); + } + } + if (!isDisplayed) { + if (eraseHighlight()) { + update(); + } + myResult = ResultPtr(); + } + } +} + +#ifdef HAVE_SALOME +void XGUI_ViewerProxy::onMouseMove(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) +{ + if (theEvent->buttons() != Qt::NoButton) + eraseHighlight(); + else { + if (myIs2dMode) { + bool aHighlight2d = + ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "highlighting-2d", true); + if (aHighlight2d) { + if (myShowHighlight) + eraseHighlight(); + else + updateHighlight(); + } + else { + if (myShowHighlight) + updateHighlight(); + else + eraseHighlight(); + } + } + else { + bool aHighlight3d = + ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "highlighting-3d", false); + if (aHighlight3d) { + if (myShowHighlight) + eraseHighlight(); + else + updateHighlight(); + } + else { + if (myShowHighlight) + updateHighlight(); + else + eraseHighlight(); + } + } + } + emit mouseMove(theWnd, theEvent); +} + +void XGUI_ViewerProxy::onKeyPress(ModuleBase_IViewWindow* theWnd, QKeyEvent* theEvent) +{ + myShowHighlight = theEvent->key() == Qt::Key_H; + emit keyPress(theWnd, theEvent); +} + +void XGUI_ViewerProxy::onKeyRelease(ModuleBase_IViewWindow* theWnd, QKeyEvent* theEvent) +{ + if (theEvent->key() == Qt::Key_H) { + myShowHighlight = false; + } + emit keyRelease(theWnd, theEvent); +} +#endif + + +bool XGUI_ViewerProxy::isColorScaleVisible() const +{ +#ifdef HAVE_SALOME + return myWorkshop->salomeConnector()->viewer()->isColorScaleVisible(); +#else + return myWorkshop->mainWindow()->viewer()->isColorScaleVisible(); +#endif +} + +void XGUI_ViewerProxy::setColorScaleShown(bool on) +{ +#ifdef HAVE_SALOME + myWorkshop->salomeConnector()->viewer()->setColorScaleShown(on); +#else + myWorkshop->mainWindow()->viewer()->setColorScaleShown(on); +#endif +} + +void XGUI_ViewerProxy::setColorScalePosition(double theX, double theY) +{ +#ifdef HAVE_SALOME + myWorkshop->salomeConnector()->viewer()->setColorScalePosition(theX, theY); +#else + QWidget* aWindow = activeViewPort(); + Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale(); + aColorScale->SetPosition(aWindow->width() * theX, aWindow->height() * theY); +#endif +} + +void XGUI_ViewerProxy::setColorScaleSize(double theW, double theH) +{ +#ifdef HAVE_SALOME + myWorkshop->salomeConnector()->viewer()->setColorScaleSize(theW, theH); +#else + QWidget* aWindow = activeViewPort(); + Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale(); + aColorScale->SetSize(aWindow->width() * theW, aWindow->height() * theH); +#endif +} + +void XGUI_ViewerProxy::setColorScaleRange(double theMin, double theMax) +{ +#ifdef HAVE_SALOME + myWorkshop->salomeConnector()->viewer()->setColorScaleRange(theMin, theMax); +#else + Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale(); + aColorScale->SetRange(theMin, theMax); +#endif +} + +void XGUI_ViewerProxy::setColorScaleIntervals(int theNb) +{ +#ifdef HAVE_SALOME + myWorkshop->salomeConnector()->viewer()->setColorScaleIntervals(theNb); +#else + Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale(); + aColorScale->SetNumberOfIntervals(theNb); +#endif +} + +void XGUI_ViewerProxy::setColorScaleTextColor(const QColor& theColor) +{ +#ifdef HAVE_SALOME + myWorkshop->salomeConnector()->viewer()->setColorScaleTextColor(theColor); +#else + Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale(); + Quantity_Color aColor(theColor.redF(), theColor.greenF(), theColor.blueF(), Quantity_TOC_RGB); + aColorScale->SetColor(aColor); +#endif +} + + +void XGUI_ViewerProxy::setColorScaleTextHeigth(int theH) +{ +#ifdef HAVE_SALOME + myWorkshop->salomeConnector()->viewer()->setColorScaleTextHeigth(theH); +#else + Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale(); + aColorScale->SetTextHeight(theH); +#endif +} + +void XGUI_ViewerProxy::setColorScaleTitle(const QString& theText) +{ +#ifdef HAVE_SALOME + myWorkshop->salomeConnector()->viewer()->setColorScaleTitle(theText); +#else + Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale(); + aColorScale->SetTitle(theText.toStdWString().c_str()); +#endif +} + + +//****************************************************** +void XGUI_ViewerProxy::setupColorScale() +{ + SUIT_ResourceMgr* aResMgr = ModuleBase_Preferences::resourceMgr(); + double aX = aResMgr->doubleValue("Viewer", "scalar_bar_x_position", 0.03); + double aY = aResMgr->doubleValue("Viewer", "scalar_bar_y_position", 0.35); + setColorScalePosition(aX, aY); + + double aW = aResMgr->doubleValue("Viewer", "scalar_bar_width", 0.2); + double aH = aResMgr->doubleValue("Viewer", "scalar_bar_height", 0.5); + setColorScaleSize(aW, aH); + + QColor aColor = aResMgr->colorValue("Viewer", "scalar_bar_text_color", Qt::black); + setColorScaleTextColor(aColor); + + int aT = aResMgr->integerValue("Viewer", "scalar_bar_text_height", 14); + setColorScaleTextHeigth(aT); + + int aN = aResMgr->integerValue("Viewer", "scalar_bar_nb_intervals", 20); + setColorScaleIntervals(aN); +} + +void XGUI_ViewerProxy::setText( + const ModuleBase_IViewer::TextColor& theText, const int theSize) +{ +#ifdef HAVE_SALOME + myWorkshop->salomeConnector()->viewer()->setText(theText, theSize); +#endif +} + +#ifdef HAVE_SALOME +void XGUI_ViewerProxy::setFitter(OCCViewer_Fitter* theFitter) +{ + myWorkshop->salomeConnector()->viewer()->setFitter(theFitter); +} + +OCCViewer_Fitter* XGUI_ViewerProxy::fitter() const +{ + return myWorkshop->salomeConnector()->viewer()->fitter(); +} +#else +void XGUI_ViewerProxy::setFitter(AppElements_Fitter* theFitter) +{ + myWorkshop->mainWindow()->viewer()->setFitter(theFitter); +} + +AppElements_Fitter* XGUI_ViewerProxy::fitter() const +{ + return myWorkshop->mainWindow()->viewer()->fitter(); +} +#endif