00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _MBSCALARSETIJ_H
00025 #define _MBSCALARSETIJ_H
00026
00027 #ifdef _WIN32
00028 # pragma warning( push )
00029 # pragma warning(disable:4250)
00030 #endif
00031
00032 #include <MeshVizXLM/mesh/data/MiDataSetIj.h>
00033
00034 #include <data/MbDataSet.h>
00035 #include <MbIjToI.h>
00036 #include <MbMeshVizImpl.h>
00037 #include <MbError.h>
00038
00039
00040 #include <Inventor/STL/vector>
00041 #include <Inventor/STL/iostream>
00042 #include <Inventor/STL/sstream>
00043 #include <Inventor/STL/algorithm>
00044
00054 template <typename _T=double>
00055 class MbScalarSetIj : virtual public MiScalardSetIj, public MbScalardSet, private MbIjToI
00056 {
00057 public:
00059
00064 MbScalarSetIj();
00065 MbScalarSetIj(size_t numI, size_t numJ);
00066
00067 MbScalarSetIj(size_t numI, size_t numJ,
00068 const std::string& name, DataBinding binding=PER_NODE);
00070
00074 double get(size_t i, size_t j) const;
00075
00079 void set(size_t i, size_t j, const _T& data);
00080
00082
00085 virtual void getSize(size_t& sizeI, size_t& sizeJ) const;
00086 virtual void setSize(size_t sizeI, size_t sizeJ);
00088
00092 virtual double getMin() const;
00096 virtual double getMax() const;
00097
00098 private:
00102 virtual std::ostream& toStream(std::ostream& s) const;
00103
00104 std::vector<_T> m_scalars;
00105
00106 static size_t s_numInstance;
00107
00108 size_t m_numJ;
00109
00110 };
00111
00112 typedef MbScalarSetIj<double> MbScalardSetIj;
00113
00114 template <typename _T>
00115 size_t MbScalarSetIj<_T>::s_numInstance = 0;
00116
00117
00118 template <typename _T>
00119 inline
00120 MbScalarSetIj<_T>::MbScalarSetIj():
00121 MbIjToI(0), m_numJ(0)
00122 {
00123 std::ostringstream defName;
00124 defName << "MbScalarSet_#" << s_numInstance++;
00125 m_name = defName.str();
00126 }
00127
00128
00129 template <typename _T>
00130 inline
00131 MbScalarSetIj<_T>::MbScalarSetIj(size_t numI, size_t numJ):
00132 MbIjToI(numI), m_numJ(numJ)
00133 {
00134 std::ostringstream defName;
00135 defName << "MbScalarSet_#" << s_numInstance++;
00136 m_name = defName.str();
00137 m_scalars.resize(m_numI*m_numJ);
00138 }
00139
00140
00141 template <typename _T>
00142 inline
00143 MbScalarSetIj<_T>::MbScalarSetIj(size_t numI, size_t numJ,
00144 const std::string& name,
00145 DataBinding binding)
00146 : MbScalardSet(name,binding), MbIjToI(numI), m_numJ(numJ)
00147 {
00148 m_scalars.resize(m_numI*m_numJ);
00149 s_numInstance++;
00150 }
00151
00152
00153 template <typename _T>
00154 double
00155 MbScalarSetIj<_T>::get(size_t i, size_t j) const
00156 {
00157 #ifndef MBMESH_DONT_USE_ASSERT
00158 if (m_numI <= i || m_numJ <= j)
00159 throw MbError("accessing scalarset out of range");
00160 #endif
00161 return (double)m_scalars[getI(i,j)];
00162 }
00163
00164 template <typename _T>
00165 void
00166 MbScalarSetIj<_T>::set(size_t i, size_t j, const _T& data)
00167 {
00168 if (i<m_numI && j<m_numJ)
00169 {
00170 m_scalars[getI(i,j)] = data;
00171 m_timeStamp = MxTimeStamp::getTimeStamp();
00172 }
00173 }
00174
00175
00176 template <typename _T>
00177 void
00178 MbScalarSetIj<_T>::getSize(size_t& i, size_t& j) const
00179 {
00180 i = m_numI;
00181 j = m_numJ;
00182 }
00183
00184 template <typename _T>
00185 void
00186 MbScalarSetIj<_T>::setSize(size_t i, size_t j)
00187 {
00188 m_numI = i;
00189 m_numJ = j;
00190 m_scalars.resize(m_numI*m_numJ);
00191 m_timeStamp = MxTimeStamp::getTimeStamp();
00192 }
00193
00194
00195 template <typename _T>
00196 double
00197 MbScalarSetIj<_T>::getMin() const
00198 {
00199 typename std::vector<_T>::const_iterator itmin = std::min_element(m_scalars.begin(),m_scalars.end());
00200 return (double)(*itmin);
00201 }
00202
00203
00204
00205 template <typename _T>
00206 double
00207 MbScalarSetIj<_T>::getMax() const
00208 {
00209 typename std::vector<_T>::const_iterator itmax = std::max_element(m_scalars.begin(),m_scalars.end());
00210 return (double)(*itmax);
00211 }
00212
00213
00214
00215 template <typename _T>
00216 std::ostream&
00217 MbScalarSetIj<_T>::toStream(std::ostream& s) const
00218 {
00219 s << "# scalarset name" << std::endl;
00220 s << getName() << std::endl;
00221 s << "# scalarset size" << std::endl;
00222 s << m_numI << "," << m_numJ << std::endl;
00223 for (size_t i=0; i< m_numI; ++i)
00224 for (size_t j=0; j< m_numJ; ++j)
00225 s << "value(" << i << "," << j << ")=" << get(i,j) << std::endl;
00226
00227 return s;
00228 }
00229
00230 #ifdef _WIN32
00231 # pragma warning( pop )
00232 #endif
00233
00234 #endif
00235
00236
00237
00238
00239
00240
00241
00242
00243