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(); }
private static string GetRendererFormatArgument(RendererFormats format) { switch (format) { case RendererFormats.Png: return "-Tpng"; case RendererFormats.Svg: return "-Tsvg"; default: throw new ArgumentOutOfRangeException("format"); } }
private static string GetRendererFormatArgument(RendererFormats format) { switch (format) { case RendererFormats.Png: return("-Tpng"); case RendererFormats.Svg: return("-Tsvg"); default: throw new ArgumentOutOfRangeException("format"); } }
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(); } } } }); }
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); }
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(); }