diff --git a/Fltk/optionWindow.cpp b/Fltk/optionWindow.cpp index 6ef3ede13dcf1dff0ca9cdd4628301ed147d7de3..695721de509c9b7f7967f22ee7fb5eac07ee9396 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 dd56dc81ca31108cc1db84b6aa9c71478eb48703..d76ac09bee45148b28e0fa4f6f3a02358917bf2a 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 17b339a4a95aa4db7b37319ddd9817e897b0abc7..c67cb9936729e1f197f05244bcb18601ac4b118d 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 9383a174f75ee793659b8c9622afec4e976d3294..e4c77edb602cec226abf67460efe91260e1bf07e 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 4731430c8256edb753dda3e2128be47c5c737882..5153aea5d0907e4b0d275838c90e515332c4e103 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 75df3978814e64322eb78e5db1fd124401b2c2e9..31e9dff239af952faae07590ebf865539ddb507e 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 85e1e71b565c728a78adcd28b22733de69ef0533..a3d52af75867b23e13ee755de0c6b1b8474ed1a5 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 6f2230682c6e6346ce44993582721464801e9c08..bcc001ddd0491a18b8914dad2eb1f801725ffc7d 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