root/cgm/trunk/geom/BridgeManager.cpp

Revision 1040, 6.7 KB (checked in by tautges, 2 years ago)

Version 10.2 of cgm.

  • Property svn:executable set to *
Line 
1//-------------------------------------------------------------------------
2// Filename      : BridgeManager.cpp
3//
4// Purpose       : Manages the TopologyBridges being used by
5//                 a single TopologyEntity.  Encapsulates the
6//                 merging/unmerging of TopologyBridges into/from
7//                 a TopologyEntity.
8//
9// Creator       : Darryl Melander
10//
11// Creation Date : 02/20/99
12//
13// Owner         : Darryl Melander
14//-------------------------------------------------------------------------
15#include "BridgeManager.hpp"
16#include "TopologyBridge.hpp"
17#include "TopologyEntity.hpp"
18
19#include <algorithm>
20
21// Constructor.
22// Attaches this BridgeManager to 'owner'.
23BridgeManager::BridgeManager(TopologyEntity* owner)
24    : topologyEntity(owner)
25{
26}
27
28// Destructor
29BridgeManager::~BridgeManager()
30{
31  std::vector<TopologyBridge*>::iterator iter;
32  for (iter=mergeList.begin(); iter!=mergeList.end(); iter++)
33  {
34    delete (*iter);
35  }
36  mergeList.clear();
37}
38
39// Adds this TB to the child list.  Tells 'bridge'
40// that it belongs to this BridgeManager.  If bridge is
41// already in this BridgeManager, we return FAILURE.
42// This doesn't mean 'bridge' won't be in this manager,
43// it just means it won't be in the list twice.
44CubitStatus BridgeManager::add_bridge(TopologyBridge* bridge)
45{
46  if( !bridge || bridge->owner() )
47  {
48    assert( bridge && !bridge->owner() );
49    return CUBIT_FAILURE;
50  }
51
52  mergeList.push_back(bridge);
53 
54  bridge->owner(this);
55  return CUBIT_SUCCESS;
56}
57
58// This function sets the
59CubitStatus BridgeManager::add_bridge_as_representation(TopologyBridge* bridge)
60{
61    // Make sure bridge isn't already owned by someone else
62  if( !bridge || bridge->owner() ) 
63  {
64    assert( bridge && !bridge->owner() ); 
65    return CUBIT_FAILURE;
66  }
67
68  // Add the bridge to the beginning of the list
69  mergeList.insert(mergeList.begin(), bridge );
70   
71  bridge->owner(this);
72  return CUBIT_SUCCESS;
73} 
74
75// Removes 'bridge' from this.  If it wasn't in this,
76// then return FAILURE.
77CubitStatus BridgeManager::remove_bridge(TopologyBridge* bridge )
78{
79  std::vector<TopologyBridge*>::iterator iter;
80  iter = std::find(mergeList.begin(), mergeList.end(), bridge);
81  if (iter != mergeList.end())
82    mergeList.erase(iter);
83  else
84    return CUBIT_FAILURE;
85 
86  bridge->owner(0);
87  return CUBIT_SUCCESS;
88}
89
90CubitStatus BridgeManager::bridge_destroyed( TopologyBridge* bridge )
91{
92//  if( firstBridge == bridge &&
93//      bridge->next_bridge() &&
94//      bridge->next_bridge()->bridge_sense() != bridge->bridge_sense() )
95//    topologyEntity->reverse_topology();
96
97  return remove_bridge( bridge );
98}
99 
100CubitStatus BridgeManager::remove_all_bridges()
101{
102  if (mergeList.empty())
103    return CUBIT_SUCCESS;
104
105  std::vector<TopologyBridge*>::iterator iter;
106  std::vector<TopologyBridge*> temp_list;
107
108  // make a copy of the list so we can modify the real one
109  temp_list = mergeList;
110
111  for (iter=temp_list.begin(); iter!=temp_list.end(); iter++)
112  {
113    if (!remove_bridge( *iter ))
114      break;
115  }
116
117  return mergeList.empty() ? CUBIT_SUCCESS : CUBIT_FAILURE;
118}
119
120// Transfer all bridges from 'dead' to 'this'.
121// Set correct pointers.
122CubitStatus BridgeManager::merge(BridgeManager* dead_manager, 
123                                 CubitSense relative_sense )
124{
125  if (dead_manager->mergeList.empty())
126    return CUBIT_SUCCESS;
127 
128    // Remove bridge list from dead BridgeManager
129  std::vector<TopologyBridge*> dead_list = dead_manager->mergeList;
130  dead_manager->mergeList.clear();
131
132    // Set owner and reverse sense if necessary
133    // for all bridges in merge list.
134  std::vector<TopologyBridge*>::iterator iter;
135  for (iter = dead_list.begin(); iter != dead_list.end(); iter++)
136  {
137    (*iter)->owner(this);
138    if( relative_sense == CUBIT_REVERSED )
139      (*iter)->reverse_bridge_sense();
140  }
141 
142    // append merge list to end of this manager's bridge list
143  mergeList.insert(mergeList.end(), dead_list.begin(), dead_list.end());
144 
145  return CUBIT_SUCCESS;
146}
147
148// Indicates whether this bridge is in this manager.
149CubitBoolean BridgeManager::contains_bridge(TopologyBridge* bridge) const
150{
151  return bridge->owner() == (TBOwner*)this;
152}
153
154// Appends all children TBs to bridge_list.
155// There is no check for duplicates in the list.
156// The number of TBs added is returned.
157int BridgeManager::get_bridge_list(
158  DLIList<TopologyBridge*>& bridge_list) const
159{
160  std::vector<TopologyBridge*>::const_iterator iter;
161  for (iter = mergeList.begin(); iter != mergeList.end(); iter++)
162  {
163    bridge_list.append(*iter);
164  }
165  return mergeList.size();
166}
167
168
169// Get all the child TB's that are owned by the passed
170// BridgeManager.
171int BridgeManager::get_bridge_list( 
172        DLIList<TopologyBridge*>& bridge_list,
173  GeometryQueryEngine* gqe_ptr ) const
174{
175  std::vector<TopologyBridge*>::const_iterator iter;
176  for (iter=mergeList.begin(); iter!=mergeList.end(); iter++)
177  {
178    if ( (*iter)->get_geometry_query_engine() == gqe_ptr )
179      bridge_list.append(*iter);
180  }
181  return bridge_list.size();
182  // TODO - BWH - return on this function should be consistent with other bridge list function
183}
184
185TopologyBridge* BridgeManager::topology_bridge(
186  GeometryQueryEngine* gqe_ptr ) const
187{
188  std::vector<TopologyBridge*>::const_iterator iter;
189  for (iter=mergeList.begin(); iter!=mergeList.end(); iter++)
190  {
191    if ( (*iter)->get_geometry_query_engine() == gqe_ptr )
192      return *iter;
193  }
194 
195  return 0;
196}
197
198
199void BridgeManager::reverse_bridge_senses ()
200{
201  std::vector<TopologyBridge*>::iterator iter;
202  for (iter=mergeList.begin(); iter!=mergeList.end(); iter++)
203  {
204    (*iter)->reverse_bridge_sense();
205  }
206} 
207
208CubitStatus BridgeManager::swap_bridge( TopologyBridge* old_tb,
209                                        TopologyBridge* new_tb,
210                                        bool reversed )
211{
212    // make sure new_tb isn't already owned by someone else
213  if( new_tb->owner() != NULL )
214  {
215    assert( new_tb->owner() == 0 );
216    return CUBIT_FAILURE;
217  }
218
219    // Replace old bridge with new bridge at same location
220    // in linked list.
221
222  std::vector<TopologyBridge*>::iterator iter;
223  iter = std::find(mergeList.begin(), mergeList.end(), old_tb);
224  if (iter != mergeList.end())
225  {
226    iter = mergeList.erase(iter);
227    mergeList.insert(iter, new_tb);
228  }
229  else
230  {
231    assert(false);
232    return CUBIT_FAILURE;
233  }
234 
235    // Update owner pointers
236 
237  new_tb->owner(this);
238  old_tb->owner(0);
239 
240    // If 'reversed == true' then make sure bridges have
241    // opposite sense.
242 
243  bool same_sense = new_tb->bridge_sense() == old_tb->bridge_sense();
244  if (reversed == same_sense) // if (reversed XOR same_sense)
245    new_tb->reverse_bridge_sense();
246   
247  return CUBIT_SUCCESS;
248}
249
250int BridgeManager::number_of_bridges() const
251{
252  return mergeList.size();
253}
254
255void BridgeManager::notify_reversed( TopologyBridge* bridge )
256{
257  bridge->reverse_bridge_sense();
258}
Note: See TracBrowser for help on using the browser.