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
00038
00039 #include <Inventor/STL/vector>
00040 #include <Inventor/STL/iostream>
00041 #include <Inventor/STL/sstream>
00042 #include <Inventor/STL/algorithm>
00043
00053 template <typename _T=double>
00054 class MbScalarSetIj : virtual public MiScalardSetIj, public MbDataSet, private MbIjToI
00055 {
00056 public:
00058
00063 MbScalarSetIj();
00064 MbScalarSetIj(size_t numI, size_t numJ);
00065
00066 MbScalarSetIj(size_t numI, size_t numJ,
00067 const std::string& name, DataBinding binding=PER_NODE);
00069
00073 double get(size_t i, size_t j) const;
00074
00078 void set(size_t i, size_t j, const _T& data);
00079
00081
00084 virtual void getSize(size_t& sizeI, size_t& sizeJ) const;
00085 virtual void setSize(size_t sizeI, size_t sizeJ);
00087
00091 virtual double getMin() const;
00095 virtual double getMax() const;
00096
00097 private:
00101 virtual std::ostream& toStream(std::ostream& s) const;
00102
00103 std::vector<_T> m_scalars;
00104
00105 static size_t s_numInstance;
00106
00107 size_t m_numJ;
00108
00109 };
00110
00111
00112 template <typename _T>
00113 size_t MbScalarSetIj<_T>::s_numInstance = 0;
00114
00115
00116 template <typename _T>
00117 inline
00118 MbScalarSetIj<_T>::MbScalarSetIj():
00119 MbIjToI(0), m_numJ(0)
00120 {
00121 std::ostringstream defName;
00122 defName << "MbScalarSet_#" << s_numInstance++;
00123 m_name = defName.str();
00124 }
00125
00126
00127 template <typename _T>
00128 inline
00129 MbScalarSetIj<_T>::MbScalarSetIj(size_t numI, size_t numJ):
00130 MbIjToI(numI), m_numJ(numJ)
00131 {
00132 std::ostringstream defName;
00133 defName << "MbScalarSet_#" << s_numInstance++;
00134 m_name = defName.str();
00135 m_scalars.resize(m_numI*m_numJ);
00136 }
00137
00138
00139 template <typename _T>
00140 inline
00141 MbScalarSetIj<_T>::MbScalarSetIj(size_t numI, size_t numJ,
00142 const std::string& name,
00143 DataBinding binding)
00144 : MbDataSet(name,binding), MbIjToI(numI), m_numJ(numJ)
00145 {
00146 m_scalars.resize(m_numI*m_numJ);
00147 s_numInstance++;
00148 }
00149
00150
00151 template <typename _T>
00152 double
00153 MbScalarSetIj<_T>::get(size_t i, size_t j) const
00154 {
00155 #ifndef MBMESH_DONT_USE_ASSERT
00156 if (m_numI <= i || m_numJ <= j)
00157 throw MbError("accessing scalarset out of range");
00158 #endif
00159 return (double)m_scalars[getI(i,j)];
00160 }
00161
00162 template <typename _T>
00163 void
00164 MbScalarSetIj<_T>::set(size_t i, size_t j, const _T& data)
00165 {
00166 if (i<m_numI && j<m_numJ)
00167 {
00168 m_scalars[getI(i,j)] = data;
00169 m_timeStamp = MxTimeStamp::getTimeStamp();
00170 }
00171 }
00172
00173
00174 template <typename _T>
00175 void
00176 MbScalarSetIj<_T>::getSize(size_t& i, size_t& j) const
00177 {
00178 i = m_numI;
00179 j = m_numJ;
00180 }
00181
00182 template <typename _T>
00183 void
00184 MbScalarSetIj<_T>::setSize(size_t i, size_t j)
00185 {
00186 m_numI = i;
00187 m_numJ = j;
00188 m_scalars.resize(m_numI*m_numJ);
00189 m_timeStamp = MxTimeStamp::getTimeStamp();
00190 }
00191
00192
00193 template <typename _T>
00194 double
00195 MbScalarSetIj<_T>::getMin() const
00196 {
00197 typename std::vector<_T>::const_iterator itmin = std::min_element(m_scalars.begin(),m_scalars.end());
00198 return (double)(*itmin);
00199 }
00200
00201
00202
00203 template <typename _T>
00204 double
00205 MbScalarSetIj<_T>::getMax() const
00206 {
00207 typename std::vector<_T>::const_iterator itmax = std::max_element(m_scalars.begin(),m_scalars.end());
00208 return (double)(*itmax);
00209 }
00210
00211
00212
00213 template <typename _T>
00214 std::ostream&
00215 MbScalarSetIj<_T>::toStream(std::ostream& s) const
00216 {
00217 s << "# scalarset name" << std::endl;
00218 s << getName() << std::endl;
00219 s << "# scalarset size" << std::endl;
00220 s << m_numI << "," << m_numJ << std::endl;
00221 for (size_t i=0; i< m_numI; ++i)
00222 for (size_t j=0; j< m_numJ; ++j)
00223 s << "value(" << i << "," << j << ")=" << get(i,j) << std::endl;
00224
00225 return s;
00226 }
00227
00228 #ifdef _WIN32
00229 # pragma warning( pop )
00230 #endif
00231
00232 #endif
00233
00234
00235
00236
00237
00238
00239
00240
00241