public Image GetImage(int pixelWidth, int pixelHeight, int contextId) { _viewMode = (ViewMode)contextId; Image image; if (_useTimeline && _viewMode.HasFlag(ViewMode.TimelineFlag)) { // Draw the timeline itself Viewport viewport = new Viewport(pixelWidth, pixelHeight, 0f, 1f, -2f, 2f); image = _timeline.Draw(viewport); } else { // Draw painting image = this.Draw(pixelWidth, pixelHeight); } _viewMode = default(ViewMode); return(image); }
public Image Draw(int pixelWidth, int pixelHeight) { //!!! always recreate viewport ? float x0 = 0f; float x1 = _viewMode.HasFlag(ViewMode.Logarithmic) ? _itemCountPow : 1f; Viewport viewport = new Viewport( pixelWidth, pixelHeight, x0, x1, -1f, 2f, yUp: true ); float boundX = viewport.GetUserBounds()[1].X; Image image = new Image(viewport); // recreate image // fill blank image.Rectangle(viewport.GetUserBounds()) .Add() .FillStroke(Color.White, Color.Empty); if (_items == null) { return(image); } var groupLines = image.Group().Add(); var groupCircles = image.Group().Add(); var groupNumbers = image.Group().Add(); foreach (Item item in _items) { if (item.parent != null && item.parent.parent != null) { if (item.parent.pos.x == 0f || item.parent.pos.x > boundX) { //continue; } } item.pos = GetPos(item); var viewPos = GetViewPos(item.pos); float radius = GetViewRadius(item); if (item.parent != null) { // draw segment-line from the parent int segmentCount = item.parent.parent == null ? 100 : 10; //int segmentCount = 1; var points = Enumerable.Range(0, segmentCount + 1) .Select(j => GetPos(item, (double)j / segmentCount)) .Select(p => GetViewPos(p)) .ToArray(); image.Line(points) .Add(groupLines) .FillStroke(Color.Empty, Color.Gray, strokeWidth: radius * 0.1f); } image.Circle(viewPos, radius) .Add(groupCircles) .FillStroke(Color.Gray, Color.Empty); string text = item.integer.ToString(); //if (item.parent != null) text = item.parent.integer.ToString() + "->" + text; image.Text(viewPos, text, radius, align: Image.Align.Center, centerHeight: true) .Add(groupNumbers) .FillStroke(Color.Black, Color.Empty); } return(image); }