Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : CompositeLump.cpp
3 : : //
4 : : // Purpose : Combine Lumps
5 : : //
6 : : // Special Notes :
7 : : //
8 : : // Creator : Jason Kraftcheck
9 : : //
10 : : // Creation Date : 01/11/02
11 : : //-------------------------------------------------------------------------
12 : :
13 : : #include "CompositeLump.hpp"
14 : : #include "CompositeShell.hpp"
15 : : #include "CompositeBody.hpp"
16 : : #include "VirtualQueryEngine.hpp"
17 : : #include "CompositeEngine.hpp"
18 : :
19 : : //-------------------------------------------------------------------------
20 : : // Purpose : Public constructor - replace real Lump with Composite
21 : : //
22 : : // Special Notes :
23 : : //
24 : : // Creator : Jason Kraftcheck
25 : : //
26 : : // Creation Date : 07/20/02
27 : : //-------------------------------------------------------------------------
28 : 0 : CompositeLump::CompositeLump( Lump* lump )
29 : 0 : : myBody(0), nextLump(0), firstShell(0), hiddenSet(0)
30 : : {
31 [ # # ]: 0 : assert( lump != NULL );
32 [ # # ][ # # ]: 0 : compGeom = new CompositeGeom(1);
33 [ # # ]: 0 : compGeom->append( lump, CUBIT_FORWARD );
34 [ # # ][ # # ]: 0 : if( lump->owner() )
35 [ # # ][ # # ]: 0 : lump->owner()->swap_bridge( lump, this, false );
36 [ # # ]: 0 : lump->owner( this );
37 : 0 : }
38 : :
39 : : //-------------------------------------------------------------------------
40 : : // Purpose : Internal constructor for splitting Composites
41 : : //
42 : : // Special Notes :
43 : : //
44 : : // Creator : Jason Kraftcheck
45 : : //
46 : : // Creation Date : 07/20/02
47 : : //-------------------------------------------------------------------------
48 : 0 : CompositeLump::CompositeLump( CompositeGeom* geometry )
49 : : : myBody(0),
50 : : nextLump(0),
51 : : compGeom( geometry ),
52 : : firstShell(0),
53 : 0 : hiddenSet(0)
54 : : {
55 [ # # ]: 0 : assert( geometry != NULL );
56 [ # # ][ # # ]: 0 : for( int i = 0; i < compGeom->num_entities(); i++ )
57 : : {
58 [ # # ]: 0 : GeometryEntity* entity = compGeom->entity(i);
59 [ # # ][ # # ]: 0 : assert( !entity->owner() );
60 [ # # ]: 0 : entity->owner(this);
61 : : }
62 : 0 : }
63 : :
64 : : //-------------------------------------------------------------------------
65 : : // Purpose : Destructor
66 : : //
67 : : // Special Notes :
68 : : //
69 : : // Creator : Jason Kraftcheck
70 : : //
71 : : // Creation Date : 07/20/02
72 : : //-------------------------------------------------------------------------
73 [ # # ]: 0 : CompositeLump::~CompositeLump()
74 : : {
75 : : int i;
76 [ # # ]: 0 : assert( !myBody );
77 : :
78 [ # # ]: 0 : while( firstShell )
79 [ # # ]: 0 : remove( firstShell );
80 : :
81 [ # # ][ # # ]: 0 : for( i = 0; i < num_lumps(); i++ )
82 [ # # ][ # # ]: 0 : if( get_lump(i)->owner() == this )
[ # # ]
83 [ # # ][ # # ]: 0 : get_lump(i)->owner(0);
84 : :
85 [ # # ][ # # ]: 0 : delete hiddenSet;
86 [ # # ][ # # ]: 0 : delete compGeom;
87 [ # # ]: 0 : }
88 : :
89 : 0 : CubitStatus CompositeLump::add( CompositeShell* shell )
90 : : {
91 [ # # ]: 0 : if( shell->myLump )
92 : 0 : return CUBIT_FAILURE;
93 : :
94 : 0 : shell->lumpNext = firstShell;
95 : 0 : firstShell = shell;
96 : 0 : shell->myLump = this;
97 : 0 : return CUBIT_SUCCESS;
98 : : }
99 : :
100 : 0 : CubitStatus CompositeLump::remove( CompositeShell* shell )
101 : : {
102 [ # # ]: 0 : if( shell->myLump != this )
103 : 0 : return CUBIT_FAILURE;
104 : :
105 [ # # ]: 0 : if( firstShell == shell )
106 : : {
107 : 0 : firstShell = firstShell->lumpNext;
108 : : }
109 : : else
110 : : {
111 : 0 : CompositeShell *prev = firstShell, *next = firstShell->lumpNext;
112 [ # # ]: 0 : while( next != shell )
113 : : {
114 [ # # ]: 0 : assert( next != NULL );
115 : 0 : prev = next;
116 : 0 : next = next->lumpNext;
117 : : }
118 : :
119 : 0 : prev->lumpNext = shell->lumpNext;
120 : : }
121 : :
122 : 0 : shell->lumpNext = 0;
123 : 0 : shell->myLump = 0;
124 : :
125 : 0 : return CUBIT_SUCCESS;
126 : : }
127 : :
128 : :
129 : 0 : CubitBox CompositeLump::bounding_box() const
130 : 0 : { return compGeom->bounding_box(); }
131 : :
132 : 0 : double CompositeLump::measure()
133 : 0 : { return compGeom->measure( compGeom->num_entities() -1 ); }
134 : :
135 : 0 : void CompositeLump::get_parents_virt( DLIList<TopologyBridge*>& parents )
136 [ # # ][ # # ]: 0 : { if( myBody ) parents.append( myBody ); }
137 : :
138 : 0 : void CompositeLump::get_children_virt( DLIList<TopologyBridge*>& children )
139 : : {
140 [ # # ]: 0 : for( CompositeShell* shell = firstShell; shell; shell = shell->lumpNext )
141 [ # # ]: 0 : children.append( shell );
142 : 0 : }
143 : :
144 : :
145 : : //-------------------------------------------------------------------------
146 : : // Purpose : Get CompositeEngine
147 : : //
148 : : // Special Notes :
149 : : //
150 : : // Creator : Jason Kraftcheck
151 : : //
152 : : // Creation Date : 01/11/02
153 : : //-------------------------------------------------------------------------
154 : 0 : GeometryQueryEngine* CompositeLump::get_geometry_query_engine() const
155 : 0 : { return VirtualQueryEngine::instance(); }
156 : :
157 : :
158 : 0 : CubitStatus CompositeLump::add( Lump* lump )
159 : : {
160 [ # # ][ # # ]: 0 : if( !lump->owner() && compGeom->append(lump,CUBIT_FORWARD) )
[ # # ]
161 : : {
162 : 0 : lump->owner(this);
163 : 0 : return CUBIT_SUCCESS;
164 : : }
165 : 0 : return CUBIT_FAILURE;
166 : : }
167 : :
168 : 0 : CubitStatus CompositeLump::remove( Lump* lump )
169 : 0 : { return remove_lump( index_of( lump ) ); }
170 : :
171 : 0 : CubitStatus CompositeLump::remove_lump( int index )
172 : : {
173 [ # # ][ # # ]: 0 : if( index < 0 || index >= num_lumps() )
[ # # ]
174 : 0 : return CUBIT_FAILURE;
175 : :
176 : 0 : TopologyBridge* lump = compGeom->entity(index);
177 [ # # ]: 0 : if( compGeom->remove( index, false ) )
178 : : {
179 [ # # ]: 0 : if( lump->owner() == this )
180 : 0 : lump->owner(0);
181 : 0 : return CUBIT_SUCCESS;
182 : : }
183 : 0 : return CUBIT_FAILURE;
184 : : }
185 : :
186 : 0 : CubitStatus CompositeLump::remove_bridge( TopologyBridge* bridge )
187 : : {
188 : 0 : int i = compGeom->index_of(bridge);
189 [ # # ]: 0 : if (i < 0)
190 : 0 : return CUBIT_FAILURE;
191 : :
192 [ # # ]: 0 : assert (bridge->owner() == this);
193 : 0 : bridge->owner(0);
194 [ # # ]: 0 : if (!compGeom->remove(i, true))
195 : 0 : return CUBIT_FAILURE;
196 : :
197 [ # # ]: 0 : if (compGeom->num_entities() == 0)
198 : 0 : CompositeEngine::instance().notify_deactivated(this);
199 : :
200 : 0 : return CUBIT_SUCCESS;
201 : : }
202 : :
203 : :
204 : 0 : CubitStatus CompositeLump::swap_bridge( TopologyBridge* old_tb,
205 : : TopologyBridge* new_tb,
206 : : bool )
207 : : {
208 [ # # ]: 0 : if( new_tb->owner() )
209 : 0 : return CUBIT_FAILURE;
210 : :
211 : 0 : int index = compGeom->index_of( old_tb );
212 [ # # ]: 0 : GeometryEntity* ge = dynamic_cast<GeometryEntity*>(new_tb);
213 [ # # ][ # # ]: 0 : if( index >= 0 && ge != 0 )
214 : : {
215 [ # # ]: 0 : if( old_tb->owner() == this )
216 : 0 : old_tb->owner(0);
217 : 0 : new_tb->owner(this);
218 : 0 : return compGeom->swap( index, ge );
219 : : }
220 : :
221 : 0 : return CUBIT_FAILURE;
222 : : }
223 : :
224 : 0 : CubitBoolean CompositeLump::contains_bridge( TopologyBridge* bridge ) const
225 : : {
226 [ # # ]: 0 : return compGeom->index_of(bridge) < 0 ? CUBIT_FALSE : CUBIT_TRUE;
227 : : }
228 : :
229 : 0 : void CompositeLump::notify_reversed( TopologyBridge* )
230 : 0 : { assert(0); }
231 : :
232 : :
233 : : //-------------------------------------------------------------------------
234 : : // Purpose : Attribute functions
235 : : //
236 : : // Special Notes :
237 : : //
238 : : // Creator : Jason Kraftcheck
239 : : //
240 : : // Creation Date : 01/11/02
241 : : //-------------------------------------------------------------------------
242 : 0 : void CompositeLump::append_simple_attribute_virt( const CubitSimpleAttrib& csa )
243 : 0 : { compGeom->add_attribute(csa); }
244 : 0 : void CompositeLump::remove_simple_attribute_virt( const CubitSimpleAttrib& csa )
245 : 0 : { compGeom->rem_attribute(csa); }
246 : 0 : void CompositeLump::remove_all_simple_attribute_virt()
247 : 0 : { compGeom->rem_all_attributes(); }
248 : 0 : CubitStatus CompositeLump::get_simple_attribute( DLIList<CubitSimpleAttrib>& list )
249 : 0 : { compGeom->get_attributes( list ); return CUBIT_SUCCESS; }
250 : 0 : CubitStatus CompositeLump::get_simple_attribute(
251 : : const CubitString& name, DLIList<CubitSimpleAttrib>& attrib_list )
252 : : {
253 : 0 : compGeom->get_attributes( name.c_str(), attrib_list );
254 : 0 : return CUBIT_SUCCESS;
255 : : }
256 : :
257 : :
258 : : //-------------------------------------------------------------------------
259 : : // Purpose : Split this CompositeLump into two.
260 : : //
261 : : // Special Notes :
262 : : //
263 : : // Creator : Jason Kraftcheck
264 : : //
265 : : // Creation Date : 06/11/04
266 : : //-------------------------------------------------------------------------
267 : 0 : CompositeLump* CompositeLump::split( VGArray<int>& indices_to_move )
268 : : {
269 : : int i;
270 : :
271 [ # # ]: 0 : for( i = 0; i < indices_to_move.size(); i++ )
272 [ # # ][ # # ]: 0 : if( indices_to_move[i] < 0 || indices_to_move[i] >= num_lumps() )
[ # # ]
273 : 0 : return 0;
274 : :
275 : 0 : CompositeGeom* new_geom = compGeom->split( indices_to_move );
276 [ # # ]: 0 : if( !new_geom )
277 : 0 : return 0;
278 : :
279 [ # # ]: 0 : for( i = 0; i < new_geom->num_entities(); i++ )
280 : 0 : new_geom->entity(i)->owner( 0 );
281 : :
282 [ # # ]: 0 : return new CompositeLump( new_geom );
283 : : }
284 : :
285 : : //-------------------------------------------------------------------------
286 : : // Purpose : Combine composite volumes
287 : : //
288 : : // Special Notes :
289 : : //
290 : : // Creator : Jason Kraftcheck
291 : : //
292 : : // Creation Date : 06/11/04
293 : : //-------------------------------------------------------------------------
294 : 0 : CubitStatus CompositeLump::combine( CompositeLump* dead_lump )
295 : : {
296 : 0 : int old_size = compGeom->num_entities();
297 : 0 : compGeom->merge( *(dead_lump->compGeom) );
298 [ # # ]: 0 : if( dead_lump->hiddenSet != 0 )
299 : 0 : hidden_entities().merge( dead_lump->hiddenSet );
300 [ # # ]: 0 : for( int i = old_size; i < compGeom->num_entities(); i++ )
301 : : {
302 : 0 : TopologyBridge* bridge = compGeom->entity(i);
303 [ # # ][ # # ]: 0 : assert( bridge->owner() == dead_lump );
304 : 0 : bridge->owner( this );
305 : : }
306 : :
307 : 0 : return CUBIT_SUCCESS;
308 : : }
309 : :
310 : : //-------------------------------------------------------------------------
311 : : // Purpose : Debug output
312 : : //
313 : : // Special Notes :
314 : : //
315 : : // Creator : Jason Kraftcheck
316 : : //
317 : : // Creation Date : 09/16/04
318 : : //-------------------------------------------------------------------------
319 : 0 : void CompositeLump::print_debug_info( const char* prefix, bool brief )
320 : : {
321 [ # # ]: 0 : if( prefix == 0 ) prefix = "";
322 : 0 : CompositeShell* shell = 0;
323 [ # # ]: 0 : if (brief)
324 : : {
325 : 0 : int count = 0;
326 [ # # ]: 0 : while ((shell = next_shell(shell)) != NULL ) ++count;
327 [ # # ]: 0 : PRINT_INFO( "%sCompositeLump %p : %d shells, %d lumps.\n",
328 [ # # ]: 0 : prefix, (void*)this, count, num_lumps() );
329 : 0 : return;
330 : : }
331 : :
332 [ # # ][ # # ]: 0 : PRINT_INFO("%sCompositeLump %p:\n", prefix, (void*)this );
333 : :
334 : 0 : char* new_prefix = new char[strlen(prefix)+3];
335 : 0 : strcpy( new_prefix, prefix );
336 : 0 : strcat( new_prefix, " " );
337 [ # # ]: 0 : if (hiddenSet) hiddenSet->print_debug_info( new_prefix );
338 [ # # ][ # # ]: 0 : else PRINT_INFO("%sNo Hidden Entities.\n", new_prefix );
339 [ # # ]: 0 : while ((shell = next_shell( shell )) != NULL )
340 : 0 : shell->print_debug_info( new_prefix );
341 [ # # ]: 0 : delete [] new_prefix;
342 : : }
343 : :
344 : :
345 : 0 : void CompositeLump::get_hidden_surfaces( DLIList<Surface*>& surfs )
346 : : {
347 [ # # ]: 0 : if (hiddenSet)
348 : 0 : hiddenSet->hidden_surfaces( surfs );
349 : 0 : }
350 : :
351 : 0 : CubitStatus CompositeLump::mass_properties( CubitVector ¢roid, double &volume )
352 : : {
353 [ # # ][ # # ]: 0 : PRINT_ERROR("CompositeLump::mass_properties is not implemented\n");
354 : 0 : centroid.set(0,0,0);
355 : 0 : volume = 0;
356 : 0 : return CUBIT_FAILURE;
357 : : }
|