cgma
|
#include <OCCHistory.hpp>
Classes | |
struct | CGMEvent |
struct | OCCEvent |
Public Member Functions | |
OCCHistory () | |
~OCCHistory () | |
void | add_event (const OCCEvent &event) |
void | add_refentity_tracking_id_pair (RefEntity *ref_ent, int tracking_id) |
void | add_to_tracking_ids_tb_map (std::set< int > &tracking_ids, TopologyBridge *tb) |
void | collect_relevant_pairs (std::set< int > &seed_set, std::vector< std::pair< std::set< int >, TopologyBridge * > > &found_pairs) |
int | generate_next_tracking_id () |
void | print () |
void | create_cgm_history_objects () |
void | create_port_event (CGMHistory::EventType event_type, std::vector< std::pair< std::set< int >, TopologyBridge * > > &found_pairs) |
void | add_TopoDS_Shape (TopoDS_Shape *ent) |
void | remove_attributes () |
Public Attributes | |
bool | highLevelCopying |
Private Attributes | |
std::vector< OCCEvent > | eventList |
std::vector< std::pair < RefEntity *, int > > | refentity_tracking_id_map |
std::list< std::pair< std::set < int >, TopologyBridge * > > | tracking_ids_to_tb_map |
std::vector< CGMEvent > | cgmEventList |
int | trackingId |
std::vector< TopoDS_Shape * > | all_ents |
Definition at line 17 of file OCCHistory.hpp.
Definition at line 56 of file OCCHistory.cpp.
{ trackingId = -1; highLevelCopying = false; }
Definition at line 62 of file OCCHistory.cpp.
{
//OCC_ATTRIB_HISTORY::remove_all_attribs();
}
void OCCHistory::add_event | ( | const OCCEvent & | event | ) |
Definition at line 67 of file OCCHistory.cpp.
{ eventList.push_back( event ); }
void OCCHistory::add_refentity_tracking_id_pair | ( | RefEntity * | ref_ent, |
int | tracking_id | ||
) |
Definition at line 72 of file OCCHistory.cpp.
{ refentity_tracking_id_map.push_back( std::pair<RefEntity*, int>( ref_ent, tracking_id)); }
void OCCHistory::add_to_tracking_ids_tb_map | ( | std::set< int > & | tracking_ids, |
TopologyBridge * | tb | ||
) |
Definition at line 110 of file OCCHistory.cpp.
{ tracking_ids_to_tb_map.push_back( std::pair< std::set<int>, TopologyBridge*>( tracking_ids, tb ) ); }
void OCCHistory::add_TopoDS_Shape | ( | TopoDS_Shape * | ent | ) |
Definition at line 332 of file OCCHistory.cpp.
{ all_ents.push_back( entity ); }
void OCCHistory::collect_relevant_pairs | ( | std::set< int > & | seed_set, |
std::vector< std::pair< std::set< int >, TopologyBridge * > > & | found_pairs | ||
) |
Definition at line 240 of file OCCHistory.cpp.
{ std::list< std::pair< std::set<int>, TopologyBridge*> >::iterator iter; iter = tracking_ids_to_tb_map.begin(); for(; iter != tracking_ids_to_tb_map.end(); iter++ ) { std::pair< std::set<int>, TopologyBridge*> my_pair1 = *iter; std::set<int> set1 = my_pair1.first; if( set1.empty() ) continue; std::set<int>::iterator iter1, iter2; //does set1 contain any integers that are in the seed set? //if so, remove the pair from the list and add it to 'found_pairs' iter1 = set1.begin(); bool pair_found = false; for(; iter1 != set1.end(); iter1++ ) { int int1 = *iter1; for( iter2 = seed_set.begin(); iter2 != seed_set.end(); iter2++ ) { int int2 = *iter2; if( int2 == int1 ) { //clear out the set std::set<int> &tmp_set = (*iter).first; tmp_set.clear(); found_pairs.push_back( my_pair1 ); //tracking_ids_to_tb_map.erase( iter++ ); collect_relevant_pairs( set1, found_pairs ); pair_found = true; break; } } if( pair_found ) break; } // if( pair_found == false ) // iter++; } }
Definition at line 115 of file OCCHistory.cpp.
{ //look for subdivision-absorption events. //Look in tracking_ids_to_tb_map for a pair whose vector //has multiple integers in it. If you find another pair with the //same integers in it, you've found a subdivision-absorption event. std::vector< std::pair< std::set<int>, TopologyBridge*> > unrelated_pairs; std::list< std::pair< std::set<int>, TopologyBridge*> >::iterator iter; if( highLevelCopying ) { while( tracking_ids_to_tb_map.size() ) { iter = tracking_ids_to_tb_map.begin(); std::pair< std::set<int>, TopologyBridge*> pair1 = *iter; std::vector< std::pair< std::set<int>, TopologyBridge*> > found_pairs; found_pairs.push_back( pair1 ); create_port_event( CGMHistory::COPY, found_pairs ); tracking_ids_to_tb_map.erase( iter++ ); } } else { while( tracking_ids_to_tb_map.size() ) { iter = tracking_ids_to_tb_map.begin(); std::pair< std::set<int>, TopologyBridge*> pair1 = *iter; std::set<int> set1 = pair1.first; //find all pairs that have a vector that contains any integer in set1, //and at the same time recursively do the same for the found pairs //get back a 'found_pairs' list std::vector< std::pair< std::set<int>, TopologyBridge*> > found_pairs; found_pairs.push_back( pair1 ); tracking_ids_to_tb_map.erase( iter++ ); collect_relevant_pairs( set1, found_pairs ); //if the found_pairs just contains the original pair //it's a simple absorption std::vector< std::pair< std::set<int>, TopologyBridge*> >::iterator vec_iter; std::pair< std::set<int>, TopologyBridge*> tmp_pair; if( found_pairs.size() == 1 ) { //if the single set contains multiple integers, //it's a simple absorption vec_iter = found_pairs.begin(); tmp_pair = *vec_iter; std::set<int> tmp_set = tmp_pair.first; if( tmp_set.size() > 1 ) create_port_event( CGMHistory::ABSORPTION, found_pairs ); else unrelated_pairs.push_back( pair1 ); } else { //if the found_pairs all have exactly one integer in their sets, //it's a simple subdivision vec_iter = found_pairs.begin(); tmp_pair = *vec_iter; std::set<int> tmp_set = tmp_pair.first; int size_of_set = tmp_set.size(); vec_iter++; bool varying_sizes = false; for(; vec_iter != found_pairs.end(); vec_iter++ ) { tmp_pair = *vec_iter; tmp_set = tmp_pair.first; if( size_of_set != tmp_set.size() ) { varying_sizes = true; break; } } if( varying_sizes ) create_port_event( CGMHistory::SUBDIVISION_ABSORPTION, found_pairs ); else create_port_event( CGMHistory::SUBDIVISION, found_pairs ); } } } std::vector< std::pair< std::set<int>, TopologyBridge*> >::iterator vec_iter1; vec_iter1 = unrelated_pairs.begin(); for(; vec_iter1 != unrelated_pairs.end(); vec_iter1++ ) { std::set<int> set1 = (*vec_iter1).first; if( set1.size() == 0 ) continue; int tracking_id = *set1.begin(); std::vector<OCCEvent>::iterator vec_iter2 = eventList.begin(); for(; vec_iter2 != eventList.end(); vec_iter2++ ) { OCCEvent event = (*vec_iter2); if( event.eventType == CGMHistory::GEOMETRY_CHANGED || event.eventType == CGMHistory::CUT ) { int other_tracking_id = event.entities[0]; if( tracking_id == other_tracking_id ) { TopologyBridge *tb = (*vec_iter1).second; std::pair<RefEntity*, int> tmp_pair = refentity_tracking_id_map[tracking_id]; RefEntity* ref_ent = tmp_pair.first; CGMHistory::PortEvent port_event( event.eventType ); port_event.RefEnts.push_back( ref_ent ); port_event.TopologyBridges.push_back( tb ); GeometryQueryTool::instance()->history().add_port_event( port_event ); break; } } } } }
void OCCHistory::create_port_event | ( | CGMHistory::EventType | event_type, |
std::vector< std::pair< std::set< int >, TopologyBridge * > > & | found_pairs | ||
) |
Definition at line 290 of file OCCHistory.cpp.
{ CGMHistory::PortEvent port_event( event_type ); //add all TBs to the event's TB list std::vector< std::pair< std::set<int>, TopologyBridge*> >::iterator vec_iter; vec_iter = found_pairs.begin(); std::pair< std::set<int>, TopologyBridge*> tmp_pair; DLIList<RefEntity*> ref_ent_list; DLIList<TopologyBridge*> tb_list; for(; vec_iter != found_pairs.end(); vec_iter++ ) { tmp_pair = *vec_iter; TopologyBridge *tb = tmp_pair.second; tb_list.append( tb ); std::set<int> tmp_set = tmp_pair.first; std::set<int>::iterator iter=tmp_set.begin(); for(; iter != tmp_set.end(); iter++ ) { int index = *iter; std::pair<RefEntity*, int> pair2 = refentity_tracking_id_map[index]; RefEntity* ref_ent = pair2.first; ref_ent_list.append( ref_ent ); } } //uniquify the lists...then append them to the CGMEvent's vector ref_ent_list.uniquify_unordered(); tb_list.uniquify_unordered(); int i; for(i=ref_ent_list.size(); i--; ) port_event.RefEnts.push_back( ref_ent_list.get_and_step() ); for(i=tb_list.size(); i--; ) port_event.TopologyBridges.push_back( tb_list.get_and_step() ); GeometryQueryTool::instance()->history().add_port_event( port_event ); }
Definition at line 104 of file OCCHistory.cpp.
{ trackingId++; return trackingId; }
void OCCHistory::print | ( | ) |
Definition at line 79 of file OCCHistory.cpp.
{ /* std::vector<CGMEvent>::iterator iter = cgmEventList.begin(); for(; iter != cgmEventList.end(); iter++ ) { CGMEvent cgm_event = *iter; PRINT_INFO("Event type = %s RefEntities ", event_names[ cgm_event.eventType ]); int i; for( i=0; i<cgm_event.RefEnts.size(); i++ ) { RefEntity *ref_ent = cgm_event.RefEnts[i]; PRINT_INFO(" %s %d ", ref_ent->class_name(), ref_ent->id() ); } PRINT_INFO(" ---> "); for( i=0; i<cgm_event.TopologyBridges.size(); i++ ) { TopologyBridge *tb = cgm_event.TopologyBridges[i]; PRINT_INFO(" %p", tb ); } PRINT_INFO("\n"); } */ }
void OCCHistory::remove_attributes | ( | ) |
Definition at line 337 of file OCCHistory.cpp.
{ /* int i; for( i=0; i<all_ents.size(); i++ ) { OCC_ATTRIB_HISTORY *att = OCC_ATTRIB_HISTORY::get_history_attrib( all_ents[i], false ); if( att ) att->lose(); } */ }
std::vector<TopoDS_Shape*> OCCHistory::all_ents [private] |
Definition at line 79 of file OCCHistory.hpp.
std::vector<CGMEvent> OCCHistory::cgmEventList [private] |
Definition at line 77 of file OCCHistory.hpp.
std::vector<OCCEvent> OCCHistory::eventList [private] |
Definition at line 74 of file OCCHistory.hpp.
Definition at line 70 of file OCCHistory.hpp.
std::vector< std::pair<RefEntity*, int> > OCCHistory::refentity_tracking_id_map [private] |
Definition at line 75 of file OCCHistory.hpp.
std::list< std::pair< std::set<int>, TopologyBridge* > > OCCHistory::tracking_ids_to_tb_map [private] |
Definition at line 76 of file OCCHistory.hpp.
int OCCHistory::trackingId [private] |
Definition at line 78 of file OCCHistory.hpp.