/// <summary> /// Retrieves the data to be plotted for the edge.</summary> /// <param name="render">The render to retrieve the data for.</param> /// <param name="worldOffset">Current world offset of the render when drawing this edge.</param> /// <param name="g">Graphics object</param> /// <returns>The data to plot for the edge.</returns> /// <remarks>The data is returned in world space</remarks> IEnumerable <EdgeStyleData> IEdgeStyleProvider.GetData(DiagramRenderer render, Point worldOffset, D2dGraphics g) { var circuitRender = render as D2dCircuitRenderer <TElement, TWire, TPin>; var dataPoints = GetGroupPinChainData(circuitRender, worldOffset, g); IEnumerable <EdgeStyleData> result = EmptyEnumerable <EdgeStyleData> .Instance; if (EdgeStyle == EdgeStyle.DirectCurve) { // skip group pin positions where group pins are hidden var visiblePoints = dataPoints.Where( pt => pt.Group == null || !pt.Group.Expanded || pt.Group.Info.ShowExpandedGroupPins).ToArray(); var curves = new EdgeStyleData[visiblePoints.Length - 1]; for (int i = 0; i < visiblePoints.Length - 1; ++i) { var bezier = SetupBezierCurve(visiblePoints[i].Pos, visiblePoints[i + 1].Pos); var edgeData = new EdgeStyleData { ShapeType = EdgeStyleData.EdgeShape.Bezier, EdgeData = bezier, }; curves[i] = edgeData; } result = curves; } else if (EdgeStyle == EdgeStyle.Default) { var curves = new EdgeStyleData[dataPoints.Count - 1]; for (int i = 0; i < dataPoints.Count - 1; ++i) { var bezier = SetupBezierCurve(dataPoints[i].Pos, dataPoints[i + 1].Pos); var edgeData = new EdgeStyleData { ShapeType = EdgeStyleData.EdgeShape.Bezier, EdgeData = bezier, }; curves[i] = edgeData; } result = curves; } else if (EdgeStyle == EdgeStyle.Polyline) { var polyline = new EdgeStyleData(); var lines = new PointF[dataPoints.Count]; for (int v = 0; v < dataPoints.Count; ++v) { lines[v] = dataPoints[v].Pos; } polyline.ShapeType = EdgeStyleData.EdgeShape.Polyline; polyline.EdgeData = lines; result = new[] { polyline }; } return(result); }
/// <summary> /// Draws an icon that indicates a linked (referenced) item</summary> /// <param name="g">The Direct2D graphics object</param> /// <param name="x">X coordinate of icon top left corner</param> /// <param name="y">Y coordinate of icon top left corner</param> /// <param name="size">Size of expander, in pixels</param> /// <param name="brush">Brush</param> public static void DrawLink(this D2dGraphics g, float x, float y, float size, D2dBrush brush) { var path = new EdgeStyleData[5]; var pathData = new PointF[16]; for (int i = 0; i < 16; ++i) { pathData[i] = new PointF(s_unitCurvedArrowData[i].X * size + x, s_unitCurvedArrowData[i].Y * size + y); } var edgeData = new EdgeStyleData { ShapeType = EdgeStyleData.EdgeShape.Line, EdgeData = new PointF[] { pathData[0], pathData[1], pathData[2], pathData[3] } }; path[0] = edgeData; edgeData = new EdgeStyleData { ShapeType = EdgeStyleData.EdgeShape.Bezier, EdgeData = new BezierCurve2F(pathData[3], pathData[4], pathData[5], pathData[6]) }; path[1] = edgeData; edgeData = new EdgeStyleData { ShapeType = EdgeStyleData.EdgeShape.Bezier, EdgeData = new BezierCurve2F(pathData[6], pathData[7], pathData[8], pathData[9]) }; path[2] = edgeData; edgeData = new EdgeStyleData { ShapeType = EdgeStyleData.EdgeShape.Bezier, EdgeData = new BezierCurve2F(pathData[9], pathData[10], pathData[11], pathData[12]) }; path[3] = edgeData; edgeData = new EdgeStyleData { ShapeType = EdgeStyleData.EdgeShape.Bezier, EdgeData = new BezierCurve2F(pathData[12], pathData[13], pathData[14], pathData[15]) }; path[4] = edgeData; g.FillPath(path, brush); }