]> SALOME platform Git repositories - modules/smesh.git/blob - src/SMDS/SMDS_VtkFace.cxx
Salome HOME
ad53647cc5512bf63cf61c851bb84ab0c0d34ab9
[modules/smesh.git] / src / SMDS / SMDS_VtkFace.cxx
1 #include "SMDS_VtkFace.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
10 using namespace std;
11
12 SMDS_VtkFace::SMDS_VtkFace()
13 {
14 }
15
16 SMDS_VtkFace::SMDS_VtkFace(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
17 {
18         init(nodeIds, mesh);
19 }
20
21 SMDS_VtkFace::~SMDS_VtkFace()
22 {
23 }
24
25 void SMDS_VtkFace::init(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
26 {
27         vtkUnstructuredGrid* grid = mesh->getGrid();
28         myIdInShape = -1;
29         myMeshId = mesh->getMeshId();
30         vtkIdType aType = VTK_TRIANGLE;
31         switch(nodeIds.size())
32           {
33           case  3: aType = VTK_TRIANGLE;           break;
34           case  4: aType = VTK_QUAD;               break;
35           case  6: aType = VTK_QUADRATIC_TRIANGLE; break;
36           case  8: aType = VTK_QUADRATIC_QUAD;     break;
37           default: aType = VTK_TRIANGLE; break;
38           }
39         myVtkID = grid->InsertNextLinkedCell(aType, nodeIds.size(), &nodeIds[0]);
40 }
41
42 bool SMDS_VtkFace::ChangeNodes(const SMDS_MeshNode* nodes[], const int nbNodes)
43 {
44         return true;
45 }
46
47 void SMDS_VtkFace::Print(std::ostream & OS) const
48 {
49         OS << "edge <" << GetID() << "> : ";
50 }
51
52 int SMDS_VtkFace::NbEdges() const
53 {
54    switch(NbNodes())
55          {
56          case 3:
57          case 6: return 3;
58          case 4:
59          case 8: return 4;
60          default: MESSAGE("invalid number of nodes");
61          }
62    return 0;
63 }
64
65 int SMDS_VtkFace::NbFaces() const
66 {
67         return 1;
68 }
69
70 int SMDS_VtkFace::NbNodes() const
71 {
72         vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
73         int nbPoints = grid->GetCell(myVtkID)->GetNumberOfPoints();
74         return nbPoints;
75 }
76
77 /*!
78  * \brief Return node by its index
79  * \param ind - node index
80  * \retval const SMDS_MeshNode* - the node
81  */
82 const SMDS_MeshNode*
83 SMDS_VtkFace::GetNode(const int ind) const
84 {
85   return SMDS_MeshElement::GetNode(ind); // --- a optimiser !
86 }
87
88 bool SMDS_VtkFace::IsQuadratic() const
89 {
90   if (this->NbNodes() > 5)
91         return true;
92   else
93         return false;
94 }
95
96 SMDSAbs_EntityType SMDS_VtkFace::GetEntityType() const
97 {
98         SMDSAbs_EntityType aType = SMDSEntity_Triangle;
99         switch(NbNodes())
100           {
101           case  3:
102           case  6: aType = SMDSEntity_Triangle;   break;
103           case  4:
104           case  8: aType = SMDSEntity_Quadrangle; break;
105           }
106         return aType;
107 }
108
109 vtkIdType SMDS_VtkFace::GetVtkType() const
110 {
111         switch(NbNodes())
112           {
113           case  3: return VTK_TRIANGLE;
114           case  6: return VTK_QUADRATIC_TRIANGLE;
115           case  4: return VTK_QUAD;
116           case  8: return VTK_QUADRATIC_QUAD;
117           }
118 }
119
120 SMDS_ElemIteratorPtr SMDS_VtkFace::elementsIterator(SMDSAbs_ElementType type) const
121 {
122         switch (type)
123         {
124         case SMDSAbs_Node:
125                 return SMDS_ElemIteratorPtr(new SMDS_VtkCellIterator(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
126         default:
127                 MESSAGE("ERROR : Iterator not implemented");
128                 return SMDS_ElemIteratorPtr((SMDS_ElemIterator*) NULL);
129         }
130 }
131