Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : CAActuateSet.cpp
3 : : //
4 : : // Purpose : Maintain the list of entities for which attributes are
5 : : // being actuated such that any entities destroyed
6 : : // during actuation (e.g. merging) get removed from the
7 : : // list.
8 : : //
9 : : // Special Notes :
10 : : //
11 : : // Creator : Jason Kraftcheck
12 : : //
13 : : // Creation Date : 05/28/02
14 : : //-------------------------------------------------------------------------
15 : :
16 : : #include "CAActuateSet.hpp"
17 : : #include "RefEntity.hpp"
18 : : #include "ModelQueryEngine.hpp"
19 : : #include "Body.hpp"
20 : : #include "BasicTopologyEntity.hpp"
21 : : #include "AppUtil.hpp"
22 : : #include "GeometryEvent.hpp"
23 : :
24 : : #include "RefFace.hpp"
25 : : #include "RefEdge.hpp"
26 : : #include "RefVertex.hpp"
27 : : #include "RefVolume.hpp"
28 : : #include "RefGroup.hpp"
29 : :
30 : : //-------------------------------------------------------------------------
31 : : // Purpose : Constructor
32 : : //
33 : : // Special Notes :
34 : : //
35 : : // Creator : Jason Kraftcheck
36 : : //
37 : : // Creation Date : 05/28/02
38 : : //-------------------------------------------------------------------------
39 : 1137 : CAActuateSet::CAActuateSet( DLIList<RefEntity*>& actuate_list )
40 [ + - ][ + + ]: 6822 : : currentDimension(-1)
[ + - # #
# # # # ]
41 : : {
42 : : // register this as a static observer so that we can
43 : : // remove entities from the lists as they are destroyed
44 [ + - ][ + - ]: 1137 : AppUtil::instance()->event_dispatcher().add_observer(this);
[ + - ]
45 : :
46 : : // put all entities in the actuate_list into the typeList
47 : : // for the appropriate dimension of entity.
48 [ + - ][ + + ]: 6941 : for( int i = actuate_list.size(); i--; )
49 : : {
50 [ + - ]: 5804 : RefEntity* entity_ptr = actuate_list.get_and_step();
51 [ + - ]: 5804 : int dimension = entity_ptr->dimension();
52 [ + + ]: 5804 : if( dimension < 0 ) // body
53 : 1802 : dimension = 4;
54 [ + - ]: 5804 : typeList[dimension].append( entity_ptr );
55 : : }
56 [ # # ]: 1137 : }
57 : :
58 : : //-------------------------------------------------------------------------
59 : : // Purpose : Destructor
60 : : //
61 : : // Special Notes :
62 : : //
63 : : // Creator : Jason Kraftcheck
64 : : //
65 : : // Creation Date : 05/28/02
66 : : //-------------------------------------------------------------------------
67 [ + - ][ + - ]: 7959 : CAActuateSet::~CAActuateSet()
[ + + ][ + - ]
[ # # # # ]
68 : : {
69 : : // remove from static observer list
70 : :
71 [ + - ][ + - ]: 1137 : AppUtil::instance()->event_dispatcher().remove_observer(this);
[ + - ]
72 [ - + ]: 1137 : }
73 : :
74 : : //-------------------------------------------------------------------------
75 : : // Purpose : Populate currentList with entities of the specified
76 : : // dimension. This includes children of any entities
77 : : // of a higher dimension that are in the lists managed
78 : : // by this object.
79 : : //
80 : : // Special Notes :
81 : : //
82 : : // Creator : Jason Kraftcheck
83 : : //
84 : : // Creation Date : 05/28/02
85 : : //-------------------------------------------------------------------------
86 : 10233 : void CAActuateSet::set_current_dimension( int dimension )
87 : : {
88 : : int i;
89 [ + - ][ + - ]: 20466 : DLIList<TopologyEntity*> query_source, query_target;
[ + - ]
90 [ + - ][ + - ]: 20466 : DLIList<RefEntity*> temp_list;
91 : :
92 : : // Clean out current list before adding new entities
93 [ + - ]: 10233 : currentList.clean_out();
94 : :
95 : : // Get the target type to query for.
96 [ + - ]: 10233 : DagType type = get_type_id( dimension );
97 : :
98 : : // Get children of higher-order entities
99 [ + + ]: 32973 : for( i = 4; i > dimension; i-- )
100 : : {
101 [ + - ]: 22740 : query_source.clean_out();
102 [ + - ]: 22740 : query_target.clean_out();
103 : :
104 [ + - ][ + - ]: 45718 : CAST_LIST( typeList[i], query_source, TopologyEntity );
[ + - ][ - + ]
[ + - ][ + - ]
[ + + ]
105 : : ModelQueryEngine::instance()
106 [ + - ][ + - ]: 22740 : ->query_model( query_source, type, query_target );
107 : :
108 [ + - ]: 22740 : temp_list.clean_out();
109 [ + - ][ + - ]: 156892 : CAST_LIST( query_target, temp_list, RefEntity );
[ + - ][ - + ]
[ + - ][ + - ]
[ + + ]
110 : :
111 [ + - ]: 22740 : append_to_current( temp_list );
112 : : }
113 : :
114 : : // Add lcoal entities of current dimension
115 [ + - ]: 10233 : append_to_current( typeList[dimension] );
116 : :
117 : : // Save current dimension
118 [ + - ]: 10233 : currentDimension = dimension;
119 : 10233 : }
120 : :
121 : : //-------------------------------------------------------------------------
122 : : // Purpose : Add entities to currentList
123 : : //
124 : : // Special Notes : Make sure no duplicates are added
125 : : //
126 : : // Creator : Jason Kraftcheck
127 : : //
128 : : // Creation Date : 05/28/02
129 : : //-------------------------------------------------------------------------
130 : 32973 : void CAActuateSet::append_to_current( DLIList<RefEntity*>& list )
131 : : {
132 : : int i;
133 : :
134 : : // Set marks on all new entities
135 [ + + ]: 176931 : for( i = list.size(); i--; )
136 : 143958 : list.get_and_step()->marked(1);
137 : :
138 : : // Clear marks on entities in current list,
139 : : // including those also in the new list.
140 [ + + ]: 395215 : for( i = currentList.size(); i--; )
141 : 362242 : currentList.get_and_step()->marked(0);
142 : :
143 : : // Any entities in the new list that are still
144 : : // marked are not already in the current list.
145 : : // Add them.
146 [ + + ]: 176931 : for( i = list.size(); i--; )
147 : : {
148 [ + - ]: 143958 : RefEntity* entity_ptr = list.get_and_step();
149 [ + - ][ + + ]: 143958 : if( entity_ptr->marked() )
150 : : {
151 [ + - ]: 121824 : currentList.append( entity_ptr );
152 [ + - ]: 143958 : entity_ptr->marked(0);
153 : : }
154 : : }
155 : 32973 : }
156 : :
157 : : //-------------------------------------------------------------------------
158 : : // Purpose : Remove deleted entities from lists
159 : : //
160 : : // Special Notes :
161 : : //
162 : : // Creator : Jason Kraftcheck
163 : : //
164 : : // Creation Date : 05/28/02
165 : : //-------------------------------------------------------------------------
166 : 44 : void CAActuateSet::notify_observer( const CubitEvent* observer_event)
167 : : {
168 : : RefEntity* entity_ptr;
169 : : int dimension;
170 : :
171 [ - + ]: 44 : const GeometryEvent* geom_event = dynamic_cast<const GeometryEvent*>(observer_event);
172 : :
173 : : // only care about entities that are destroyed
174 [ + - ][ + - ]: 44 : if(!geom_event || geom_event->get_type() != GeometryEvent::TOPOLOGY_ENTITY_DESTRUCTED)
[ + - ][ + - ]
175 : 44 : return;
176 : :
177 : :
178 : : // is it a body?
179 [ # # ][ # # ]: 0 : if( (entity_ptr = dynamic_cast<Body*>(geom_event->get_entity()) ) != NULL )
[ # # ][ # # ]
180 : 0 : dimension = 4;
181 : :
182 : : // is it some other topology entity
183 [ # # ][ # # ]: 0 : else if( (entity_ptr = dynamic_cast<BasicTopologyEntity*>(geom_event->get_entity()) )
[ # # ][ # # ]
184 : 0 : != NULL )
185 [ # # ]: 0 : dimension = entity_ptr->dimension();
186 : :
187 : : // otherwise we don't care about it
188 : : else
189 : 0 : return;
190 : :
191 : :
192 : : // if it exists in the type list, remove it
193 [ # # ][ # # ]: 0 : if( typeList[dimension].move_to( entity_ptr ) )
194 [ # # ]: 0 : typeList[dimension].extract();
195 : :
196 : : // if it exists in the current list, remove it.
197 [ # # ][ # # ]: 0 : if( dimension == currentDimension &&
[ # # ]
198 [ # # ]: 0 : currentList.move_to( entity_ptr ) )
199 [ # # ]: 0 : currentList.extract();
200 : :
201 : : }
202 : :
203 : 10233 : DagType CAActuateSet::get_type_id( int dimension )
204 : : {
205 [ + + + + : 10233 : switch( dimension )
+ - ]
206 : : {
207 : 1137 : case 4: return DagType::body_type();
208 : 2274 : case 3: return DagType::ref_volume_type();
209 : 2274 : case 2: return DagType::ref_face_type();
210 : 2274 : case 1: return DagType::ref_edge_type();
211 : 2274 : case 0: return DagType::ref_vertex_type();
212 : 0 : default: assert(0);
213 : : return DagType::invalid_type();
214 : : }
215 [ + - ][ + - ]: 6540 : }
|