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 MbScalardSet, 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 typedef MbScalarSetIjk<double> MbScalardSetIjk;
00111
00112 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00113 size_t MbScalarSetIjk<_T,_Layout>::s_numInstance = 0;
00114
00115
00116 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00117 inline
00118 MbScalarSetIjk<_T,_Layout>::MbScalarSetIjk() :
00119 MbIjkToI<_Layout>(0,0,0)
00120 {
00121 std::ostringstream defName;
00122 defName << "MbScalarSet_#" << s_numInstance++;
00123 m_name = defName.str();
00124 }
00125
00126
00127 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00128 inline
00129 MbScalarSetIjk<_T,_Layout>::MbScalarSetIjk(size_t numI, size_t numJ, size_t numK) :
00130 MbIjkToI<_Layout>(numI,numJ,numK)
00131 {
00132 std::ostringstream defName;
00133 defName << "MbScalarSet_#" << s_numInstance++;
00134 m_name = defName.str();
00135 m_scalars.resize(this->m_numI*this->m_numJ*this->m_numK);
00136 }
00137
00138
00139 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00140 inline
00141 MbScalarSetIjk<_T,_Layout>::MbScalarSetIjk(size_t numI, size_t numJ, size_t numK,
00142 const std::string& name,
00143 DataBinding binding)
00144 : MbScalardSet(name,binding), MbIjkToI<_Layout>(numI,numJ,numK)
00145 {
00146 m_scalars.resize(this->m_numI*this->m_numJ*this->m_numK);
00147 s_numInstance++;
00148 }
00149
00150
00151 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00152 double
00153 MbScalarSetIjk<_T,_Layout>::get(size_t i, size_t j, size_t k) const
00154 {
00155 return (double)m_scalars[this->getI(i,j,k)];
00156 }
00157
00158 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00159 void
00160 MbScalarSetIjk<_T,_Layout>::set(size_t i, size_t j, size_t k, const _T& data)
00161 {
00162 if (i<this->m_numI && j<this->m_numJ && k<this->m_numK)
00163 {
00164 m_scalars[this->getI(i,j,k)] = data;
00165 m_timeStamp = MxTimeStamp::getTimeStamp();
00166 }
00167 }
00168
00169
00170 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00171 void
00172 MbScalarSetIjk<_T,_Layout>::getSize(size_t& i, size_t& j, size_t& k) const
00173 {
00174 i = this->m_numI;
00175 j = this->m_numJ;
00176 k = this->m_numK;
00177 }
00178
00179 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00180 void
00181 MbScalarSetIjk<_T,_Layout>::setSize(size_t i, size_t j, size_t k)
00182 {
00183 this->m_numI = i;
00184 this->m_numJ = j;
00185 this->m_numK = k;
00186 m_scalars.resize(i*j*this->m_numK);
00187 m_timeStamp = MxTimeStamp::getTimeStamp();
00188 }
00189
00190
00191 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00192 double
00193 MbScalarSetIjk<_T,_Layout>::getMin() const
00194 {
00195 typename std::vector<_T>::const_iterator itmin = std::min_element(m_scalars.begin(),m_scalars.end());
00196 return (double)(*itmin);
00197 }
00198
00199
00200
00201 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00202 double
00203 MbScalarSetIjk<_T,_Layout>::getMax() const
00204 {
00205 typename std::vector<_T>::const_iterator itmax = std::max_element(m_scalars.begin(),m_scalars.end());
00206 return (double)(*itmax);
00207 }
00208
00209
00210
00211 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00212 std::ostream&
00213 MbScalarSetIjk<_T,_Layout>::toStream(std::ostream& s) const
00214 {
00215 s << "# scalarset name" << std::endl;
00216 s << getName() << std::endl;
00217 s << "# scalarset size" << std::endl;
00218 s << this->m_numI << "," << this->m_numJ << "," << this->m_numK << std::endl;
00219 for (size_t i=0; i< this->m_numI; ++i)
00220 for (size_t j=0; j< this->m_numJ; ++j)
00221 for (size_t k=0; k< this->m_numK; ++k)
00222 s << "value(" << i << "," << j << "," << k << ")=" << get(i,j,k) << std::endl;
00223
00224 return s;
00225 }
00226
00227 #ifdef _WIN32
00228 # pragma warning( pop )
00229 #endif
00230
00231 #endif
00232
00233
00234
00235
00236
00237
00238
00239
00240