public GOM_Link(System.Xml.XmlNode node, GOM_ResourceArrays resources) { m_startStyle = GOMLib.GOM_Terminal_Style.None; m_endStyle = GOMLib.GOM_Terminal_Style.Triangle; m_drawingStyle = new GOMLib.GOM_Style_Drawing(); m_linkingStyle = GOM_Linking_Style.Line; m_keyPts = new GOM_Points(); m_drawingStyle.id = "default"; LoadFromXML(node, resources); }
public GOM_Link(GOM_Interface_Graphic_Object startObj, GOM_Point startPt, GOM_Interface_Graphic_Object endObj, GOM_Point endPt, GOM_Style_Drawing drawingStyle, GOM_Linking_Style linkingStyle, GOM_Terminal_Style startStyle, GOM_Terminal_Style endStyle) { m_startObj = startObj; m_endObj = endObj; m_startPt = startPt; m_endPt = endPt; m_startStyle = startStyle; m_endStyle = endStyle; m_drawingStyle = drawingStyle; m_linkingStyle = linkingStyle; m_keyPts = new GOM_Points(); m_drawingStyle.id = "default"; }
/// <summary> /// Draws link's terminal ponit. /// </summary> /// <param name="canvas"></param> /// <param name="style"></param> /// <param name="pt1"></param> /// <param name="pt2"></param> private void DrawTerminal(System.Drawing.Graphics canvas, GOM_Terminal_Style style, System.Drawing.PointF pt1, System.Drawing.PointF pt2) { System.Drawing.Drawing2D.Matrix matrix; float angle; angle = (float)(System.Math.Atan2(pt2.Y - pt1.Y, pt2.X - pt1.X) / System.Math.PI) * 180; matrix = canvas.Transform; canvas.TranslateTransform(pt1.X, pt1.Y); canvas.RotateTransform(angle); switch (style) { case GOM_Terminal_Style.Circle: { canvas.FillEllipse(new System.Drawing.SolidBrush(m_drawingStyle.drawingStyle.Color), -5, -5, 10, 10); break; } case GOM_Terminal_Style.Arrow: { canvas.DrawLine(m_drawingStyle.drawingStyle, 0, 0, 10, 5); canvas.DrawLine(m_drawingStyle.drawingStyle, 0, 0, 10, -5); break; } case GOM_Terminal_Style.Triangle: { System.Drawing.Point[] rgPts; rgPts = new System.Drawing.Point[3]; rgPts[0].X = 0; rgPts[0].Y = 0; rgPts[1].X = 10; rgPts[1].Y = 5; rgPts[2].X = 10; rgPts[2].Y = -5; canvas.FillPolygon(new System.Drawing.SolidBrush(m_drawingStyle.drawingStyle.Color), rgPts); break; } case GOM_Terminal_Style.Diamond: { System.Drawing.Point[] rgPts; rgPts = new System.Drawing.Point[4]; rgPts[0].X = 0; rgPts[0].Y = 0; rgPts[1].X = 5; rgPts[1].Y = 5; rgPts[2].X = 10; rgPts[2].Y = 0; rgPts[3].X = 5; rgPts[3].Y = -5; canvas.FillPolygon(new System.Drawing.SolidBrush(m_drawingStyle.drawingStyle.Color), rgPts); break; } } canvas.Transform = matrix; }
/// <summary> /// Load the link from XmlNode. /// </summary> /// <param name="node">The XmlNode.</param> /// <param name="resources">GOM resource.</param> public void LoadFromXML(System.Xml.XmlNode node, GOM_ResourceArrays resources) { GOM_Utility.VerifyXmlNode(node, GOM_TAGS.CONNECTION); for( int i=0; i<node.Attributes.Count; i++ ) { // if ( string.Compare(node.Attributes[i].Name,GOM_TAGS.DRAWING_STYLE) == 0 ) // { // this.m_drawingStyle = resources.DrawingStyles[node.Attributes[i].Value]; // } if ( string.Compare(node.Attributes[i].Name,GOM_TAGS.LINKING_STYLE) == 0 ) { this.m_linkingStyle = ConvertStringToLinkingStyle(node.Attributes[i].Value); } } GOM_Utility.VerifyXmlNode(node.ChildNodes[0], GOM_TAGS.POINT); GOM_Utility.VerifyXmlNode(node.ChildNodes[1], GOM_TAGS.POINT); // 1st pass // objectID for( int i=0; i<node.ChildNodes[0].Attributes.Count; i++ ) { if ( string.Compare(node.ChildNodes[0].Attributes[i].Name, GOM_TAGS.OBJECTID) == 0 ) { this.m_startObj = GOM_Utility.RecursiveFindObject(node.ChildNodes[0].Attributes[i].Value, resources.Objects); } } for( int i=0; i<node.ChildNodes[1].Attributes.Count; i++ ) { if ( string.Compare(node.ChildNodes[1].Attributes[i].Name, GOM_TAGS.OBJECTID) == 0 ) { this.m_endObj = GOM_Utility.RecursiveFindObject(node.ChildNodes[1].Attributes[i].Value, resources.Objects); } } if ( m_startObj==null || m_endObj==null ) { throw new System.Xml.XmlException("Missing points in the connection."); } // if ( !(m_startObj is GOM_Object_Primitive) || !(m_endObj is GOM_Object_Primitive) ) // { // throw new System.Xml.XmlException("Terminal points' objects are not all primitives."); // } // 2nd pass // pointID // terminalStyle for( int i=0; i<node.ChildNodes[0].Attributes.Count; i++ ) { if ( string.Compare(node.ChildNodes[0].Attributes[i].Name, GOM_TAGS.POINTID) == 0 ) { this.m_startPt = m_startObj.GetPointByName(node.ChildNodes[0].Attributes[i].Value); } if ( string.Compare(node.ChildNodes[0].Attributes[i].Name, GOM_TAGS.TERMINAL_STYLE) == 0 ) { this.m_startStyle = ConvertStringToTerminalStyle(node.ChildNodes[0].Attributes[i].Value); } } for( int i=0; i<node.ChildNodes[1].Attributes.Count; i++ ) { if ( string.Compare(node.ChildNodes[1].Attributes[i].Name, GOM_TAGS.POINTID) == 0 ) { this.m_endPt = m_endObj.GetPointByName(node.ChildNodes[1].Attributes[i].Value); } if ( string.Compare(node.ChildNodes[1].Attributes[i].Name, GOM_TAGS.TERMINAL_STYLE) == 0 ) { this.m_endStyle = ConvertStringToTerminalStyle(node.ChildNodes[1].Attributes[i].Value); } } if ( m_startPt==null || m_endPt==null ) { throw new System.Xml.XmlException("Cannot find find terminal points."); } // Drawing style this.m_drawingStyle.LoadFromXML( node.ChildNodes[2], resources ); // Key points GOM_Utility.VerifyXmlNode(node.ChildNodes[3], GOM_TAGS.KEYPOINTS); for(int i=0; i<node.ChildNodes[3].ChildNodes.Count; i++ ) { if ( string.Compare(node.ChildNodes[3].ChildNodes[i].Name, GOM_TAGS.POINT, true) == 0 ) { GOM_Point keyPoint = new GOM_Point(); for(int j=0; j<node.ChildNodes[3].ChildNodes[i].Attributes.Count; j++ ) { if ( string.Compare(node.ChildNodes[3].ChildNodes[i].Attributes[j].Name, GOM_TAGS.X, true) == 0 ) { keyPoint.x = float.Parse(node.ChildNodes[3].ChildNodes[i].Attributes[j].Value); } if ( string.Compare(node.ChildNodes[3].ChildNodes[i].Attributes[j].Name, GOM_TAGS.Y, true) == 0 ) { keyPoint.y = float.Parse(node.ChildNodes[3].ChildNodes[i].Attributes[j].Value); } } m_keyPts.Add(keyPoint); } } }
/// <summary> /// Convert the TerminalStyle to a string. /// </summary> /// <param name="terminalStyle">The TermianlStyel.</param> /// <returns>A string.</returns> public string ConvertTerminalStyleToString( GOM_Terminal_Style terminalStyle ) { switch(terminalStyle) { case GOM_Terminal_Style.None: return "none"; case GOM_Terminal_Style.Circle: return "circle"; case GOM_Terminal_Style.Arrow: return "arrow"; case GOM_Terminal_Style.Triangle: return "triangle"; case GOM_Terminal_Style.Diamond: return "diamond"; } throw new ArgumentException("Unknown TerminalStyle["+terminalStyle.ToString()+"]."); }