From af4466fde5a90dbf08c3099640131b066bfb23aa Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 22 Jan 2009 13:45:55 +0000 Subject: [PATCH] Merge from BR_V5_IMP_P8 --- doc/salome/gui/VISU/images/barproperty.png | Bin 15264 -> 13976 bytes .../gui/VISU/images/labeling_parameters.png | Bin 0 -> 11100 bytes .../gui/VISU/images/scalarbarproperties.png | Bin 33110 -> 38936 bytes .../gui/VISU/images/values_labeling.png | Bin 0 -> 55386 bytes .../gui/VISU/input/field_presentations.doc | 4 +- doc/salome/gui/VISU/input/index.doc | 2 +- doc/salome/gui/VISU/input/scalar_map.doc | 12 +- doc/salome/gui/VISU/input/values_labeling.doc | 34 ++ idl/VISU_Gen.idl | 21 + resources/SalomeApp.xml | 26 +- src/OBJECT/VISU_Actor.cxx | 159 +++++- src/OBJECT/VISU_Actor.h | 38 +- src/OBJECT/VISU_VectorsAct.cxx | 27 +- src/OBJECT/VISU_VectorsAct.h | 7 +- src/PIPELINE/VISU_ScalarBarActor.cxx | 60 +-- src/PIPELINE/VISU_ScalarBarActor.hxx | 10 +- src/VISUGUI/Makefile.am | 12 +- src/VISUGUI/VISU_msg_en.ts | 87 +++- src/VISUGUI/VisuGUI.cxx | 232 ++++++--- src/VISUGUI/VisuGUI.h | 7 +- src/VISUGUI/VisuGUI_ActionsDef.h | 4 + .../VisuGUI_DeformedShapeAndScalarMapDlg.cxx | 4 + src/VISUGUI/VisuGUI_GaussPointsDlg.cxx | 41 +- src/VISUGUI/VisuGUI_GaussPointsDlg.h | 4 +- src/VISUGUI/VisuGUI_Prs3dDlg.cxx | 476 ++++++++---------- src/VISUGUI/VisuGUI_Prs3dDlg.h | 44 +- src/VISUGUI/VisuGUI_Selection.cxx | 18 + src/VISUGUI/VisuGUI_Selection.h | 1 + src/VISUGUI/VisuGUI_Table3dDlg.cxx | 50 +- src/VISUGUI/VisuGUI_Table3dDlg.h | 4 +- src/VISUGUI/VisuGUI_Tools.cxx | 11 +- src/VISUGUI/VisuGUI_ValuesLabelingDlg.cxx | 233 +++++++++ src/VISUGUI/VisuGUI_ValuesLabelingDlg.h | 66 +++ src/VISU_I/VISU_ColoredPrs3d_i.cc | 306 ++++++++--- src/VISU_I/VISU_ColoredPrs3d_i.hh | 78 ++- src/VISU_I/VISU_DumpPython.cc | 3 + src/VISU_I/VISU_GaussPoints_i.cc | 20 +- src/VISU_I/VISU_Mesh_i.cc | 46 +- src/VISU_I/VISU_Mesh_i.hh | 6 + src/VISU_I/VISU_PointMap3d_i.cc | 65 +-- src/VISU_I/VISU_PointMap3d_i.hh | 15 +- src/VISU_I/VISU_Prs3dUtils.cc | 53 ++ src/VISU_I/VISU_Prs3dUtils.hh | 4 +- src/VISU_I/VISU_ScalarMap_i.cc | 41 +- src/VISU_I/VISU_ScalarMap_i.hh | 5 + 45 files changed, 1683 insertions(+), 653 deletions(-) create mode 100644 doc/salome/gui/VISU/images/labeling_parameters.png create mode 100644 doc/salome/gui/VISU/images/values_labeling.png create mode 100644 doc/salome/gui/VISU/input/values_labeling.doc create mode 100755 src/VISUGUI/VisuGUI_ValuesLabelingDlg.cxx create mode 100755 src/VISUGUI/VisuGUI_ValuesLabelingDlg.h diff --git a/doc/salome/gui/VISU/images/barproperty.png b/doc/salome/gui/VISU/images/barproperty.png index 02d449ea8745553086e04c31ae06d1e5784c5c63..f095a330c1fc8ab1a5033865b01baefc56e4d0bf 100644 GIT binary patch literal 13976 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 Cw_q#) literal 15264 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 UF!_KtZ*gQK6(x#az5DRL0KnrU5&!@I diff --git a/doc/salome/gui/VISU/images/labeling_parameters.png b/doc/salome/gui/VISU/images/labeling_parameters.png new file mode 100644 index 0000000000000000000000000000000000000000..58ae411f3ec8e3c8ef856f0c0696c01754e8bcee GIT binary patch literal 11100 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/VISU/images/scalarbarproperties.png b/doc/salome/gui/VISU/images/scalarbarproperties.png index 86ca6dffbe1a3b2d23337c717cb973a54418d355..318497db8ae0e169a667995dd014ec206cbee0ce 100644 GIT binary patch literal 38936 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 O2s~Z=T-G@yGywqI9c69+ literal 33110 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 Nw>yfmMYkV4|37>g(Oduk diff --git a/doc/salome/gui/VISU/images/values_labeling.png b/doc/salome/gui/VISU/images/values_labeling.png new file mode 100644 index 0000000000000000000000000000000000000000..056b1f126490f41fd73112e4b46319f25ba29cfb GIT binary patch literal 55386 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

    &f$4&<|c2kBCS^{i45PorXc=p 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�{#X^t-4O55>`_SC@yBwwPevMcocR~J}T&0cuEAx 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\subpage plot_3d_page
  • \subpage gauss_points_presentations_page
+Over the Field presentation of any type you can display field values +as \subpage values_labeling_page "text labels".
To create a field presentation (\ref fields_anchor "see also"): \par @@ -41,4 +43,4 @@ submenu of the main menu or from the Visualization Toolbar. The new field presentation will be located in the time stamp subfolder in the Object Browser and displayed -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/VISU/input/index.doc b/doc/salome/gui/VISU/input/index.doc index d87c8b77..c82f4977 100644 --- a/doc/salome/gui/VISU/input/index.doc +++ b/doc/salome/gui/VISU/input/index.doc @@ -15,4 +15,4 @@ A MED file contains the description of a \subpage med_object_page "MED object", \n The Python interface of \b Post-Pro module is described in \subpage idl_interface_page "Access to Post-Pro module functionality" page. -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/VISU/input/scalar_map.doc b/doc/salome/gui/VISU/input/scalar_map.doc index 0782be69..749ff40c 100644 --- a/doc/salome/gui/VISU/input/scalar_map.doc +++ b/doc/salome/gui/VISU/input/scalar_map.doc @@ -94,7 +94,7 @@ orientation of the scalar bar.
  • Origin: you can enter X & Y coordinates of the origin of the scalar bar.
  • Dimensions: you can enter \b Width and \b Height of the -scalar bar.
  • +scalar bar specified in % of the size of view.
  • Text properties button allows you to define from the following dialog box: @@ -113,11 +113,11 @@ following dialog box: \image html barproperty.png
      -
    • Relative \b width and \b height of \b Title (in percents),
    • -
    • Relative \b width and \b height of \b Labels (in percents),
    • -
    • Relative \b width and \b height of \b Bar (in percents),
    • +
    • Relative \b size of \b Title (in percents of the width of scalar bar widget),
    • +
    • Relative \b size of \b Labels (in percents of the width of scalar bar widget),
    • +
    • Relative \b width and \b height of \b Bar (in percents of the width and height of scalar bar widget),
    • Visibility of \b Units in \b Title,
    • -
    • Format of \b Labels.
    • +
    • Precision of \b Labels which specifies the number of characters to be printed, the number of decimal places, or the number of significant digits
  • Preview checkbox allows to see a preview of the @@ -134,7 +134,7 @@ along the scalar bar.
  • presentations. -/note The following option is relevant only for Gauss Points presentations. +\note The following option is relevant only for Gauss Points presentations. \n Gauss Points Presentations presume that two different scalar bars are displayed simultaneously: diff --git a/doc/salome/gui/VISU/input/values_labeling.doc b/doc/salome/gui/VISU/input/values_labeling.doc new file mode 100644 index 00000000..e6d3f930 --- /dev/null +++ b/doc/salome/gui/VISU/input/values_labeling.doc @@ -0,0 +1,34 @@ +/*! + +\page values_labeling_page Values labeling + +

    Displaying value labels

    + +In VISU you can display values applied to the cells or nodes of 3D presentation intended for visualization of calculation data. + +To display labels for values: +
      +
    1. Display your presentation in 3d viewer
    2. +
    3. Right-click on the presentation in the 3D viewer and from the associated pop-up menu choose Values labeling.
    4. +
    + +It will looks as follow: + +\image html values_labeling.png + +

    Parameters of values labeling

    + +You have ability to change parameters of values labeling such as font and color. Default parameters can be specified using "Preferences" dialog box. Also you can change parameters for each presentation. + +To change parameters of the presentation: +
      +
    1. Display your presentation in 3d viewer
    2. +
    3. Right-click on the presentation in the 3D viewer and from the associated pop-up menu choose Labeling parameters.
    4. +
    5. Use "Parameters of values labeling" dialog box for the operation
    6. +
    + +It will looks as follows: + +\image html labeling_parameters.png + +*/ diff --git a/idl/VISU_Gen.idl b/idl/VISU_Gen.idl index 6460854c..f4027093 100644 --- a/idl/VISU_Gen.idl +++ b/idl/VISU_Gen.idl @@ -365,6 +365,17 @@ module VISU { * \return The type of representation of the mesh. */ PresentationType GetPresentationType(); + + /*! + * Switches shrink mode of presentation + * Note: SetPresentationType(SHRINK) is same as SetShrink(True) + */ + void SetShrink(in boolean toShrink); + + /*! + * Returns current state of shrink mode + */ + boolean IsShrank(); }; @@ -714,6 +725,16 @@ module VISU { interface ScalarMap : ColoredPrs3d, ScaledPrs3d { + /*! + * Returns visibility state of scalar bar + */ + boolean IsBarVisible(); + + /*! + * Sets visibility state of scalar bar + */ + void SetBarVisible(in boolean theVisible); + }; //------------------------------------------------------- diff --git a/resources/SalomeApp.xml b/resources/SalomeApp.xml index 0e4ffe48..3cde8f73 100644 --- a/resources/SalomeApp.xml +++ b/resources/SalomeApp.xml @@ -56,19 +56,17 @@ - - - + + + - - - - + + - - + + @@ -81,12 +79,12 @@ - + - - + + - + @@ -172,6 +170,8 @@ + +
    diff --git a/src/OBJECT/VISU_Actor.cxx b/src/OBJECT/VISU_Actor.cxx index edbcbc34..431ffd68 100644 --- a/src/OBJECT/VISU_Actor.cxx +++ b/src/OBJECT/VISU_Actor.cxx @@ -23,8 +23,7 @@ // File : // Author : // Module : VISU -// $Header$ -// + #include "VISU_Actor.h" #include "VISU_PickingSettings.h" @@ -59,6 +58,12 @@ #include #include #include +#include +#include +#include +#include +#include +#include #include #include @@ -138,6 +143,44 @@ VISU_Actor aPickingSettings->AddObserver(VISU::UpdatePickingSettingsEvent, myEventCallbackCommand.GetPointer(), myPriority); + + //Definition of values labeling pipeline + + myValLblDataSet = vtkUnstructuredGrid::New(); + + myValCellCenters = vtkCellCenters::New(); + myValCellCenters->SetInput(myValLblDataSet); + + myValMaskPoints = vtkMaskPoints::New(); + myValMaskPoints->SetInput(myValCellCenters->GetOutput()); + myValMaskPoints->SetOnRatio(1); + + myValSelectVisiblePoints = vtkSelectVisiblePoints::New(); + myValSelectVisiblePoints->SetInput(myValMaskPoints->GetOutput()); + myValSelectVisiblePoints->SelectInvisibleOff(); + myValSelectVisiblePoints->SetTolerance(0.1); + + myValLabeledDataMapper = vtkLabeledDataMapper::New(); + myValLabeledDataMapper->SetInput(myValSelectVisiblePoints->GetOutput()); + myValLabeledDataMapper->SetLabelFormat("%g"); + myValLabeledDataMapper->SetLabelModeToLabelScalars(); + + vtkTextProperty* aClsTextProp = vtkTextProperty::New(); + aClsTextProp->SetFontFamilyToTimes(); + static int aCellsFontSize = 12; + aClsTextProp->SetFontSize(aCellsFontSize); + aClsTextProp->SetBold(1); + aClsTextProp->SetItalic(0); + aClsTextProp->SetShadow(0); + myValLabeledDataMapper->SetLabelTextProperty(aClsTextProp); + aClsTextProp->Delete(); + + myIsValLabeled = false; + + myValLabels = vtkActor2D::New(); + myValLabels->SetMapper(myValLabeledDataMapper); + myValLabels->GetProperty()->SetColor(0,1,0); + myValLabels->SetVisibility( myIsValLabeled ); } //---------------------------------------------------------------------------- @@ -181,6 +224,15 @@ VISU_Actor VISU_Actor ::~VISU_Actor() { + // Deleting of values labeling pipeline + myValLblDataSet->Delete(); + myValLabeledDataMapper->RemoveAllInputs(); + myValLabeledDataMapper->Delete(); + myValSelectVisiblePoints->Delete(); + myValMaskPoints->Delete(); + myValCellCenters->Delete(); + myValLabels->Delete(); + if(MYDEBUG) MESSAGE("~VISU_Actor() - this = "<AddActor(myAnnotationActor.GetPointer()); theRenderer->AddActor(myTextActor.GetPointer()); + + myValSelectVisiblePoints->SetRenderer( theRenderer ); + theRenderer->AddActor2D( myValLabels ); + } //================================================================== @@ -479,10 +535,20 @@ VISU_Actor { theRenderer->RemoveActor(myAnnotationActor.GetPointer()); theRenderer->RemoveActor(myTextActor.GetPointer()); + theRenderer->RemoveActor(myValLabels); Superclass::RemoveFromRender(theRenderer); myDestroySignal(this); } +//---------------------------------------------------------------------------- +void +VISU_Actor +::SetVisibility(int theMode) +{ + Superclass::SetVisibility( theMode ); + myValLabels->SetVisibility( myIsValLabeled && theMode ); +} + //---------------------------------------------------------------------------- void VISU_Actor @@ -1093,3 +1159,92 @@ VISU_Actor Update(); } + +// --------------------------------------------------------------- + +void VISU_Actor::SetValuesLabeled( const bool theIsValLabeled ) +{ + vtkDataSet* aGrid = GetValLabelsInput(); + if ( !aGrid ) + return; + + bool isOnPnt = VISU::IsDataOnPoints( aGrid ); + bool isOnCell = VISU::IsDataOnCells( aGrid ); + if ( !isOnPnt && !isOnCell ) + { + // try to specify location of scalars "manually" + vtkCellData* aCData = aGrid->GetCellData(); + if ( aCData ) + { + vtkDataArray* anArr = aCData->GetScalars(); + if ( anArr && anArr->GetNumberOfTuples() ) + isOnCell = true; + } + + if ( !isOnCell ) + { + vtkPointData* aPData = aGrid->GetPointData(); + if ( aPData ) + { + vtkDataArray* anArr = aPData->GetScalars(); + if ( anArr && anArr->GetNumberOfTuples() ) + isOnPnt = true; + } + } + + if ( !isOnPnt && !isOnCell ) + { + myValLabels->SetVisibility( false ); + return; + } + } + + myIsValLabeled = theIsValLabeled; + + if ( myIsValLabeled ) + { + vtkDataSet* aDataSet = aGrid; + + if ( isOnCell ) + { + myValCellCenters->SetInput( aDataSet ); + myValMaskPoints->SetInput( myValCellCenters->GetOutput() ); + } + else if ( isOnPnt ) + myValMaskPoints->SetInput( aDataSet ); + + myValLabels->SetVisibility( GetVisibility() ); + } + else + myValLabels->SetVisibility( false ); + + Modified(); +} + +//---------------------------------------------------------------------------- + +bool VISU_Actor::GetValuesLabeled() const +{ + return myIsValLabeled; +} + +//---------------------------------------------------------------------------- + +vtkTextProperty* VISU_Actor::GetsValLabelsProps() const +{ + return myValLabeledDataMapper->GetLabelTextProperty(); +} + +//---------------------------------------------------------------------------- + +vtkDataSet* VISU_Actor::GetValLabelsInput() +{ + vtkDataSet* aDataSet = 0; + VISU_PipeLine* aPL = GetPipeLine(); + if ( aPL ) + aDataSet = aPL->GetOutput(); + if ( !aDataSet ) + aDataSet = GetInput(); + return aDataSet; +} + diff --git a/src/OBJECT/VISU_Actor.h b/src/OBJECT/VISU_Actor.h index 0f8ddca8..dbc76f86 100644 --- a/src/OBJECT/VISU_Actor.h +++ b/src/OBJECT/VISU_Actor.h @@ -23,8 +23,7 @@ // File : // Author : // Module : VISU -// $Header$ -// + #ifndef VISU_ACTOR_H #define VISU_ACTOR_H @@ -50,6 +49,12 @@ class VISU_PipeLine; class vtkPlane; class vtkImplicitFunctionCollection; class vtkFeatureEdges; +class vtkTextProperty; +class vtkCellCenters; +class vtkSelectVisiblePoints; +class vtkLabeledDataMapper; +class vtkMaskPoints; +class vtkActor2D; class VISU_FramedTextActor; @@ -99,6 +104,10 @@ class VISU_OBJECT_EXPORT VISU_Actor : public VISU_ActorBase void SetPrs3d(VISU::Prs3d_i* thePrs3d); + virtual + void + SetVisibility(int theMode); + //---------------------------------------------------------------------------- virtual VISU_PipeLine* @@ -299,6 +308,22 @@ class VISU_OBJECT_EXPORT VISU_Actor : public VISU_ActorBase UpdatePickingSettings(); //---------------------------------------------------------------------------- + //! Methods for values labeling + virtual + void + SetValuesLabeled( const bool theIsValLabeled ); + + virtual + bool + GetValuesLabeled() const; + + virtual + vtkDataSet* + GetValLabelsInput(); + + vtkTextProperty* + GetsValLabelsProps() const; + protected: VISU_Actor(); @@ -355,6 +380,15 @@ class VISU_OBJECT_EXPORT VISU_Actor : public VISU_ActorBase Selection_Mode myLastSelectionMode; bool myIsSubElementsHighlighted; + + // fields for values labeling + bool myIsValLabeled; + vtkDataSet* myValLblDataSet; + vtkActor2D* myValLabels; + vtkMaskPoints* myValMaskPoints; + vtkCellCenters* myValCellCenters; + vtkLabeledDataMapper* myValLabeledDataMapper; + vtkSelectVisiblePoints* myValSelectVisiblePoints; }; #endif //VISU_ACTOR_H diff --git a/src/OBJECT/VISU_VectorsAct.cxx b/src/OBJECT/VISU_VectorsAct.cxx index aabab200..0742a57a 100644 --- a/src/OBJECT/VISU_VectorsAct.cxx +++ b/src/OBJECT/VISU_VectorsAct.cxx @@ -23,8 +23,7 @@ // File : VISU_VectorsAct.cxx // Author : Laurent CORNABE with help of Nicolas REJNERI // Module : VISU -// $Header$ -// + #include "VISU_VectorsAct.h" #include "VISU_VectorsPL.hxx" #include @@ -35,6 +34,9 @@ #include #include #include +#include +#include +#include //---------------------------------------------------------------------------- vtkStandardNewMacro(VISU_VectorsAct); @@ -119,3 +121,24 @@ VISU_VectorsAct return aSize; } + +//---------------------------------------------------------------------------- +vtkDataSet* +VISU_VectorsAct +::GetValLabelsInput() +{ + VISU_VectorsPL* aPL = dynamic_cast( GetPipeLine() ); + if ( aPL ) + { + return aPL->GetMergedInput(); + /*VISU_UsedPointsFilter* aFilter = aPL->GetUsedPointsFilter(); + vtkSmartPointer< VISU_MergeFilter > aFilter = aPL->myMergeFilter; + if ( aFilter ) + { + aFilter->Update(); + return aFilter->GetOutput(); + }*/ + } + + return Superclass::GetValLabelsInput(); +} diff --git a/src/OBJECT/VISU_VectorsAct.h b/src/OBJECT/VISU_VectorsAct.h index 310f5501..98db4124 100644 --- a/src/OBJECT/VISU_VectorsAct.h +++ b/src/OBJECT/VISU_VectorsAct.h @@ -23,8 +23,7 @@ // File : VISU_VectorsAct.h // Author : Laurent CORNABE with help of Nicolas REJNERI // Module : VISU -// $Header$ -// + #ifndef VISU_VectorsAct_HeaderFile #define VISU_VectorsAct_HeaderFile @@ -65,6 +64,10 @@ class VISU_OBJECT_EXPORT VISU_VectorsAct : public VISU_ScalarMapAct virtual unsigned long int GetMemorySize(); + + virtual + vtkDataSet* + GetValLabelsInput(); protected: VISU_VectorsAct(); diff --git a/src/PIPELINE/VISU_ScalarBarActor.cxx b/src/PIPELINE/VISU_ScalarBarActor.cxx index afb4e58b..fcb77b2d 100644 --- a/src/PIPELINE/VISU_ScalarBarActor.cxx +++ b/src/PIPELINE/VISU_ScalarBarActor.cxx @@ -105,11 +105,9 @@ VISU_ScalarBarActor::VISU_ScalarBarActor() this->LastSize[0] = 0; this->LastSize[1] = 0; - this->TitleRatioWidth = 0; + this->TitleRatioSize = 0; this->LabelRatioWidth = 0; this->BarRatioWidth = 0; - this->TitleRatioHeight = 0; - this->LabelRatioHeight = 0; this->BarRatioHeight = 0; // RKV : Begin @@ -653,13 +651,10 @@ void VISU_ScalarBarActor::AllocateAndSizeLabels(int *labelSize, int *size, else targetWidth = (int)(0.01*LabelRatioWidth*size[0]); - if(LabelRatioHeight == 0) - if ( this->Orientation == VTK_ORIENT_VERTICAL ) - targetHeight = (int)(0.86*size[1]/this->NumberOfLabels); - else - targetHeight = (int)(0.25*size[1]); + if ( this->Orientation == VTK_ORIENT_VERTICAL ) + targetHeight = (int)(0.86*size[1]/this->NumberOfLabels); else - targetHeight = (int)(0.01*LabelRatioHeight*size[1]); + targetHeight = (int)(0.25*size[1]); vtkTextMapper::SetMultipleConstrainedFontSize(viewport, targetWidth, @@ -682,18 +677,15 @@ void VISU_ScalarBarActor::SizeTitle(int *titleSize, int *size, int targetWidth, targetHeight; - if(TitleRatioWidth == 0) + if(TitleRatioSize == 0) targetWidth = size[0]; else - targetWidth = (int)(0.01*TitleRatioWidth*size[0]); + targetWidth = (int)(0.01*TitleRatioSize*size[0]); - if(TitleRatioHeight == 0) - if ( this->Orientation == VTK_ORIENT_VERTICAL ) - targetHeight = (int)(0.1*size[1]); - else - targetHeight = (int)(0.25*size[1]); + if ( this->Orientation == VTK_ORIENT_VERTICAL ) + targetHeight = (int)(0.1*size[1]); else - targetHeight = (int)(0.01*TitleRatioHeight*size[1]); + targetHeight = (int)(0.25*size[1]); this->TitleMapper->SetConstrainedFontSize( viewport, targetWidth, targetHeight); @@ -753,21 +745,14 @@ void VISU_ScalarBarActor::DebugOff() { } // RKV : End -void VISU_ScalarBarActor::SetRatios(int titleRatioWidth, int titleRatioHeight, - int labelRatioWidth, int labelRatioHeight, +void VISU_ScalarBarActor::SetRatios(int titleRatioSize, int labelRatioWidth, int barRatioWidth, int barRatioHeight) { - TitleRatioWidth=titleRatioWidth; - if(TitleRatioWidth>100) - TitleRatioWidth=100; - else if(TitleRatioWidth<0) - TitleRatioWidth=0; - - TitleRatioHeight=titleRatioHeight; - if(TitleRatioHeight>100) - TitleRatioHeight=100; - else if(TitleRatioHeight<0) - TitleRatioHeight=0; + TitleRatioSize=titleRatioSize; + if(TitleRatioSize>100) + TitleRatioSize=100; + else if(TitleRatioSize<0) + TitleRatioSize=0; LabelRatioWidth=labelRatioWidth; if(LabelRatioWidth>100) @@ -775,12 +760,6 @@ void VISU_ScalarBarActor::SetRatios(int titleRatioWidth, int titleRatioHeight, else if(LabelRatioWidth<0) LabelRatioWidth=0; - LabelRatioHeight=labelRatioHeight; - if(LabelRatioHeight>100) - LabelRatioHeight=100; - else if(LabelRatioHeight<0) - LabelRatioHeight=0; - BarRatioWidth=barRatioWidth; if(BarRatioWidth>100) BarRatioWidth=100; @@ -794,14 +773,11 @@ void VISU_ScalarBarActor::SetRatios(int titleRatioWidth, int titleRatioHeight, BarRatioHeight=0; } -void VISU_ScalarBarActor::GetRatios(int& titleRatioWidth, int& titleRatioHeight, - int& labelRatioWidth, int& labelRatioHeight, - int& barRatioWidth, int& barRatioHeight) +void VISU_ScalarBarActor::GetRatios(int& titleRatioSize, int& labelRatioWidth, + int& barRatioWidth, int& barRatioHeight) { - titleRatioWidth=TitleRatioWidth; - titleRatioHeight=TitleRatioHeight; + titleRatioSize=TitleRatioSize; labelRatioWidth=LabelRatioWidth; - labelRatioHeight=LabelRatioHeight; barRatioWidth=BarRatioWidth; barRatioHeight=BarRatioHeight; } diff --git a/src/PIPELINE/VISU_ScalarBarActor.hxx b/src/PIPELINE/VISU_ScalarBarActor.hxx index 4e790c97..e624af0d 100644 --- a/src/PIPELINE/VISU_ScalarBarActor.hxx +++ b/src/PIPELINE/VISU_ScalarBarActor.hxx @@ -130,11 +130,9 @@ public: // Description: // Set/Get the scalar bar dimention properties in persents. // 0 <= ration <= 100 - void SetRatios(int titleRatioWidth, int titleRatioHeight, - int labelRatioWidth, int labelRatioHeight, + void SetRatios(int titleRatioSize,int labelRatioWidth, int barRatioWidth, int barRatioHeight); - void GetRatios(int& titleRatioWidth, int& titleRatioHeight, - int& labelRatioWidth, int& labelRatioHeight, + void GetRatios(int& titleRatioSize, int& labelRatioWidth, int& barRatioWidth, int& barRatioHeight); // Description: @@ -173,11 +171,9 @@ protected: int Orientation; char *Title; char *LabelFormat; - int TitleRatioWidth; + int TitleRatioSize; int LabelRatioWidth; int BarRatioWidth; - int TitleRatioHeight; - int LabelRatioHeight; int BarRatioHeight; vtkTextMapper **TextMappers; diff --git a/src/VISUGUI/Makefile.am b/src/VISUGUI/Makefile.am index 239243cd..7ff78217 100644 --- a/src/VISUGUI/Makefile.am +++ b/src/VISUGUI/Makefile.am @@ -23,8 +23,7 @@ # File : Makefile.am # Author : Marc Tajchman (CEA) # Module : VISU -# $Header$ -# + include $(top_srcdir)/adm_local/unix/make_common_starter.am lib_LTLIBRARIES= libVISU.la @@ -69,7 +68,8 @@ salomeinclude_HEADERS= \ VisuGUI_Slider.h \ VisuGUI_InputPane.h \ VisuGUI_CacheDlg.h \ - VisuGUI_FieldFilter.h + VisuGUI_FieldFilter.h \ + VisuGUI_ValuesLabelingDlg.h dist_libVISU_la_SOURCES= \ VisuGUI.cxx \ @@ -119,7 +119,8 @@ dist_libVISU_la_SOURCES= \ VisuGUI_FieldFilter.cxx \ VisuGUI_ClippingPanel.cxx \ VisuGUI_ClippingPlaneDlg.cxx \ - VisuGUI_FilterScalarsDlg.cxx + VisuGUI_FilterScalarsDlg.cxx \ + VisuGUI_ValuesLabelingDlg.cxx MOC_FILES= \ VisuGUI_moc.cxx \ @@ -162,7 +163,8 @@ MOC_FILES= \ VisuGUI_FileInfoDlg_moc.cxx \ VisuGUI_ClippingPanel_moc.cxx \ VisuGUI_ClippingPlaneDlg_moc.cxx \ - VisuGUI_FilterScalarsDlg_moc.cxx + VisuGUI_FilterScalarsDlg_moc.cxx \ + VisuGUI_ValuesLabelingDlg_moc.cxx nodist_libVISU_la_SOURCES=$(MOC_FILES) diff --git a/src/VISUGUI/VISU_msg_en.ts b/src/VISUGUI/VISU_msg_en.ts index 621323c2..6070c77b 100644 --- a/src/VISUGUI/VISU_msg_en.ts +++ b/src/VISUGUI/VISU_msg_en.ts @@ -427,16 +427,16 @@ Do you want to enlarge the cache? Labels format - VISU_TITLE_WIDTH - Title width (%): + VISU_TITLE_SIZE + Title size (%): VISU_TITLE_HEIGHT Title height (%): - VISU_LABEL_WIDTH - Label width (%): + VISU_LABEL_SIZE + Label size (%): VISU_LABEL_HEIGHT @@ -885,6 +885,10 @@ Please, refer to the documentation. VisuGUI + + PRECISION + Precision + DLG_LINEWIDTH_CMT1 Set value between @@ -1276,6 +1280,14 @@ Please, refer to the documentation. MEN_FILTER_SCALARS Filter by Scalars... + + + MEN_VALUES_LABELING + Values labeling + + + VISU_VALUES_LABELING_PARAMS + Labeling parameters TOOL_IMPORTImport TOOL_REPRESENTATIONRepresentation @@ -1323,6 +1335,18 @@ Please, refer to the documentation. UNKNOWN_IMPORT_ERROR Unknown error + + VALUES_LABELING + Values labeling + + + LABELS + Labels + + + COLOR + Color + VisuGUI_AxisWg @@ -2861,7 +2885,7 @@ Please, provide non-empty resulting presentation. DIMENSIONS_GRP - Dimensions + Dimensions (in % of the size of view) FIELD_RANGE_BTN @@ -2907,6 +2931,10 @@ Please, provide non-empty resulting presentation. FILTER_BY_SCALARS Filter by scalars + + VALUES_LABELING + Values labeling + LBL_WIDTH Width: @@ -2955,6 +2983,10 @@ Please, provide non-empty resulting presentation. WRN_LOGARITHMIC_RANGE Logarithmic scaling: use imposed range values > 0 + + HIDE_SCALAR_BAR + Hide scalar bar + VisuGUI_DeformedShapeAndScalarMapDlg @@ -3509,6 +3541,18 @@ Please, refer to the QT documentation. VisuGUI_BarPrefDlg + + DIMENSIONS + Dimensions (in % of the size of widget) + + + WIDTH + Width + + + PRECISION + Precision + &OK @@ -3523,15 +3567,11 @@ Please, refer to the QT documentation. LBL_TITLE_W - Title width (%) - - - LBL_TITLE_H - Title height (%) + Title size (%) LBL_LABEL_W - Label width (%) + Label size (%) LBL_LABEL_H @@ -3559,7 +3599,11 @@ Please, refer to the QT documentation. MSG_BIG_SCALE - The common (Title, Label, Bar) width or height should not be greater then 100%. + The common Label size and Bar width or height should not be greater then 100%. + + + MSG_BIG_SCALE_TLT + The Title size should not be greater then 100%. AUTO @@ -3937,4 +3981,23 @@ Please, refer to the QT documentation. Max: + + VisuGUI_ValuesLabelingDlg + + PARAMETERS_OF_VALUES_LABELING + Parameters of values labeling + + + LABELS + Labels + + + FONT + Font + + + COLOR + Color + + diff --git a/src/VISUGUI/VisuGUI.cxx b/src/VISUGUI/VisuGUI.cxx index 3238d008..801b83de 100644 --- a/src/VISUGUI/VisuGUI.cxx +++ b/src/VISUGUI/VisuGUI.cxx @@ -23,7 +23,6 @@ // File : VisuGUI.cxx // Author : // Module : VISU -// $Header$ #include "VisuGUI.h" @@ -160,7 +159,9 @@ #include "VisuGUI_Slider.h" #include "VisuGUI_Sweep.h" - +#include +#include +#include using namespace VISU; @@ -2639,6 +2640,15 @@ VisuGUI createAction( VISU_FILTERSCALARS, tr("MEN_FILTER_SCALARS"), QIcon(), tr("MEN_FILTER_SCALARS"), "", 0, aParent, false, this, SLOT(OnFilterScalars())); + + createAction( VISU_VALUES_LABELING, tr("MEN_VALUES_LABELING"), QIcon(), + tr("MEN_VALUES_LABELING"), "", 0, aParent, true, + this, SLOT(OnValuesLabeling())); + + createAction( VISU_VALUES_LABELING_PARAMS, tr("VISU_VALUES_LABELING_PARAMS"), QIcon(), + tr("VISU_VALUES_LABELING_PARAMS"), "", 0, aParent, false, + this, SLOT(OnValuesLabelingParams())); + } void @@ -2765,6 +2775,12 @@ VisuGUI // delete mgr->insert( action( VISU_CLEAR_CONTAINER ), -1, -1, -1 ); + + // labeling + mgr->insert( separator(), -1, -1, -1 ); + mgr->insert( action( VISU_VALUES_LABELING ), -1, -1, -1 ); + mgr->insert( action( VISU_VALUES_LABELING_PARAMS ), -1, -1, -1 ); + mgr->insert( separator(), -1, -1, -1 ); // table commands mgr->insert( action( VISU_SHOW_TABLE ), -1, -1, -1 ); // show table @@ -2893,6 +2909,13 @@ VisuGUI aRule = "selcount=1 and $type in { " + aSimplePrsAll + "}"; mgr->setRule( action( VISU_FILTERSCALARS ), aRule ); + + // labeling + + aRule = "hasActor=1 and selcount=1 and $type in { 'VISU::TGAUSSPOINTS'" + aPrsAll + " }"; + mgr->setRule( action( VISU_VALUES_LABELING ), aRule, QtxPopupMgr::VisibleRule ); + mgr->setRule( action( VISU_VALUES_LABELING ), "{true} in $isValuesLabeled", QtxPopupMgr::ToggleRule ); + mgr->setRule( action( VISU_VALUES_LABELING_PARAMS ), aRule, QtxPopupMgr::VisibleRule ); // view parameters aRule = "selcount=1 and type='VISU::TVIEW3D' and activeView='VTKViewer'"; @@ -2907,7 +2930,8 @@ VisuGUI QString aPrsType = " and $type in {'VISU::TMESH' 'VISU::TGAUSSPOINTS' " + aPrsAll + "}"; QString aPrsType2 = " and $type in {'VISU::TMESH' 'VISU::TPOINTMAP3D'" + aPrsAll + "}"; QString anInsideType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TDEFORMEDSHAPE' 'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TDEFORMEDSHAPEANDSCALARMAP'}"; - QString aSurfFrameType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP''VISU::TDEFORMEDSHAPE' 'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TDEFORMEDSHAPEANDSCALARMAP'}"; + //QString aSurfFrameType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP''VISU::TDEFORMEDSHAPE' 'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TDEFORMEDSHAPEANDSCALARMAP'}"; + QString aSurfFrameType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP''VISU::TDEFORMEDSHAPE' 'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TDEFORMEDSHAPEANDSCALARMAP' 'VISU::TCUTPLANES' 'VISU::TISOSURFACES' 'VISU::TPLOT3D' }"; //QString aPrsType = " and $type in {'VISU::TMESH' " + aPrsAll + "}"; QString aSurfType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TSCALARMAP' 'VISU::TISOSURFACES' 'VISU::TDEFORMEDSHAPE' 'VISU::TCUTPLANES' " " 'VISU::TPLOT3D' 'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TDEFORMEDSHAPEANDSCALARMAP' 'VISU::TPOINTMAP3D'}"; @@ -3401,23 +3425,11 @@ void VisuGUI::createPreferences() int fontGr = addPreference( tr( "VISU_FONT" ), sbarTab ); setPreferenceProperty( fontGr, "columns", 2 ); - int tfont = addPreference( tr( "VISU_TITLE" ), fontGr, LightApp_Preferences::Font, "VISU", "scalar_bar_title_font" ); + addVtkFontPref( tr( "VISU_TITLE" ), fontGr, "scalar_bar_title_font", false ); addPreference( tr( "VISU_TITLE" ), fontGr, LightApp_Preferences::Color, "VISU", "scalar_bar_title_color" ); - int lfont = addPreference( tr( "VISU_LABELS" ), fontGr, LightApp_Preferences::Font, "VISU", "scalar_bar_label_font" ); - addPreference( tr( "VISU_LABELS" ), fontGr, LightApp_Preferences::Color, "VISU", "scalar_bar_label_color" ); - QStringList fam; - fam.append( tr( "VISU_FONT_ARIAL" ) ); - fam.append( tr( "VISU_FONT_COURIER" ) ); - fam.append( tr( "VISU_FONT_TIMES" ) ); - int wflag = ( QtxFontEdit::All & ( ~( QtxFontEdit::Size | QtxFontEdit::UserSize ) ) ); - - setPreferenceProperty( tfont, "families", fam ); - setPreferenceProperty( tfont, "system", false ); - setPreferenceProperty( tfont, "widget_flags", wflag ); - setPreferenceProperty( lfont, "families", fam ); - setPreferenceProperty( lfont, "system", false ); - setPreferenceProperty( lfont, "widget_flags", wflag ); + addVtkFontPref( tr( "VISU_LABELS" ), fontGr, "scalar_bar_label_font", false ); + addPreference( tr( "VISU_LABELS" ), fontGr, LightApp_Preferences::Color, "VISU", "scalar_bar_label_color" ); // group: "Colors & Labels" int colorsLabelsGr = addPreference( tr( "VISU_COLORS_AND_LABELS" ), sbarTab ); @@ -3436,9 +3448,12 @@ void VisuGUI::createPreferences() setPreferenceProperty( numlab, "min", 2 ); setPreferenceProperty( numlab, "max", 65 ); - addPreference( tr( "VISU_LABELS_FORMAT" ), colorsLabelsGr, - LightApp_Preferences::String, "VISU", "scalar_bar_label_format" ); + int lPrec = addPreference( tr( "PRECISION" ), colorsLabelsGr, + LightApp_Preferences::IntSpin, "VISU", "scalar_bar_label_precision" ); + setPreferenceProperty( lPrec, "min", 1 ); + setPreferenceProperty( lPrec, "max", 100 ); + int frame = addPreference( "", sbarTab, LightApp_Preferences::Frame, "", "" ); setPreferenceProperty( frame, "orientation", "horizontal" ); @@ -3478,16 +3493,12 @@ void VisuGUI::createPreferences() int hv = addPreference( tr( "VISU_HEIGHT" ), posVSizeGr, LightApp_Preferences::DblSpin, "VISU", "scalar_bar_vertical_height" ); - int twv = addPreference( tr( "VISU_TITLE_WIDTH" ), posVSizeGr, - LightApp_Preferences::IntSpin, "VISU", "scalar_bar_vertical_title_width" ); - int thv = addPreference( tr( "VISU_TITLE_HEIGHT" ), posVSizeGr, - LightApp_Preferences::IntSpin, "VISU", "scalar_bar_vertical_title_height" ); - - int lwv = addPreference( tr( "VISU_LABEL_WIDTH" ), posVSizeGr, - LightApp_Preferences::IntSpin, "VISU", "scalar_bar_vertical_label_width" ); - int lhv = addPreference( tr( "VISU_LABEL_HEIGHT" ), posVSizeGr, - LightApp_Preferences::IntSpin, "VISU", "scalar_bar_vertical_label_height" ); - + int twv = addPreference( tr( "VISU_TITLE_SIZE" ), posVSizeGr, + LightApp_Preferences::IntSpin, "VISU", "scalar_bar_vertical_title_size" ); + + int lwv = addPreference( tr( "VISU_LABEL_SIZE" ), posVSizeGr, + LightApp_Preferences::IntSpin, "VISU", "scalar_bar_vertical_label_size" ); + int bwv = addPreference( tr( "VISU_BAR_WIDTH" ), posVSizeGr, LightApp_Preferences::IntSpin, "VISU", "scalar_bar_vertical_bar_width" ); int bhv = addPreference( tr( "VISU_BAR_HEIGHT" ), posVSizeGr, @@ -3503,12 +3514,8 @@ void VisuGUI::createPreferences() setPreferenceProperty( hv, "min", 0.0 ); setPreferenceProperty( twv, "min", 0 ); setPreferenceProperty( twv, "special", "auto" ); - setPreferenceProperty( thv, "min", 0 ); - setPreferenceProperty( thv, "special", "auto" ); setPreferenceProperty( lwv, "min", 0 ); setPreferenceProperty( lwv, "special", "auto" ); - setPreferenceProperty( lhv, "min", 0 ); - setPreferenceProperty( lhv, "special", "auto" ); setPreferenceProperty( bwv, "min", 0 ); setPreferenceProperty( bwv, "special", "auto" ); setPreferenceProperty( bhv, "min", 0 ); @@ -3518,9 +3525,7 @@ void VisuGUI::createPreferences() setPreferenceProperty( wv, "max", 1.0 ); setPreferenceProperty( hv, "max", 1.0 ); setPreferenceProperty( twv, "max", 100 ); - setPreferenceProperty( thv, "max", 100 ); setPreferenceProperty( lwv, "max", 100 ); - setPreferenceProperty( lhv, "max", 100 ); setPreferenceProperty( bwv, "max", 100 ); setPreferenceProperty( bhv, "max", 100 ); @@ -3539,19 +3544,15 @@ void VisuGUI::createPreferences() int hh = addPreference( tr( "VISU_HEIGHT" ), posHSizeGr, LightApp_Preferences::DblSpin, "VISU", "scalar_bar_horizontal_height" ); - int twh = addPreference( tr( "Title width (%)" ), posHSizeGr, - LightApp_Preferences::IntSpin, "VISU", "scalar_bar_horizontal_title_width" ); - int thh = addPreference( tr( "Title height (%)" ), posHSizeGr, - LightApp_Preferences::IntSpin, "VISU", "scalar_bar_horizontal_title_height" ); - - int lwh = addPreference( tr( "Label width (%)" ), posHSizeGr, - LightApp_Preferences::IntSpin, "VISU", "scalar_bar_horizontal_label_width" ); - int lhh = addPreference( tr( "Label height (%)" ), posHSizeGr, - LightApp_Preferences::IntSpin, "VISU", "scalar_bar_horizontal_label_height" ); - - int bwh = addPreference( tr( "Bar width (%)" ), posHSizeGr, + int twh = addPreference( tr( "VISU_TITLE_SIZE" ), posHSizeGr, + LightApp_Preferences::IntSpin, "VISU", "scalar_bar_horizontal_title_size" ); + + int lwh = addPreference( tr( "VISU_LABEL_SIZE" ), posHSizeGr, + LightApp_Preferences::IntSpin, "VISU", "scalar_bar_horizontal_label_size" ); + + int bwh = addPreference( tr( "VISU_BAR_WIDTH" ), posHSizeGr, LightApp_Preferences::IntSpin, "VISU", "scalar_bar_horizontal_bar_width" ); - int bhh = addPreference( tr( "Bar height (%)" ), posHSizeGr, + int bhh = addPreference( tr( "VISU_BAR_HEIGHT" ), posHSizeGr, LightApp_Preferences::IntSpin, "VISU", "scalar_bar_horizontal_bar_height" ); setPreferenceProperty( xh, "step", 0.1 ); @@ -3564,12 +3565,8 @@ void VisuGUI::createPreferences() setPreferenceProperty( hh, "min", 0.0 ); setPreferenceProperty( twh, "min", 0 ); setPreferenceProperty( twh, "special", "auto" ); - setPreferenceProperty( thh, "min", 0 ); - setPreferenceProperty( thh, "special", "auto" ); setPreferenceProperty( lwh, "min", 0 ); setPreferenceProperty( lwh, "special", "auto" ); - setPreferenceProperty( lhh, "min", 0 ); - setPreferenceProperty( lhh, "special", "auto" ); setPreferenceProperty( bwh, "min", 0 ); setPreferenceProperty( bwh, "special", "auto" ); setPreferenceProperty( bhh, "min", 0 ); @@ -3579,9 +3576,7 @@ void VisuGUI::createPreferences() setPreferenceProperty( wh, "max", 1.0 ); setPreferenceProperty( hh, "max", 1.0 ); setPreferenceProperty( twh, "max", 100 ); - setPreferenceProperty( thh, "max", 100 ); setPreferenceProperty( lwh, "max", 100 ); - setPreferenceProperty( lhh, "max", 100 ); setPreferenceProperty( bwh, "max", 100 ); setPreferenceProperty( bhh, "max", 100 ); @@ -3817,6 +3812,22 @@ void VisuGUI::createPreferences() addPreference( tr( "VISU_SHOW_MANIFOLD_EDGES" ), featureEdgesGr, LightApp_Preferences::Bool, "VISU", "show_manifold_edges" ); addPreference( tr( "VISU_SHOW_NON_MANIFOLD_EDGES" ), featureEdgesGr, LightApp_Preferences::Bool, "VISU", "show_non_manifold_edges" ); //addPreference( tr( "VISU_FEATURE_EDGES_COLORING" ), featureEdgesGr, LightApp_Preferences::Bool, "VISU", "feature_edges_coloring" ); + + // TAB: "Values labels" + + int valLblTab = addPreference( tr( "VALUES_LABELING" ) ); + + // "Font" group + int valLblFontGr = addPreference( tr( "VISU_FONT" ), valLblTab ); + setPreferenceProperty( valLblFontGr, "columns", 2 ); + + // font + addVtkFontPref( tr( "LABELS" ), valLblFontGr, "values_labeling_font", true ); + + // color + addPreference( tr( "COLOR" ), valLblFontGr, + LightApp_Preferences::Color, "VISU", "values_labeling_color" ); + } void VisuGUI::preferencesChanged( const QString& a, const QString& b) @@ -3828,8 +3839,8 @@ void VisuGUI::preferencesChanged( const QString& a, const QString& b) float aTol = 1.00000009999999; QString aWarning; if(b == QString("scalar_bar_vertical_x") || b == QString("scalar_bar_vertical_width")){ - sbX1 = aResourceMgr->doubleValue("VISU", "scalar_bar_vertical_x", sbX1); - sbW = aResourceMgr->doubleValue("VISU", "scalar_bar_vertical_width", sbW); + sbX1 = aResourceMgr->doubleValue("VISU", "scalar_bar_vertical_x", 0.01); + sbW = aResourceMgr->doubleValue("VISU", "scalar_bar_vertical_width", 0.05); if(sbX1+sbW > aTol){ aWarning = "Origin and Size Vertical: X+Width > 1\n"; sbX1=0.01; @@ -3839,8 +3850,8 @@ void VisuGUI::preferencesChanged( const QString& a, const QString& b) } } else if(b == QString("scalar_bar_vertical_y") || b == QString("scalar_bar_vertical_height")){ - sbY1 = aResourceMgr->doubleValue("VISU", "scalar_bar_vertical_y", sbY1); - sbH = aResourceMgr->doubleValue("VISU", "scalar_bar_vertical_height",sbH); + sbY1 = aResourceMgr->doubleValue("VISU", "scalar_bar_vertical_y", 0.01); + sbH = aResourceMgr->doubleValue("VISU", "scalar_bar_vertical_height",0.5); if(sbY1+sbH > aTol){ aWarning = "Origin and Size Vertical: Y+Height > 1\n"; sbY1=0.01; @@ -3850,8 +3861,8 @@ void VisuGUI::preferencesChanged( const QString& a, const QString& b) } } else if(b == QString("scalar_bar_horizontal_x") || b == QString("scalar_bar_horizontal_width")){ - sbX1 = aResourceMgr->doubleValue("VISU", "scalar_bar_horizontal_x", sbX1); - sbW = aResourceMgr->doubleValue("VISU", "scalar_bar_horizontal_width", sbW); + sbX1 = aResourceMgr->doubleValue("VISU", "scalar_bar_horizontal_x", 0.2); + sbW = aResourceMgr->doubleValue("VISU", "scalar_bar_horizontal_width", 0.6); if(sbX1+sbW > aTol){ aWarning = "Origin and Size Horizontal: X+Width > 1\n"; sbX1=0.2; @@ -3861,8 +3872,8 @@ void VisuGUI::preferencesChanged( const QString& a, const QString& b) } } else if(b == QString("scalar_bar_horizontal_y") || b == QString("scalar_bar_horizontal_height")){ - sbY1 = aResourceMgr->doubleValue("VISU", "scalar_bar_horizontal_y", sbY1); - sbH = aResourceMgr->doubleValue("VISU", "scalar_bar_horizontal_height",sbH); + sbY1 = aResourceMgr->doubleValue("VISU", "scalar_bar_horizontal_y", 0.01); + sbH = aResourceMgr->doubleValue("VISU", "scalar_bar_horizontal_height",0.12); if(sbY1+sbH > aTol){ aWarning = "Origin and Size Horizontal: Y+Height > 1\n"; sbY1=0.01; @@ -3870,17 +3881,8 @@ void VisuGUI::preferencesChanged( const QString& a, const QString& b) aResourceMgr->setValue("VISU", "scalar_bar_horizontal_y", sbY1); aResourceMgr->setValue("VISU", "scalar_bar_horizontal_height",sbH); } - } else if(b == QString("scalar_bar_label_format")) { - QString dVal; - dVal.sprintf(aResourceMgr->stringValue("VISU", "scalar_bar_label_format",dVal).toLatin1().data(), 1.1); - if(dVal.toDouble() == 0.) { - aWarning = "Label format is incorrect "; - aWarning += dVal; - aWarning += "\n"; - dVal="%-#6.3g"; - aResourceMgr->setValue("VISU", "scalar_bar_label_format", dVal); - } - } + } + if ( !aWarning.isEmpty() ){ aWarning += "The default values are applied instead."; SUIT_MessageBox::warning(GetDesktop(this), @@ -4169,3 +4171,87 @@ void VisuGUI::OnFilterScalars() VisuGUI_FilterScalarsDlg* aDlg = new VisuGUI_FilterScalarsDlg( this ); aDlg->show(); } + +/*! + \brief SLOT called when "Labeling" popup menu item of presentation is clicked + activates/deactivates labeling of results of the screen. This functionality works + to numbering in SMESH module but is intended for showing results on the screen + instead of elements numbers + \sa OnValuesLabelingParams() +*/ +void VisuGUI::OnValuesLabeling() +{ + // to do: rewrite for several actors if necessary + + VISU::TSelectionInfo aSelectionInfo = VISU::GetSelectedObjects( this ); + if ( aSelectionInfo.empty() ) + return; + + TSelectionItem aSelectionItem = GetSelectedObjects(this).front(); + VISU::Prs3d_i* aPrs3d = GetPrs3dFromBase(aSelectionItem.myObjectInfo.myBase); + if(!aPrs3d) + return; + + SVTK_ViewWindow* aViewWindow = GetActiveViewWindow(this); + if(!aViewWindow) + return; + + VISU_Actor* anActor = FindActor(aViewWindow, aPrs3d); + if(!anActor) + return; + + if( VISU_ScalarMapAct* aScalarMapActor = dynamic_cast(anActor) ) + { + aScalarMapActor->SetValuesLabeled( !aScalarMapActor->GetValuesLabeled() ); + aViewWindow->Repaint(); + } + else if( VISU_GaussPtsAct* aGaussPtsAct = dynamic_cast(anActor) ) + { + aGaussPtsAct->SetValuesLabeled( !aGaussPtsAct->GetValuesLabeled() ); + aViewWindow->Repaint(); + } +} + +/*! + \brief SLOT called when "Labeling parameters" popup menu item of presentation + is clicked launch dialog box for changing parameters of labeling + \sa OnValuesLabeling() +*/ +void VisuGUI::OnValuesLabelingParams() +{ + Handle(SALOME_InteractiveObject) anIO; + if ( VISU::Prs3d_i* aPrs3d = GetPrsToModify( this, anIO ) ) + EditPrs3d(this, anIO, aPrs3d); +} +/*! + \brief Adds preferences for dfont of VTK viewer + \param label label + \param pIf group identifier + \param param parameter + \return identifier of preferences +*/ +int VisuGUI::addVtkFontPref( + const QString& label, + const int pId, + const QString& param, + const bool useSize ) +{ + int tfont = addPreference( label, pId, LightApp_Preferences::Font, "VISU", param ); + + setPreferenceProperty( tfont, "mode", QtxFontEdit::Custom ); + + QStringList fam; + fam.append( tr( "VISU_FONT_ARIAL" ) ); + fam.append( tr( "VISU_FONT_COURIER" ) ); + fam.append( tr( "VISU_FONT_TIMES" ) ); + + setPreferenceProperty( tfont, "fonts", fam ); + + int f = QtxFontEdit::Family | QtxFontEdit::Bold | QtxFontEdit::Italic | QtxFontEdit::Shadow; + if ( useSize ) + f |= QtxFontEdit::UserSize | QtxFontEdit::Size; + + setPreferenceProperty( tfont, "features", f ); + + return tfont; +} diff --git a/src/VISUGUI/VisuGUI.h b/src/VISUGUI/VisuGUI.h index b4413f63..444ec045 100644 --- a/src/VISUGUI/VisuGUI.h +++ b/src/VISUGUI/VisuGUI.h @@ -23,8 +23,7 @@ // File : VisuGUI.h // Author : Laurent CORNABE & Hubert ROLLAND // Module : VISU -// $Header$ -// + #ifndef VisuGUI_HeaderFile #define VisuGUI_HeaderFile @@ -184,6 +183,9 @@ protected slots: void OnManageCache(); void OnFilterScalars(); + + void OnValuesLabeling(); + void OnValuesLabelingParams(); // MULTIPR void OnMultiprViewFullRes(); @@ -207,6 +209,7 @@ private: void createPopupMenus(); void createPanels(); void activateAppropriateViewer( Handle(SALOME_InteractiveObject) theIO ); + int addVtkFontPref( const QString& label, const int pId, const QString& param, const bool useSize ); private: QMap< PanelId, VisuGUI_Panel* > myPanels; diff --git a/src/VISUGUI/VisuGUI_ActionsDef.h b/src/VISUGUI/VisuGUI_ActionsDef.h index 458703c4..05b17c0f 100644 --- a/src/VISUGUI/VisuGUI_ActionsDef.h +++ b/src/VISUGUI/VisuGUI_ActionsDef.h @@ -143,4 +143,8 @@ #define VISU_SWEEP_PANEL 4300 #define VISU_FILTERSCALARS 4301 +#define VISU_VALUES_LABELING 4302 +#define VISU_VALUES_LABELING_PARAMS 4303 + + #endif diff --git a/src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.cxx b/src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.cxx index ff349777..b7acd57f 100644 --- a/src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.cxx +++ b/src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.cxx @@ -427,6 +427,7 @@ void VisuGUI_DeformedShapeAndScalarMapDlg::AddAllFieldNames(){ void VisuGUI_DeformedShapeAndScalarMapDlg::AddAllTimes(const QString& theFieldName){ TEntity2Fields::const_iterator anIter = myEntity2Fields.begin(); + int currentTimeStampId = (myTimeStampsCombo->count() > 0) ? myTimeStampsCombo->currentIndex() : 0; for(; anIter != myEntity2Fields.end(); anIter++){ const TFieldName2TimeStamps& aFieldName2TimeStamps = anIter->second; TFieldName2TimeStamps::const_iterator aFieldIter = aFieldName2TimeStamps.begin(); @@ -447,6 +448,9 @@ void VisuGUI_DeformedShapeAndScalarMapDlg::AddAllTimes(const QString& theFieldNa QString aTimeStampTime = aTimeStampIter->second; myTimeStampsCombo->addItem(aTimeStampTime); } + if(currentTimeStampId >= myTimeStampID.size()) + currentTimeStampId = myTimeStampID.size()-1; + myTimeStampsCombo->setCurrentIndex(currentTimeStampId); return; } } diff --git a/src/VISUGUI/VisuGUI_GaussPointsDlg.cxx b/src/VISUGUI/VisuGUI_GaussPointsDlg.cxx index 8c12f0bd..566a9852 100644 --- a/src/VISUGUI/VisuGUI_GaussPointsDlg.cxx +++ b/src/VISUGUI/VisuGUI_GaussPointsDlg.cxx @@ -33,6 +33,7 @@ #include "VISU_ColoredPrs3dFactory.hh" #include "VISU_GaussPoints_i.hh" +#include "VISU_Prs3dUtils.hh" #include "VISU_GaussPointsPL.hxx" #include "VISU_OpenGLPointSpriteMapper.hxx" #include "VISU_Convertor.hxx" @@ -78,10 +79,10 @@ using namespace std; VisuGUI_GaussScalarBarPane::VisuGUI_GaussScalarBarPane (QWidget * parent): QWidget(parent) { - myVerX = 0.01; myVerY = 0.10; myVerW = 0.10; myVerH = 0.80; - myHorX = 0.20; myHorY = 0.01; myHorW = 0.60; myHorH = 0.12; - myVerTW = myVerTH = myVerLW = myVerLH = myVerBW = myVerBH = 0; - myHorTW = myHorTH = myHorLW = myHorLH = myHorBW = myHorBH = 0; + myVerX = 0.01; myVerY = 0.10; myVerW = 0.08; myVerH = 0.80; + myHorX = 0.10; myHorY = 0.01; myHorW = 0.80; myHorH = 0.08; + myVerTS = myVerLS = myVerBW = myVerBH = 0; + myHorTS = myHorLS = myHorBW = myHorBH = 0; Imin = 0.0; Imax = 0.0; myRangeMode = -1; @@ -475,22 +476,18 @@ void VisuGUI_GaussScalarBarPane::initFromPrsObject(VISU::GaussPoints_i* thePrs, thePrs->GetBarOrientation()); if(RBvert->isChecked()) { - myVerTW = thePrs->GetTitleWidth(); - myVerTH = thePrs->GetTitleHeight(); - myVerLW = thePrs->GetLabelWidth(); - myVerLH = thePrs->GetLabelHeight(); + myVerTS = thePrs->GetTitleSize(); + myVerLS = thePrs->GetLabelSize(); myVerBW = thePrs->GetBarWidth(); myVerBH = thePrs->GetBarHeight(); } else { - myHorTW = thePrs->GetTitleWidth(); - myHorTH = thePrs->GetTitleHeight(); - myHorLW = thePrs->GetLabelWidth(); - myHorLH = thePrs->GetLabelHeight(); + myHorTS = thePrs->GetTitleSize(); + myHorLS = thePrs->GetLabelSize(); myHorBW = thePrs->GetBarWidth(); myHorBH = thePrs->GetBarHeight(); } - myBarDlg->setLabelsFormat(thePrs->GetLabelsFormat()); + myBarDlg->setLabelsPrecision( VISU::ToPrecision( thePrs->GetLabelsFormat() ) ); myBarDlg->setUnitsVisible(thePrs->IsUnitsVisible()); SpacingSpin->setValue(thePrs->GetSpacing()); @@ -553,7 +550,8 @@ void VisuGUI_GaussScalarBarPane::initFromPrsObject(VISU::GaussPoints_i* thePrs, vtkFloatingPointType R, G, B; thePrs->GetTitleColor(R, G, B); - myBarDlg->setLabelsFormat(thePrs->GetLabelsFormat()); + int lp = VISU::ToPrecision( thePrs->GetLabelsFormat() ); + myBarDlg->setLabelsPrecision( lp ); myBarDlg->setUnitsVisible(thePrs->IsUnitsVisible()); myTextDlg->myTitleFont->SetData(QColor((int)(R*255.), (int)(G*255.), (int)(B*255.)), @@ -596,12 +594,13 @@ int VisuGUI_GaussScalarBarPane::storeToPrsObject(VISU::GaussPoints_i* thePrs) { thePrs->SetLabels(LabelSpin->value()); if(RBvert->isChecked()) { - thePrs->SetRatios(myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH); + thePrs->SetRatios(myVerTS, myVerLS, myVerBW, myVerBH); } else { - thePrs->SetRatios(myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH); + thePrs->SetRatios(myHorTS, myHorLS, myHorBW, myHorBH); } - thePrs->SetLabelsFormat(myBarDlg->getLabelsFormat().toLatin1().data()); + std::string f = VISU::ToFormat( myBarDlg->getLabelsPrecision() ); + thePrs->SetLabelsFormat( f.c_str() ); thePrs->SetUnitsVisible(myBarDlg->isUnitsVisible()); if (myIsStoreTextProp) { @@ -757,14 +756,14 @@ void VisuGUI_GaussScalarBarPane::onTextPref() void VisuGUI_GaussScalarBarPane::onBarPref() { if(RBvert->isChecked()) - myBarDlg->setRatios(myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH); + myBarDlg->setRatios(myVerTS, myVerLS, myVerBW, myVerBH); else - myBarDlg->setRatios(myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH); + myBarDlg->setRatios(myHorTS, myHorLS, myHorBW, myHorBH); if(myBarDlg->exec()) { if(RBvert->isChecked()) - myBarDlg->getRatios(myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH); + myBarDlg->getRatios(myVerTS, myVerLS, myVerBW, myVerBH); else - myBarDlg->getRatios(myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH); + myBarDlg->getRatios(myHorTS, myHorLS, myHorBW, myHorBH); } } diff --git a/src/VISUGUI/VisuGUI_GaussPointsDlg.h b/src/VISUGUI/VisuGUI_GaussPointsDlg.h index 71e232e0..6b0121d6 100644 --- a/src/VISUGUI/VisuGUI_GaussPointsDlg.h +++ b/src/VISUGUI/VisuGUI_GaussPointsDlg.h @@ -100,8 +100,8 @@ class VisuGUI_GaussScalarBarPane : public QWidget//QVBox double Imin, Imax; double myHorX, myHorY, myHorW, myHorH; double myVerX, myVerY, myVerW, myVerH; - int myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH; - int myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH; + int myHorTS, myHorLS, myHorBW, myHorBH; + int myVerTS, myVerLS, myVerBW, myVerBH; int myRangeMode; bool myIsStoreTextProp; diff --git a/src/VISUGUI/VisuGUI_Prs3dDlg.cxx b/src/VISUGUI/VisuGUI_Prs3dDlg.cxx index 45c33b93..faae8fbe 100644 --- a/src/VISUGUI/VisuGUI_Prs3dDlg.cxx +++ b/src/VISUGUI/VisuGUI_Prs3dDlg.cxx @@ -41,6 +41,7 @@ #include "VISU_ScalarMapAct.h" #include "VISU_ScalarMap_i.hh" #include "VISU_Result_i.hh" +#include "VISU_Prs3dUtils.hh" #include "LightApp_Application.h" @@ -86,9 +87,9 @@ VisuGUI_TextPrefDlg::VisuGUI_TextPrefDlg (QWidget* parent) setWindowTitle(tr("TIT_TEXT_PREF")); setSizeGripEnabled(TRUE); - QVBoxLayout* TopLayout = new QVBoxLayout(this); - TopLayout->setSpacing(6); - TopLayout->setMargin(11); + QVBoxLayout* aMainLay = new QVBoxLayout(this); + aMainLay->setSpacing(6); + aMainLay->setMargin(11); // "Title" grp QGroupBox* aTitleGrp = new QGroupBox ( tr("LBL_TITLE"), this); @@ -108,7 +109,7 @@ VisuGUI_TextPrefDlg::VisuGUI_TextPrefDlg (QWidget* parent) myTitleFont = new SVTK_FontWidget (aHBox); aHBLay->addWidget( myTitleFont ); - TopLayout->addWidget(aTitleGrp); + aMainLay->addWidget(aTitleGrp); // "Labels" grp QGroupBox* aLabelsGrp = new QGroupBox (tr("LBL_LABELS"), this); @@ -124,7 +125,7 @@ VisuGUI_TextPrefDlg::VisuGUI_TextPrefDlg (QWidget* parent) myLabelFont = new SVTK_FontWidget (aHBox); aHBLay->addWidget( myLabelFont ); - TopLayout->addWidget(aLabelsGrp); + aMainLay->addWidget(aLabelsGrp); // Common buttons =========================================================== QGroupBox* GroupButtons = new QGroupBox( this ); @@ -150,7 +151,7 @@ VisuGUI_TextPrefDlg::VisuGUI_TextPrefDlg (QWidget* parent) buttonHelp->setAutoDefault( TRUE ); GroupButtonsLayout->addWidget( buttonHelp, 0, 3 ); - TopLayout->addWidget( GroupButtons ); + aMainLay->addWidget( GroupButtons ); connect(buttonOk, SIGNAL(clicked()), this, SLOT(accept())); connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject())); @@ -259,7 +260,8 @@ void VisuGUI_TextPrefDlg::keyPressEvent( QKeyEvent* e ) Constructor */ VisuGUI_BarPrefDlg::VisuGUI_BarPrefDlg( QWidget* parent ) - : QDialog( parent ) + : QDialog( parent ), + myOrientation( 1 ) { setModal( true ); setWindowTitle( tr( "TIT_BAR_PREF" ) ); @@ -267,109 +269,79 @@ VisuGUI_BarPrefDlg::VisuGUI_BarPrefDlg( QWidget* parent ) QString propertyName = QString( "scalar_bar_vertical_" ); - myTitleWidth = myTitleHeight = myLabelWidth = myLabelHeight = myBarWidth = myBarHeight = 0; + myTitleSize = myLabelSize = myBarWidth = myBarHeight = 0; myUnits = true; - myUnitsFormat = "%-#6.3g"; + myPrecision = 3; - QVBoxLayout* TopLayout = new QVBoxLayout( this ); - TopLayout->setSpacing( 6 ); - TopLayout->setMargin( 11 ); + QVBoxLayout* aMainLay = new QVBoxLayout( this ); + aMainLay->setSpacing( 5 ); + aMainLay->setMargin( 5 ); + + // dimensions + + QGroupBox* aDimGrp = new QGroupBox( this ); + QGridLayout* aDimGrpLay = new QGridLayout( aDimGrp ); + aDimGrpLay->setSpacing( 5 ); + aDimGrpLay->setMargin( 5 ); + + myTitleSizeSpin = new QSpinBox( aDimGrp ); + myTitleSizeSpin->setRange( 0, 100 ); + myTitleSizeSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myTitleSizeSpin->setMinimumWidth( 70 ); + myTitleSizeSpin->setValue( 0 ); + myTitleSizeSpin->setSpecialValueText( tr( "AUTO" ) ); + QLabel* aTitleSizeLbl = new QLabel( tr( "LBL_TITLE_W" ), aDimGrp ); + + myLabelSizeSpin = new QSpinBox( aDimGrp ); + myLabelSizeSpin->setRange( 0, 100 ); + myLabelSizeSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myLabelSizeSpin->setMinimumWidth( 70 ); + myLabelSizeSpin->setValue( 0 ); + myLabelSizeSpin->setSpecialValueText( tr( "AUTO" ) ); + QLabel* aLabelSizeLbl = new QLabel( tr( "LBL_LABEL_W" ), aDimGrp ); + + myBarWidthSpin = new QSpinBox( aDimGrp ); + myBarWidthSpin->setRange( 0, 100 ); + myBarWidthSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myBarWidthSpin->setMinimumWidth( 70 ); + myBarWidthSpin->setValue( 0 ); + myBarWidthSpin->setSpecialValueText( tr( "AUTO" ) ); + QLabel* aBarWidthLbl = new QLabel( tr( "LBL_BAR_W" ), aDimGrp ); + + myBarHeightSpin = new QSpinBox( aDimGrp ); + myBarHeightSpin->setRange( 0, 100 ); + myBarHeightSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myBarHeightSpin->setMinimumWidth( 70 ); + myBarHeightSpin->setValue( 0 ); + myBarHeightSpin->setSpecialValueText( tr( "AUTO" ) ); + QLabel* aBarHeightLbl = new QLabel( tr( "LBL_BAR_H" ), aDimGrp ); + + // format and units + + QLabel* aPrecLbl = new QLabel( tr( "PRECISION" ), aDimGrp ); + myPrecisionSpin = new QSpinBox( aDimGrp ); + myPrecisionSpin->setRange( 1, 100 ); + + myUnitsChk = new QCheckBox( tr( "LBL_SHOW_UNITS" ), aDimGrp ); + + // layout + + aDimGrpLay->addWidget( aTitleSizeLbl, 0, 0 ); + aDimGrpLay->addWidget( myTitleSizeSpin, 0, 1 ); + aDimGrpLay->addWidget( aLabelSizeLbl, 0, 2 ); + aDimGrpLay->addWidget( myLabelSizeSpin, 0, 3 ); + aDimGrpLay->addWidget( aBarWidthLbl, 1, 0 ); + aDimGrpLay->addWidget( myBarWidthSpin, 1, 1 ); + aDimGrpLay->addWidget( aBarHeightLbl, 1, 2 ); + aDimGrpLay->addWidget( myBarHeightSpin, 1, 3 ); + aDimGrpLay->addWidget( aPrecLbl, 2, 0 ); + aDimGrpLay->addWidget( myPrecisionSpin, 2, 1 ); + aDimGrpLay->addWidget( myUnitsChk, 2, 2, 1, 2 ); - QGroupBox* WidthHeightGroup = new QGroupBox ( this ); - QGridLayout* WidthHeightGroupLayout = new QGridLayout( WidthHeightGroup ); - WidthHeightGroupLayout->setAlignment( Qt::AlignTop ); - WidthHeightGroupLayout->setSpacing( 6 ); - WidthHeightGroupLayout->setMargin( 11 ); - - TitleWidthSpin = new QSpinBox( WidthHeightGroup ); - TitleWidthSpin->setRange( 0, 100 ); - TitleWidthSpin->setSingleStep( 1 ); - TitleWidthSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - TitleWidthSpin->setMinimumWidth( 70 ); - TitleWidthSpin->setValue( 0 ); - TitleWidthSpin->setSpecialValueText( tr( "AUTO" ) ); - QLabel* LabelTitleWidth = new QLabel( tr( "LBL_TITLE_W" ), WidthHeightGroup ); - LabelTitleWidth->setBuddy( TitleWidthSpin ); - - TitleHeightSpin = new QSpinBox( WidthHeightGroup ); - TitleHeightSpin->setRange( 0, 100 ); - TitleHeightSpin->setSingleStep( 1 ); - TitleHeightSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - TitleHeightSpin->setMinimumWidth( 70 ); - TitleHeightSpin->setValue( 0 ); - TitleHeightSpin->setSpecialValueText( tr( "AUTO" ) ); - QLabel* LabelTitleHeight = new QLabel( tr( "LBL_TITLE_H" ), WidthHeightGroup ); - LabelTitleHeight->setBuddy( TitleHeightSpin ); - - CBUnits = new QCheckBox( tr( "LBL_SHOW_UNITS" ), WidthHeightGroup ); - CBUnits->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - - LabelWidthSpin = new QSpinBox( WidthHeightGroup ); - LabelWidthSpin->setRange( 0, 100 ); - LabelWidthSpin->setSingleStep( 1 ); - LabelWidthSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - LabelWidthSpin->setMinimumWidth( 70 ); - LabelWidthSpin->setValue( 0 ); - LabelWidthSpin->setSpecialValueText( tr( "AUTO" ) ); - QLabel* LabelLabelWidth = new QLabel( tr( "LBL_LABEL_W" ), WidthHeightGroup ); - LabelLabelWidth->setBuddy( LabelWidthSpin ); - - LabelHeightSpin = new QSpinBox( WidthHeightGroup ); - LabelHeightSpin->setRange( 0, 100 ); - LabelHeightSpin->setSingleStep( 1 ); - LabelHeightSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - LabelHeightSpin->setMinimumWidth( 70 ); - LabelHeightSpin->setValue( 0 ); - LabelHeightSpin->setSpecialValueText( tr( "AUTO" ) ); - QLabel* LabelLabelHeight = new QLabel( tr( "LBL_LABEL_H" ), WidthHeightGroup ); - LabelLabelHeight->setBuddy( LabelHeightSpin ); - - UnitsEdit = new QLineEdit( WidthHeightGroup ); - UnitsEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - UnitsEdit->setMinimumWidth( 35 ); - UnitsEdit->setText( myUnitsFormat ); - QLabel* UnitsLabel = new QLabel( tr( "LBL_UNITS_FORMAT" ), WidthHeightGroup ); - UnitsLabel->setBuddy( UnitsEdit ); - - BarWidthSpin = new QSpinBox( WidthHeightGroup ); - BarWidthSpin->setRange( 0, 100 ); - BarWidthSpin->setSingleStep( 1 ); - BarWidthSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - BarWidthSpin->setMinimumWidth( 70 ); - BarWidthSpin->setValue( 0 ); - BarWidthSpin->setSpecialValueText( tr( "AUTO" ) ); - QLabel* LabelBarWidth = new QLabel( tr( "LBL_BAR_W" ), WidthHeightGroup ); - LabelBarWidth->setBuddy( BarWidthSpin ); - - BarHeightSpin = new QSpinBox( WidthHeightGroup ); - BarHeightSpin->setRange( 0, 100 ); - BarHeightSpin->setSingleStep( 1 ); - BarHeightSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - BarHeightSpin->setMinimumWidth( 70 ); - BarHeightSpin->setValue( 0 ); - BarHeightSpin->setSpecialValueText( tr( "AUTO" ) ); - QLabel* LabelBarHeight = new QLabel( tr( "LBL_BAR_H" ), WidthHeightGroup ); - LabelBarHeight->setBuddy( BarHeightSpin ); - - WidthHeightGroupLayout->addWidget( LabelTitleWidth, 0, 0 ); - WidthHeightGroupLayout->addWidget( TitleWidthSpin, 0, 1 ); - WidthHeightGroupLayout->addWidget( LabelTitleHeight, 0, 2 ); - WidthHeightGroupLayout->addWidget( TitleHeightSpin, 0, 3 ); - WidthHeightGroupLayout->addWidget( CBUnits, 0, 4, 1, 2 ); - WidthHeightGroupLayout->addWidget( LabelLabelWidth, 1, 0 ); - WidthHeightGroupLayout->addWidget( LabelWidthSpin, 1, 1 ); - WidthHeightGroupLayout->addWidget( LabelLabelHeight, 1, 2 ); - WidthHeightGroupLayout->addWidget( LabelHeightSpin, 1, 3 ); - WidthHeightGroupLayout->addWidget( UnitsLabel, 1, 4 ); - WidthHeightGroupLayout->addWidget( UnitsEdit, 1, 5 ); - WidthHeightGroupLayout->addWidget( LabelBarWidth, 2, 0 ); - WidthHeightGroupLayout->addWidget( BarWidthSpin, 2, 1 ); - WidthHeightGroupLayout->addWidget( LabelBarHeight, 2, 2 ); - WidthHeightGroupLayout->addWidget( BarHeightSpin, 2, 3 ); - - TopLayout->addWidget( WidthHeightGroup ); + aMainLay->addWidget( aDimGrp ); // Common buttons =========================================================== + QGroupBox* GroupButtons = new QGroupBox( this ); QHBoxLayout* GroupButtonsLayout = new QHBoxLayout( GroupButtons ); GroupButtonsLayout->setAlignment( Qt::AlignTop ); @@ -392,63 +364,66 @@ VisuGUI_BarPrefDlg::VisuGUI_BarPrefDlg( QWidget* parent ) GroupButtonsLayout->addWidget( buttonCancel ); GroupButtonsLayout->addWidget( buttonHelp ); - TopLayout->addWidget( GroupButtons ); + aMainLay->addWidget( GroupButtons ); connect( buttonOk, SIGNAL( clicked() ), this, SLOT( accept() ) ); connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); connect( buttonHelp, SIGNAL( clicked() ), this, SLOT( onHelp() ) ); - connect( TitleWidthSpin, SIGNAL( valueChanged( int ) ), this, SIGNAL( updatePreview() ) ); - connect( TitleHeightSpin, SIGNAL( valueChanged( int ) ), this, SIGNAL( updatePreview() ) ); - connect( LabelWidthSpin, SIGNAL( valueChanged( int ) ), this, SIGNAL( updatePreview() ) ); - connect( LabelHeightSpin, SIGNAL( valueChanged( int ) ), this, SIGNAL( updatePreview() ) ); - connect( BarWidthSpin, SIGNAL( valueChanged( int ) ), this, SIGNAL( updatePreview() ) ); - connect( BarHeightSpin, SIGNAL( valueChanged( int ) ), this, SIGNAL( updatePreview() ) ); - connect( CBUnits, SIGNAL( toggled( bool ) ), this, SIGNAL( updatePreview() ) ); - connect( UnitsEdit, SIGNAL( editingFinished() ), this, SIGNAL( updatePreview() ) ); + connect( myTitleSizeSpin, SIGNAL( valueChanged( int ) ), this, SIGNAL( updatePreview() ) ); + connect( myLabelSizeSpin, SIGNAL( valueChanged( int ) ), this, SIGNAL( updatePreview() ) ); + connect( myBarWidthSpin, SIGNAL( valueChanged( int ) ), this, SIGNAL( updatePreview() ) ); + connect( myBarHeightSpin, SIGNAL( valueChanged( int ) ), this, SIGNAL( updatePreview() ) ); + connect( myUnitsChk, SIGNAL( toggled( bool ) ), this, SIGNAL( updatePreview() ) ); + connect( myPrecisionSpin, SIGNAL( valueChanged( int ) ), this, SIGNAL( updatePreview() ) ); } //---------------------------------------------------------------------------- -void VisuGUI_BarPrefDlg::setRatios( int titleRatioWidth, int titleRatioHeight, - int labelRatioWidth, int labelRatioHeight, - int barRatioWidth, int barRatioHeight ) +void VisuGUI_BarPrefDlg::setRatios( int titleRatioSize, int labelRatioWidth, + int barRatioWidth, int barRatioHeight ) { - TitleWidthSpin->setValue( myTitleWidth = titleRatioWidth ); - TitleHeightSpin->setValue( myTitleHeight = titleRatioHeight ); - LabelWidthSpin->setValue( myLabelWidth = labelRatioWidth ); - LabelHeightSpin->setValue( myLabelHeight = labelRatioHeight ); - BarWidthSpin->setValue( myBarWidth = barRatioWidth ); - BarHeightSpin->setValue( myBarHeight = barRatioHeight ); + myTitleSizeSpin->setValue( myTitleSize = titleRatioSize ); + myLabelSizeSpin->setValue( myLabelSize = labelRatioWidth ); + myBarWidthSpin->setValue( myBarWidth = barRatioWidth ); + myBarHeightSpin->setValue( myBarHeight = barRatioHeight ); } //---------------------------------------------------------------------------- -void VisuGUI_BarPrefDlg::getRatios( int& titleRatioWidth, int& titleRatioHeight, - int& labelRatioWidth, int& labelRatioHeight, - int& barRatioWidth, int& barRatioHeight ) +void VisuGUI_BarPrefDlg::getRatios( int& titleRatioSize, int& labelRatioWidth, + int& barRatioWidth, int& barRatioHeight ) { - titleRatioWidth = TitleWidthSpin->value(); - titleRatioHeight = TitleHeightSpin->value(); - labelRatioWidth = LabelWidthSpin->value(); - labelRatioHeight = LabelHeightSpin->value(); - barRatioWidth = BarWidthSpin->value(); - barRatioHeight = BarHeightSpin->value(); + titleRatioSize = myTitleSizeSpin->value(); + labelRatioWidth = myLabelSizeSpin->value(); + barRatioWidth = myBarWidthSpin->value(); + barRatioHeight = myBarHeightSpin->value(); } //---------------------------------------------------------------------------- -void VisuGUI_BarPrefDlg::setLabelsFormat( const QString& format ) +void VisuGUI_BarPrefDlg::setLabelsPrecision( const int p ) { - UnitsEdit->setText( myUnitsFormat = format ); + myPrecisionSpin->setValue( p ); } +//---------------------------------------------------------------------------- +int VisuGUI_BarPrefDlg::getLabelsPrecision() const +{ + return myPrecisionSpin->value(); +} //---------------------------------------------------------------------------- -QString VisuGUI_BarPrefDlg::getLabelsFormat() +void VisuGUI_BarPrefDlg::setOrientation( const int ori ) { - return UnitsEdit->text(); + myOrientation = ori; } +//---------------------------------------------------------------------------- + +int VisuGUI_BarPrefDlg::getOrientation() const +{ + return myOrientation; +} //---------------------------------------------------------------------------- void VisuGUI_BarPrefDlg::onHelp() @@ -472,14 +447,14 @@ void VisuGUI_BarPrefDlg::onHelp() //---------------------------------------------------------------------------- void VisuGUI_BarPrefDlg::setUnitsVisible(bool isVisible) { - CBUnits->setChecked( myUnits = isVisible ); + myUnitsChk->setChecked( myUnits = isVisible ); } //---------------------------------------------------------------------------- bool VisuGUI_BarPrefDlg::isUnitsVisible() { - return CBUnits->isChecked(); + return myUnitsChk->isChecked(); } @@ -489,14 +464,12 @@ bool VisuGUI_BarPrefDlg::isUnitsVisible() */ void VisuGUI_BarPrefDlg::reject() { - TitleWidthSpin->setValue( myTitleWidth ); - TitleHeightSpin->setValue( myTitleHeight ); - LabelWidthSpin->setValue( myLabelWidth ); - LabelHeightSpin->setValue( myLabelHeight ); - BarWidthSpin->setValue( myBarWidth ); - BarHeightSpin->setValue( myBarHeight ); - CBUnits->setChecked( myUnits ); - UnitsEdit->setText( myUnitsFormat ); + myTitleSizeSpin->setValue( myTitleSize ); + myLabelSizeSpin->setValue( myLabelSize ); + myBarWidthSpin->setValue( myBarWidth ); + myBarHeightSpin->setValue( myBarHeight ); + myUnitsChk->setChecked( myUnits ); + myPrecisionSpin->setValue( myPrecision ); QDialog::reject(); } @@ -508,39 +481,26 @@ void VisuGUI_BarPrefDlg::reject() void VisuGUI_BarPrefDlg::accept() { QString dVal; - dVal.sprintf( UnitsEdit->text().toLatin1().data(), 1.1 ); - if ( dVal.toDouble() == 0. ) { - SUIT_MessageBox::warning( this, tr( "WRN_VISU" ), tr ( "MSG_LABEL_FORMAT" ) ); + int aBWH = myOrientation == 1 ? myBarWidthSpin->value() : myBarHeightSpin->value(); + if( ( myLabelSizeSpin->value()+ aBWH ) > 100 ) + { + SUIT_MessageBox::warning( this, tr( "WRN_VISU" ), tr( "MSG_BIG_SCALE" ) ); + return; } - else { - if( - ( - TitleWidthSpin->value()+ - LabelWidthSpin->value()+ - BarWidthSpin->value() - > 100 - ) || - ( - TitleHeightSpin->value()+ - LabelHeightSpin->value()+ - BarHeightSpin->value() - > 100 - ) - ) { - SUIT_MessageBox::warning( this, tr( "WRN_VISU" ), tr( "MSG_BIG_SCALE" ) ); - } - else { - myTitleWidth = TitleWidthSpin->value(); - myTitleHeight = TitleHeightSpin->value(); - myLabelWidth = LabelWidthSpin->value(); - myLabelHeight = LabelHeightSpin->value(); - myBarWidth = BarWidthSpin->value(); - myBarHeight = BarHeightSpin->value(); - myUnits = CBUnits->isChecked(); - myUnitsFormat = UnitsEdit->text(); - QDialog::accept(); - } + + if ( myTitleSizeSpin->value() > 100 ) + { + SUIT_MessageBox::warning( this, tr( "WRN_VISU" ), tr( "MSG_BIG_SCALE_TLT" ) ); + return; } + + myTitleSize = myTitleSizeSpin->value(); + myLabelSize = myLabelSizeSpin->value(); + myBarWidth = myBarWidthSpin->value(); + myBarHeight = myBarHeightSpin->value(); + myUnits = myUnitsChk->isChecked(); + myPrecision = myPrecisionSpin->value(); + QDialog::accept(); } @@ -582,10 +542,8 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) myVerY = aResourceMgr->doubleValue("VISU", propertyName + "y", 0.); myVerW = aResourceMgr->doubleValue("VISU", propertyName + "width", 0.); myVerH = aResourceMgr->doubleValue("VISU", propertyName + "height",0.); - myVerTW = aResourceMgr->integerValue("VISU", propertyName + "title_width", 0); - myVerTH = aResourceMgr->integerValue("VISU", propertyName + "title_height",0); - myVerLW = aResourceMgr->integerValue("VISU", propertyName + "label_width", 0); - myVerLH = aResourceMgr->integerValue("VISU", propertyName + "label_height",0); + myVerTS = aResourceMgr->integerValue("VISU", propertyName + "title_size", 0); + myVerLS = aResourceMgr->integerValue("VISU", propertyName + "label_size", 0); myVerBW = aResourceMgr->integerValue("VISU", propertyName + "bar_width", 0); myVerBH = aResourceMgr->integerValue("VISU", propertyName + "bar_height",0); @@ -594,27 +552,21 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) myHorY = aResourceMgr->doubleValue("VISU", propertyName + "y", 0.); myHorW = aResourceMgr->doubleValue("VISU", propertyName + "width", 0.); myHorH = aResourceMgr->doubleValue("VISU", propertyName + "height",0.); - myHorTW = aResourceMgr->integerValue("VISU", propertyName + "title_width", 0); - myHorTH = aResourceMgr->integerValue("VISU", propertyName + "title_height",0); - myHorLW = aResourceMgr->integerValue("VISU", propertyName + "label_width", 0); - myHorLH = aResourceMgr->integerValue("VISU", propertyName + "label_height",0); + myHorTS = aResourceMgr->integerValue("VISU", propertyName + "title_size", 0); + myHorLS = aResourceMgr->integerValue("VISU", propertyName + "label_size", 0); myHorBW = aResourceMgr->integerValue("VISU", propertyName + "bar_width", 0); myHorBH = aResourceMgr->integerValue("VISU", propertyName + "bar_height",0); - aMainLayout->setSpacing(6); - //setMargin(11); + //aMainLayout->setSpacing(6); // Range ============================================================ RangeGroup = new QButtonGroup ( this ); QGroupBox* aGB = new QGroupBox( tr("SCALAR_RANGE_GRP"),this ); aMainLayout->addWidget( aGB ); - //RangeGroup->setColumnLayout(0, Qt::Vertical ); - //RangeGroup->layout()->setSpacing( 0 ); - //RangeGroup->layout()->setMargin( 0 ); QGridLayout* RangeGroupLayout = new QGridLayout( aGB ); RangeGroupLayout->setAlignment( Qt::AlignTop ); - RangeGroupLayout->setSpacing( 6 ); - RangeGroupLayout->setMargin( 11 ); + //RangeGroupLayout->setSpacing( 6 ); + //RangeGroupLayout->setMargin( 11 ); myModeLbl = new QLabel("Scalar Mode", aGB); @@ -631,7 +583,7 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) MinEdit = new QLineEdit( aGB ); MinEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - MinEdit->setMinimumWidth( 70 ); + //MinEdit->setMinimumWidth( 70 ); MinEdit->setValidator( new QDoubleValidator(this) ); MinEdit->setText( "0.0" ); QLabel* MinLabel = new QLabel (tr("LBL_MIN"), aGB); @@ -640,7 +592,7 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) MaxEdit = new QLineEdit( aGB ); MaxEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - MaxEdit->setMinimumWidth( 70 ); + //MaxEdit->setMinimumWidth( 70 ); MaxEdit->setValidator( new QDoubleValidator(this) ); MaxEdit->setText( "0.0" ); QLabel* MaxLabel = new QLabel (tr("LBL_MAX"), aGB); @@ -657,18 +609,13 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) RangeGroupLayout->addWidget( MaxLabel, 2, 2 ); RangeGroupLayout->addWidget( MaxEdit, 2, 3 ); - //TopLayout->addWidget( RangeGroup ); - // Colors and Labels ======================================================== QGroupBox* ColLabGroup = new QGroupBox (tr("COLORS_LABELS_GRP"), this); aMainLayout->addWidget( ColLabGroup ); - //ColLabGroup->setColumnLayout(0, Qt::Vertical ); - //ColLabGroup->layout()->setSpacing( 0 ); - //ColLabGroup->layout()->setMargin( 0 ); QGridLayout* ColLabGroupLayout = new QGridLayout( ColLabGroup ); ColLabGroupLayout->setAlignment( Qt::AlignTop ); - ColLabGroupLayout->setSpacing( 6 ); - ColLabGroupLayout->setMargin( 11 ); + //ColLabGroupLayout->setSpacing( 6 ); + //ColLabGroupLayout->setMargin( 11 ); QLabel* ColorLabel = new QLabel (tr("LBL_NB_COLORS"), ColLabGroup); ColorSpin = new QSpinBox( ColLabGroup ); @@ -676,7 +623,7 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) ColorSpin->setMaximum( 256 ); ColorSpin->setSingleStep( 1 ); ColorSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - ColorSpin->setMinimumWidth( 70 ); + //ColorSpin->setMinimumWidth( 70 ); ColorSpin->setValue( 64 ); QLabel* LabelLabel = new QLabel (tr("LBL_NB_LABELS"), ColLabGroup); @@ -686,7 +633,7 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) LabelSpin->setSingleStep( 1 ); LabelSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - LabelSpin->setMinimumWidth( 70 ); + //LabelSpin->setMinimumWidth( 70 ); LabelSpin->setValue( 5 ); ColLabGroupLayout->addWidget( ColorLabel, 0, 0); @@ -694,19 +641,14 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) ColLabGroupLayout->addWidget( LabelLabel, 0, 2); ColLabGroupLayout->addWidget( LabelSpin, 0, 3); - //TopLayout->addWidget( ColLabGroup ); - // Orientation ========================================================== QButtonGroup* OrientGroup = new QButtonGroup ( this ); QGroupBox* OrientGB = new QGroupBox( tr("ORIENTATION_GRP"),this ); aMainLayout->addWidget( OrientGB ); - //OrientGroup->setColumnLayout(0, Qt::Vertical ); - //OrientGroup->layout()->setSpacing( 0 ); - //OrientGroup->layout()->setMargin( 0 ); QGridLayout* OrientGroupLayout = new QGridLayout( OrientGB ); OrientGroupLayout->setAlignment( Qt::AlignTop ); - OrientGroupLayout->setSpacing( 6 ); - OrientGroupLayout->setMargin( 11 ); + //OrientGroupLayout->setSpacing( 6 ); + //OrientGroupLayout->setMargin( 11 ); RBvert = new QRadioButton (tr("VERTICAL_BTN"), OrientGB); RBvert->setChecked( true ); @@ -716,63 +658,53 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) OrientGroupLayout->addWidget( RBvert, 0, 0 ); OrientGroupLayout->addWidget( RBhori, 0, 1 ); - // TopLayout->addWidget( OrientGroup ); - // Origin =============================================================== QGroupBox* OriginGroup = new QGroupBox (tr("ORIGIN_GRP"), this); aMainLayout->addWidget( OriginGroup ); - //OriginGroup->setColumnLayout(0, Qt::Vertical ); - //OriginGroup->layout()->setSpacing( 0 ); - // OriginGroup->layout()->setMargin( 0 ); QGridLayout* OriginGroupLayout = new QGridLayout( OriginGroup ); OriginGroupLayout->setAlignment( Qt::AlignTop ); - OriginGroupLayout->setSpacing( 6 ); - OriginGroupLayout->setMargin( 11 ); + //OriginGroupLayout->setSpacing( 6 ); + //OriginGroupLayout->setMargin( 11 ); QLabel* XLabel = new QLabel (tr("LBL_X"), OriginGroup); XSpin = new QtxDoubleSpinBox( OriginGroup ); VISU::initSpinBox(XSpin, 0.0, +1.0); XSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - XSpin->setMinimumWidth( 70 ); + //XSpin->setMinimumWidth( 70 ); XSpin->setValue( 0.01 ); QLabel* YLabel = new QLabel (tr("LBL_Y"), OriginGroup); YSpin = new QtxDoubleSpinBox( OriginGroup ); VISU::initSpinBox(YSpin, 0.0, +1.0); YSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - YSpin->setMinimumWidth( 70 ); - YSpin->setValue( 0.01 ); + //YSpin->setMinimumWidth( 70 ); + YSpin->setValue( 0.1 ); OriginGroupLayout->addWidget( XLabel, 0, 0); OriginGroupLayout->addWidget( XSpin, 0, 1); OriginGroupLayout->addWidget( YLabel, 0, 2); OriginGroupLayout->addWidget( YSpin, 0, 3); - //TopLayout->addWidget( OriginGroup ); - // Dimensions ========================================================= QGroupBox* DimGroup = new QGroupBox (tr("DIMENSIONS_GRP"), this ); aMainLayout->addWidget( DimGroup ); - //DimGroup->setColumnLayout(0, Qt::Vertical ); - //DimGroup->layout()->setSpacing( 0 ); - //DimGroup->layout()->setMargin( 0 ); QGridLayout* DimGroupLayout = new QGridLayout( DimGroup ); DimGroupLayout->setAlignment( Qt::AlignTop ); - DimGroupLayout->setSpacing( 6 ); - DimGroupLayout->setMargin( 11 ); + //DimGroupLayout->setSpacing( 6 ); + //DimGroupLayout->setMargin( 11 ); QLabel* WidthLabel = new QLabel (tr("LBL_WIDTH"), DimGroup); WidthSpin = new QtxDoubleSpinBox( DimGroup ); VISU::initSpinBox(WidthSpin, 0.0, +1.0); WidthSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - WidthSpin->setMinimumWidth( 70 ); + //WidthSpin->setMinimumWidth( 70 ); WidthSpin->setValue( 0.1 ); QLabel* HeightLabel = new QLabel (tr("LBL_HEIGHT"), DimGroup); HeightSpin = new QtxDoubleSpinBox( DimGroup ); VISU::initSpinBox(HeightSpin, 0.0, +1.0); HeightSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - HeightSpin->setMinimumWidth( 70 ); + //HeightSpin->setMinimumWidth( 70 ); HeightSpin->setValue( 0.8 ); DimGroupLayout->addWidget( WidthLabel, 0, 0); @@ -780,8 +712,6 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) DimGroupLayout->addWidget( HeightLabel, 0, 2); DimGroupLayout->addWidget( HeightSpin, 0, 3); - //TopLayout->addWidget( DimGroup ); - // Save check box =========================================================== QWidget* aSaveBox = new QWidget(this); aMainLayout->addWidget( aSaveBox ); @@ -795,21 +725,24 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) QGroupBox* CheckGroup = new QGroupBox("", this ); aMainLayout->addWidget( CheckGroup ); - QHBoxLayout* CheckGroupLayout = new QHBoxLayout( CheckGroup ); + //QHBoxLayout* CheckGroupLayout = new QHBoxLayout( CheckGroup ); + QGridLayout* CheckGroupLayout = new QGridLayout( CheckGroup ); myPreviewCheck = new QCheckBox(tr("LBL_SHOW_PREVIEW"), CheckGroup); myPreviewCheck->setChecked(false); - //myPreviewCheck->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - CheckGroupLayout->addWidget(myPreviewCheck); + CheckGroupLayout->addWidget(myPreviewCheck, 0, 0); + myHideBar = new QCheckBox(tr("HIDE_SCALAR_BAR"), CheckGroup); + myHideBar->setChecked(false); + CheckGroupLayout->addWidget(myHideBar, 0, 1); + // RKV : Begin CBDistr = new QCheckBox (tr("SHOW_DISTRIBUTION"), CheckGroup); - //CBDistr->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - CheckGroupLayout->addWidget(CBDistr); + CheckGroupLayout->addWidget(CBDistr, 1, 0); // RKV : End if (!thePreview) { CBSave = new QCheckBox (tr("SAVE_DEFAULT_CHK"), CheckGroup); - CheckGroupLayout->addWidget( CBSave ); + CheckGroupLayout->addWidget( CBSave, 1, 1 ); } else { CBSave = 0; @@ -818,16 +751,17 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) } if(RBvert->isChecked()) { - myBarDlg->setRatios(myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH); + myBarDlg->setRatios(myVerTS, myVerLS, myVerBW, myVerBH); } else { - myBarDlg->setRatios(myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH); + myBarDlg->setRatios(myHorTS, myHorLS, myHorBW, myHorBH); } - myBarDlg->setLabelsFormat(aResourceMgr->stringValue("VISU", propertyName + "label_format", "%-#6.3g")); + int lp = aResourceMgr->integerValue( "VISU", propertyName + "scalar_bar_label_precision", 3 ); + myBarDlg->setLabelsPrecision( lp ); + myBarDlg->setUnitsVisible(aResourceMgr->booleanValue("VISU", propertyName + "display_units", true)); // signals and slots connections =========================================== - // connect( RangeGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( changeRange( int ) ) ); connect( RBFrange, SIGNAL( toggled( bool ) ), this, SLOT( onFieldRange( bool ) ) ); connect( RBIrange, SIGNAL( toggled( bool ) ), this, SLOT( onImposedRange( bool ) ) ); @@ -868,13 +802,13 @@ void VisuGUI_ScalarBarPane::storeToResources() { if(orient == 0) { sbX1=0.01; sbY1=0.1; - sbW=0.17; + sbW=0.1; sbH=0.8; } else { - sbX1=0.2; + sbX1=0.1; sbY1=0.01; - sbW=0.6; - sbH=0.12; + sbW=0.8; + sbH=0.08; } } @@ -930,7 +864,7 @@ void VisuGUI_ScalarBarPane::storeToResources() { aTitleFont.setBold(isTitleBold); aTitleFont.setItalic(isTitleItalic); - aTitleFont.setUnderline(isTitleShadow); + aTitleFont.setOverline(isTitleShadow); QString titleFontFamily; switch (aTitleFontFamily) { @@ -965,7 +899,7 @@ void VisuGUI_ScalarBarPane::storeToResources() { aLabelFont.setBold(isLabelBold); aLabelFont.setItalic(isLabelItalic); - aLabelFont.setUnderline(isLabelShadow); + aLabelFont.setOverline(isLabelShadow); QString labelFontFamily; switch (aLabelFontFamily) { @@ -1063,24 +997,20 @@ void VisuGUI_ScalarBarPane::initFromPrsObject(VISU::ColoredPrs3d_i* thePrs) myScalarMap->GetBarOrientation()); if(RBvert->isChecked()) { - myVerTW = myScalarMap->GetTitleWidth(); - myVerTH = myScalarMap->GetTitleHeight(); - myVerLW = myScalarMap->GetLabelWidth(); - myVerLH = myScalarMap->GetLabelHeight(); + myVerTS = myScalarMap->GetTitleSize(); + myVerLS = myScalarMap->GetLabelSize(); myVerBW = myScalarMap->GetBarWidth(); myVerBH = myScalarMap->GetBarHeight(); - myBarDlg->setRatios(myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH); + myBarDlg->setRatios(myVerTS, myVerLS, myVerBW, myVerBH); } else { - myHorTW = myScalarMap->GetTitleWidth(); - myHorTH = myScalarMap->GetTitleHeight(); - myHorLW = myScalarMap->GetLabelWidth(); - myHorLH = myScalarMap->GetLabelHeight(); + myHorTS = myScalarMap->GetTitleSize(); + myHorLS = myScalarMap->GetLabelSize(); myHorBW = myScalarMap->GetBarWidth(); myHorBH = myScalarMap->GetBarHeight(); - myBarDlg->setRatios(myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH); + myBarDlg->setRatios(myHorTS, myHorLS, myHorBW, myHorBH); } - myBarDlg->setLabelsFormat(myScalarMap->GetLabelsFormat()); + myBarDlg->setLabelsPrecision( VISU::ToPrecision( myScalarMap->GetLabelsFormat() ) ); myBarDlg->setUnitsVisible(myScalarMap->IsUnitsVisible()); vtkFloatingPointType R, G, B; @@ -1105,6 +1035,8 @@ void VisuGUI_ScalarBarPane::initFromPrsObject(VISU::ColoredPrs3d_i* thePrs) myScalarMap->IsItalicLabel(), myScalarMap->IsShadowLabel()); + myHideBar->setChecked(!myScalarMap->IsBarVisible()); + // Draw Preview if (myPreviewCheck->isChecked()) { createScalarBar(); @@ -1157,6 +1089,7 @@ void VisuGUI_ScalarBarPane::createScalarBar() VISU_ScalarBarActor* aScalarBarActor = myPreviewActor->GetScalarBar(); myPreviewActor->GetScalarBar()->VisibilityOn(); myPreviewActor->PickableOff(); + //myPreviewActor->SetBarVisibility(!myHideBar->isChecked()); myScalarMapPL->SetScalarMode(myModeCombo->currentIndex()); if(isLogarithmic()) @@ -1249,11 +1182,12 @@ void VisuGUI_ScalarBarPane::createScalarBar() (isLabelItalic)? aLabelProp->ItalicOn() : aLabelProp->ItalicOff(); (isLabelShadow)? aLabelProp->ShadowOn() : aLabelProp->ShadowOff(); - int VerTW, VerTH, VerLW, VerLH, VerBW, VerBH; - myBarDlg->getRatios(VerTW, VerTH, VerLW, VerLH, VerBW, VerBH); - aScalarBarActor->SetRatios(VerTW, VerTH, VerLW, VerLH, VerBW, VerBH); + int VerTS, VerTH, VerLS, VerBW, VerBH; + myBarDlg->getRatios(VerTS, VerLS, VerBW, VerBH); + aScalarBarActor->SetRatios(VerTS, VerLS, VerBW, VerBH); - aScalarBarActor->SetLabelFormat(myBarDlg->getLabelsFormat().toLatin1().data()); + std::string f = VISU::ToFormat( myBarDlg->getLabelsPrecision() ); + aScalarBarActor->SetLabelFormat( f.c_str() ); aScalarBarActor->Modified(); @@ -1298,12 +1232,13 @@ int VisuGUI_ScalarBarPane::storeToPrsObject(VISU::ColoredPrs3d_i* thePrs) { myScalarMap->SetPosition(XSpin->value(), YSpin->value()); myScalarMap->SetSize(WidthSpin->value(), HeightSpin->value()); if(RBvert->isChecked()) { - myScalarMap->SetRatios(myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH); + myScalarMap->SetRatios(myVerTS, myVerLS, myVerBW, myVerBH); } else { - myScalarMap->SetRatios(myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH); + myScalarMap->SetRatios(myHorTS, myHorLS, myHorBW, myHorBH); } - myScalarMap->SetLabelsFormat(myBarDlg->getLabelsFormat().toLatin1().data()); + std::string f = VISU::ToFormat( myBarDlg->getLabelsPrecision() ); + myScalarMap->SetLabelsFormat( f.c_str() ); myScalarMap->SetUnitsVisible(myBarDlg->isUnitsVisible()); myScalarMap->SetBarOrientation((RBvert->isChecked())? VISU::ColoredPrs3dBase::VERTICAL : VISU::ColoredPrs3dBase::HORIZONTAL); @@ -1321,6 +1256,8 @@ int VisuGUI_ScalarBarPane::storeToPrsObject(VISU::ColoredPrs3d_i* thePrs) { myScalarMap->SetLabels(LabelSpin->value()); myScalarMap->SetIsDistributionVisible(isShowDistribution()); // RKV + myScalarMap->SetBarVisible(!myHideBar->isChecked()); + if (isToSave()) storeToResources(); if (myIsStoreTextProp) { @@ -1673,14 +1610,15 @@ void VisuGUI_ScalarBarPane::onTextPref() void VisuGUI_ScalarBarPane::onBarPref() { if(RBvert->isChecked()) - myBarDlg->setRatios(myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH); + myBarDlg->setRatios(myVerTS, myVerLS, myVerBW, myVerBH); else - myBarDlg->setRatios(myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH); + myBarDlg->setRatios(myHorTS, myHorLS, myHorBW, myHorBH); + myBarDlg->setOrientation( getOrientation() ); if(myBarDlg->exec()) { if(RBvert->isChecked()) - myBarDlg->getRatios(myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH); + myBarDlg->getRatios(myVerTS, myVerLS, myVerBW, myVerBH); else - myBarDlg->getRatios(myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH); + myBarDlg->getRatios(myHorTS, myHorLS, myHorBW, myHorBH); updatePreview(); } } diff --git a/src/VISUGUI/VisuGUI_Prs3dDlg.h b/src/VISUGUI/VisuGUI_Prs3dDlg.h index 3e8c66e1..734203e6 100644 --- a/src/VISUGUI/VisuGUI_Prs3dDlg.h +++ b/src/VISUGUI/VisuGUI_Prs3dDlg.h @@ -104,18 +104,20 @@ class VisuGUI_BarPrefDlg: public QDialog VisuGUI_BarPrefDlg (QWidget* parent); ~VisuGUI_BarPrefDlg() {}; - void setRatios(int titleRatioWidth, int titleRatioHeight, - int labelRatioWidth, int labelRatioHeight, + void setRatios(int titleRatioSize, int labelRatioWidth, int barRatioWidth, int barRatioHeight); - void getRatios(int& titleRatioWidth, int& titleRatioHeight, - int& labelRatioWidth, int& labelRatioHeight, + void getRatios(int& titleRatioSize, int& labelRatioWidth, int& barRatioWidth, int& barRatioHeight); void setUnitsVisible(bool isVisible); bool isUnitsVisible(); - void setLabelsFormat( const QString& format); - QString getLabelsFormat(); + void setLabelsPrecision( const int p ); + int getLabelsPrecision() const; + + void setOrientation( const int ori ); + int getOrientation() const; + private: void keyPressEvent( QKeyEvent* e ); @@ -129,23 +131,20 @@ class VisuGUI_BarPrefDlg: public QDialog void onHelp(); protected: - QSpinBox* TitleWidthSpin; - QSpinBox* TitleHeightSpin; - QSpinBox* LabelWidthSpin; - QSpinBox* LabelHeightSpin; - QSpinBox* BarWidthSpin; - QSpinBox* BarHeightSpin; - QCheckBox* CBUnits; - QLineEdit* UnitsEdit; - - int myTitleWidth; - int myTitleHeight; - int myLabelWidth; - int myLabelHeight; + QSpinBox* myTitleSizeSpin; + QSpinBox* myLabelSizeSpin; + QSpinBox* myBarWidthSpin; + QSpinBox* myBarHeightSpin; + QCheckBox* myUnitsChk; + QSpinBox* myPrecisionSpin; + + int myTitleSize; + int myLabelSize; int myBarWidth; int myBarHeight; bool myUnits; - QString myUnitsFormat; + int myPrecision; + int myOrientation; }; @@ -207,6 +206,7 @@ class VisuGUI_ScalarBarPane : public QWidget//QVBox QCheckBox* CBSave; QCheckBox* CBLog; QCheckBox* CBDistr; + QCheckBox* myHideBar; QLabel* myModeLbl; QComboBox* myModeCombo; @@ -217,8 +217,8 @@ class VisuGUI_ScalarBarPane : public QWidget//QVBox double myHorX, myHorY, myHorW, myHorH; double myVerX, myVerY, myVerW, myVerH; - int myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH; - int myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH; + int myHorTS, myHorLS, myHorBW, myHorBH; + int myVerTS, myVerTH, myVerLS, myVerBW, myVerBH; bool myIsStoreTextProp; private slots: diff --git a/src/VISUGUI/VisuGUI_Selection.cxx b/src/VISUGUI/VisuGUI_Selection.cxx index 5d29a10a..1c5db753 100644 --- a/src/VISUGUI/VisuGUI_Selection.cxx +++ b/src/VISUGUI/VisuGUI_Selection.cxx @@ -73,6 +73,7 @@ QVariant VisuGUI_Selection::parameter( const int ind, const QString& p ) const else if ( p == "isThereAreHiddenCurves" ) val = QVariant( findDisplayedCurves( ind, true ) ); else if ( p == "hasCurves" ) val = QVariant( hasCurves( ind ) ); else if ( p == "isPlot2dViewer" ) val = QVariant( Plot2dViewerType( ind ) ); + else if ( p == "isValuesLabeled" ) val = QVariant( isValuesLabeled( ind ) ); } return val; @@ -703,3 +704,20 @@ bool VisuGUI_Selection::Plot2dViewerType( const int ind ) const return false; } +//---------------------------------------------------------------------------- +struct TIsValuesLabeled : TViewFunctor +{ + QString + virtual + get(VISU::Prs3d_i* thePrs3d, + SVTK_ViewWindow* theViewWindow, + VISU_Actor* theActor) + { + return theActor && theActor->GetValuesLabeled() ? "true" : "false"; + } +}; + +QString VisuGUI_Selection::isValuesLabeled( const int ind ) const +{ + return TPopupDispatcher()(myModule, entry(ind)); +} diff --git a/src/VISUGUI/VisuGUI_Selection.h b/src/VISUGUI/VisuGUI_Selection.h index 2f29ee13..15871ae2 100644 --- a/src/VISUGUI/VisuGUI_Selection.h +++ b/src/VISUGUI/VisuGUI_Selection.h @@ -60,6 +60,7 @@ private: QString isShading( const int ) const; QString isScalarMapAct( const int ) const; bool isVisuComponent( const int ) const; + QString isValuesLabeled( const int ) const; QString fullResolution( const int ) const; QString mediumResolution( const int ) const; diff --git a/src/VISUGUI/VisuGUI_Table3dDlg.cxx b/src/VISUGUI/VisuGUI_Table3dDlg.cxx index eda36881..bc38e937 100644 --- a/src/VISUGUI/VisuGUI_Table3dDlg.cxx +++ b/src/VISUGUI/VisuGUI_Table3dDlg.cxx @@ -32,6 +32,7 @@ #include "VISU_ColoredPrs3dFactory.hh" #include "VISU_ViewManager_i.hh" +#include "VISU_Prs3dUtils.hh" #include #include @@ -196,10 +197,8 @@ VisuGUI_TableScalarBarPane::VisuGUI_TableScalarBarPane( QWidget* parent ) myVerY = aResourceMgr->doubleValue( "VISU", propertyName + "y", 0. ); myVerW = aResourceMgr->doubleValue( "VISU", propertyName + "width", 0. ); myVerH = aResourceMgr->doubleValue( "VISU", propertyName + "height", 0. ); - myVerTW = aResourceMgr->integerValue( "VISU", propertyName + "title_width", 0 ); - myVerTH = aResourceMgr->integerValue( "VISU", propertyName + "title_height", 0 ); - myVerLW = aResourceMgr->integerValue( "VISU", propertyName + "label_width", 0 ); - myVerLH = aResourceMgr->integerValue( "VISU", propertyName + "label_height", 0 ); + myVerTS = aResourceMgr->integerValue( "VISU", propertyName + "title_size", 0 ); + myVerLS = aResourceMgr->integerValue( "VISU", propertyName + "label_size", 0 ); myVerBW = aResourceMgr->integerValue( "VISU", propertyName + "bar_width", 0 ); myVerBH = aResourceMgr->integerValue( "VISU", propertyName + "bar_height", 0 ); @@ -208,10 +207,8 @@ VisuGUI_TableScalarBarPane::VisuGUI_TableScalarBarPane( QWidget* parent ) myHorY = aResourceMgr->doubleValue( "VISU", propertyName + "y", 0. ); myHorW = aResourceMgr->doubleValue( "VISU", propertyName + "width", 0. ); myHorH = aResourceMgr->doubleValue( "VISU", propertyName + "height", 0. ); - myHorTW = aResourceMgr->integerValue( "VISU", propertyName + "title_width", 0 ); - myHorTH = aResourceMgr->integerValue( "VISU", propertyName + "title_height", 0 ); - myHorLW = aResourceMgr->integerValue( "VISU", propertyName + "label_width", 0 ); - myHorLH = aResourceMgr->integerValue( "VISU", propertyName + "label_height", 0 ); + myHorTS = aResourceMgr->integerValue( "VISU", propertyName + "title_size", 0 ); + myHorLS = aResourceMgr->integerValue( "VISU", propertyName + "label_size", 0 ); myHorBW = aResourceMgr->integerValue( "VISU", propertyName + "bar_width", 0 ); myHorBH = aResourceMgr->integerValue( "VISU", propertyName + "bar_height", 0 ); @@ -308,7 +305,7 @@ VisuGUI_TableScalarBarPane::VisuGUI_TableScalarBarPane( QWidget* parent ) QLabel* YLabel = new QLabel( tr( "LBL_Y" ), OriginGroup ); YSpin = new QtxDoubleSpinBox( 0.0, 1.0, 0.1, OriginGroup ); YSpin->setMinimumWidth( 70 ); - YSpin->setValue( 0.01 ); + YSpin->setValue( 0.1 ); OriginGroupLayout->addWidget( XLabel ); OriginGroupLayout->addWidget( XSpin ); @@ -356,12 +353,14 @@ VisuGUI_TableScalarBarPane::VisuGUI_TableScalarBarPane( QWidget* parent ) myBarDlg = new VisuGUI_BarPrefDlg( this ); if ( RBvert->isChecked() ) { - myBarDlg->setRatios( myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH ); + myBarDlg->setRatios( myVerTS, myVerLS, myVerBW, myVerBH ); } else { - myBarDlg->setRatios( myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH ); + myBarDlg->setRatios( myHorTS, myHorLS, myHorBW, myHorBH ); } - myBarDlg->setLabelsFormat( aResourceMgr->stringValue( "VISU", propertyName + "label_format", "%-#6.3g" ) ); + int lp = aResourceMgr->integerValue( "VISU", propertyName + "scalar_bar_label_precision", 3 ); + myBarDlg->setLabelsPrecision( lp ); + myBarDlg->setUnitsVisible( aResourceMgr->booleanValue( "VISU", propertyName + "display_units", true ) ); // signals and slots connections =========================================== @@ -381,14 +380,14 @@ VisuGUI_TableScalarBarPane::VisuGUI_TableScalarBarPane( QWidget* parent ) void VisuGUI_TableScalarBarPane::onBarPref() { if ( RBvert->isChecked() ) - myBarDlg->setRatios( myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH ); + myBarDlg->setRatios( myVerTS, myVerLS, myVerBW, myVerBH ); else - myBarDlg->setRatios( myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH ); + myBarDlg->setRatios( myHorTS, myHorLS, myHorBW, myHorBH ); if ( myBarDlg->exec() ) { if ( RBvert->isChecked() ) - myBarDlg->getRatios( myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH ); + myBarDlg->getRatios( myVerTS, myVerLS, myVerBW, myVerBH ); else - myBarDlg->getRatios( myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH ); + myBarDlg->getRatios( myHorTS, myHorLS, myHorBW, myHorBH ); } } @@ -429,15 +428,13 @@ void VisuGUI_TableScalarBarPane::initFromPrsObject( VISU::PointMap3d_i* thePrs ) myBarPrs->GetHeight(), myBarPrs->GetBarOrientation() ); - myVerTW = myBarPrs->GetTitleWidth(); - myVerTH = myBarPrs->GetTitleHeight(); - myVerLW = myBarPrs->GetLabelWidth(); - myVerLH = myBarPrs->GetLabelHeight(); + myVerTS = myBarPrs->GetTitleSize(); + myVerLS = myBarPrs->GetLabelSize(); myVerBW = myBarPrs->GetBarWidth(); myVerBH = myBarPrs->GetBarHeight(); - myBarDlg->setRatios( myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH ); + myBarDlg->setRatios( myVerTS, myVerLS, myVerBW, myVerBH ); - myBarDlg->setLabelsFormat( myBarPrs->GetLabelsFormat() ); + myBarDlg->setLabelsPrecision( VISU::ToPrecision( myBarPrs->GetLabelsFormat() ) ); myBarDlg->setUnitsVisible( myBarPrs->IsUnitsVisible() ); myTextDlg->myTitleFont->SetData( QColor( (int)(R*255.), (int)(G*255.), (int)(B*255.) ), @@ -467,9 +464,14 @@ int VisuGUI_TableScalarBarPane::storeToPrsObject( VISU::PointMap3d_i* thePrs ) { myBarPrs->SetPosition( XSpin->value(), YSpin->value() ); myBarPrs->SetSize( WidthSpin->value(), HeightSpin->value() ); - myBarPrs->SetRatios( myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH ); + if(RBvert->isChecked()) { + myBarPrs->SetRatios(myVerTS, myVerLS, myVerBW, myVerBH); + } else { + myBarPrs->SetRatios(myHorTS, myHorLS, myHorBW, myHorBH); + } - myBarPrs->SetLabelsFormat( myBarDlg->getLabelsFormat().toLatin1().constData() ); + std::string f = VISU::ToFormat( myBarDlg->getLabelsPrecision() ); + myBarPrs->SetLabelsFormat( f.c_str() ); myBarPrs->SetUnitsVisible( myBarDlg->isUnitsVisible() ); myBarPrs->SetBarOrientation( ( RBvert->isChecked() )? VISU::ColoredPrs3dBase::VERTICAL : VISU::ColoredPrs3dBase::HORIZONTAL ); diff --git a/src/VISUGUI/VisuGUI_Table3dDlg.h b/src/VISUGUI/VisuGUI_Table3dDlg.h index 5317671d..867e4267 100644 --- a/src/VISUGUI/VisuGUI_Table3dDlg.h +++ b/src/VISUGUI/VisuGUI_Table3dDlg.h @@ -149,8 +149,8 @@ private: double myHorX, myHorY, myHorW, myHorH; double myVerX, myVerY, myVerW, myVerH; - int myHorTW, myHorTH, myHorLW, myHorLH, myHorBW, myHorBH; - int myVerTW, myVerTH, myVerLW, myVerLH, myVerBW, myVerBH; + int myHorTS, myHorLS, myHorBW, myHorBH; + int myVerTS, myVerLS, myVerBW, myVerBH; bool myIsStoreTextProp; std::string myTitle; diff --git a/src/VISUGUI/VisuGUI_Tools.cxx b/src/VISUGUI/VisuGUI_Tools.cxx index 34ae14e7..768b7a5d 100644 --- a/src/VISUGUI/VisuGUI_Tools.cxx +++ b/src/VISUGUI/VisuGUI_Tools.cxx @@ -595,10 +595,13 @@ namespace VISU switch (theType) { case VISU::SHRINK: if (aPrs3d) { - if (anActor->IsShrunk()) - anActor->UnShrink(); - else - anActor->SetShrink(); + if (anActor->IsShrunk()) + anActor->UnShrink(); + else + anActor->SetShrink(); + if (VISU::Mesh_i* aMesh = dynamic_cast(aPrs3d)) { + aMesh->SetShrink(true); + } } else if (aTable) { if (anActorBase->IsShrunk()) anActorBase->UnShrink(); diff --git a/src/VISUGUI/VisuGUI_ValuesLabelingDlg.cxx b/src/VISUGUI/VisuGUI_ValuesLabelingDlg.cxx new file mode 100755 index 00000000..83ccb7b7 --- /dev/null +++ b/src/VISUGUI/VisuGUI_ValuesLabelingDlg.cxx @@ -0,0 +1,233 @@ +// Copyright (C) 2003 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. +// +// 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 http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : VisuGUI_ValuesLabelingDlg.cxx +// Author : Litonin SERGEY +// Module : SALOME + +#include "VisuGUI_ValuesLabelingDlg.h" +#include "VisuGUI.h" + +#include +#include +#include +#include +#include +#include +#include + +/*! + \class VisuGUI_ValuesLabelingDlg + \brief This class is intended for changing parameters of labeling values + of 3D colored presentations +*/ + +/*! + \brief Constructor + \param theModule module +*/ +VisuGUI_ValuesLabelingDlg::VisuGUI_ValuesLabelingDlg( SalomeApp_Module* theModule ) +: VisuGUI_Prs3dDlg( theModule ) +{ + setWindowTitle( tr( "PARAMETERS_OF_VALUES_LABELING" ) ); + + // font groups + + QGroupBox* aFGrp = new QGroupBox( tr( "LABELS" ), this ); + + QLabel* aFont = new QLabel( tr( "FONT" ) ); + QLabel* aColor = new QLabel( tr( "COLOR" ) ); + myFont = new QtxFontEdit( aFGrp ); + myColor = new QtxColorButton( aFGrp ); + myColor->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + + QGridLayout* aFLay = new QGridLayout( aFGrp ); + aFLay->setSpacing( 5 ); + aFLay->setMargin( 5 ); + + aFLay->addWidget( aFont, 0, 0 ); + aFLay->addWidget( myFont, 0, 1 ); + aFLay->addWidget( aColor, 1, 0 ); + aFLay->addWidget( myColor, 1, 1 ); + + // buttons + + QGroupBox* aBtnGrp = new QGroupBox( this ); + QGridLayout* aBtnLay = new QGridLayout( aBtnGrp ); + aBtnLay->setAlignment( Qt::AlignTop ); + aBtnLay->setSpacing( 5 ); + aBtnLay->setMargin( 5 ); + + QPushButton* anOK = new QPushButton( tr("BUT_OK"), aBtnGrp ); + anOK->setAutoDefault( true ); + anOK->setDefault( true ); + aBtnLay->addWidget( anOK, 0, 0 ); + aBtnLay->addItem( new QSpacerItem( 5, 5, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 1 ); + + QPushButton* aCancel = new QPushButton( tr("BUT_CANCEL") , aBtnGrp ); + aCancel->setAutoDefault( true ); + aBtnLay->addWidget( aCancel, 0, 2 ); + + QPushButton* aHelp = new QPushButton( tr("BUT_HELP") , aBtnGrp ); + aHelp->setAutoDefault( true ); + aBtnLay->addWidget( aHelp, 0, 3 ); + + myFont->setMode( QtxFontEdit::Custom ); + myFont->setFeatures( QtxFontEdit::Family | QtxFontEdit::Bold | QtxFontEdit::Italic | + QtxFontEdit::Shadow | QtxFontEdit::UserSize | QtxFontEdit::Size ); + QStringList fam; + fam.append( tr( "VISU_FONT_ARIAL" ) ); + fam.append( tr( "VISU_FONT_COURIER" ) ); + fam.append( tr( "VISU_FONT_TIMES" ) ); + myFont->setFonts( fam ); + + // Layout widgets + + QVBoxLayout* aMainLay = new QVBoxLayout( this ); + aMainLay->setSpacing( 5 ); + aMainLay->setMargin( 5 ); + aMainLay->addWidget( aFGrp ); + aMainLay->addWidget( aBtnGrp ); + + // Connect signals and slots + connect( anOK,SIGNAL( clicked() ), SLOT( accept() ) ); + connect( aCancel, SIGNAL( clicked() ), SLOT( reject() ) ); + connect( aHelp, SIGNAL( clicked() ), SLOT( onHelp() ) ); + + setFixedSize( minimumSizeHint() ); +} + +/*! + \brief Destructor +*/ +VisuGUI_ValuesLabelingDlg::~VisuGUI_ValuesLabelingDlg() +{ +} + +/*! + \brief Initializes dialog fields using specified presentation + \param thePrs presentation + \param theInit not used + \sa storeToPrsObject() +*/ +void VisuGUI_ValuesLabelingDlg::initFromPrsObject( VISU::ColoredPrs3d_i* thePrs, bool ) +{ + if ( !thePrs ) + return; + + int aFType = thePrs->GetValLblFontType(); + + double aSize = thePrs->GetValLblFontSize(); + + bool isBold = thePrs->IsBoldValLbl(); + bool isItalic = thePrs->IsItalicValLbl(); + bool isShadow = thePrs->IsShadowValLbl(); + + vtkFloatingPointType aGRB[ 3 ]; + thePrs->GetValLblFontColor( aGRB[ 0 ], aGRB[ 1 ], aGRB[ 2 ] ); + + // font + QFont aFont; + + QString aFamily; + if ( aFType == VTK_ARIAL ) + aFamily = "Arial"; + else if ( aFType == VTK_COURIER ) + aFamily = "Courier"; + else if ( aFType == VTK_TIMES ) + aFamily = "Times"; + + aFont.setFamily( aFamily ); + aFont.setPointSize( aSize ); + aFont.setBold( isBold ); + aFont.setItalic( isItalic ); + aFont.setOverline( isShadow ); + + myFont->setCurrentFont( aFont ); + + // color + QColor aColor( aGRB[ 0 ] * 255, aGRB[ 1 ] * 255, aGRB[ 2 ] * 255 ); + myColor->setColor( aColor ); +} + +/*! + \brief Updates presentation in accordance with dialog input data + \param thePrs to be updated + \sa initFromPrsObject() +*/ +int VisuGUI_ValuesLabelingDlg::storeToPrsObject( VISU::ColoredPrs3d_i* thePrs ) +{ + if ( !thePrs ) + return 0; + + QFont aFont = myFont->currentFont(); + + // type + if ( aFont.family() == "Arial" ) + thePrs->SetValLblFontType( VTK_ARIAL ); + else if ( aFont.family() == "Courier" ) + thePrs->SetValLblFontType( VTK_COURIER ); + else if ( aFont.family() == "Times" ) + thePrs->SetValLblFontType( VTK_TIMES ); + + // size + int aSize = aFont.pointSize(); + if ( aSize > 0 ) + thePrs->SetValLblFontSize( aSize ); + + // bold, italic, shadow + thePrs->SetBoldValLbl( aFont.bold() ); + thePrs->SetItalicValLbl( aFont.italic() ); + thePrs->SetShadowValLbl( aFont.overline() ); + + // color + QColor aColor = myColor->color(); + thePrs->SetValLblFontColor( + aColor.red() / 255., aColor.green() / 255., aColor.blue() / 255. ); + + return 1; +} + +/*! + \brief Gets help file name +*/ +QString VisuGUI_ValuesLabelingDlg::GetContextHelpFilePath() +{ + return "values_labeling_page.html"; +} + + + + + + + + + + + + + + + + + + + + diff --git a/src/VISUGUI/VisuGUI_ValuesLabelingDlg.h b/src/VISUGUI/VisuGUI_ValuesLabelingDlg.h new file mode 100755 index 00000000..6f8d0e23 --- /dev/null +++ b/src/VISUGUI/VisuGUI_ValuesLabelingDlg.h @@ -0,0 +1,66 @@ +// Copyright (C) 2003 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. +// +// 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 http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : VisuGUI_ValuesLabelingDlg.h +// Author : Sergey LITONIN +// Module : SALOME + +#ifndef VisuGUI_ValuesLabelingDlg_H +#define VisuGUI_ValuesLabelingDlg_H + +#include + +class QtxFontEdit; +class QtxColorButton; + +class VisuGUI_ValuesLabelingDlg : public VisuGUI_Prs3dDlg +{ + Q_OBJECT + +public: + VisuGUI_ValuesLabelingDlg( SalomeApp_Module* theModule ); + ~VisuGUI_ValuesLabelingDlg(); + + virtual void initFromPrsObject( VISU::ColoredPrs3d_i* thePrs, bool theInit ); + + virtual int storeToPrsObject( VISU::ColoredPrs3d_i* thePrs ); + +protected: + virtual QString GetContextHelpFilePath(); + +private: + QtxFontEdit* myFont; + QtxColorButton* myColor; +}; + +#endif // VisuGUI_ValuesLabelingDlg_H + + + + + + + + + + + + + + diff --git a/src/VISU_I/VISU_ColoredPrs3d_i.cc b/src/VISU_I/VISU_ColoredPrs3d_i.cc index 572c5752..d82c7d7c 100644 --- a/src/VISU_I/VISU_ColoredPrs3d_i.cc +++ b/src/VISU_I/VISU_ColoredPrs3d_i.cc @@ -697,8 +697,8 @@ VISU::ColoredPrs3d_i SetUnitsVisible(anOrigin->IsUnitsVisible()); SetIsDistributionVisible(anOrigin->GetIsDistributionVisible()); - SetLabelsFormat(anOrigin->GetLabelsFormat()); - + SetLabelsFormat( anOrigin->GetLabelsFormat() ); + SetBarOrientation(anOrigin->GetBarOrientation()); SetMinMaxController( anOrigin ); @@ -713,8 +713,7 @@ VISU::ColoredPrs3d_i SetPosition(anOrigin->GetPosX(), anOrigin->GetPosY()); SetSize(anOrigin->GetWidth(), anOrigin->GetHeight()); - SetRatios(anOrigin->GetTitleWidth(), anOrigin->GetTitleHeight(), - anOrigin->GetLabelWidth(), anOrigin->GetLabelHeight(), + SetRatios(anOrigin->GetTitleSize(), anOrigin->GetLabelSize(), anOrigin->GetBarWidth(), anOrigin->GetBarHeight()); SetLabels(anOrigin->GetLabels()); @@ -1008,14 +1007,11 @@ VISU::ColoredPrs3d_i //---------------------------------------------------------------------------- void VISU::ColoredPrs3d_i -::SetRatios(CORBA::Long theTitleWidth, CORBA::Long theTitleHeight, - CORBA::Long theLabelWidth, CORBA::Long theLabelHeight, +::SetRatios(CORBA::Long theTitleSize, CORBA::Long theLabelSize, CORBA::Long theBarWidth, CORBA::Long theBarHeight) { - bool anIsSameValue = VISU::CheckIsSameValue(myTitleWidth, theTitleWidth); - anIsSameValue &= VISU::CheckIsSameValue(myTitleHeight, theTitleHeight); - anIsSameValue &= VISU::CheckIsSameValue(myLabelWidth, theLabelWidth); - anIsSameValue &= VISU::CheckIsSameValue(myLabelHeight, theLabelHeight); + bool anIsSameValue = VISU::CheckIsSameValue(myTitleSize, theTitleSize); + anIsSameValue &= VISU::CheckIsSameValue(myLabelSize, theLabelSize); anIsSameValue &= VISU::CheckIsSameValue(myBarWidth, theBarWidth); anIsSameValue &= VISU::CheckIsSameValue(myBarHeight, theBarHeight); if(anIsSameValue) @@ -1023,10 +1019,8 @@ VISU::ColoredPrs3d_i VISU::TSetModified aModified(this); - myTitleWidth = theTitleWidth; - myTitleHeight = theTitleHeight; - myLabelWidth = theLabelWidth; - myLabelHeight = theLabelHeight; + myTitleSize = theTitleSize; + myLabelSize = theLabelSize; myBarWidth = theBarWidth; myBarHeight = theBarHeight; myParamsTime.Modified(); @@ -1035,33 +1029,17 @@ VISU::ColoredPrs3d_i //---------------------------------------------------------------------------- CORBA::Long VISU::ColoredPrs3d_i -::GetTitleWidth() +::GetTitleSize() { - return myTitleWidth; -} - -//---------------------------------------------------------------------------- -CORBA::Long -VISU::ColoredPrs3d_i -::GetTitleHeight() -{ - return myTitleHeight; + return myTitleSize; } //---------------------------------------------------------------------------- CORBA::Long VISU::ColoredPrs3d_i -::GetLabelWidth() +::GetLabelSize() { - return myLabelWidth; -} - -//---------------------------------------------------------------------------- -CORBA::Long -VISU::ColoredPrs3d_i -::GetLabelHeight() -{ - return myLabelHeight; + return myLabelSize; } //---------------------------------------------------------------------------- @@ -1102,6 +1080,8 @@ VISU::ColoredPrs3d_i return myNumberOfLabels; } +//---------------------------------------------------------------------------- + //---------------------------------------------------------------------------- void VISU::ColoredPrs3d_i @@ -1510,8 +1490,8 @@ VISU::ColoredPrs3d_i SetIsDistributionVisible( aResourceMgr->booleanValue("VISU", "scalar_bar_show_distribution", false) ); // RKV - QString aLabelsFormat = aResourceMgr->stringValue( "VISU", "scalar_bar_label_format", "%-#6.3g" ); - SetLabelsFormat(aLabelsFormat.toLatin1().data()); + int lp = aResourceMgr->integerValue( "VISU", "scalar_bar_label_precision", 3 ); + SetLabelsFormat( VISU::ToFormat( lp ).c_str() ); // Orientation int anOrientation = aResourceMgr->integerValue("VISU", "scalar_bar_orientation", 0); @@ -1523,32 +1503,26 @@ VISU::ColoredPrs3d_i // Scalar Bar origin QString propertyName = QString( "scalar_bar_%1_" ).arg( anOrientation == 0 ? "vertical" : "horizontal" ); - vtkFloatingPointType aXorigin = (myOrientation == VISU::ColoredPrs3dBase::VERTICAL) ? 0.01 : 0.2; + vtkFloatingPointType aXorigin = (myOrientation == VISU::ColoredPrs3dBase::VERTICAL) ? 0.01 : 0.1; aXorigin = aResourceMgr->doubleValue("VISU", propertyName + "x", aXorigin); myPosition[0] = aXorigin; - vtkFloatingPointType aYorigin = (myOrientation == VISU::ColoredPrs3dBase::VERTICAL) ? 0.1 : 0.012; + vtkFloatingPointType aYorigin = (myOrientation == VISU::ColoredPrs3dBase::VERTICAL) ? 0.1 : 0.01; aYorigin = aResourceMgr->doubleValue("VISU", propertyName + "y", aYorigin); myPosition[1] = aYorigin; // Scalar Bar size - myWidth = (myOrientation == VISU::ColoredPrs3dBase::VERTICAL)? 0.1 : 0.6; + myWidth = (myOrientation == VISU::ColoredPrs3dBase::VERTICAL)? 0.08 : 0.8; myWidth = aResourceMgr->doubleValue("VISU", propertyName + "width", myWidth); - myHeight = (myOrientation == VISU::ColoredPrs3dBase::VERTICAL)? 0.8:0.12; + myHeight = (myOrientation == VISU::ColoredPrs3dBase::VERTICAL)? 0.8:0.08; myHeight = aResourceMgr->doubleValue("VISU", propertyName + "height", myHeight); - myTitleWidth = 0; - myTitleWidth = aResourceMgr->integerValue("VISU", propertyName + "title_width", myTitleWidth); - - myTitleHeight = 0; - myTitleHeight = aResourceMgr->integerValue("VISU", propertyName + "title_height", myTitleHeight); + myTitleSize = 0; + myTitleSize = aResourceMgr->integerValue("VISU", propertyName + "title_size", myTitleSize); - myLabelWidth = 0; - myLabelWidth = aResourceMgr->integerValue("VISU", propertyName + "label_width", myLabelWidth); - - myLabelHeight = 0; - myLabelHeight = aResourceMgr->integerValue("VISU", propertyName + "label_height", myLabelHeight); + myLabelSize = 0; + myLabelSize = aResourceMgr->integerValue("VISU", propertyName + "label_size", myLabelSize); myBarWidth = 0; myBarWidth = aResourceMgr->integerValue("VISU", propertyName + "bar_width", myBarWidth); @@ -1586,7 +1560,7 @@ VISU::ColoredPrs3d_i myIsBoldTitle = f.bold(); myIsItalicTitle = f.italic(); - myIsShadowTitle = f.underline(); + myIsShadowTitle = f.overline(); } QColor aTextColor = aResourceMgr->colorValue( "VISU", "scalar_bar_title_color", QColor( 255, 255, 255 ) ); @@ -1611,7 +1585,7 @@ VISU::ColoredPrs3d_i myIsBoldLabel = f.bold(); myIsItalicLabel = f.italic(); - myIsShadowLabel = f.underline(); + myIsShadowLabel = f.overline(); } QColor aLabelColor = aResourceMgr->colorValue( "VISU", "scalar_bar_label_color", QColor( 255, 255, 255 ) ); @@ -1621,7 +1595,41 @@ VISU::ColoredPrs3d_i myLabelColor[0] = aLabelColor.red() / 255.; myLabelColor[1] = aLabelColor.green() / 255.; myLabelColor[2] = aLabelColor.blue() / 255.; + + // Parameters of labels displaed field values + myValLblFontType = VTK_ARIAL; + myIsBoldValLbl = true; + myIsItalicValLbl = myIsShadowValLbl = false; + myValLblFontSize = 12; + if( aResourceMgr->hasValue( "VISU", "values_labeling_font" ) ) + { + // family + QFont f = aResourceMgr->fontValue( "VISU", "values_labeling_font" ); + if ( f.family() == "Arial" ) + myValLblFontType = VTK_ARIAL; + else if ( f.family() == "Courier" ) + myValLblFontType = VTK_COURIER; + else if ( f.family() == "Times" ) + myValLblFontType = VTK_TIMES; + + // size + if ( f.pointSize() > -1 ) + myValLblFontSize = f.pointSize(); + + // color + QColor aColor = aResourceMgr->colorValue( + "VISU", "values_labeling_color", QColor( 255, 255, 255 ) ); + myValLblFontColor[ 0 ] = aColor.red() / 255.; + myValLblFontColor[ 1 ] = aColor.green() / 255.; + myValLblFontColor[ 2 ] = aColor.blue()/ 255.; + + // bold, italic, shadow + myIsBoldValLbl = f.bold(); + myIsItalicValLbl = f.italic(); + myIsShadowValLbl = f.overline(); + } + return this; } @@ -1695,10 +1703,8 @@ VISU::ColoredPrs3d_i myPosition[1] = VISU::Storable::FindValue(theMap,"myPosition[1]").toDouble(); myWidth = VISU::Storable::FindValue(theMap,"myWidth").toDouble(); myHeight = VISU::Storable::FindValue(theMap,"myHeight").toDouble(); - myTitleWidth = VISU::Storable::FindValue(theMap,"myTitleWidth").toInt(); - myTitleHeight = VISU::Storable::FindValue(theMap,"myTitleHeight").toInt(); - myLabelWidth = VISU::Storable::FindValue(theMap,"myLabelWidth").toInt(); - myLabelHeight = VISU::Storable::FindValue(theMap,"myLabelHeight").toInt(); + myTitleSize = VISU::Storable::FindValue(theMap,"myTitleSize").toInt(); + myLabelSize = VISU::Storable::FindValue(theMap,"myLabelSize").toInt(); myBarWidth = VISU::Storable::FindValue(theMap,"myBarWidth").toInt(); myBarHeight = VISU::Storable::FindValue(theMap,"myBarHeight").toInt(); @@ -1731,6 +1737,18 @@ VISU::ColoredPrs3d_i } } } + + // Parameters of labels displayed field values + + myValLblFontType = VISU::Storable::FindValue( theMap, "myValLblFontType", "0" ).toInt(); + myIsBoldValLbl = VISU::Storable::FindValue( theMap, "myIsBoldValLbl", "1" ).toInt(); + myIsItalicValLbl = VISU::Storable::FindValue( theMap, "myIsItalicValLbl", "0" ).toInt(); + myIsShadowValLbl = VISU::Storable::FindValue( theMap, "myIsShadowValLbl", "0" ).toInt(); + myValLblFontSize = VISU::Storable::FindValue( theMap, "myValLblFontSize", "12" ).toDouble(); + myValLblFontColor[ 0 ] = VISU::Storable::FindValue( theMap, "myValLblFontColor[0]", "1" ).toFloat(); + myValLblFontColor[ 1 ] = VISU::Storable::FindValue( theMap, "myValLblFontColor[1]", "1" ).toFloat(); + myValLblFontColor[ 2 ] = VISU::Storable::FindValue( theMap, "myValLblFontColor[2]", "1" ).toFloat(); + return this; } @@ -1763,15 +1781,15 @@ VISU::ColoredPrs3d_i Storable::DataToStream( theStr, "myTitle", myTitle.c_str() ); Storable::DataToStream( theStr, "myUnitsVisible", myIsUnits ); Storable::DataToStream( theStr, "myNumberOfLabels", myNumberOfLabels ); + Storable::DataToStream( theStr, "myLabelsFormat", myLabelsFormat.c_str() ); + Storable::DataToStream( theStr, "myPosition[0]", myPosition[0] ); Storable::DataToStream( theStr, "myPosition[1]", myPosition[1] ); Storable::DataToStream( theStr, "myWidth", myWidth ); Storable::DataToStream( theStr, "myHeight", myHeight ); - Storable::DataToStream( theStr, "myTitleWidth", myTitleWidth ); - Storable::DataToStream( theStr, "myTitleHeight", myTitleHeight ); - Storable::DataToStream( theStr, "myLabelWidth", myLabelWidth ); - Storable::DataToStream( theStr, "myLabelHeight", myLabelHeight ); + Storable::DataToStream( theStr, "myTitleSize", myTitleSize ); + Storable::DataToStream( theStr, "myLabelSize", myLabelSize ); Storable::DataToStream( theStr, "myBarWidth", myBarWidth ); Storable::DataToStream( theStr, "myBarHeight", myBarHeight ); @@ -1790,6 +1808,18 @@ VISU::ColoredPrs3d_i Storable::DataToStream( theStr, "myLabelColor[0]", myLabelColor[0] ); Storable::DataToStream( theStr, "myLabelColor[1]", myLabelColor[1] ); Storable::DataToStream( theStr, "myLabelColor[2]", myLabelColor[2] ); + + // Parameters of labels displayed field values + + Storable::DataToStream( theStr, "myValLblFontType", myValLblFontType ); + Storable::DataToStream( theStr, "myIsBoldValLbl", myIsBoldValLbl ); + Storable::DataToStream( theStr, "myIsItalicValLbl", myIsItalicValLbl ); + Storable::DataToStream( theStr, "myIsShadowValLbl", myIsShadowValLbl ); + Storable::DataToStream( theStr, "myValLblFontSize", myValLblFontSize ); + Storable::DataToStream( theStr, "myValLblFontColor[0]", myValLblFontColor[ 0 ] ); + Storable::DataToStream( theStr, "myValLblFontColor[1]", myValLblFontColor[ 1 ] ); + Storable::DataToStream( theStr, "myValLblFontColor[2]", myValLblFontColor[ 2 ] ); + std::ostringstream aGeomNameList; std::string aMeshName = GetCMeshName(); @@ -1943,3 +1973,159 @@ VISU::ColoredPrs3d_i } //---------------------------------------------------------------------------- + + +int +VISU::ColoredPrs3d_i +::GetValLblFontType() const +{ + return myValLblFontType; +} + +//---------------------------------------------------------------------------- + +void +VISU::ColoredPrs3d_i +::SetValLblFontType( const int theType ) +{ + if ( myValLblFontType == theType ) + return; + + VISU::TSetModified aModified( this ); + + myValLblFontType = theType; + myParamsTime.Modified(); +} + +//---------------------------------------------------------------------------- + +double +VISU::ColoredPrs3d_i +::GetValLblFontSize() const +{ + return myValLblFontSize; +} + +//---------------------------------------------------------------------------- + +void +VISU::ColoredPrs3d_i +::SetValLblFontSize( const double theSize ) +{ + if ( VISU::CheckIsSameValue( myValLblFontSize, theSize ) ) + return; + + VISU::TSetModified aModified( this ); + + myValLblFontSize = theSize; + myParamsTime.Modified(); +} + +//---------------------------------------------------------------------------- + +void +VISU::ColoredPrs3d_i +::GetValLblFontColor( vtkFloatingPointType& theR, + vtkFloatingPointType& theG, + vtkFloatingPointType& theB ) const +{ + theR = myValLblFontColor[ 0 ]; + theG = myValLblFontColor[ 1 ]; + theB = myValLblFontColor[ 2 ]; +} + +//---------------------------------------------------------------------------- + +void +VISU::ColoredPrs3d_i +::SetValLblFontColor( const vtkFloatingPointType theR, + const vtkFloatingPointType theG, + const vtkFloatingPointType theB ) +{ + if ( VISU::CheckIsSameValue( myValLblFontColor[ 0 ], theR ) && + VISU::CheckIsSameValue( myValLblFontColor[ 1 ], theG ) && + VISU::CheckIsSameValue (myValLblFontColor[ 2 ], theB ) ) + return; + + VISU::TSetModified aModified(this); + + myValLblFontColor[ 0 ] = theR; + myValLblFontColor[ 1 ] = theG; + myValLblFontColor[ 2 ] = theB; + myParamsTime.Modified(); +} + +//---------------------------------------------------------------------------- + +bool +VISU::ColoredPrs3d_i +::IsBoldValLbl() const +{ + return myIsBoldValLbl; +} + +//---------------------------------------------------------------------------- + +void +VISU::ColoredPrs3d_i +::SetBoldValLbl( const bool theVal ) +{ + if ( myIsBoldValLbl == theVal ) + return; + + VISU::TSetModified aModified( this ); + + myIsBoldValLbl = theVal; + myParamsTime.Modified(); +} + +//---------------------------------------------------------------------------- + +bool +VISU::ColoredPrs3d_i +::IsItalicValLbl() const +{ + return myIsItalicValLbl; +} + +//---------------------------------------------------------------------------- + +void +VISU::ColoredPrs3d_i +::SetItalicValLbl( const bool theVal ) +{ + if ( myIsItalicValLbl == theVal ) + return; + + VISU::TSetModified aModified( this ); + + myIsItalicValLbl = theVal; + myParamsTime.Modified(); +} + +//---------------------------------------------------------------------------- + +bool +VISU::ColoredPrs3d_i +::IsShadowValLbl() const +{ + return myIsShadowValLbl; +} + +//---------------------------------------------------------------------------- + +void +VISU::ColoredPrs3d_i +::SetShadowValLbl( const bool theVal ) +{ + if ( myIsShadowValLbl == theVal ) + return; + + VISU::TSetModified aModified( this ); + + myIsShadowValLbl = theVal; + myParamsTime.Modified(); +} + +//---------------------------------------------------------------------------- + diff --git a/src/VISU_I/VISU_ColoredPrs3d_i.hh b/src/VISU_I/VISU_ColoredPrs3d_i.hh index 582a9ee1..5548bfed 100644 --- a/src/VISU_I/VISU_ColoredPrs3d_i.hh +++ b/src/VISU_I/VISU_ColoredPrs3d_i.hh @@ -284,8 +284,7 @@ namespace VISU virtual void - SetRatios(CORBA::Long theTitleWidth, CORBA::Long theTitleHeight, - CORBA::Long theLabelWidth, CORBA::Long theLabelHeight, + SetRatios(CORBA::Long theTitleSize, CORBA::Long theLabelSize, CORBA::Long theBarWidth, CORBA::Long theBarHeight); virtual @@ -298,19 +297,11 @@ namespace VISU virtual CORBA::Long - GetTitleWidth(); - - virtual - CORBA::Long - GetTitleHeight(); + GetTitleSize(); virtual CORBA::Long - GetLabelWidth(); - - virtual - CORBA::Long - GetLabelHeight(); + GetLabelSize(); virtual CORBA::Long @@ -581,6 +572,58 @@ namespace VISU return myColoredPL; } + virtual + int + GetValLblFontType() const; + + virtual + void + SetValLblFontType( const int theType ); + + virtual + double + GetValLblFontSize() const; + + virtual + void + SetValLblFontSize( const double theSize ); + + virtual + bool + IsBoldValLbl() const; + + virtual + void + SetBoldValLbl( const bool theVal ); + + virtual + bool + IsItalicValLbl() const; + + virtual + void + SetItalicValLbl( const bool theVal ); + + virtual + bool + IsShadowValLbl() const; + + virtual + void + SetShadowValLbl( const bool theVal ); + + virtual + void + GetValLblFontColor( vtkFloatingPointType& theR, + vtkFloatingPointType& theG, + vtkFloatingPointType& theB ) const; + + virtual + void + SetValLblFontColor( const vtkFloatingPointType theR, + const vtkFloatingPointType theG, + const vtkFloatingPointType theB ); + //---------------------------------------------------------------------------- protected: /*! @@ -688,11 +731,11 @@ namespace VISU int myNumberOfLabels; std::string myLabelsFormat; + VISU::ColoredPrs3dBase::Orientation myOrientation; vtkFloatingPointType myPosition[2], myWidth, myHeight, - myTitleWidth, myTitleHeight, - myLabelWidth, myLabelHeight, + myTitleSize, myLabelSize, myBarWidth, myBarHeight; //Font management @@ -713,6 +756,13 @@ namespace VISU bool myIsDistributionVisible; // RKV + // Result labels + int myValLblFontType; + double myValLblFontSize; + bool myIsBoldValLbl; + bool myIsItalicValLbl; + bool myIsShadowValLbl; + vtkFloatingPointType myValLblFontColor[ 3 ]; }; diff --git a/src/VISU_I/VISU_DumpPython.cc b/src/VISU_I/VISU_DumpPython.cc index 3e47457b..c91a9c01 100644 --- a/src/VISU_I/VISU_DumpPython.cc +++ b/src/VISU_I/VISU_DumpPython.cc @@ -434,7 +434,9 @@ namespace VISU aParam = "VISU.LOGARITHMIC"; break; } + std::string aVisible = theServant->IsBarVisible()? "True" : "False"; theStr<IsShrank()? "True" : "False")<<")"<SetTitle(GetScalarBarTitle().c_str()); theScalarBar->SetOrientation(GetBarOrientation()); theScalarBar->SetNumberOfLabels(GetLabels()); - theScalarBar->SetRatios(GetTitleWidth(), GetTitleHeight(), - GetLabelWidth(), GetLabelHeight(), + theScalarBar->SetRatios(GetTitleSize(), GetLabelSize(), GetBarWidth(), GetBarHeight()); theScalarBar->SetLabelFormat(GetLabelsFormat()); @@ -1002,7 +1001,24 @@ VISU::GaussPoints_i theActor->SetRepresentation( VTK_POINTS ); else theActor->SetRepresentation( VTK_SURFACE ); + + // Update values labels + + vtkTextProperty* aProp = anActor->GetsValLabelsProps(); + if ( aProp ) + { + aProp->SetFontFamily( GetValLblFontType() ); + aProp->SetFontSize( GetValLblFontSize() ); + aProp->SetBold( IsBoldValLbl() ); + aProp->SetItalic( IsItalicValLbl() ); + aProp->SetShadow( IsShadowValLbl() ); + + vtkFloatingPointType anRGB[ 3 ]; + GetValLblFontColor( anRGB[ 0 ], anRGB[ 1 ], anRGB[ 2 ] ); + aProp->SetColor( anRGB[ 0 ], anRGB[ 1 ], anRGB[ 2 ] ); + } } + TSuperClass::UpdateActor(theActor); } diff --git a/src/VISU_I/VISU_Mesh_i.cc b/src/VISU_I/VISU_Mesh_i.cc index 9adab276..c2983431 100644 --- a/src/VISU_I/VISU_Mesh_i.cc +++ b/src/VISU_I/VISU_Mesh_i.cc @@ -129,6 +129,8 @@ VISU::Mesh_i SetMeshName(theMeshName.c_str()); myEntity = int(theEntity);//jfa IPAL9284 mySubMeshName = theFamilyName; + SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); + myIsShrank = aResourceMgr->booleanValue("VISU", "mesh_shrink", false); return Build(false); } @@ -191,6 +193,8 @@ VISU::Mesh_i throw std::runtime_error("Mesh_i::Build - GetCResult()->GetInput() == NULL !!!"); if (!theRestoring) { myPresentType = VISU::PresentationType(VISU::GetResourceMgr()->integerValue("VISU" , "mesh_represent", 2)); + myIsShrank = (myPresentType == VISU::SHRINK); + if(myEntity == VISU::NODE_ENTITY) myPresentType = VISU::POINT; SetName((const char*)GenerateName().toLatin1(), false); @@ -399,7 +403,9 @@ VISU::Mesh_i return; VISU::TSetModified aModified(this); - + if (theType == VISU::SHRINK) { + myIsShrank = true; + } myPresentType = theType; myParamsTime.Modified(); } @@ -446,6 +452,8 @@ VISU::Mesh_i myPresentType = VISU::PresentationType(VISU::Storable::FindValue(theMap,"myPresentType").toInt()); + myIsShrank = (VISU::Storable::FindValue(theMap,"myIsShrank", "0").toInt() == 1)? true: false; + myCellColor.R = VISU::Storable::FindValue(theMap,"myCellColor.R").toDouble(); myCellColor.G = VISU::Storable::FindValue(theMap,"myCellColor.G").toDouble(); myCellColor.B = VISU::Storable::FindValue(theMap,"myCellColor.B").toDouble(); @@ -487,6 +495,8 @@ VISU::Mesh_i Storable::DataToStream( theStr, "myPresentType", int(myPresentType) ); + Storable::DataToStream( theStr, "myIsShrank", (myIsShrank? "1":"0")); + Storable::DataToStream( theStr, "myCellColor.R", myCellColor.R ); Storable::DataToStream( theStr, "myCellColor.G", myCellColor.G ); Storable::DataToStream( theStr, "myCellColor.B", myCellColor.B ); @@ -510,9 +520,14 @@ VISU::Mesh_i try{ VISU::Prs3d_i::CreateActor(anActor); SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); - bool toShrink = aResourceMgr->booleanValue("VISU", "mesh_shrink", false); - if (toShrink) anActor->SetShrink(); - + //bool toShrink = aResourceMgr->booleanValue("VISU", "mesh_shrink", false); + //if (toShrink) anActor->SetShrink(); + if (anActor->IsShrunkable()) { + if (myIsShrank) + anActor->SetShrink(); + else + anActor->UnShrink(); + } anActor->SetFeatureEdgesAngle( aResourceMgr->doubleValue("VISU", "feature_edges_angle", 0.0) ); anActor->SetFeatureEdgesFlags( aResourceMgr->booleanValue("VISU", "show_feature_edges", false), aResourceMgr->booleanValue("VISU", "show_boundary_edges", false), @@ -538,6 +553,12 @@ VISU::Mesh_i if(MYDEBUG) MESSAGE("Mesh_i::UpdateActor"); VISU::Prs3d_i::UpdateActor(anActor); anActor->SetRepresentation(myPresentType); + if (anActor->IsShrunkable()) { + if (myIsShrank) + anActor->SetShrink(); + else + anActor->UnShrink(); + } anActor->GetSurfaceProperty()->SetColor(myCellColor.R, myCellColor.G, myCellColor.B); anActor->GetEdgeProperty()->SetColor(myLinkColor.R, myLinkColor.G, myLinkColor.B); anActor->GetNodeProperty()->SetColor(myNodeColor.R, myNodeColor.G, myNodeColor.B); @@ -545,3 +566,20 @@ VISU::Mesh_i } //---------------------------------------------------------------------------- + + +void VISU::Mesh_i::SetShrink(CORBA::Boolean toShrink) +{ + if(toShrink == myIsShrank) + return; + VISU::TSetModified aModified(this); + myIsShrank = toShrink; + myParamsTime.Modified(); +} + +//---------------------------------------------------------------------------- +CORBA::Boolean VISU::Mesh_i::IsShrank() +{ + return myIsShrank; +} + diff --git a/src/VISU_I/VISU_Mesh_i.hh b/src/VISU_I/VISU_Mesh_i.hh index 828667cd..de7e3142 100644 --- a/src/VISU_I/VISU_Mesh_i.hh +++ b/src/VISU_I/VISU_Mesh_i.hh @@ -95,6 +95,11 @@ namespace VISU VISU::PresentationType GetPresentationType(); + + virtual void SetShrink(CORBA::Boolean toShrink); + + virtual CORBA::Boolean IsShrank(); + VISU_MeshPL* GetSpecificPL() const { return myMeshPL; @@ -114,6 +119,7 @@ namespace VISU SALOMEDS::Color myCellColor; SALOMEDS::Color myNodeColor; SALOMEDS::Color myLinkColor; + bool myIsShrank; public: static diff --git a/src/VISU_I/VISU_PointMap3d_i.cc b/src/VISU_I/VISU_PointMap3d_i.cc index 33493def..f03b72ca 100644 --- a/src/VISU_I/VISU_PointMap3d_i.cc +++ b/src/VISU_I/VISU_PointMap3d_i.cc @@ -217,8 +217,8 @@ VISU::Storable* VISU::PointMap3d_i::Create() SetRange(aMin, aMax); } - QString aLabelsFormat = aResourceMgr->stringValue( "VISU", "scalar_bar_label_format", "%-#6.3g" ); - SetLabelsFormat(aLabelsFormat.toLatin1().constData()); + int lp = aResourceMgr->integerValue( "VISU", "scalar_bar_label_precision", 3 ); + SetLabelsFormat( VISU::ToFormat( lp ).c_str() ); // Orientation int anOrientation = aResourceMgr->integerValue("VISU", "scalar_bar_orientation", 0); @@ -245,10 +245,8 @@ VISU::Storable* VISU::PointMap3d_i::Create() myHeight = (myBarOrientation == VISU::ColoredPrs3dBase::VERTICAL)? 0.8:0.12; myHeight = aResourceMgr->doubleValue("VISU", propertyName + "height", myHeight); - myTitleWidth = aResourceMgr->doubleValue("VISU", propertyName + "title_width", 0); - myTitleHeight = aResourceMgr->doubleValue("VISU", propertyName + "title_height", 0); - myLabelWidth = aResourceMgr->doubleValue("VISU", propertyName + "label_width", 0); - myLabelHeight = aResourceMgr->doubleValue("VISU", propertyName + "label_height", 0); + myTitleSize = aResourceMgr->doubleValue("VISU", propertyName + "title_size", 0); + myLabelSize = aResourceMgr->doubleValue("VISU", propertyName + "label_size", 0); myBarWidth = aResourceMgr->doubleValue("VISU", propertyName + "bar_width", 0); myBarHeight = aResourceMgr->doubleValue("VISU", propertyName + "bar_height", 0); @@ -270,7 +268,7 @@ VISU::Storable* VISU::PointMap3d_i::Create() myIsBoldTitle = f.bold(); myIsItalicTitle = f.italic(); - myIsShadowTitle = f.underline(); + myIsShadowTitle = f.overline(); } QColor aTextColor = aResourceMgr->colorValue( "VISU", "scalar_bar_title_color", QColor( 255, 255, 255 ) ); @@ -293,7 +291,7 @@ VISU::Storable* VISU::PointMap3d_i::Create() myIsBoldLabel = f.bold(); myIsItalicLabel = f.italic(); - myIsShadowLabel = f.underline(); + myIsShadowLabel = f.overline(); } QColor aLabelColor = aResourceMgr->colorValue( "VISU", "scalar_bar_label_color", QColor( 255, 255, 255 ) ); @@ -404,8 +402,7 @@ void VISU::PointMap3d_i::UpdateActor(VISU_ActorBase* theActor) aScalarBar->SetWidth(GetWidth()); aScalarBar->SetHeight(GetHeight()); aScalarBar->SetNumberOfLabels(GetLabels()); - aScalarBar->SetRatios(myTitleWidth, myTitleHeight, - myLabelWidth, myLabelHeight, + aScalarBar->SetRatios(myTitleSize, myLabelSize, myBarWidth, myBarHeight); aScalarBar->SetNumberOfLabels(GetLabels()); aScalarBar->SetLabelFormat(GetLabelsFormat()); @@ -583,10 +580,8 @@ VISU::Storable* VISU::PointMap3d_i::Restore( const Storable::TRestoringMap& theM myPosition[1] = VISU::Storable::FindValue(theMap,"myPosition[1]").toDouble(); myWidth = VISU::Storable::FindValue(theMap,"myWidth").toDouble(); myHeight = VISU::Storable::FindValue(theMap,"myHeight").toDouble(); - myTitleWidth = VISU::Storable::FindValue(theMap,"myTitleWidth").toInt(); - myTitleHeight = VISU::Storable::FindValue(theMap,"myTitleHeight").toInt(); - myLabelWidth = VISU::Storable::FindValue(theMap,"myLabelWidth").toInt(); - myLabelHeight = VISU::Storable::FindValue(theMap,"myLabelHeight").toInt(); + myTitleSize = VISU::Storable::FindValue(theMap,"myTitleSize").toInt(); + myLabelSize = VISU::Storable::FindValue(theMap,"myLabelSize").toInt(); myBarWidth = VISU::Storable::FindValue(theMap,"myBarWidth").toInt(); myBarHeight = VISU::Storable::FindValue(theMap,"myBarHeight").toInt(); @@ -633,10 +628,8 @@ void VISU::PointMap3d_i::ToStream( std::ostringstream& theStr ) Storable::DataToStream( theStr, "myPosition[1]", myPosition[1] ); Storable::DataToStream( theStr, "myWidth", myWidth ); Storable::DataToStream( theStr, "myHeight", myHeight ); - Storable::DataToStream( theStr, "myTitleWidth", myTitleWidth ); - Storable::DataToStream( theStr, "myTitleHeight", myTitleHeight ); - Storable::DataToStream( theStr, "myLabelWidth", myLabelWidth ); - Storable::DataToStream( theStr, "myLabelHeight", myLabelHeight ); + Storable::DataToStream( theStr, "myTitleSize", myTitleSize ); + Storable::DataToStream( theStr, "myLabelSize", myLabelSize ); Storable::DataToStream( theStr, "myBarWidth", myBarWidth ); Storable::DataToStream( theStr, "myBarHeight", myBarHeight ); @@ -1188,27 +1181,15 @@ void VISU::PointMap3d_i::SetLabelColor(vtkFloatingPointType theR, } //---------------------------------------------------------------------------- -CORBA::Long VISU::PointMap3d_i::GetTitleWidth() +CORBA::Long VISU::PointMap3d_i::GetTitleSize() { - return myTitleWidth; + return myTitleSize; } //---------------------------------------------------------------------------- -CORBA::Long VISU::PointMap3d_i::GetTitleHeight() -{ - return myTitleHeight; -} - -//---------------------------------------------------------------------------- -CORBA::Long VISU::PointMap3d_i::GetLabelWidth() +CORBA::Long VISU::PointMap3d_i::GetLabelSize() { - return myLabelWidth; -} - -//---------------------------------------------------------------------------- -CORBA::Long VISU::PointMap3d_i::GetLabelHeight() -{ - return myLabelHeight; + return myLabelSize; } //---------------------------------------------------------------------------- @@ -1255,23 +1236,19 @@ CORBA::Boolean VISU::PointMap3d_i::IsUnitsVisible() } //---------------------------------------------------------------------------- -void VISU::PointMap3d_i::SetRatios(CORBA::Long theTitleWidth, CORBA::Long theTitleHeight, - CORBA::Long theLabelWidth, CORBA::Long theLabelHeight, +void VISU::PointMap3d_i::SetRatios(CORBA::Long theTitleSize, + CORBA::Long theLabelSize, CORBA::Long theBarWidth, CORBA::Long theBarHeight) { - bool anIsSameValue = VISU::CheckIsSameValue(myTitleWidth, theTitleWidth); - anIsSameValue &= VISU::CheckIsSameValue(myTitleHeight, theTitleHeight); - anIsSameValue &= VISU::CheckIsSameValue(myLabelWidth, theLabelWidth); - anIsSameValue &= VISU::CheckIsSameValue(myLabelHeight, theLabelHeight); + bool anIsSameValue = VISU::CheckIsSameValue(myTitleSize, theTitleSize); + anIsSameValue &= VISU::CheckIsSameValue(myLabelSize, theLabelSize); anIsSameValue &= VISU::CheckIsSameValue(myBarWidth, theBarWidth); anIsSameValue &= VISU::CheckIsSameValue(myBarHeight, theBarHeight); if(anIsSameValue) return; - myTitleWidth = theTitleWidth; - myTitleHeight = theTitleHeight; - myLabelWidth = theLabelWidth; - myLabelHeight = theLabelHeight; + myTitleSize = theTitleSize; + myLabelSize = theLabelSize; myBarWidth = theBarWidth; myBarHeight = theBarHeight; myParamsTime.Modified(); diff --git a/src/VISU_I/VISU_PointMap3d_i.hh b/src/VISU_I/VISU_PointMap3d_i.hh index 0db0c5f0..547191d8 100644 --- a/src/VISU_I/VISU_PointMap3d_i.hh +++ b/src/VISU_I/VISU_PointMap3d_i.hh @@ -100,8 +100,7 @@ namespace VISU virtual void SetSize(CORBA::Double theWidth, CORBA::Double theHeight); - virtual void SetRatios(CORBA::Long theTitleWidth, CORBA::Long theTitleHeight, - CORBA::Long theLabelWidth, CORBA::Long theLabelHeight, + virtual void SetRatios(CORBA::Long theTitleSize, CORBA::Long theLabelSize, CORBA::Long theBarWidth, CORBA::Long theBarHeight); virtual CORBA::Double GetWidth(); @@ -115,7 +114,7 @@ namespace VISU virtual void SetLabelsFormat(const char* theFormat); virtual char* GetLabelsFormat(); - + virtual void SetBarOrientation(VISU::ColoredPrs3dBase::Orientation theOrientation); virtual VISU::ColoredPrs3dBase::Orientation GetBarOrientation(); @@ -188,10 +187,8 @@ namespace VISU vtkFloatingPointType theB); //------------------------------------------------------------------- - virtual CORBA::Long GetTitleWidth(); - virtual CORBA::Long GetTitleHeight(); - virtual CORBA::Long GetLabelWidth(); - virtual CORBA::Long GetLabelHeight(); + virtual CORBA::Long GetTitleSize(); + virtual CORBA::Long GetLabelSize(); virtual CORBA::Long GetBarWidth(); virtual CORBA::Long GetBarHeight(); @@ -213,8 +210,8 @@ namespace VISU std::string myLabelsFormat; vtkFloatingPointType myPosition[2], myWidth, myHeight, - myTitleWidth, myTitleHeight, - myLabelWidth, myLabelHeight, + myTitleSize, + myLabelSize, myBarWidth, myBarHeight; bool myIsFixedRange; CORBA::Float myOffset[3]; diff --git a/src/VISU_I/VISU_Prs3dUtils.cc b/src/VISU_I/VISU_Prs3dUtils.cc index dbb37815..35685d9f 100644 --- a/src/VISU_I/VISU_Prs3dUtils.cc +++ b/src/VISU_I/VISU_Prs3dUtils.cc @@ -70,6 +70,59 @@ namespace VISU ProcessVoidEvent(new TEvent(this)); } + //---------------------------------------------------------------------------- + + std::string ToFormat( const int thePrec ) + { + // "%-#6.3g" + char str[ 255 ]; + sprintf( str, "%%-#.%dg", thePrec ); + return str; + } //---------------------------------------------------------------------------- + + int ToPrecision( const char* theFormat ) + { + int N = strlen( theFormat ); + int k = -1; + char str[ 255 ]; + bool isOk = false; + for ( int i = 0; i < N; i++ ) + { + if ( theFormat[ i ] == '.' ) + k = 0; + else if ( theFormat[ i ] == 'g' ) + { + str[ k ] = 0; + isOk = true; + break; + } + else if ( k >= 0 ) + str[ k++ ] = theFormat[ i ]; + } + + int res = 0; + if ( isOk ) + res = atoi( str ); + + return res; + } }; + + + + + + + + + + + + + + + + + diff --git a/src/VISU_I/VISU_Prs3dUtils.hh b/src/VISU_I/VISU_Prs3dUtils.hh index 4abe53ca..7cf7fd20 100644 --- a/src/VISU_I/VISU_Prs3dUtils.hh +++ b/src/VISU_I/VISU_Prs3dUtils.hh @@ -31,7 +31,6 @@ #include - namespace VISU { //---------------------------------------------------------------------------- @@ -44,6 +43,9 @@ namespace VISU ~TSetModified(); }; + Standard_EXPORT std::string ToFormat( const int thePrec ); + Standard_EXPORT int ToPrecision( const char* theFormat ); + //---------------------------------------------------------------------------- } diff --git a/src/VISU_I/VISU_ScalarMap_i.cc b/src/VISU_I/VISU_ScalarMap_i.cc index 63f28310..2ad8a3be 100644 --- a/src/VISU_I/VISU_ScalarMap_i.cc +++ b/src/VISU_I/VISU_ScalarMap_i.cc @@ -172,7 +172,8 @@ VISU::ScalarMap_i //---------------------------------------------------------------------------- VISU::ScalarMap_i:: ScalarMap_i(EPublishInStudyMode thePublishInStudyMode) : - ColoredPrs3d_i(thePublishInStudyMode) + ColoredPrs3d_i(thePublishInStudyMode), + myShowBar(true) {} //---------------------------------------------------------------------------- @@ -192,7 +193,7 @@ VISU::ScalarMap_i ScalarMap_i* anOrigin = const_cast(aPrs3d); SetScaling(anOrigin->GetScaling()); - + SetBarVisible(anOrigin->IsBarVisible()); Update(); } } @@ -218,6 +219,7 @@ VISU::ScalarMap_i else SetScaling(VISU::LINEAR); + myShowBar = true; return this; } @@ -240,6 +242,9 @@ VISU::ScalarMap_i SetScaling(VISU::Scaling(VISU::Storable::FindValue(theMap,"myScaling").toInt())); + QString aVal = VISU::Storable::FindValue(theMap,"myShowBar", "1"); + SetBarVisible((aVal.toInt() == 1)? true : false); + // Check if the icon needs to be updated, update if necessary SALOMEDS::Study_var aStudy = theSObject->GetStudy(); SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); @@ -262,6 +267,7 @@ VISU::ScalarMap_i TSuperClass::ToStream(theStr); Storable::DataToStream( theStr, "myScaling", GetScaling() ); + Storable::DataToStream( theStr, "myShowBar", (IsBarVisible()? 1:0) ); } @@ -363,6 +369,14 @@ VISU::ScalarMap_i return IsPossible(GetCResult(),GetCMeshName(),GetEntity(),GetCFieldName(),GetTimeStampNumber(),true); } +void VISU::ScalarMap_i::SetBarVisible(CORBA::Boolean theVisible) +{ + if (myShowBar == theVisible) + return; + VISU::TSetModified aModified(this); + myShowBar = theVisible; + myParamsTime.Modified(); +} //---------------------------------------------------------------------------- void @@ -387,7 +401,7 @@ VISU::ScalarMap_i VISU_ScalarMapAct* anActor = VISU_ScalarMapAct::New(); try{ TSuperClass::CreateActor(anActor); - anActor->SetBarVisibility(true); + anActor->SetBarVisibility(myShowBar); SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); int aDispMode = aResourceMgr->integerValue("VISU", "scalar_map_represent", 2); bool toShrink = aResourceMgr->booleanValue("VISU", "scalar_map_shrink", false); @@ -446,8 +460,7 @@ VISU::ScalarMap_i aScalarBar->GetPositionCoordinate()->SetValue(GetPosX(),GetPosY()); aScalarBar->SetWidth(GetWidth()); aScalarBar->SetHeight(GetHeight()); - aScalarBar->SetRatios(GetTitleWidth(), GetTitleHeight(), - GetLabelWidth(), GetLabelHeight(), + aScalarBar->SetRatios(GetTitleSize(), GetLabelSize(), GetBarWidth(), GetBarHeight()); aScalarBar->SetNumberOfLabels(GetLabels()); aScalarBar->SetLabelFormat(GetLabelsFormat()); @@ -474,7 +487,25 @@ VISU::ScalarMap_i IsItalicLabel()? aLabelProp->ItalicOn() : aLabelProp->ItalicOff(); IsShadowLabel()? aLabelProp->ShadowOn() : aLabelProp->ShadowOff(); + anActor->SetBarVisibility(myShowBar); + aScalarBar->Modified(); + + // Update values labels + + vtkTextProperty* aProp = anActor->GetsValLabelsProps(); + if ( aProp ) + { + aProp->SetFontFamily( GetValLblFontType() ); + aProp->SetFontSize( GetValLblFontSize() ); + aProp->SetBold( IsBoldValLbl() ); + aProp->SetItalic( IsItalicValLbl() ); + aProp->SetShadow( IsShadowValLbl() ); + + vtkFloatingPointType anRGB[ 3 ]; + GetValLblFontColor( anRGB[ 0 ], anRGB[ 1 ], anRGB[ 2 ] ); + aProp->SetColor( anRGB[ 0 ], anRGB[ 1 ], anRGB[ 2 ] ); + } } TSuperClass::UpdateActor(theActor); } diff --git a/src/VISU_I/VISU_ScalarMap_i.hh b/src/VISU_I/VISU_ScalarMap_i.hh index 463800c2..0b640af6 100644 --- a/src/VISU_I/VISU_ScalarMap_i.hh +++ b/src/VISU_I/VISU_ScalarMap_i.hh @@ -98,6 +98,10 @@ namespace VISU { return myScalarMapPL; } + + virtual CORBA::Boolean IsBarVisible() { return myShowBar; } + + virtual void SetBarVisible(CORBA::Boolean theVisible); protected: //! Redefines VISU_ColoredPrs3d_i::DoSetInput @@ -189,6 +193,7 @@ namespace VISU private: VISU_ScalarMapPL* myScalarMapPL; + bool myShowBar; }; } -- 2.39.2