Salome HOME
NRI : Change lGeometryClient by lGEOMClient.
[modules/smesh.git] / src / SMDS / SMDS_MeshPyramid.cxx
1 using namespace std;
2 // File:        SMDS_MeshPyramid.cxx
3 // Created:     Wed Jan 23 17:02:34 2002
4 // Author:      Jean-Michel BOULCOURT
5 //              <jmb@coulox.paris1.matra-dtv.fr>
6
7
8 #include "SMDS_MeshPyramid.ixx"
9 #include <Standard_ConstructionError.hxx>
10
11
12 //=======================================================================
13 //function : SMDS_MeshPyramid
14 //purpose  : Pyramid
15 //=======================================================================
16
17 SMDS_MeshPyramid::SMDS_MeshPyramid(const Standard_Integer ID,
18                                    const Standard_Integer idnode1, 
19                                    const Standard_Integer idnode2, 
20                                    const Standard_Integer idnode3,
21                                    const Standard_Integer idnode4,
22                                    const Standard_Integer idnode5):SMDS_MeshVolume(ID,5)
23 {
24   SetConnections(idnode1,idnode2,idnode3,idnode4,idnode5);
25   ComputeKey();
26 }
27
28
29
30 //=======================================================================
31 //function : SetConnections
32 //purpose  : Pyramid
33 //=======================================================================
34 void SMDS_MeshPyramid::SetConnections(const Standard_Integer idnode1, 
35                                       const Standard_Integer idnode2,
36                                       const Standard_Integer idnode3,
37                                       const Standard_Integer idnode4,
38                                       const Standard_Integer idnode5)
39 {
40
41   Standard_Integer idmin = (idnode1 < idnode2 ? idnode1 : idnode2);
42   idmin = (idmin < idnode3 ? idmin : idnode3);
43   idmin = (idmin < idnode4 ? idmin : idnode4);
44   idmin = (idmin < idnode5 ? idmin : idnode5);
45
46   myNodes[0] = idmin;
47   if (idmin == idnode1) { // 1 2 3 4 5
48     myNodes[1] = idnode2;
49     myNodes[2] = idnode3;
50     myNodes[3] = idnode4;
51     myNodes[4] = idnode5;
52   } else if (idmin == idnode2) { // 2 3 4 5 1
53     myNodes[1] = idnode3;
54     myNodes[2] = idnode4;
55     myNodes[3] = idnode5;
56     myNodes[4] = idnode1;
57   } else if (idmin == idnode3) { // 3 4 5 1 2
58     myNodes[1] = idnode4;
59     myNodes[2] = idnode5;
60     myNodes[3] = idnode1;
61     myNodes[4] = idnode2;
62   } else if (idmin == idnode4) { // 4 5 1 2 3
63     myNodes[1] = idnode5;
64     myNodes[2] = idnode1;
65     myNodes[3] = idnode2;
66     myNodes[4] = idnode3;
67   } else {                      // 5 1 2 3 4
68     myNodes[1] = idnode1;
69     myNodes[2] = idnode2;
70     myNodes[3] = idnode3;
71     myNodes[4] = idnode4;
72   }
73
74 }
75
76 //=======================================================================
77 //function : NodesOfFace
78 //purpose  : returns the rank node in mynodes. Useful to extract faces from volume
79 //=======================================================================
80 Standard_Integer SMDS_MeshPyramid::NodesOfFace(const Standard_Integer rankface, 
81                                                const Standard_Integer ranknode)
82 {
83   static Standard_Integer facenode[5][4] = {
84     {0,1,2,3},
85     {0,4,1,-1},
86     {1,4,2,-1},
87     {2,4,3,-1},
88     {0,3,4,-1}
89   };
90
91   return facenode[rankface-1][ranknode-1];
92 }
93
94 //=======================================================================
95 //function : NodesOfEdge
96 //purpose  : returns the rank node in mynodes. Useful to extract edges from volume
97 //=======================================================================
98 Standard_Integer SMDS_MeshPyramid::NodesOfEdge(const Standard_Integer rankedge, 
99                                                const Standard_Integer ranknode) const
100 {
101   static Standard_Integer faceedge[8][2] = {
102     {0,1},
103     {1,2},
104     {2,3},
105     {0,3},
106     {0,4},
107     {1,4},
108     {2,4},
109     {3,4}
110
111   };
112
113   return faceedge[rankedge-1][ranknode-1];
114 }
115
116
117 //=======================================================================
118 //function : GetFaceDefinedByNodes
119 //purpose  : 
120 //=======================================================================
121 void SMDS_MeshPyramid::GetFaceDefinedByNodes(const Standard_Integer rank, 
122                                              const Standard_Address idnode,
123                                              Standard_Integer& nb) const
124 {
125   Standard_Integer *ptr;
126   ptr = (Standard_Integer *)idnode;
127   ptr[0] = myNodes[NodesOfFace(rank,1)];
128   ptr[1] = myNodes[NodesOfFace(rank,2)];
129   ptr[2] = myNodes[NodesOfFace(rank,3)];
130   nb = (NodesOfFace(rank,4) == -1 ? 3 : 4);
131   if (nb == 4)
132     ptr[3] = myNodes[NodesOfFace(rank,4)];
133
134 }
135
136 //=======================================================================
137 //function : GetEdgeDefinedByNodes
138 //purpose  : 
139 //=======================================================================
140 void SMDS_MeshPyramid::GetEdgeDefinedByNodes(const Standard_Integer rank, 
141                                             Standard_Integer& idnode1,
142                                             Standard_Integer& idnode2) const
143 {
144   idnode1 = myNodes[NodesOfEdge(rank,1)];
145   idnode2 = myNodes[NodesOfEdge(rank,2)];
146 }
147