Salome HOME
Merge from V6_2_BR 23/12/2010
[modules/smesh.git] / src / SMDS / SMDS_VtkEdge.cxx
1 #include "SMDS_VtkEdge.hxx"
2 #include "SMDS_MeshNode.hxx"
3 #include "SMDS_Mesh.hxx"
4 #include "SMDS_VtkCellIterator.hxx"
5
6 #include "utilities.h"
7
8 #include <vector>
9 #include <cassert>
10
11 using namespace std;
12
13 SMDS_VtkEdge::SMDS_VtkEdge()
14 {
15 }
16
17 SMDS_VtkEdge::SMDS_VtkEdge(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
18 {
19   init(nodeIds, mesh);
20 }
21
22 SMDS_VtkEdge::~SMDS_VtkEdge()
23 {
24 }
25
26 void SMDS_VtkEdge::init(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
27 {
28   SMDS_MeshEdge::init();
29   vtkUnstructuredGrid* grid = mesh->getGrid();
30   myMeshId = mesh->getMeshId();
31   vtkIdType aType = VTK_LINE;
32   if (nodeIds.size() == 3)
33     aType = VTK_QUADRATIC_EDGE;
34   myVtkID = grid->InsertNextLinkedCell(aType, nodeIds.size(), &nodeIds[0]);
35   mesh->setMyModified();
36   //MESSAGE("SMDS_VtkEdge::init myVtkID " << myVtkID);
37 }
38
39 bool SMDS_VtkEdge::ChangeNodes(const SMDS_MeshNode * node1, const SMDS_MeshNode * node2)
40 {
41   const SMDS_MeshNode* nodes[] = { node1, node2 };
42   SMDS_Mesh::_meshList[myMeshId]->setMyModified();
43   return ChangeNodes(nodes, 2);
44 }
45
46 bool SMDS_VtkEdge::ChangeNodes(const SMDS_MeshNode* nodes[], const int nbNodes)
47 {
48   vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
49   vtkIdType npts = 0;
50   vtkIdType* pts = 0;
51   grid->GetCellPoints(myVtkID, npts, pts);
52   if (nbNodes != npts)
53     {
54       MESSAGE("ChangeNodes problem: not the same number of nodes " << npts << " -> " << nbNodes);
55       return false;
56     }
57   for (int i = 0; i < nbNodes; i++)
58     {
59       pts[i] = nodes[i]->getVtkId();
60     }
61   SMDS_Mesh::_meshList[myMeshId]->setMyModified();
62   return true;
63 }
64
65 bool SMDS_VtkEdge::IsMediumNode(const SMDS_MeshNode* node) const
66 {
67   vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
68   vtkIdType npts = 0;
69   vtkIdType* pts = 0;
70   grid->GetCellPoints(myVtkID, npts, pts);
71   //MESSAGE("IsMediumNode " << npts  << " " << (node->getVtkId() == pts[npts-1]));
72   return ((npts == 3) && (node->getVtkId() == pts[2]));
73 }
74
75 void SMDS_VtkEdge::Print(std::ostream & OS) const
76 {
77   OS << "edge <" << GetID() << "> : ";
78 }
79
80 int SMDS_VtkEdge::NbNodes() const
81 {
82   vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
83   int nbPoints = grid->GetCell(myVtkID)->GetNumberOfPoints();
84   assert(nbPoints >= 2);
85   return nbPoints;
86 }
87
88 int SMDS_VtkEdge::NbEdges() const
89 {
90   return 1;
91 }
92
93 SMDSAbs_EntityType SMDS_VtkEdge::GetEntityType() const
94 {
95   if (NbNodes() == 2)
96     return SMDSEntity_Edge;
97   else
98     return SMDSEntity_Quad_Edge;
99 }
100
101 vtkIdType SMDS_VtkEdge::GetVtkType() const
102 {
103   if (NbNodes() == 2)
104     return VTK_LINE;
105   else
106     return VTK_QUADRATIC_EDGE;
107
108 }
109
110 /*!
111  * \brief Return node by its index
112  * \param ind - node index
113  * \retval const SMDS_MeshNode* - the node
114  */
115 const SMDS_MeshNode*
116 SMDS_VtkEdge::GetNode(const int ind) const
117 {
118   // TODO optimize !!
119   return SMDS_MeshElement::GetNode(ind);
120 }
121
122 bool SMDS_VtkEdge::IsQuadratic() const
123 {
124   if (this->NbNodes() > 2)
125     return true;
126   else
127     return false;
128 }
129
130 SMDS_ElemIteratorPtr SMDS_VtkEdge::elementsIterator(SMDSAbs_ElementType type) const
131 {
132   switch (type)
133   {
134     case SMDSAbs_Node:
135       return SMDS_ElemIteratorPtr(new SMDS_VtkCellIterator(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
136     default:
137       MESSAGE("ERROR : Iterator not implemented")
138       ;
139       return SMDS_ElemIteratorPtr((SMDS_ElemIterator*) NULL);
140   }
141 }
142
143 SMDS_ElemIteratorPtr SMDS_VtkEdge::nodesIteratorToUNV() const
144 {
145   return SMDS_ElemIteratorPtr(new SMDS_VtkCellIteratorToUNV(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
146 }
147
148 SMDS_ElemIteratorPtr SMDS_VtkEdge::interlacedNodesElemIterator() const
149 {
150   return SMDS_ElemIteratorPtr(new SMDS_VtkCellIteratorToUNV(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
151 }