Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : OCCQueryEngine.hpp
3 : : //
4 : : // Purpose : OCC geometry engine.
5 : : //
6 : : // This class is implemented as a Singleton pattern. Only
7 : : // one instance is created and it is accessed through the
8 : : // {instance()} static member function.
9 : : //
10 : : // Special Notes :
11 : : //
12 : : // Creator : Jane Hu
13 : : //
14 : : // Creation Date : 10/07
15 : : //
16 : : //-------------------------------------------------------------------------
17 : :
18 : : #ifndef OCC_GEOMETRY_ENGINE_HPP
19 : : #define OCC_GEOMETRY_ENGINE_HPP
20 : :
21 : : // ********** BEGIN STANDARD INCLUDES **********
22 : :
23 : : #include <typeinfo>
24 : : #if !defined(NT) && !defined(CANT_USE_STD)
25 : : using std::type_info;
26 : : #endif
27 : :
28 : : // ********** END STANDARD INCLUDES **********
29 : : #include "TDF_Label.hxx"
30 : : // ********** BEGIN CUBIT INCLUDES **********
31 : : #include "CubitFileIOWrapper.hpp"
32 : : #include "GeometryQueryEngine.hpp"
33 : : #include "Handle_TDocStd_Document.hxx"
34 : : #include <map>
35 : :
36 : : // ********** END CUBIT INCLUDES **********
37 : :
38 : : // ********** BEGIN FORWARD DECLARATIONS
39 : : class BRep_Builder;
40 : : class TopologyEntity;
41 : : class TopologyBridge;
42 : : class RefEntity;
43 : : class Body;
44 : : class Shell;
45 : : class ShellSM;
46 : : class Loop;
47 : : class Chain;
48 : : class LoopSM;
49 : : class RefVolume;
50 : : class RefFace;
51 : : class RefEdge;
52 : : class RefVertex;
53 : : class TBPoint;
54 : : class Curve;
55 : : class Surface;
56 : : class Lump;
57 : : class BodySM;
58 : :
59 : : class GeometryEntity;
60 : : class BodySM;
61 : : class ShellSM;
62 : : class Surface;
63 : : class Curve;
64 : : class CoEdgeSM;
65 : : class TopologyEntity;
66 : : class CubitBox;
67 : : class CubitString;
68 : : class CubitSimpleAttrib;
69 : :
70 : : class OtherSolidModelingEntity;
71 : : class OCCLump;
72 : : class OCCShell;
73 : : class OCCLoop;
74 : : class OCCSurface;
75 : : class OCCBody;
76 : : class OCCCoEdge;
77 : : class OCCCurve;
78 : : class OCCPoint;
79 : :
80 : : class TopTools_DataMapOfShapeInteger;
81 : : class BRepAlgoAPI_BooleanOperation;
82 : : class TopTools_IndexedMapOfShape;
83 : : class BRepBuilderAPI_ModifyShape;
84 : : class TopoDS_Vertex;
85 : : class TopoDS_Edge;
86 : : class TopoDS_Shape;
87 : : class TopoDS_Wire;
88 : : class TopoDS_Face;
89 : : class TopoDS_Solid;
90 : : class TopoDS_Shell;
91 : : class TopoDS_Compound;
92 : : // ********** END FORWARD DECLARATIONS **********
93 : :
94 : : // ********** BEGIN MACRO DEFINITIONS **********
95 : : // ********** END MACRO DEFINITIONS **********
96 : :
97 : : // ********** BEGIN ENUM DEFINITIONS **********
98 : :
99 : : // ********** END ENUM DEFINITIONS **********
100 : : class OCCQueryEngine : public GeometryQueryEngine
101 : : {
102 : : public:
103 : : // ********** BEGIN FRIEND DECLARATIONS **********
104 : : friend class OCCSurface;
105 : :
106 : : // ********** END FRIEND DECLARATIONS **********
107 : :
108 : : //HEADER- Constructor and Destructor
109 : :
110 : : static OCCQueryEngine* instance();
111 : : //- Singleton pattern
112 : : //- Controlled access and creation of the sole instance of this class.
113 : :
114 : : CubitBoolean EXPORT_ATTRIB;
115 : :
116 : : void copy_attributes(TopoDS_Shape& old_shape,
117 : : TopoDS_Shape& new_shape);
118 : :
119 : : int update_OCC_map(TopoDS_Shape& old_shape, TopoDS_Shape& new_shape);
120 : :
121 : : virtual ~OCCQueryEngine();
122 : :
123 : 0 : const char* modeler_type()
124 : 0 : { return "OCC"; }
125 : :
126 : : TopoDS_Shape *get_TopoDS_Shape_of_entity( TopologyBridge * entity);
127 : :
128 : : void body_attributes_for_writing(DLIList<OCCBody*> &OCC_bodies, //input
129 : : BRep_Builder &B, //input
130 : : TopoDS_Compound &Co, //input and output,
131 : : DLIList<OCCLump*> &single_lumps, //output
132 : : DLIList< DLIList<CubitSimpleAttrib>*> &lists);
133 : :
134 : : int get_major_version();
135 : :
136 : : int get_minor_version();
137 : :
138 : : int get_subminor_version();
139 : :
140 : : CubitString get_engine_version_string();
141 : :
142 : : //HEADER- RTTI and safe casting functions.
143 : :
144 : : virtual const type_info& entity_type_info() const ;
145 : : //R- The geometric modeler type
146 : : //- This function returns the type of the geometric modeler.
147 : :
148 : 0 : virtual CubitBoolean is_solid_modeler_type() const
149 : 0 : {return CUBIT_FALSE;}
150 : : //R CubitBoolean
151 : : //R- This is not a solid modeling engine.
152 : : //HEADER- Functions for importing and exporting solid models.
153 : :
154 : : virtual CubitStatus restore_transform( BodySM* body );
155 : :
156 : : using GeometryQueryEngine::get_graphics;
157 : :
158 : : virtual CubitStatus get_graphics( Surface* surface_ptr,
159 : : GMem* gMem,
160 : : unsigned short normal_tolerance = 15,
161 : : double distance_tolerance = 0,
162 : : double longest_edge = 0) const;
163 : : CubitStatus get_graphics( TopoDS_Face* face_ptr,
164 : : GMem* g_mem,
165 : : unsigned short normal_tolerance = 15,
166 : : double distance_tolerance = 0,
167 : : double max_edge_length = 0) const;
168 : :
169 : :
170 : : virtual CubitStatus get_graphics( Curve* curve_ptr,
171 : : GMem* gMem = NULL,
172 : : double angle_tolerance=0,
173 : : double distance_tolerance=0,
174 : : double max_edge_length = 0.0 ) const;
175 : :
176 : :
177 : :
178 : : CubitStatus get_graphics( TopoDS_Edge* edge_ptr,
179 : : GMem* gMem = NULL,
180 : : double angle_tolerance = 0,
181 : : double distance_tolerance = 0,
182 : : double max_edge_length = 0 ) const;
183 : :
184 : :
185 : : //R CubitStatus
186 : : //R- CUBIT_SUCCESS/CUBIT_FAILURE
187 : : //I ref_edge_ptr
188 : : //I- The RefEdge for which hoops facetting information will be
189 : : //I- gathered.
190 : : //O numSteps
191 : : //O- The number of points in resulting polyline.
192 : : //O gMem
193 : : //O- The storage place for edges, involved in facetting.
194 : : //I tolerance
195 : : //I- The tolerance deviation used when facetting the curve (optional
196 : : //I- and currently IGNORED by this engine).
197 : : //- This function gathers and outputs edge information for
198 : : //- hoops involved in facetting a RefEdge. If all goes well,
199 : : //- CUBIT_SUCCESS is returned. Otherwise, CUBIT_FAILURE is
200 : : //- returned.
201 : :
202 : : virtual CubitStatus fire_ray( CubitVector &origin,
203 : : CubitVector &direction,
204 : : DLIList<TopologyBridge*> &at_entity_list,
205 : : DLIList<double> &ray_params,
206 : : int max_hits = 0,
207 : : double ray_radius = 0.0,
208 : : DLIList<TopologyBridge*> *hit_entity_list=0 ) const ;
209 : : //- Fire a ray at specified entities, returning the parameters (distances)
210 : : //- along the ray and optionally the entities hit. Returned lists are
211 : : //- appended to. Input entities can be any of bodies, volumes, faces,
212 : : //- edges or vertices. Optionally you can specify the maximum number of
213 : : //- hits to return (default = 0 = unlimited), and the ray radius to use for
214 : : //- intersecting the entities (default = 0.0 = use modeller default).
215 : :
216 : : virtual CubitStatus get_isoparametric_points(Surface* ,
217 : : int&, int&,
218 : : GMem*&) const;
219 : :
220 : : virtual CubitStatus get_u_isoparametric_points(Surface* ref_face_ptr,
221 : : double v, int& n,
222 : : GMem *&gMem) const;
223 : :
224 : : virtual CubitStatus get_v_isoparametric_points(Surface* ref_face_ptr,
225 : : double u, int&n,
226 : : GMem *&gMem) const;
227 : :
228 : : virtual CubitStatus transform_vec_position(
229 : : CubitVector const& ,
230 : : BodySM *,
231 : : CubitVector & ) const;
232 : :
233 : : virtual CubitStatus get_intersections( Curve*, CubitVector& point1,
234 : : CubitVector&,
235 : : DLIList<CubitVector>& ,
236 : : CubitBoolean,
237 : : CubitBoolean );
238 : :
239 : : virtual CubitStatus get_intersections( Curve* , Curve* ,
240 : : DLIList<CubitVector>& ,
241 : : CubitBoolean,
242 : : CubitBoolean );
243 : : virtual CubitStatus get_intersections( Curve* ref_edge, Surface* ref_face,
244 : : DLIList<CubitVector>& intersection_list,
245 : : CubitBoolean bounded = CUBIT_FALSE );
246 : :
247 : : virtual CubitStatus entity_extrema( DLIList<GeometryEntity*> &ref_entity_list,
248 : : const CubitVector *dir1,
249 : : const CubitVector *dir2,
250 : : const CubitVector *dir3,
251 : : CubitVector &extrema,
252 : : GeometryEntity *&extrema_entity_ptr );
253 : : //- Gets the extrema position along the first given direction. If there
254 : : //- is more than one extrema position, the other directions will be used
255 : : //- to determine a unique position. Directions 2 and 3 can be NULL.
256 : : //- Entities supported include bodies, volumes, surfaces, curves and
257 : : //- vertices. The entity the extrema is found on is also returned.
258 : :
259 : : virtual CubitStatus entity_entity_distance( GeometryEntity *ref_entity_ptr1,
260 : : GeometryEntity *ref_entity_ptr2,
261 : : CubitVector &pos1, CubitVector &pos2,
262 : : double &distance );
263 : : //- Gets the minimum distance between two entities and the closest positions
264 : : //- on those entities. Supports vertices, curves, surfaces, volumes and bodies.
265 : :
266 : : virtual CubitStatus export_solid_model( DLIList<TopologyBridge*>& bridge_list,
267 : : const char* file_name,
268 : : Model_File_Type file_type,
269 : : const CubitString &cubit_version,
270 : : ModelExportOptions &export_options );
271 : :
272 : :
273 : : // write shapes to buffer as binary format
274 : : virtual CubitStatus export_solid_model( DLIList<TopologyBridge*>& ref_entity_list,
275 : : char*& p_buffer,
276 : : int& n_buffer_size,
277 : : bool b_export_buffer);
278 : :
279 : : virtual CubitStatus save_temp_geom_file( DLIList<TopologyBridge*>& ref_entity_list,
280 : : const char *file_name,
281 : : const CubitString &cubit_version,
282 : : CubitString &created_file,
283 : : CubitString &created_file_type );
284 : :
285 : : virtual CubitStatus import_temp_geom_file(FILE* file_ptr,
286 : : const char* file_name,
287 : : Model_File_Type file_type,
288 : : DLIList<TopologyBridge*> &bridge_list );
289 : :
290 : : virtual CubitStatus import_solid_model(const char* file_name,
291 : : Model_File_Type file_type,
292 : : DLIList<TopologyBridge*>& imported_entities,
293 : : ModelImportOptions& options);
294 : : virtual CubitStatus import_solid_model(DLIList<TopologyBridge*> &imported_entities,
295 : : const char* pBuffer,
296 : : const int n_buffer_size);
297 : :
298 : : CubitStatus unhook_BodySM_from_OCC( BodySM* bodysm,
299 : : bool remove_lower_entities=CUBIT_TRUE)const;
300 : : CubitStatus unhook_Surface_from_OCC( Surface* surface) const;
301 : : CubitStatus unhook_Curve_from_OCC( Curve* curve) const;
302 : : CubitStatus unhook_Point_from_OCC( TBPoint* point) const;
303 : : void bound_TopoDS_Shape(const TopoDS_Shape & aShape);
304 : :
305 : : private:
306 : : CubitStatus import_solid_model(FILE *file_ptr,
307 : : const char* /*file_type*/,
308 : : DLIList<TopologyBridge*> &imported_entities,
309 : : CubitBoolean print_results = CUBIT_TRUE,
310 : : const char* logfile_name = NULL,
311 : : CubitBoolean heal_step = CUBIT_TRUE,
312 : : CubitBoolean import_bodies = CUBIT_TRUE,
313 : : CubitBoolean import_surfaces = CUBIT_TRUE,
314 : : CubitBoolean import_curves = CUBIT_TRUE,
315 : : CubitBoolean import_vertices = CUBIT_TRUE,
316 : : CubitBoolean free_surfaces = CUBIT_TRUE);
317 : :
318 : : CubitStatus unhook_Lump_from_OCC( Lump* lump ) const;
319 : : CubitStatus unhook_ShellSM_from_OCC( ShellSM* shell ) const;
320 : : CubitStatus unhook_CoEdges_from_OCC( DLIList<OCCCoEdge*>& coedges) const;
321 : : CubitStatus unhook_LoopSM_from_OCC( LoopSM* loopsm) const;
322 : : CubitStatus delete_loop( LoopSM* loopsm)const;
323 : : void unhook_coedges_of_a_curve(OCCCurve* curve,
324 : : OCCLoop* loop)const;
325 : :
326 : : void add_shape_to_map(TopoDS_Shape& sh,
327 : : TopoDS_Shape& aShape, /*In, parent shape*/
328 : : int ¤t_id /*Out*/);
329 : : public:
330 : : virtual void delete_solid_model_entities(DLIList<BodySM*>& body_list)const;
331 : : //- Deletes all solid model entities associated with the Bodies in
332 : : //- the input list.
333 : : void delete_bodies(DLIList<BodySM*>& body_list,
334 : : bool remove_lower_entities =CUBIT_TRUE) const;
335 : : using GeometryQueryEngine::delete_solid_model_entities;
336 : : virtual CubitStatus delete_solid_model_entities(
337 : : GeometryEntity* ref_entity_ptr,
338 : : bool remove_lower_entities) const;
339 : : virtual CubitStatus delete_solid_model_entities( BodySM* body_ptr)const;
340 : : CubitStatus delete_body(BodySM* body_ptr ,
341 : : bool remove_lower_entities =CUBIT_TRUE) const;
342 : : virtual CubitStatus delete_solid_model_entities(Surface* surf_ptr)const;
343 : : virtual CubitStatus delete_solid_model_entities( Curve* curve_ptr)const;
344 : : virtual CubitStatus delete_solid_model_entities( TBPoint* point_ptr)const;
345 : :
346 : : virtual double get_sme_resabs_tolerance() const; // Gets solid modeler's resolution absolute tolerance
347 : : virtual double set_sme_resabs_tolerance( double new_resabs );
348 : :
349 : : virtual CubitStatus set_int_option( const char* opt_name, int val );
350 : : virtual CubitStatus set_dbl_option( const char* opt_name, double val );
351 : : virtual CubitStatus set_str_option( const char* opt_name, const char* val );
352 : : //- Set solid modeler options
353 : :
354 : : CubitStatus ensure_is_ascii_stl_file(FILE * fp, CubitBoolean &is_ascii);
355 : : //- returns true in is_ascii if fp points to an ascii stl file
356 : :
357 : : CubitStatus create_super_bounding_box(
358 : : DLIList<BodySM*>& body_list,
359 : : CubitBox& super_box );
360 : :
361 : : //ModifyShape refers to only Transform and GTransform for now (1/10/11)
362 : : CubitStatus update_entity_shape(GeometryEntity* entity_ptr,
363 : : BRepBuilderAPI_ModifyShape* aTranf,
364 : : BRepAlgoAPI_BooleanOperation *op = NULL);
365 : :
366 : : void set_TopoDS_Shape(TopologyBridge* tb, TopoDS_Shape& new_shape);
367 : : CubitStatus translate( BodySM* body, const CubitVector& offset );
368 : : CubitStatus rotate ( BodySM* body, const CubitVector& axis, double angle );
369 : : CubitStatus scale ( BodySM* body, double factor );
370 : : CubitStatus scale ( BodySM* body, const CubitVector& factors );
371 : : CubitStatus reflect ( BodySM* body, const CubitVector& axis );
372 : :
373 : : CubitStatus translate( GeometryEntity* ent, const CubitVector& offset );
374 : : CubitStatus rotate ( GeometryEntity* ent, const CubitVector& axis, double degrees );
375 : : CubitStatus scale ( GeometryEntity* ent, double factor );
376 : : CubitStatus scale ( GeometryEntity* ent, const CubitVector& factors );
377 : : CubitStatus reflect ( GeometryEntity* ent, const CubitVector& axis );
378 : :
379 : : CubitStatus get_connected_patch( DLIList<OCCSurface*>& remaining_surfs,
380 : : DLIList<OCCSurface*>& output_patch );
381 : : virtual CubitBoolean bodies_overlap (BodySM *body_ptr_1,
382 : : BodySM *body_ptr_2 ) const;
383 : : //R CubitBoolean
384 : : //R- CUBIT_TRUE if the two bodies overlap, CUBIT_FALSE if they don't
385 : : //R- overlap. If the bodies are touching the function
386 : : //R- should return CUBIT_FALSE.
387 : : //I body_ptr_1, body_ptr_2
388 : : //I- The two body pointers that are being tested for overlap.
389 : : //- The function uses the intersect call to test if the bodies
390 : : //- are overlaping. The full intersect Boolean is needed to see if
391 : : //- the bodies actually overlap and don't just touch.
392 : :
393 : : TopologyBridge* occ_to_cgm(const TopoDS_Shape& shape);
394 : :
395 : : virtual CubitBoolean volumes_overlap (Lump *lump1, Lump *lump2 ) const ;
396 : :
397 : : DLIList<TopologyBridge*> populate_topology_bridge(TopoDS_Shape& aShape);
398 : : BodySM* populate_topology_bridge(const TopoDS_Compound& aShape);
399 : : Lump* populate_topology_bridge(const TopoDS_Solid& aShape,
400 : : CubitBoolean build_body = CUBIT_FALSE);
401 : : Surface* populate_topology_bridge(const TopoDS_Face& aShape,
402 : : CubitBoolean build_body = CUBIT_FALSE);
403 : : Curve* populate_topology_bridge(const TopoDS_Edge& aShape,
404 : : CubitBoolean stand_along = CUBIT_FALSE );
405 : : TBPoint* populate_topology_bridge(const TopoDS_Vertex& aShape,
406 : : CubitBoolean stand_along = CUBIT_FALSE);
407 : :
408 : : OCCShell* populate_topology_bridge(const TopoDS_Shell& aShape,
409 : : CubitBoolean standalone = CUBIT_FALSE );
410 : : DLIList<OCCBody*> *BodyList ;
411 : : DLIList<OCCSurface*> *SurfaceList ;
412 : : DLIList<OCCLoop*> *WireList; //standalone wire list
413 : : DLIList<OCCCurve*> *CurveList ;
414 : : Handle(TDocStd_Document) MyDF;
415 : : TDF_Label mainLabel;
416 : : TopTools_DataMapOfShapeInteger* OCCMap;
417 : : std::map<int, TopologyBridge*>* OccToCGM;
418 : : std::map<int, TDF_Label>* Shape_Label_Map;
419 : : static int iTotalTBCreated ;
420 : : static int total_coedges;
421 : : protected:
422 : :
423 : : OCCQueryEngine();
424 : :
425 : : private:
426 : :
427 : : OCCLoop* populate_topology_bridge(const TopoDS_Wire& aShape,
428 : : CubitBoolean standalone = CUBIT_FALSE);
429 : :
430 : : CubitStatus write_topology( const char* file_name,
431 : : Model_File_Type file_type,
432 : : DLIList<OCCBody*> &facet_bodies,
433 : : DLIList<OCCSurface*> &facet_surfaces,
434 : : DLIList<OCCCurve*> &facet_curves,
435 : : DLIList<OCCPoint*> &facet_points );
436 : :
437 : : CubitStatus write_topology( char*& p_buffer,
438 : : int& n_buffer_size,
439 : : bool b_export_buffer,
440 : : DLIList<OCCBody*> &OCC_bodies,
441 : : DLIList<OCCSurface*> &OCC_surfaces,
442 : : DLIList<OCCCurve*> &OCC_curves,
443 : : DLIList<OCCPoint*> &OCC_points);
444 : :
445 : : CubitBoolean Write(const TopoDS_Shape& Sh,
446 : : const Standard_CString File,
447 : : TDF_Label label);
448 : :
449 : : CubitBoolean Write(const TopoDS_Shape& Sh,
450 : : char*& p_buffer,
451 : : int& n_buffer_size,
452 : : bool b_export_buffer,
453 : : TDF_Label label);
454 : :
455 : : CubitBoolean Read(TopoDS_Shape& Shapes,
456 : : const Standard_CString File,
457 : : TDF_Label label);
458 : :
459 : : CubitBoolean Read(TopoDS_Shape& Sh,
460 : : const char* pBuffer,
461 : : const int n_buffer_size,
462 : : TDF_Label label);
463 : :
464 : : static OCCQueryEngine* instance_;
465 : : //- static pointer to unique instance of this class
466 : : };
467 : :
468 : : // ********** BEGIN INLINE FUNCTIONS **********
469 : : // ********** END INLINE FUNCTIONS **********
470 : :
471 : : // ********** BEGIN FRIEND FUNCTIONS **********
472 : : // ********** END FRIEND FUNCTIONS **********
473 : :
474 : : // ********** BEGIN EXTERN FUNCTIONS **********
475 : : // ********** END EXTERN FUNCTIONS **********
476 : :
477 : : // ********** BEGIN HELPER CLASS DECLARATIONS **********
478 : : // ********** END HELPER CLASS DECLARATIONS **********
479 : :
480 : : #endif
|