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 _MBVEC3SETIJ_H
00025 #define _MBVEC3SETIJ_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 #include <MbIjToI.h>
00034 #include <MeshVizXLM/MbVec3.h>
00035 #include <MbError.h>
00036
00037 #include <data/MbDataSet.h>
00038 #include <MbMeshVizImpl.h>
00039
00040 #include <Inventor/STL/vector>
00041 #include <Inventor/STL/iostream>
00042 #include <Inventor/STL/sstream>
00043
00053 template <typename _Vec3T=MbVec3d>
00054 class MbVec3SetIj : virtual public MiVec3dSetIj, public MbVec3dSet, private MbIjToI
00055 {
00056 public:
00058
00063 MbVec3SetIj();
00064 MbVec3SetIj(size_t numI, size_t numJ);
00065
00066 MbVec3SetIj(size_t numI, size_t numJ,
00067 const std::string& name, DataBinding binding=PER_NODE);
00069
00073 MbVec3d get(size_t i, size_t j) const;
00074
00078 void set(size_t i, size_t j, const _Vec3T& data);
00079
00083 virtual void getSize(size_t& sizeI, size_t& sizeJ) const;
00087 virtual void setSize(size_t sizeI, size_t sizeJ);
00088
00092 virtual MbVec3d getMin() const;
00096 virtual MbVec3d getMax() const;
00097
00098 private:
00102 virtual std::ostream& toStream(std::ostream& s) const;
00103
00104 std::vector<_Vec3T> m_coords;
00105
00106 static size_t s_numInstance;
00107
00108 size_t m_numJ;
00109
00110 };
00111
00112 typedef MbVec3SetIj<MbVec3d> MbVec3dSetIj;
00113
00114 template <typename _T>
00115 size_t MbVec3SetIj<_T>::s_numInstance = 0;
00116
00117
00118 template <typename _Vec3T>
00119 inline
00120 MbVec3SetIj<_Vec3T>::MbVec3SetIj():
00121 MbIjToI(0), m_numJ(0)
00122 {
00123 std::ostringstream defName;
00124 defName << "MbVec3Set_#" << s_numInstance++;
00125 m_name = defName.str();
00126 }
00127
00128
00129 template <typename _Vec3T>
00130 inline
00131 MbVec3SetIj<_Vec3T>::MbVec3SetIj(size_t numI, size_t numJ):
00132 MbIjToI(numI), m_numJ(numJ)
00133 {
00134 std::ostringstream defName;
00135 defName << "MbVec3Set_#" << s_numInstance++;
00136 m_name = defName.str();
00137 m_coords.resize(m_numI*m_numJ);
00138 }
00139
00140
00141 template <typename _Vec3T>
00142 inline
00143 MbVec3SetIj<_Vec3T>::MbVec3SetIj(size_t numI, size_t numJ,
00144 const std::string& name,
00145 DataBinding binding)
00146 : MbVec3dSet(name,binding), MbIjToI(numI), m_numJ(numJ)
00147 {
00148 m_coords.resize(m_numI*m_numJ);
00149 s_numInstance++;
00150 }
00151
00152 template <typename _Vec3T>
00153 MbVec3d
00154 MbVec3SetIj<_Vec3T>::get(size_t i, size_t j) const
00155 {
00156 #ifndef MBMESH_DONT_USE_ASSERT
00157 if (m_numI <= i || m_numJ <= j)
00158 throw MbError("accessing vector out of range");
00159 #endif
00160 return (MbVec3d)m_coords[getI(i,j)];
00161 }
00162
00163 template <typename _Vec3T>
00164 void
00165 MbVec3SetIj<_Vec3T>::set(size_t i, size_t j, const _Vec3T& data)
00166 {
00167 if (i<m_numI && j<m_numJ)
00168 {
00169 m_coords[getI(i,j)] = data;
00170 m_timeStamp = MxTimeStamp::getTimeStamp();
00171 }
00172 }
00173
00174
00175 template <typename _Vec3T>
00176 void
00177 MbVec3SetIj<_Vec3T>::getSize(size_t& i, size_t& j) const
00178 {
00179 i = m_numI;
00180 j = m_numJ;
00181 }
00182
00183 template <typename _Vec3T>
00184 void
00185 MbVec3SetIj<_Vec3T>::setSize(size_t i, size_t j)
00186 {
00187 m_numI = i;
00188 m_numJ = j;
00189 m_coords.resize(m_numI*m_numJ);
00190 m_timeStamp = MxTimeStamp::getTimeStamp();
00191 }
00192
00193
00194
00195 template <typename _Vec3T>
00196 inline MbVec3d
00197 MbVec3SetIj<_Vec3T>::getMin() const
00198 {
00199 size_t minvecId = 0;
00200 double minvecLn = m_coords[0].length();
00201
00202 for (size_t i=1; i<m_coords.size(); ++i)
00203 {
00204 double vecLn = m_coords[i].length();
00205 if (vecLn < minvecLn)
00206 {
00207 minvecLn = vecLn;
00208 minvecId = i;
00209 }
00210 }
00211 return MbVec3d(m_coords[minvecId]);
00212 }
00213
00214
00215
00216 template <typename _Vec3T>
00217 inline MbVec3d
00218 MbVec3SetIj<_Vec3T>::getMax() const
00219 {
00220 size_t maxvecId = 0;
00221 double maxvecLn = m_coords[0].length();
00222
00223 for (size_t i=1; i<m_coords.size(); ++i)
00224 {
00225 double vecLn = m_coords[i].length();
00226 if (vecLn > maxvecLn)
00227 {
00228 maxvecLn = vecLn;
00229 maxvecId = i;
00230 }
00231 }
00232 return MbVec3d(m_coords[maxvecId]);
00233 }
00234
00235
00236 template <typename _Vec3T>
00237 inline std::ostream&
00238 MbVec3SetIj<_Vec3T>::toStream(std::ostream& s) const
00239 {
00240 s << "# vec3set name" << std::endl;
00241 s << getName() << std::endl;
00242 s << "# vec3set size" << std::endl;
00243 s << m_numI << "," << m_numJ << std::endl;
00244 for (size_t i=0; i< m_numI; ++i)
00245 for (size_t j=0; j< m_numJ; ++j)
00246 s << "value(" << i << "," << j << ")=" << get(i,j) << std::endl;
00247
00248 return s;
00249 }
00250
00251 #ifdef _WIN32
00252 # pragma warning( pop )
00253 #endif
00254
00255 #endif
00256
00257
00258
00259
00260
00261
00262
00263
00264