From 45f3a53e410f578994f269a1b424e23e46518010 Mon Sep 17 00:00:00 2001 From: ouv Date: Mon, 20 Jul 2009 09:13:10 +0000 Subject: [PATCH] Fix of issue 0017328: EDF 593 VISU : min and max scalar map of results given at gauss points --- .../gui/VISU/images/scalarbarproperties.png | Bin 38936 -> 41271 bytes doc/salome/gui/VISU/input/scalar_map.doc | 5 + idl/VISU_Gen.idl | 21 ++ resources/SalomeApp.xml | 1 + src/CONVERTOR/VISU_ConvertorDef.hxx | 5 + src/CONVERTOR/VISU_MedConvertor.cxx | 354 ++++++++++-------- src/CONVERTOR/VISU_MeshValue.cxx | 39 +- src/CONVERTOR/VISU_Structures.hxx | 13 +- src/CONVERTOR/VISU_Structures_impl.cxx | 62 ++- src/CONVERTOR/VISU_Structures_impl.hxx | 27 +- .../VISU_DeformedShapeAndScalarMapPL.cxx | 21 ++ .../VISU_DeformedShapeAndScalarMapPL.hxx | 8 + src/PIPELINE/VISU_Extractor.cxx | 39 +- src/PIPELINE/VISU_Extractor.hxx | 10 + src/PIPELINE/VISU_ScalarMapPL.cxx | 27 ++ src/PIPELINE/VISU_ScalarMapPL.hxx | 8 + src/VISUGUI/VISU_msg_en.ts | 20 + src/VISUGUI/VisuGUI.cxx | 14 +- .../VisuGUI_DeformedShapeAndScalarMapDlg.cxx | 2 +- src/VISUGUI/VisuGUI_Prs3dDlg.cxx | 78 +++- src/VISUGUI/VisuGUI_Prs3dDlg.h | 8 +- src/VISUGUI/VisuGUI_ScalarBarDlg.cxx | 2 +- src/VISU_I/VISU_DumpPython.cc | 18 + src/VISU_I/VISU_ScalarMap_i.cc | 44 ++- src/VISU_I/VISU_ScalarMap_i.hh | 9 + 25 files changed, 620 insertions(+), 215 deletions(-) diff --git a/doc/salome/gui/VISU/images/scalarbarproperties.png b/doc/salome/gui/VISU/images/scalarbarproperties.png index 318497db8ae0e169a667995dd014ec206cbee0ce..9da29706fa427b59c945aeeee153a80298848178 100644 GIT binary patch literal 41271 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 z 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 literal 38936 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 O2s~Z=T-G@yGywqI9c69+ diff --git a/doc/salome/gui/VISU/input/scalar_map.doc b/doc/salome/gui/VISU/input/scalar_map.doc index 749ff40c..775471e8 100644 --- a/doc/salome/gui/VISU/input/scalar_map.doc +++ b/doc/salome/gui/VISU/input/scalar_map.doc @@ -64,6 +64,11 @@ fields containing vector values, in other cases it will be inactive).
  • Logarithmic scaling check box: You can apply logarithmic scaling to the color scale of the presentation.
  • +
  • Gauss Metric field: This field allows to choose what kind +of value will be extracted from gauss points data. (Note: This field +is shown only for two types of presentantation - Scalar Map +and Deformed Shape and Scalar Map, and it is active only when +the result is based on multiple gauss points).
  • Use field range: if this check box is selected, all cells of the field presentation will be colored according the values applied to these cells.
  • diff --git a/idl/VISU_Gen.idl b/idl/VISU_Gen.idl index 7ff5beb8..2e98fc19 100644 --- a/idl/VISU_Gen.idl +++ b/idl/VISU_Gen.idl @@ -56,6 +56,16 @@ module VISU { LOGARITHMIC /*!< Logarithmic type of scaling. */ }; + /*! + * This enumeration contains a set of elements defining + * what kind of value will be extracted from gauss points data. + */ + enum GaussMetric { + AVERAGE, /*!< Average value (default). */ + MINIMUM, /*!< Minimum value. */ + MAXIMUM /*!< Maximum value. */ + }; + /*! * This enumeration contains a set of elements defining the * type of the %entity (topological units) constituting a mesh. @@ -759,6 +769,17 @@ module VISU { */ void SetBarVisible(in boolean theVisible); + /*! + * Sets the gauss metric for the presentation. + * \param theGaussMetric The value of this parameter is taken from the GaussMetric enumeration. + */ + void SetGaussMetric(in GaussMetric theGaussMetric); + + /*! + * Gets the gauss metric of the presentation. + */ + GaussMetric GetGaussMetric(); + }; //------------------------------------------------------- diff --git a/resources/SalomeApp.xml b/resources/SalomeApp.xml index 612d301f..48c8051b 100644 --- a/resources/SalomeApp.xml +++ b/resources/SalomeApp.xml @@ -92,6 +92,7 @@ + diff --git a/src/CONVERTOR/VISU_ConvertorDef.hxx b/src/CONVERTOR/VISU_ConvertorDef.hxx index a500b34d..cf416a92 100644 --- a/src/CONVERTOR/VISU_ConvertorDef.hxx +++ b/src/CONVERTOR/VISU_ConvertorDef.hxx @@ -49,6 +49,11 @@ namespace VISU ePOLYGONE=400, ePOLYEDRE=500, eNONE=-1}; + //--------------------------------------------------------------- + //! Enumeration used to extract different kinds of values from the data on gauss points + enum TGaussMetric { AVERAGE_METRIC = 0, MINIMUM_METRIC, MAXIMUM_METRIC }; + + //--------------------------------------------------------------- struct TMesh; typedef MED::SharedPtr PMesh; diff --git a/src/CONVERTOR/VISU_MedConvertor.cxx b/src/CONVERTOR/VISU_MedConvertor.cxx index 2c7fdf28..4beb4133 100644 --- a/src/CONVERTOR/VISU_MedConvertor.cxx +++ b/src/CONVERTOR/VISU_MedConvertor.cxx @@ -1594,16 +1594,22 @@ void BuildTimeStampMinMax(MED::SharedPtr theTimeStampValue, const VISU::PMEDMeshOnEntity theMeshOnEntity, const MED::TGeom2Gauss& theGeom2Gauss, - VISU::TMinMaxArr& theMinMaxArr, - VISU::TMinMaxArr& theAverageMinMaxArr, - VISU::TGroup2MinMaxArr& theGroup2MinMaxArr, - VISU::TGroup2MinMaxArr& theGroup2AverageMinMaxArr, + VISU::TMetric2Comp2MinMax& theMetric2Comp2MinMax, + VISU::TMetric2Comp2MinMax& theMetric2Comp2AverageMinMax, + VISU::TMetric2Comp2Group2MinMax& theMetric2Comp2Group2MinMax, + VISU::TMetric2Comp2Group2MinMax& theMetric2Comp2Group2AverageMinMax, TInt theNbComp, TInt theNbComp2) { const VISU::TFamilyIDMap& aFamilyIDMap = theMeshOnEntity->myFamilyIDMap; VISU::TGeom2ElemID2FamilyID aGeom2ElemID2FamilyID = theMeshOnEntity->myGeom2ElemID2FamilyID; + VISU::TVector aBaseAverageValues; + aBaseAverageValues.resize(3); + aBaseAverageValues[VISU::AVERAGE_METRIC] = 0.0; + aBaseAverageValues[VISU::MINIMUM_METRIC] = VTK_LARGE_FLOAT; + aBaseAverageValues[VISU::MAXIMUM_METRIC] = -VTK_LARGE_FLOAT; + const typename TimeStampValueType::TTGeom2Value& aGeom2Value = theTimeStampValue->myGeom2Value; typename TimeStampValueType::TTGeom2Value::const_iterator anIter = aGeom2Value.begin(); for(; anIter != aGeom2Value.end(); anIter++){ @@ -1629,19 +1635,131 @@ BuildTimeStampMinMax(MED::SharedPtr theTimeStampValue, // To calculate min/max per components for(TInt iElem = 0; iElem < aNbElem; iElem++){ typename TimeStampValueType::TTMeshValue::TCValueSliceArr aMValueSliceArr = aMMeshValue.GetCompValueSliceArr(iElem); - for(TInt iComp = 0; iComp < theNbComp; iComp++){ - const typename TimeStampValueType::TTMeshValue::TCValueSlice& aMValueSlice = aMValueSliceArr[iComp]; - VISU::TMinMax& aMinMax = theMinMaxArr[iComp+1]; - vtkFloatingPointType& aMin = aMinMax.first; - vtkFloatingPointType& aMax = aMinMax.second; - VISU::TMinMax& anAverageMinMax = theAverageMinMaxArr[iComp+1]; - vtkFloatingPointType& anAverageMin = anAverageMinMax.first; - vtkFloatingPointType& anAverageMax = anAverageMinMax.second; - vtkFloatingPointType anAverageValue = 0.0; - - VISU::TGroup2MinMax& aGroup2MinMax = theGroup2MinMaxArr[iComp+1]; - VISU::TGroup2MinMax& aGroup2AverageMinMax = theGroup2AverageMinMaxArr[iComp+1]; - std::map aGroup2AverageValue; + + for(int aGaussMetric = (int)VISU::AVERAGE_METRIC; aGaussMetric <= (int)VISU::MAXIMUM_METRIC; aGaussMetric++){ + VISU::TComp2MinMax& aComp2MinMax = theMetric2Comp2MinMax[aGaussMetric]; + VISU::TComp2MinMax& aComp2AverageMinMax = theMetric2Comp2AverageMinMax[aGaussMetric]; + VISU::TComp2Group2MinMax& aComp2Group2MinMax = theMetric2Comp2Group2MinMax[aGaussMetric]; + VISU::TComp2Group2MinMax& aComp2Group2AverageMinMax = theMetric2Comp2Group2AverageMinMax[aGaussMetric]; + + for(TInt iComp = 0; iComp < theNbComp; iComp++){ + const typename TimeStampValueType::TTMeshValue::TCValueSlice& aMValueSlice = aMValueSliceArr[iComp]; + + VISU::TMinMax& aMinMax = aComp2MinMax[iComp+1]; + vtkFloatingPointType& aMin = aMinMax.first; + vtkFloatingPointType& aMax = aMinMax.second; + VISU::TMinMax& anAverageMinMax = aComp2AverageMinMax[iComp+1]; + vtkFloatingPointType& anAverageMin = anAverageMinMax.first; + vtkFloatingPointType& anAverageMax = anAverageMinMax.second; + vtkFloatingPointType anAverageValue = aBaseAverageValues[aGaussMetric]; + + VISU::TGroup2MinMax& aGroup2MinMax = aComp2Group2MinMax[iComp+1]; + VISU::TGroup2MinMax& aGroup2AverageMinMax = aComp2Group2AverageMinMax[iComp+1]; + std::map aGroup2AverageValue; + + // get names of groups, to which the element belongs + VISU::TNames aGroupNames; + VISU::TElemID2FamilyID::const_iterator anIter = anElemID2FamilyID.find(iElem); + if(anIter != anElemID2FamilyID.end()){ + int aFamilyId = anIter->second; + if(aFamilyId != 0){ + VISU::TFamilyIDMap::const_iterator aFamilyIter = aFamilyIDMap.find(aFamilyId); + if(aFamilyIter != aFamilyIDMap.end()){ + VISU::PMEDFamily aFamily = aFamilyIter->second; + aGroupNames = aFamily->myGroupNames; + VISU::TNames::const_iterator aGroupIter = aGroupNames.begin(); + for(; aGroupIter != aGroupNames.end(); aGroupIter++) + aGroup2AverageValue[*aGroupIter] = aBaseAverageValues[aGaussMetric]; + } + } + } + + for(TInt iGauss = 0; iGauss < aNbGauss; iGauss++){ + const vtkFloatingPointType& aVal = aMValueSlice[iGauss]; + aMin = isnan(aVal) ? aVal : std::min(aMin,aVal); + aMax = isnan(aVal) ? aVal : std::max(aMax,aVal); + if(isAverageByGaussPoints){ + switch(aGaussMetric) { + case VISU::AVERAGE_METRIC: anAverageValue += aVal; break; + case VISU::MINIMUM_METRIC: anAverageValue = std::min(anAverageValue, aVal); break; + case VISU::MAXIMUM_METRIC: anAverageValue = std::max(anAverageValue, aVal); break; + } + } + else { + anAverageMin = aMin; + anAverageMax = aMax; + } + + // additional calculation for each group, to which the element belongs + VISU::TNames::const_iterator aGroupIter = aGroupNames.begin(); + for(; aGroupIter != aGroupNames.end(); aGroupIter++){ + VISU::TName aGroupName = *aGroupIter; + bool isGroupFound = aGroup2MinMax.find(aGroupName) != aGroup2MinMax.end(); + VISU::TMinMax& aGroupMinMax = aGroup2MinMax[aGroupName]; + vtkFloatingPointType& aGroupMin = aGroupMinMax.first; + vtkFloatingPointType& aGroupMax = aGroupMinMax.second; + aGroupMin = isGroupFound ? std::min(aGroupMin,aVal) : aVal; + aGroupMax = isGroupFound ? std::max(aGroupMax,aVal) : aVal; + + if(isAverageByGaussPoints){ + switch(aGaussMetric) { + case VISU::AVERAGE_METRIC: aGroup2AverageValue[aGroupName] = aGroup2AverageValue[aGroupName] + aVal; break; + case VISU::MINIMUM_METRIC: aGroup2AverageValue[aGroupName] = std::min(aGroup2AverageValue[aGroupName], aVal); break; + case VISU::MAXIMUM_METRIC: aGroup2AverageValue[aGroupName] = std::max(aGroup2AverageValue[aGroupName], aVal); break; + } + } + else { + VISU::TMinMax& aGroupAverageMinMax = aGroup2AverageMinMax[aGroupName]; + vtkFloatingPointType& aGroupAverageMin = aGroupAverageMinMax.first; + vtkFloatingPointType& aGroupAverageMax = aGroupAverageMinMax.second; + aGroupAverageMin = aGroupMin; + aGroupAverageMax = aGroupMax; + } + } + } + if(isAverageByGaussPoints){ + if(aGaussMetric == VISU::AVERAGE_METRIC) + anAverageValue /= aNbGauss; + anAverageMin = std::min(anAverageMin,anAverageValue); + anAverageMax = std::max(anAverageMax,anAverageValue); + + VISU::TNames::const_iterator aGroupIter = aGroupNames.begin(); + for(; aGroupIter != aGroupNames.end(); aGroupIter++){ + VISU::TName aGroupName = *aGroupIter; + vtkFloatingPointType aGroupAverageValue = aGroup2AverageValue[aGroupName]; + if(aGaussMetric == VISU::AVERAGE_METRIC) + aGroupAverageValue /= aNbGauss; + bool isGroupFound = aGroup2AverageMinMax.find(aGroupName) != aGroup2AverageMinMax.end(); + VISU::TMinMax& aGroupAverageMinMax = aGroup2AverageMinMax[aGroupName]; + vtkFloatingPointType& aGroupAverageMin = aGroupAverageMinMax.first; + vtkFloatingPointType& aGroupAverageMax = aGroupAverageMinMax.second; + aGroupAverageMin = isGroupFound ? std::min(aGroupAverageMin,aGroupAverageValue) : aGroupAverageValue; + aGroupAverageMax = isGroupFound ? std::max(aGroupAverageMax,aGroupAverageValue) : aGroupAverageValue; + } + } + } + } + } + + // To calculate min/max per vector modulus + for(int aGaussMetric = (int)VISU::AVERAGE_METRIC; aGaussMetric <= (int)VISU::MAXIMUM_METRIC; aGaussMetric++){ + VISU::TComp2MinMax& aComp2MinMax = theMetric2Comp2MinMax[aGaussMetric]; + VISU::TComp2MinMax& aComp2AverageMinMax = theMetric2Comp2AverageMinMax[aGaussMetric]; + VISU::TComp2Group2MinMax& aComp2Group2MinMax = theMetric2Comp2Group2MinMax[aGaussMetric]; + VISU::TComp2Group2MinMax& aComp2Group2AverageMinMax = theMetric2Comp2Group2AverageMinMax[aGaussMetric]; + + VISU::TMinMax& aMinMax = aComp2MinMax[0]; + vtkFloatingPointType& aMin = aMinMax.first; + vtkFloatingPointType& aMax = aMinMax.second; + VISU::TMinMax& anAverageMinMax = aComp2AverageMinMax[0]; + vtkFloatingPointType& anAverageMin = anAverageMinMax.first; + vtkFloatingPointType& anAverageMax = anAverageMinMax.second; + + VISU::TGroup2MinMax& aGroup2MinMax = aComp2Group2MinMax[0]; + VISU::TGroup2MinMax& aGroup2AverageMinMax = aComp2Group2AverageMinMax[0]; + + for(TInt iElem = 0; iElem < aNbElem; iElem++){ + typename TimeStampValueType::TTMeshValue::TCValueSliceArr aMValueSliceArr = aMMeshValue.GetGaussValueSliceArr(iElem); // get names of groups, to which the element belongs VISU::TNames aGroupNames; @@ -1653,24 +1771,20 @@ BuildTimeStampMinMax(MED::SharedPtr theTimeStampValue, if(aFamilyIter != aFamilyIDMap.end()){ VISU::PMEDFamily aFamily = aFamilyIter->second; aGroupNames = aFamily->myGroupNames; - VISU::TNames::const_iterator aGroupIter = aGroupNames.begin(); - for(; aGroupIter != aGroupNames.end(); aGroupIter++) - aGroup2AverageValue[*aGroupIter] = 0.0; } } } - for(TInt iGauss = 0; iGauss < aNbGauss; iGauss++){ - const vtkFloatingPointType& aVal = aMValueSlice[iGauss]; - aMin = isnan(aVal) ? aVal : std::min(aMin,aVal); - aMax = isnan(aVal) ? aVal : std::max(aMax,aVal); - if(isAverageByGaussPoints){ - anAverageValue += aVal; - } - else { - anAverageMin = aMin; - anAverageMax = aMax; - } + for(TInt iGauss = 0; iGauss < aNbGauss; iGauss++){ + const typename TimeStampValueType::TTMeshValue::TCValueSlice& aMValueSlice = aMValueSliceArr[iGauss]; + vtkFloatingPointType aValue = 0.0; + for(TInt iComp = 0; iComp < theNbComp2; iComp++){ + vtkFloatingPointType aVal = aMValueSlice[iComp]; + aValue += aVal*aVal; + } + aValue = sqrt(aValue); + aMin = isnan(aValue) ? aValue : std::min(aMin,aValue); + aMax = isnan(aValue) ? aValue : std::max(aMax,aValue); // additional calculation for each group, to which the element belongs VISU::TNames::const_iterator aGroupIter = aGroupNames.begin(); @@ -1680,134 +1794,58 @@ BuildTimeStampMinMax(MED::SharedPtr theTimeStampValue, VISU::TMinMax& aGroupMinMax = aGroup2MinMax[aGroupName]; vtkFloatingPointType& aGroupMin = aGroupMinMax.first; vtkFloatingPointType& aGroupMax = aGroupMinMax.second; - aGroupMin = isGroupFound ? std::min(aGroupMin,aVal) : aVal; - aGroupMax = isGroupFound ? std::max(aGroupMax,aVal) : aVal; - - if(isAverageByGaussPoints){ - aGroup2AverageValue[aGroupName] = aGroup2AverageValue[aGroupName] + aVal; - } - else { - VISU::TMinMax& aGroupAverageMinMax = aGroup2AverageMinMax[aGroupName]; - vtkFloatingPointType& aGroupAverageMin = aGroupAverageMinMax.first; - vtkFloatingPointType& aGroupAverageMax = aGroupAverageMinMax.second; - aGroupAverageMin = aGroupMin; - aGroupAverageMax = aGroupMax; - } + aGroupMin = isGroupFound ? std::min(aGroupMin,aValue) : aValue; + aGroupMax = isGroupFound ? std::max(aGroupMax,aValue) : aValue; } } - if(isAverageByGaussPoints){ - anAverageValue /= aNbGauss; - anAverageMin = std::min(anAverageMin,anAverageValue); - anAverageMax = std::max(anAverageMax,anAverageValue); + if(isAverageByGaussPoints){ + typename TimeStampValueType::TTMeshValue::TCValueSliceArr aMCompValueSliceArr = aMMeshValue.GetCompValueSliceArr(iElem); + vtkFloatingPointType aValue = 0.0; + for(TInt iComp = 0; iComp < theNbComp2; iComp++){ + const typename TimeStampValueType::TTMeshValue::TCValueSlice& aMCompValueSlice = aMCompValueSliceArr[iComp]; + vtkFloatingPointType anAverageValue = aBaseAverageValues[aGaussMetric]; + for(TInt iGauss = 0; iGauss < aNbGauss; iGauss++){ + const vtkFloatingPointType& aVal = aMCompValueSlice[iGauss]; + switch(aGaussMetric) { + case VISU::AVERAGE_METRIC: anAverageValue += aVal; break; + case VISU::MINIMUM_METRIC: anAverageValue = std::min(anAverageValue, aVal); break; + case VISU::MAXIMUM_METRIC: anAverageValue = std::max(anAverageValue, aVal); break; + } + } + if(aGaussMetric == VISU::AVERAGE_METRIC) + anAverageValue /= aNbGauss; + aValue += anAverageValue*anAverageValue; + } + aValue = sqrt(aValue); + anAverageMin = std::min(anAverageMin,aValue); + anAverageMax = std::max(anAverageMax,aValue); + // additional calculation for each group, to which the element belongs VISU::TNames::const_iterator aGroupIter = aGroupNames.begin(); for(; aGroupIter != aGroupNames.end(); aGroupIter++){ VISU::TName aGroupName = *aGroupIter; - vtkFloatingPointType aGroupAverageValue = aGroup2AverageValue[aGroupName] / aNbGauss; bool isGroupFound = aGroup2AverageMinMax.find(aGroupName) != aGroup2AverageMinMax.end(); VISU::TMinMax& aGroupAverageMinMax = aGroup2AverageMinMax[aGroupName]; vtkFloatingPointType& aGroupAverageMin = aGroupAverageMinMax.first; vtkFloatingPointType& aGroupAverageMax = aGroupAverageMinMax.second; - aGroupAverageMin = isGroupFound ? std::min(aGroupAverageMin,aGroupAverageValue) : aGroupAverageValue; - aGroupAverageMax = isGroupFound ? std::max(aGroupAverageMax,aGroupAverageValue) : aGroupAverageValue; - } - } - } - } - - // To calculate min/max per vector modulus - VISU::TMinMax& aMinMax = theMinMaxArr[0]; - vtkFloatingPointType& aMin = aMinMax.first; - vtkFloatingPointType& aMax = aMinMax.second; - VISU::TMinMax& anAverageMinMax = theAverageMinMaxArr[0]; - vtkFloatingPointType& anAverageMin = anAverageMinMax.first; - vtkFloatingPointType& anAverageMax = anAverageMinMax.second; - - VISU::TGroup2MinMax& aGroup2MinMax = theGroup2MinMaxArr[0]; - VISU::TGroup2MinMax& aGroup2AverageMinMax = theGroup2AverageMinMaxArr[0]; - - for(TInt iElem = 0; iElem < aNbElem; iElem++){ - typename TimeStampValueType::TTMeshValue::TCValueSliceArr aMValueSliceArr = aMMeshValue.GetGaussValueSliceArr(iElem); - - // get names of groups, to which the element belongs - VISU::TNames aGroupNames; - VISU::TElemID2FamilyID::const_iterator anIter = anElemID2FamilyID.find(iElem); - if(anIter != anElemID2FamilyID.end()){ - int aFamilyId = anIter->second; - if(aFamilyId != 0){ - VISU::TFamilyIDMap::const_iterator aFamilyIter = aFamilyIDMap.find(aFamilyId); - if(aFamilyIter != aFamilyIDMap.end()){ - VISU::PMEDFamily aFamily = aFamilyIter->second; - aGroupNames = aFamily->myGroupNames; + aGroupAverageMin = isGroupFound ? std::min(aGroupAverageMin,aValue) : aValue; + aGroupAverageMax = isGroupFound ? std::max(aGroupAverageMax,aValue) : aValue; } } - } + else { + anAverageMin = aMin; + anAverageMax = aMax; - for(TInt iGauss = 0; iGauss < aNbGauss; iGauss++){ - const typename TimeStampValueType::TTMeshValue::TCValueSlice& aMValueSlice = aMValueSliceArr[iGauss]; - vtkFloatingPointType aValue = 0.0; - for(TInt iComp = 0; iComp < theNbComp2; iComp++){ - vtkFloatingPointType aVal = aMValueSlice[iComp]; - aValue += aVal*aVal; - } - aValue = sqrt(aValue); - aMin = isnan(aValue) ? aValue : std::min(aMin,aValue); - aMax = isnan(aValue) ? aValue : std::max(aMax,aValue); - - // additional calculation for each group, to which the element belongs - VISU::TNames::const_iterator aGroupIter = aGroupNames.begin(); - for(; aGroupIter != aGroupNames.end(); aGroupIter++){ - VISU::TName aGroupName = *aGroupIter; - bool isGroupFound = aGroup2MinMax.find(aGroupName) != aGroup2MinMax.end(); - VISU::TMinMax& aGroupMinMax = aGroup2MinMax[aGroupName]; - vtkFloatingPointType& aGroupMin = aGroupMinMax.first; - vtkFloatingPointType& aGroupMax = aGroupMinMax.second; - aGroupMin = isGroupFound ? std::min(aGroupMin,aValue) : aValue; - aGroupMax = isGroupFound ? std::max(aGroupMax,aValue) : aValue; - } - } - if(isAverageByGaussPoints){ - typename TimeStampValueType::TTMeshValue::TCValueSliceArr aMCompValueSliceArr = aMMeshValue.GetCompValueSliceArr(iElem); - vtkFloatingPointType aValue = 0.0; - for(TInt iComp = 0; iComp < theNbComp2; iComp++){ - const typename TimeStampValueType::TTMeshValue::TCValueSlice& aMCompValueSlice = aMCompValueSliceArr[iComp]; - vtkFloatingPointType anAverageValue = 0.0; - for(TInt iGauss = 0; iGauss < aNbGauss; iGauss++){ - const vtkFloatingPointType& aVal = aMCompValueSlice[iGauss]; - anAverageValue += aVal; - } - anAverageValue /= aNbGauss; - aValue += anAverageValue*anAverageValue; - } - aValue = sqrt(aValue); - anAverageMin = std::min(anAverageMin,aValue); - anAverageMax = std::max(anAverageMax,aValue); - - // additional calculation for each group, to which the element belongs - VISU::TNames::const_iterator aGroupIter = aGroupNames.begin(); - for(; aGroupIter != aGroupNames.end(); aGroupIter++){ - VISU::TName aGroupName = *aGroupIter; - bool isGroupFound = aGroup2AverageMinMax.find(aGroupName) != aGroup2AverageMinMax.end(); - VISU::TMinMax& aGroupAverageMinMax = aGroup2AverageMinMax[aGroupName]; - vtkFloatingPointType& aGroupAverageMin = aGroupAverageMinMax.first; - vtkFloatingPointType& aGroupAverageMax = aGroupAverageMinMax.second; - aGroupAverageMin = isGroupFound ? std::min(aGroupAverageMin,aValue) : aValue; - aGroupAverageMax = isGroupFound ? std::max(aGroupAverageMax,aValue) : aValue; - } - } - else { - anAverageMin = aMin; - anAverageMax = aMax; - - // additional calculation for each group, to which the element belongs - VISU::TNames::const_iterator aGroupIter = aGroupNames.begin(); - for(; aGroupIter != aGroupNames.end(); aGroupIter++){ - VISU::TName aGroupName = *aGroupIter; - VISU::TMinMax& aGroupAverageMinMax = aGroup2AverageMinMax[aGroupName]; - vtkFloatingPointType& aGroupAverageMin = aGroupAverageMinMax.first; - vtkFloatingPointType& aGroupAverageMax = aGroupAverageMinMax.second; - aGroupAverageMin = aGroup2MinMax[aGroupName].first; - aGroupAverageMax = aGroup2MinMax[aGroupName].second; + // additional calculation for each group, to which the element belongs + VISU::TNames::const_iterator aGroupIter = aGroupNames.begin(); + for(; aGroupIter != aGroupNames.end(); aGroupIter++){ + VISU::TName aGroupName = *aGroupIter; + VISU::TMinMax& aGroupAverageMinMax = aGroup2AverageMinMax[aGroupName]; + vtkFloatingPointType& aGroupAverageMin = aGroupAverageMinMax.first; + vtkFloatingPointType& aGroupAverageMax = aGroupAverageMinMax.second; + aGroupAverageMin = aGroup2MinMax[aGroupName].first; + aGroupAverageMax = aGroup2MinMax[aGroupName].second; + } } } } @@ -1893,10 +1931,10 @@ VISU_MedConvertor else if(aNbComp > 4) aNbComp2 = 3; - VISU::TMinMaxArr& aMinMaxArr = aField->myMinMaxArr; - VISU::TMinMaxArr& anAverageMinMaxArr = aField->myAverageMinMaxArr; - VISU::TGroup2MinMaxArr& aGroup2MinMaxArr = aField->myGroup2MinMaxArr; - VISU::TGroup2MinMaxArr& aGroup2AverageMinMaxArr = aField->myGroup2AverageMinMaxArr; + VISU::TMetric2Comp2MinMax& aMetric2Comp2MinMax = aField->myMetric2Comp2MinMax; + VISU::TMetric2Comp2MinMax& aMetric2Comp2AverageMinMax = aField->myMetric2Comp2AverageMinMax; + VISU::TMetric2Comp2Group2MinMax& aMetric2Comp2Group2MinMax = aField->myMetric2Comp2Group2MinMax; + VISU::TMetric2Comp2Group2MinMax& aMetric2Comp2Group2AverageMinMax = aField->myMetric2Comp2Group2AverageMinMax; TSetIsDone aSetIsDone(aField->myIsMinMaxInitilized); for(TInt iTimeStamp = aNbTimeStamps; iTimeStamp >= 1; iTimeStamp--){ VISU::TTimerLog aTimerLog(MYDEBUG,"BuildMinMax - GetPTimeStampInfo()"); @@ -1925,20 +1963,20 @@ VISU_MedConvertor BuildTimeStampMinMax(CastToFloatTimeStampValue(aTimeStampValue), aMeshOnEntity, aGeom2Gauss, - aMinMaxArr, - anAverageMinMaxArr, - aGroup2MinMaxArr, - aGroup2AverageMinMaxArr, + aMetric2Comp2MinMax, + aMetric2Comp2AverageMinMax, + aMetric2Comp2Group2MinMax, + aMetric2Comp2Group2AverageMinMax, aNbComp, aNbComp2); else BuildTimeStampMinMax(CastToIntTimeStampValue(aTimeStampValue), aMeshOnEntity, aGeom2Gauss, - aMinMaxArr, - anAverageMinMaxArr, - aGroup2MinMaxArr, - aGroup2AverageMinMaxArr, + aMetric2Comp2MinMax, + aMetric2Comp2AverageMinMax, + aMetric2Comp2Group2MinMax, + aMetric2Comp2Group2AverageMinMax, aNbComp, aNbComp2); diff --git a/src/CONVERTOR/VISU_MeshValue.cxx b/src/CONVERTOR/VISU_MeshValue.cxx index a4cee766..b26b95ff 100644 --- a/src/CONVERTOR/VISU_MeshValue.cxx +++ b/src/CONVERTOR/VISU_MeshValue.cxx @@ -230,7 +230,8 @@ namespace VISU void Execute(const PFieldImpl& theField, - const PValForTimeImpl& theValForTime) + const PValForTimeImpl& theValForTime, + const TGaussMetric theGaussMetric = VISU::AVERAGE_METRIC) { vtkIdType aNbComp = theField->myNbComp; vtkIdType aSize = std::max(vtkIdType(3), aNbComp); @@ -257,9 +258,19 @@ namespace VISU const typename TMeshValue::TCValueSlice& aValueSlice = aValueSliceArr[iComp]; aDataValues[iComp] = TVTKBasicType(); for(vtkIdType iGauss = 0; iGauss < aNbGauss; iGauss++){ - aDataValues[iComp] += aValueSlice[iGauss]; + TVTKBasicType aValue = aValueSlice[iGauss]; + if( iGauss == 0 && theGaussMetric != VISU::AVERAGE_METRIC ) { + aDataValues[iComp] = aValue; + continue; + } + switch( theGaussMetric ) { + case VISU::AVERAGE_METRIC: aDataValues[iComp] += aValue; break; + case VISU::MINIMUM_METRIC: aDataValues[iComp] = std::min( aValue, aDataValues[iComp] ); break; + case VISU::MAXIMUM_METRIC: aDataValues[iComp] = std::max( aValue, aDataValues[iComp] ); break; + } } - aDataValues[iComp] /= aNbGauss; + if( theGaussMetric == VISU::AVERAGE_METRIC ) + aDataValues[iComp] /= aNbGauss; } this->myDataArrayHolder->SetTuple(aTupleId, &aDataValues[0]); } @@ -345,6 +356,28 @@ namespace VISU typedef TDataArrayHolder2 TTDataArrayHolder2; PDataArrayHolder aDataArrayHolder(new TTDataArrayHolder2(aSelectedDataArray, aFullDataArray)); TTimeStampOnProfileInitArray(aDataArrayHolder).Execute(theField, theValForTime); + + if ( theValForTime->GetMaxNbGauss() > 1 ) { // at least one of geometry contains multiple gauss points + TVTKDataArray *aGaussMinDataArray = TVTKDataArray::New(); + aGaussMinDataArray->SetNumberOfComponents( aNbComp ); + aGaussMinDataArray->SetNumberOfTuples( aNbTuples ); + aGaussMinDataArray->SetName( "VISU_FIELD_GAUSS_MIN" ); + aDataSetAttributes->AddArray( aGaussMinDataArray ); + + PDataArrayHolder aGaussMinDataArrayHolder(new TTDataArrayHolder(aGaussMinDataArray)); + TTimeStampOnProfileInitArray(aGaussMinDataArrayHolder).Execute(theField, theValForTime, VISU::MINIMUM_METRIC); + aGaussMinDataArray->Delete(); + + TVTKDataArray *aGaussMaxDataArray = TVTKDataArray::New(); + aGaussMaxDataArray->SetNumberOfComponents( aNbComp ); + aGaussMaxDataArray->SetNumberOfTuples( aNbTuples ); + aGaussMaxDataArray->SetName( "VISU_FIELD_GAUSS_MAX" ); + aDataSetAttributes->AddArray( aGaussMaxDataArray ); + + PDataArrayHolder aGaussMaxDataArrayHolder(new TTDataArrayHolder(aGaussMaxDataArray)); + TTimeStampOnProfileInitArray(aGaussMaxDataArrayHolder).Execute(theField, theValForTime, VISU::MAXIMUM_METRIC); + aGaussMaxDataArray->Delete(); + } } aSelectedDataArray->Delete(); diff --git a/src/CONVERTOR/VISU_Structures.hxx b/src/CONVERTOR/VISU_Structures.hxx index 4e877ccd..d9f08fb0 100644 --- a/src/CONVERTOR/VISU_Structures.hxx +++ b/src/CONVERTOR/VISU_Structures.hxx @@ -231,12 +231,16 @@ namespace VISU */ virtual TMinMax - GetMinMax(vtkIdType theCompID, const TNames& theGroupNames) = 0; + GetMinMax(vtkIdType theCompID, + const TNames& theGroupNames, + TGaussMetric theGaussMetric = VISU::AVERAGE_METRIC) = 0; //! Calculate average min/max values for each of the MED FIELD components among all its timestamps virtual TMinMax - GetAverageMinMax(vtkIdType theCompID, const TNames& theGroupNames) = 0; + GetAverageMinMax(vtkIdType theCompID, + const TNames& theGroupNames, + TGaussMetric theGaussMetric = VISU::AVERAGE_METRIC) = 0; bool myIsMinMaxInitilized; //!< Is the min / max values are calculated @@ -265,6 +269,11 @@ namespace VISU PProfile myProfile; //!< Contains corresponding MED PROFILE where the MED TIEMSTMAP attached to PGaussMesh myGaussMesh; + + //! Get maximum number of Gauss Points among all geometrical types (provided for convenience) + virtual + int + GetMaxNbGauss() const = 0; }; diff --git a/src/CONVERTOR/VISU_Structures_impl.cxx b/src/CONVERTOR/VISU_Structures_impl.cxx index cdb78dbd..3931c1e9 100644 --- a/src/CONVERTOR/VISU_Structures_impl.cxx +++ b/src/CONVERTOR/VISU_Structures_impl.cxx @@ -705,6 +705,8 @@ namespace VISU aFilter->SetScalars( aDataSet ); aFilter->SetVectors( aDataSet ); aFilter->AddField( "VISU_FIELD", aDataSet ); + aFilter->AddField( "VISU_FIELD_GAUSS_MIN", aDataSet ); + aFilter->AddField( "VISU_FIELD_GAUSS_MAX", aDataSet ); aFilter->AddField( "VISU_CELLS_MAPPER", aDataSet ); aFilter->AddField( "ELNO_FIELD", aDataSet ); aFilter->AddField( "ELNO_COMPONENT_MAPPER", aDataSet ); @@ -811,6 +813,8 @@ namespace VISU aFilter->SetScalars( aDataSet ); aFilter->SetVectors( aDataSet ); aFilter->AddField( "VISU_FIELD", aDataSet ); + aFilter->AddField( "VISU_FIELD_GAUSS_MIN", aDataSet ); + aFilter->AddField( "VISU_FIELD_GAUSS_MAX", aDataSet ); aFilter->AddField( "VISU_CELLS_MAPPER", aDataSet ); aFilter->AddField( "VISU_POINTS_MAPPER", aDataSet ); } @@ -1369,17 +1373,29 @@ namespace VISU myDataType = theDataType; myCompNames.resize(theNbComp); myUnitNames.resize(theNbComp); - myMinMaxArr.resize(theNbComp + 1); - myAverageMinMaxArr.resize(theNbComp + 1); - myGroup2MinMaxArr.resize(theNbComp + 1); - myGroup2AverageMinMaxArr.resize(theNbComp + 1); - for(vtkIdType iComp = 0; iComp <= theNbComp; iComp++){ - TMinMax& aMinMax = myMinMaxArr[iComp]; - aMinMax.first = VTK_LARGE_FLOAT; - aMinMax.second = -VTK_LARGE_FLOAT; - TMinMax& anAverageMinMax = myAverageMinMaxArr[iComp]; - anAverageMinMax.first = VTK_LARGE_FLOAT; - anAverageMinMax.second = -VTK_LARGE_FLOAT; + + myMetric2Comp2MinMax.resize(3); + myMetric2Comp2AverageMinMax.resize(3); + myMetric2Comp2Group2MinMax.resize(3); + myMetric2Comp2Group2AverageMinMax.resize(3); + for(int aGaussMetric = (int)VISU::AVERAGE_METRIC; aGaussMetric <= (int)VISU::MAXIMUM_METRIC; aGaussMetric++){ + TComp2MinMax& aComp2MinMax = myMetric2Comp2MinMax[aGaussMetric]; + TComp2MinMax& aComp2AverageMinMax = myMetric2Comp2AverageMinMax[aGaussMetric]; + TComp2Group2MinMax& aComp2Group2MinMax = myMetric2Comp2Group2MinMax[aGaussMetric]; + TComp2Group2MinMax& aComp2Group2AverageMinMax = myMetric2Comp2Group2AverageMinMax[aGaussMetric]; + + aComp2MinMax.resize(theNbComp + 1); + aComp2AverageMinMax.resize(theNbComp + 1); + aComp2Group2MinMax.resize(theNbComp + 1); + aComp2Group2AverageMinMax.resize(theNbComp + 1); + for(vtkIdType iComp = 0; iComp <= theNbComp; iComp++){ + TMinMax& aMinMax = aComp2MinMax[iComp]; + aMinMax.first = VTK_LARGE_FLOAT; + aMinMax.second = -VTK_LARGE_FLOAT; + TMinMax& anAverageMinMax = aComp2AverageMinMax[iComp]; + anAverageMinMax.first = VTK_LARGE_FLOAT; + anAverageMinMax.second = -VTK_LARGE_FLOAT; + } } } @@ -1392,7 +1408,7 @@ namespace VISU TMinMax TFieldImpl - ::GetMinMax(vtkIdType theCompID, const TNames& theGroupNames) + ::GetMinMax(vtkIdType theCompID, const TNames& theGroupNames, TGaussMetric theGaussMetric) { TMinMax aMinMax; bool anIsMinMaxInitialized = false; @@ -1400,7 +1416,7 @@ namespace VISU aMinMax.first = VTK_LARGE_FLOAT; aMinMax.second = -VTK_LARGE_FLOAT; - const TGroup2MinMax& aGroup2MinMax = myGroup2MinMaxArr[theCompID]; + const TGroup2MinMax& aGroup2MinMax = myMetric2Comp2Group2MinMax[theGaussMetric][theCompID]; TNames::const_iterator aNameIter = theGroupNames.begin(); for( ; aNameIter != theGroupNames.end(); aNameIter++ ) { TGroup2MinMax::const_iterator aGroup2MinMaxIter = aGroup2MinMax.find( *aNameIter ); @@ -1414,7 +1430,7 @@ namespace VISU } if( !anIsMinMaxInitialized ) - aMinMax = myMinMaxArr[theCompID]; + aMinMax = myMetric2Comp2MinMax[theGaussMetric][theCompID]; return aMinMax; } @@ -1422,7 +1438,7 @@ namespace VISU TMinMax TFieldImpl - ::GetAverageMinMax(vtkIdType theCompID, const TNames& theGroupNames) + ::GetAverageMinMax(vtkIdType theCompID, const TNames& theGroupNames, TGaussMetric theGaussMetric) { TMinMax aMinMax; bool anIsMinMaxInitialized = false; @@ -1430,7 +1446,7 @@ namespace VISU aMinMax.first = VTK_LARGE_FLOAT; aMinMax.second = -VTK_LARGE_FLOAT; - const TGroup2MinMax& aGroup2MinMax = myGroup2AverageMinMaxArr[theCompID]; + const TGroup2MinMax& aGroup2MinMax = myMetric2Comp2Group2AverageMinMax[theGaussMetric][theCompID]; TNames::const_iterator aNameIter = theGroupNames.begin(); for( ; aNameIter != theGroupNames.end(); aNameIter++ ) { TGroup2MinMax::const_iterator aGroup2MinMaxIter = aGroup2MinMax.find( *aNameIter ); @@ -1444,7 +1460,7 @@ namespace VISU } if( !anIsMinMaxInitialized ) - aMinMax = myAverageMinMaxArr[theCompID]; + aMinMax = myMetric2Comp2AverageMinMax[theGaussMetric][theCompID]; return aMinMax; } @@ -1546,6 +1562,18 @@ namespace VISU return anIter->second; } + int + TValForTimeImpl + ::GetMaxNbGauss() const + { + int aNbGauss = 1; + TGeom2NbGauss::const_iterator anIter = myGeom2NbGauss.begin(); + for(; anIter != myGeom2NbGauss.end(); anIter++){ + aNbGauss = std::max(aNbGauss, anIter->second); + } + return aNbGauss; + } + unsigned long int TValForTimeImpl ::GetMemorySize() diff --git a/src/CONVERTOR/VISU_Structures_impl.hxx b/src/CONVERTOR/VISU_Structures_impl.hxx index eebf3dd1..baec9a32 100644 --- a/src/CONVERTOR/VISU_Structures_impl.hxx +++ b/src/CONVERTOR/VISU_Structures_impl.hxx @@ -786,10 +786,12 @@ namespace VISU //--------------------------------------------------------------- - typedef TVector TMinMaxArr; + typedef TVector TComp2MinMax; + typedef TVector TMetric2Comp2MinMax; - typedef std::map TGroup2MinMax; - typedef TVector TGroup2MinMaxArr; + typedef std::map TGroup2MinMax; + typedef TVector TComp2Group2MinMax; + typedef TVector TMetric2Comp2Group2MinMax; //! Specialize TField to provide VTK mapping for the entity struct VISU_CONVERTOR_EXPORT TFieldImpl: virtual TField @@ -808,21 +810,21 @@ namespace VISU //! Implement the TField::GetMinMax virtual TMinMax - GetMinMax(vtkIdType theCompID, const TNames& theGroupNames); + GetMinMax(vtkIdType theCompID, const TNames& theGroupNames, TGaussMetric theGaussMetric = VISU::AVERAGE_METRIC); //! Implement the TField::GetAverageMinMax virtual TMinMax - GetAverageMinMax(vtkIdType theCompID, const TNames& theGroupNames); + GetAverageMinMax(vtkIdType theCompID, const TNames& theGroupNames, TGaussMetric theGaussMetric = VISU::AVERAGE_METRIC); vtkIdType myDataSize; //!< Keeps size of the assigned data vtkIdType myDataType; //!< Keeps type idetificator of the mesh data - TMinMaxArr myMinMaxArr; //!< Keeps min/max values for each component of the MED FIELD - TMinMaxArr myAverageMinMaxArr; //!< Keeps average by Gauss Points min/max values for each component of the MED FIELD - //!< If Nb of Gauss Points <=1 myAverageMinMaxArr equal myMinMaxArr + TMetric2Comp2MinMax myMetric2Comp2MinMax; //!< Keeps min/max values for each component of the MED FIELD + TMetric2Comp2MinMax myMetric2Comp2AverageMinMax; //!< Keeps average by Gauss Points min/max values for each component of the MED FIELD + //!< If Nb of Gauss Points <=1 myAverageMinMaxArr equal myMinMaxArr - TGroup2MinMaxArr myGroup2MinMaxArr; - TGroup2MinMaxArr myGroup2AverageMinMaxArr; + TMetric2Comp2Group2MinMax myMetric2Comp2Group2MinMax; + TMetric2Comp2Group2MinMax myMetric2Comp2Group2AverageMinMax; }; @@ -892,6 +894,11 @@ namespace VISU int GetNbGauss(EGeometry theGeom) const; + //! Get maximum number of Gauss Points among all geometrical types (provided for convenience) + virtual + int + GetMaxNbGauss() const; + //! Gets memory size used by the instance (bytes). virtual unsigned long int diff --git a/src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.cxx b/src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.cxx index 2da76c09..3297e520 100644 --- a/src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.cxx +++ b/src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.cxx @@ -471,3 +471,24 @@ VISU_DeformedShapeAndScalarMapPL if (isnan(theRange[0]) || isnan(theRange[1])) throw std::runtime_error("NAN values in the presentation"); } + + +//---------------------------------------------------------------------------- +void +VISU_DeformedShapeAndScalarMapPL +::SetGaussMetric(VISU::TGaussMetric theGaussMetric) +{ + if(GetGaussMetric() == theGaussMetric) + return; + + myScalarsExtractor->SetGaussMetric(theGaussMetric); +} + + +//---------------------------------------------------------------------------- +VISU::TGaussMetric +VISU_DeformedShapeAndScalarMapPL +::GetGaussMetric() +{ + return myScalarsExtractor->GetGaussMetric(); +} diff --git a/src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.hxx b/src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.hxx index 05eedb53..f211f24b 100644 --- a/src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.hxx +++ b/src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.hxx @@ -82,6 +82,14 @@ public: void GetSourceRange(vtkFloatingPointType theRange[2]); + virtual + void + SetGaussMetric(VISU::TGaussMetric theGaussMetric); + + virtual + VISU::TGaussMetric + GetGaussMetric(); + virtual void SetScalars(vtkDataSet *theScalars); diff --git a/src/PIPELINE/VISU_Extractor.cxx b/src/PIPELINE/VISU_Extractor.cxx index 0a53d675..575f787d 100644 --- a/src/PIPELINE/VISU_Extractor.cxx +++ b/src/PIPELINE/VISU_Extractor.cxx @@ -26,6 +26,7 @@ #include "VISU_Extractor.hxx" #include "VISU_PipeLineUtils.hxx" #include "VISU_ConvertorUtils.hxx" +#include "VISU_MeshValue.hxx" #include @@ -45,7 +46,8 @@ vtkStandardNewMacro(VISU_Extractor); //---------------------------------------------------------------------------- VISU_Extractor ::VISU_Extractor(): - myScalarMode(1) + myScalarMode(1), + myGaussMetric(VISU::AVERAGE_METRIC) { } @@ -76,6 +78,26 @@ VISU_Extractor } +//---------------------------------------------------------------------------- +void +VISU_Extractor +::SetGaussMetric(VISU::TGaussMetric theGaussMetric) +{ + if(myGaussMetric != theGaussMetric){ + myGaussMetric = theGaussMetric; + Modified(); + } +} + +//---------------------------------------------------------------------------- +VISU::TGaussMetric +VISU_Extractor +::GetGaussMetric() +{ + return myGaussMetric; +} + + //---------------------------------------------------------------------------- template void @@ -119,13 +141,22 @@ Component2Scalars(vtkDataArray *theInputDataArray, template void ExecuteScalars(vtkIdType theNbOfTuples, vtkIdType theScalarMode, + VISU::TGaussMetric theGaussMetric, TDataSetAttributesType* theInputData, TDataSetAttributesType* theOutputData) { if(theNbOfTuples < 1) return; - vtkDataArray* aFieldArray = theInputData->GetArray("VISU_FIELD"); + vtkDataArray* aFieldArray = NULL; + switch( theGaussMetric ) { + case VISU::AVERAGE_METRIC: aFieldArray = theInputData->GetArray("VISU_FIELD"); break; + case VISU::MINIMUM_METRIC: aFieldArray = theInputData->GetArray("VISU_FIELD_GAUSS_MIN"); break; + case VISU::MAXIMUM_METRIC: aFieldArray = theInputData->GetArray("VISU_FIELD_GAUSS_MAX"); break; + } + if( !aFieldArray ) + return; + vtkIdType anInputDataType = aFieldArray->GetDataType(); vtkDataArray *anOutputScalars = vtkDataArray::CreateDataArray(anInputDataType); anOutputScalars->SetNumberOfComponents(1); @@ -179,7 +210,7 @@ VISU_Extractor if ( VISU::IsDataOnPoints( anInput ) ) { int aNbElems = anInput->GetNumberOfPoints(); if ( anInputPointData->GetAttribute( vtkDataSetAttributes::VECTORS ) ) - ExecuteScalars( aNbElems, myScalarMode, anInputPointData, anOutputPointData ); + ExecuteScalars( aNbElems, myScalarMode, myGaussMetric, anInputPointData, anOutputPointData ); } vtkCellData *anInputCellData = anInput->GetCellData(); @@ -188,7 +219,7 @@ VISU_Extractor if ( VISU::IsDataOnCells( anInput ) ) { int aNbElems = anInput->GetNumberOfCells(); if ( anInputCellData->GetAttribute( vtkDataSetAttributes::VECTORS ) ) - ExecuteScalars( aNbElems, myScalarMode, anInputCellData, anOutputCellData ); + ExecuteScalars( aNbElems, myScalarMode, myGaussMetric, anInputCellData, anOutputCellData ); } return 1; diff --git a/src/PIPELINE/VISU_Extractor.hxx b/src/PIPELINE/VISU_Extractor.hxx index 53f038bd..5d6b8874 100644 --- a/src/PIPELINE/VISU_Extractor.hxx +++ b/src/PIPELINE/VISU_Extractor.hxx @@ -28,6 +28,7 @@ #define VISU_Extractor_HeaderFile #include "VISUPipeline.hxx" +#include "VISU_ConvertorDef.hxx" #include @@ -49,6 +50,14 @@ public: void SetScalarMode(int theScalarMode = 0); + virtual + VISU::TGaussMetric + GetGaussMetric(); + + virtual + void + SetGaussMetric(VISU::TGaussMetric theGaussMetric = VISU::AVERAGE_METRIC); + protected: VISU_Extractor(); VISU_Extractor(const VISU_Extractor&); @@ -60,6 +69,7 @@ protected: RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *); int myScalarMode; + VISU::TGaussMetric myGaussMetric; }; #endif diff --git a/src/PIPELINE/VISU_ScalarMapPL.cxx b/src/PIPELINE/VISU_ScalarMapPL.cxx index 9786e6e0..35a0a1d2 100644 --- a/src/PIPELINE/VISU_ScalarMapPL.cxx +++ b/src/PIPELINE/VISU_ScalarMapPL.cxx @@ -27,6 +27,7 @@ #include "VISU_ScalarMapPL.hxx" #include "VISU_DataSetMapperHolder.hxx" #include "VISU_ElnoAssembleFilter.hxx" +#include "VISU_Extractor.hxx" #include "VISU_FieldTransform.hxx" #include "VISU_AppendFilter.hxx" @@ -114,6 +115,8 @@ VISU_ScalarMapPL myMergeFilter->RemoveFields(); myMergeFilter->AddField("VISU_FIELD", aDataSet); + myMergeFilter->AddField("VISU_FIELD_GAUSS_MIN", aDataSet); + myMergeFilter->AddField("VISU_FIELD_GAUSS_MAX", aDataSet); myMergeFilter->AddField("VISU_CELLS_MAPPER", aDataSet); myMergeFilter->AddField("VISU_POINTS_MAPPER", aDataSet); myMergeFilter->AddField("ELNO_POINT_COORDS", aDataSet); @@ -153,6 +156,9 @@ VISU_ScalarMapPL { Superclass::DoShallowCopy(thePipeLine, theIsCopyInput); VISU_MergedPL::DoShallowCopy(thePipeLine, theIsCopyInput); + + if(VISU_ScalarMapPL* aPipeLine = dynamic_cast(thePipeLine)) + SetGaussMetric(aPipeLine->GetGaussMetric()); } @@ -243,6 +249,27 @@ VISU_ScalarMapPL } +//---------------------------------------------------------------------------- +void +VISU_ScalarMapPL +::SetGaussMetric(VISU::TGaussMetric theGaussMetric) +{ + if(GetGaussMetric() == theGaussMetric) + return; + + GetExtractorFilter()->SetGaussMetric(theGaussMetric); +} + + +//---------------------------------------------------------------------------- +VISU::TGaussMetric +VISU_ScalarMapPL +::GetGaussMetric() +{ + return GetExtractorFilter()->GetGaussMetric(); +} + + //---------------------------------------------------------------------------- vtkDataSet* VISU_ScalarMapPL diff --git a/src/PIPELINE/VISU_ScalarMapPL.hxx b/src/PIPELINE/VISU_ScalarMapPL.hxx index 5db2f3b5..e504112b 100644 --- a/src/PIPELINE/VISU_ScalarMapPL.hxx +++ b/src/PIPELINE/VISU_ScalarMapPL.hxx @@ -86,6 +86,14 @@ public: void GetSourceRange(vtkFloatingPointType theRange[2]); + virtual + void + SetGaussMetric(VISU::TGaussMetric theGaussMetric); + + virtual + VISU::TGaussMetric + GetGaussMetric(); + //---------------------------------------------------------------------------- virtual vtkPointSet* diff --git a/src/VISUGUI/VISU_msg_en.ts b/src/VISUGUI/VISU_msg_en.ts index 1c75f4a1..6e63b378 100644 --- a/src/VISUGUI/VISU_msg_en.ts +++ b/src/VISUGUI/VISU_msg_en.ts @@ -189,6 +189,26 @@ number of time stamps or number of components is not the same! VISU_FONT_TIMES Times + + VISU_GAUSS_METRIC + Gauss Metric + + + VISU_GAUSS_METRIC_AVERAGE + Average + + + VISU_GAUSS_METRIC_MAXIMUM + Maximum + + + VISU_GAUSS_METRIC_MINIMUM + Minimum + + + VISU_GAUSS_METRIC_TOOLTIP + Select the data to display on the cell + VISU_HEIGHT Height: diff --git a/src/VISUGUI/VisuGUI.cxx b/src/VISUGUI/VisuGUI.cxx index 11011105..befa55e7 100644 --- a/src/VISUGUI/VisuGUI.cxx +++ b/src/VISUGUI/VisuGUI.cxx @@ -3489,6 +3489,8 @@ void VisuGUI::createPreferences() setPreferenceProperty( mode, "strings", modes ); setPreferenceProperty( mode, "indexes", indices ); + addPreference( tr( "VISU_LOGARITHMIC_SCALING" ), rangeGr, LightApp_Preferences::Bool, "VISU", "scalar_bar_logarithmic" ); + int rangetype = addPreference( tr( "VISU_RANGE_TO_USE" ), rangeGr, LightApp_Preferences::Selector, "VISU", "scalar_range_type" ); QStringList types; types.append( tr( "VISU_FIELD_RANGE" ) ); @@ -3499,7 +3501,17 @@ void VisuGUI::createPreferences() setPreferenceProperty( rangetype, "strings", types ); setPreferenceProperty( rangetype, "indexes", indices ); - addPreference( tr( "VISU_LOGARITHMIC_SCALING" ), rangeGr, LightApp_Preferences::Bool, "VISU", "scalar_bar_logarithmic" ); + int gaussMetric = addPreference( tr( "VISU_GAUSS_METRIC" ), rangeGr, LightApp_Preferences::Selector, "VISU", "scalar_gauss_metric" ); + QStringList metrics; + metrics.append( tr( "VISU_GAUSS_METRIC_AVERAGE" ) ); + metrics.append( tr( "VISU_GAUSS_METRIC_MINIMUM" ) ); + metrics.append( tr( "VISU_GAUSS_METRIC_MAXIMUM" ) ); + indices.clear(); + indices.append( 0 ); + indices.append( 1 ); + indices.append( 2 ); + setPreferenceProperty( gaussMetric, "strings", metrics ); + setPreferenceProperty( gaussMetric, "indexes", indices ); int imposedGr = addPreference( tr( "VISU_MINMAX_IMPOSED_RANGE" ), sbarTab ); setPreferenceProperty( imposedGr, "columns", 4 ); diff --git a/src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.cxx b/src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.cxx index b5415a4c..4d65681c 100644 --- a/src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.cxx +++ b/src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.cxx @@ -68,7 +68,7 @@ * Constructor */ VisuGUI_DeformedShapeAndScalarMapDlg::VisuGUI_DeformedShapeAndScalarMapDlg (SalomeApp_Module* theModule) - : VisuGUI_ScalarBarBaseDlg(theModule), + : VisuGUI_ScalarBarBaseDlg(theModule, true), myIsAnimation(false), myUpdateScalars(true), myIsScalarFieldValid(true), diff --git a/src/VISUGUI/VisuGUI_Prs3dDlg.cxx b/src/VISUGUI/VisuGUI_Prs3dDlg.cxx index 8372ddb2..58bbb712 100644 --- a/src/VISUGUI/VisuGUI_Prs3dDlg.cxx +++ b/src/VISUGUI/VisuGUI_Prs3dDlg.cxx @@ -36,6 +36,8 @@ #include "VISUConfig.hh" #include "VISU_Convertor.hxx" +#include "VISU_MeshValue.hxx" +#include "VISU_Structures_impl.hxx" #include "VISU_ScalarMapPL.hxx" #include "VISU_ScalarBarActor.hxx" #include "VISU_ScalarMapAct.h" @@ -528,11 +530,12 @@ void VisuGUI_BarPrefDlg::keyPressEvent( QKeyEvent* e ) /*! Constructor */ -VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) +VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool theIsDisplayGaussMetric, bool thePreview ) : QWidget( parent ), myPreviewActor( 0 ), myScalarMap( 0 ), - myScalarMapPL( 0 ) + myScalarMapPL( 0 ), + myIsDisplayGaussMetric( theIsDisplayGaussMetric ) { QVBoxLayout* aMainLayout = new QVBoxLayout( this ); SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); @@ -575,6 +578,18 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) CBLog = new QCheckBox (tr("LOGARITHMIC_SCALING"), aGB); CBLog->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myGaussMetricLabel = new QLabel( tr("VISU_GAUSS_METRIC"), aGB ); + myGaussMetric = new QComboBox( aGB ); + myGaussMetric->addItem( tr("VISU_GAUSS_METRIC_AVERAGE") ); + myGaussMetric->addItem( tr("VISU_GAUSS_METRIC_MINIMUM") ); + myGaussMetric->addItem( tr("VISU_GAUSS_METRIC_MAXIMUM") ); + myGaussMetric->setToolTip( tr("VISU_GAUSS_METRIC_TOOLTIP") ); + + if( !myIsDisplayGaussMetric ) { + myGaussMetricLabel->hide(); + myGaussMetric->hide(); + } + RBFrange = new QRadioButton (tr("FIELD_RANGE_BTN"), aGB); RBIrange = new QRadioButton (tr("IMPOSED_RANGE_BTN"), aGB); RangeGroup->addButton( RBFrange, 0 ); @@ -602,12 +617,14 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) RangeGroupLayout->addWidget( myModeLbl, 0, 0, 1, 1 ); RangeGroupLayout->addWidget( myModeCombo, 0, 1, 1, 2); RangeGroupLayout->addWidget( CBLog, 0, 3, 1, 1); - RangeGroupLayout->addWidget( RBFrange, 1, 0, 1, 2); - RangeGroupLayout->addWidget( RBIrange, 1, 2, 1, 2); - RangeGroupLayout->addWidget( MinLabel, 2, 0 ); - RangeGroupLayout->addWidget( MinEdit, 2, 1 ); - RangeGroupLayout->addWidget( MaxLabel, 2, 2 ); - RangeGroupLayout->addWidget( MaxEdit, 2, 3 ); + RangeGroupLayout->addWidget( myGaussMetricLabel, 1, 0, 1, 1); + RangeGroupLayout->addWidget( myGaussMetric, 1, 1, 1, 3); + RangeGroupLayout->addWidget( RBFrange, 2, 0, 1, 2); + RangeGroupLayout->addWidget( RBIrange, 2, 2, 1, 2); + RangeGroupLayout->addWidget( MinLabel, 3, 0 ); + RangeGroupLayout->addWidget( MinEdit, 3, 1 ); + RangeGroupLayout->addWidget( MaxLabel, 3, 2 ); + RangeGroupLayout->addWidget( MaxEdit, 3, 3 ); // Colors and Labels ======================================================== QGroupBox* ColLabGroup = new QGroupBox (tr("COLORS_LABELS_GRP"), this); @@ -766,6 +783,7 @@ VisuGUI_ScalarBarPane::VisuGUI_ScalarBarPane( QWidget* parent, bool thePreview ) connect( RBIrange, SIGNAL( toggled( bool ) ), this, SLOT( onImposedRange( bool ) ) ); connect( myModeCombo, SIGNAL( activated( int ) ), this, SLOT( changeScalarMode( int ) ) ); + connect( myGaussMetric, SIGNAL( activated( int ) ), this, SLOT( changeGaussMetric( int ) ) ); connect( OrientGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( changeDefaults( int ) ) ); connect( XSpin, SIGNAL( valueChanged( double ) ), this, SLOT( XYChanged( double ) ) ); connect( YSpin, SIGNAL( valueChanged( double ) ), this, SLOT( XYChanged( double ) ) ); @@ -980,6 +998,24 @@ void VisuGUI_ScalarBarPane::initFromPrsObject(VISU::ColoredPrs3d_i* thePrs) myModeLbl->setEnabled(isScalarMode); myModeCombo->setEnabled(isScalarMode); + // Gauss Metric option should be visible only if at least one + // of mesh values on geometry is based on multiple gauss points + bool isEnableGaussMetric = false; + if( myIsDisplayGaussMetric ) { + const VISU::TValField& aValField = aField->myValField; + VISU::TValField::const_iterator anIter = aValField.find(myScalarMap->GetScalarTimeStampNumber()); + if ( anIter != aValField.end() ) { + VISU::PValForTime aValForTime = anIter->second; + if( aValForTime && aValForTime->GetMaxNbGauss() > 1 ) + isEnableGaussMetric = true; + } + } + + myGaussMetricLabel->setEnabled(isEnableGaussMetric); + myGaussMetric->setEnabled(isEnableGaussMetric); + if( isEnableGaussMetric ) + myGaussMetric->setCurrentIndex((int)myScalarMap->GetGaussMetric()); + setRange( myScalarMap->GetMin(), myScalarMap->GetMax(), myScalarMap->IsRangeFixed() ); setScalarBarData( myScalarMap->GetNbColors(), myScalarMap->GetLabels() ); @@ -1097,6 +1133,9 @@ void VisuGUI_ScalarBarPane::createScalarBar() else myScalarMapPL->SetScaling(VISU::LINEAR); + if( myGaussMetric->isVisible() ) + myScalarMapPL->SetGaussMetric((VISU::TGaussMetric)myGaussMetric->currentIndex()); + if ( RBFrange->isChecked() ) { myScalarMapPL->SetSourceRange(); } else { @@ -1229,6 +1268,8 @@ int VisuGUI_ScalarBarPane::storeToPrsObject(VISU::ColoredPrs3d_i* thePrs) { return 0; myScalarMap->SetScalarMode(myModeCombo->currentIndex()); + if( myGaussMetric->isVisible() ) + myScalarMap->SetGaussMetric((VISU::GaussMetric)myGaussMetric->currentIndex()); myScalarMap->SetPosition(XSpin->value(), YSpin->value()); myScalarMap->SetSize(WidthSpin->value(), HeightSpin->value()); if(RBvert->isChecked()) { @@ -1407,6 +1448,23 @@ void VisuGUI_ScalarBarPane::changeScalarMode( int theMode ) } +//---------------------------------------------------------------------------- +/*! + Called when scalar mode is changed +*/ +void VisuGUI_ScalarBarPane::changeGaussMetric( int theGaussMetric ) +{ + myScalarMap->SetGaussMetric((VISU::GaussMetric)theGaussMetric); + + if ( RBFrange->isChecked() ) { + MinEdit->setText( QString::number( myScalarMap->GetSourceMin() ) ); + MaxEdit->setText( QString::number( myScalarMap->GetSourceMax() ) ); + } + + updatePreview(); +} + + //---------------------------------------------------------------------------- /*! Sets default values and range mode @@ -1684,10 +1742,10 @@ void VisuGUI_Prs3dDlg::keyPressEvent( QKeyEvent* e ) } //---------------------------------------------------------------------------- -VisuGUI_ScalarBarBaseDlg::VisuGUI_ScalarBarBaseDlg( SalomeApp_Module* theModule, bool thePreview ) : +VisuGUI_ScalarBarBaseDlg::VisuGUI_ScalarBarBaseDlg( SalomeApp_Module* theModule, bool theIsDisplayGaussMetric, bool thePreview ) : VisuGUI_Prs3dDlg( theModule ) { - myScalarPane = new VisuGUI_ScalarBarPane(this, thePreview); + myScalarPane = new VisuGUI_ScalarBarPane(this, theIsDisplayGaussMetric, thePreview); myScalarPane->layout()->setMargin( 5 ); } diff --git a/src/VISUGUI/VisuGUI_Prs3dDlg.h b/src/VISUGUI/VisuGUI_Prs3dDlg.h index 734203e6..be4b12d7 100644 --- a/src/VISUGUI/VisuGUI_Prs3dDlg.h +++ b/src/VISUGUI/VisuGUI_Prs3dDlg.h @@ -154,7 +154,7 @@ class VisuGUI_ScalarBarPane : public QWidget//QVBox Q_OBJECT; public: - VisuGUI_ScalarBarPane(QWidget* parent, bool thePreview = FALSE); + VisuGUI_ScalarBarPane(QWidget* parent, bool theIsDisplayGaussMetric = false, bool thePreview = FALSE); ~VisuGUI_ScalarBarPane(); void setRange( double imin, double imax, bool sbRange ); @@ -210,6 +210,8 @@ class VisuGUI_ScalarBarPane : public QWidget//QVBox QLabel* myModeLbl; QComboBox* myModeCombo; + QLabel* myGaussMetricLabel; + QComboBox* myGaussMetric; QPushButton* myTextBtn; QPushButton* myBarBtn; VisuGUI_TextPrefDlg* myTextDlg; @@ -228,6 +230,7 @@ class VisuGUI_ScalarBarPane : public QWidget//QVBox void onImposedRange( bool ); void XYChanged( double ); void changeScalarMode( int ); + void changeGaussMetric( int ); void onTextPref(); void onBarPref(); void onPreviewCheck(bool thePreview); @@ -245,6 +248,7 @@ class VisuGUI_ScalarBarPane : public QWidget//QVBox std::string myTitle; bool myBusy; + bool myIsDisplayGaussMetric; }; @@ -279,7 +283,7 @@ class VisuGUI_ScalarBarBaseDlg : public VisuGUI_Prs3dDlg Q_OBJECT; public: - VisuGUI_ScalarBarBaseDlg( SalomeApp_Module* theModule, bool thePreview = FALSE ); + VisuGUI_ScalarBarBaseDlg( SalomeApp_Module* theModule, bool theIsDisplayGaussMetric = false, bool thePreview = FALSE ); ~VisuGUI_ScalarBarBaseDlg(); virtual void initFromPrsObject( VISU::ColoredPrs3d_i* thePrs, diff --git a/src/VISUGUI/VisuGUI_ScalarBarDlg.cxx b/src/VISUGUI/VisuGUI_ScalarBarDlg.cxx index 40558464..551e2b06 100644 --- a/src/VISUGUI/VisuGUI_ScalarBarDlg.cxx +++ b/src/VISUGUI/VisuGUI_ScalarBarDlg.cxx @@ -69,7 +69,7 @@ using namespace std; Constructor */ VisuGUI_ScalarBarDlg::VisuGUI_ScalarBarDlg (SalomeApp_Module* theModule) - : VisuGUI_ScalarBarBaseDlg(theModule) + : VisuGUI_ScalarBarBaseDlg(theModule, true) { setWindowTitle(tr("DLG_PROP_TITLE")); setSizeGripEnabled(TRUE); diff --git a/src/VISU_I/VISU_DumpPython.cc b/src/VISU_I/VISU_DumpPython.cc index d782714e..14e0e6f3 100644 --- a/src/VISU_I/VISU_DumpPython.cc +++ b/src/VISU_I/VISU_DumpPython.cc @@ -441,6 +441,24 @@ namespace VISU theStr<GetGaussMetric()){ + case AVERAGE: + aParam = "VISU.AVERAGE"; + break; + case MINIMUM: + aParam = "VISU.MINIMUM"; + break; + case MAXIMUM: + aParam = "VISU.MAXIMUM"; + break; + } + theStr<IsRangeFixed()) + theStr<GetMin()<<", "<GetMax()<<")"<(aPrs3d); SetScaling(anOrigin->GetScaling()); + SetGaussMetric(anOrigin->GetGaussMetric()); SetBarVisible(anOrigin->IsBarVisible()); Update(); } @@ -226,6 +227,9 @@ VISU::ScalarMap_i else SetScaling(VISU::LINEAR); + int aGaussMetric = aResourceMgr->integerValue("VISU", "scalar_gauss_metric", 0); + SetGaussMetric((VISU::GaussMetric)aGaussMetric); + myShowBar = true; return this; } @@ -252,6 +256,8 @@ VISU::ScalarMap_i QString aVal = VISU::Storable::FindValue(theMap,"myShowBar", "1"); SetBarVisible((aVal.toInt() == 1)? true : false); + SetGaussMetric(VISU::GaussMetric(VISU::Storable::FindValue(theMap,"myGaussMetric").toInt())); + // Check if the icon needs to be updated, update if necessary SALOMEDS::Study_var aStudy = theSObject->GetStudy(); SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); @@ -275,6 +281,7 @@ VISU::ScalarMap_i Storable::DataToStream( theStr, "myScaling", GetScaling() ); Storable::DataToStream( theStr, "myShowBar", (IsBarVisible()? 1:0) ); + Storable::DataToStream( theStr, "myGaussMetric", int(GetGaussMetric()) ); } @@ -297,6 +304,25 @@ VISU::ScalarMap_i (GetSpecificPL(), &VISU_ColoredPL::SetScaling, theScaling)); } +//---------------------------------------------------------------------------- +VISU::GaussMetric +VISU::ScalarMap_i +::GetGaussMetric() +{ + return VISU::GaussMetric(GetSpecificPL()->GetGaussMetric()); +} + +//---------------------------------------------------------------------------- +void +VISU::ScalarMap_i +::SetGaussMetric(VISU::GaussMetric theGaussMetric) +{ + VISU::TSetModified aModified(this); + + ProcessVoidEvent(new TVoidMemFun1ArgEvent + (GetSpecificPL(), &VISU_ScalarMapPL::SetGaussMetric, (VISU::TGaussMetric)theGaussMetric)); +} + //---------------------------------------------------------------------------- void VISU::ScalarMap_i @@ -541,8 +567,11 @@ struct TGetComponentMin: public SALOME_Event Execute() { VISU::TNames aGroupNames; - if(VISU::ScalarMap_i* aPrs3d = dynamic_cast(myColoredPrs3d)) + VISU::GaussMetric aGaussMetric = VISU::AVERAGE; + if(VISU::ScalarMap_i* aPrs3d = dynamic_cast(myColoredPrs3d)) { aGroupNames = aPrs3d->GetSpecificPL()->GetGeometryNames(); + aGaussMetric = aPrs3d->GetGaussMetric(); + } VISU::PMinMaxController aMinMaxController = myColoredPrs3d->GetMinMaxController(); if ( aMinMaxController ) { @@ -550,9 +579,9 @@ struct TGetComponentMin: public SALOME_Event } else { VISU::TMinMax aTMinMax; if(myColoredPrs3d->GetScalarField()->myIsELNO) - aTMinMax = myColoredPrs3d->GetScalarField()->GetMinMax( myCompID, aGroupNames ); + aTMinMax = myColoredPrs3d->GetScalarField()->GetMinMax( myCompID, aGroupNames, (VISU::TGaussMetric)aGaussMetric ); else - aTMinMax = myColoredPrs3d->GetScalarField()->GetAverageMinMax( myCompID, aGroupNames ); + aTMinMax = myColoredPrs3d->GetScalarField()->GetAverageMinMax( myCompID, aGroupNames, (VISU::TGaussMetric)aGaussMetric ); myResult = aTMinMax.first; } } @@ -587,8 +616,11 @@ struct TGetComponentMax: public SALOME_Event Execute() { VISU::TNames aGroupNames; - if(VISU::ScalarMap_i* aPrs3d = dynamic_cast(myColoredPrs3d)) + VISU::GaussMetric aGaussMetric = VISU::AVERAGE; + if(VISU::ScalarMap_i* aPrs3d = dynamic_cast(myColoredPrs3d)) { aGroupNames = aPrs3d->GetSpecificPL()->GetGeometryNames(); + aGaussMetric = aPrs3d->GetGaussMetric(); + } VISU::PMinMaxController aMinMaxController = myColoredPrs3d->GetMinMaxController(); if ( aMinMaxController ) { @@ -596,9 +628,9 @@ struct TGetComponentMax: public SALOME_Event } else { VISU::TMinMax aTMinMax; if(myColoredPrs3d->GetScalarField()->myIsELNO) - aTMinMax = myColoredPrs3d->GetScalarField()->GetMinMax( myCompID, aGroupNames ); + aTMinMax = myColoredPrs3d->GetScalarField()->GetMinMax( myCompID, aGroupNames, (VISU::TGaussMetric)aGaussMetric ); else - aTMinMax = myColoredPrs3d->GetScalarField()->GetAverageMinMax( myCompID, aGroupNames ); + aTMinMax = myColoredPrs3d->GetScalarField()->GetAverageMinMax( myCompID, aGroupNames, (VISU::TGaussMetric)aGaussMetric ); myResult = aTMinMax.second; } } diff --git a/src/VISU_I/VISU_ScalarMap_i.hh b/src/VISU_I/VISU_ScalarMap_i.hh index 0b640af6..aba260e0 100644 --- a/src/VISU_I/VISU_ScalarMap_i.hh +++ b/src/VISU_I/VISU_ScalarMap_i.hh @@ -76,6 +76,15 @@ namespace VISU void SetScaling(VISU::Scaling theScaling); + //---------------------------------------------------------------------------- + virtual + VISU::GaussMetric + GetGaussMetric(); + + virtual + void + SetGaussMetric(VISU::GaussMetric theGaussMetric); + //---------------------------------------------------------------------------- //! Sets initial source geometry virtual -- 2.39.2