예제 #1
0
        /// <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);
        }
예제 #2
0
파일: D2dUtil.cs 프로젝트: Joxx0r/ATF
        /// <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);
        }