00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _MbPolyhedronCellsSet_H
00024 #define _MbPolyhedronCellsSet_H
00025
00026 #ifdef _WIN32
00027 #pragma warning(push)
00028 #pragma warning(disable:4250)
00029 #pragma warning(disable:4251)
00030 #endif
00031
00032 #include <MeshVizXLM/mesh/topology/MiVolumeTopologyExplicitI.h>
00033 #include <topology/MbTopologyI.h>
00034 #include <cell/MbPolyhedronCell.h>
00035 #include <MbError.h>
00036
00037 #include <Inventor/STL/algorithm>
00038
00044 class MbPolyhedronCellsSet : virtual public MiVolumeTopologyExplicitI, public MbTopologyI
00045 {
00046 public:
00047
00051 MbPolyhedronCellsSet();
00052
00057 template <typename _FacetNodeIter, typename _NumNodeIter, typename _NumFacetIter>
00058 void assign(_FacetNodeIter beginFacetNode, _FacetNodeIter endFacetNode,
00059 _NumNodeIter beginNumNode, _NumNodeIter endNumNode,
00060 _NumFacetIter beginNumFacet, _NumFacetIter endNumFacet);
00061
00066 template <typename _FacetNodeIter, typename _FacetRefIter>
00067 void assign(_FacetNodeIter beginFacetNode, _FacetNodeIter endFacetNode,
00068 _FacetRefIter beginFacetRef, _FacetRefIter endFacetRef,
00069 const std::vector<size_t>* cellFacets, size_t numCells);
00070
00074 virtual const MbPolyhedronCell* getCell(size_t cellId) const;
00075
00079 virtual size_t getNumCells() const;
00080
00084 virtual size_t getBeginNodeId() const
00085 {
00086 return m_beginNodeId;
00087 }
00088
00092 virtual size_t getEndNodeId() const
00093 {
00094 return m_endNodeId;
00095 }
00096
00097 private:
00098 std::vector<MbPolyhedronCell> m_cells;
00099 size_t m_beginNodeId;
00100 size_t m_endNodeId;
00101 };
00102
00103
00104
00105 inline
00106 MbPolyhedronCellsSet::MbPolyhedronCellsSet()
00107 : m_beginNodeId(0), m_endNodeId(0)
00108 {
00109 }
00110
00111
00112
00113 inline const MbPolyhedronCell*
00114 MbPolyhedronCellsSet::getCell(size_t cellId) const
00115 {
00116 #ifndef MBMESH_DONT_USE_ASSERT
00117 if (hasDeadCells() && isDead(cellId))
00118 throw MbError("accessing dead cells");
00119 #endif
00120 return &(m_cells[cellId]);
00121 }
00122
00123
00124 inline size_t
00125 MbPolyhedronCellsSet::getNumCells() const
00126 {
00127 return m_cells.size();
00128 }
00129
00130
00131 template <typename _FacetNodeIter, typename _NumNodeIter, typename _NumFacetIter>
00132 inline void
00133 MbPolyhedronCellsSet::assign(_FacetNodeIter beginFacetNode, _FacetNodeIter endFacetNode,
00134 _NumNodeIter beginNumNode, _NumNodeIter endNumNode,
00135 _NumFacetIter beginNumFacet, _NumFacetIter endNumFacet)
00136 {
00137 size_t numCells = std::distance(beginNumFacet,endNumFacet);
00138 m_beginNodeId = std::numeric_limits<size_t>::max();
00139
00140 m_cells.clear();
00141 m_cells.reserve(numCells);
00142 _FacetNodeIter beginFacet, itFacetNode = beginFacetNode;
00143 _NumNodeIter beginNum, itNumNode = beginNumNode;
00144 for (_NumFacetIter itNum = beginNumFacet; itNum != endNumFacet; ++itNum)
00145 {
00146 beginNum = itNumNode;
00147 beginFacet = itFacetNode;
00148 while ( itNumNode != beginNum + *itNum )
00149 {
00150 for ( size_t i =0; i < *itNumNode; ++i)
00151 {
00152 if ( *itFacetNode + 1 > m_endNodeId)
00153 m_endNodeId = *itFacetNode + 1;
00154 if ( *itFacetNode < m_beginNodeId)
00155 m_beginNodeId = *itFacetNode;
00156 ++itFacetNode;
00157 }
00158 ++itNumNode;
00159 }
00160 m_cells.push_back(MbPolyhedronCell(beginFacet,itFacetNode,beginNum,itNumNode));
00161 }
00162 m_timeStamp = MxTimeStamp::getTimeStamp();
00163 }
00164
00165
00166 template <typename _FacetNodeIter, typename _FacetRefIter>inline void
00167 MbPolyhedronCellsSet::assign(_FacetNodeIter beginFacetNode, _FacetNodeIter endFacetNode,
00168 _FacetRefIter beginFacetRef, _FacetRefIter endFacetRef,
00169 const std::vector<size_t>* cellFacets, size_t numCells)
00170 {
00171 m_cells.clear();
00172 m_cells.reserve(numCells);
00173 std::vector<size_t> facetNodes;
00174 std::vector<size_t> numFacetNodes;
00175 _FacetNodeIter itFacetNode;
00176 _FacetRefIter facetRef, lastFacetNode;
00177 std::vector<size_t>::const_iterator itCellFacets;
00178
00179 m_beginNodeId = std::numeric_limits<size_t>::max();
00180 m_endNodeId = 0;
00181
00182 for (size_t n = 0; n < numCells; ++n)
00183 {
00184 facetNodes.clear();
00185 numFacetNodes.clear();
00186 numFacetNodes.reserve(cellFacets[n].size());
00187 for (itCellFacets = cellFacets[n].begin(); itCellFacets != cellFacets[n].end(); ++itCellFacets)
00188 {
00189 facetRef = beginFacetRef + *itCellFacets;
00190 itFacetNode = beginFacetNode + *facetRef++;
00191 lastFacetNode = beginFacetNode + *facetRef;
00192 numFacetNodes.push_back(0);
00193 while ( itFacetNode != lastFacetNode )
00194 {
00195 facetNodes.push_back(*itFacetNode);
00196 numFacetNodes.back()++;
00197 if ( *itFacetNode + 1 > m_endNodeId)
00198 m_endNodeId = *itFacetNode + 1;
00199 if ( *itFacetNode < m_beginNodeId)
00200 m_beginNodeId = *itFacetNode;
00201 ++itFacetNode;
00202 }
00203 }
00204 m_cells.push_back(MbPolyhedronCell(facetNodes.begin(),facetNodes.end(),numFacetNodes.begin(),numFacetNodes.end()));
00205 }
00206 m_timeStamp = MxTimeStamp::getTimeStamp();
00207 }
00208
00209 #ifdef _WIN32
00210 #pragma warning(pop)
00211 #endif
00212
00213 #endif
00214
00215