00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _MBVEC3SETI_H
00024 #define _MBVEC3SETI_H
00025
00026 #ifdef _WIN32
00027 # pragma warning( push )
00028 # pragma warning(disable:4250)
00029 #endif
00030
00031 #include <MeshVizXLM/mesh/data/MiDataSetI.h>
00032 #include <MeshVizXLM/extrmesh/data/MeXDataSetI.h>
00033 #include <MeshVizXLM/MbVec3.h>
00034
00035 #include <data/MbDataSet.h>
00036 #include <MbMeshVizImpl.h>
00037
00038 #include <Inventor/STL/vector>
00039 #include <Inventor/STL/iostream>
00040 #include <Inventor/STL/sstream>
00041
00051 template <typename _Vec3T=MbVec3d>
00052 class MbVec3SetI : virtual public MiVec3dSetI, public MbVec3dSet
00053 {
00054 public:
00060 MbVec3SetI();
00061
00069 template <typename _Vec3Iter>
00070 MbVec3SetI(_Vec3Iter begin, _Vec3Iter end);
00071
00080 template <typename _Vec3Iter>
00081 MbVec3SetI(_Vec3Iter begin, _Vec3Iter end, const std::string& name, DataBinding binding=PER_NODE);
00082
00088 MbVec3SetI(const MeXVec3dSetI& vec3set);
00089
00097 template <typename _Vec3Iter>
00098 void assign(_Vec3Iter begin, _Vec3Iter end);
00099
00103 virtual MbVec3d get(size_t i) const;
00104
00108 virtual size_t getSize() const;
00109
00113 virtual MbVec3d getMin() const;
00117 virtual MbVec3d getMax() const;
00118
00119 private:
00123 virtual std::ostream& toStream(std::ostream& s) const;
00124
00125 std::vector<_Vec3T> m_coords;
00126
00127 static size_t s_numInstance;
00128
00129 };
00130
00131 typedef MbVec3SetI<MbVec3d> MbVec3dSetI;
00132
00133 template <typename _T>
00134 size_t MbVec3SetI<_T>::s_numInstance = 0;
00135
00136
00137
00138 template <typename _Vec3T>
00139 inline
00140 MbVec3SetI<_Vec3T>::MbVec3SetI()
00141 {
00142 std::ostringstream defName;
00143 defName << "MbVec3Set_#" << s_numInstance++;
00144 m_name = defName.str();
00145 }
00146
00147
00148 template <typename _Vec3T>
00149 template <typename _Vec3Iter>
00150 inline
00151 MbVec3SetI<_Vec3T>::MbVec3SetI(
00152 _Vec3Iter beginCoord, _Vec3Iter endCoord
00153 )
00154 : m_coords(beginCoord,endCoord)
00155 {
00156 std::ostringstream defName;
00157 defName << "MbVec3Set_#" << s_numInstance++;
00158 m_name = defName.str();
00159 }
00160
00161
00162 template <typename _Vec3T>
00163 template <typename _Vec3Iter>
00164 inline
00165 MbVec3SetI<_Vec3T>::MbVec3SetI(_Vec3Iter beginCoord, _Vec3Iter endCoord,
00166 const std::string& name,
00167 DataBinding binding)
00168 : MbVec3dSet(name,binding), m_coords(beginCoord,endCoord)
00169 {
00170 s_numInstance++;
00171 }
00172
00173
00174 template <typename _Vec3T>
00175 inline
00176 MbVec3SetI<_Vec3T>::MbVec3SetI(const MeXVec3dSetI& vec3set)
00177 : MbVec3dSet(vec3set.getName(), vec3set.getBinding())
00178 {
00179 s_numInstance++;
00180 m_coords.resize(vec3set.getSize());
00181 for (size_t n = 0; n < m_coords.size(); ++n)
00182 m_coords[n] = vec3set.get(n);
00183 }
00184
00185
00186 template <typename _Vec3T>
00187 template <typename _Vec3Iter>
00188 inline void
00189 MbVec3SetI<_Vec3T>::assign(_Vec3Iter beginCoord, _Vec3Iter endCoord)
00190 {
00191 m_coords.assign(beginCoord,endCoord);
00192 m_timeStamp = MxTimeStamp::getTimeStamp();
00193 }
00194
00195
00196
00197 template <typename _Vec3T>
00198 inline MbVec3d
00199 MbVec3SetI<_Vec3T>::get(size_t i) const
00200 {
00201 return (MbVec3d)m_coords[i];
00202 }
00203
00204
00205 template <typename _Vec3T>
00206 inline size_t
00207 MbVec3SetI<_Vec3T>::getSize() const
00208 {
00209 return m_coords.size();
00210 }
00211
00212
00213
00214 template <typename _Vec3T>
00215 inline MbVec3d
00216 MbVec3SetI<_Vec3T>::getMin() const
00217 {
00218 size_t minvecId = 0;
00219 double minvecLn = 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 < minvecLn)
00225 {
00226 minvecLn = vecLn;
00227 minvecId = i;
00228 }
00229 }
00230 return MbVec3d(m_coords[minvecId]);
00231 }
00232
00233
00234
00235 template <typename _Vec3T>
00236 inline MbVec3d
00237 MbVec3SetI<_Vec3T>::getMax() const
00238 {
00239 size_t maxvecId = 0;
00240 double maxvecLn = m_coords[0].length();
00241
00242 for (size_t i=1; i<m_coords.size(); ++i)
00243 {
00244 double vecLn = m_coords[i].length();
00245 if (vecLn > maxvecLn)
00246 {
00247 maxvecLn = vecLn;
00248 maxvecId = i;
00249 }
00250 }
00251 return MbVec3d(m_coords[maxvecId]);
00252 }
00253
00254
00255 template <typename _Vec3T>
00256 inline std::ostream&
00257 MbVec3SetI<_Vec3T>::toStream(std::ostream& s) const
00258 {
00259 s << "# vec3set name" << std::endl;
00260 s << getName() << std::endl;
00261 s << "# vec3set size" << std::endl;
00262 s << getSize() << std::endl;
00263 for (size_t i=0; i< m_coords.size(); ++i)
00264 s << m_coords[i] << std::endl;
00265
00266 return s;
00267 }
00268
00269 #ifdef _WIN32
00270 # pragma warning( pop )
00271 #endif
00272
00273 #endif
00274
00275
00276
00277
00278
00279
00280
00281
00282