Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : GeoemtricQueryEngine.hpp
3 : : //
4 : : // Purpose : Define the interface for all solid model query
5 : : // engines.
6 : : //
7 : : // Special Notes : This is an abstract base class.
8 : : //
9 : : // Creator : Tim Tautges
10 : : //
11 : : // Creation Date : 2/01
12 : : //
13 : : // Owner : Tim Tautges
14 : : //-------------------------------------------------------------------------
15 : :
16 : : #ifndef GEOMETRIC_QUERY_ENGINE_HPP
17 : : #define GEOMETRIC_QUERY_ENGINE_HPP
18 : :
19 : : #include "CubitObserver.hpp"
20 : : #include "CubitDefines.h"
21 : : #include "GeometryDefines.h"
22 : : #include "CubitMessage.hpp"
23 : : #include "CGMGeomConfigure.h"
24 : : #include "CubitCompat.h"
25 : :
26 : : class CubitString;
27 : : class CubitVector;
28 : : template <class X> class DLIList;
29 : : class Body;
30 : : class GMem;
31 : :
32 : : class TopologyBridge;
33 : : class TopologyEntity;
34 : : class GeometryEntity;
35 : : class BodySM;
36 : : class Lump;
37 : : class Surface;
38 : : class Curve;
39 : : class TBPoint;
40 : : class Loop;
41 : : class RefFace;
42 : :
43 : : enum Model_File_Type {
44 : : MFT_NOT_DEFINED = 0,
45 : : IGES_TYPE,
46 : : CATIA_TYPE,
47 : : STEP_TYPE,
48 : : PROE_TYPE,
49 : : GRANITE_TYPE,
50 : : GRANITE_G_TYPE,
51 : : GRANITE_SAT_TYPE,
52 : : GRANITE_PROE_PART_TYPE,
53 : : GRANITE_PROE_ASM_TYPE,
54 : : GRANITE_NEUTRAL_TYPE,
55 : : NCGM_TYPE,
56 : : CATIA_NCGM_TYPE,
57 : : CATPART_TYPE,
58 : : CATPRODUCT_TYPE,
59 : : FACET_TYPE,
60 : : SOLIDWORKS_TYPE,
61 : : OCC_TYPE,
62 : : KCM_TYPE
63 : : };
64 : :
65 : :
66 : : extern const char*
67 : : get_MFT_string(Model_File_Type);
68 : :
69 : : inline const char*
70 : : get_MFT_string(Model_File_Type type)
71 : : {
72 : : switch (type)
73 : : {
74 : : case MFT_NOT_DEFINED :
75 : : return "Model File Type NOT DEFINED";
76 : : case IGES_TYPE :
77 : : return "IGES";
78 : : case CATIA_TYPE :
79 : : return "CATIA";
80 : : case STEP_TYPE :
81 : : return "STEP";
82 : : case PROE_TYPE :
83 : : return "PROE";
84 : : case GRANITE_TYPE :
85 : : return "GRANITE";
86 : : case GRANITE_G_TYPE :
87 : : return "GRANITE_G";
88 : : case GRANITE_SAT_TYPE :
89 : : return "GRANITE_SAT";
90 : : case GRANITE_PROE_PART_TYPE :
91 : : return "GRANITE_PROE_PART";
92 : : case GRANITE_PROE_ASM_TYPE :
93 : : return "GRANITE_PROE_ASM";
94 : : case GRANITE_NEUTRAL_TYPE :
95 : : return "GRANITE_NEUTRAL";
96 : : case NCGM_TYPE :
97 : : return "NCGM";
98 : : case CATIA_NCGM_TYPE :
99 : : return "CATIA_NCGM";
100 : : case CATPART_TYPE :
101 : : return "CATPART";
102 : : case CATPRODUCT_TYPE :
103 : : return "CATPRODUCT";
104 : : case FACET_TYPE :
105 : : return "FACET";
106 : : case SOLIDWORKS_TYPE :
107 : : return "SOLIDWORKS";
108 : : case OCC_TYPE:
109 : : return "OCC";
110 : : case KCM_TYPE:
111 : : return "KCM";
112 : : default :
113 : : PRINT_ERROR("Model_File_Type index %i is not handled properly in get_MFT_string()\n", type);
114 : : }
115 : :
116 : : return "";
117 : : } // get_MFT_string()
118 : :
119 : :
120 : : static const char* const GRANITE_G = ".g";
121 : : static const char* const GRANITE_PROE_PART = ".prt";
122 : : static const char* const GRANITE_PROE_ASM = ".asm";
123 : : static const char* const GRANITE_PROE_NEUTRAL = ".neu";
124 : : static const char* const STEP_IMPORT_DEFAULT_LOG = "step_import.log";
125 : : static const char* const IGES_IMPORT_DEFAULT_LOG = "iges_import.log";
126 : : static const char* const CATIA_IMPORT_DEFAULT_LOG = "catia_import.log";
127 : : static const char* const GRANITE_EXPORT_DEFAULT_LOG = "granite_export.log";
128 : : static const char* const STEP_EXPORT_DEFAULT_LOG = "step_export.log";
129 : : static const char* const IGES_EXPORT_DEFAULT_LOG = "iges_export.log";
130 : : static const char* const OCC_EXPORT_DEFAULT_LOG = "occ_export.log";
131 : : static const char* const KCM_EXPORT_DEFAULT_LOG = "kcm_export.log";
132 : : static const char* const STEP_IGES_TRANSLATOR = "step_iges_translator";
133 : : static const char* const TRANSLATOR_DIR = "/translator/";
134 : :
135 : 2556 : class CUBIT_GEOM_EXPORT GeometryQueryEngine
136 : : {
137 : :
138 : : public:
139 : :
140 : : //!- virtual destructor
141 [ - + ]: 1084 : virtual ~GeometryQueryEngine() {}
142 : :
143 : : //!R CubitStatus
144 : : //!R- CUBIT_SUCCESS/CUBIT_FAILURE
145 : : //!I ref_entity_list
146 : : //!I- A list of RefEntities to be exported or saved to a file.
147 : : //!I file_name
148 : : //!I- The name of the file to write to.
149 : : //!I file_type
150 : : //!I- An optional type of file.
151 : : //!- Export the current CUBIT geometry (everything in the Model) to a
152 : : //!- solid model format. Valid file types are:
153 : : //!- "IGES" -- IGES file
154 : : //!- "STEP" -- STEP file
155 : : //!I logfile_name
156 : : //!I- Optional - name of logfile.
157 : : //!- No logfile gets created for SAB/SAT files, but for IGES and
158 : : //!- STEP file a logfile always gets created. Default filenames
159 : : //!- are assigned if one is not given (iges_export.log, step_export.log).
160 : : //!-
161 : : //!- The function returns CUBIT_FAILURE if anything goes wrong with
162 : : //!- export - improper file type, inaccessible file, mismatch between
163 : : //!- the underlying representation and file type. It returns
164 : : //!- CUBIT_SUCCESS if everything goes well.
165 : : virtual CubitStatus export_solid_model(
166 : : DLIList<TopologyBridge*>& bridge_list,
167 : : const char* file_name,
168 : : Model_File_Type file_type,
169 : : const CubitString &cubit_version,
170 : : ModelExportOptions &export_options ) = 0;
171 : :
172 : : virtual CubitStatus export_solid_model(
173 : : DLIList<TopologyBridge*>& bridge_list,
174 : : char*& p_buffer,
175 : : int& n_buffer_size,
176 : : bool b_export_buffer) = 0;
177 : :
178 : : //! Saves out a temporary geometry file. Entities in list must all be
179 : : //! of same modeling engine.
180 : : virtual CubitStatus save_temp_geom_file(
181 : : DLIList<TopologyBridge*> &ref_entity_list,
182 : : const char *filename,
183 : : const CubitString &cubit_version,
184 : : CubitString &created_file,
185 : : CubitString &created_file_type ) = 0;
186 : :
187 : : //!R CubitStatus
188 : : //!R- CUBIT_SUCCESS/CUBIT_FAILURE
189 : : //!I file_ptr
190 : : //!I- A pointer to the file to read (can be NULL for IGES and STEP files).
191 : : //!I file_type
192 : : //!I- Type of file.
193 : : //!- Reads in geometry and creates the necessary Reference entities
194 : : //!- associated with the input geometry.
195 : : //!- Valid file types are:
196 : : //!-
197 : : //!- "IGES" -- IGES file
198 : : //!- "STEP" -- STEP file
199 : : //!I heal_step - auto-healing of step bodies on import. This is recommended
200 : : //! because they always need it.
201 : : //!I import_bodies (etc...)
202 : : //!I- Should bodies be import.
203 : : //!- Function can selectively import solid bodies, free surfaces, free
204 : : //!- curves, or free vertices. For example, the user may not want
205 : : //!- to import any free entities.
206 : : //!-
207 : : //!- The function returns CUBIT_FAILURE if anything goes wrong with
208 : : //!- import - improper file type, inaccessible file, mismatch between
209 : : //!- the underlying representation and file type. It returns
210 : : //!- CUBIT_SUCCESS if everything goes well.
211 : : virtual CubitStatus import_solid_model(
212 : : const char* file_name,
213 : : Model_File_Type file_type,
214 : : DLIList<TopologyBridge*>& imported_entities,
215 : : ModelImportOptions &import_options ) = 0;
216 : :
217 : : virtual CubitStatus import_solid_model(DLIList<TopologyBridge*> &imported_entities,
218 : : const char* pBuffer,
219 : : const int n_buffer_size) = 0;
220 : :
221 : : //O imported_entities
222 : : //O- List of top-level entities read from file
223 : : //I print_results
224 : : //I- If false, fail silently (don't write error messages to stdout or stderr)
225 : :
226 : : virtual CubitStatus get_underlying_curves(Curve * curve_ptr,
227 : : DLIList<TopologyBridge*>& curve_list) ;
228 : : // -currently used only by VirtualGeometryEngine to get the underlying
229 : : // - curves from virtual curves.
230 : : virtual CubitStatus get_underlying_surfaces(Surface * surf_ptr,
231 : : DLIList<TopologyBridge*>& surf_list) ;
232 : : virtual CubitStatus get_underlying_bridges(TopologyBridge* bridge_ptr,
233 : : DLIList<TopologyBridge*>& bridge_list);
234 : :
235 : : virtual CubitStatus get_intersections(
236 : : Curve* ref_edge1, CubitVector& point1,
237 : : CubitVector& point2,
238 : : DLIList<CubitVector>& intersection_list,
239 : : bool bounded = false,
240 : : bool closest = false ) = 0;
241 : :
242 : : virtual CubitStatus get_intersections(
243 : : Curve* ref_edge1, Curve* ref_edge2,
244 : : DLIList<CubitVector>& intersection_list,
245 : : bool bounded = false,
246 : : bool closest = false ) = 0;
247 : : //- Finds the intersections of the two curves. If the bounded flag is
248 : : //- true, it finds only those intersections within the parameter range
249 : : //- of both curves; otherwise it uses the extensions of the curves. The
250 : : //- closest option is currently valid only if both curves are straight,
251 : : //- in which case it will return the 2 closest intersection locations,
252 : : //- if the straight lines don't actually intersect. The function allocates
253 : : //- the CubitVectors in the returned list, so be sure to free them.
254 : :
255 : : virtual CubitStatus get_intersections(
256 : : Curve* curve,
257 : : Surface* surface,
258 : : DLIList<CubitVector>& intersection_list,
259 : : bool bounded = false ) = 0;
260 : : //- Finds the intersections of the curve and surface. The curve is extended
261 : : //- if the bounded flag is not false. The function allocates the CubitVectors
262 : : //- in the returned list, so be sure to free them.
263 : :
264 : : virtual CubitStatus entity_extrema(
265 : : DLIList<GeometryEntity*> &ref_entity_list,
266 : : const CubitVector *dir1,
267 : : const CubitVector *dir2,
268 : : const CubitVector *dir3,
269 : : CubitVector &extrema,
270 : : GeometryEntity *&extrema_entity_ptr ) = 0;
271 : : //- Gets the extrema position along the first given direction. If there
272 : : //- is more than one extrema position, the other directions will be used
273 : : //- to determine a unique position. Directions 2 and 3 can be NULL.
274 : : //- Entities supported include bodies, volumes, surfaces, curves and
275 : : //- vertices. The entity the extrema is found on is also returned.
276 : :
277 : : virtual CubitStatus entity_entity_distance(
278 : : GeometryEntity *ref_entity_ptr1,
279 : : GeometryEntity *ref_entity_ptr2,
280 : : CubitVector &pos1,
281 : : CubitVector &pos2,
282 : : double &distance ) = 0;
283 : : //- Gets the minimum distance between two entities and the closest positions
284 : : //- on those entities. Supports vertices, curves, surfaces, volumes and bodies.
285 : :
286 : 0 : virtual void validate_geometry_database() const {};
287 : :
288 : : virtual void delete_solid_model_entities(DLIList<BodySM*>& body_list) const = 0;
289 : : virtual CubitStatus delete_solid_model_entities(GeometryEntity* ref_entity_ptr) const;
290 : : virtual CubitStatus delete_solid_model_entities( BodySM* body_ptr ) const = 0;
291 : : virtual CubitStatus delete_solid_model_entities(Surface* surf_ptr ) const = 0;
292 : : virtual CubitStatus delete_solid_model_entities( Curve* curve_ptr ) const = 0;
293 : : virtual CubitStatus delete_solid_model_entities( TBPoint* point_ptr ) const = 0;
294 : : virtual CubitStatus delete_topology_bridge (TopologyBridge* bridge) const;
295 : : //- Deletes the solid model entities associcated with the input
296 : : //- free-floating RefEntity. If the input RefEntity is not free-floating,
297 : : //- then its underlying ENTITYs are not deleted and CUBIT_FAILURE
298 : : //- is returned.
299 : : //- Returns CUBIT_SUCCESS if all went well, otherwise, CUBIT_FAILURE.
300 : :
301 : : virtual CubitStatus fire_ray( CubitVector &origin,
302 : : CubitVector &direction,
303 : : DLIList<TopologyBridge*> &at_entity_list,
304 : : DLIList<double> &ray_params,
305 : : int max_hits = 0,
306 : : double ray_radius = 0.0,
307 : : DLIList<TopologyBridge*> *hit_entity_list=0 ) const = 0;
308 : : //- Fire a ray at specified entities, returning the parameters (distances)
309 : : //- along the ray and optionally the entities hit. Returned lists are
310 : : //- appended to. Input entities can be any of bodies, volumes, faces,
311 : : //- edges or vertices. Optionally you can specify the maximum number of
312 : : //- hits to return (default = 0 = unlimited), and the ray radius to use for
313 : : //- intersecting the entities (default = 0.0 = use modeller default).
314 : :
315 : 0 : virtual void get_ordered_loops(RefFace* /*face*/, DLIList<Loop*> &/*loop_list*/) const {};
316 : :
317 : : virtual CubitStatus get_isoparametric_points(Surface* ref_face_ptr,
318 : : int &nu, int &nv,
319 : : GMem *&gMem) const = 0;
320 : :
321 : : virtual CubitStatus get_u_isoparametric_points(Surface* ref_face_ptr,
322 : : double v, int &n,
323 : : GMem *&gMem) const = 0;
324 : :
325 : : virtual CubitStatus get_v_isoparametric_points(Surface* ref_face_ptr,
326 : : double u, int &n,
327 : : GMem *&gMem) const = 0;
328 : :
329 : : virtual CubitStatus transform_vec_position(
330 : : CubitVector const& position_vector,
331 : : BodySM *OSME_ptr,
332 : : CubitVector &transform_vector ) const = 0;
333 : : //R CubitStatus
334 : : //R- CUBIT_SUCCESS/CUBIT_FAILURE
335 : : //I position_vector on body, body that was transformed
336 : : //O vector showning transform.
337 : : //O-Computes the transform from the transformed body.
338 : :
339 : 0 : virtual int curve_is_on_ignored_surface(Curve * /*curve*/,
340 : 0 : Surface * /*surf*/) { return 0; }
341 : :
342 : : virtual const char* modeler_type() = 0;
343 : : virtual int get_major_version() = 0;
344 : : virtual int get_minor_version() = 0;
345 : : virtual int get_subminor_version() = 0;
346 : : virtual int get_allint_version();
347 : : virtual CubitString get_engine_version_string() = 0;
348 : :
349 : 19394 : virtual bool is_intermediate_engine() {return FALSE;}
350 : :
351 : : //- pass a string back identifying this query engine
352 : : virtual CubitStatus set_export_version(const int major,
353 : : const int minor);
354 : : virtual CubitStatus set_export_allint_version(const int version);
355 : : virtual CubitStatus list_engine_versions(CubitString &versions);
356 : : //- gets, sets, and lists choices for solid modeling engine version(s)
357 : :
358 : : virtual double get_sme_resabs_tolerance() const = 0; // Gets solid modeler's resolution absolute tolerance
359 : : virtual double set_sme_resabs_tolerance( double new_resabs ) = 0;
360 : :
361 : : virtual CubitStatus set_int_option( const char* opt_name, int val ) = 0;
362 : : virtual CubitStatus set_dbl_option( const char* opt_name, double val ) = 0;
363 : : virtual CubitStatus set_str_option( const char* opt_name, const char* val ) = 0;
364 : : //- Set solid modeler options
365 : :
366 : : virtual CubitStatus get_graphics( BodySM *bodysm, GMem* g_mem,
367 : : std::vector<Surface*> &surface_to_facets_vector,
368 : : std::vector<TopologyBridge*> &vertex_edge_to_point_vector,
369 : : std::vector<std::pair<TopologyBridge*, std::pair<int,int> > > &facet_edges_on_curves,
370 : : unsigned short normal_tolerance,
371 : : double distance_tolerance, double max_edge_length ) const;
372 : : //I bodysm -- body you want to facet
373 : : //O g_mem -- structure containing all the points and facet connectivity
374 : : //O surfaces_to_facets_vector -- the ith facet in g_mem is on the ith Surface in this vector
375 : : //O vertex_edge_to_point_vector -- the ith point in the g_mem in on the ith surface/edge/vertex in this vector
376 : : //O facet_edges_on_curves -- the TopologyBri dges are the Curves in bodysm and the pair is the indices to the
377 : : // facet points in the g_mem's point array that make a single facet edge on the Curve.
378 : : //I various input tolerances.
379 : :
380 : :
381 : : virtual CubitStatus get_graphics( Surface* surface_ptr,
382 : : GMem* gMem,
383 : : unsigned short normal_tolerance=15,
384 : : double distance_tolerance=0,
385 : : double longest_edge = 0 ) const = 0;
386 : :
387 : : virtual CubitStatus get_graphics( Surface* surface_ptr,
388 : : GMem *gmem,
389 : : std::vector<TopologyBridge*> &vertex_edge_to_point_vector,
390 : : std::vector<std::pair<TopologyBridge*, std::pair<int,int> > > &facet_edges_on_curves,
391 : : unsigned short normal_tolerance = 15,
392 : : double distance_tolerance = 0.0,
393 : : double max_edge_length = 0.0 ) const;
394 : :
395 : : //R CubitStatus
396 : : //R- CUBIT_SUCCESS/CUBIT_FAILURE
397 : : //I ref_face_ptr
398 : : //I- The RefFAce for which hoops facetting information will be
399 : : //I- gathered.
400 : : //O gMem
401 : : //O- The sturage place for facets (and points).
402 : : //= This function gathers and outputs facet (and point)
403 : : //- information for hoops involved in facetting an RefFace. If
404 : : //- all goes well, CUBIT_Success is retuned.
405 : :
406 : : virtual CubitStatus get_graphics( Curve* curve_ptr,
407 : : GMem* gMem,
408 : : double angle_tolerance=0,
409 : : double distance_tolerance=0,
410 : : double max_edge_length=0 ) const = 0;
411 : : //R CubitStatus
412 : : //R- CUBIT_SUCCESS/CUBIT_FAILURE
413 : : //I ref_edge_ptr
414 : : //I- The RefEdge for which hoops facetting information will be
415 : : //I- gathered/
416 : : //O numSteps
417 : : //O- The number of edges gathered.
418 : : //O gMem
419 : : //O- The sturage place for edges involved in facetting.
420 : : //I tolerance
421 : : //I- The tolerance deviation used when facetting the curve.
422 : : //- This function tessellates the edge which is typically needed
423 : : //- for graphically displaying the edge. If all goes well,
424 : : //- CUBIT_SUCCESS is returned. Otherwise, CUBIT_FAILURE is returned.
425 : :
426 : :
427 : : virtual CubitStatus translate( BodySM* body, const CubitVector& offset ) = 0;
428 : : virtual CubitStatus rotate ( BodySM* body, const CubitVector& axis, double angle ) = 0;
429 : : virtual CubitStatus scale ( BodySM* body, double factor ) = 0;
430 : : virtual CubitStatus scale ( BodySM* body, const CubitVector& factors ) = 0;
431 : : virtual CubitStatus reflect ( BodySM* body, const CubitVector& axis ) = 0;
432 : : virtual CubitStatus restore_transform( BodySM* body ) = 0;
433 : :
434 : : virtual CubitStatus translate( GeometryEntity* ent, const CubitVector& offset ) = 0;
435 : : virtual CubitStatus rotate ( GeometryEntity* ent, const CubitVector& axis, double degrees ) = 0;
436 : : virtual CubitStatus scale ( GeometryEntity* ent, double factor ) = 0;
437 : : virtual CubitStatus scale ( GeometryEntity* ent, const CubitVector& factors ) = 0;
438 : : virtual CubitStatus reflect ( GeometryEntity* ent, const CubitVector& axis ) = 0;
439 : :
440 : : virtual CubitBoolean bodies_overlap (BodySM *body_ptr_1,
441 : : BodySM *body_ptr_2 ) const = 0;
442 : :
443 : : virtual CubitBoolean volumes_overlap (Lump *lump1, Lump *lump2 ) const = 0;
444 : :
445 : 0 : virtual TopologyBridge* get_visible_entity_at_point(TopologyBridge* /*hidden_tb*/, CubitVector* /*point*/){return NULL;};
446 : :
447 : : virtual CubitStatus get_visible_entities( TopologyBridge *hidden_tb, DLIList<TopologyBridge*> &real_tbs );
448 : :
449 : : virtual CubitStatus get_point_containment( DLIList<BodySM*> &body_list,
450 : : DLIList<CubitVector> &point_list,
451 : : double tolerance,
452 : : bool allow_pts_in_multiple_bodies,
453 : : std::vector< std::pair<BodySM*, std::vector<int> > > &bodysm_to_pt_indices );
454 : :
455 : : protected:
456 : :
457 : : private:
458 : :
459 : : } ;
460 : :
461 : : #endif
|