From 67928afad5f8d564368c4287faa44ce55285a9d8 Mon Sep 17 00:00:00 2001 From: Konstantin Leontev Date: Mon, 2 Oct 2023 22:09:40 +0100 Subject: [PATCH] [bos #35155][EDF](2023-T1) Trihedron axes. Added font and color settings in Preferencies dialog. Updated trihedrons text in OCCViewer_Viewer (text font and color, default color for arrows) and SVTK_Viewer (only text color). --- .../gui/images/pref_salome_3dviewer.png | Bin 32327 -> 92537 bytes doc/salome/gui/input/setting_preferences.rst | 19 ++ src/LightApp/LightApp_Application.cxx | 119 ++++++++++++ src/LightApp/resources/LightApp.xml | 8 + src/LightApp/resources/LightApp_msg_en.ts | 32 ++++ src/LightApp/resources/LightApp_msg_fr.ts | 32 ++++ src/LightApp/resources/LightApp_msg_ja.ts | 32 ++++ src/OCCViewer/CMakeLists.txt | 2 + src/OCCViewer/OCCViewer.cxx | 9 +- src/OCCViewer/OCCViewer_TrihedronSetup.cxx | 178 ++++++++++++++++++ src/OCCViewer/OCCViewer_TrihedronSetup.h | 82 ++++++++ src/OCCViewer/OCCViewer_ViewModel.cxx | 119 ++++++++++-- src/OCCViewer/OCCViewer_ViewModel.h | 8 + src/OCCViewer/OCCViewer_ViewPort3d.cxx | 34 ++++ src/OCCViewer/OCCViewer_ViewPort3d.h | 2 + src/SVTK/CMakeLists.txt | 2 + src/SVTK/SVTK_TrihedronSetup.cxx | 141 ++++++++++++++ src/SVTK/SVTK_TrihedronSetup.h | 86 +++++++++ src/SVTK/SVTK_ViewModel.cxx | 47 +++++ src/SVTK/SVTK_ViewModel.h | 6 + src/SVTK/SVTK_ViewWindow.cxx | 10 + src/SVTK/SVTK_ViewWindow.h | 3 + src/VTKViewer/VTKViewer_Trihedron.cxx | 30 +++ src/VTKViewer/VTKViewer_Trihedron.h | 18 ++ src/ViewerTools/CMakeLists.txt | 10 +- .../ViewerTools_TrihedronSetup.cxx | 96 ++++++++++ src/ViewerTools/ViewerTools_TrihedronSetup.h | 59 ++++++ 27 files changed, 1160 insertions(+), 24 deletions(-) create mode 100644 src/OCCViewer/OCCViewer_TrihedronSetup.cxx create mode 100644 src/OCCViewer/OCCViewer_TrihedronSetup.h create mode 100644 src/SVTK/SVTK_TrihedronSetup.cxx create mode 100644 src/SVTK/SVTK_TrihedronSetup.h create mode 100644 src/ViewerTools/ViewerTools_TrihedronSetup.cxx create mode 100644 src/ViewerTools/ViewerTools_TrihedronSetup.h diff --git a/doc/salome/gui/images/pref_salome_3dviewer.png b/doc/salome/gui/images/pref_salome_3dviewer.png index cfdc0be7b3430bb35c0f0035578cc90c63391c59..884c0538d78aab3af3e1e391af6dd0993e6980be 100644 GIT binary patch literal 92537 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 literal 32327 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 diff --git a/doc/salome/gui/input/setting_preferences.rst b/doc/salome/gui/input/setting_preferences.rst index 0eaa7a258..6989a3980 100644 --- a/doc/salome/gui/input/setting_preferences.rst +++ b/doc/salome/gui/input/setting_preferences.rst @@ -97,6 +97,25 @@ General Preferences - **Relative** - if this option is switched on, trihedron axes scale to fit the size of the scene displayed in 3D viewer. - **Show static trihedron** - allows to show/hide the static mini-trihedron located in the bottom-left corner of the viewer. + The settings below are for trihedron labels. + + - **Use Custom Text Font** - allows to change text's font for trihedron labels individually for each axis (only for OCC 3D Viewer): + + - X Text Font + - Y Text Font + - Z Text Font + + Notes: + - Not all fonts are supported and could be automatically replaced by the similar ones. + - Changing the size of the font is not implemented at the moment. + - Works only with OCCT V7_7_0 and greater. With older versions altering the font settings does nothing. + + - **Use Custom Text Color** - allows to change text's color for trihedron labels individually for each axis (only for OCC 3D Viewer and VTK 3D Viewer): + + - X Text Color + - Y Text Color + - Z Text Color + .. _occ_preferences: OCC 3D Viewer Preferences diff --git a/src/LightApp/LightApp_Application.cxx b/src/LightApp/LightApp_Application.cxx index edd729cb7..5345aeb8f 100644 --- a/src/LightApp/LightApp_Application.cxx +++ b/src/LightApp/LightApp_Application.cxx @@ -2101,6 +2101,11 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType SVTK_Viewer* vm = dynamic_cast( viewMgr->getViewModel() ); if( vm ) { + // TODO: + // Methods like setTrihedronSize() and setStaticTrihedronVisible() do nothing for a created view here + // because such a view doesn't exist on this step. + // It's going to be created on viewMgr->createViewWindow() way below. + // As a workaround we could update a view inside SVTK_Viewer::onViewCreated() method. vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) ); vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) ); vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) ); @@ -2908,6 +2913,7 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) anIndicesList << 0 << 1; pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode ); pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode ); + // ... "Trihedron" group <> int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup ); pref->setItemProperty( "columns", 2, occTriGroup ); @@ -2918,6 +2924,26 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->setItemProperty( "max", 1000, occTS ); // .... -> relative size of trihedron pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" ); + + // .... -> trihedron text's font + const int trihedronTxtFontDef = pref->addPreference(tr("PREF_TRIHEDRON_TEXT_FONT_CUSTOM"), Viewer3DGroup, LightApp_Preferences::Auto, "3DViewer", "trihedron_text_font_custom"); + pref->setItemProperty("columns", 1, trihedronTxtFontDef); + + int trihedronFont = pref->addPreference(tr("PREF_TRIHEDRON_X_TEXT_FONT"), trihedronTxtFontDef, LightApp_Preferences::Font, "3DViewer", "trihedron_x_text_font"); + pref->setItemProperty("features", QtxFontEdit::Family | QtxFontEdit::Bold | QtxFontEdit::Italic, trihedronFont); + trihedronFont = pref->addPreference(tr("PREF_TRIHEDRON_Y_TEXT_FONT"), trihedronTxtFontDef, LightApp_Preferences::Font, "3DViewer", "trihedron_y_text_font"); + pref->setItemProperty("features", QtxFontEdit::Family | QtxFontEdit::Bold | QtxFontEdit::Italic, trihedronFont); + trihedronFont = pref->addPreference(tr("PREF_TRIHEDRON_Z_TEXT_FONT"), trihedronTxtFontDef, LightApp_Preferences::Font, "3DViewer", "trihedron_z_text_font"); + pref->setItemProperty("features", QtxFontEdit::Family | QtxFontEdit::Bold | QtxFontEdit::Italic, trihedronFont); + + // .... -> trihedron text's color + const int trihedronTxtColorDef = pref->addPreference(tr("PREF_TRIHEDRON_TEXT_COLOR_CUSTOM"), Viewer3DGroup, LightApp_Preferences::Auto, "3DViewer", "trihedron_text_color_custom"); + pref->setItemProperty("columns", 3, trihedronTxtColorDef); + + pref->addPreference(tr("PREF_TRIHEDRON_X_TEXT_COLOR"), trihedronTxtColorDef, LightApp_Preferences::Color, "3DViewer", "trihedron_x_text_color"); + pref->addPreference(tr("PREF_TRIHEDRON_Y_TEXT_COLOR"), trihedronTxtColorDef, LightApp_Preferences::Color, "3DViewer", "trihedron_y_text_color"); + pref->addPreference(tr("PREF_TRIHEDRON_Z_TEXT_COLOR"), trihedronTxtColorDef, LightApp_Preferences::Color, "3DViewer", "trihedron_z_text_color"); + // .... -> show static trihedron pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" ); // ... "Trihedron" group <> @@ -3592,6 +3618,65 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->retrieve(); } +// Helper funcitons to reduce code repetition +namespace +{ +#ifndef DISABLE_OCCVIEWER + /*! + Iterates all OCCT viewers and call a given functor with each viewer as an argument. + \param app - current application + \param functor - function to call + */ + template + void forEachOcctViewer(const LightApp_Application& app, T functor) + { + QList lst; + + app.viewManagers(OCCViewer_Viewer::Type(), lst); + QListIterator itOCC(lst); + while (itOCC.hasNext()) + { + SUIT_ViewModel* vm = itOCC.next()->getViewModel(); + if (!vm || !vm->inherits("OCCViewer_Viewer")) + continue; + + OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm; + functor(occVM); + occVM->getAISContext()->UpdateCurrentViewer(); + } + } +#endif + +#if !defined DISABLE_VTKVIEWER && !defined DISABLE_SALOMEOBJECT +/*! + Iterates all Vtk viewers and call a given functor with each viewer as an argument + \param app - current application + \param functor - function to call + */ + template + void forEachVtkViewer(const LightApp_Application& app, T functor) + { + QList lst; + + app.viewManagers(SVTK_Viewer::Type(), lst); + QListIterator itVTK(lst); + while (itVTK.hasNext()) + { + SUIT_ViewModel* vm = itVTK.next()->getViewModel(); + if (!vm || !vm->inherits("SVTK_Viewer")) + continue; + + SVTK_Viewer* vtkVM = dynamic_cast(vm); + if(vtkVM) + { + functor(vtkVM); + vtkVM->Repaint(); + } + } + } +#endif +} + /*! Changes appearance of application according to changed preferences \param sec - section @@ -3654,6 +3739,40 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString #endif } + if (sec == QString("3DViewer")) + { + if (param == QString("trihedron_text_font_custom") || + param == QString("trihedron_x_text_font") || + param == QString("trihedron_y_text_font") || + param == QString("trihedron_z_text_font")) + { +#ifndef DISABLE_OCCVIEWER + forEachOcctViewer(*this, [](OCCViewer_Viewer* occVM) { + occVM->setTrihedronTextFont(); + occVM->setStaticTrihedronTextFont(); + }); +#endif + } + else if (param == QString("trihedron_text_color_custom") || + param == QString("trihedron_x_text_color") || + param == QString("trihedron_y_text_color") || + param == QString("trihedron_z_text_color")) + { +#ifndef DISABLE_OCCVIEWER + forEachOcctViewer(*this, [](OCCViewer_Viewer* occVM) { + occVM->setTrihedronTextColor(); + occVM->setStaticTrihedronTextColor(); + }); +#endif +#if !defined DISABLE_VTKVIEWER && !defined DISABLE_SALOMEOBJECT + forEachVtkViewer(*this, [](SVTK_Viewer* vtkVM) { + vtkVM->setTrihedronTextColor(); + vtkVM->setStaticTrihedronTextColor(); + }); +#endif + } + } + if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) ) { bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true ); diff --git a/src/LightApp/resources/LightApp.xml b/src/LightApp/resources/LightApp.xml index 70869070a..e2e8e8c81 100644 --- a/src/LightApp/resources/LightApp.xml +++ b/src/LightApp/resources/LightApp.xml @@ -120,6 +120,14 @@
+ + + + + + + + diff --git a/src/LightApp/resources/LightApp_msg_en.ts b/src/LightApp/resources/LightApp_msg_en.ts index 90c371e24..ee747eb13 100644 --- a/src/LightApp/resources/LightApp_msg_en.ts +++ b/src/LightApp/resources/LightApp_msg_en.ts @@ -180,6 +180,38 @@ The changes will be applied on the next application session. PREF_TRIHEDRON_SIZE Size + + PREF_TRIHEDRON_TEXT_FONT_CUSTOM + Use Custom Text Font + + + PREF_TRIHEDRON_TEXT_COLOR_CUSTOM + Use Custom Text Color + + + PREF_TRIHEDRON_X_TEXT_FONT + X Text Font + + + PREF_TRIHEDRON_X_TEXT_COLOR + X Text Color + + + PREF_TRIHEDRON_Y_TEXT_FONT + Y Text Font + + + PREF_TRIHEDRON_Y_TEXT_COLOR + Y Text Color + + + PREF_TRIHEDRON_Z_TEXT_FONT + Z Text Font + + + PREF_TRIHEDRON_Z_TEXT_COLOR + Z Text Color + OBJECT_BROWSER Object Browser diff --git a/src/LightApp/resources/LightApp_msg_fr.ts b/src/LightApp/resources/LightApp_msg_fr.ts index d5981a7e1..972945cdf 100644 --- a/src/LightApp/resources/LightApp_msg_fr.ts +++ b/src/LightApp/resources/LightApp_msg_fr.ts @@ -180,6 +180,38 @@ Les modifications seront appliquées à la prochaine session. PREF_TRIHEDRON_SIZE Taille + + PREF_TRIHEDRON_TEXT_FONT_CUSTOM + Utiliser une police de texte personnalisée + + + PREF_TRIHEDRON_TEXT_COLOR_CUSTOM + Utiliser une couleur de texte personnalisée + + + PREF_TRIHEDRON_X_TEXT_FONT + X Police du texte + + + PREF_TRIHEDRON_X_TEXT_COLOR + X Couleur du texte + + + PREF_TRIHEDRON_Y_TEXT_FONT + Y Police du texte + + + PREF_TRIHEDRON_Y_TEXT_COLOR + Y Couleur du texte + + + PREF_TRIHEDRON_Z_TEXT_FONT + Z Police du texte + + + PREF_TRIHEDRON_Z_TEXT_COLOR + Z Couleur du texte + OBJECT_BROWSER Arbre d'étude diff --git a/src/LightApp/resources/LightApp_msg_ja.ts b/src/LightApp/resources/LightApp_msg_ja.ts index ba8d8bb27..679095b56 100644 --- a/src/LightApp/resources/LightApp_msg_ja.ts +++ b/src/LightApp/resources/LightApp_msg_ja.ts @@ -179,6 +179,38 @@ Pythonファイルは、文字、数字、アンダースコアが含まれて PREF_TRIHEDRON_SIZE サイズ + + PREF_TRIHEDRON_TEXT_FONT_CUSTOM + カスタムテキストフォントを使用する + + + PREF_TRIHEDRON_TEXT_COLOR_CUSTOM + カスタムテキストカラーを使用する + + + PREF_TRIHEDRON_X_TEXT_FONT + X テキストフォント + + + PREF_TRIHEDRON_X_TEXT_COLOR + X テキストの色 + + + PREF_TRIHEDRON_Y_TEXT_FONT + Y テキストフォント + + + PREF_TRIHEDRON_Y_TEXT_COLOR + Y テキストの色 + + + PREF_TRIHEDRON_Z_TEXT_FONT + Z テキストフォント + + + PREF_TRIHEDRON_Z_TEXT_COLOR + Z テキストの色 + OBJECT_BROWSER オブジェクトブラウザー diff --git a/src/OCCViewer/CMakeLists.txt b/src/OCCViewer/CMakeLists.txt index 989a629ad..57f3d9038 100644 --- a/src/OCCViewer/CMakeLists.txt +++ b/src/OCCViewer/CMakeLists.txt @@ -82,6 +82,7 @@ SET(_moc_HEADERS SET(_other_HEADERS OCCViewer.h OCCViewer_ClipPlane.h + OCCViewer_TrihedronSetup.h OCCViewer_VService.h OCCViewer_Utilities.h ) @@ -180,6 +181,7 @@ SET(_other_SOURCES OCCViewer_FontWidget.cxx OCCViewer_SetRotationPointDlg.cxx OCCViewer_ToolTip.cxx + OCCViewer_TrihedronSetup.cxx OCCViewer_VService.cxx OCCViewer_ViewFrame.cxx OCCViewer_ViewManager.cxx diff --git a/src/OCCViewer/OCCViewer.cxx b/src/OCCViewer/OCCViewer.cxx index 1aadac9e1..ea155e4ea 100644 --- a/src/OCCViewer/OCCViewer.cxx +++ b/src/OCCViewer/OCCViewer.cxx @@ -27,11 +27,10 @@ */ Quantity_Color OCCViewer::color( const QColor& c ) { - Quantity_Color aColor; - if ( c.isValid() ) - aColor = Quantity_Color( c.red() / 255., c.green() / 255., - c.blue() / 255., Quantity_TOC_RGB ); - return aColor; + if (c.isValid()) + return Quantity_Color(c.redF(), c.greenF(), c.blueF(), Quantity_TOC_RGB); + + return {}; } /*! diff --git a/src/OCCViewer/OCCViewer_TrihedronSetup.cxx b/src/OCCViewer/OCCViewer_TrihedronSetup.cxx new file mode 100644 index 000000000..09a94de1d --- /dev/null +++ b/src/OCCViewer/OCCViewer_TrihedronSetup.cxx @@ -0,0 +1,178 @@ +// Copyright (C) 2007-2023 CEA, EDF, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See https://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "OCCViewer_TrihedronSetup.h" + +#include +#include +#include +#include + +#include +#include + + +// Common helper functions to separate algorithm from implementation +// and reduce code repetition. +namespace +{ + Font_FontAspect getFontAspect(const QFont& font) + { + if (font.bold() && font.italic()) + { + return Font_FontAspect_BoldItalic; + } + else if (font.bold()) + { + return Font_FontAspect_Bold; + } + else if (font.italic()) + { + return Font_FontAspect_Italic; + } + + return Font_FontAspect_Regular; + } + + void setTextFontByAxis(const Handle(AIS_Trihedron)& trihedron, Prs3d_DatumParts axis, const QFont& font) + { +#if OCC_VERSION_LARGE >= 0x07070000 + Handle(Prs3d_Drawer) drawer = trihedron->Attributes(); + if (!drawer->HasOwnDatumAspect()) + { + return; + } + + Handle(Prs3d_DatumAspect) daspect = drawer->DatumAspect(); + daspect->TextAspect(axis)->SetFont(font.family().toStdString().c_str()); + + const Font_FontAspect fontAspect = getFontAspect(font); + daspect->TextAspect(axis)->Aspect()->SetTextFontAspect(fontAspect); +#endif // OCC_VERSION_LARGE >= 0x0707000 + } + + void setTextColorByAxis(const Handle(AIS_Trihedron)& trihedron, Prs3d_DatumParts axis, const QColor& color) + { +#if OCC_VERSION_LARGE >= 0x07070000 + trihedron->SetTextColor(axis, OCCViewer::color(color)); +#endif // OCC_VERSION_LARGE >= 0x0707000 + } + + void setTextFontByAxis(const Handle(V3d_Trihedron)& trihedron, V3d_TypeOfAxe axis, const QFont& font) + { +#if OCC_VERSION_LARGE >= 0x07070000 + const Handle(Prs3d_TextAspect)& labelAspect = trihedron->LabelAspect(axis); + labelAspect->SetFont(font.family().toStdString().c_str()); + + const Font_FontAspect fontAspect = getFontAspect(font); + labelAspect->Aspect()->SetTextFontAspect(fontAspect); +#endif // OCC_VERSION_LARGE >= 0x0707000 + } + + void setTextColorByAxis(const Handle(V3d_Trihedron)& trihedron, V3d_TypeOfAxe axis, const QColor& color) + { +#if OCC_VERSION_LARGE >= 0x07070000 + trihedron->LabelAspect(axis)->SetColor(OCCViewer::color(color)); +#endif // OCC_VERSION_LARGE >= 0x0707000 + } +} + + +/*! + * Class : OCCViewer_TrihedronSetupAIS + * Description : Helper class to setup trihedron settings for AIS_Trihedron (OCCT viewer) + */ + +QFont OCCViewer_TrihedronSetupAIS::getDefaultTextFont() const +{ + return QFont(Font_NOF_ASCII_MONO); +} + +void OCCViewer_TrihedronSetupAIS::setTextFontX(const QFont& font) +{ + setTextFontByAxis(myTrihedron, Prs3d_DP_XAxis, font); +} + +void OCCViewer_TrihedronSetupAIS::setTextFontY(const QFont& font) +{ + setTextFontByAxis(myTrihedron, Prs3d_DP_YAxis, font); +} + +void OCCViewer_TrihedronSetupAIS::setTextFontZ(const QFont& font) +{ + setTextFontByAxis(myTrihedron, Prs3d_DP_ZAxis, font); +} + +void OCCViewer_TrihedronSetupAIS::setTextColorX(const QColor& color) +{ + setTextColorByAxis(myTrihedron, Prs3d_DP_XAxis, color); +} + +void OCCViewer_TrihedronSetupAIS::setTextColorY(const QColor& color) +{ + setTextColorByAxis(myTrihedron, Prs3d_DP_YAxis, color); +} + +void OCCViewer_TrihedronSetupAIS::setTextColorZ(const QColor& color) +{ + setTextColorByAxis(myTrihedron, Prs3d_DP_ZAxis, color); +} + +/*! + * Class : OCCViewer_TrihedronSetupV3d + * Description : Helper class to setup trihedron settings for V3d_Trihedron (OCCT viewer) + */ + +QFont OCCViewer_TrihedronSetupV3d::getDefaultTextFont() const +{ + return QFont(Font_NOF_ASCII_MONO); +} + +void OCCViewer_TrihedronSetupV3d::setTextFontX(const QFont& font) +{ + setTextFontByAxis(myTrihedron, V3d_TypeOfAxe::V3d_X, font); +} + +void OCCViewer_TrihedronSetupV3d::setTextFontY(const QFont& font) +{ + setTextFontByAxis(myTrihedron, V3d_TypeOfAxe::V3d_Y, font); +} + +void OCCViewer_TrihedronSetupV3d::setTextFontZ(const QFont& font) +{ + setTextFontByAxis(myTrihedron, V3d_TypeOfAxe::V3d_Z, font); +} + +void OCCViewer_TrihedronSetupV3d::setTextColorX(const QColor& color) +{ + setTextColorByAxis(myTrihedron, V3d_TypeOfAxe::V3d_X, color); +} + +void OCCViewer_TrihedronSetupV3d::setTextColorY(const QColor& color) +{ + setTextColorByAxis(myTrihedron, V3d_TypeOfAxe::V3d_Y, color); +} + +void OCCViewer_TrihedronSetupV3d::setTextColorZ(const QColor& color) +{ + setTextColorByAxis(myTrihedron, V3d_TypeOfAxe::V3d_Z, color); +} diff --git a/src/OCCViewer/OCCViewer_TrihedronSetup.h b/src/OCCViewer/OCCViewer_TrihedronSetup.h new file mode 100644 index 000000000..715e77343 --- /dev/null +++ b/src/OCCViewer/OCCViewer_TrihedronSetup.h @@ -0,0 +1,82 @@ +// Copyright (C) 2007-2023 CEA, EDF, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See https://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef OCCVIEWER_TRIHEDRON_SETUP_H +#define OCCVIEWER_TRIHEDRON_SETUP_H + +#include "OCCViewer.h" +#include "ViewerTools_TrihedronSetup.h" + +class AIS_Trihedron; +class V3d_Trihedron; + +/*! + * Class : OCCViewer_TrihedronSetupAIS + * Description : Helper class to setup trihedron settings for AIS_Trihedron (OCCT viewer) + */ +class OCCVIEWER_EXPORT OCCViewer_TrihedronSetupAIS : public ViewerTools_TrihedronSetupBase +{ +public: + OCCViewer_TrihedronSetupAIS(const Handle(AIS_Trihedron)& trihedron) : myTrihedron(trihedron) {} + virtual ~OCCViewer_TrihedronSetupAIS() {} + +protected: + virtual QFont getDefaultTextFont() const override; + + virtual void setTextFontX(const QFont& font) override; + virtual void setTextFontY(const QFont& font) override; + virtual void setTextFontZ(const QFont& font) override; + + virtual void setTextColorX(const QColor& color) override; + virtual void setTextColorY(const QColor& color) override; + virtual void setTextColorZ(const QColor& color) override; + +private: + const Handle(AIS_Trihedron)& myTrihedron; +}; + +/*! + * Class : OCCViewer_TrihedronSetupV3d + * Description : Helper class to setup trihedron settings for V3d_Trihedron (OCCT viewer) + */ +class OCCVIEWER_EXPORT OCCViewer_TrihedronSetupV3d : public ViewerTools_TrihedronSetupBase +{ +public: + OCCViewer_TrihedronSetupV3d(const Handle(V3d_Trihedron)& trihedron) : myTrihedron(trihedron) {} + virtual ~OCCViewer_TrihedronSetupV3d() {} + +protected: + virtual QFont getDefaultTextFont() const override; + + virtual void setTextFontX(const QFont& font) override; + virtual void setTextFontY(const QFont& font) override; + virtual void setTextFontZ(const QFont& font) override; + + virtual void setTextColorX(const QColor& color) override; + virtual void setTextColorY(const QColor& color) override; + virtual void setTextColorZ(const QColor& color) override; + +private: + const Handle(V3d_Trihedron)& myTrihedron; +}; + +#endif \ No newline at end of file diff --git a/src/OCCViewer/OCCViewer_ViewModel.cxx b/src/OCCViewer/OCCViewer_ViewModel.cxx index a3c3e79f2..9ef920143 100644 --- a/src/OCCViewer/OCCViewer_ViewModel.cxx +++ b/src/OCCViewer/OCCViewer_ViewModel.cxx @@ -26,6 +26,7 @@ #include "OCCViewer_ViewPort3d.h" #include "OCCViewer_ClippingDlg.h" #include "OCCViewer_Utilities.h" +#include "OCCViewer_TrihedronSetup.h" #include "SUIT_ViewWindow.h" #include "SUIT_ViewManager.h" @@ -151,24 +152,9 @@ OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron) myColorScale->SetTransformPersistence( new Graphic3d_TransformPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_LOWER) ); #endif - /* create trihedron */ - if ( DisplayTrihedron ) + if (DisplayTrihedron) { - Handle(Geom_Axis2Placement) anAxis = new Geom_Axis2Placement(gp::XOY()); - myTrihedron = new AIS_Trihedron(anAxis); - myTrihedron->SetInfiniteState( Standard_True ); - - Quantity_Color Col(193/255., 205/255., 193/255., Quantity_TOC_RGB); - //myTrihedron->SetColor( Col ); - myTrihedron->SetArrowColor( Col.Name() ); - myTrihedron->SetSize(100); - Handle(Prs3d_Drawer) drawer = myTrihedron->Attributes(); - if (drawer->HasOwnDatumAspect()) { - Handle(Prs3d_DatumAspect) daspect = drawer->DatumAspect(); - daspect->LineAspect(Prs3d_DP_XAxis)->SetColor(Quantity_Color(1.0, 0.0, 0.0, Quantity_TOC_RGB)); - daspect->LineAspect(Prs3d_DP_YAxis)->SetColor(Quantity_Color(0.0, 1.0, 0.0, Quantity_TOC_RGB)); - daspect->LineAspect(Prs3d_DP_ZAxis)->SetColor(Quantity_Color(0.0, 0.0, 1.0, Quantity_TOC_RGB)); - } + initTrihedron(); } /* create view cube */ @@ -1333,6 +1319,68 @@ void OCCViewer_Viewer::setColorScaleShown( const bool on ) } } +/*! + Inits trihedron if it's enabled +*/ +void OCCViewer_Viewer::initTrihedron() +{ + // Basic params + Handle(Geom_Axis2Placement) anAxis = new Geom_Axis2Placement(gp::XOY()); + myTrihedron = new AIS_Trihedron(anAxis); + myTrihedron->SetInfiniteState(Standard_True); + myTrihedron->SetSize(100); + + // Init default colors + const Quantity_Color rColor(1.0, 0.0, 0.0, Quantity_TOC_RGB); + const Quantity_Color gColor(0.0, 1.0, 0.0, Quantity_TOC_RGB); + const Quantity_Color bColor(0.0, 0.0, 1.0, Quantity_TOC_RGB); + +#if OCC_VERSION_LARGE >= 0x07070000 + // Set colors for axes + myTrihedron->SetDatumPartColor(Prs3d_DP_XAxis, rColor); + myTrihedron->SetDatumPartColor(Prs3d_DP_YAxis, gColor); + myTrihedron->SetDatumPartColor(Prs3d_DP_ZAxis, bColor); + + // Set the same colors for axes' arrows + myTrihedron->SetArrowColor(Prs3d_DP_XAxis, rColor); + myTrihedron->SetArrowColor(Prs3d_DP_YAxis, gColor); + myTrihedron->SetArrowColor(Prs3d_DP_ZAxis, bColor); +#else + Quantity_Color Col(193/255., 205/255., 193/255., Quantity_TOC_RGB); + myTrihedron->SetArrowColor( Col.Name() ); + Handle(Prs3d_Drawer) drawer = myTrihedron->Attributes(); + if (drawer->HasOwnDatumAspect()) + { + Handle(Prs3d_DatumAspect) daspect = drawer->DatumAspect(); + + daspect->LineAspect(Prs3d_DP_XAxis)->SetColor(rColor); + daspect->LineAspect(Prs3d_DP_YAxis)->SetColor(gColor); + daspect->LineAspect(Prs3d_DP_ZAxis)->SetColor(bColor); + } +#endif + + setTrihedronTextFont(); + setTrihedronTextColor(); +} + +/*! + Sets font for trihedron labels from the 3D Viewer settings +*/ +void OCCViewer_Viewer::setTrihedronTextFont() +{ + OCCViewer_TrihedronSetupAIS trihedronSetup(myTrihedron); + trihedronSetup.setTextFont(); +} + +/*! + Sets color for trihedron labels from the 3D Viewer settings +*/ +void OCCViewer_Viewer::setTrihedronTextColor() +{ + OCCViewer_TrihedronSetupAIS trihedronSetup(myTrihedron); + trihedronSetup.setTextColor(); +} + /*! \return true if trihedron is visible */ @@ -1535,6 +1583,43 @@ void OCCViewer_Viewer::setStaticTrihedronDisplayed(const bool on) if ( aView ) aView->showStaticTrihedron( on ); } +/*! + Set the font for axes labels of static trihedron +*/ +void OCCViewer_Viewer::setStaticTrihedronTextFont() +{ + OCCViewer_ViewPort3d* viewport = getViewPort(); + if (!viewport) + return; + + viewport->setStaticTrihedronTextFont(); +} + + +/*! + Set the color for axes labels of static trihedron +*/ +void OCCViewer_Viewer::setStaticTrihedronTextColor() +{ + OCCViewer_ViewPort3d* viewport = getViewPort(); + if (!viewport) + return; + + viewport->setStaticTrihedronTextColor(); +} + +/*! + Get the viewport for active view +*/ +OCCViewer_ViewPort3d* OCCViewer_Viewer::getViewPort() +{ + OCCViewer_ViewWindow* aView = (OCCViewer_ViewWindow*)(myViewManager->getActiveView()); + if (!aView) + return nullptr; + + return aView->getViewPort(); +} + /*! Get new and current trihedron size corresponding to the current model size */ diff --git a/src/OCCViewer/OCCViewer_ViewModel.h b/src/OCCViewer/OCCViewer_ViewModel.h index 1477e9549..47916e6ef 100644 --- a/src/OCCViewer/OCCViewer_ViewModel.h +++ b/src/OCCViewer/OCCViewer_ViewModel.h @@ -133,6 +133,10 @@ public: bool isColorScaleVisible() const; virtual void setColorScaleShown( const bool ); + void initTrihedron(); + void setTrihedronTextFont(); + void setTrihedronTextColor(); + //! returns true if 3d Trihedron in viewer was created bool trihedronActivated() const { return !myTrihedron.IsNull(); } @@ -240,6 +244,10 @@ public: int getSelectionCount() const { return (!myAISContext.IsNull())? myAISContext->NbSelected():0; } void setStaticTrihedronDisplayed(const bool on); + void setStaticTrihedronTextFont(); + void setStaticTrihedronTextColor(); + + OCCViewer_ViewPort3d* getViewPort(); /* Clip planes management */ Handle(Graphic3d_ClipPlane) createClipPlane(const gp_Pln& thePlane, const Standard_Boolean theIsOn); diff --git a/src/OCCViewer/OCCViewer_ViewPort3d.cxx b/src/OCCViewer/OCCViewer_ViewPort3d.cxx index 3a64aa210..e80a44d8a 100644 --- a/src/OCCViewer/OCCViewer_ViewPort3d.cxx +++ b/src/OCCViewer/OCCViewer_ViewPort3d.cxx @@ -25,6 +25,7 @@ #include "OCCViewer_VService.h" #include "OCCViewer_ViewWindow.h" #include "OCCViewer_ViewModel.h" +#include "OCCViewer_TrihedronSetup.h" #include #include @@ -874,12 +875,45 @@ void OCCViewer_ViewPort3d::showStaticTrihedron( bool on ) if ( on ) { aView->ZBufferTriedronSetup(); aView->TriedronDisplay( Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.05, V3d_ZBUFFER ); + + setStaticTrihedronTextFont(); + setStaticTrihedronTextColor(); } else { aView->TriedronErase(); } aView->Update(); } +/*! + Set the font for axes labels of static trihedron +*/ +void OCCViewer_ViewPort3d::setStaticTrihedronTextFont() +{ + Handle(V3d_View) aView = activeView(); + if (!aView) + return; + +#if OCC_VERSION_LARGE >= 0x07070000 + OCCViewer_TrihedronSetupV3d trihedronSetup(aView->Trihedron()); + trihedronSetup.setTextFont(); +#endif // OCC_VERSION_LARGE >= 0x0707000 +} + +/*! + Set the color for axes labels of static trihedron +*/ +void OCCViewer_ViewPort3d::setStaticTrihedronTextColor() +{ + Handle(V3d_View) aView = activeView(); + if (!aView) + return; + +#if OCC_VERSION_LARGE >= 0x07070000 + OCCViewer_TrihedronSetupV3d trihedronSetup(aView->Trihedron()); + trihedronSetup.setTextColor(); +#endif // OCC_VERSION_LARGE >= 0x0707000 +} + /* * Create default cursor with a specific shape */ diff --git a/src/OCCViewer/OCCViewer_ViewPort3d.h b/src/OCCViewer/OCCViewer_ViewPort3d.h index 6a82c883a..7319f1f75 100644 --- a/src/OCCViewer/OCCViewer_ViewPort3d.h +++ b/src/OCCViewer/OCCViewer_ViewPort3d.h @@ -95,6 +95,8 @@ public: bool isAdvancedZoomingEnabled() const { return myIsAdvancedZoomingEnabled; } void showStaticTrihedron( bool ); + void setStaticTrihedronTextFont(); + void setStaticTrihedronTextColor(); void setDefaultCursor( Qt::CursorShape theCursorShape ); QCursor* getDefaultCursor() const; diff --git a/src/SVTK/CMakeLists.txt b/src/SVTK/CMakeLists.txt index 62439c1c2..a9dec6803 100644 --- a/src/SVTK/CMakeLists.txt +++ b/src/SVTK/CMakeLists.txt @@ -100,6 +100,7 @@ SET(_other_HEADERS SVTK_SelectionEvent.h SVTK_Selector.h SVTK_SpaceMouse.h + SVTK_TrihedronSetup.h SVTK_Utils.h SVTK_Hash.h ) @@ -180,6 +181,7 @@ SET(_other_SOURCES SVTK_SetRotationPointDlg.cxx SVTK_SpaceMouse.cxx SVTK_Trihedron.cxx + SVTK_TrihedronSetup.cxx SVTK_UpdateRateDlg.cxx SVTK_Utils.cxx SVTK_View.cxx diff --git a/src/SVTK/SVTK_TrihedronSetup.cxx b/src/SVTK/SVTK_TrihedronSetup.cxx new file mode 100644 index 000000000..378edbca7 --- /dev/null +++ b/src/SVTK/SVTK_TrihedronSetup.cxx @@ -0,0 +1,141 @@ +// Copyright (C) 2007-2023 CEA, EDF, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See https://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "SVTK_TrihedronSetup.h" + +#include "VTKViewer_Trihedron.h" + +#include "salomevtkPVAxesWidget.h" +#include "salomevtkPVAxesActor.h" + +#include "vtkProperty.h" + +#include +#include + +// Common helper functions to separate algorithm from implementation +// and reduce code repetition. +namespace +{ + void setTextColorByAxis(VTKViewer_Trihedron* trihedron, VTKViewer_Trihedron::Axis axis, const QColor& color) + { + trihedron->SetTextColor(axis, color.red(), color.green(), color.blue()); + } + + void setTextColorByAxis(vtkProperty* property, const QColor& color) + { + property->SetColor(color.redF(), color.greenF(), color.blueF()); + } +} + +/*! + * Class : SVTK_TrihedronSetupVTK + * Description : Helper class to setup trihedron settings for VTKViewer_Trihedron (Vtk viewer) + */ + +QFont SVTK_TrihedronSetupVTK::getDefaultTextFont() const +{ + // TODO: implement this method + return {}; +} + +void SVTK_TrihedronSetupVTK::setTextFontX(const QFont& font) +{ + // TODO: find an easy method to change font for vtkVectorText (VTKViewer_Axis::myVectorText). + // Vtk defines only VTK_ARIAL, VTK_COURIER, VTK_TIMES and VTK_FONT_FILE ids to use with vtkTextProperty. + // Maybe vtkFreeTypeTools class could give some hints. + (void)font; // disable unused param warning +} + +void SVTK_TrihedronSetupVTK::setTextFontY(const QFont& font) +{ + // TODO: implement this method + (void)font; // disable unused param warning +} + +void SVTK_TrihedronSetupVTK::setTextFontZ(const QFont& font) +{ + // TODO: implement this method + (void)font; // disable unused param warning +} + +void SVTK_TrihedronSetupVTK::setTextColorX(const QColor& color) +{ + setTextColorByAxis(myTrihedron, VTKViewer_Trihedron::Axis::X, color); +} + +void SVTK_TrihedronSetupVTK::setTextColorY(const QColor& color) +{ + setTextColorByAxis(myTrihedron, VTKViewer_Trihedron::Axis::Y, color); +} + +void SVTK_TrihedronSetupVTK::setTextColorZ(const QColor& color) +{ + setTextColorByAxis(myTrihedron, VTKViewer_Trihedron::Axis::Z, color); +} + + +/*! + * Class : SVTK_TrihedronSetupPVAxes + * Description : Helper class to setup static trihedron settings for salomevtk::vtkPVAxesActor (Vtk viewer) + */ + +QFont SVTK_TrihedronSetupPVAxes::getDefaultTextFont() const +{ + // TODO: implement this method + return {}; +} + +void SVTK_TrihedronSetupPVAxes::setTextFontX(const QFont& font) +{ + // TODO: find an easy method to change font for vtkVectorText (VTKViewer_Axis::myVectorText). + // Vtk defines only VTK_ARIAL, VTK_COURIER, VTK_TIMES and VTK_FONT_FILE ids to use with vtkTextProperty. + // Maybe vtkFreeTypeTools class could give some hints. + (void)font; // disable unused param warning +} + +void SVTK_TrihedronSetupPVAxes::setTextFontY(const QFont& font) +{ + // TODO: implement this method + (void)font; // disable unused param warning +} + +void SVTK_TrihedronSetupPVAxes::setTextFontZ(const QFont& font) +{ + // TODO: implement this method + (void)font; // disable unused param warning +} + +void SVTK_TrihedronSetupPVAxes::setTextColorX(const QColor& color) +{ + setTextColorByAxis(myTrihedron->GetAxesActor()->GetXAxisLabelProperty(), color); +} + +void SVTK_TrihedronSetupPVAxes::setTextColorY(const QColor& color) +{ + setTextColorByAxis(myTrihedron->GetAxesActor()->GetYAxisLabelProperty(), color); +} + +void SVTK_TrihedronSetupPVAxes::setTextColorZ(const QColor& color) +{ + setTextColorByAxis(myTrihedron->GetAxesActor()->GetZAxisLabelProperty(), color); +} \ No newline at end of file diff --git a/src/SVTK/SVTK_TrihedronSetup.h b/src/SVTK/SVTK_TrihedronSetup.h new file mode 100644 index 000000000..26f975d1a --- /dev/null +++ b/src/SVTK/SVTK_TrihedronSetup.h @@ -0,0 +1,86 @@ +// Copyright (C) 2007-2023 CEA, EDF, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See https://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef SVTK_TRIHEDRON_SETUP_H +#define SVTK_TRIHEDRON_SETUP_H + +#include "SVTK.h" +#include "ViewerTools_TrihedronSetup.h" + +class VTKViewer_Trihedron; + +namespace salomevtk +{ + class vtkPVAxesWidget; +} + +/*! + * Class : SVTK_TrihedronSetupVTK + * Description : Helper class to setup trihedron settings for VTKViewer_Trihedron (Vtk viewer) + */ +class SVTK_EXPORT SVTK_TrihedronSetupVTK : public ViewerTools_TrihedronSetupBase +{ +public: + SVTK_TrihedronSetupVTK(VTKViewer_Trihedron* trihedron) : myTrihedron(trihedron) {} + virtual ~SVTK_TrihedronSetupVTK() {} + +protected: + virtual QFont getDefaultTextFont() const override; + + virtual void setTextFontX(const QFont& font) override; + virtual void setTextFontY(const QFont& font) override; + virtual void setTextFontZ(const QFont& font) override; + + virtual void setTextColorX(const QColor& color) override; + virtual void setTextColorY(const QColor& color) override; + virtual void setTextColorZ(const QColor& color) override; + +private: + VTKViewer_Trihedron* myTrihedron = nullptr; +}; + +/*! + * Class : SVTK_TrihedronSetupPVAxes + * Description : Helper class to setup static trihedron settings for salomevtk::vtkPVAxesWidget (Vtk viewer) + */ +class SVTK_EXPORT SVTK_TrihedronSetupPVAxes : public ViewerTools_TrihedronSetupBase +{ +public: + SVTK_TrihedronSetupPVAxes(salomevtk::vtkPVAxesWidget* trihedron) : myTrihedron(trihedron) {} + virtual ~SVTK_TrihedronSetupPVAxes() {} + +protected: + virtual QFont getDefaultTextFont() const override; + + virtual void setTextFontX(const QFont& font) override; + virtual void setTextFontY(const QFont& font) override; + virtual void setTextFontZ(const QFont& font) override; + + virtual void setTextColorX(const QColor& color) override; + virtual void setTextColorY(const QColor& color) override; + virtual void setTextColorZ(const QColor& color) override; + +private: + salomevtk::vtkPVAxesWidget* myTrihedron = nullptr; +}; + +#endif \ No newline at end of file diff --git a/src/SVTK/SVTK_ViewModel.cxx b/src/SVTK/SVTK_ViewModel.cxx index 014851ee7..cc8eed12c 100644 --- a/src/SVTK/SVTK_ViewModel.cxx +++ b/src/SVTK/SVTK_ViewModel.cxx @@ -36,9 +36,11 @@ #include "SVTK_Renderer.h" //#include "SVTK_MainWindow.h" #include "SVTK_Prs.h" +#include "SVTK_TrihedronSetup.h" #include "VTKViewer_Algorithm.h" #include "VTKViewer_ViewModel.h" +#include "VTKViewer_Trihedron.h" #include "SUIT_ViewModel.h" #include "SUIT_ViewManager.h" @@ -227,6 +229,29 @@ void SVTK_Viewer::setTrihedronSize( const double theSize, const bool theRelative } } +/*! + Set color of trihedron's text of the viewer +*/ +void SVTK_Viewer::setTrihedronTextColor() +{ + const SUIT_ViewManager* aViewManager = getViewManager(); + if (!aViewManager) + { + return; + } + + const QVector aViews = aViewManager->getViews(); + for (int i = 0; i < aViews.count(); i++) + { + if (TViewWindow* aView = dynamic_cast(aViews.at(i))) + { + VTKViewer_Trihedron* trihedron = aView->GetRenderer()->GetTrihedron(); + SVTK_TrihedronSetupVTK trihedronSetup(trihedron); + trihedronSetup.setTextColor(); + } + } +} + /*! \return visibility status of the static trihedron */ @@ -253,6 +278,25 @@ void SVTK_Viewer::setStaticTrihedronVisible( const bool theIsVisible ) } } +/*! + Sets static trihedron's text color +*/ +void SVTK_Viewer::setStaticTrihedronTextColor() +{ + const SUIT_ViewManager* aViewManager = getViewManager(); + if (!aViewManager) + return; + + QVector aViews = aViewManager->getViews(); + for (int i = 0; i < aViews.count(); i++) + { + if (TViewWindow* aView = dynamic_cast(aViews.at(i))) + { + aView->setStaticTrihedronTextColor(); + } + } +} + /*! \return projection mode */ @@ -875,4 +919,7 @@ void SVTK_Viewer::onViewCreated( SUIT_ViewWindow* view) { if ( SVTK_ViewWindow* svw = dynamic_cast( view ) ) QTimer::singleShot(500, [svw] () { svw->Repaint(); } ); #endif + + setTrihedronTextColor(); + setStaticTrihedronTextColor(); } diff --git a/src/SVTK/SVTK_ViewModel.h b/src/SVTK/SVTK_ViewModel.h index cdeac2c1b..e88d6f2e5 100644 --- a/src/SVTK/SVTK_ViewModel.h +++ b/src/SVTK/SVTK_ViewModel.h @@ -110,12 +110,18 @@ public: //! Set size of trihedron of the viewer (see #SVTK_Renderer::SetTrihedronSize) void setTrihedronSize( const double, const bool = true ); + //! Set color of trihedron's text of the viewer + void setTrihedronTextColor(); + //! Get visibility status of the static trihedron bool isStaticTrihedronVisible() const; //! Set visibility status of the static trihedron void setStaticTrihedronVisible( const bool ); + //! Sets static trihedron's text color + void setStaticTrihedronTextColor(); + //! Gets projection mode int projectionMode() const; diff --git a/src/SVTK/SVTK_ViewWindow.cxx b/src/SVTK/SVTK_ViewWindow.cxx index 38f80aee7..167a801e4 100644 --- a/src/SVTK/SVTK_ViewWindow.cxx +++ b/src/SVTK/SVTK_ViewWindow.cxx @@ -95,6 +95,7 @@ #include "SVTK_Selector.h" #include "SVTK_Recorder.h" #include "SVTK_RecorderDlg.h" +#include "SVTK_TrihedronSetup.h" #include "salomevtkPVAxesWidget.h" #include "salomevtkPVAxesActor.h" @@ -1527,6 +1528,15 @@ void SVTK_ViewWindow::SetStaticTrihedronVisible( const bool theIsVisible ) myAxesWidget->SetEnabled( (int)theIsVisible ); } +/*! + Sets static trihedron's text color +*/ +void SVTK_ViewWindow::setStaticTrihedronTextColor() +{ + SVTK_TrihedronSetupPVAxes trihedronSetup(myAxesWidget); + trihedronSetup.setTextColor(); +} + /*! Performs action \param accelAction - action diff --git a/src/SVTK/SVTK_ViewWindow.h b/src/SVTK/SVTK_ViewWindow.h index 35f275516..bb31463f7 100644 --- a/src/SVTK/SVTK_ViewWindow.h +++ b/src/SVTK/SVTK_ViewWindow.h @@ -278,6 +278,9 @@ class SVTK_EXPORT SVTK_ViewWindow : public SUIT_ViewWindow //! Set visibility status of the static trihedron virtual void SetStaticTrihedronVisible( const bool ); + //! Sets static trihedron's text color + virtual void setStaticTrihedronTextColor(); + //! Methods to save/restore visual parameters of a view (pan, zoom, etc.) virtual QString getVisualParameters(); diff --git a/src/VTKViewer/VTKViewer_Trihedron.cxx b/src/VTKViewer/VTKViewer_Trihedron.cxx index 4f41779ce..f0a8317d1 100644 --- a/src/VTKViewer/VTKViewer_Trihedron.cxx +++ b/src/VTKViewer/VTKViewer_Trihedron.cxx @@ -305,6 +305,25 @@ void VTKViewer_Axis::SetColor(double theRed, double theGreen, double theBlue) #endif } +/*! Sets color for myLabelActor + */ +void VTKViewer_Axis::SetTextColor(double theRed, double theGreen, double theBlue) +{ +#ifdef IPAL21440 + vtkTextProperty* aProperty = vtkTextProperty::New(); + aProperty->SetColor(theRed, theGreen, theBlue); + + myLabelActor->SetTextProperty(aProperty); +#else + vtkProperty* aProperty = vtkProperty::New(); + aProperty->SetColor(theRed, theGreen, theBlue); + + myLabelActor->SetProperty(aProperty); +#endif + +aProperty->Delete(); +} + /*! Set size of VTKViewer_Axis */ void VTKViewer_Axis::SetSize(double theSize) @@ -543,3 +562,14 @@ bool VTKViewer_Trihedron::OwnActor(const vtkActor* theActor) } return false; } + +/*! Sets a color to a text for the given axis + * \param axis - axis to change a text color + * \param theRed - red color component + * \param theGreen - green color component + * \param theBlue - blue color component + */ +void VTKViewer_Trihedron::SetTextColor(Axis axis, double theRed, double theGreen, double theBlue) +{ + myAxis[axis]->SetTextColor(theRed, theGreen, theBlue); +} diff --git a/src/VTKViewer/VTKViewer_Trihedron.h b/src/VTKViewer/VTKViewer_Trihedron.h index ca5ce2333..065a76ca8 100644 --- a/src/VTKViewer/VTKViewer_Trihedron.h +++ b/src/VTKViewer/VTKViewer_Trihedron.h @@ -143,6 +143,9 @@ protected: /*!This class provide support trihedron object in vtk viewer.*/ class VTKVIEWER_EXPORT VTKViewer_Trihedron : public vtkObject { +public: + enum Axis { X = 0, Y, Z }; + protected: /*!Initialize fields by default values.*/ VTKViewer_Trihedron(); @@ -205,6 +208,14 @@ public: */ virtual bool OwnActor(const vtkActor* theActor); + /*! Sets a color to a text for the given axis + * \param axis - axis to change a text color + * \param theRed - red color component + * \param theGreen - green color component + * \param theBlue - blue color component + */ + virtual void SetTextColor(Axis axis, double theRed, double theGreen, double theBlue); + protected: /*! Actor collection*/ vtkActorCollection* myPresent; @@ -258,6 +269,13 @@ public: * \param theBlue - blue component of the color */ virtual void SetColor(double theRed, double theGreen, double theBlue); + + /*! Sets color for myLabelActor + * \param theRed - red component of the color + * \param theGreen - green component of the color + * \param theBlue - blue component of the color + */ + virtual void SetTextColor(double theRed, double theGreen, double theBlue); /*! Set size of VTKViewer_Axis */ diff --git a/src/ViewerTools/CMakeLists.txt b/src/ViewerTools/CMakeLists.txt index fa3791cc8..0f044239c 100644 --- a/src/ViewerTools/CMakeLists.txt +++ b/src/ViewerTools/CMakeLists.txt @@ -25,6 +25,7 @@ INCLUDE(UseQtExt) INCLUDE_DIRECTORIES( ${QT_INCLUDES} ${PROJECT_SOURCE_DIR}/src/Qtx + ${PROJECT_SOURCE_DIR}/src/SUIT ) # additional preprocessor / compiler flags @@ -34,7 +35,8 @@ ADD_DEFINITIONS(${QT_DEFINITIONS}) SET(_link_LIBRARIES ${QT_LIBRARIES} ${KERNEL_SALOMELocalTrace} - qtx) + qtx + suit) # --- headers --- @@ -47,7 +49,10 @@ SET(_moc_HEADERS ) # header files / no moc processing -SET(_other_HEADERS ViewerTools.h) +SET(_other_HEADERS + ViewerTools.h + ViewerTools_TrihedronSetup.h +) # header files / to install SET(ViewerTools_HEADERS ${_moc_HEADERS} ${_other_HEADERS}) @@ -72,6 +77,7 @@ SET(_other_SOURCES ViewerTools_DialogBase.cxx ViewerTools_FontWidgetBase.cxx ViewerTools_ScreenScaling.cxx + ViewerTools_TrihedronSetup.cxx ) # sources / to compile diff --git a/src/ViewerTools/ViewerTools_TrihedronSetup.cxx b/src/ViewerTools/ViewerTools_TrihedronSetup.cxx new file mode 100644 index 000000000..08dd0720a --- /dev/null +++ b/src/ViewerTools/ViewerTools_TrihedronSetup.cxx @@ -0,0 +1,96 @@ +// Copyright (C) 2007-2023 CEA, EDF, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See https://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "ViewerTools_TrihedronSetup.h" + +#include "SUIT_ResourceMgr.h" +#include "SUIT_Session.h" + +#include +#include + +namespace +{ + // Settings names to use with resource manager + const char* THE_3DSECTION_TITLE = "3DViewer"; +}; + +/*! + * Class : ViewerTools_TrihedronSetupBase + * Description : Helper class to setup trihedron settings for different viewers + */ + +bool ViewerTools_TrihedronSetupBase::isCustomTextFontOn() const +{ + return SUIT_Session::session()->resourceMgr()->booleanValue( + THE_3DSECTION_TITLE, "trihedron_text_font_custom", false); +} + +bool ViewerTools_TrihedronSetupBase::isCustomTextColorOn() const +{ + return SUIT_Session::session()->resourceMgr()->booleanValue( + THE_3DSECTION_TITLE, "trihedron_text_color_custom", false); +} + +void ViewerTools_TrihedronSetupBase::setTextFont() +{ + if (isCustomTextFontOn()) + { + const SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + + // Set the fonts from application settings + setTextFontX(resMgr->fontValue(THE_3DSECTION_TITLE, "trihedron_x_text_font")); + setTextFontY(resMgr->fontValue(THE_3DSECTION_TITLE, "trihedron_y_text_font")); + setTextFontZ(resMgr->fontValue(THE_3DSECTION_TITLE, "trihedron_z_text_font")); + } + else + { + // Set the font defined for trihedron by default + setTextFontX(getDefaultTextFont()); + setTextFontY(getDefaultTextFont()); + setTextFontZ(getDefaultTextFont()); + } +} + +void ViewerTools_TrihedronSetupBase::setTextColor() +{ + if (isCustomTextColorOn()) + { + const SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + + // Set the colors from application settings + setTextColorX(resMgr->colorValue(THE_3DSECTION_TITLE, "trihedron_x_text_color")); + setTextColorY(resMgr->colorValue(THE_3DSECTION_TITLE, "trihedron_y_text_color")); + setTextColorZ(resMgr->colorValue(THE_3DSECTION_TITLE, "trihedron_z_text_color")); + } + else + { + // Set the colors defined for trihedron by default + static const QColor colorX = QColor(255, 0.0, 0.0); + static const QColor colorY = QColor(0.0, 255, 0.0); + static const QColor colorZ = QColor(0.0, 0.0, 255); + + setTextColorX(colorX); + setTextColorY(colorY); + setTextColorZ(colorZ); + } +} diff --git a/src/ViewerTools/ViewerTools_TrihedronSetup.h b/src/ViewerTools/ViewerTools_TrihedronSetup.h new file mode 100644 index 000000000..fc76a496a --- /dev/null +++ b/src/ViewerTools/ViewerTools_TrihedronSetup.h @@ -0,0 +1,59 @@ +// Copyright (C) 2007-2023 CEA, EDF, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See https://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef VIEWERTOOLS_TRIHEDRON_SETUP_H +#define VIEWERTOOLS_TRIHEDRON_SETUP_H + +#include "ViewerTools.h" + +class QFont; +class QColor; + +/*! + * Class : ViewerTools_TrihedronSetupBase + * Description : Helper class to setup trihedron settings for different viewers + */ +class VIEWERTOOLS_EXPORT ViewerTools_TrihedronSetupBase +{ +public: + virtual ~ViewerTools_TrihedronSetupBase() {} + + bool isCustomTextFontOn() const; + bool isCustomTextColorOn() const; + + virtual void setTextFont(); + virtual void setTextColor(); + +protected: + // Pure virtual methods should be implemented for each trihedron class + virtual QFont getDefaultTextFont() const = 0; + + virtual void setTextFontX(const QFont& font) = 0; + virtual void setTextFontY(const QFont& font) = 0; + virtual void setTextFontZ(const QFont& font) = 0; + + virtual void setTextColorX(const QColor& color) = 0; + virtual void setTextColorY(const QColor& color) = 0; + virtual void setTextColorZ(const QColor& color) = 0; +}; + +#endif \ No newline at end of file -- 2.39.2