Files
OxyPlot/Source/Examples/ExampleGenerator/Program.cs
2023-09-02 09:24:59 +02:00

166 lines
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using ExampleLibrary;
using OxyPlot;
using OxyPlot.WindowsForms;
namespace ExampleGenerator
{
public static class Program
{
private static readonly OxyColor defaultBackground = OxyColor.Parse("#00000000");
public static string OutputDirectory { get; set; }
public static bool DoOptimizePng { get; set; }
public static bool ExportPng { get; set; }
public static bool ExportPdf { get; set; }
public static bool ExportSvg { get; set; }
public static void Main(string[] args)
{
ExportPng = true;
ExportPdf = true;
ExportSvg = true;
//DoOptimizePng = true;
OutputDirectory = @".";
if (args.Length > 0)
{
OutputDirectory = args[0];
}
var exportTasks = new List<Task>();
var exampleAssembly = typeof(DocumentationExampleAttribute).Assembly;
foreach (var type in exampleAssembly.GetTypes())
{
foreach (var method in type.GetMethods(BindingFlags.Static | BindingFlags.Public))
{
var exportAttribute = method.GetCustomAttribute<DocumentationExampleAttribute>();
if (exportAttribute == null)
{
continue;
}
var model = (PlotModel)method.Invoke(null, null);
var exportTask = Export(model, exportAttribute.Filename.Replace('/', Path.DirectorySeparatorChar));
exportTasks.Add(exportTask);
}
}
//Wait for exports to finish
Task.WaitAll(exportTasks.ToArray());
}
private static async Task Export(PlotModel model, string name)
{
if (model.Background == defaultBackground)
model.Background = OxyColors.White;
var fileName = Path.Combine(OutputDirectory, name + ".png");
var directory = Path.GetDirectoryName(fileName) ?? ".";
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
if (ExportPng)
{
Console.WriteLine(fileName);
using (var stream = File.Create(fileName))
{
var exporter = new PngExporter { Width = 600, Height = 400 };
exporter.Export(model, stream);
}
if (DoOptimizePng)
await OptimizePng(fileName);
}
if (ExportPdf)
{
fileName = Path.ChangeExtension(fileName, ".pdf");
Console.WriteLine(fileName);
using (var stream = File.Create(fileName))
{
var exporter = new PdfExporter { Width = 600d * 72 / 96, Height = 400d * 72 / 96 };
exporter.Export(model, stream);
}
}
if (ExportSvg)
{
fileName = Path.ChangeExtension(fileName, ".svg");
Console.WriteLine(fileName);
using (var stream = File.Create(fileName))
{
using (var exporter = new OxyPlot.WindowsForms.SvgExporter { Width = 600, Height = 400, IsDocument = true })
{
exporter.Export(model, stream);
}
}
}
}
/* PNG Optimization */
private static async Task OptimizePng(string pngFile)
{
if (Environment.OSVersion.Platform == PlatformID.Unix)
{
await OptimizePngWithOptiPNG(pngFile);
}
else
{
await OptimizePngWithTruePNG(pngFile);
}
}
private static async Task OptimizePngWithTruePNG(string pngFile)
{
// /o max : optimization level
// /nc : don't change ColorType and BitDepth
// /md keep pHYs : keep pHYs metadata
var psi = new ProcessStartInfo("TruePNG.exe", pngFile + " /o max /nc /md keep pHYs")
{
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
};
try
{
var p = Process.Start(psi);
await Task.Run(() => p.WaitForExit());
}
catch (Win32Exception e)
{
throw new Win32Exception(
"Failed to run TruePNG optimization. Please ensure that TruePNG is installed and registered in the PATH variable.",
e);
}
}
private static async Task OptimizePngWithOptiPNG(string pngFile)
{
var psi = new ProcessStartInfo("optipng", "-o7 " + pngFile)
{
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
};
var p = Process.Start(psi);
await Task.Run(() => p.WaitForExit());
}
}
}