Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : TopologyEntity.cpp
3 : : //
4 : : // Purpose : Implementation of the TopologyEntity class.
5 : : //
6 : : // Special Notes :
7 : : //
8 : : // Creator : Xuechen Liu
9 : : //
10 : : // Creation Date : 07/31/96
11 : : //
12 : : // Owner : Malcolm J. Panthaki
13 : : //-------------------------------------------------------------------------
14 : :
15 : : // ********** BEGIN STANDARD INCLUDES **********
16 : : #include <assert.h>
17 : : // ********** END STANDARD INCLUDES **********
18 : :
19 : : // ********** BEGIN CUBIT INCLUDES **********
20 : : #include "CubitDefines.h"
21 : : #include "CubitMessage.hpp"
22 : :
23 : : #include "CastTo.hpp"
24 : : #include "TopologyEntity.hpp"
25 : : #include "TopologyBridge.hpp"
26 : :
27 : : #include "ModelQueryEngine.hpp"
28 : : #include "GeometryQueryTool.hpp"
29 : :
30 : : #include "Body.hpp"
31 : : #include "DLIList.hpp"
32 : : #include "Shell.hpp"
33 : : #include "Loop.hpp"
34 : : #include "Chain.hpp"
35 : : #include "RefVolume.hpp"
36 : : #include "RefFace.hpp"
37 : : #include "RefEdge.hpp"
38 : : #include "RefVertex.hpp"
39 : : #include "CoVolume.hpp"
40 : : #include "CoFace.hpp"
41 : : #include "CoEdge.hpp"
42 : : #include "CoVertex.hpp"
43 : : #include "AppUtil.hpp"
44 : : #include "CubitEvent.hpp"
45 : :
46 : : // ********** END CUBIT INCLUDES **********
47 : :
48 : : // ********** BEGIN STATIC DECLARATIONS **********
49 : : // ********** END STATIC DECLARATIONS **********
50 : :
51 : : // ********** BEGIN PUBLIC FUNCTIONS **********
52 : :
53 : : //-------------------------------------------------------------------------
54 : : // Purpose : Casting query functions
55 : : //
56 : : // Special Notes :
57 : : //
58 : : // Creator : Jason Kraftcheck
59 : : //
60 : : // Creation Date : 07/29/03
61 : : //-------------------------------------------------------------------------
62 : : #define DECLARE_TOPO_ENT_QUERY_FUNC( TYPE, NAME, QUERYTYPE ) \
63 : : CubitStatus TopologyEntity::NAME(DLIList<TYPE*>& list) \
64 : : { \
65 : : DLIList<TopologyEntity*> temp_list ; \
66 : : CubitStatus result; \
67 : : ModelQueryEngine *const mqe = ModelQueryEngine::instance(); \
68 : : \
69 : : result = mqe->query_model( *this, DagType::QUERYTYPE(), temp_list ); \
70 : : if (result == CUBIT_FAILURE) \
71 : : { \
72 : : PRINT_ERROR("In TopologyEntity::" #NAME "\n"); \
73 : : PRINT_ERROR(" Query failed for unknown reason.\n"); \
74 : : return CUBIT_FAILURE; \
75 : : } \
76 : : \
77 : : temp_list.reset(); \
78 : : for (int i = temp_list.size(); i--; ) \
79 : : { \
80 : : TYPE* ptr = static_cast<TYPE*>(temp_list.get_and_step()); \
81 : : assert(!!ptr); \
82 : : list.append(ptr); \
83 : : } \
84 : : \
85 : : return CUBIT_SUCCESS; \
86 : : }
87 : :
88 : :
89 : :
90 : : //-------------------------------------------------------------------------
91 : : // Purpose : Default constructor.
92 : : //
93 : : // Special Notes :
94 : : //
95 : : // Creator : Xuechen Liu
96 : : //
97 : : // Creation Date : 07/31/96
98 : : //-------------------------------------------------------------------------
99 : :
100 : 295153 : TopologyEntity::TopologyEntity()
101 : : : deactivatedStatus_(CUBIT_FALSE),
102 : : encountered_(CUBIT_FALSE),
103 : 295153 : bridgeMan()
104 : : {
105 [ + - ]: 295153 : bridgeMan.set_entity(this);
106 : 295153 : }
107 : :
108 : : //-------------------------------------------------------------------------
109 : : // Purpose : Destructor.
110 : : //
111 : : // Special Notes :
112 : : //
113 : : // Creator : Raikanta Sahu
114 : : //
115 : : // Creation Date : 09/10/96
116 : : //-------------------------------------------------------------------------
117 : :
118 : 364720 : TopologyEntity::~TopologyEntity()
119 : : {
120 : : // Make sure that the TopologyEntity class does not have a pointer to this
121 : : // TopologyEntity in its list. If it does, then remove the instances
122 : : // of the pointer
123 [ + - ][ + - ]: 182360 : DAG::instance()->remove(this);
124 [ - + ]: 182360 : }
125 : :
126 : :
127 : : GeometryQueryEngine*
128 : 0 : TopologyEntity::get_geometry_query_engine() const
129 : : {
130 : : TopologyBridge* bridge =
131 : 0 : const_cast<TopologyEntity*>(this)->bridgeMan.topology_bridge();
132 [ # # ]: 0 : if (bridge)
133 : 0 : return bridge->get_geometry_query_engine();
134 : : else
135 : 0 : return NULL;
136 : : }
137 : :
138 : :
139 [ + - ][ + - ]: 10706 : DECLARE_TOPO_ENT_QUERY_FUNC( Body, bodies, body_type )
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ + - ]
[ + - ][ + - ]
[ - + ][ + - ]
[ + + ][ + - ]
140 [ # # ][ # # ]: 0 : DECLARE_TOPO_ENT_QUERY_FUNC( CoVolume, co_volumes, co_volume_type )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
141 [ + - ][ + - ]: 7815 : DECLARE_TOPO_ENT_QUERY_FUNC( RefVolume, ref_volumes, ref_volume_type )
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ + - ]
[ + - ][ + - ]
[ - + ][ + - ]
[ + + ][ + - ]
142 [ + - ][ + - ]: 132 : DECLARE_TOPO_ENT_QUERY_FUNC( Shell, shells, shell_type )
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ + - ]
[ + - ][ + - ]
[ - + ][ + - ]
[ + + ][ + - ]
143 [ + - ][ + - ]: 21315 : DECLARE_TOPO_ENT_QUERY_FUNC( CoFace, co_faces, co_face_type )
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ + - ]
[ + - ][ + - ]
[ - + ][ + - ]
[ + + ][ + - ]
144 [ + - ][ + - ]: 69991 : DECLARE_TOPO_ENT_QUERY_FUNC( RefFace, ref_faces, ref_face_type )
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ + - ]
[ + - ][ + - ]
[ - + ][ + - ]
[ + + ][ + - ]
145 [ + - ][ + - ]: 9984 : DECLARE_TOPO_ENT_QUERY_FUNC( Loop, loops, loop_type )
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ + - ]
[ + - ][ + - ]
[ - + ][ + - ]
[ + + ][ + - ]
146 [ # # ][ # # ]: 0 : DECLARE_TOPO_ENT_QUERY_FUNC( CoEdge, co_edges, co_edge_type )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
147 [ + - ][ + - ]: 179647 : DECLARE_TOPO_ENT_QUERY_FUNC( RefEdge, ref_edges, ref_edge_type )
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ + - ]
[ + - ][ + - ]
[ - + ][ + - ]
[ + + ][ + - ]
148 [ # # ][ # # ]: 0 : DECLARE_TOPO_ENT_QUERY_FUNC( Chain, chains, chain_type )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
149 [ + - ][ + - ]: 160012 : DECLARE_TOPO_ENT_QUERY_FUNC( CoVertex, co_vertices, co_vertex_type )
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ + - ]
[ + - ][ + - ]
[ - + ][ + - ]
[ + + ][ + - ]
150 [ + - ][ + - ]: 310545 : DECLARE_TOPO_ENT_QUERY_FUNC( RefVertex, ref_vertices, ref_vertex_type )
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ + - ]
[ + - ][ + - ]
[ - + ][ + - ]
[ + + ][ + - ]
151 : :
152 : :
153 : 0 : RefVertex *TopologyEntity::ref_vertex()
154 : : {
155 [ # # ]: 0 : DLIList<RefVertex*> verts;
156 [ # # ]: 0 : ref_vertices(verts);
157 [ # # ][ # # ]: 0 : if (verts.size() > 0) return verts.get();
[ # # ]
158 [ # # ]: 0 : else return NULL;
159 : : }
160 : :
161 : 0 : RefEdge *TopologyEntity::ref_edge()
162 : : {
163 [ # # ]: 0 : DLIList<RefEdge*> edges;
164 [ # # ]: 0 : ref_edges(edges);
165 [ # # ][ # # ]: 0 : if (edges.size() > 0) return edges.get();
[ # # ]
166 [ # # ]: 0 : else return NULL;
167 : : }
168 : :
169 : 0 : RefFace *TopologyEntity::ref_face()
170 : : {
171 [ # # ]: 0 : DLIList<RefFace*> faces;
172 [ # # ]: 0 : ref_faces(faces);
173 [ # # ][ # # ]: 0 : if (faces.size() > 0) return faces.get();
[ # # ]
174 [ # # ]: 0 : else return NULL;
175 : : }
176 : :
177 : 11 : RefVolume *TopologyEntity::ref_volume()
178 : : {
179 [ + - ]: 11 : DLIList<RefVolume*> volumes;
180 [ + - ]: 11 : ref_volumes(volumes);
181 [ + - ][ + - ]: 11 : if (volumes.size() > 0) return volumes.get();
[ + - ]
182 [ + - ]: 11 : else return NULL;
183 : : }
184 : :
185 : 11 : Body *TopologyEntity::body()
186 : : {
187 [ + - ]: 11 : DLIList<Body*> these_bodies;
188 [ + - ]: 11 : this->bodies(these_bodies);
189 [ + - ][ + - ]: 11 : if (these_bodies.size() > 0) return these_bodies.get();
[ + - ]
190 [ + - ]: 11 : else return NULL;
191 : : }
192 : :
193 : :
194 : 0 : CoEdge *TopologyEntity::co_edge()
195 : : {
196 [ # # ]: 0 : DLIList<CoEdge*> these_co_edges;
197 [ # # ]: 0 : co_edges(these_co_edges);
198 [ # # ][ # # ]: 0 : if (these_co_edges.size() > 0) return these_co_edges.get();
[ # # ]
199 [ # # ]: 0 : else return NULL;
200 : : }
201 : :
202 : 0 : int TopologyEntity::num_loops()
203 : : {
204 [ # # ]: 0 : DLIList<Loop*> these_loops;
205 [ # # ]: 0 : loops(these_loops);
206 [ # # ][ # # ]: 0 : return these_loops.size();
207 : : }
208 : :
209 : :
210 : 0 : int TopologyEntity::num_ref_volumes()
211 : : {
212 [ # # ]: 0 : DLIList<RefVolume*> these_ref_volumes;
213 [ # # ]: 0 : ref_volumes(these_ref_volumes);
214 [ # # ][ # # ]: 0 : return these_ref_volumes.size();
215 : : }
216 : :
217 : 22 : int TopologyEntity::num_ref_faces()
218 : : {
219 [ + - ]: 22 : DLIList<RefFace*> these_ref_faces;
220 [ + - ]: 22 : ref_faces(these_ref_faces);
221 [ + - ][ + - ]: 22 : return these_ref_faces.size();
222 : : }
223 : :
224 : 0 : int TopologyEntity::num_ref_edges()
225 : : {
226 [ # # ]: 0 : DLIList<RefEdge*> these_ref_edges;
227 [ # # ]: 0 : ref_edges(these_ref_edges);
228 [ # # ][ # # ]: 0 : return these_ref_edges.size();
229 : : }
230 : :
231 : 0 : int TopologyEntity::num_ref_vertices()
232 : : {
233 [ # # ]: 0 : DLIList<RefVertex*> these_ref_vertices;
234 [ # # ]: 0 : ref_vertices(these_ref_vertices);
235 [ # # ][ # # ]: 0 : return these_ref_vertices.size();
236 : : }
237 : :
238 : :
239 : : //- return the number of connected entities of the given type
240 : :
241 : 760 : CubitBoolean TopologyEntity::is_directly_related( TopologyEntity* entity )
242 : : {
243 : : // NULL?
244 [ - + ]: 760 : if ( !entity )
245 : 0 : return CUBIT_FALSE;
246 : :
247 : : // self?
248 [ - + ]: 760 : if (entity == this)
249 : 0 : return CUBIT_TRUE;
250 : :
251 : : // same type but not self?
252 [ + - ][ + - ]: 760 : if ( dag_type() == entity->dag_type() )
[ + - ][ - + ]
253 : 0 : return CUBIT_FALSE;
254 : :
255 : : // Get the entities of the right type.
256 [ + - ]: 760 : DLIList<TopologyEntity*> kin_folk;
257 : : CubitStatus result = ModelQueryEngine::instance()->
258 [ + - ][ + - ]: 760 : query_model( *this, entity->dag_type(), kin_folk );
[ + - ]
259 : : //only fails if types are the same, caught above.
260 [ - + ]: 760 : assert(result != CUBIT_FAILURE);
261 [ - + ]: 760 : if (CUBIT_FAILURE == result) {
262 [ # # ][ # # ]: 0 : PRINT_ERROR("ModelQueryEngine::query_model failed.\n");
[ # # ][ # # ]
263 : 0 : return CUBIT_FALSE;
264 : : }
265 : :
266 : : // Search entities for passed in entity.
267 : 760 : TopologyEntity* model_entity = CAST_TO(entity, TopologyEntity) ;
268 [ + - ][ + - ]: 760 : return kin_folk.is_in_list( model_entity );
269 : : }
270 : :
271 : 98684 : CubitStatus TopologyEntity::set_topology_bridge(TopologyBridge* TB_ptr)
272 : : {
273 [ - + ]: 98684 : assert (TB_ptr != NULL);
274 : 98684 : CubitStatus rv = CUBIT_SUCCESS;
275 : :
276 : 98684 : BridgeManager* bridges = bridge_manager();
277 : 98684 : bridges->remove_all_bridges();
278 : 98684 : bridges->add_bridge(TB_ptr);
279 : :
280 : 98684 : return rv;
281 : : }
282 : :
283 : 0 : CubitStatus TopologyEntity::remove_from_DAG(CubitBoolean recurse_flag)
284 : : {
285 : : // This counter will be used in the recursion to test whether
286 : : // the call is from outside or from the function itself. When
287 : : // the call comes from outside, the counter should always be
288 : : // zero.
289 : :
290 : 0 : CubitBoolean this_recurse = recurse_flag;
291 [ # # ]: 0 : if (recurse_flag == CUBIT_FALSE) recurse_flag = CUBIT_TRUE;
292 : :
293 [ # # ]: 0 : DLIList<TopologyEntity*> childModEntList;
294 : :
295 : : // Check to see if there are no parents of this object.
296 [ # # ][ # # ]: 0 : if ( get_parents() == 0 )
297 : : {
298 [ # # ]: 0 : if (this_recurse == CUBIT_FALSE)
299 : : {
300 : : // Since we are not recursing, this is a top-level entity.
301 : : // Notify the static observers that a top-level entity is being
302 : : // destructed. This must be done before children are disconnected.
303 [ # # ]: 0 : CubitObservable *top_level = CAST_TO(this, CubitObservable);
304 [ # # ][ # # ]: 0 : AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::TOP_LEVEL_ENTITY_DESTRUCTED, dynamic_cast<RefEntity*>(top_level)));
[ # # ][ # # ]
[ # # ]
305 : : }
306 : :
307 : : // Go through all the children and remove their link to
308 : : // the current object.
309 : :
310 : 0 : TopologyEntity* tempModEntPtr = NULL ;
311 : 0 : TopologyEntity* childModEntPtr = NULL ;
312 : :
313 [ # # ]: 0 : childModEntList.clean_out();
314 [ # # ]: 0 : disconnect_all_children(&childModEntList);
315 : :
316 : : // The following while conditional may not work...it depends on
317 : : // what is_at_end does when you step over the end...CHECK THIS
318 : : int i;
319 [ # # ][ # # ]: 0 : for( i = 0 ; i < childModEntList.size() ; i++ )
320 : : {
321 : : // Get the next ModelEnti in the child list and make sure its
322 : : // pointer to its parent is removed.
323 [ # # ]: 0 : tempModEntPtr = childModEntList.get_and_step();
324 : :
325 : : // Try remove() on the child ModEnt. If it comes back with
326 : : // a success, then delete it.
327 : 0 : childModEntPtr = tempModEntPtr;
328 : :
329 [ # # ][ # # ]: 0 : if ( childModEntPtr->remove_from_DAG(recurse_flag) == CUBIT_SUCCESS )
330 : : {
331 : : // Now deactivate the child ModEnt
332 [ # # ]: 0 : childModEntPtr->deactivated(CUBIT_TRUE) ;
333 : :
334 : : // remove it from observables, just before we go to delete it
335 [ # # ]: 0 : CubitObservable *observable = CAST_TO(childModEntPtr, CubitObservable);
336 [ # # ]: 0 : if (observable)
337 : : {
338 [ # # ][ # # ]: 0 : AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::TOPOLOGY_ENTITY_DESTRUCTED, dynamic_cast<RefEntity*>(observable)));
[ # # ][ # # ]
[ # # ]
339 : : }
340 : : }
341 : : }
342 : :
343 : :
344 : : // If this is the top of the recursion, then clean out all the deactivated
345 : : // entities.
346 [ # # ]: 0 : if (this_recurse == CUBIT_FALSE)
347 : : {
348 [ # # ]: 0 : this->deactivated(CUBIT_TRUE) ;
349 : :
350 : : // remove it from observables, just before we go to delete it
351 [ # # ]: 0 : CubitObservable *observable = CAST_TO(childModEntPtr, CubitObservable);
352 [ # # ]: 0 : if (observable)
353 : : {
354 [ # # ][ # # ]: 0 : AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::TOPOLOGY_ENTITY_DESTRUCTED, dynamic_cast<RefEntity*>(observable)));
[ # # ][ # # ]
[ # # ]
355 : : }
356 [ # # ][ # # ]: 0 : GeometryQueryTool::instance()->cleanout_deactivated_geometry() ;
357 : : }
358 : :
359 : 0 : return CUBIT_SUCCESS ;
360 : : }
361 : : else
362 : : {
363 : 0 : return CUBIT_FAILURE ;
364 [ # # ]: 0 : }
365 : : }
366 : :
367 : 0 : void TopologyEntity::disconnect_from_DAG()
368 : : {
369 : : // disconnects this entity from any others
370 : : // to which it is connected in the DAG; does not delete the DAGNode
371 : :
372 : 0 : disconnect_all_children();
373 : 0 : disconnect_all_parents();
374 : 0 : }
375 : :
376 : : //-------------------------------------------------------------------------
377 : : // Purpose : Get and set functions for the deactivated flag.
378 : : //
379 : : // Special Notes :
380 : : //
381 : : // Creator : Raikanta Sahu
382 : : //
383 : : // Creation Date : 12/02/96
384 : : //-------------------------------------------------------------------------
385 : :
386 : 182360 : void TopologyEntity::deactivated(CubitBoolean flag)
387 : : {
388 [ + - ]: 182360 : if (deactivatedStatus_ != flag)
389 : : {
390 : 182360 : deactivatedStatus_ = flag ;
391 [ + - ]: 182360 : if (flag == CUBIT_TRUE)
392 : : {
393 : 182360 : DAG::instance()->add_deactivated_DAG_node(this) ;
394 : : }
395 : : else
396 : : {
397 : 182360 : DAG::instance()->remove_deactivated_DAG_node(this) ;
398 : : }
399 : : }
400 : 182360 : }
401 : :
402 : 309093 : CubitBoolean TopologyEntity::deactivated() const
403 : : {
404 : 309093 : return (CubitBoolean)deactivatedStatus_ ;
405 [ + - ][ + - ]: 6540 : }
406 : :
407 : :
408 : :
409 : :
410 : : // ********** END PUBLIC FUNCTIONS **********
411 : :
412 : : // ********** BEGIN PROTECTED FUNCTIONS **********
413 : : // ********** END PROTECTED FUNCTIONS **********
414 : :
415 : : // ********** BEGIN PRIVATE FUNCTIONS **********
416 : : // ********** END PRIVATE FUNCTIONS **********
417 : :
418 : : // ********** BEGIN HELPER CLASSES **********
419 : : // ********** END HELPER CLASSES **********
420 : :
421 : : // ********** BEGIN EXTERN FUNCTIONS **********
422 : : // ********** END EXTERN FUNCTIONS **********
423 : :
424 : : // ********** BEGIN STATIC FUNCTIONS **********
425 : : // ********** END STATIC FUNCTIONS **********
426 : :
|