From 3ad45993659948f09c41d395e6750ca8fc58d075 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Fri, 23 Sep 2011 06:45:48 +0000 Subject: [PATCH] use value from forceNumComponents/componentMap when recomputing the min/max interactively suggested by Nicolas Tardieu --- Fltk/optionWindow.cpp | 10 +++++---- Post/PViewData.cpp | 16 ++++++++++++-- Post/PViewData.h | 9 +++++--- Post/PViewDataGModel.cpp | 32 +++++++++++++++++----------- Post/PViewDataGModel.h | 6 ++++-- Post/PViewDataList.cpp | 46 +++++++++++++++++++++++++++++++++++----- Post/PViewDataList.h | 6 ++++-- Post/PViewDataRemote.h | 6 ++++-- 8 files changed, 99 insertions(+), 32 deletions(-) diff --git a/Fltk/optionWindow.cpp b/Fltk/optionWindow.cpp index 6ef3ede13d..695721de50 100644 --- a/Fltk/optionWindow.cpp +++ b/Fltk/optionWindow.cpp @@ -591,12 +591,14 @@ static void view_options_ok_cb(Fl_Widget *w, void *data) if(vindex >= 0 && vindex < (int)PView::list.size()){ // compute min/max taking current visibility status into account int step = (int)opt_view_timestep(vindex, GMSH_GET, 0); + PViewData *data = PView::list[vindex]->getData(true); + PViewOptions *opt = PView::list[vindex]->getOptions(); if(!strcmp(str, "range_min")) - o->view.value[31]->value - (PView::list[vindex]->getData(true)->getMin(step, true)); + o->view.value[31]->value(data->getMin(step, true, opt->forceNumComponents, + opt->componentMap)); else if(!strcmp(str, "range_max")) - o->view.value[32]->value - (PView::list[vindex]->getData(true)->getMax(step, true)); + o->view.value[32]->value(data->getMax(step, true, opt->forceNumComponents, + opt->componentMap)); } } } diff --git a/Post/PViewData.cpp b/Post/PViewData.cpp index dd56dc81ca..d76ac09bee 100644 --- a/Post/PViewData.cpp +++ b/Post/PViewData.cpp @@ -57,10 +57,22 @@ bool PViewData::skipElement(int step, int ent, int ele, bool checkVisibility, return ele % samplingRate; } -void PViewData::getScalarValue(int step, int ent, int ele, int nod, double &val) +void PViewData::getScalarValue(int step, int ent, int ele, int nod, double &val, + int forceNumComponents, int componentMap[9]) { int numComp = getNumComponents(step, ent, ele); - if(numComp == 1){ + if(forceNumComponents && componentMap){ + std::vector<double> d(forceNumComponents); + for(int i = 0; i < forceNumComponents; i++){ + int comp = componentMap[i]; + if(comp >= 0 && comp < numComp) + getValue(step, ent, ele, nod, comp, d[i]); + else + d[i] = 0.; + } + val = ComputeScalarRep(forceNumComponents, &d[0]); + } + else if(numComp == 1){ getValue(step, ent, ele, nod, 0, val); } else{ diff --git a/Post/PViewData.h b/Post/PViewData.h index 17b339a4a9..c67cb99367 100644 --- a/Post/PViewData.h +++ b/Post/PViewData.h @@ -74,8 +74,10 @@ class PViewData { virtual double getTime(int step){ return 0.; } // get/set min/max for given step (global over all steps if step=-1) - virtual double getMin(int step=-1, bool onlyVisible=false) = 0; - virtual double getMax(int step=-1, bool onlyVisible=false) = 0; + virtual double getMin(int step=-1, bool onlyVisible=false, + int forceNumComponents=0, int componentMap[9]=0) = 0; + virtual double getMax(int step=-1, bool onlyVisible=false, + int forceNumComponents=0, int componentMap[9]=0) = 0; virtual void setMin(double min) = 0; virtual void setMax(double max) = 0; @@ -142,7 +144,8 @@ class PViewData { // return a scalar value (same as value for scalars, norm for // vectors, etc.) associated with the node-th node from the ele-th // element in the ent-th entity - void getScalarValue(int step, int ent, int ele, int nod, double &val); + void getScalarValue(int step, int ent, int ele, int nod, double &val, + int forceNumComponents=0, int componentMap[9]=0); // return the number of edges of the ele-th element in the ent-th // entity diff --git a/Post/PViewDataGModel.cpp b/Post/PViewDataGModel.cpp index 9383a174f7..e4c77edb60 100644 --- a/Post/PViewDataGModel.cpp +++ b/Post/PViewDataGModel.cpp @@ -222,17 +222,21 @@ double PViewDataGModel::getTime(int step) return _steps[step]->getTime(); } -double PViewDataGModel::getMin(int step, bool onlyVisible) +double PViewDataGModel::getMin(int step, bool onlyVisible, int forceNumComponents, + int componentMap[9]) { - if(onlyVisible){ + if(_steps.empty()) return _min; + + if(onlyVisible || forceNumComponents){ double vmin = VAL_INF; for(int ent = 0; ent < getNumEntities(step); ent++){ - if(skipEntity(step, ent)) continue; + if(onlyVisible && skipEntity(step, ent)) continue; for(int ele = 0; ele < getNumElements(step, ent); ele++){ - if(skipElement(step, ent, ele, true)) continue; + if(skipElement(step, ent, ele, onlyVisible)) continue; for(int nod = 0; nod < getNumNodes(step, ent, ele); nod++){ double val; - getScalarValue(step, ent, ele, nod, val); + getScalarValue(step, ent, ele, nod, val, + forceNumComponents, componentMap); vmin = std::min(vmin, val); } } @@ -240,21 +244,25 @@ double PViewDataGModel::getMin(int step, bool onlyVisible) return vmin; } - if(step < 0 || _steps.empty()) return _min; + if(step < 0) return _min; return _steps[step]->getMin(); } -double PViewDataGModel::getMax(int step, bool onlyVisible) +double PViewDataGModel::getMax(int step, bool onlyVisible, int forceNumComponents, + int componentMap[9]) { - if(onlyVisible){ + if(_steps.empty()) return _max; + + if(onlyVisible || forceNumComponents){ double vmax = -VAL_INF; for(int ent = 0; ent < getNumEntities(step); ent++){ - if(skipEntity(step, ent)) continue; + if(onlyVisible && skipEntity(step, ent)) continue; for(int ele = 0; ele < getNumElements(step, ent); ele++){ - if(skipElement(step, ent, ele, true)) continue; + if(skipElement(step, ent, ele, onlyVisible)) continue; for(int nod = 0; nod < getNumNodes(step, ent, ele); nod++){ double val; - getScalarValue(step, ent, ele, nod, val); + getScalarValue(step, ent, ele, nod, val, + forceNumComponents, componentMap); vmax = std::max(vmax, val); } } @@ -262,7 +270,7 @@ double PViewDataGModel::getMax(int step, bool onlyVisible) return vmax; } - if(step < 0 || _steps.empty()) return _max; + if(step < 0) return _max; return _steps[step]->getMax(); } diff --git a/Post/PViewDataGModel.h b/Post/PViewDataGModel.h index 4731430c82..5153aea5d0 100644 --- a/Post/PViewDataGModel.h +++ b/Post/PViewDataGModel.h @@ -174,8 +174,10 @@ class PViewDataGModel : public PViewData { int getNumTimeSteps(); int getFirstNonEmptyTimeStep(); double getTime(int step); - double getMin(int step=-1, bool onlyVisible=false); - double getMax(int step=-1, bool onlyVisible=false); + double getMin(int step=-1, bool onlyVisible=false, int forceNumComponents=0, + int componentMap[9]=0); + double getMax(int step=-1, bool onlyVisible=false, int forceNumComponents=0, + int componentMap[9]=0); void setMin(double min){ _min = min; } void setMax(double max){ _max = max; } SBoundingBox3d getBoundingBox(int step=-1); diff --git a/Post/PViewDataList.cpp b/Post/PViewDataList.cpp index 75df397881..31e9dff239 100644 --- a/Post/PViewDataList.cpp +++ b/Post/PViewDataList.cpp @@ -104,15 +104,51 @@ double PViewDataList::getTime(int step) return Time[step]; } -double PViewDataList::getMin(int step, bool onlyVisible) -{ - if(step < 0 || step >= (int)TimeStepMin.size()) return Min; +double PViewDataList::getMin(int step, bool onlyVisible, int forceNumComponents, + int componentMap[9]) +{ + if(step >= (int)TimeStepMin.size()) return Min; + + if(forceNumComponents){ + double vmin = VAL_INF; + for(int ent = 0; ent < getNumEntities(step); ent++){ + for(int ele = 0; ele < getNumElements(step, ent); ele++){ + for(int nod = 0; nod < getNumNodes(step, ent, ele); nod++){ + double val; + getScalarValue(step, ent, ele, nod, val, + forceNumComponents, componentMap); + vmin = std::min(vmin, val); + } + } + } + return vmin; + } + + if(step < 0) return Min; return TimeStepMin[step]; } -double PViewDataList::getMax(int step, bool onlyVisible) +double PViewDataList::getMax(int step, bool onlyVisible, int forceNumComponents, + int componentMap[9]) { - if(step < 0 || step >= (int)TimeStepMax.size()) return Max; + if(step >= (int)TimeStepMax.size()) return Max; + + if(forceNumComponents){ + double vmax = -VAL_INF; + for(int ent = 0; ent < getNumEntities(step); ent++){ + for(int ele = 0; ele < getNumElements(step, ent); ele++){ + for(int nod = 0; nod < getNumNodes(step, ent, ele); nod++){ + double val; + getScalarValue(step, ent, ele, nod, val, + forceNumComponents, componentMap); + vmax = std::max(vmax, val); + } + } + } + return vmax; + } + + if(step < 0) return Max; return TimeStepMax[step]; } diff --git a/Post/PViewDataList.h b/Post/PViewDataList.h index 85e1e71b56..a3d52af758 100644 --- a/Post/PViewDataList.h +++ b/Post/PViewDataList.h @@ -61,8 +61,10 @@ class PViewDataList : public PViewData { bool finalize(bool computeMinMax=true, const std::string &interpolationScheme=""); int getNumTimeSteps(){ return NbTimeStep; } double getTime(int step); - double getMin(int step=-1, bool onlyVisible=false); - double getMax(int step=-1, bool onlyVisible=false); + double getMin(int step=-1, bool onlyVisible=false, int forceNumComponents=0, + int componentMap[9]=0); + double getMax(int step=-1, bool onlyVisible=false, int forceNumComponents=0, + int componentMap[9]=0); void setMin(double min) {Min = min;} void setMax(double max) {Max = max;} SBoundingBox3d getBoundingBox(int step=-1){ return BBox; } diff --git a/Post/PViewDataRemote.h b/Post/PViewDataRemote.h index 6f2230682c..bcc001ddd0 100644 --- a/Post/PViewDataRemote.h +++ b/Post/PViewDataRemote.h @@ -34,8 +34,10 @@ class PViewDataRemote : public PViewData { return true; } int getNumTimeSteps(){ return _numTimeSteps; } - double getMin(int step=-1, bool onlyVisible=false){ return _min; } - double getMax(int step=-1, bool onlyVisible=false){ return _max; } + double getMin(int step=-1, bool onlyVisible=false, int forceNumComponents=0, + int componentMap[9]=0){ return _min; } + double getMax(int step=-1, bool onlyVisible=false, int forceNumComponents=0, + int componentMap[9]=0){ return _max; } SBoundingBox3d getBoundingBox(int step=-1){ return _bbox; } double getTime(int step){ return _time; } // need to return != 0 for "empty" tests -- GitLab