Exemple #1
0
        public Types.Rectangle GetBounds( Renderers.Renderer renderer )
        {
            if( _bounds == null )
            {
                _bounds = CalculateBounds( renderer );

                if( _bounds == null )
                {
                    throw new InvalidOperationException();
                }
            }
            return _bounds;
        }
Exemple #2
0
 public BoundsMarker( Types.Rectangle rectangle )
 {
     _rectangle = rectangle;
 }
 internal PrimitivesVisitor( GdiPlusRenderer renderer, Graphics g, Types.Rectangle clip )
 {
     _renderer = renderer;
     _graphics = g;
     _clip = clip;
 }
            private bool InClip( Primitives.VisualItem item )
            {
                if( _clip == null )
                {
                    return true;
                }

                PointF tl = new PointF( (float) _clip.Left, (float) _clip.Top );
                PointF br = new PointF( (float) _clip.Right, (float) _clip.Bottom );
                PointF[] pts = new PointF[] { tl, br };

                _graphics.TransformPoints( CoordinateSpace.World, CoordinateSpace.Device, pts );

                Types.Rectangle clip = new Types.Rectangle( pts[0].X, pts[0].Y, pts[1].X - pts[0].X, pts[1].Y - pts[0].Y );

                return Types.Rectangle.Overlap( item.GetBounds( _renderer ), clip );
            }
Exemple #5
0
        public Primitives.Container Create( IData data, Settings settings )
        {
            if( data == null )
            {
                throw new ArgumentNullException( "data" );
            }
            if( settings == null )
            {
                throw new ArgumentNullException( "settings" );
            }
            if( data.ColumnCount < 2 )
            {
                throw new ArgumentException( "Line data must have at least two columns.", "data" );
            }

            Primitives.Container container = new Primitives.Container();

            Primitives.BoundsMarker bounds = new Primitives.BoundsMarker( new Types.Rectangle( 0, 0, settings.Width, settings.Height ) );

            bounds.Style.Add( "GraphContainer" );

            container.AddBack( bounds );

            Primitives.Container lines = new Primitives.Container();

            double minHorzData = double.MaxValue;
            double maxHorzData = double.MinValue;

            for( int i = 0; i < data.RowCount; ++i )
            {
                double v = data[i, 0];

                minHorzData = Math.Min( minHorzData, v );
                maxHorzData = Math.Max( maxHorzData, v );
            }

            double minVertData = double.MaxValue;
            double maxVertData = double.MinValue;

            for( int i = 0; i < data.RowCount; ++i )
            {
                for( int j = 1; j < data.ColumnCount; ++j )
                {
                    double v = data[i, j];

                    minVertData = Math.Min( minVertData, v );
                    maxVertData = Math.Max( maxVertData, v );
                }
            }

            if( maxVertData == minVertData )
            {
                maxVertData = minVertData + 1;
            }

            double maxExtent = Math.Max( settings.Width, settings.Height);
            double textHeight = 2;
            double border = 20;
            Types.Rectangle visibleArea = new Types.Rectangle( border, border, settings.Width - border * 2, settings.Height - border * 2 - textHeight );
            double zero = visibleArea.Bottom + minVertData / (maxVertData - minVertData) * visibleArea.Height;

            for( int col = 1; col < data.ColumnCount; ++col )
            {
                Primitives.Container line = new Primitives.Container();

                List<Types.Point> points = new List<Types.Point>();
                List<Primitives.Path.Command> pathCommands = new List<Primitives.Path.Command>();

                pathCommands.Add( new Primitives.Path.Move( new Types.Point( visibleArea.X, zero ) ) );

                for( int row = 0; row < data.RowCount; ++row )
                {
                    double y = data[row, col];
                    double x = data[row, 0];

                    x = visibleArea.X + (x - minHorzData) / (maxHorzData - minHorzData) * visibleArea.Width;
                    y = visibleArea.Bottom - (y - minVertData) / (maxVertData - minVertData) * visibleArea.Height;

                    Primitives.Path.Command pathCommand = new Primitives.Path.Line( new Types.Point( x, y ) );

                    pathCommands.Add( pathCommand );
                }

                pathCommands.Add( new Primitives.Path.Line( new Types.Point( visibleArea.Right, zero ) ) );
                pathCommands.Add( new Primitives.Path.Close() );

                Primitives.Path path = new Primitives.Path( pathCommands.ToArray() );

                path.Style.Add( "GraphPiece" );
                path.Style.AddExtra( "RowIndex", (col - 1).ToString() );
                path.Style.AddExtra( "RowCount", (data.ColumnCount - 1).ToString() );

                line.AddBack( path );

                lines.AddBack( line );
            }

            container.AddBack( lines );

            double available = settings.Height - visibleArea.Bottom;

            for( int i = 0; i < data.RowCount; ++i )
            {
                string label = data.GetRowExtra( i, "LABEL", null );

                if( label != null )
                {
                    double x = data[i, 0];

                    x = visibleArea.X + (x - minHorzData) / (maxHorzData - minHorzData) * visibleArea.Width;

                    Primitives.Text text = new Primitives.Text( label, new Types.Point( x, visibleArea.Bottom + available / 5 ), Primitives.Text.Position.TopCenter );

                    text.FontSizePoints = textHeight / 2;
                    text.Style.Add( "GraphText" );

                    container.AddBack( text );
                }
            }

            return container;
        }
Exemple #6
0
        internal void DirtyBounds()
        {
            _bounds = null;

            if( Parent != null )
            {
                Parent.DirtyBounds();
            }
        }