From: <lko...@us...> - 2012-04-14 15:59:07
|
Revision: 1379 http://scstudio.svn.sourceforge.net/scstudio/?rev=1379&view=rev Author: lkorenciak Date: 2012-04-14 15:59:00 +0000 (Sat, 14 Apr 2012) Log Message: ----------- fixed bug in using iterators Modified Paths: -------------- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp Modified: branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp =================================================================== --- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-04-13 15:59:24 UTC (rev 1378) +++ branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-04-14 15:59:00 UTC (rev 1379) @@ -351,7 +351,8 @@ InstancePtrList::const_iterator ipos1 = bmsc->get_instances().begin(); if(ipos1 != bmsc->get_instances().end()) { - InstancePtrList::const_iterator ipos2 = ipos1++; + InstancePtrList::const_iterator ipos2 = ipos1; + ipos2++; if(ipos2!=bmsc->get_instances().end()) instDist = fabs ((*ipos2)->get_line_end().get_x() - (*ipos1)->get_line_end().get_x()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <xf...@us...> - 2012-04-17 13:52:02
|
Revision: 1381 http://scstudio.svn.sourceforge.net/scstudio/?rev=1381&view=rev Author: xfarmad Date: 2012-04-17 13:51:51 +0000 (Tue, 17 Apr 2012) Log Message: ----------- Modified Paths: -------------- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp Modified: branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp =================================================================== --- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-04-14 16:15:38 UTC (rev 1380) +++ branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-04-17 13:51:51 UTC (rev 1381) @@ -271,7 +271,7 @@ if(bmsc != NULL) return save_bmsc(stream, bmsc); else if(hmsc != NULL) - return 2; + return save_hmsc(stream, hmsc); else return 1; // unexpected pointer } @@ -338,7 +338,189 @@ (*it).second.push_back(coregion_area); } +#define toCm /10 +int ExportTex::save_hmsc(std::ostream& stream, const HMscPtr& hmsc) +{ + PtrIDMap<HMscNodePtr> node_id_map; // node identifiers + // nodes to be processed; this is to avoid recursion + std::list<HMscNodePtr> node_stack; + + //find HMSC size + //lowerleft corner + MscPoint llCorner(0,0); + //upperright corner + MscPoint urCorner(0,0); + // initialize the stack with the start node + push_back_if_unique<HMscNodePtr>(node_stack, hmsc->get_start()); + + // process all nodes in the stack + for(std::list<HMscNodePtr>::const_iterator npos = node_stack.begin(); + npos != node_stack.end(); npos++) + { + // process forward links + PredecessorNode *predecessor_node = dynamic_cast<PredecessorNode*>(npos->get()); + if(predecessor_node != NULL) + { + for(NodeRelationPtrVector::const_iterator spos = predecessor_node->get_successors().begin(); + spos != predecessor_node->get_successors().end(); spos++) + { + SuccessorNode *successor = (*spos)->get_successor(); + HMscNode *successor_node = dynamic_cast<HMscNode*>(successor); + // add successors of this node to the stack + // note: std::list<>::push_back doesn't invalidate iterators + push_back_if_unique<HMscNodePtr>(node_stack, successor_node); + } + } + + if(npos == node_stack.begin()){ + llCorner.set_x((*npos)->get_position().get_x()); + llCorner.set_y((*npos)->get_position().get_y()); + urCorner.set_x((*npos)->get_position().get_x()); + urCorner.set_y((*npos)->get_position().get_y()); + continue; + } + if((*npos)->get_position().get_x()<llCorner.get_x()) + llCorner.set_x((*npos)->get_position().get_x()); + if((*npos)->get_position().get_y()>llCorner.get_y()) + llCorner.set_y((*npos)->get_position().get_y()); + if((*npos)->get_position().get_x()>urCorner.get_x()) + urCorner.set_x((*npos)->get_position().get_x()); + if((*npos)->get_position().get_y()<urCorner.get_y()) + urCorner.set_y((*npos)->get_position().get_y()); + } + node_stack.clear(); + + stream << "\\begin{hmsc}{" << VALID_NAME_TEX(hmsc->get_label()) << "}("; + if(llCorner.get_x()<0) + stream << -(llCorner.get_x()-1)toCm; + else + stream << "0"; + stream << "," << -(llCorner.get_y()+fabs(urCorner.get_y()))toCm << ")(" + << (urCorner.get_x()+fabs(urCorner.get_y()))toCm << ","; + if(urCorner.get_y()<0) + stream << (urCorner.get_y()-1)toCm; + else + stream << "0"; + stream << ")" << std::endl; + + + // initialize the stack with the start node + push_back_if_unique<HMscNodePtr>(node_stack, hmsc->get_start()); + + // process all nodes in the stack + for(std::list<HMscNodePtr>::const_iterator npos = node_stack.begin(); + npos != node_stack.end(); npos++) + { + if(*npos == NULL) + { + stream << "/* ERROR: BAD HMSC NODE */" << std::endl; + continue; + } + + StartNodePtr start_node = boost::dynamic_pointer_cast<StartNode>(*npos); + if(start_node != NULL) + { + stream << "\\hmscstartsymbol{" << node_id_map.get_id(*npos) << "}(" << start_node->get_position().get_x()toCm + << "," << -start_node->get_position().get_y()toCm << ")"<< std::endl; + } + + ConditionNodePtr condition_node = boost::dynamic_pointer_cast<ConditionNode>(*npos); + if(condition_node != NULL) + { + stream << "\\hmsccondition{" << node_id_map.get_id(*npos) + << "}{" << condition_node->get_label() << "}{" << condition_node->get_position().get_x()toCm + << "," << -condition_node->get_position().get_y()toCm << ")" << std::endl; + // TODO: expressions may also appear as conditions + } + + ConnectionNodePtr connection_node = boost::dynamic_pointer_cast<ConnectionNode>(*npos); + if(connection_node != NULL) + { + stream << "\\hmscconnection{" << node_id_map.get_id(*npos) + << "}(" << connection_node->get_position().get_x()toCm + << "," << -condition_node->get_position().get_y()toCm << ")" << std::endl; + } + + ReferenceNodePtr reference_node = boost::dynamic_pointer_cast<ReferenceNode>(*npos); + if(reference_node != NULL) + { + if(reference_node->get_msc() != NULL) + { + stream << "\\hmscreference{" << node_id_map.get_id(*npos) + << "}{" << VALID_NAME_TEX(reference_node->get_msc()->get_label()) + << "}(" << reference_node->get_position().get_x()toCm + << "," << -reference_node->get_position().get_y()toCm << ")" << std::endl; + m_printing.push_back(reference_node->get_msc()); + } + else + stream << "/* ERROR: BAD HMSC REFERENCE */" << std::endl; + } + + EndNodePtr end_node = boost::dynamic_pointer_cast<EndNode>(*npos); + if(end_node != NULL) + { + stream << "\\hmscendsymbol{" << node_id_map.get_id(*npos) + << "}(" << end_node->get_position().get_x()toCm + << "," << -end_node->get_position().get_y()toCm << ")" << std::endl; + } + + // process forward links + PredecessorNode *predecessor_node = dynamic_cast<PredecessorNode*>(npos->get()); + if(predecessor_node != NULL) + { + for(NodeRelationPtrVector::const_iterator spos = predecessor_node->get_successors().begin(); + spos != predecessor_node->get_successors().end(); spos++) + { + SuccessorNode *successor = (*spos)->get_successor(); + HMscNode *successor_node = dynamic_cast<HMscNode*>(successor); + + // add successors of this node to the stack + // note: std::list<>::push_back doesn't invalidate iterators + push_back_if_unique<HMscNodePtr>(node_stack, successor_node); + } + } + } + node_stack.clear(); + + // initialize the stack with the start node + push_back_if_unique<HMscNodePtr>(node_stack, hmsc->get_start()); + + for(std::list<HMscNodePtr>::const_iterator npos = node_stack.begin(); + npos != node_stack.end(); npos++) + { + // process forward links + PredecessorNode *predecessor_node = dynamic_cast<PredecessorNode*>(npos->get()); + if(predecessor_node != NULL) + { + if(predecessor_node->get_successors().empty()) + { + print_report(RS_WARNING, stringize() + << L"Warning: HMSC node without successors violates the Z.120 standard."); + } + + for(NodeRelationPtrVector::const_iterator spos = predecessor_node->get_successors().begin(); + spos != predecessor_node->get_successors().end(); spos++) + { + SuccessorNode *successor = (*spos)->get_successor(); + + HMscNode *successor_node = dynamic_cast<HMscNode*>(successor); + + stream << "\\arrow{" << node_id_map.get_id(*npos) << "}{" + << node_id_map.get_id(successor_node) << "}" << std::endl; + + // add successors of this node to the stack + // note: std::list<>::push_back doesn't invalidate iterators + push_back_if_unique<HMscNodePtr>(node_stack, successor_node); + } + } + } + + stream << "\\end{hmsc}" << std::endl; + return 0; +} + + int ExportTex::save_bmsc(std::ostream& stream, const BMscPtr& bmsc) { PtrIDMap<MscMessagePtr> message_id_map; // message instance identifiers This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <xf...@us...> - 2012-04-19 21:09:18
|
Revision: 1388 http://scstudio.svn.sourceforge.net/scstudio/?rev=1388&view=rev Author: xfarmad Date: 2012-04-19 21:09:12 +0000 (Thu, 19 Apr 2012) Log Message: ----------- Modified Paths: -------------- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp Modified: branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp =================================================================== --- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-04-18 20:19:00 UTC (rev 1387) +++ branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-04-19 21:09:12 UTC (rev 1388) @@ -519,7 +519,7 @@ int ExportTex::save_bmsc(std::ostream& stream, const BMscPtr& bmsc) -{ +{ ElementListMap event_level_map; PtrIDMap<MscMessagePtr> message_id_map; // message instance identifiers PtrIDMap<EventPtr> event_id_map; // event identifiers @@ -598,7 +598,8 @@ //set up atributes //distance between instances - stream << "\\setlength{\\instdist}{" << instDist << "mm}" << std::endl; + stream << "\\setlength{\\instdist}{"<< instDist << "mm}" << std::endl; + if(!event_level_map.empty()){ //height just below head symbol stream << "\\setlength{\\firstlevelheight}{" << event_level_map.begin()->first << "mm}" << std::endl; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <xf...@us...> - 2012-04-24 10:57:38
|
Revision: 1391 http://scstudio.svn.sourceforge.net/scstudio/?rev=1391&view=rev Author: xfarmad Date: 2012-04-24 10:57:32 +0000 (Tue, 24 Apr 2012) Log Message: ----------- Modified Paths: -------------- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp Modified: branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp =================================================================== --- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-04-20 05:43:04 UTC (rev 1390) +++ branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-04-24 10:57:32 UTC (rev 1391) @@ -358,7 +358,7 @@ // process forward links PredecessorNode *predecessor_node = dynamic_cast<PredecessorNode*>(npos->get()); if(predecessor_node != NULL) - { + { for(NodeRelationPtrVector::const_iterator spos = predecessor_node->get_successors().begin(); spos != predecessor_node->get_successors().end(); spos++) { @@ -466,6 +466,11 @@ PredecessorNode *predecessor_node = dynamic_cast<PredecessorNode*>(npos->get()); if(predecessor_node != NULL) { + if(predecessor_node->get_successors().empty()) + { + print_report(RS_WARNING, stringize() + << L"Warning: HMSC node without successors violates the Z.120 standard."); + } for(NodeRelationPtrVector::const_iterator spos = predecessor_node->get_successors().begin(); spos != predecessor_node->get_successors().end(); spos++) { @@ -490,11 +495,6 @@ PredecessorNode *predecessor_node = dynamic_cast<PredecessorNode*>(npos->get()); if(predecessor_node != NULL) { - if(predecessor_node->get_successors().empty()) - { - print_report(RS_WARNING, stringize() - << L"Warning: HMSC node without successors violates the Z.120 standard."); - } for(NodeRelationPtrVector::const_iterator spos = predecessor_node->get_successors().begin(); spos != predecessor_node->get_successors().end(); spos++) @@ -686,23 +686,24 @@ CompleteMessagePtr complete_message = event->get_complete_message(); if(complete_message != NULL) { - Coordinate sendY = complete_message->get_send_event()->get_position().get_y(); - Coordinate receiveY = complete_message->get_receive_event()->get_position().get_y(); - - CoregionEventPtr coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_send_event()); - if(coregion_event!=NULL) + if(complete_message->get_send_event() == event) { - sendY += coregion_event->get_coregion_area()->get_begin_height(); - } + Coordinate sendY = complete_message->get_send_event()->get_position().get_y(); + Coordinate receiveY = complete_message->get_receive_event()->get_position().get_y(); - coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_receive_event()); - if(coregion_event!=NULL) - { - receiveY += coregion_event->get_coregion_area()->get_begin_height(); - } + CoregionEventPtr coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_send_event()); + if(coregion_event!=NULL) + { + sendY += coregion_event->get_coregion_area()->get_begin_height(); + } - if(complete_message->get_send_event() == event) - { + coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_receive_event()); + if(coregion_event!=NULL) + { + receiveY += coregion_event->get_coregion_area()->get_begin_height(); + } + + stream << "\\mess{" << VALID_NAME_TEX(complete_message->get_label()) << "}{" << VALID_NAME_TEX(complete_message->get_sender()->get_label()) << "}[0.2]{" << VALID_NAME_TEX(complete_message->get_receiver()->get_label()) @@ -714,12 +715,15 @@ if(incomplete_message != NULL) { + stream << "\\setlength{\\msccommentdist}{" << -(incomplete_message->get_dot_position().get_x() - event->get_instance()->get_line_begin().get_x() ) << "mm}" << std::endl; + if(incomplete_message->is_lost()) - stream << "\\lost{" << VALID_NAME_TEX(incomplete_message->get_label()) - << "}{}{" << VALID_NAME_TEX(incomplete_message->get_instance_label()) - << "}" << std::endl; + stream << "\\lost"; if(incomplete_message->is_found()) - stream << "\\found{" << VALID_NAME_TEX(incomplete_message->get_label()) + stream << "\\found"; + if(incomplete_message->get_dot_position().get_x()> event->get_instance()->get_line_begin().get_x()) + stream << "[r]"; + stream << "{" << VALID_NAME_TEX(incomplete_message->get_label()) << "}{}{" << VALID_NAME_TEX(incomplete_message->get_instance_label()) << "}" << std::endl; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <xf...@us...> - 2012-06-23 11:06:09
|
Revision: 1419 http://scstudio.svn.sourceforge.net/scstudio/?rev=1419&view=rev Author: xfarmad Date: 2012-06-23 11:06:03 +0000 (Sat, 23 Jun 2012) Log Message: ----------- Modified Paths: -------------- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp Modified: branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp =================================================================== --- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-06-23 10:48:45 UTC (rev 1418) +++ branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-06-23 11:06:03 UTC (rev 1419) @@ -25,17 +25,17 @@ * * Note: Naming conventions violated for 'code prettiness' reasons. */ -#define VALID_NAME_TEX(name) __VALID_NAME_TEX(this, name) +#define VALID_NAME(name) __VALID_NAME(this, name) -class __VALID_NAME_TEX +class __VALID_NAME { public: - __VALID_NAME_TEX(ExportTex* exportTex, const std::wstring &name) + __VALID_NAME(ExportTex* exportTex, const std::wstring &name) : m_exportTex(exportTex), m_name(name) { } friend std::ostream& - operator<<(std::ostream& os, const __VALID_NAME_TEX& value) + operator<<(std::ostream& os, const __VALID_NAME& value) { static const std::string replacement = "\\_"; bool was_replacement = false; @@ -102,7 +102,6 @@ } - int ExportTex::print_document_head(std::ostream& stream) { stream << "\\documentclass{article}" <<std::endl; @@ -124,7 +123,7 @@ int result = 0; // error count print_document_head(stream); - stream << "\\section*{"<< VALID_NAME_TEX(name) << "}" << std::endl; + stream << "\\section*{"<< VALID_NAME(name) << "}" << std::endl; std::set<std::wstring> printed; @@ -178,63 +177,69 @@ event_level_map.insert( std::make_pair<Coordinate,MscElementPtrList>(coordinate, MscElementPtrList() )); } -void ExportTex::insert_comment(CommentPtr comment,ElementListMap& event_level_map, Coordinate coordinate = 0) +void ExportTex::insert_pointer(MscElementPtr pointer, Coordinate coordinate, ElementListMap& event_level_map) { ElementListMap::iterator it; - Coordinate cor = comment->get_position().get_y()+coordinate; - it = event_level_map.find(cor); - + it = event_level_map.find(coordinate); if(it == event_level_map.end()) { - create_level(cor,event_level_map); - it = event_level_map.find(cor); + create_level(coordinate,event_level_map); + it = event_level_map.find(coordinate); } - - (*it).second.push_back(comment); + (*it).second.push_back(pointer); } +void ExportTex::insert_comment(CommentPtr comment,ElementListMap& event_level_map, Coordinate coordinate = 0) +{ + Coordinate cor = comment->get_position().get_y()+coordinate; + insert_pointer(comment,cor,event_level_map); +} + void ExportTex::insert_event(EventPtr event,ElementListMap& event_level_map, Coordinate coordinate = 0) { - ElementListMap::iterator it; Coordinate cor = event->get_position().get_y()+coordinate; - it = event_level_map.find(cor); - - if(it == event_level_map.end()) - { - create_level(cor,event_level_map); - it = event_level_map.find(cor); - } - + insert_pointer(event,cor,event_level_map); + for(CommentPtrSet::const_iterator cpos = event->get_comments().begin(); cpos != event->get_comments().end(); cpos++) { insert_comment((*cpos),event_level_map); } - - (*it).second.push_back(event); } void ExportTex::insert_coregion_area(CoregionAreaPtr coregion_area,ElementListMap& event_level_map) { - ElementListMap::iterator it; - - it = event_level_map.find(coregion_area->get_begin_height()); - if(it == event_level_map.end()) - { - create_level(coregion_area->get_begin_height(),event_level_map); - it = event_level_map.find(coregion_area->get_begin_height()); - } - (*it).second.push_back(coregion_area); - - it = event_level_map.find(coregion_area->get_end_height()); - if(it == event_level_map.end()) - { - create_level(coregion_area->get_end_height(),event_level_map); - it = event_level_map.find(coregion_area->get_end_height()); - } - (*it).second.push_back(coregion_area); + insert_pointer(coregion_area,coregion_area->get_begin_height(),event_level_map); + insert_pointer(coregion_area,coregion_area->get_end_height(),event_level_map); } +void ExportTex::insert_time_relations(ElementListMap& event_level_map, const EventPtr& event, Coordinate coordinate = 0) +{ + const TimeRelationEventPtrList& relations = event->get_time_relations(); + const AbsoluteTimePtrList absolute_times = event->get_absolut_times(); + // process all absolute time constraints + for(AbsoluteTimePtrList::const_iterator apos = absolute_times.begin(); + apos != absolute_times.end(); apos++) + { + insert_pointer(*apos,(*apos)->get_position().get_y()+coordinate,event_level_map); + } + // process all time relations + for(TimeRelationEventPtrList::const_iterator rpos = relations.begin(); + rpos != relations.end(); rpos++) + { + // for each "event a" we print the time relation to "event b" + // we thus skip all "events b" + if((*rpos)->get_event_a() != event) + continue; + + insert_pointer(*rpos,(*rpos)->get_event_a()->get_position().get_y()+coordinate,event_level_map); + } +} + + + + + #define toCm /10 int ExportTex::save_hmsc(std::ostream& stream, const HMscPtr& hmsc) @@ -288,7 +293,7 @@ } node_stack.clear(); - stream << "\\begin{hmsc}{" << VALID_NAME_TEX(hmsc->get_label()) << "}("; + stream << "\\begin{hmsc}{" << VALID_NAME(hmsc->get_label()) << "}("; if(llCorner.get_x()<0) stream << -(llCorner.get_x()-1)toCm; else @@ -336,7 +341,7 @@ { stream << "\\hmscconnection{" << node_id_map.get_id(*npos) << "}(" << connection_node->get_position().get_x()toCm - << "," << -condition_node->get_position().get_y()toCm << ")" << std::endl; + << "," << -connection_node->get_position().get_y()toCm << ")" << std::endl; } ReferenceNodePtr reference_node = boost::dynamic_pointer_cast<ReferenceNode>(*npos); @@ -345,7 +350,7 @@ if(reference_node->get_msc() != NULL) { stream << "\\hmscreference{" << node_id_map.get_id(*npos) - << "}{" << VALID_NAME_TEX(reference_node->get_msc()->get_label()) + << "}{" << VALID_NAME(reference_node->get_msc()->get_label()) << "}(" << reference_node->get_position().get_x()toCm << "," << -reference_node->get_position().get_y()toCm << ")" << std::endl; m_printing.push_back(reference_node->get_msc()); @@ -402,9 +407,13 @@ SuccessorNode *successor = (*spos)->get_successor(); HMscNode *successor_node = dynamic_cast<HMscNode*>(successor); - - stream << "\\arrow{" << node_id_map.get_id(*npos) << "}{" - << node_id_map.get_id(successor_node) << "}" << std::endl; + + stream << "\\arrow{" << node_id_map.get_id(*npos) << "}["; + for(std::list<MscPoint>::const_iterator point = (*spos)->get_line().get_points().begin(); point != (*spos)->get_line().get_points().end();point++){ + stream << "(" << point->get_x()toCm << "," << point->get_y()toCm << ")"; + } + + stream << "]{" << node_id_map.get_id(successor_node) << "}" << std::endl; // add successors of this node to the stack // note: std::list<>::push_back doesn't invalidate iterators @@ -457,6 +466,7 @@ event != NULL; event = event->get_successor()) { insert_event(event,event_level_map); + insert_time_relations(event_level_map,event); } } @@ -491,6 +501,7 @@ // note: std::list<>::push_back doesn't invalidate iterators push_back_if_unique<CoregionEventPtr>(event_stack, successor); } + insert_time_relations(event_level_map,*epos); } } } @@ -509,7 +520,7 @@ } //print_element_attributes(stream, bmsc); - stream << "\\begin{msc}{" << VALID_NAME_TEX(bmsc->get_label()) << "}" << std::endl; + stream << "\\begin{msc}{" << VALID_NAME(bmsc->get_label()) << "}" << std::endl; print_instances(stream,bmsc->get_instances(),instance_id_map); @@ -583,7 +594,8 @@ void ExportTex::print_event(std::ostream& stream, PtrIDMap<MscMessagePtr>& message_id_map, const EventPtr& event,ElementListMap& event_level_map,PtrIDMap<InstancePtr>& instance_id_map) { - print_event_comment(stream, event,event_level_map,instance_id_map); + print_event_comment(stream, event,event_level_map, instance_id_map); + print_time_relations(stream, event,event_level_map, instance_id_map); CompleteMessagePtr complete_message = event->get_complete_message(); if(complete_message != NULL) { @@ -605,29 +617,38 @@ } - stream << "\\mess{" << VALID_NAME_TEX(complete_message->get_label()) - << "}{"<< instance_id_map.get_id(complete_message->get_sender()) << "_" << VALID_NAME_TEX(complete_message->get_sender()->get_label()) - << "}[0.2]{"<< instance_id_map.get_id(complete_message->get_receiver()) << "_" << VALID_NAME_TEX(complete_message->get_receiver()->get_label()) + stream << "\\mess{" << VALID_NAME(complete_message->get_label()) + << "}{"<< instance_id_map.get_id(complete_message->get_sender()) << "_" << VALID_NAME(complete_message->get_sender()->get_label()) + << "}[0.2]{"<< instance_id_map.get_id(complete_message->get_receiver()) << "_" << VALID_NAME(complete_message->get_receiver()->get_label()) << "}[" << get_slope(event_level_map.find(sendY),event_level_map.find(receiveY),event_level_map) << "]" << std::endl; } } - IncompleteMessagePtr incomplete_message = event->get_incomplete_message(); - if(incomplete_message != NULL) + + LocalActionPtr localAction = boost::dynamic_pointer_cast<LocalAction>(event->get_incomplete_message()); + if(localAction!=NULL){ + stream << "localAction" << std::endl; + } + else { - stream << "\\setlength{\\selfmesswidth}{" << fabs(incomplete_message->get_dot_position().get_x() - event->get_instance()->get_line_begin().get_x() ) << "mm}" << std::endl; + IncompleteMessagePtr incomplete_message = event->get_incomplete_message(); + if(incomplete_message != NULL) + { + + stream << "\\setlength{\\selfmesswidth}{" << fabs(incomplete_message->get_dot_position().get_x() - event->get_instance()->get_line_begin().get_x() ) << "mm}" << std::endl; - if(incomplete_message->is_lost()) - stream << "\\lost"; - if(incomplete_message->is_found()) - stream << "\\found"; - if(incomplete_message->get_dot_position().get_x()> event->get_instance()->get_line_begin().get_x()) - stream << "[r]"; - stream << "{" << VALID_NAME_TEX(incomplete_message->get_label()) - << "}{}{" << instance_id_map.get_id(event->get_instance()) << "_" << VALID_NAME_TEX(event->get_instance()->get_label()) - << "}" << std::endl; - } + if(incomplete_message->is_lost()) + stream << "\\lost"; + if(incomplete_message->is_found()) + stream << "\\found"; + if(incomplete_message->get_dot_position().get_x()> event->get_instance()->get_line_begin().get_x()) + stream << "[r]"; + stream << "{" << VALID_NAME(incomplete_message->get_label()) + << "}{}{" << instance_id_map.get_id(event->get_instance()) << "_" << VALID_NAME(event->get_instance()->get_label()) + << "}" << std::endl; + } + } } void ExportTex::print_coregion_area(std::ostream& stream,PtrIDMap<InstancePtr>& instance_id_map, const CoregionAreaPtr& coregionArea, Coordinate coordinate) @@ -636,14 +657,14 @@ { stream << "\\setlength{\\regionbarwidth}{" << coregionArea->get_width() << "mm}" << std::endl; stream << "\\regionstart{coregion}{" - << instance_id_map.get_id(coregionArea->get_instance()) << "_" << VALID_NAME_TEX(coregionArea->get_instance()->get_label()) <<"}" << std::endl; + << instance_id_map.get_id(coregionArea->get_instance()) << "_" << VALID_NAME(coregionArea->get_instance()->get_label()) <<"}" << std::endl; return; } if(coregionArea->get_end_height() == coordinate) { stream << "\\regionend{" - << instance_id_map.get_id(coregionArea->get_instance()) << "_" << VALID_NAME_TEX(coregionArea->get_instance()->get_label()) <<"}" << std::endl; + << instance_id_map.get_id(coregionArea->get_instance()) << "_" << VALID_NAME(coregionArea->get_instance()->get_label()) <<"}" << std::endl; return; } } @@ -658,8 +679,8 @@ stream << "\\msccomment"; if((*cpos)->get_position().get_x() > event->get_instance()->get_line_begin().get_x()) stream << "[r]"; - stream << "{" << VALID_NAME_TEX((*cpos)->get_text()) << "}{" - << instance_id_map.get_id(event->get_instance()) << "_" << VALID_NAME_TEX(event->get_instance()->get_label()) << "}"; + stream << "{" << VALID_NAME((*cpos)->get_text()) << "}{" + << instance_id_map.get_id(event->get_instance()) << "_" << VALID_NAME(event->get_instance()->get_label()) << "}"; stream << "[" << get_slope(event_level_map.find(event->get_position().get_y()),event_level_map.find((*cpos)->get_position().get_y()),event_level_map) << "]"; stream << std::endl; } @@ -678,8 +699,95 @@ } stream << "\\setlength{\\instwidth}{" << (*min)->get_width() << "mm}" << std::endl; stream << "\\declinst{" << instance_id_map.get_id((*min)) << "_" - << VALID_NAME_TEX((*min)->get_label()) << "}{" - << VALID_NAME_TEX((*min)->get_label()) << "}{}" << std::endl; + << VALID_NAME((*min)->get_label()) << "}{" + << VALID_NAME((*min)->get_label()) << "}{}" << std::endl; instances.erase(min); } +} + +void ExportTex::print_absolute_time(std::ostream& stream, AbsoluteTimePtr abs) +{ + const std::list< MscTimeInterval<double> > constraints = abs->get_interval_set().get_set(); + + // NOTE: using the output ordering just for sure, in real, just one interval is present + BasicStringListPrinter<double> printer; + + for(std::list< MscTimeInterval<double> >::const_iterator it = constraints.begin(); + it != constraints.end(); it++) + { + if(it->get_begin_value() != it->get_end_value()) + { + if (it->get_begin_closed()) + printer << "@["; + else + printer << "@("; + + printer << it->get_begin() << "," << it->get_end(); + + if (it->get_end_closed()) + printer << "]"; + else + printer << ")"; + } + else + printer << "[@" << it->get_begin() << "]"; + + printer.commit_item(it->get_begin().get_value()); + } + + printer.print(stream); +} + +void ExportTex::print_time_relations(std::ostream& stream, const EventPtr& event,ElementListMap& event_level_map,PtrIDMap<InstancePtr>& instance_id_map) +{ + + const TimeRelationEventPtrList& relations = event->get_time_relations(); + const AbsoluteTimePtrList absolute_times = event->get_absolut_times(); + // process all absolute time constraints + for(AbsoluteTimePtrList::const_iterator apos = absolute_times.begin(); + apos != absolute_times.end(); apos++) + { + stream << "\\mscmark["; + if(get_slope(event_level_map.find(event->get_position().get_y()),event_level_map.find((*apos)->get_position().get_y()),event_level_map)<0) + { + stream << "b"; + } + else + { + stream << "t"; + } + if(((*apos)->get_position().get_x() - event->get_instance()->get_line_begin().get_x() )>0) + { + stream << "r"; + } + else + { + stream << "l"; + } + stream << "]{"; + print_absolute_time(stream, *apos); + stream << "}{" << VALID_NAME(event->get_instance()->get_label()) << "}" << std::endl; + } + + // process all time relations + for(TimeRelationEventPtrList::const_iterator rpos = relations.begin(); + rpos != relations.end(); rpos++) + { + if((*rpos)->get_event_a()==event){ + //TODO: directed interval + stream << "\\measure["; + if((*rpos)->get_width()<0) + { + stream << "r"; + } + else + { + stream << "l"; + } + stream << "]{" << (*rpos)->get_label() << "}{" << (*rpos)->get_event_a()->get_instance()->get_label() + << "}{" << (*rpos)->get_event_b()->get_instance()->get_label() << "}[" + << get_slope(event_level_map.find((*rpos)->get_event_a()->get_position().get_y()),event_level_map.find((*rpos)->get_event_b()->get_position().get_y()),event_level_map) + << "]" << std::endl; + } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <xf...@us...> - 2012-07-17 10:48:59
|
Revision: 1442 http://scstudio.svn.sourceforge.net/scstudio/?rev=1442&view=rev Author: xfarmad Date: 2012-07-17 10:48:51 +0000 (Tue, 17 Jul 2012) Log Message: ----------- Modified Paths: -------------- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp Modified: branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp =================================================================== --- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-07-16 12:31:31 UTC (rev 1441) +++ branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-07-17 10:48:51 UTC (rev 1442) @@ -8,6 +8,7 @@ #include <iterator> #include <sstream> #include <cmath> +#include <fstream> #include "data/Z120/exportTex.h" @@ -25,17 +26,17 @@ * * Note: Naming conventions violated for 'code prettiness' reasons. */ -#define VALID_NAME(name) __VALID_NAME(this, name) +#define VALID_NAME_TEX(name) __VALID_NAME_TEX(this, name) -class __VALID_NAME +class __VALID_NAME_TEX { public: - __VALID_NAME(ExportTex* exportTex, const std::wstring &name) + __VALID_NAME_TEX(ExportTex* exportTex, const std::wstring &name) : m_exportTex(exportTex), m_name(name) { } friend std::ostream& - operator<<(std::ostream& os, const __VALID_NAME& value) + operator<<(std::ostream& os, const __VALID_NAME_TEX& value) { static const std::string replacement = "\\_"; bool was_replacement = false; @@ -92,8 +93,961 @@ std::wstring m_name; }; +class DistanceMap{ +private: + std::map<Coordinate,int,Compare> distance_map; + std::string m_name; + Coordinate round(Coordinate coordinate) + { + return floor(coordinate+0.5); + }; +public: + /* + DistanceMap(){ + DistanceMap("undefined"); + }; + */ + DistanceMap(std::string name) + { + m_name.append(name); + }; + void addDistance(Coordinate coordinate) + { + if(distance_map.find(coordinate)==distance_map.end()) + { + distance_map.insert( std::make_pair<Coordinate,int>(round(coordinate),distance_map.size())); + } + }; + void addDistance(Coordinate coordinate1, Coordinate coordinate2, bool absolute = false) + { + Coordinate distance = round(coordinate2) - round(coordinate1); + if(absolute) + distance = fabs(distance); + if(distance_map.find(distance)==distance_map.end()) + { + distance_map.insert( std::make_pair<Coordinate,int>(round(distance),distance_map.size())); + } + }; + + std::string getId(Coordinate coordinate) + { + std::ostringstream result; + if(distance_map.find(coordinate)!=distance_map.end()) + { + result << "\\" << m_name; + result << (char)('a'+distance_map.find(round(coordinate))->second); + } + else + { + result << round(coordinate); + result << "mm"; + } + return result.str(); + }; + + std::string getId(Coordinate coordinate1, Coordinate coordinate2, bool absolute = false) + { + Coordinate distance = round(coordinate2) - round(coordinate1); + if(absolute) + distance = fabs(distance); + return getId(distance); + }; + + std::map<Coordinate,int,Compare> getMap() + { + return distance_map; + }; + + void print(std::ostream& stream) + { + if(distance_map.size() != 0) + for(std::map<Coordinate,int,Compare>::iterator it = distance_map.begin(); it!=distance_map.end(); it++) + { + stream << "\\def\\" << m_name << (char)('a'+it->second) << "{" << it->first << "mm*\\real{\\scale@y}}" << std::endl; + } + else + stream << "%none%" << std::endl; + } + + bool empty(){ + if(distance_map.size()==0) + return true; + else + return false; + } +}; + + + + +class Levels +{ +private: + std::ostream stream; + BMscPtr bmsc; + ExportTex* export_tex; + ElementListMap event_level_map; + std::map<Coordinate,int,Compare> level_types; + PtrIDMap<InstancePtr> instance_id_map; + // distances + Coordinate first_level; + Coordinate last_level; + DistanceMap slope_map; + //basic levels distance map + DistanceMap event_dist_map; + DistanceMap coregion_first_map; + DistanceMap coregion_last_map; + DistanceMap coregion_width_map; + DistanceMap coregion_end_width_map; + DistanceMap local_action_width_map; + DistanceMap local_action_height_map; + DistanceMap local_condition_width_map; + DistanceMap local_condition_height_map; + DistanceMap lostfound_width_map; + DistanceMap comment_width_map; + DistanceMap comment_slope_map; + DistanceMap absolutetime_width_map; + DistanceMap absolutetime_slope_map; + DistanceMap timeinterval_width_map; + DistanceMap timeinterval_slope_map; + DistanceMap ordering_width_map; + + static Coordinate round(Coordinate coordinate) + { + return floor(coordinate+0.5); + }; + + bool findPtr(MscElementPtrList list, MscElementPtr element) + { + for (MscElementPtrList::iterator nextIt = list.begin(); list.end() != nextIt ; nextIt++) + { + if(element == (*nextIt)) + { + return true; + } + } + return false; + }; + + //print functions + void print_event(const EventPtr& event) + { + Coordinate cor = 0; + { + CoregionEventPtr coregion_event = boost::dynamic_pointer_cast<CoregionEvent>(event); + if(coregion_event!=NULL) + cor += accurate(coregion_event->get_coregion_area()->get_begin_height()); + cor += event->get_instance()->get_line_begin().get_y(); + } + print_event_comment(event,cor); + print_time_relations(event,cor); + CompleteMessagePtr complete_message = event->get_complete_message(); + if(complete_message != NULL) + { + if(complete_message->get_send_event() == event) + { + Coordinate sendY = accurate(complete_message->get_send_event()->get_position().get_y()); + Coordinate receiveY = accurate(complete_message->get_receive_event()->get_position().get_y()); + + CoregionEventPtr coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_send_event()); + if(coregion_event!=NULL) + { + sendY += accurate(coregion_event->get_coregion_area()->get_begin_height()); + } + + coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_receive_event()); + if(coregion_event!=NULL) + { + receiveY += accurate(coregion_event->get_coregion_area()->get_begin_height()); + } + + + stream << "\\mess{" << __VALID_NAME_TEX(NULL, complete_message->get_label()) + << "}{"<< instance_id_map.get_id(complete_message->get_sender()) << "_" << __VALID_NAME_TEX(NULL, complete_message->get_sender()->get_label()) + << "}[0.3]{"<< instance_id_map.get_id(complete_message->get_receiver()) << "_" << __VALID_NAME_TEX(NULL, complete_message->get_receiver()->get_label()) + << "}"; + if(coregion_event!=NULL) + { + stream << "[" << coregion_width_map.getId(coregion_event->get_coregion_area()->get_width()) << "*\\real{0.5}]"; + } + stream << "{" << slope_map.getId(sendY,receiveY) << "}" << std::endl; + } + } + + + //temporary solution Action and Condition not implemented yet + LocalActionPtr localAction = boost::dynamic_pointer_cast<LocalAction>(event->get_incomplete_message()); + if(localAction!=NULL){ + stream << "\\setlength{\\actionwidth}{" << local_action_width_map.getId(localAction->get_width()) << "}" << std::endl; + stream << "\\setlength{\\actionheight}{" << local_action_height_map.getId(localAction->get_height()) << "}" << std::endl; + stream << "\\action{" << localAction->get_label() << "}{" << instance_id_map.get_id(event->get_instance()) << "_" << __VALID_NAME_TEX(NULL, event->get_instance()->get_label()) << "}" << std::endl; + return; + } + + LocalConditionPtr localCondition = boost::dynamic_pointer_cast<LocalCondition>(event->get_incomplete_message()); + if(localCondition!=NULL) + { + stream << "\\setlength{\\conditionheight}{" << local_condition_height_map.getId(localCondition->get_height()) << "}" << std::endl; + stream << "\\condition{" << localCondition->get_label() << "}{" << instance_id_map.get_id(event->get_instance()) << "_" << __VALID_NAME_TEX(NULL, event->get_instance()->get_label()) << "}" << std::endl; + return; + } + + IncompleteMessagePtr incomplete_message = event->get_incomplete_message(); + if(incomplete_message != NULL) + { + //get_dot_position() distance from event + stream << "\\setlength{\\selfmesswidth}{" << lostfound_width_map.getId(fabs(incomplete_message->get_dot_position().get_x())) << "}" << std::endl; + Coordinate slope = Levels::accurate(incomplete_message->get_dot_position().get_y()); + if(incomplete_message->is_lost()) + stream << "\\lost"; + if(incomplete_message->is_found()) + stream << "\\found"; + if(incomplete_message->get_dot_position().get_x() > 0) + stream << "[r]"; + stream << "{" << __VALID_NAME_TEX(NULL, incomplete_message->get_label()) + << "}{}[" << slope_map.getId(slope) << "]{" << instance_id_map.get_id(event->get_instance()) << "_" << __VALID_NAME_TEX(NULL, event->get_instance()->get_label()) + << "}" << std::endl; + } + + }; + + void print_coregion_area(const CoregionAreaPtr& coregionArea, Coordinate coordinate = 0) + { + Coordinate cor = coregionArea->get_begin_height() + coregionArea->get_instance()->get_line_begin().get_y(); + if(Compare::compare(cor, coordinate,true) && Compare::compare(coordinate,cor,true)) + { + //coregion end width set \setlength{\coregiontail}{2mm} + stream << "\\setlength{\\regionbarwidth}{" << coregion_width_map.getId(coregionArea->get_width()) << "}" << std::endl; + stream << "\\regionstart{coregion}{" + << instance_id_map.get_id(coregionArea->get_instance()) << "_" << __VALID_NAME_TEX(NULL, coregionArea->get_instance()->get_label()) <<"}" << std::endl; + return; + } + else + { + //coregion end width set \setlength{\coregiontail}{2mm} + stream << "\\regionend{" + << instance_id_map.get_id(coregionArea->get_instance()) << "_" << __VALID_NAME_TEX(NULL, coregionArea->get_instance()->get_label()) <<"}" << std::endl; + return; + } + }; + + void print_event_comment(const EventPtr& event,Coordinate coordinate = 0) + { + for(CommentPtrSet::const_iterator cpos = event->get_comments().begin(); + cpos != event->get_comments().end(); cpos++) + { + stream << "\\setlength{\\msccommentdist}{" << comment_width_map.getId(event->get_instance()->get_line_begin().get_x(),(*cpos)->get_position().get_x(),true) << "}" << std::endl; + + stream << "\\msccomment"; + if((*cpos)->get_position().get_x() > event->get_instance()->get_line_begin().get_x()) + stream << "[r]"; + stream << "{" << __VALID_NAME_TEX(NULL, (*cpos)->get_text()) << "}{" + << instance_id_map.get_id(event->get_instance()) << "_" << __VALID_NAME_TEX(NULL, event->get_instance()->get_label()) << "}"; + stream << "[" << comment_slope_map.getId((*cpos)->get_position().get_y(),event->get_position().get_y()+coordinate) << "]" << std::endl; + } + }; + + void print_instances(InstancePtrList instances) + { + while(!instances.empty()) + { + InstancePtrList::iterator min = instances.begin(); + for(InstancePtrList::iterator ipos = instances.begin(); + ipos != instances.end(); ipos++) + { + if((*ipos)->get_line_begin().get_x() < (*min)->get_line_begin().get_x()) + min = ipos; + } + stream << "\\setlength{\\instwidth}{" << (*min)->get_width() << "mm}" << std::endl; + stream << "\\declinst{" << instance_id_map.get_id((*min)) << "_" + << __VALID_NAME_TEX(NULL, (*min)->get_label()) << "}{" + << __VALID_NAME_TEX(NULL, (*min)->get_label()) << "}{}" << std::endl; + instances.erase(min); + } + }; + + void print_absolute_time(AbsoluteTimePtr abs) + { + const std::list< MscTimeInterval<double> > constraints = abs->get_interval_set().get_set(); + + // NOTE: using the output ordering just for sure, in real, just one interval is present + BasicStringListPrinter<double> printer; + + for(std::list< MscTimeInterval<double> >::const_iterator it = constraints.begin(); + it != constraints.end(); it++) + { + if(it->get_begin_value() != it->get_end_value()) + { + if (it->get_begin_closed()) + printer << "@["; + else + printer << "@("; + + printer << it->get_begin() << "," << it->get_end(); + + if (it->get_end_closed()) + printer << "]"; + else + printer << ")"; + } + else + printer << "[@" << it->get_begin() << "]"; + + printer.commit_item(it->get_begin().get_value()); + } + + printer.print(stream); + }; + + void print_time_relations(const EventPtr& event, Coordinate coordinate = 0) + { + + const TimeRelationEventPtrList& relations = event->get_time_relations(); + const AbsoluteTimePtrList absolute_times = event->get_absolut_times(); + // process all absolute time constraints + for(AbsoluteTimePtrList::const_iterator apos = absolute_times.begin(); + apos != absolute_times.end(); apos++) + { + stream << (*apos)->get_position().get_y() << std::endl; + stream << "\\setlength{\\selfmesswidth}{" << absolutetime_width_map.getId(event->get_instance()->get_line_begin().get_x(),(*apos)->get_position().get_x(),true) << "}" << std::endl; + stream << "\\mscmark["; + if(((*apos)->get_position().get_x() - event->get_instance()->get_line_begin().get_x() )>0) + { + stream << "r"; + } + else + { + stream << "l"; + } + stream << "]{"; + print_absolute_time(*apos); + stream << "}[" << absolutetime_slope_map.getId((*apos)->get_position().get_y()) << "]{" << instance_id_map.get_id(event->get_instance()) << "_" << __VALID_NAME_TEX(NULL, event->get_instance()->get_label()) << "}" << std::endl; + } + + // process all time relations + for(TimeRelationEventPtrList::const_iterator rpos = relations.begin(); + rpos != relations.end(); rpos++) + { + if((*rpos)->get_event_a()==event){ + //TODO: directed interval + stream << "\\measure["; + if((*rpos)->get_width()<0) + { + stream << "r"; + } + else + { + stream << "l"; + } + stream << "]{" << (*rpos)->get_label() << "}{" << instance_id_map.get_id((*rpos)->get_event_a()->get_instance()) << "_" << (*rpos)->get_event_a()->get_instance()->get_label() + << "}{" << instance_id_map.get_id((*rpos)->get_event_b()->get_instance()) << "_" << (*rpos)->get_event_b()->get_instance()->get_label() + << "}[-" << timeinterval_slope_map.getId((*rpos)->get_event_b()->get_position().get_y(),(*rpos)->get_event_a()->get_position().get_y()) + << "]" << std::endl; + } + } + }; + +public: + Levels(std::ostream& ostream, const BMscPtr& obmsc) : stream(ostream.rdbuf()),slope_map("slope"),event_dist_map("level"),coregion_first_map("coregionFirst"), + coregion_last_map("coregionLast"),coregion_width_map("coregionWidth"),coregion_end_width_map("coregionEndWidth"),local_action_width_map("localActionWidth"), + local_action_height_map("localActionHeight"),local_condition_width_map("localConditionWidth"),local_condition_height_map("localConditionHeight"), + lostfound_width_map("lostFoundWidth"),comment_width_map("commentWidth"),comment_slope_map("commentSlope"),absolutetime_width_map("absoluteTimeWidth"), + absolutetime_slope_map("absoluteTimeSlope"),timeinterval_width_map("timeIntervalWidth"),timeinterval_slope_map("timeIntervalSlope"),ordering_width_map("orderingWidth") + { + bmsc = obmsc; + export_tex = NULL; + }; + + static Coordinate accurate(Coordinate coordinate) + { + return round(coordinate); + }; + + ElementListMap getMap() + { + return event_level_map; + }; + + void create_level(Coordinate coordinate) + { + event_level_map.insert( std::make_pair<Coordinate,MscElementPtrList>(round(coordinate), MscElementPtrList() )); + }; + + void insert_pointer(MscElementPtr pointer, Coordinate coordinate) + { + ElementListMap::iterator it; + it = event_level_map.find(coordinate); + if(it == event_level_map.end()) + { + create_level(coordinate); + it = event_level_map.find(coordinate); + } + (*it).second.push_back(pointer); + }; + + void insert_comment(CommentPtr comment, Coordinate coordinate = 0) + { + Coordinate cor = comment->get_position().get_y()+coordinate; + insert_pointer(comment,cor); + }; + + void insert_event(EventPtr event, Coordinate coordinate = 0) + { + Coordinate cor = event->get_position().get_y()+coordinate; + insert_pointer(event,cor); + insert_time_relations(event); + + for(CommentPtrSet::const_iterator cpos = event->get_comments().begin(); + cpos != event->get_comments().end(); cpos++) + { + comment_width_map.addDistance( event->get_instance()->get_line_begin().get_x(), (*cpos)->get_position().get_x(),true); + comment_slope_map.addDistance((*cpos)->get_position().get_y(),cor); + } + + CompleteMessagePtr complete_message = event->get_complete_message(); + if(complete_message != NULL) + { + if(complete_message->get_send_event() == event) + { + Coordinate sendY = accurate(complete_message->get_send_event()->get_position().get_y()); + Coordinate receiveY = accurate(complete_message->get_receive_event()->get_position().get_y()); + + CoregionEventPtr coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_send_event()); + if(coregion_event!=NULL) + { + sendY += accurate(coregion_event->get_coregion_area()->get_begin_height()); + } + + coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_receive_event()); + if(coregion_event!=NULL) + { + receiveY += accurate(coregion_event->get_coregion_area()->get_begin_height()); + } + + slope_map.addDistance(sendY,receiveY); + } + } + + + //temporary solution Action and Condition not implemented yet + LocalActionPtr localAction = boost::dynamic_pointer_cast<LocalAction>(event->get_incomplete_message()); + if(localAction!=NULL){ + local_action_width_map.addDistance(localAction->get_width()); + local_action_height_map.addDistance(localAction->get_height()); + return; + } + + LocalConditionPtr localCondition = boost::dynamic_pointer_cast<LocalCondition>(event->get_incomplete_message()); + if(localCondition!=NULL) + { + local_condition_height_map.addDistance(localCondition->get_height()); + return; + } + + IncompleteMessagePtr incomplete_message = event->get_incomplete_message(); + if(incomplete_message != NULL) + { + //get_dot_position() distance from event + slope_map.addDistance(incomplete_message->get_dot_position().get_y()); + lostfound_width_map.addDistance(fabs(incomplete_message->get_dot_position().get_x())); + } + }; + + void insert_coregion_area(CoregionAreaPtr coregion_area, Coordinate coordinate = 0) + { + //coregion_end_Width_map insert coregion end width + insert_pointer(coregion_area,coregion_area->get_begin_height()+coordinate); + insert_pointer(coregion_area,coregion_area->get_end_height()+coordinate); + coregion_width_map.addDistance(coregion_area->get_width()); + }; + + void insert_time_relations(const EventPtr& event, Coordinate coordinate = 0) + { + const TimeRelationEventPtrList& relations = event->get_time_relations(); + const AbsoluteTimePtrList absolute_times = event->get_absolut_times(); + // process all absolute time constraints + for(AbsoluteTimePtrList::const_iterator apos = absolute_times.begin(); + apos != absolute_times.end(); apos++) + { + absolutetime_width_map.addDistance((*apos)->get_position().get_x()); + absolutetime_slope_map.addDistance((*apos)->get_position().get_y()); + } + // process all time relations + for(TimeRelationEventPtrList::const_iterator rpos = relations.begin(); + rpos != relations.end(); rpos++) + { + // for each "event a" we print the time relation to "event b" + // we thus skip all "events b" + if((*rpos)->get_event_a() != event) + continue; + + timeinterval_width_map.addDistance((*rpos)->get_width()); + } + }; + + void insert_instance(const InstancePtr instance) + { + insert_pointer(instance,instance->get_line_begin().get_y()); + insert_pointer(instance,instance->get_line_end().get_y()); + }; + /* + * Level types: + * -1,1 : basic level + * 2 : slope + * 3 : coregion area first level + * 4 : coregion area last level + * 5 : instance first level + * 6 : instance last level + */ + void find_distances() + { + Coordinate last_slope = -1; + for(ElementListMap::iterator it = event_level_map.begin(); it!=event_level_map.end(); it++) + { + ElementListMap::iterator next = it; + next++; + + if(next != event_level_map.end()) + { + if(it == event_level_map.begin()) + { + //instance first level + first_level = (*next).first - (*it).first; + level_types.insert(std::make_pair<Coordinate,int>(round(it->first),5)); + continue; + } + ElementListMap::iterator nextnext = next; + nextnext++; + if(nextnext == event_level_map.end()) + { + //instance last level + last_level = (*next).first - (*it).first; + level_types.insert(std::make_pair<Coordinate,int>(round(it->first),6)); + } + } + else + { + break; + } + + //level type + int level_type = 0; + MscElementPtrList list = it->second; + for (MscElementPtrList::iterator nextIt = list.begin(); list.end() != nextIt ; nextIt++) + { + EventPtr event = boost::dynamic_pointer_cast<Event>(*nextIt); + if(event!=NULL) + { + CompleteMessagePtr complete_msg = event->get_complete_message(); + if(complete_msg != NULL) + { + if(complete_msg->get_send_event() == (*nextIt)) + { + if(findPtr((*next).second,complete_msg->get_receive_event())) + { + if(level_type == 0 || level_type == 2) + { + level_type = 2; + continue; + } + else + level_type = -1; + } + } + } + + CoregionEventPtr coregion_event = boost::dynamic_pointer_cast<CoregionEvent>(event); + if(coregion_event!=NULL) + { + if(findPtr((*next).second,coregion_event->get_coregion_area())) + { + if(level_type == 0 || level_type == 4) + { + level_type = 4; + continue; + } + else + { + level_type = -1; + } + } + } + + if(level_type == 0 || level_type == 1) + level_type = 1; + else + level_type = -1; + } + + //coredionArea + CoregionAreaPtr coregion_area = boost::dynamic_pointer_cast<CoregionArea>(*nextIt); + if(coregion_area != NULL && coregion_area->get_begin_height()==it->first) + { + if(level_type == 0 || level_type == 3) + { + level_type = 3; + continue; + } + else + level_type = -1; + } + + //instance or something else + if(level_type == 0 || level_type == 1) + level_type = 1; + else + level_type = -1; + } + list = next->second; + if(level_type != -1 && level_type != 1) + for (MscElementPtrList::iterator nextIt = list.begin(); list.end() != nextIt ; nextIt++) + { + switch(level_type) + { + case 2: + { + EventPtr event = boost::dynamic_pointer_cast<Event>(*nextIt); + if(event!=NULL) + { + CompleteMessagePtr complete_msg = event->get_complete_message(); + if(complete_msg != NULL) + { + if(complete_msg->get_send_event() == (*nextIt)) + { + level_type = -1; + } + } + else + { + level_type = -1; + } + } + else + { + level_type = -1; + } + } + break; + case 3: + { + CoregionEventPtr event = boost::dynamic_pointer_cast<CoregionEvent>(*nextIt); + if(event!=NULL) + { + if(!findPtr(it->second,event->get_coregion_area())) + level_type = -1; + } + else + { + level_type = -1; + } + } + break; + + } + } + switch(level_type) + { + case -1: + case 1: + event_dist_map.addDistance(next->first - it->first); + break; + case 3: + coregion_first_map.addDistance(next->first - it->first); + break; + case 4: + coregion_last_map.addDistance(next->first - it->first); + break; + } + level_types.insert(std::make_pair<Coordinate,int>(it->first,level_type)); + } + }; + + void print() + { + PtrIDMap<MscMessagePtr> message_id_map; // message instance identifiers + PtrIDMap<EventPtr> event_id_map; // event identifiers + + Coordinate maxInstLen = 0; + + //find distance between instances + Coordinate instDist = 15; + InstancePtrList::const_iterator ipos1 = bmsc->get_instances().begin(); + if(ipos1 != bmsc->get_instances().end()) + { + InstancePtrList::const_iterator ipos2 = ipos1; + ipos2++; + if(ipos2!=bmsc->get_instances().end()) + instDist = fabs ((*ipos2)->get_line_end().get_x() - (*ipos1)->get_line_end().get_x()); + } + + //load event_level_map + for(InstancePtrList::const_iterator ipos = bmsc->get_instances().begin(); + ipos != bmsc->get_instances().end(); ipos++) + { + insert_instance((*ipos)); + Coordinate inst_start = (*ipos)->get_line_begin().get_y(); + + if(maxInstLen < ((*ipos)->get_line_end().get_y()-(*ipos)->get_line_begin().get_y())) + maxInstLen = ((*ipos)->get_line_end().get_y()-(*ipos)->get_line_begin().get_y()); + + for(EventAreaPtr area = (*ipos)->get_first(); + area != NULL; area = area->get_next()) + { + StrictOrderAreaPtr strict_area = boost::dynamic_pointer_cast<StrictOrderArea>(area); + if(strict_area != NULL) + { + // walk through events + for(StrictEventPtr event = strict_area->get_first(); + event != NULL; event = event->get_successor()) + { + insert_event(event,inst_start); + //insert_event(event,event_level_map); + //insert_time_relations(event_level_map,event); + } + } + + //coredionArea + CoregionAreaPtr coregion_area = boost::dynamic_pointer_cast<CoregionArea>(area); + if(coregion_area != NULL) + { + insert_coregion_area(coregion_area,inst_start); + //insert_coregion_area(coregion_area,event_level_map); + // events to be processed; this is to avoid recursion + std::list<CoregionEventPtr> event_stack; + + for(CoregionEventPVector::const_iterator mpos = coregion_area->get_minimal_events().begin(); + mpos != coregion_area->get_minimal_events().end(); mpos++) + { + // initialize the stack with events with no predecessors + push_back_if_unique<CoregionEventPtr>(event_stack, *mpos); + } + + // process all events in the stack + for(std::list<CoregionEventPtr>::const_iterator epos = event_stack.begin(); + epos != event_stack.end(); epos++) + { + insert_event(*epos,coregion_area->get_begin_height()+inst_start); + //insert_event(*epos,event_level_map,coregion_area->get_begin_height()); + + // process forward links + for(CoregEventRelPtrVector::const_iterator spos = (*epos)->get_successors().begin(); + spos != (*epos)->get_successors().end(); spos++) + { + CoregionEventPtr successor = (*spos)->get_successor(); + + // add successors of this event to the stack + // note: std::list<>::push_back doesn't invalidate iterators + push_back_if_unique<CoregionEventPtr>(event_stack, successor); + } + //insert_time_relations(event_level_map,*epos); + } + } + } + } + + find_distances(); + + //set up atributes + stream << "\\def\\scale@y{1.0}" << std::endl; + + //distance between instances + stream << "\\setlength{\\instdist}{"<< instDist << "mm}" << std::endl; + + if(!event_level_map.empty() && event_level_map.size()>=2){ + //height just below head symbol + stream << "\\setlength{\\firstlevelheight}{"; + if(level_types.begin()->second==5) + { + if(event_level_map.size()==2) + { + stream << ( event_level_map.rbegin()->first - event_level_map.begin()->first); + } + else + { + std::map<Coordinate,int,Compare>::iterator next = level_types.begin(); + next++; + stream << next->first - level_types.begin()->first; + } + } + stream << "mm*\\real{\\scale@y}}" << std::endl; + //height of level just above foot symbols + stream << "\\setlength{\\lastlevelheight}{"; + if(event_level_map.size()==2) + { + stream << "0"; + } + else + { + std::map<Coordinate,int,Compare>::reverse_iterator next = level_types.rbegin(); + next++; + stream << (level_types.rbegin()->first - next->first); + } + stream << "mm*\\real{\\scale@y}}" << std::endl; + } + + if(!event_dist_map.empty()) + { + //print level types + stream << "%Levels: %" << std::endl; + event_dist_map.print(stream); + } + if(!slope_map.empty()) + { + //print slope types + stream << "%Slopes: %" << std::endl; + slope_map.print(stream); + } + if(!coregion_first_map.empty()) + { + stream << "%Coregion first levels: %" << std::endl; + coregion_first_map.print(stream); + } + if(!coregion_last_map.empty()) + { + stream << "%Coregion last levels: %" << std::endl; + coregion_last_map.print(stream); + } + if(!coregion_width_map.empty()) + { + stream << "%Coregion width: %" << std::endl; + coregion_width_map.print(stream); + } + if(!local_action_width_map.empty()) + { + stream << "%Local action width: %" << std::endl; + local_action_width_map.print(stream); + } + if(!local_action_height_map.empty()) + { + stream << "%Local action height: %" << std::endl; + local_action_height_map.print(stream); + } + if(!local_condition_width_map.empty()) + { + stream << "%Condition width: %" << std::endl; + local_condition_width_map.print(stream); + } + if(!local_condition_height_map.empty()) + { + stream << "%Condition height: %" << std::endl; + local_condition_height_map.print(stream); + } + if(!lostfound_width_map.empty()) + { + stream << "%Lost found width: %" << std::endl; + lostfound_width_map.print(stream); + } + if(!comment_width_map.empty()) + { + stream << "%Coment width: %" << std::endl; + comment_width_map.print(stream); + } + if(!comment_slope_map.empty()) + { + stream << "%Comment slopes: %" << std::endl; + comment_slope_map.print(stream); + } + if(!absolutetime_width_map.empty()) + { + stream << "%Absolute time width: %" << std::endl; + absolutetime_width_map.print(stream); + } + if(!absolutetime_slope_map.empty()) + { + stream << "%Absolut time slope: %" << std::endl; + absolutetime_slope_map.print(stream); + } + if(!timeinterval_width_map.empty()) + { + stream << "%Time interval width: %" << std::endl; + timeinterval_width_map.print(stream); + } + if(timeinterval_slope_map.empty()) + { + stream << "%Time interval slope: %" << std::endl; + timeinterval_slope_map.print(stream); + } + if(ordering_width_map.empty()) + { + stream << "%Ordering width: %" << std::endl; + ordering_width_map.print(stream); + } + + //print_element_attributes(stream, bmsc); + stream << "\\begin{msc}{" << __VALID_NAME_TEX(NULL, bmsc->get_label()) << "}" << std::endl; + + print_instances(bmsc->get_instances()); + + + //print levels and events + int empty_levels = 0; + Coordinate last_slope = -1; + for(ElementListMap::iterator it = event_level_map.begin(); it!=event_level_map.end(); it++) + { + + //events + for (MscElementPtrList::iterator listIt = (*it).second.begin(); (*it).second.end() != listIt ; listIt++) + { + EventPtr event = boost::dynamic_pointer_cast<Event>(*listIt); + if(event!=NULL) + { + print_event(event); + } + CoregionAreaPtr coregion_area = boost::dynamic_pointer_cast<CoregionArea>(*listIt); + if(coregion_area != NULL) + { + print_coregion_area(coregion_area,it->first); + } + } + + ElementListMap::iterator next = it; + next++; + if(level_types[it->first]!= 5 && level_types[it->first]!= 6 && next!=event_level_map.end()) + { + ElementListMap::iterator next = it; + next++; + Coordinate dist = next->first - it->first; + std::map<Coordinate,int,Compare>::iterator type = level_types.find(it->first); + stream << "\\setlength{\\levelheight}{"; + if(type!= level_types.end()) + { + switch(type->second) + { + case -1: + case 1: + stream << event_dist_map.getId(dist); + break; + case 2: + stream << slope_map.getId(dist); + break; + case 3: + stream << coregion_first_map.getId(dist); + break; + case 4: + stream << coregion_last_map.getId(dist); + break; + } + } + else + stream << it->first << "mm"; + stream << "}" << std::endl; + stream << "\\nextlevel" << std::endl; + } + } + + stream << "\\end{msc}" << std::endl; + for(ElementListMap::iterator it = event_level_map.begin(); it!=event_level_map.end(); it++) + { + (*it).second.clear(); + } + }; +}; + + + + ExportFormatter::PreconditionList ExportTex::get_preconditions(MscPtr msc) const { ExportFormatter::PreconditionList result; @@ -105,7 +1059,7 @@ int ExportTex::print_document_head(std::ostream& stream) { stream << "\\documentclass{article}" <<std::endl; - stream << "\\usepackage{msc2}" <<std::endl; + stream << "\\usepackage{msc4}" <<std::endl; stream << "\\begin{document}" <<std::endl; return 0; } @@ -123,7 +1077,7 @@ int result = 0; // error count print_document_head(stream); - stream << "\\section*{"<< VALID_NAME(name) << "}" << std::endl; + stream << "\\section*{"<< VALID_NAME_TEX(name) << "}" << std::endl; std::set<std::wstring> printed; @@ -164,14 +1118,19 @@ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc); HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(msc); - if(bmsc != NULL) + if(bmsc != NULL){ + Levels level(stream,bmsc); + level.print(); return save_bmsc(stream, bmsc); + } else if(hmsc != NULL) return save_hmsc(stream, hmsc); else return 1; // unexpected pointer } + + void ExportTex::create_level(Coordinate coordinate,ElementListMap& event_level_map) { event_level_map.insert( std::make_pair<Coordinate,MscElementPtrList>(coordinate, MscElementPtrList() )); @@ -203,7 +1162,7 @@ for(CommentPtrSet::const_iterator cpos = event->get_comments().begin(); cpos != event->get_comments().end(); cpos++) { - insert_comment((*cpos),event_level_map); + //insert_comment((*cpos),event_level_map); } } @@ -238,8 +1197,6 @@ - - #define toCm /10 int ExportTex::save_hmsc(std::ostream& stream, const HMscPtr& hmsc) @@ -293,7 +1250,7 @@ } node_stack.clear(); - stream << "\\begin{hmsc}{" << VALID_NAME(hmsc->get_label()) << "}("; + stream << "\\begin{hmsc}{" << VALID_NAME_TEX(hmsc->get_label()) << "}("; if(llCorner.get_x()<0) stream << -(llCorner.get_x()-1)toCm; else @@ -350,7 +1307,7 @@ if(reference_node->get_msc() != NULL) { stream << "\\hmscreference{" << node_id_map.get_id(*npos) - << "}{" << VALID_NAME(reference_node->get_msc()->get_label()) + << "}{" << VALID_NAME_TEX(reference_node->get_msc()->get_label()) << "}(" << reference_node->get_position().get_x()toCm << "," << -reference_node->get_position().get_y()toCm << ")" << std::endl; m_printing.push_back(reference_node->get_msc()); @@ -428,8 +1385,9 @@ int ExportTex::save_bmsc(std::ostream& stream, const BMscPtr& bmsc) -{ - ElementListMap event_level_map; +{ /* + Levels levels_map; + PtrIDMap<MscMessagePtr> message_id_map; // message instance identifiers PtrIDMap<EventPtr> event_id_map; // event identifiers PtrIDMap<InstancePtr> instance_id_map; @@ -443,7 +1401,6 @@ { InstancePtrList::const_iterator ipos2 = ipos1; ipos2++; - if(ipos2!=bmsc->get_instances().end()) instDist = fabs ((*ipos2)->get_line_end().get_x() - (*ipos1)->get_line_end().get_x()); } @@ -452,8 +1409,11 @@ for(InstancePtrList::const_iterator ipos = bmsc->get_instances().begin(); ipos != bmsc->get_instances().end(); ipos++) { - if(maxInstLen < (*ipos)->get_line_end().get_y()) - maxInstLen = (*ipos)->get_line_end().get_y(); + levels_map.insert_instance((*ipos)); + Coordinate inst_start = (*ipos)->get_line_begin().get_y(); + + if(maxInstLen < ((*ipos)->get_line_end().get_y()-(*ipos)->get_line_begin().get_y())) + maxInstLen = ((*ipos)->get_line_end().get_y()-(*ipos)->get_line_begin().get_y()); for(EventAreaPtr area = (*ipos)->get_first(); area != NULL; area = area->get_next()) @@ -465,8 +1425,9 @@ for(StrictEventPtr event = strict_area->get_first(); event != NULL; event = event->get_successor()) { - insert_event(event,event_level_map); - insert_time_relations(event_level_map,event); + levels_map.insert_event(event,inst_start); + //insert_event(event,event_level_map); + //insert_time_relations(event_level_map,event); } } @@ -474,7 +1435,8 @@ CoregionAreaPtr coregion_area = boost::dynamic_pointer_cast<CoregionArea>(area); if(coregion_area != NULL) { - insert_coregion_area(coregion_area,event_level_map); + levels_map.insert_coregion_area(coregion_area,inst_start); + //insert_coregion_area(coregion_area,event_level_map); // events to be processed; this is to avoid recursion std::list<CoregionEventPtr> event_stack; @@ -489,7 +1451,8 @@ for(std::list<CoregionEventPtr>::const_iterator epos = event_stack.begin(); epos != event_stack.end(); epos++) { - insert_event(*epos,event_level_map,coregion_area->get_begin_height()); + levels_map.insert_event(*epos,coregion_area->get_begin_height()+inst_start); + //insert_event(*epos,event_level_map,coregion_area->get_begin_height()); // process forward links for(CoregEventRelPtrVector::const_iterator spos = (*epos)->get_successors().begin(); @@ -501,64 +1464,113 @@ // note: std::list<>::push_back doesn't invalidate iterators push_back_if_unique<CoregionEventPtr>(event_stack, successor); } - insert_time_relations(event_level_map,*epos); + //insert_time_relations(event_level_map,*epos); } } } } + + levels_map.find_distances(); //set up atributes + stream << "\\def\\scale@y{1.0}" << std::endl; //distance between instances stream << "\\setlength{\\instdist}{"<< instDist << "mm}" << std::endl; if(!event_level_map.empty()){ //height just below head symbol - stream << "\\setlength{\\firstlevelheight}{" << event_level_map.begin()->first << "mm}" << std::endl; + stream << "\\setlength{\\firstlevelheight}{" << event_level_map.begin()->first << "mm*\\real{\\scale@y}}" << std::endl; //height of level just above foot symbols - stream << "\\setlength{\\lastlevelheight}{" << maxInstLen-event_level_map.rbegin()->first << "mm}" << std::endl; + stream << "\\setlength{\\lastlevelheight}{" << maxInstLen-event_level_map.rbegin()->first << "mm*\\real{\\scale@y}}" << std::endl; } + + //print level types + std::map<Coordinate,int,Compare> levels = event_dist_map.getMap(); + for(std::map<Coordinate,int,Compare>::iterator it = levels.begin(); it != levels.end(); it++) + { + stream << "\\def\\level" << event_dist_map.getId(it->first) << "{" << it->first << "mm*\\real{\\scale@y}}" << std::endl; + } + //print slope types + std::map<Coordinate,int,Compare> slopes = slope_map.getMap(); + for(std::map<Coordinate,int,Compare>::iterator it = slopes.begin(); it != slopes.end(); it++) + { + stream << "\\def\\slope" << slope_map.getId(it->first) << "{" << it->first << "mm*\\real{\\scale@y}}" << std::endl; + } //print_element_attributes(stream, bmsc); - stream << "\\begin{msc}{" << VALID_NAME(bmsc->get_label()) << "}" << std::endl; + stream << "\\begin{msc}{" << VALID_NAME_TEX(bmsc->get_label()) << "}" << std::endl; print_instances(stream,bmsc->get_instances(),instance_id_map); - //print levels and messages - ElementListMap::iterator it; - for(it = event_level_map.begin(); it!=event_level_map.end(); it++) + + //print levels and events + int empty_levels = 0; + Coordinate last_slope = -1; + for(ElementListMap::iterator it = event_level_map.begin(); it!=event_level_map.end(); it++) { - if(it!=event_level_map.begin()) + //events + for (MscElementPtrList::iterator listIt = (*it).second.begin(); (*it).second.end() != listIt ; listIt++) + { + EventPtr event = boost::dynamic_pointer_cast<Event>(*listIt); + if(event!=NULL) + { + print_event(stream,message_id_map,event,event_level_map,instance_id_map); + } + CoregionAreaPtr coregion_area = boost::dynamic_pointer_cast<CoregionArea>(*listIt); + if(coregion_area != NULL) + { + print_coregion_area(stream,instance_id_map,coregion_area,it->first); + } + } + + //levels + ElementListMap::iterator next = it; + next++; + if(next == event_level_map.end()) + break; + + bool found = false; + for (MscElementPtrList::iterator listIt = (*it).second.begin(); (*it).second.end() != listIt ; listIt++) { - ElementListMap::iterator previous = it; - previous--; - stream << "\\setlength{\\levelheight}{" << (*it).first - (*previous).first << "mm}"<<std::endl; - stream << "\\nextlevel" << std::endl; + EventPtr event = boost::dynamic_pointer_cast<Event>(*listIt); + if(event!=NULL) + { + CompleteMessagePtr complete_msg = event->get_complete_message(); + if(complete_msg != NULL) + { + if(complete_msg->get_send_event() == (*listIt) && !found) + { + for (MscElementPtrList::iterator nextIt = (*next).second.begin(); (*next).second.end() != nextIt ; nextIt++) + { + if(complete_msg->get_receive_event() == (*nextIt)) + { + last_slope = (*next).first - (*it).first; + stream << "\\setlength{\\levelheight}{\\slope" << slope_map.getId(last_slope) << "}"<<std::endl; + stream << "\\nextlevel" << std::endl; + found = true; + break; + } + } + } + } + if(found) + break; + } } - - for (MscElementPtrList::iterator listIt = (*it).second.begin(); (*it).second.end() != listIt ; listIt++) - { - EventPtr eventPtr = boost::dynamic_pointer_cast<Event>(*listIt); - if(eventPtr!=NULL) - { - print_event(stream, message_id_map, eventPtr,event_level_map,instance_id_map); - continue; - } - - CoregionAreaPtr coregionAreaPtr = boost::dynamic_pointer_cast<CoregionArea>(*listIt); - if(coregionAreaPtr!=NULL) - { - print_coregion_area(stream,instance_id_map,coregionAreaPtr,(*it).first); - continue; - } - } - } + if(!found) + { + stream << "\\setlength{\\levelheight}{\\level" << event_dist_map.getId(next->first - it->first) << "}"<<std::endl; + stream << "\\nextlevel" << std::endl; + + } + } stream << "\\end{msc}" << std::endl; for(ElementListMap::iterator it = event_level_map.begin(); it!=event_level_map.end(); it++) { (*it).second.clear(); - } + }*/ return 0; } @@ -601,70 +1613,81 @@ { if(complete_message->get_send_event() == event) { - Coordinate sendY = complete_message->get_send_event()->get_position().get_y(); - Coordinate receiveY = complete_message->get_receive_event()->get_position().get_y(); + Coordinate sendY = Levels::accurate(complete_message->get_send_event()->get_position().get_y()); + Coordinate receiveY = Levels::accurate(complete_message->get_receive_event()->get_position().get_y()); + Coordinate coregionPadding = 0; CoregionEventPtr coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_send_event()); if(coregion_event!=NULL) { - sendY += coregion_event->get_coregion_area()->get_begin_height(); + sendY += Levels::accurate(coregion_event->get_coregion_area()->get_begin_height()); } coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_receive_event()); if(coregion_event!=NULL) { - receiveY += coregion_event->get_coregion_area()->get_begin_height(); + receiveY += Levels::accurate(coregion_event->get_coregion_area()->get_begin_height()); + coregionPadding = Levels::accurate(coregion_event->get_coregion_area()->get_width())/2; } - stream << "\\mess{" << VALID_NAME(complete_message->get_label()) - << "}{"<< instance_id_map.get_id(complete_message->get_sender()) << "_" << VALID_NAME(complete_message->get_sender()->get_label()) - << "}[0.2]{"<< instance_id_map.get_id(complete_message->get_receiver()) << "_" << VALID_NAME(complete_message->get_receiver()->get_label()) - << "}[" << get_slope(event_level_map.find(sendY),event_level_map.find(receiveY),event_level_map) << "]" << std::endl; + stream << "\\mess{" << VALID_NAME_TEX(complete_message->get_label()) + << "}{"<< instance_id_map.get_id(complete_message->get_sender()) << "_" << VALID_NAME_TEX(complete_message->get_sender()->get_label()) + << "}[0.3]{"<< instance_id_map.get_id(complete_message->get_receiver()) << "_" << VALID_NAME_TEX(complete_message->get_receiver()->get_label()) + << "}[" << coregionPadding << "mm]{" << (receiveY - sendY) << "mm}" << std::endl; } } - + //temporary solution Action and Condition not implemented yet LocalActionPtr localAction = boost::dynamic_pointer_cast<LocalAction>(event->get_incomplete_message()); if(localAction!=NULL){ - stream << "localAction" << std::endl; + stream << "\\setlength{\\actionwidth}{" << Levels::accurate(localAction->get_width()) << "mm}" << std::endl; + stream << "\\setlength{\\actionheight}{" << Levels::accurate(localAction->get_height()) << "mm}" << std::endl; + stream << "\\action{" << localAction->get_label() << "}{" << instance_id_map.get_id(event->get_instance()) << "_" << VALID_NAME_TEX(event->get_instance()->get_label()) << "}" << std::endl; + return; } - else + + LocalConditionPtr localCondition = boost::dynamic_pointer_cast<LocalCondition>(event->get_incomplete_message()); + if(localCondition!=NULL) { - IncompleteMessagePtr incomplete_message = event->get_incomplete_message(); + stream << "\\condition{" << localCondition->get_label() << "}{" << instance_id_map.get_id(event->get_instance()) << "_" << VALID_NAME_TEX(event->get_instance()->get_label()) << "}" << std::endl; + return; + } + + IncompleteMessagePtr incomplete_message = event->get_incomplete_message(); if(incomplete_message != NULL) { - - stream << "\\setlength{\\selfmesswidth}{" << fabs(incomplete_message->get_dot_position().get_x() - event->get_instance()->get_line_begin().get_x() ) << "mm}" << std::endl; - + //get_dot_position() distance from event + stream << "\\setlength{\\selfmesswidth}{" << Levels::accurate(fabs(incomplete_message->get_dot_position().get_x())) << "mm}" << std::endl; + Coordinate slope = Levels::accurate(incomplete_message->get_dot_position().get_y()); if(incomplete_message->is_lost()) stream << "\\lost"; if(incomplete_message->is_found()) stream << "\\found"; - if(incomplete_message->get_dot_position().get_x()> event->get_instance()->get_line_begin().get_x()) + if(incomplete_message->get_dot_position().get_x() > 0) stream << "[r]"; - stream << "{" << VALID_NAME(incomplete_message->get_label()) - << "}{}{" << instance_id_map.get_id(event->get_instance()) << "_" << VALID_NAME(event->get_instance()->get_label()) + stream << "{" << VALID_NAME_TEX(incomplete_message->get_label()) + << "}{}[" << slope << "mm]{" << instance_id_map.get_id(event->get_instance()) << "_" << VALID_NAME_TEX(event->get_instance()->get_label()) << "}" << std::endl; } - } + } void ExportTex::print_coregion_area(std::ostream& stream,PtrIDMap<InstancePtr>& instance_id_map, const CoregionAreaPtr& coregionArea, Coordinate coordinate) { - if(coregionArea->get_begin_height() == coordinate) + if(Compare::compare(coregionArea->get_begin_height(), coordinate)) { - stream << "\\setlength{\\regionbarwidth}{" << coregionArea->get_width() << "mm}" << std::endl; + stream << "\\setlength{\\regionbarwidth}{" << Levels::accurate(coregionArea->get_width()) << "mm}" << std::endl; stream << "\\regionstart{coregion}{" - << instance_id_map.get_id(coregionArea->get_instance()) << "_" << VALID_NAME(coregionArea->get_instance()->get_label()) <<"}" << std::endl; + << instance_id_map.get_id(coregionArea->get_instance()) << "_" << VALID_NAME_TEX(coregionArea->get_instance()->get_label()) <<"}" << std::endl; return; } - if(coregionArea->get_end_height() == coordinate) + if(Compare::compare(coregionArea->get_end_height(), coordinate)) { stream << "\\regionend{" - << instance_id_map.get_id(coregionArea->get_instance()) << "_" << VALID_NAME(coregionArea->get_instance()->get_label()) <<"}" << std::endl; + << instance_id_map.get_id(coregionArea->get_instance()) << "_" << VALID_NAME_TEX(coregionArea->get_instance()->get_label()) <<"}" << std::endl; return; } } @@ -674,15 +1697,14 @@ for(CommentPtrSet::const_iterator cpos = event->get_comments().begin(); cpos != event->get_comments().end(); cpos++) { - stream << "\\setlength{\\msccommentdist}{" << -((*cpos)->get_position().get_x() - event->get_instance()->get_line_begin().get_x() ) << "mm}" << std::endl; + stream << "\\setlength{\\msccommentdist}{" << Levels::accurate(fabs((*cpos)->get_position().get_x() - event->get_instance()->get_line_begin().get_x() )) << "mm}" << std::endl; stream << "\\msccomment"; if((*cpos)->get_position().get_x() > event->get_instance()->get_line_begin().get_x()) stream << "[r]"; - stream << "{" << VALID_NAME((*cpos)->get_text()) << "}{" - << instance_id_map.get_id(event->get_instance()) << "_" << VALID_NAME(event->get_instance()->get_label()) << "}"; - stream << "[" << get_slope(event_level_map.find(event->get_position().get_y()),event_level_map.find((*cpos)->get_position().get_y()),event_level_map) << "]"; - stream << std::endl; + stream << "{" << VALID_NAME_TEX((*cpos)->get_text()) << "}{" + << instance_id_map.get_id(event->get_instance()) << "_" << VALID_NAME_TEX(event->get_instance()->get_label()) << "}"; + stream << "[" << Levels::accurate(event->get_position().get_y() - (*cpos)->get_position().get_y()) << " mm]" << std::endl; } } @@ -699,8 +1721,8 @@ } stream << "\\setlength{\\instwidth}{" << (*min)->get_width() << "mm}" << std::endl; stream << "\\declinst{" << instance_id_map.get_id((*min)) << "_" - << VALID_NAME((*min)->get_label()) << "}{" - << VALID_NAME((*min)->get_label()) << "}{}" << std::endl; + << VALID_NAME_TEX((*min)->get_label()) << "}{" + << VALID_NAME_TEX((*min)->get_label()) << "}{}" << std::endl; instances.erase(min); } } @@ -747,15 +1769,8 @@ for(AbsoluteTimePtrList::const_iterator apos = absolute_times.begin(); apos != absolute_times.end(); apos++) { + stream << "\\setlength{\\selfmesswidth}{" << Levels::accurate(fabs((*apos)->get_position().get_x() - event->get_instance()->get_line_begin().get_x() )) << "mm}" << std::endl; stream << "\\mscmark["; - if(get_slope(event_level_map.find(event->get_position().get_y()),event_level_map.find((*apos)->get_position().get_y()),event_level_map)<0) - { - stream << "b"; - } - else - { - stream << "t"; - } if(((*apos)->get_position().get_x() - event->get_instance()->get_line_begin().get_x() )>0) { stream << "r"; @@ -766,7 +1781,7 @@ } stream << "]{"; print_absolute_time(stream, *apos); - stream << "}{" << VALID_NAME(event->get_instance()->get_label()) << "}" << std::endl; + stream << "}[" << -Levels::accurate((*apos)->get_position().get_y() - event->get_position().get_y()) << "mm]{" << instance_id_map.get_id(event->get_instance()) << "_" << VALID_NAME_TEX(event->get_instance()->get_label()) << "}" << std::endl; } // process all time relations @@ -784,10 +1799,10 @@ { stream << "l"; } - stream << "]{" << (*rpos)->get_label() << "}{" << (*rpos)->get_event_a()->get_instance()->get_label() - << "}{" << (*rpos)->get_event_b()->get_instance()->get_label() << "}[" - << get_slope(event_level_map.find((*rpos)->get_event_a()->get_position().get_y()),event_level_map.find((*rpos)->get_event_b()->get_position().get_y()),event_level_map) - << "]" << std::endl; + stream << "]{" << (*rpos)->get_label() << "}{" << instance_id_map.get_id((*rpos)->get_event_a()->get_instance()) << "_" << (*rpos)->get_event_a()->get_instance()->get_label() + << "}{" << instance_id_map.get_id((*rpos)->get_event_b()->get_instance()) << "_" << (*rpos)->get_event_b()->get_instance()->get_label() << "}[" + << -Levels::accurate((*rpos)->get_event_a()->get_position().get_y()-(*rpos)->get_event_b()->get_position().get_y()) + << "mm]" << std::endl; } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <xf...@us...> - 2012-08-08 16:34:09
|
Revision: 1447 http://scstudio.svn.sourceforge.net/scstudio/?rev=1447&view=rev Author: xfarmad Date: 2012-08-08 16:34:03 +0000 (Wed, 08 Aug 2012) Log Message: ----------- Modified Paths: -------------- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp Modified: branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp =================================================================== --- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-07-26 06:59:24 UTC (rev 1446) +++ branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-08-08 16:34:03 UTC (rev 1447) @@ -102,11 +102,6 @@ return floor(coordinate+0.5); }; public: - /* - DistanceMap(){ - DistanceMap("undefined"); - }; - */ DistanceMap(std::string name) { m_name.append(name); @@ -215,6 +210,7 @@ DistanceMap ordering_width_map; DistanceMap instance_width_map; DistanceMap instance_height_map; + std::list<std::pair<Coordinate,Coordinate>> slope_dist; static Coordinate round(Coordinate coordinate) { @@ -565,7 +561,7 @@ { receiveY += accurate(coregion_event->get_coregion_area()->get_begin_height()); } - + slope_dist.push_back(std::make_pair<Coordinate,Coordinate>(sendY+coordinate,receiveY+coordinate)); slope_map.addDistance(sendY,receiveY); } } @@ -800,6 +796,86 @@ } }; + void print_slope() + { + if(slope_dist.empty()) + return; + stream << "%Slopes: %" << std::endl; + std::list<Coordinate> printed; + for(std::list<std::pair<Coordinate,Coordinate>>::iterator it = slope_dist.begin(); it!=slope_dist.end(); it++) + { + Coordinate dist = it->second - it->first; + { + //check if distance is printed + std::list<Coordinate>::iterator find = printed.begin(); + for(;find!=printed.end() && !Compare::equal((*find),dist);find++); + if(find!=printed.end()) + continue; + } + printed.push_back(dist); + stream << "\\def" << slope_map.getId(dist) << "{"; + // reverse + if(Compare::compare(it->second,it->first)) + { + stream << dist << "mm*\\real{\\scale@y}}" << std::endl; + continue; + } + // + std::map<Coordinate,int,Compare>::iterator find = level_types.find(it->first); + if(find==level_types.end()) + { + stream << dist << "mm*\\real{\\scale@y}}" << std::endl; + continue; + } + if(Compare::equal(it->first,it->second)) + { + stream << "0mm*\\real{\\scale@y}}" << std::endl; + continue; + } + std::map<Coordinate,int,Compare>::iterator next = find; + next++; + if(next==level_types.end()) + return; + if(Compare::equal(next->first,it->second)) + { + stream << dist << "mm*\\real{\\scale@y}}" << std::endl; + continue; + } + while(find!=level_types.end() && !Compare::equal(find->first,it->second)) + { + next = find; + next++; + dist = next->first - find->first; + switch(find->second) + { + case 2: + stream << slope_map.getId(dist); + break; + case 3: + stream << coregion_first_map.getId(dist); + break; + case 4: + stream << coregion_last_map.getId(dist); + break; + case -1: + case 1: + default: + stream << event_dist_map.getId(dist); + break; + } + find++; + if(find!=level_types.end() && !Compare::equal(find->first,it->second)) + { + stream << "+"; + } + else + { + stream << "}" << std::endl; + } + } + } + }; + int print() { PtrIDMap<MscMessagePtr> message_id_map; // message instance identifiers @@ -924,12 +1000,14 @@ stream << "%Levels: %" << std::endl; event_dist_map.print(stream); } + /* if(!slope_map.empty()) { //print slope types stream << "%Slopes: %" << std::endl; slope_map.print(stream); - } + }*/ + print_slope(); if(!coregion_first_map.empty()) { stream << "%Coregion first levels: %" << std::endl; @@ -1349,7 +1427,9 @@ HMscNode *successor_node = dynamic_cast<HMscNode*>(successor); stream << "\\arrow{" << node_id_map.get_id(*npos) << "}["; - for(std::list<MscPoint>::const_iterator point = (*spos)->get_line().get_points().begin(); point != (*spos)->get_line().get_points().end();point++) + std::list<MscPoint> line = (*spos)->get_line().get_points(); + //for(std::list<MscPoint>::const_iterator point = (*spos)->get_line().get_points().begin(); point != (*spos)->get_line().get_points().end();point++) + for(std::list<MscPoint>::const_iterator point = line.begin(); point != line.end();point++) { stream << "(" << point->get_x()toCm << "," << point->get_y()toCm << ")"; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <xf...@us...> - 2012-09-05 11:24:48
|
Revision: 1456 http://scstudio.svn.sourceforge.net/scstudio/?rev=1456&view=rev Author: xfarmad Date: 2012-09-05 11:24:40 +0000 (Wed, 05 Sep 2012) Log Message: ----------- Modified Paths: -------------- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp Modified: branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp =================================================================== --- branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-09-04 11:28:08 UTC (rev 1455) +++ branches/exportTexBranch/trunk/src/data/Z120/exportTex.cpp 2012-09-05 11:24:40 UTC (rev 1456) @@ -17,126 +17,46 @@ #include "data/Z120/z120.h" - -/* String modifier to print Z.120 names in a correct character set. - * - * This is a last resort correction. Invalid characters are replaced by underscore. - * More sophisticated transliteration should be done in the front-ends using platform - * specific functions. - * - * Note: Naming conventions violated for 'code prettiness' reasons. - */ -#define VALID_NAME_TEX(name) __VALID_NAME_TEX(this, name) - -class __VALID_NAME_TEX -{ -public: - __VALID_NAME_TEX(ExportTex* exportTex, const std::wstring &name) - : m_exportTex(exportTex), m_name(name) - { } - - friend std::ostream& - operator<<(std::ostream& os, const __VALID_NAME_TEX& value) - { - static const std::string replacement = "\\_"; - bool was_replacement = false; - - std::string new_value; - // performance optimalization: allocate buffer for all characters - new_value.reserve(value.m_name.length()); - - // step 1: character transliteration - for(std::wstring::const_iterator pos = value.m_name.begin(); - pos != value.m_name.end(); pos++) - { - char stripped; - - if((*pos >= 'A' && *pos <= 'Z') || (*pos >= 'a' && *pos <= 'z') - || (*pos >= '0' && *pos <= '9') - || *pos == '.') - { - // print valid characters - new_value.push_back((char)*pos); - - was_replacement = false; - } - else if( *pos == '#' || *pos == '%' || *pos == '&' || *pos == '_' ) - { - // print valid characters - new_value.push_back('\\'); - new_value.push_back((char)*pos); - - was_replacement = false; - } - else if((stripped = strip_diacritics(*pos)) != 0) - { - // use the transliteration table - new_value.push_back(stripped); - was_replacement = false; - } - else - { - // replace invalid characters by the 'replacement' - // shrink multiple replacements into a single characters - if(!was_replacement) - new_value.append(replacement); - - was_replacement = true; - } - } - - return os << new_value; - } - -private: - ExportTex* m_exportTex; - std::wstring m_name; -}; - class DistanceMap{ private: + //coordinate - size, int - number to distinguish names of sizes std::map<Coordinate,int,Compare> distance_map; std::string m_name; - Coordinate round(Coordinate coordinate) - { - return floor(coordinate+0.5); - }; public: DistanceMap(std::string name) { m_name.append(name); }; - void addDistance(Coordinate coordinate) + void addDistance(Coordinate coordinate,bool absolute = false) { + if(absolute) + coordinate = fabs(coordinate); if(distance_map.find(coordinate)==distance_map.end()) { - distance_map.insert( std::make_pair<Coordinate,int>(round(coordinate),distance_map.size())); + distance_map.insert( std::make_pair<Coordinate,int>(Compare::round(coordinate),distance_map.size())); } }; void addDistance(Coordinate coordinate1, Coordinate coordinate2, bool absolute = false) { - Coordinate distance = round(coordinate2) - round(coordinate1); - if(absolute) - distance = fabs(distance); - if(distance_map.find(distance)==distance_map.end()) - { - distance_map.insert( std::make_pair<Coordinate,int>(round(distance),distance_map.size())); - } + Coordinate distance = Compare::round(coordinate2) - Compare::round(coordinate1); + addDistance(distance,absolute); }; - std::string getId(Coordinate coordinate) + std::string getId(Coordinate coordinate, bool absolute = false) { + if(absolute) + coordinate = fabs(coordinate); std::ostringstream result; if(distance_map.find(coordinate)!=distance_map.end()) { result << "\\" << m_name; - result << (char)('a'+distance_map.find(round(coordinate))->second); + result << (char)('a'+distance_map.find(Compare::round(coordinate))->second); } else { - result << round(coordinate); + result << Compare::round(coordinate); result << "mm"; } return result.str(); @@ -144,52 +64,36 @@ std::string getId(Coordinate coordinate1, Coordinate coordinate2, bool absolute = false) { - Coordinate distance = round(coordinate2) - round(coordinate1); - if(absolute) - distance = fabs(distance); - return getId(distance); + Coordinate distance = Compare::round(coordinate2) - Compare::round(coordinate1); + return getId(distance,absolute); }; - std::map<Coordinate,int,Compare> getMap() - { - return distance_map; - }; - - void print(std::ostream& stream) + std::string print() { + std::ostringstream result; if(distance_map.size() != 0) for(std::map<Coordinate,int,Compare>::iterator it = distance_map.begin(); it!=distance_map.end(); it++) { - stream << "\\def\\" << m_name << (char)('a'+it->second) << "{" << it->first << "mm*\\real{\\scale@y}}" << std::endl; + result << "\\def\\" << m_name << (char)('a'+it->second) << "{" << it->first << "mm*\\real{\\scale@y}}" << std::endl; } else - stream << "%none%" << std::endl; + result << "%none%" << std::endl; + return result.str(); } bool empty(){ - if(distance_map.size()==0) - return true; - else - return false; + return distance_map.empty(); } }; - - - class PrintBmsc { private: std::ostream stream; BMscPtr bmsc; - ExportTex* export_tex; ElementListMap event_level_map; std::map<Coordinate,int,Compare> level_types; PtrIDMap<Coordinate> instance_id_map; - // distances - Coordinate first_level; - Coordinate last_level; - DistanceMap slope_map; //basic levels distance map DistanceMap event_dist_map; DistanceMap coregion_first_map; @@ -210,12 +114,11 @@ DistanceMap ordering_width_map; DistanceMap instance_width_map; DistanceMap instance_height_map; + DistanceMap slope_map; + //list of (start,end) coordinates of slope std::list<std::pair<Coordinate,Coordinate>> slope_dist; - static Coordinate round(Coordinate coordinate) - { - return floor(coordinate+0.5); - }; + bool findPtr(MscElementPtrList list, MscElementPtr element) { @@ -241,7 +144,7 @@ { CoregionEventPtr coregion_event = boost::dynamic_pointer_cast<CoregionEvent>(event); if(coregion_event!=NULL) - cor += accurate(coregion_event->get_coregion_area()->get_begin_height()); + cor += Compare::round(coregion_event->get_coregion_area()->get_begin_height()); cor += event->get_instance()->get_line_begin().get_y(); } print_event_comment(event,cor); @@ -251,30 +154,33 @@ { if(complete_message->get_send_event() == event) { - Coordinate sendY = accurate(complete_message->get_send_event()->get_position().get_y()); - Coordinate receiveY = accurate(complete_message->get_receive_event()->get_position().get_y()); + Coordinate sendY = Compare::round(complete_message->get_send_event()->get_position().get_y()); + Coordinate receiveY = Compare::round(complete_message->get_receive_event()->get_position().get_y()); - CoregionEventPtr coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_send_event()); - if(coregion_event!=NULL) + CoregionEventPtr coregion_send_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_send_event()); + if(coregion_send_event!=NULL) { - sendY += accurate(coregion_event->get_coregion_area()->get_begin_height()); + sendY += Compare::round(coregion_send_event->get_coregion_area()->get_begin_height()); } - - coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_receive_event()); - if(coregion_event!=NULL) + sendY += complete_message->get_send_event()->get_instance()->get_line_begin().get_y(); + + CoregionEventPtr coregion_receive_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_receive_event()); + if(coregion_receive_event!=NULL) { - receiveY += accurate(coregion_event->get_coregion_area()->get_begin_height()); - } - - - stream << "\\mess{" << __VALID_NAME_TEX(NULL, complete_message->get_label()) + receiveY += Compare::round(coregion_receive_event->get_coregion_area()->get_begin_height()); + Coordinate coregion_begin = coregion_receive_event->get_coregion_area()->get_begin_height() + complete_message->get_receive_event()->get_instance()->get_line_begin().get_y(); + } + receiveY += complete_message->get_receive_event()->get_instance()->get_line_begin().get_y(); + bool receive_padding = false; + receive_padding = findCoregionPadding(complete_message->get_send_event(),complete_message->get_receive_event()); + stream << "\\setlength{\\levelheight}{" << slope_map.getId(sendY,receiveY) << "}" << std::endl; + stream << "\\mess{" << ExportTex::print_wchar(complete_message->get_label()) << "}{"<< instance_id_map.get_id(inst_pos(complete_message->get_sender())) << "_inst}[0.3]{" - << instance_id_map.get_id(inst_pos(complete_message->get_receiver())) << "_inst}"; - if(coregion_event!=NULL) + << instance_id_map.get_id(inst_pos(complete_message->get_receiver())) << "_inst}[1]" << std::endl; + if(receive_padding) { - stream << "[" << coregion_width_map.getId(coregion_event->get_coregion_area()->get_width()) << "*\\real{0.5}]"; + stream << "\\setlength{\\receivepadding}{0mm}" << std::endl; } - stream << "{" << slope_map.getId(sendY,receiveY) << "}" << std::endl; } } @@ -301,14 +207,14 @@ { //get_dot_position() distance from event stream << "\\setlength{\\selfmesswidth}{" << lostfound_width_map.getId(fabs(incomplete_message->get_dot_position().get_x())) << "}" << std::endl; - Coordinate slope = accurate(incomplete_message->get_dot_position().get_y()); + Coordinate slope = Compare::round(incomplete_message->get_dot_position().get_y()); if(incomplete_message->is_lost()) stream << "\\lost"; if(incomplete_message->is_found()) stream << "\\found"; if(incomplete_message->get_dot_position().get_x() > 0) stream << "[r]"; - stream << "{" << __VALID_NAME_TEX(NULL, incomplete_message->get_label()) + stream << "{" << ExportTex::print_wchar(incomplete_message->get_label()) << "}{}[" << slope_map.getId(slope) << "]{" << instance_id_map.get_id(inst_pos(event->get_instance())) << "_inst}" << std::endl; } @@ -320,14 +226,14 @@ if(Compare::equal(cor, coordinate)) { //coregion tail width set \setlength{\coregiontail}{2mm} - stream << "\\regionstart{coregion}{" - << instance_id_map.get_id(inst_pos(coregionArea->get_instance())) << "_inst}{" << coregion_width_map.getId(coregionArea->get_width()) << "}{2mm}" << std::endl; + stream << "\\setlength{\\regionwidth}{" << coregion_width_map.getId(coregionArea->get_width()) << "}" << std::endl; + stream << "\\setlength{\\regionbarwidth}{" << coregion_width_map.getId(coregionArea->get_width()) << "}" << std::endl; + stream << "\\regionstart{suspension}{" << instance_id_map.get_id(inst_pos(coregionArea->get_instance())) << "_inst}" << std::endl; return; } else { - stream << "\\regionend{" - << instance_id_map.get_id(inst_pos(coregionArea->get_instance())) << "_inst}" << std::endl; + stream << "\\regionend{" << instance_id_map.get_id(inst_pos(coregionArea->get_instance())) << "_inst}" << std::endl; return; } }; @@ -338,13 +244,13 @@ cpos != event->get_comments().end(); cpos++) { stream << "\\setlength{\\msccommentdist}{" << comment_width_map.getId(event->get_instance()->get_line_begin().get_x(),(*cpos)->get_position().get_x(),true) << "}" << std::endl; - + stream << "\\setlength{\\levelheight}{" << comment_slope_map.getId((*cpos)->get_position().get_y(),event->get_position().get_y()+coordinate) << "}" << std::endl; stream << "\\msccomment"; if((*cpos)->get_position().get_x() > event->get_instance()->get_line_begin().get_x()) stream << "[r]"; - stream << "{" << __VALID_NAME_TEX(NULL, (*cpos)->get_text()) << "}{" + stream << "{" << ExportTex::print_wchar((*cpos)->get_text()) << "}{" << instance_id_map.get_id(inst_pos(event->get_instance())) << "_inst}"; - stream << "[" << comment_slope_map.getId((*cpos)->get_position().get_y(),event->get_position().get_y()+coordinate) << "]" << std::endl; + stream << "[-1]" << std::endl; } }; @@ -353,6 +259,7 @@ if(event_level_map.empty()) return; Coordinate first = event_level_map.begin()->first; + Coordinate inst_dist = NULL; while(!instances.empty()) { InstancePtrList::iterator min = instances.begin(); @@ -361,18 +268,24 @@ if((*ipos)->get_line_begin().get_x() < (*min)->get_line_begin().get_x()) min = ipos; } - // not suported in tex stream << "\\setlength{\\instwidth}{" << (*min)->get_width() << "mm}" << std::endl; + if(inst_dist==NULL) + { + inst_dist = (*min)->get_line_begin().get_x(); + } + else + { + stream << "\\setlength{\\instdist}{" << (*min)->get_line_begin().get_x()-inst_dist << "mm}" << std::endl; + } if(Compare::equal((*min)->get_line_begin().get_y(),first)) { - stream << "\\declinst{" << instance_width_map.getId((*min)->get_width()) << "}{" << instance_id_map.get_id(inst_pos((*min))) << "_inst}{" - << __VALID_NAME_TEX(NULL, (*min)->get_label()) << "}{}{3mm}" << std::endl; - //<< instance_height_map.getId((*min)->get_height()) << "}" << std::endl; + stream << "\\setlength{\\instwidth}{" << instance_width_map.getId((*min)->get_width()) << "}" << std::endl; + stream << "\\setlength{\\instheadheight}{3mm}" << std::endl; + stream << "\\setlength{\\instfootheight}{3mm}" << std::endl; + stream << "\\declinst{" << instance_id_map.get_id(inst_pos((*min))) << "_inst}{" << ExportTex::print_wchar((*min)->get_label()) << "}{}" << std::endl; } else { - stream << "\\dummyinst{" << instance_id_map.get_id(inst_pos((*min))) << "_inst}{" << instance_width_map.getId((*min)->get_width()) - << "}{3mm}" << std::endl; - //<< "}{" << instance_height_map.getId((*min)->get_height()) << "}" << std::endl; + stream << "\\dummyinst{" << instance_id_map.get_id(inst_pos((*min))) << "_inst}" << std::endl; } for(InstancePtrList::reverse_iterator ipos = instances.rbegin(); ipos != instances.rend(); ipos++) { @@ -389,10 +302,11 @@ return; if(Compare::equal(instance->get_line_begin().get_y(), coordinate)) { - stream << "\\create{}{}{" << instance_id_map.get_id(inst_pos(instance)) << "_inst}[" - << instance_width_map.getId(instance->get_width()) << "]{" - << __VALID_NAME_TEX(NULL, instance->get_label()) << "}[3mm]{}" << std::endl; - //<< __VALID_NAME_TEX(NULL, instance->get_label()) << "}[" << instance_height_map.getId(instance->get_height()) << "]{}" << std::endl; + stream << "\\setlength{\\instwidth}{" << instance_width_map.getId(instance->get_width()) << "}" << std::endl; + stream << "\\setlength{\\instheadheight}{3mm}" << std::endl; + stream << "\\setlength{\\instfootheight}{3mm}" << std::endl; + stream << "\\create{}{}{" << instance_id_map.get_id(inst_pos(instance)) << "_inst}{" + << ExportTex::print_wchar(instance->get_label()) << "}{}" << std::endl; return; } else @@ -416,9 +330,9 @@ if(it->get_begin_value() != it->get_end_value()) { if (it->get_begin_closed()) - printer << "@["; + printer << "["; else - printer << "@("; + printer << "("; printer << it->get_begin() << "," << it->get_end(); @@ -428,7 +342,7 @@ printer << ")"; } else - printer << "[@" << it->get_begin() << "]"; + printer << "[" << it->get_begin() << "]"; printer.commit_item(it->get_begin().get_value()); } @@ -438,16 +352,23 @@ void print_time_relations(const EventPtr& event, Coordinate coordinate = 0) { - const TimeRelationEventPtrList& relations = event->get_time_relations(); const AbsoluteTimePtrList absolute_times = event->get_absolut_times(); // process all absolute time constraints for(AbsoluteTimePtrList::const_iterator apos = absolute_times.begin(); apos != absolute_times.end(); apos++) { - stream << (*apos)->get_position().get_y() << std::endl; - stream << "\\setlength{\\selfmesswidth}{" << absolutetime_width_map.getId(event->get_instance()->get_line_begin().get_x(),(*apos)->get_position().get_x(),true) << "}" << std::endl; + stream << "\\setlength{\\selfmesswidth}{" << absolutetime_width_map.getId((*apos)->get_position().get_x()) << "}" << std::endl; + stream << "\\setlength{\\markdist}{" << absolutetime_slope_map.getId((*apos)->get_position().get_y(),coordinate,true) << "}" << std::endl; stream << "\\mscmark["; + if((*apos)->get_position().get_y() >= 0) + { + stream << "t"; + } + else + { + stream << "b"; + } if(((*apos)->get_position().get_x() - event->get_instance()->get_line_begin().get_x() )>0) { stream << "r"; @@ -458,15 +379,19 @@ } stream << "]{"; print_absolute_time(*apos); - stream << "}[" << absolutetime_slope_map.getId((*apos)->get_position().get_y()) << "]{" << instance_id_map.get_id(inst_pos(event->get_instance())) << "_inst}" << std::endl; + stream << "}{" << instance_id_map.get_id(inst_pos(event->get_instance())) << "_inst}" << std::endl; } // process all time relations for(TimeRelationEventPtrList::const_iterator rpos = relations.begin(); rpos != relations.end(); rpos++) { - if((*rpos)->get_event_a()==event){ - //TODO: directed interval + if((*rpos)->get_event_a()==event){ + bool receive_padding = false; + receive_padding = findCoregionPadding((*rpos)->get_event_a(),(*rpos)->get_event_b()); + stream << "\\setlength{\\levelheight}{" << timeinterval_slope_map.getId(getTimeRelationSlope(*rpos)) + << "}" << std::endl; + stream << "\\setlength{\\selfmesswidth}{" << timeinterval_width_map.getId((*rpos)->get_width(),true) << "}" << std::endl; stream << "\\measure["; if((*rpos)->get_width()<0) { @@ -477,38 +402,145 @@ stream << "l"; } stream << "]{" << (*rpos)->get_label() << "}{" << instance_id_map.get_id(inst_pos((*rpos)->get_event_a()->get_instance())) << "_inst}{" - << instance_id_map.get_id(inst_pos((*rpos)->get_event_b()->get_instance())) << "_inst}[-" - << timeinterval_slope_map.getId((*rpos)->get_event_b()->get_position().get_y(),(*rpos)->get_event_a()->get_position().get_y()) - << "]" << std::endl; + << instance_id_map.get_id(inst_pos((*rpos)->get_event_b()->get_instance())) << "_inst}[1]" << std::endl; + if(receive_padding) + { + stream << "\\setlength{\\receivepadding}{0mm}" << std::endl; + } } } }; -public: - PrintBmsc(std::ostream& ostream, const BMscPtr& obmsc) : stream(ostream.rdbuf()),slope_map("slope"),event_dist_map("level"),coregion_first_map("coregionFirst"), - coregion_last_map("coregionLast"),coregion_width_map("coregionWidth"),coregion_tail_width_map("coregionEndWidth"),local_action_width_map("localActionWidth"), - local_action_height_map("localActionHeight"),local_condition_width_map("localConditionWidth"),local_condition_height_map("localConditionHeight"), - lostfound_width_map("lostFoundWidth"),comment_width_map("commentWidth"),comment_slope_map("commentSlope"),absolutetime_width_map("absoluteTimeWidth"), - absolutetime_slope_map("absoluteTimeSlope"),timeinterval_width_map("timeIntervalWidth"),timeinterval_slope_map("timeIntervalSlope"),ordering_width_map("orderingWidth"), - instance_width_map("instanceWidth"),instance_height_map("instanceHeight") + void print_configuration_header() { - bmsc = obmsc; - export_tex = NULL; - }; + //set up atributes + stream << "\\def\\scale@y{1.0}" << std::endl; + + //height just below head symbol + stream << "\\setlength{\\firstlevelheight}{"; + if(level_types.begin()->second==5) + { + ElementListMap::iterator next = event_level_map.begin(); + next++; + stream << next->first - level_types.begin()->first; + } + else + { + //zle nacitane levely, nezacina instanciou + //return 3; + } + stream << "mm*\\real{\\scale@y}}" << std::endl; - static Coordinate accurate(Coordinate coordinate) - { - return round(coordinate); - }; + //height of level just above foot symbols + stream << "\\setlength{\\lastlevelheight}{"; + if(event_level_map.size()==2) + { + //diagram contains only empty instance + stream << "0"; + } + else + { + ElementListMap::reverse_iterator next = event_level_map.rbegin(); + next++; + stream << (event_level_map.rbegin()->first - next->first); + } + stream << "mm*\\real{\\scale@y}}" << std::endl; - ElementListMap getMap() - { - return event_level_map; - }; + //print level types + stream << "%Levels: %" << std::endl; + stream << event_dist_map.print(); + + print_slope(); + if(!coregion_first_map.empty()) + { + stream << "%Coregion first levels: %" << std::endl; + stream << coregion_first_map.print(); + } + if(!coregion_last_map.empty()) + { + stream << "%Coregion last levels: %" << std::endl; + stream << coregion_last_map.print(); + } + if(!coregion_width_map.empty()) + { + stream << "%Coregion width: %" << std::endl; + stream << coregion_width_map.print(); + } + if(!local_action_width_map.empty()) + { + stream << "%Local action width: %" << std::endl; + stream << local_action_width_map.print(); + } + if(!local_action_height_map.empty()) + { + stream << "%Local action height: %" << std::endl; + stream << local_action_height_map.print(); + } + if(!local_condition_width_map.empty()) + { + stream << "%Condition width: %" << std::endl; + stream << local_condition_width_map.print(); + } + if(!local_condition_height_map.empty()) + { + stream << "%Condition height: %" << std::endl; + stream << local_condition_height_map.print(); + } + if(!lostfound_width_map.empty()) + { + stream << "%Lost found width: %" << std::endl; + stream << lostfound_width_map.print(); + } + if(!comment_width_map.empty()) + { + stream << "%Coment width: %" << std::endl; + stream << comment_width_map.print(); + } + if(!comment_slope_map.empty()) + { + stream << "%Comment slopes: %" << std::endl; + stream << comment_slope_map.print(); + } + if(!absolutetime_width_map.empty()) + { + stream << "%Absolute time width: %" << std::endl; + stream << absolutetime_width_map.print(); + } + if(!absolutetime_slope_map.empty()) + { + stream << "%Absolut time slope: %" << std::endl; + stream << absolutetime_slope_map.print(); + } + if(!timeinterval_width_map.empty()) + { + stream << "%Time interval width: %" << std::endl; + stream << timeinterval_width_map.print(); + } + if(!timeinterval_slope_map.empty()) + { + stream << "%Time interval slope: %" << std::endl; + stream << timeinterval_slope_map.print(); + } + if(!ordering_width_map.empty()) + { + stream << "%Ordering width: %" << std::endl; + stream << ordering_width_map.print(); + } + if(!instance_width_map.empty()) + { + stream << "%Instance width: %" << std::endl; + stream << instance_width_map.print(); + } + if(!instance_height_map.empty()) + { + stream << "%Instance height: %" << std::endl; + stream << instance_height_map.print(); + } + }; void create_level(Coordinate coordinate) { - event_level_map.insert( std::make_pair<Coordinate,MscElementPtrList>(round(coordinate), MscElementPtrList() )); + event_level_map.insert( std::make_pair<Coordinate,MscElementPtrList>(Compare::round(coordinate), MscElementPtrList() )); }; void insert_pointer(MscElementPtr pointer, Coordinate coordinate) @@ -533,7 +565,7 @@ { Coordinate cor = event->get_position().get_y()+coordinate; insert_pointer(event,cor); - insert_time_relations(event); + insert_time_relations(event,cor); for(CommentPtrSet::const_iterator cpos = event->get_comments().begin(); cpos != event->get_comments().end(); cpos++) @@ -547,21 +579,24 @@ { if(complete_message->get_send_event() == event) { - Coordinate sendY = accurate(complete_message->get_send_event()->get_position().get_y()); - Coordinate receiveY = accurate(complete_message->get_receive_event()->get_position().get_y()); + Coordinate sendY = Compare::round(complete_message->get_send_event()->get_position().get_y()); + Coordinate receiveY = Compare::round(complete_message->get_receive_event()->get_position().get_y()); CoregionEventPtr coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_send_event()); if(coregion_event!=NULL) { - sendY += accurate(coregion_event->get_coregion_area()->get_begin_height()); + sendY += Compare::round(coregion_event->get_coregion_area()->get_begin_height()); } + sendY += complete_message->get_send_event()->get_instance()->get_line_begin().get_y(); coregion_event = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)complete_message->get_receive_event()); if(coregion_event!=NULL) { - receiveY += accurate(coregion_event->get_coregion_area()->get_begin_height()); - } - slope_dist.push_back(std::make_pair<Coordinate,Coordinate>(sendY+coordinate,receiveY+coordinate)); + receiveY += Compare::round(coregion_event->get_coregion_area()->get_begin_height()); + } + receiveY += complete_message->get_receive_event()->get_instance()->get_line_begin().get_y(); + + slope_dist.push_back(std::make_pair<Coordinate,Coordinate>(sendY,receiveY)); slope_map.addDistance(sendY,receiveY); } } @@ -586,6 +621,7 @@ if(incomplete_message != NULL) { //get_dot_position() distance from event + slope_dist.push_back(std::make_pair<Coordinate,Coordinate>(incomplete_message->get_event()->get_position().get_y()+coordinate,incomplete_message->get_event()->get_position().get_y()+coordinate+incomplete_message->get_dot_position().get_y())); slope_map.addDistance(incomplete_message->get_dot_position().get_y()); lostfound_width_map.addDistance(fabs(incomplete_message->get_dot_position().get_x())); } @@ -618,8 +654,9 @@ // we thus skip all "events b" if((*rpos)->get_event_a() != event) continue; - - timeinterval_width_map.addDistance((*rpos)->get_width()); + + timeinterval_slope_map.addDistance(getTimeRelationSlope(*rpos)); + timeinterval_width_map.addDistance((*rpos)->get_width(),true); } }; @@ -641,19 +678,18 @@ */ void find_distances() { - Coordinate last_slope = -1; for(ElementListMap::iterator it = event_level_map.begin(); it!=event_level_map.end(); it++) { ElementListMap::iterator next = it; next++; + //determine first and last level if(next != event_level_map.end()) { if(it == event_level_map.begin()) { //instance first level - first_level = (*next).first - (*it).first; - level_types.insert(std::make_pair<Coordinate,int>(round(it->first),5)); + level_types.insert(std::make_pair<Coordinate,int>(Compare::round(it->first),5)); continue; } ElementListMap::iterator nextnext = next; @@ -661,29 +697,32 @@ if(nextnext == event_level_map.end()) { //instance last level - last_level = (*next).first - (*it).first; - level_types.insert(std::make_pair<Coordinate,int>(round(it->first),6)); + level_types.insert(std::make_pair<Coordinate,int>(Compare::round(it->first),6)); } } else { + //last level(instace foot only) break; } //level type int level_type = 0; - MscElementPtrList list = it->second; - for (MscElementPtrList::iterator nextIt = list.begin(); list.end() != nextIt ; nextIt++) + //MscElementPtrList list = it->second; repleced lisr with it->second + //how exactly decide what level it is??? + for (MscElementPtrList::iterator it_ptr_list = it->second.begin(); it_ptr_list != it->second.end(); it_ptr_list++) { //coredionArea - CoregionAreaPtr coregion_area = boost::dynamic_pointer_cast<CoregionArea>(*nextIt); + CoregionAreaPtr coregion_area = boost::dynamic_pointer_cast<CoregionArea>(*it_ptr_list); + // coregion_area->get_begin_height() absolute distance or relative from instance begin? if(coregion_area != NULL && Compare::equal(coregion_area->get_begin_height(),it->first)) { + //coregion area first level level_type = 3; break; } - EventPtr event = boost::dynamic_pointer_cast<Event>(*nextIt); + EventPtr event = boost::dynamic_pointer_cast<Event>(*it_ptr_list); if(event!=NULL) { CoregionEventPtr coregion_event = boost::dynamic_pointer_cast<CoregionEvent>(event); @@ -691,6 +730,7 @@ { if(findPtr((*next).second,coregion_event->get_coregion_area())) { + //coregion area last level level_type = 4; break; } @@ -699,12 +739,13 @@ CompleteMessagePtr complete_msg = event->get_complete_message(); if(complete_msg != NULL) { - if(complete_msg->get_send_event() == (*nextIt)) + if(complete_msg->get_send_event() == (*it_ptr_list)) { if(findPtr((*next).second,complete_msg->get_receive_event())) { if(level_type == 0 || level_type == 2) { + //slope level_type = 2; continue; } @@ -721,7 +762,6 @@ else level_type = -1; } - //instance or something else if(level_type == 0 || level_type == 1) @@ -729,56 +769,7 @@ else level_type = -1; } - list = next->second; - if(level_type != -1 && level_type != 1) - for (MscElementPtrList::iterator nextIt = list.begin(); list.end() != nextIt ; nextIt++) - { - switch(level_type) - { - case 2: - { - EventPtr event = boost::dynamic_pointer_cast<Event>(*nextIt); - if(event!=NULL) - { - CompleteMessagePtr complete_msg = event->get_complete_message(); - if(complete_msg != NULL) - { - if(complete_msg->get_send_event() == (*nextIt)) - { - level_type = -1; - } - } - else - { - level_type = -1; - } - } - else - { - level_type = -1; - } - } - break; - case 3: - /* - what all is first coregion level - { - CoregionEventPtr event = boost::dynamic_pointer_cast<CoregionEvent>(*nextIt); - if(event!=NULL) - { - if(!findPtr(it->second,event->get_coregion_area())) - level_type = -1; - } - else - { - level_type = -1; - } - } - */ - break; - - } - } + switch(level_type) { case -1: @@ -814,42 +805,38 @@ } printed.push_back(dist); stream << "\\def" << slope_map.getId(dist) << "{"; - // reverse + if(Compare::compare(it->second,it->first)) { + //second(receive event) is less(higher) than first(send event) stream << dist << "mm*\\real{\\scale@y}}" << std::endl; continue; - } - // - std::map<Coordinate,int,Compare>::iterator find = level_types.find(it->first); - if(find==level_types.end()) - { - stream << dist << "mm*\\real{\\scale@y}}" << std::endl; - continue; - } + } if(Compare::equal(it->first,it->second)) { + //slope is 0 stream << "0mm*\\real{\\scale@y}}" << std::endl; continue; } - std::map<Coordinate,int,Compare>::iterator next = find; - next++; - if(next==level_types.end()) - return; - if(Compare::equal(next->first,it->second)) - { - stream << dist << "mm*\\real{\\scale@y}}" << std::endl; - continue; - } + std::map<Coordinate,int,Compare>::iterator find = level_types.find(it->first); while(find!=level_types.end() && !Compare::equal(find->first,it->second)) { - next = find; + std::map<Coordinate,int,Compare>::iterator next = find; next++; + if(next == level_types.end()) + { + //slope out of diagram + stream << (it->second - next->first) << "mm}" << std::endl; + break; + } dist = next->first - find->first; switch(find->second) { case 2: - stream << slope_map.getId(dist); + if(Compare::equal(find->first,it->first) && Compare::equal(next->first,it->second)) + stream << dist << "mm"; + else + stream << slope_map.getId(dist); break; case 3: stream << coregion_first_map.getId(dist); @@ -863,8 +850,7 @@ stream << event_dist_map.getId(dist); break; } - find++; - if(find!=level_types.end() && !Compare::equal(find->first,it->second)) + if(!Compare::equal(next->first,it->second)) { stream << "+"; } @@ -872,37 +858,96 @@ { stream << "}" << std::endl; } + find++; } } }; - - int print() - { - PtrIDMap<MscMessagePtr> message_id_map; // message instance identifiers - PtrIDMap<EventPtr> event_id_map; // event identifiers - Coordinate maxInstLen = 0; - - //find distance between instances - Coordinate instDist = 15; - InstancePtrList::const_iterator ipos1 = bmsc->get_instances().begin(); - if(ipos1 != bmsc->get_instances().end()) + bool findCoregionPadding(EventPtr send_event,EventPtr receive_event) + { + Coordinate send_coordinate = send_event->get_position().get_y(); + CoregionEventPtr send_coregion_event = boost::dynamic_pointer_cast<CoregionEvent>(send_event); + if(send_coregion_event != NULL) { - InstancePtrList::const_iterator ipos2 = ipos1; - ipos2++; - if(ipos2!=bmsc->get_instances().end()) - instDist = fabs ((*ipos2)->get_line_end().get_x() - (*ipos1)->get_line_end().get_x()); + send_coordinate += send_coregion_event->get_coregion_area()->get_begin_height(); } - + send_coordinate += send_event->get_instance()->get_line_begin().get_y(); + + Coordinate send_padding = 0; + InstancePtr inst = receive_event->get_instance(); + for(EventAreaPtr area = inst->get_first(); area != NULL; area = area->get_next()) + { + CoregionAreaPtr coregion_area = boost::dynamic_pointer_cast<CoregionArea>(area); + if(coregion_area != NULL) + { + Coordinate begin_coregion = inst->get_line_begin().get_y() + coregion_area->get_begin_height(); + Coordinate end_coregion = inst->get_line_begin().get_y() + coregion_area->get_end_height(); + //coregion is exported first -> begin change coordinate in msc.sty, end not + if(Compare::compare(begin_coregion,send_coordinate,true) && Compare::compare(send_coordinate,end_coregion)) + { + send_padding += coregion_area->get_width(); + break; + } + } + } + CoregionEventPtr receive_coregion_event = boost::dynamic_pointer_cast<CoregionEvent>(receive_event); + if(receive_coregion_event != NULL) + { + if(!Compare::equal(send_padding,receive_coregion_event->get_coregion_area()->get_width())) + { + stream << "\\setlength{\\receivepadding}{-" << coregion_width_map.getId(receive_coregion_event->get_coregion_area()->get_width()-send_padding) << "*\\real{0.5}}" << std::endl; + return true; + } + } + else + { + if(!Compare::equal(send_padding,0)) + { + stream << "\\setlength{\\receivepadding}{" << coregion_width_map.getId(send_padding) << "*\\real{0.5}}" << std::endl; + return true; + } + } + return false; + } + + Coordinate getTimeRelationSlope(TimeRelationEventPtr rpos) + { + Coordinate event_a_position = rpos->get_event_a()->get_position().get_y(); + event_a_position += rpos->get_event_a()->get_instance()->get_line_begin().get_y(); + CoregionEventPtr coregion_event_a = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)rpos->get_event_a()); + if(coregion_event_a != NULL) + { + event_a_position += coregion_event_a->get_coregion_area()->get_begin_height(); + } + Coordinate event_b_position = rpos->get_event_b()->get_position().get_y(); + event_b_position += rpos->get_event_b()->get_instance()->get_line_begin().get_y(); + CoregionEventPtr coregion_event_b = boost::dynamic_pointer_cast<CoregionEvent>((EventPtr)rpos->get_event_b()); + if(coregion_event_b != NULL) + { + event_b_position += coregion_event_b->get_coregion_area()->get_begin_height(); + } + return (event_b_position-event_a_position); + } + +public: + PrintBmsc(std::ostream& ostream, const BMscPtr& obmsc) : stream(ostream.rdbuf()),slope_map("slope"),event_dist_map("level"),coregion_first_map("coregionFirst"), + coregion_last_map("coregionLast"),coregion_width_map("coregionWidth"),coregion_tail_width_map("coregionEndWidth"),local_action_width_map("localActionWidth"), + local_action_height_map("localActionHeight"),local_condition_width_map("localConditionWidth"),local_condition_height_map("localConditionHeight"), + lostfound_width_map("lostFoundWidth"),comment_width_map("commentWidth"),comment_slope_map("commentSlope"),absolutetime_width_map("absoluteTimeWidth"), + absolutetime_slope_map("absoluteTimeSlope"),timeinterval_width_map("timeIntervalWidth"),timeinterval_slope_map("timeIntervalSlope"),ordering_width_map("orderingWidth"), + instance_width_map("instanceWidth"),instance_height_map("instanceHeight") + { + bmsc = obmsc; + }; + + int print() + { //load event_level_map for(InstancePtrList::const_iterator ipos = bmsc->get_instances().begin(); ipos != bmsc->get_instances().end(); ipos++) { insert_instance((*ipos)); Coordinate inst_start = (*ipos)->get_line_begin().get_y(); - - if(maxInstLen < ((*ipos)->get_line_end().get_y()-(*ipos)->get_line_begin().get_y())) - maxInstLen = ((*ipos)->get_line_end().get_y()-(*ipos)->get_line_begin().get_y()); for(EventAreaPtr area = (*ipos)->get_first(); area != NULL; area = area->get_next()) @@ -954,158 +999,20 @@ } } - find_distances(); - - //set up atributes - stream << "\\def\\scale@y{1.0}" << std::endl; - - //distance between instances - stream << "\\setlength{\\instdist}{"<< instDist << "mm}" << std::endl; - - if(!event_level_map.empty() && event_level_map.size()>=2){ - //height just below head symbol - stream << "\\setlength{\\firstlevelheight}{"; - if(level_types.begin()->second==5) - { - if(event_level_map.size()==2) - { - stream << ( event_level_map.rbegin()->first - event_level_map.begin()->first); - } - else - { - ElementListMap::iterator next = event_level_map.begin(); - next++; - stream << next->first - level_types.begin()->first; - } - } - stream << "mm*\\real{\\scale@y}}" << std::endl; - //height of level just above foot symbols - stream << "\\setlength{\\lastlevelheight}{"; - if(event_level_map.size()==2) - { - stream << "0"; - } - else - { - ElementListMap::reverse_iterator next = event_level_map.rbegin(); - next++; - stream << (event_level_map.rbegin()->first - next->first); - } - stream << "mm*\\real{\\scale@y}}" << std::endl; - } - - if(!event_dist_map.empty()) + if(event_level_map.empty() || event_level_map.size()<2) { - //print level types - stream << "%Levels: %" << std::endl; - event_dist_map.print(stream); + //empty diagram + return 2; } - /* - if(!slope_map.empty()) - { - //print slope types - stream << "%Slopes: %" << std::endl; - slope_map.print(stream); - }*/ - print_slope(); - if(!coregion_first_map.empty()) - { - stream << "%Coregion first levels: %" << std::endl; - coregion_first_map.print(stream); - } - if(!coregion_last_map.empty()) - { - stream << "%Coregion last levels: %" << std::endl; - coregion_last_map.print(stream); - } - if(!coregion_width_map.empty()) - { - stream << "%Coregion width: %" << std::endl; - coregion_width_map.print(stream); - } - if(!local_action_width_map.empty()) - { - stream << "%Local action width: %" << std::endl; - local_action_width_map.print(stream); - } - if(!local_action_height_map.empty()) - { - stream << "%Local action height: %" << std::endl; - local_action_height_map.print(stream); - } - if(!local_condition_width_map.empty()) - { - stream << "%Condition width: %" << std::endl; - local_condition_width_map.print(stream); - } - if(!local_condition_height_map.empty()) - { - stream << "%Condition height: %" << std::endl; - local_condition_height_map.print(stream); - } - if(!lostfound_width_map.empty()) - { - stream << "%Lost found width: %" << std::endl; - lostfound_width_map.print(stream); - } - if(!comment_width_map.empty()) - { - stream << "%Coment width: %" << std::endl; - comment_width_map.print(stream); - } - if(!comment_slope_map.empty()) - { - stream << "%Comment slopes: %" << std::endl; - comment_slope_map.print(stream); - } - if(!absolutetime_width_map.empty()) - { - stream << "%Absolute time width: %" << std::endl; - absolutetime_width_map.print(stream); - } - if(!absolutetime_slope_map.empty()) - { - stream << "%Absolut time slope: %" << std::endl; - absolutetime_slope_map.print(stream); - } - if(!timeinterval_width_map.empty()) - { - stream << "%Time interval width: %" << std::endl; - timeinterval_width_map.print(stream); - } - if(!timeinterval_slope_map.empty()) - { - stream << "%Time interval slope: %" << std::endl; - timeinterval_slope_map.print(stream); - } - if(!ordering_width_map.empty()) - { - stream << "%Ordering width: %" << std::endl; - ordering_width_map.print(stream); - } - if(!instance_width_map.empty()) - { - stream << "%Instance width: %" << std::endl; - instance_width_map.print(stream); - } - if(!instance_height_map.empty()) - { - stream << "%Instance height: %" << std::endl; - instance_height_map.print(stream); - } - - //print_element_attributes(stream, bmsc); - stream << "\\begin{msc}{" << __VALID_NAME_TEX(NULL, bmsc->get_label()) << "}" << std::endl; - - print_instances(bmsc->get_instances()); - - //print levels and events - int empty_levels = 0; - Coordinate last_slope = -1; + find_distances(); + print_configuration_header(); + stream << "\\begin{msc}{" << ExportTex::print_wchar(bmsc->get_label()) << "}" << std::endl; + print_instances(bmsc->get_instances()); + + //print levels and events for(ElementListMap::iterator it = event_level_map.begin(); it!=event_level_map.end(); it++) - { - + { //events for (MscElementPtrList::iterator listIt = (*it).second.begin(); (*it).second.end() != listIt ; listIt++) { @@ -1120,6 +1027,7 @@ { print_event(event); } + CoregionAreaPtr coregion_area = boost::dynamic_pointer_cast<CoregionArea>(*listIt); if(coregion_area != NULL) { @@ -1129,14 +1037,14 @@ ElementListMap::iterator next = it; next++; - if(level_types[it->first]!= 5 && level_types[it->first]!= 6 && next!=event_level_map.end()) + if(next!=event_level_map.end() && level_types[it->first]!= 5 && level_types[it->first]!= 6) { ElementListMap::iterator next = it; next++; Coordinate dist = next->first - it->first; std::map<Coordinate,int,Compare>::iterator type = level_types.find(it->first); stream << "\\setlength{\\levelheight}{"; - if(type!= level_types.end()) + if(type != level_types.end()) { switch(type->second) { @@ -1185,7 +1093,7 @@ int ExportTex::print_document_head(std::ostream& stream) { stream << "\\documentclass{article}" <<std::endl; - stream << "\\usepackage{msc4}" <<std::endl; + stream << "\\usepackage{msc5}" <<std::endl; stream << "\\begin{document}" <<std::endl; return 0; } @@ -1203,7 +1111,7 @@ int result = 0; // error count print_document_head(stream); - stream << "\\section*{"<< VALID_NAME_TEX(name) << "}" << std::endl; + stream << "\\section*{"<< ExportTex::print_wchar(name) << "}" << std::endl; std::set<std::wstring> printed; @@ -1312,7 +1220,7 @@ } node_stack.clear(); - stream << "\\begin{hmsc}{" << VALID_NAME_TEX(hmsc->get_label()) << "}("; + stream << "\\begin{hmsc}{" << ExportTex::print_wchar(hmsc->get_label()) << "}("; if(llCorner.get_x()<0) stream << -(llCorner.get_x()-1)toCm; else @@ -1368,7 +1276,7 @@ if(reference_node->get_msc() != NULL) { stream << "\\hmscreference{" << node_id_map.get_id(*npos) - << "}{" << VALID_NAME_TEX(reference_node->get_msc()->get_label()) + << "}{" << ExportTex::print_wchar(reference_node->get_msc()->get_label()) << "}(" << reference_node->get_position().get_x()toCm << "," << -reference_node->get_position().get_y()toCm << ")" << std::endl; m_printing.push_back(reference_node->get_msc()); @@ -1447,12 +1355,56 @@ return 0; } +std::string ExportTex::print_wchar(const std::wstring &value) +{ + static const std::string replacement = "\\_"; + bool was_replacement = false; + std::string new_value; + // performance optimalization: allocate buffer for all characters + new_value.reserve(value.length()); + // step 1: character transliteration + for(std::wstring::const_iterator pos = value.begin(); + pos != value.end(); pos++) + { + char stripped; + if((*pos >= 'A' && *pos <= 'Z') || (*pos >= 'a' && *pos <= 'z') + || (*pos >= '0' && *pos <= '9') + || *pos == '.') + { + // print valid characters + new_value.push_back((char)*pos); + was_replacement = false; + } + else if( *pos == '#' || *pos == '%' || *pos == '&' || *pos == '_' ) + { + // print valid characters + new_value.push_back('\\'); + new_value.push_back((char)*pos); + was_replacement = false; + } + else if((stripped = strip_diacritics(*pos)) != 0) + { + // use the transliteration table + new_value.push_back(stripped); + was_replacement = false; + } + else + { + // replace invalid characters by the 'replacement' + // shrink multiple replacements into a single characters + if(!was_replacement) + new_value.append(replacement); + was_replacement = true; + } + } + return new_value; +} @@ -1464,3 +1416,10 @@ + + + + + + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |