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