Example #1
0
 public async Task RunAsync(Graph graph, Stream outputStream, RendererLayouts layout, RendererFormats format, CancellationToken cancellationToken)
 {
     cancellationToken.ThrowIfCancellationRequested();
     var fileName = Path.Combine(graphvizBin, GetRendererLayoutExecutable(layout));
     var arguments = GetRendererFormatArgument(format);
     var startInfo = new ProcessStartInfo
     {
         FileName = fileName,
         Arguments = arguments,
         UseShellExecute = false,
         CreateNoWindow = true,
         RedirectStandardInput = true,
         RedirectStandardOutput = true,
         RedirectStandardError = true
     };
     var tcs = new TaskCompletionSource<object>();
     using (var process = Process.Start(startInfo))
     {
         cancellationToken.ThrowIfCancellationRequested();
         cancellationToken.Register(() =>
         {
             tcs.TrySetCanceled();
             process.CloseMainWindow();
         });
         using (var standardInput = process.StandardInput)
         {
             graph.WriteTo(standardInput);
         }
         using (var standardOutput = process.StandardOutput)
         {
             await Task.WhenAny(tcs.Task, standardOutput.BaseStream.CopyToAsync(outputStream, 4096, cancellationToken));
         }
     }
     cancellationToken.ThrowIfCancellationRequested();
 }
Example #2
0
 private static string GetRendererFormatArgument(RendererFormats format)
 {
     switch (format)
     {
         case RendererFormats.Png:
             return "-Tpng";
         case RendererFormats.Svg:
             return "-Tsvg";
         default:
             throw new ArgumentOutOfRangeException("format");
     }
 }
Example #3
0
        private static string GetRendererFormatArgument(RendererFormats format)
        {
            switch (format)
            {
            case RendererFormats.Png:
                return("-Tpng");

            case RendererFormats.Svg:
                return("-Tsvg");

            default:
                throw new ArgumentOutOfRangeException("format");
            }
        }
Example #4
0
        private async Task Render(Graph graph, string filenameParameter, RendererFormats renderFormat)
        {
            var filenameWithoutExtension = Path.GetFileNameWithoutExtension(filenameParameter);
            var filename = string.Format("{0}.{1}", filenameWithoutExtension, renderFormat);

            await Task.Run(() => {
                lock (this.locker)
                {
                    if (File.Exists(filename))
                    {
                        File.Delete(filename);
                    }

                    using (var renderer = new Renderer(graphvizbin))
                    {
                        using (var file = File.Create(filename))
                        {
                            renderer.RunAsync(graph, file, Shields.GraphViz.Services.RendererLayouts.Dot, (Shields.GraphViz.Services.RendererFormats)renderFormat, CancellationToken.None).Wait();
                        }
                    }
                }
            });
        }
Example #5
0
        public async Task WriteFile(IEnumerable <IUIPerson> persons, string filename, RendererFormats renderFormat, bool transparent = true)
        {
            persons = persons.Where(x => !x.IsHidden).ToList();
            persons = persons.OrderByDescending(x => x.Parents.Count);

            List <IWriteTo> statements = new List <IWriteTo>();

            foreach (var person in persons)
            {
                var personNodeDict = new Dictionary <Id, Id> {
                    { "label", person.Label }, { "shape", "box" }, { "color", person.IsFemale ? "pink" : "blue" }, { "fillcolor", "white" }, { "style", "filled" }
                }.ToImmutableDictionary();
                var personNode = new NodeStatement(person.Id.ToString(), personNodeDict);

                var partners = person.Partners.Where(x => !x.IsHidden);
                partners = partners.OrderByDescending(x => x.Parents.Count);
                foreach (var partner in partners)
                {
                    this.AddPartner(ref statements, person, personNode, partner);
                }

                if (IsSingleParent(person, partners))
                {
                    this.AddChildren(ref statements, person, personNode, person.Children);
                }
            }

            var statementsImmutable = statements.ToImmutableList <IWriteTo>();
            var graph = new Graph(GraphKinds.Directed, "genealogy", statementsImmutable);

            graph = graph.Add(AttributeStatement.Graph.Set("rankdir", "TB"));
            graph = graph.Add(AttributeStatement.Graph.Set("nodesep", "0.5"));
            graph = graph.Add(AttributeStatement.Graph.Set("splines", "false"));

            if (transparent)
            {
                graph = graph.Add(AttributeStatement.Graph.Set("bgcolor", "transparent"));
            }

            await this.Render(graph, filename, renderFormat);
        }
Example #6
0
        public async Task RunAsync(Graph graph, Stream outputStream, RendererLayouts layout, RendererFormats format, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            var fileName  = Path.Combine(graphvizBin, GetRendererLayoutExecutable(layout));
            var arguments = GetRendererFormatArgument(format);
            var startInfo = new ProcessStartInfo
            {
                FileName               = fileName,
                Arguments              = arguments,
                UseShellExecute        = false,
                CreateNoWindow         = true,
                RedirectStandardInput  = true,
                RedirectStandardOutput = true,
                RedirectStandardError  = true
            };
            var tcs = new TaskCompletionSource <object>();

            using (var process = Process.Start(startInfo))
            {
                cancellationToken.ThrowIfCancellationRequested();
                cancellationToken.Register(() =>
                {
                    tcs.TrySetCanceled();
                    process.CloseMainWindow();
                });
                using (var standardInput = process.StandardInput)
                {
                    graph.WriteTo(standardInput);
                }
                using (var standardOutput = process.StandardOutput)
                {
                    await Task.WhenAny(tcs.Task, standardOutput.BaseStream.CopyToAsync(outputStream, 4096, cancellationToken));
                }
            }
            cancellationToken.ThrowIfCancellationRequested();
        }