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 _MBSCALARSETIJK_H
00025 #define _MBSCALARSETIJK_H
00026
00027 #ifdef _WIN32
00028 # pragma warning( push )
00029 # pragma warning(disable:4250)
00030 #endif
00031
00032 #include <MeshVizXLM/mesh/data/MiDataSetIjk.h>
00033
00034 #include <data/MbDataSet.h>
00035 #include <MbIjkToI.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, MiMeshIjk::StorageLayout _Layout = MiMeshIjk::LAYOUT_KJI>
00054 class MbScalarSetIjk : virtual public MiScalardSetIjk, public MbDataSet, private MbIjkToI<_Layout>
00055 {
00056 public:
00058
00063 MbScalarSetIjk();
00064 MbScalarSetIjk(size_t numI, size_t numJ, size_t numK);
00065
00066 MbScalarSetIjk(size_t numI, size_t numJ, size_t numK,
00067 const std::string& name, DataBinding binding=PER_NODE);
00069
00073 double get(size_t i, size_t j, size_t k) const;
00074
00078 void set(size_t i, size_t j, size_t k, const _T& data);
00079
00080 virtual MiMeshIjk::StorageLayout getStorageLayout() const { return _Layout; }
00081
00083
00086 virtual void getSize(size_t& sizeI, size_t& sizeJ, size_t& sizeK) const;
00087 virtual void setSize(size_t sizeI, size_t sizeJ, size_t sizeK);
00089
00093 virtual double getMin() const;
00097 virtual double getMax() const;
00098
00099 private:
00103 virtual std::ostream& toStream(std::ostream& s) const;
00104
00105 std::vector<_T> m_scalars;
00106
00107 static size_t s_numInstance;
00108 };
00109
00110
00111 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00112 size_t MbScalarSetIjk<_T,_Layout>::s_numInstance = 0;
00113
00114
00115 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00116 inline
00117 MbScalarSetIjk<_T,_Layout>::MbScalarSetIjk() :
00118 MbIjkToI<_Layout>(0,0,0)
00119 {
00120 std::ostringstream defName;
00121 defName << "MbScalarSet_#" << s_numInstance++;
00122 m_name = defName.str();
00123 }
00124
00125
00126 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00127 inline
00128 MbScalarSetIjk<_T,_Layout>::MbScalarSetIjk(size_t numI, size_t numJ, size_t numK) :
00129 MbIjkToI<_Layout>(numI,numJ,numK)
00130 {
00131 std::ostringstream defName;
00132 defName << "MbScalarSet_#" << s_numInstance++;
00133 m_name = defName.str();
00134 m_scalars.resize(this->m_numI*this->m_numJ*this->m_numK);
00135 }
00136
00137
00138 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00139 inline
00140 MbScalarSetIjk<_T,_Layout>::MbScalarSetIjk(size_t numI, size_t numJ, size_t numK,
00141 const std::string& name,
00142 DataBinding binding)
00143 : MbDataSet(name,binding), MbIjkToI<_Layout>(numI,numJ,numK)
00144 {
00145 m_scalars.resize(this->m_numI*this->m_numJ*this->m_numK);
00146 s_numInstance++;
00147 }
00148
00149
00150 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00151 double
00152 MbScalarSetIjk<_T,_Layout>::get(size_t i, size_t j, size_t k) const
00153 {
00154 return (double)m_scalars[this->getI(i,j,k)];
00155 }
00156
00157 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00158 void
00159 MbScalarSetIjk<_T,_Layout>::set(size_t i, size_t j, size_t k, const _T& data)
00160 {
00161 if (i<this->m_numI && j<this->m_numJ && k<this->m_numK)
00162 {
00163 m_scalars[this->getI(i,j,k)] = data;
00164 m_timeStamp = MxTimeStamp::getTimeStamp();
00165 }
00166 }
00167
00168
00169 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00170 void
00171 MbScalarSetIjk<_T,_Layout>::getSize(size_t& i, size_t& j, size_t& k) const
00172 {
00173 i = this->m_numI;
00174 j = this->m_numJ;
00175 k = this->m_numK;
00176 }
00177
00178 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00179 void
00180 MbScalarSetIjk<_T,_Layout>::setSize(size_t i, size_t j, size_t k)
00181 {
00182 this->m_numI = i;
00183 this->m_numJ = j;
00184 this->m_numK = k;
00185 m_scalars.resize(i*j*this->m_numK);
00186 m_timeStamp = MxTimeStamp::getTimeStamp();
00187 }
00188
00189
00190 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00191 double
00192 MbScalarSetIjk<_T,_Layout>::getMin() const
00193 {
00194 typename std::vector<_T>::const_iterator itmin = std::min_element(m_scalars.begin(),m_scalars.end());
00195 return (double)(*itmin);
00196 }
00197
00198
00199
00200 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00201 double
00202 MbScalarSetIjk<_T,_Layout>::getMax() const
00203 {
00204 typename std::vector<_T>::const_iterator itmax = std::max_element(m_scalars.begin(),m_scalars.end());
00205 return (double)(*itmax);
00206 }
00207
00208
00209
00210 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00211 std::ostream&
00212 MbScalarSetIjk<_T,_Layout>::toStream(std::ostream& s) const
00213 {
00214 s << "# scalarset name" << std::endl;
00215 s << getName() << std::endl;
00216 s << "# scalarset size" << std::endl;
00217 s << this->m_numI << "," << this->m_numJ << "," << this->m_numK << std::endl;
00218 for (size_t i=0; i< this->m_numI; ++i)
00219 for (size_t j=0; j< this->m_numJ; ++j)
00220 for (size_t k=0; k< this->m_numK; ++k)
00221 s << "value(" << i << "," << j << "," << k << ")=" << get(i,j,k) << std::endl;
00222
00223 return s;
00224 }
00225
00226 #ifdef _WIN32
00227 # pragma warning( pop )
00228 #endif
00229
00230 #endif
00231
00232
00233
00234
00235
00236
00237
00238
00239