From: <xb...@us...> - 2013-11-27 22:59:03
|
Revision: 1874 http://sourceforge.net/p/scstudio/code/1874 Author: xborza Date: 2013-11-27 22:59:00 +0000 (Wed, 27 Nov 2013) Log Message: ----------- multiple events, ordering lines in coregion repaint.. Modified Paths: -------------- trunk/src/view/visio/addon/extract.cpp trunk/src/view/visio/addon/extract.h trunk/src/view/visio/addon/shapeutils.cpp trunk/src/view/visio/addon/shapeutils.h trunk/src/view/visio/addon/visualize.cpp Modified: trunk/src/view/visio/addon/extract.cpp =================================================================== --- trunk/src/view/visio/addon/extract.cpp 2013-11-26 14:27:03 UTC (rev 1873) +++ trunk/src/view/visio/addon/extract.cpp 2013-11-27 22:59:00 UTC (rev 1874) @@ -20,6 +20,7 @@ #include <set> #include "extract.h" #include "errors.h" +#include "shapeutils.h" void RemoveKnownSymbols(Visio::IVPagePtr page) { @@ -343,10 +344,44 @@ return result; } -CDrawingExtractor::SPoint -CDrawingExtractor::point_to_page(Visio::IVShapePtr shape, const CDrawingExtractor::SPoint& point) +CDrawingExtractor::SPoint CDrawingExtractor::get_conpoint_order(Visio::IVShapePtr coregion,Visio::IVConnectPtr connect) { SPoint result; // [visio internal units] + //get message shape, to which order elements is connected + Visio::IVShapePtr msg = connect->ToSheet; + TShapeType type = get_shape_type(msg); + if(type != ST_BMSC_MESSAGE && type != ST_BMSC_MESSAGE_FOUND && type != ST_BMSC_MESSAGE_LOST) + { + //something is wrong + return result; + } + + short cellrow = 0; + //go through fromConnects and check + for(int i=1; i <= msg->Connects->Count; i++) + { + Visio::IVConnectPtr con = msg->Connects->Item[i]; + + if(con->ToSheet->ID == coregion->ID) + { + cellrow = con->ToCell->Row; + break; + } + } + + result.m_x = coregion->CellsSRC[visSectionConnectionPts][cellrow][visX]->Result[0]; + result.m_y = coregion->CellsSRC[visSectionConnectionPts][cellrow][visY]->Result[0]; + + result.m_from_id = connect->FromSheet->ID; + result.m_to_id = coregion->ID; + + return result; +} + + +CDrawingExtractor::SPoint CDrawingExtractor::point_to_page(Visio::IVShapePtr shape, const CDrawingExtractor::SPoint& point) +{ + SPoint result; // [visio internal units] shape->XYToPage(point.m_x, point.m_y, &result.m_x, &result.m_y); return result; @@ -423,6 +458,27 @@ { case ST_BMSC_MESSAGE: { + //check for ordering elements + for(int i = 1; i <= shape->FromConnects->Count; i++) + { + Visio::IVConnectPtr connect = shape->FromConnects->Item[i]; + // shape connected to this point + Visio::IVShapePtr shp = connect->FromSheet; + // connect the message + TShapeType type = get_shape_type(shp); + if(type == ST_BMSC_ORDER_LINE || type == ST_BMSC_ORDER_ARROW) + { + //check if the ordering Arrow/Line lies in THIS coregion + MscPoint order_point; + order_point.set_x(CShapeUtils::getShapeCell(shp, "BeginX")); + order_point.set_y(CShapeUtils::getShapeCell(shp, "BeginY")); + if(CShapeUtils::isPointOnCoregionSide(order_point,coregion)) + { + relations.insert(shp->ID); + } + } + } + CompleteMessagePtr message = find_element<CompleteMessage>(elements, shape->ID); if(message == NULL) continue; @@ -451,6 +507,29 @@ case ST_BMSC_MESSAGE_LOST: { + //check for ordering elements + for(int i = 1; i <= shape->FromConnects->Count; i++) + { + Visio::IVConnectPtr connect = shape->FromConnects->Item[i]; + // shape connected to this point + Visio::IVShapePtr shp = connect->FromSheet; + // connect the message + TShapeType type = get_shape_type(shp); + if(type == ST_BMSC_ORDER_LINE || type == ST_BMSC_ORDER_ARROW) + { + //check if the ordering Arrow/Line lies in THIS coregion + MscPoint order_point; + order_point.set_x(CShapeUtils::getShapeCell(shp, "BeginX")); + order_point.set_y(CShapeUtils::getShapeCell(shp, "BeginY")); + if(CShapeUtils::isPointOnCoregionSide(order_point,coregion)) + { + relations.insert(shp->ID); + } + } + } + + + // IncompleteMessagePtr message = find_element<IncompleteMessage>(elements, shape->ID); if(message == NULL) continue; @@ -472,6 +551,26 @@ } case ST_BMSC_MESSAGE_FOUND: { + //check for ordering elements + for(int i = 1; i <= shape->FromConnects->Count; i++) + { + Visio::IVConnectPtr connect = shape->FromConnects->Item[i]; + // shape connected to this point + Visio::IVShapePtr shp = connect->FromSheet; + // connect the message + TShapeType type = get_shape_type(shp); + if(type == ST_BMSC_ORDER_LINE || type == ST_BMSC_ORDER_ARROW) + { + //check if the ordering Arrow/Line lies in THIS coregion + MscPoint order_point; + order_point.set_x(CShapeUtils::getShapeCell(shp, "BeginX")); + order_point.set_y(CShapeUtils::getShapeCell(shp, "BeginY")); + if(CShapeUtils::isPointOnCoregionSide(order_point,coregion)) + { + relations.insert(shp->ID); + } + } + } IncompleteMessagePtr message = find_element<IncompleteMessage>(elements, shape->ID); if(message == NULL) continue; @@ -545,9 +644,11 @@ } Visio::IVConnectPtr connect1 = line->Connects->Item[1]; - SPoint pos1 = get_connect_point(connect1); + SPoint pos1 = get_conpoint_order(coregion,connect1); + //SPoint pos1 = get_connect_point(connect1); Visio::IVConnectPtr connect2 = line->Connects->Item[2]; - SPoint pos2 = get_connect_point(connect2); + SPoint pos2 = get_conpoint_order(coregion,connect2); + //SPoint pos2 = get_connect_point(connect2); TCoregionEvents::const_iterator event1 = coregion_events.find(pos1); TCoregionEvents::const_iterator event2 = coregion_events.find(pos2); @@ -937,23 +1038,42 @@ } // check for collisional shapes - for(TEventSet::iterator epos = strict_events.begin(); - epos != strict_events.end(); epos = strict_events.upper_bound(*epos)) + // check for multiple events + struct classcomp { + + bool operator() (const SStrictOrder& s1, const SStrictOrder& s2) const + { + int cres = fcmp(s1.event_height, s2.event_height); + // no other connection allowed with coregion begin/end + if(s1.shape_type == ST_BMSC_COREGION || s2.shape_type == ST_BMSC_COREGION) + return cres < 0; + // old event < new event, incoming event == outgoing event ONLY FOR MULTIPLE EVENTS CHECK + return cres < 0; + } + }; + + typedef std::multiset<SStrictOrder,classcomp> TMultiEventSet; + TMultiEventSet multi_events; + multi_events.insert(strict_events.begin(),strict_events.end()); + + for(TMultiEventSet::iterator epos = multi_events.begin(); + epos != multi_events.end(); epos = multi_events.upper_bound(*epos)) { - if(strict_events.count(*epos) > 1) + if(multi_events.count(*epos) > 1) { shapelist this_shapelist; - std::pair<TEventSet::iterator, TEventSet::iterator> collision = - strict_events.equal_range(*epos); - for(TEventSet::iterator cpos = collision.first; + std::pair<TMultiEventSet::iterator, TMultiEventSet::iterator> collision = + multi_events.equal_range(*epos); + for(TMultiEventSet::iterator cpos = collision.first; cpos != collision.second; cpos++) { this_shapelist << vsoPage->Shapes->ItemFromID[cpos->shape_id]; } - PrintError(stringize() << page_name << ": " << "Multiple events cannot be attached to one point.", - this_shapelist << instance); + PrintError(stringize() << page_name << ": " + << "Multiple events cannot be attached to one point.", + this_shapelist << instance); } } Modified: trunk/src/view/visio/addon/extract.h =================================================================== --- trunk/src/view/visio/addon/extract.h 2013-11-26 14:27:03 UTC (rev 1873) +++ trunk/src/view/visio/addon/extract.h 2013-11-27 22:59:00 UTC (rev 1874) @@ -135,6 +135,10 @@ //! get coordinates of the given Connect element SPoint get_connect_point(Visio::IVConnectPtr connect); + + // get coordinates of the given element, use only for order elements (line,arrow) + SPoint get_conpoint_order(Visio::IVShapePtr coregion, Visio::IVConnectPtr connect); + SPoint point_to_page(Visio::IVShapePtr shape, const SPoint& point); Coordinate ConvertCoordinate(Visio::IVShapePtr shape, double val) const Modified: trunk/src/view/visio/addon/shapeutils.cpp =================================================================== --- trunk/src/view/visio/addon/shapeutils.cpp 2013-11-26 14:27:03 UTC (rev 1873) +++ trunk/src/view/visio/addon/shapeutils.cpp 2013-11-27 22:59:00 UTC (rev 1874) @@ -20,6 +20,65 @@ #include "visualize.h" #include "enumerateUtils.h" +void CShapeUtils::GlueBeginConector(Visio::IVShapePtr connector, Visio::IVShapePtr coreg, const MscPoint& point) +{ + double pos_x=0, pos_y = 0; + short row_index = 0; + // check all messages on coregion, whether they are + for(int i=1; i <= coreg->FromConnects->Count;i++) + { + Visio::IVConnectPtr connect = coreg->FromConnects->Item[i]; + // shape connected to this point + Visio::IVShapePtr shp = connect->FromSheet; + + TShapeType type = get_shape_type(shp); + if((type == ST_BMSC_MESSAGE || type == ST_BMSC_MESSAGE_FOUND || + type == ST_BMSC_MESSAGE_LOST) && get_shape_type(connect->ToSheet) == ST_BMSC_COREGION) + { + row_index = connect->ToCell->ContainingRow->Index; + pos_x = coreg->CellsSRC[visSectionConnectionPts][row_index][visX]->Result[70]; + pos_y = coreg->CellsSRC[visSectionConnectionPts][row_index][visY]->Result[70]; + if(fabs(pos_x - point.get_y()) < 0.01 && fabs(pos_y - point.get_x()) < 0.01) + { + // get cell from connector + Visio::IVCellPtr cell = connector->CellsSRC[visSectionObject][visRowXForm1D][vis1DBeginX]; + cell->GlueTo(connect->FromCell); + break; + } + } + } +} + +void CShapeUtils::GlueEndConector(Visio::IVShapePtr connector, Visio::IVShapePtr coreg, const MscPoint& point) +{ + double pos_x=0, pos_y = 0; + short row_index = 0; + // check all messages on coregion, whether they are + for(int i=1; i <= coreg->FromConnects->Count;i++) + { + Visio::IVConnectPtr connect = coreg->FromConnects->Item[i]; + // shape connected to this point + Visio::IVShapePtr shp = connect->FromSheet; + + TShapeType type = get_shape_type(shp); + if((type == ST_BMSC_MESSAGE || type == ST_BMSC_MESSAGE_FOUND || + type == ST_BMSC_MESSAGE_LOST) && get_shape_type(connect->ToSheet) == ST_BMSC_COREGION) + { + row_index = connect->ToCell->ContainingRow->Index; + pos_x = coreg->CellsSRC[visSectionConnectionPts][row_index][visX]->Result[70]; + pos_y = coreg->CellsSRC[visSectionConnectionPts][row_index][visY]->Result[70]; + if(fabs(pos_x - point.get_y()) < 0.01 && fabs(pos_y - point.get_x()) < 0.01) + { + // get cell from connector + Visio::IVCellPtr cell = connector->CellsSRC[visSectionObject][visRowXForm1D][vis1DEndX]; + cell->GlueTo(connect->FromCell); + break; + } + } + } +} + + void CShapeUtils::GlueBeginToPos(Visio::IVShapePtr what, Visio::IVShapePtr where, const MscPoint& pos) { double height = where->CellsSRC[visSectionObject][visRowXFormOut][visXFormHeight]->Result[visMillimeters]; @@ -296,6 +355,29 @@ return false; } +bool CShapeUtils::isPointOnCoregionSide(const MscPoint& point, Visio::IVShapePtr coregShape) +{ + double coregBegX, coregEndX, coregBegY, coregEndY; + + double dif = CShapeUtils::getCoregionHeight(coregShape); + coregBegX = CShapeUtils::getShapeCell(coregShape, "BeginX") - dif; + coregEndX = CShapeUtils::getShapeCell(coregShape, "EndX") + dif; + coregBegY = CShapeUtils::getShapeCell(coregShape, "BeginY"); + coregEndY = CShapeUtils::getShapeCell(coregShape, "EndY"); + + //check if MscPoint lies on one of the coregion's sides + bool x_coordinate = false, y_coordinate = false; + x_coordinate = fabs(point.get_x() - coregBegX) < 0.01 || fabs(point.get_x() - coregEndX) < 0.01; + y_coordinate = point.get_y() <= coregBegY && point.get_y() >= coregEndY; + + if(x_coordinate && y_coordinate) + return true; + + return false; +} + + + bool CShapeUtils::isPointOnCoregion(const MscPoint& point, Visio::IVShapePtr instShape) { double coregBegX, coregEndX, coregBegY, coregEndY; Modified: trunk/src/view/visio/addon/shapeutils.h =================================================================== --- trunk/src/view/visio/addon/shapeutils.h 2013-11-26 14:27:03 UTC (rev 1873) +++ trunk/src/view/visio/addon/shapeutils.h 2013-11-27 22:59:00 UTC (rev 1874) @@ -42,6 +42,9 @@ static void GlueBeginToShape(Visio::IVShapePtr what, Visio::IVShapePtr where); static void GlueEndToPos(Visio::IVShapePtr what, Visio::IVShapePtr where, const MscPoint& pos); + static void GlueBeginConector(Visio::IVShapePtr connector, Visio::IVShapePtr coreg, const MscPoint& point); + static void GlueEndConector(Visio::IVShapePtr connector, Visio::IVShapePtr coreg, const MscPoint& point); + /** * Marking, unmarking shapes * @@ -75,6 +78,11 @@ static bool isPointInCoregionArea(const MscPoint& point, Visio::IVShapePtr instShape); /** + * Check if point lies on some side of given coregion + */ + static bool isPointOnCoregionSide(const MscPoint& point, Visio::IVShapePtr coregShape); + + /** * */ static bool isPointOnInstancesLine(const MscPoint& point, Visio::IVShapePtr instShape,VisUnitCodes units = visPageUnits); Modified: trunk/src/view/visio/addon/visualize.cpp =================================================================== --- trunk/src/view/visio/addon/visualize.cpp 2013-11-26 14:27:03 UTC (rev 1873) +++ trunk/src/view/visio/addon/visualize.cpp 2013-11-27 22:59:00 UTC (rev 1874) @@ -408,8 +408,8 @@ else connector = vsoPage->Drop(find_master(ST_BMSC_ORDER_LINE), 0, 0); - CShapeUtils::GlueBeginToPos(connector, parent, pred_event->get_position()); - CShapeUtils::GlueEndToPos(connector, parent, succ_event->get_position()); + CShapeUtils::GlueBeginConector(connector, parent, pred_event->get_position()); + CShapeUtils::GlueEndConector(connector, parent, succ_event->get_position()); // events are on the same side if(fcmp(pred_event->get_position().get_x(), succ_event->get_position().get_x()) == 0) @@ -609,7 +609,20 @@ for(CoregEventRelPtrVector::const_iterator spos = rels.begin(); spos != rels.end(); spos++) { EventPtr 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<EventPtr>(event_stack, successor); + } + } + //create connections as ordering lines and arrows + for(EventPtrList::const_iterator epos = event_stack.begin(); epos != event_stack.end(); epos++) + { + CoregEventRelPtrVector rels = coregion_area->get_successor_rels(epos->get()); + for(CoregEventRelPtrVector::const_iterator spos = rels.begin(); spos != rels.end(); spos++) + { + EventPtr successor = (*spos)->get_successor(); + Visio::IVShapePtr connector = connect_events(vsoPage, coregion, *epos, successor); switch((*spos)->get_marked()) @@ -620,10 +633,6 @@ case REMOVED: CShapeUtils::MarkShape(connector, SC_RED); break; default: throw std::runtime_error("Error: unexpected behaviour"); } - - // add successors of this event to the stack - // note: std::list<>::push_back doesn't invalidate iterators - push_back_if_unique<EventPtr>(event_stack, successor); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |