Salome HOME
Copyright update 2022
[modules/geom.git] / src / XAO / XAO_BrepGeometry.hxx
1 // Copyright (C) 2013-2022  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 // Author : Frederic Pons (OpenCascade)
20
21 #ifndef __XAO_BREPGEOMETRY_HXX__
22 #define __XAO_BREPGEOMETRY_HXX__
23
24 #include <string>
25 #include <vector>
26
27 #include <TopoDS_Shape.hxx>
28
29 #include "XAO.hxx"
30 #include "XAO_XaoUtils.hxx"
31 #include "XAO_Geometry.hxx"
32
33 #ifdef WIN32
34 #pragma warning(disable:4290) // Warning Exception ...
35 #endif
36
37
38 namespace XAO
39 {
40     /**
41      * @class BrepGeometry
42      * Representation of a BRep Geometry.
43      */
44     class XAO_EXPORT BrepGeometry : public Geometry
45     {
46     public:
47         /**
48          * Default Constructor.
49          */
50         BrepGeometry();
51
52         /**
53          * Constructor.
54          * @param name the name of the geometry.
55          */
56         BrepGeometry(const std::string& name);
57
58         virtual ~BrepGeometry() {}
59
60         /**
61          * Gets the format of the geometry.
62          * @return the format of the geometry.
63          */
64         virtual XAO::Format getFormat() { return XAO::BREP; }
65
66         /**
67          * Gets the shape as a string.
68          * @return the shape as a string.
69          */
70         virtual const std::string getShapeString();
71
72         /**
73          * Sets the shape from a string.
74          * @param shape the shape as a string.
75          */
76         virtual void setShapeString(const std::string& shape);
77
78         /**
79          * Writes shape to a file
80          * @param fileName the path to the file
81          */
82         virtual void writeShapeFile(const std::string& fileName) ;
83
84         /**
85          * Reads shape from a file
86          * @param fileName the path to the file
87          */
88         virtual void readShapeFile(const std::string& fileName) ;
89
90 #ifdef SWIG
91         %pythoncode %{
92         def setShape(self, shape):
93             if shape is not None and 'GetShapeStream' in dir(shape):
94                 self.setShapeString(shape.GetShapeStream())
95             else:
96                 raise XAO_Exception("Cannot set shape")
97         %}
98 #endif
99
100         /**
101          * Gets the shape as a TopoDS_Shape.
102          * @return the TopoDS_Shape.
103          */
104         TopoDS_Shape getTopoDS_Shape();
105
106         /**
107          * Sets the shape from a TopoDS_Shape.
108          * @param shape the TopoDS_Shape to set.
109          */
110         void setTopoDS_Shape(const TopoDS_Shape& shape);
111
112         /**
113          * Gives the two extrimities of an edge.
114          * @param edgeIndex the index of the edge.
115          * @param vertexA
116          * @param vertexB
117          */
118         void getEdgeVertices(int edgeIndex, int& vertexA, int& vertexB);
119
120         /**
121          * Gets the number of wires of a face (including holes).
122          * @param faceIndex the index of the face.
123          * @return the number of wires.
124          */
125         int countFaceWires(int faceIndex);
126
127         /**
128          * Gets the indices of the wires of the face.
129          * @param faceIndex the index of the face.
130          * @param wireIndex the index of the wire.
131          * @return the list of wires for the given face.
132          */
133         std::vector<int> getFaceEdges(int faceIndex, int wireIndex);
134
135         /**
136          * Gets the number of shells of a solid (including cavities).
137          * @param solidIndex the index of the solid.
138          * @return the number of shells.
139          */
140         int countSolidShells(int solidIndex);
141
142         /**
143          * Gets the indices of the shells of the solids.
144          * @param solidIndex the index of the solid.
145          * @param shellIndex the index of the shell (for the given solid).
146          * @return the list of shells for the given solid.
147          */
148         std::vector<int> getSolidFaces(int solidIndex, int shellIndex);
149
150         /**
151          * Gets the coordinates of a vertex.
152          * @param vertexIndex the index of the vertex.
153          * @param xCoord the X coordinate.
154          * @param yCoord the Y coordinate.
155          * @param zCoord the Z coordinate.
156          */
157         void getVertexXYZ(int vertexIndex, double& xCoord, double& yCoord, double& zCoord)
158         ;
159
160         /**
161          * Gets the length of an edge.
162          * @param index the index of the edge.
163          * @return the length of the edge.
164          */
165         double getEdgeLength(int index);
166
167         /**
168          * Gets the are of a face.
169          * @param index the index of a face.
170          * @return the area of the face.
171          */
172         double getFaceArea(int index);
173
174         /**
175          * Gets the volume of a solid.
176          * @param index the index of the solid.
177          * @return the volume of the solid.
178          */
179         double getSolidVolume(int index);
180
181         /**
182          * Gets the ID of a vertex.
183          * @param index the index of the vertex.
184          * @return the ID of the vertex.
185          */
186         int getVertexID(int index);
187
188         /**
189          * Gets the ID of an edge.
190          * @param index the index of the edge.
191          * @return the ID of the edge.
192          */
193         int getEdgeID(int index);
194
195         /**
196          * Gets the ID of a face.
197          * @param index the index of the face.
198          * @return the ID of the face.
199          */
200         int getFaceID(int index);
201
202         /**
203          * Gets the ID of a solid.
204          * @param index the index of the solid.
205          * @return the ID of the solid.
206          */
207         int getSolidID(int index);
208
209         /**
210          * Sets the ID of a vertex.
211          * @param index the index of the vertex to set.
212          * @param id the id to set.
213          */
214         void setVertexID(int index, int id);
215
216         /**
217          * Sets the ID of an edge.
218          * @param index the index of the edge to set.
219          * @param id the id to set.
220          */
221         void setEdgeID(int index, int id);
222
223         /**
224          * Sets the ID of a face.
225          * @param index the index of the face to set.
226          * @param id the id to set.
227          */
228         void setFaceID(int index, int id);
229
230         /**
231          * Sets the ID of a solid.
232          * @param index the index of the solid to set.
233          * @param id the id to set.
234          */
235         void setSolidID(int index, int id);
236
237         /**
238          * Finds a vertex with its ID.
239          * @param id the ID of the vertex.
240          * @return the index of the vertex.
241          */
242         int findVertex(int id);
243
244         /**
245          * Finds an edge with its ID.
246          * @param id the ID of the edge.
247          * @return the index of the edge.
248          */
249         int findEdge(int id);
250
251         /**
252          * Finds a face with its ID.
253          * @param id the ID of the face.
254          * @return the index of the face.
255          */
256         int findFace(int id);
257
258         /**
259          * Finds a solid with its ID.
260          * @param id the ID of the solid.
261          * @return th index of the solid.
262          */
263         int findSolid(int id);
264
265         /**
266          * Finds the name of a vertex with its ID.
267          * @param id the ID of the vertex.
268          * @return the name of the vertex.
269          */
270         const std::string findVertexName(int id);
271
272         /**
273          * Finds the name of an edge with its ID.
274          * @param id the ID of the edge.
275          * @return the name of the edge.
276          */
277         const std::string findEdgeName(int id);
278
279         /**
280          * Finds the name of a face with its ID.
281          * @param id the ID of the face.
282          * @return the name of the face.
283          */
284         const std::string findFaceName(int id);
285
286         /**
287          * Finds the name of a solid with its ID.
288          * @param id the ID of the solid.
289          * @return the name of the solid.
290          */
291         const std::string findSolidName(int id);
292
293         /**
294          * Changes the name of a vertex.
295          * @param id the ID of the vertex.
296          * @param name the name to set.
297          */
298         void changeVertexName(int id, const std::string& name) ;
299
300         /**
301          * Changes the name of an edge.
302          * @param id the ID of the edge
303          * @param name the name to set.
304          */
305         void changeEdgeName(int id, const std::string& name) ;
306
307         /**
308          * Changes the name of a face.
309          * @param id the ID of the face.
310          * @param name the name to set.
311          */
312         void changeFaceName(int id, const std::string& name) ;
313
314         /**
315          * Changes the name of a solid.
316          * @param id the ID of the solid.
317          * @param name the name to set.
318          */
319         void changeSolidName(int id, const std::string& name) ;
320
321     private:
322         void initIds();
323         void initListIds(const TopAbs_ShapeEnum& shapeType, GeometricElementList& eltList);
324         TopoDS_Shape getSubShape(const TopoDS_Shape& mainShape, const TopAbs_ShapeEnum& shapeType, int shapeIndex)
325             ;
326         int countGeometricalElements(const TopoDS_Shape& shape, const TopAbs_ShapeEnum& shapeType);
327         std::vector<int> getGeometricalElements(const TopoDS_Shape& shape, const TopAbs_ShapeEnum& shapeType, XAO::Dimension dim);
328         int findElement(XAO::Dimension dim, int id)
329             ;
330
331     private:
332         TopoDS_Shape m_shape;
333     };
334 }
335
336 #endif // __XAO_BREPGEOMETRY_HXX__