|
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.
|