Salome HOME
PR: debug SMDS memimp
[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         vtkUnstructuredGrid* grid = mesh->getGrid();
29         myIdInShape = -1;
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 }
36
37 bool SMDS_VtkEdge::ChangeNodes(const SMDS_MeshNode * node1,
38                 const SMDS_MeshNode * node2)
39 {
40         return true;
41 }
42
43 void SMDS_VtkEdge::Print(std::ostream & OS) const
44 {
45         OS << "edge <" << GetID() << "> : ";
46 }
47
48 int SMDS_VtkEdge::NbNodes() const
49 {
50         vtkUnstructuredGrid* grid =SMDS_Mesh::_meshList[myMeshId]->getGrid();
51         int nbPoints = grid->GetCell(myVtkID)->GetNumberOfPoints();
52         assert(nbPoints >=2);
53         return nbPoints;
54 }
55
56 int SMDS_VtkEdge::NbEdges() const
57 {
58         return 1;
59 }
60
61 SMDSAbs_EntityType SMDS_VtkEdge::GetEntityType() const
62 {
63         if (NbNodes() == 2)
64           return SMDSEntity_Edge;
65         else
66           return SMDSEntity_Quad_Edge;
67 }
68
69 vtkIdType SMDS_VtkEdge::GetVtkType() const
70 {
71         if (NbNodes() == 2)
72                 return VTK_LINE;
73         else
74                 return VTK_QUADRATIC_EDGE;
75
76 }
77
78 /*!
79  * \brief Return node by its index
80  * \param ind - node index
81  * \retval const SMDS_MeshNode* - the node
82  */
83 const SMDS_MeshNode*
84 SMDS_VtkEdge::GetNode(const int ind) const
85 {
86   return SMDS_MeshElement::GetNode(ind); // --- a optimiser !
87 }
88
89 bool SMDS_VtkEdge::IsQuadratic() const
90 {
91   if (this->NbNodes() > 2)
92         return true;
93   else
94         return false;
95 }
96
97 SMDS_ElemIteratorPtr SMDS_VtkEdge::elementsIterator(SMDSAbs_ElementType type) const
98 {
99         switch (type)
100         {
101         case SMDSAbs_Node:
102                 return SMDS_ElemIteratorPtr(new SMDS_VtkCellIterator(
103                                 SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
104         default:
105                 MESSAGE("ERROR : Iterator not implemented");
106                 return SMDS_ElemIteratorPtr((SMDS_ElemIterator*) NULL);
107         }
108 }