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 _MBVEC3SETIJK_H
00025 #define _MBVEC3SETIJK_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 #include <MeshVizXLM/MbVec3.h>
00034
00035 #include <data/MbDataSet.h>
00036 #include <MbIjkToI.h>
00037 #include <MbMeshVizImpl.h>
00038
00039 #include <Inventor/STL/vector>
00040 #include <Inventor/STL/iostream>
00041 #include <Inventor/STL/sstream>
00042
00052 template <typename _Vec3T=MbVec3d, MiMeshIjk::StorageLayout _Layout = MiMeshIjk::LAYOUT_KJI>
00053 class MbVec3SetIjk : virtual public MiVec3dSetIjk, public MbDataSet, private MbIjkToI<_Layout>
00054 {
00055 public:
00057
00062 MbVec3SetIjk();
00063 MbVec3SetIjk(size_t numI, size_t numJ, size_t numK);
00064
00065 MbVec3SetIjk(size_t numI, size_t numJ, size_t numK,
00066 const std::string& name, DataBinding binding=PER_NODE);
00068
00072 MbVec3d get(size_t i, size_t j, size_t k) const;
00073
00077 void set(size_t i, size_t j, size_t k, const _Vec3T& data);
00078
00082 virtual void getSize(size_t& sizeI, size_t& sizeJ, size_t& sizeK) const;
00086 virtual void setSize(size_t sizeI, size_t sizeJ, size_t sizeK);
00087
00088 MiMeshIjk::StorageLayout getStorageLayout() const { return _Layout; }
00089
00093 virtual MbVec3d getMin() const;
00097 virtual MbVec3d getMax() const;
00098
00099 private:
00103 virtual std::ostream& toStream(std::ostream& s) const;
00104
00105 std::vector<_Vec3T> m_coords;
00106
00107 static size_t s_numInstance;
00108 };
00109
00110
00111 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00112 size_t MbVec3SetIjk<_Vec3T,_Layout>::s_numInstance = 0;
00113
00114
00115 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00116 inline
00117 MbVec3SetIjk<_Vec3T,_Layout>::MbVec3SetIjk():
00118 MbIjkToI<_Layout>(0,0,0)
00119 {
00120 std::ostringstream defName;
00121 defName << "MbVec3Set_#" << s_numInstance++;
00122 m_name = defName.str();
00123 }
00124
00125
00126 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00127 inline
00128 MbVec3SetIjk<_Vec3T,_Layout>::MbVec3SetIjk(size_t numI, size_t numJ, size_t numK):
00129 MbIjkToI<_Layout>(numI,numJ,numK)
00130 {
00131 std::ostringstream defName;
00132 defName << "MbVec3Set_#" << s_numInstance++;
00133 m_name = defName.str();
00134 m_coords.resize(this->m_numI*this->m_numJ*this->m_numK);
00135 }
00136
00137
00138 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00139 inline
00140 MbVec3SetIjk<_T,_Layout>::MbVec3SetIjk(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_coords.resize(this->m_numI*this->m_numJ*this->m_numK);
00146 s_numInstance++;
00147 }
00148
00149
00150 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00151 MbVec3d
00152 MbVec3SetIjk<_Vec3T,_Layout>::get(size_t i, size_t j, size_t k) const
00153 {
00154 return (MbVec3d)m_coords[this->getI(i,j,k)];
00155 }
00156
00157 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00158 void
00159 MbVec3SetIjk<_Vec3T,_Layout>::set(size_t i, size_t j, size_t k, const _Vec3T& data)
00160 {
00161 if (i<this->m_numI && j<this->m_numJ && k<this->m_numK)
00162 {
00163 m_coords[this->getI(i,j,k)] = data;
00164 m_timeStamp = MxTimeStamp::getTimeStamp();
00165 }
00166 }
00167
00168
00169 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00170 void
00171 MbVec3SetIjk<_Vec3T,_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 _Vec3T, MiMeshIjk::StorageLayout _Layout>
00179 void
00180 MbVec3SetIjk<_Vec3T,_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_coords.resize(i*j*this->m_numK);
00186 m_timeStamp = MxTimeStamp::getTimeStamp();
00187 }
00188
00189
00190 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00191 inline MbVec3d
00192 MbVec3SetIjk<_Vec3T,_Layout>::getMin() const
00193 {
00194 size_t minvecId = 0;
00195 double minvecLn = m_coords[0].length();
00196
00197 for (size_t i=1; i<m_coords.size(); ++i)
00198 {
00199 double vecLn = m_coords[i].length();
00200 if (vecLn < minvecLn)
00201 {
00202 minvecLn = vecLn;
00203 minvecId = i;
00204 }
00205 }
00206 return (MbVec3d)m_coords[minvecId];
00207 }
00208
00209
00210
00211 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00212 inline MbVec3d
00213 MbVec3SetIjk<_Vec3T,_Layout>::getMax() const
00214 {
00215 size_t maxvecId = 0;
00216 double maxvecLn = m_coords[0].length();
00217
00218 for (size_t i=1; i<m_coords.size(); ++i)
00219 {
00220 double vecLn = m_coords[i].length();
00221 if (vecLn > maxvecLn)
00222 {
00223 maxvecLn = vecLn;
00224 maxvecId = i;
00225 }
00226 }
00227 return (MbVec3d)m_coords[maxvecId];
00228 }
00229
00230
00231 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00232 inline std::ostream&
00233 MbVec3SetIjk<_Vec3T,_Layout>::toStream(std::ostream& s) const
00234 {
00235 s << "# vec3set name" << std::endl;
00236 s << getName() << std::endl;
00237 s << "# vec3set size" << std::endl;
00238 s << this->m_numI << "," << this->m_numJ << "," << this->m_numK << std::endl;
00239 for (size_t i=0; i< this->m_numI; ++i)
00240 for (size_t j=0; j< this->m_numJ; ++j)
00241 for (size_t k=0; k< this->m_numK; ++k)
00242 s << "value(" << i << "," << j << "," << k << ")=" << this->get(i,j,k) << std::endl;
00243
00244 return s;
00245 }
00246
00247 #ifdef _WIN32
00248 # pragma warning( pop )
00249 #endif
00250
00251 #endif
00252
00253
00254
00255
00256
00257
00258
00259
00260