public void ConvertFileToDrawingGroupWithRuntime(string filename) { var settings = new WpfDrawingSettings { IncludeRuntime = true, TextAsGeometry = false, OptimizePath = true, }; var resKeyInfo = new ResKeyInfo { Prefix = "Prefix" }; var xaml = ConverterLogic.SvgFileToXaml(filename, ResultMode.DrawingGroup, resKeyInfo, settings); Console.WriteLine(xaml); }
public void ConvertFileToDrawingGroup2() { var settings = new WpfDrawingSettings { IncludeRuntime = false, TextAsGeometry = false, OptimizePath = true, }; var resKeyInfo = new ResKeyInfo { Prefix = "Prefix" }; var xaml = ConverterLogic.SvgFileToXaml("TestFiles\\3d-view-icon.svg", ResultMode.DrawingGroup, resKeyInfo, settings); Console.WriteLine(xaml); string expected = File.ReadAllText("TestFiles\\3d-view-icon_expected.txt"); xaml.Should().Be(expected); }
public static object ConvertSvgToObject(string filepath, ResultMode resultMode, WpfDrawingSettings wpfDrawingSettings, out string name, ResKeyInfo resKeyInfo) { var dg = ConvertFileToDrawingGroup(filepath, wpfDrawingSettings); var elementName = Path.GetFileNameWithoutExtension(filepath); switch (resultMode) { case ResultMode.DrawingGroup: name = BuildDrawingGroupName(elementName, resKeyInfo); return dg; case ResultMode.DrawingImage: name = BuildDrawingImageName(elementName, resKeyInfo); return DrawingToImage(dg); default: throw new ArgumentOutOfRangeException("resultMode"); } }
public static string SvgDirToXaml(string folder, ResKeyInfo resKeyInfo) { return(SvgDirToXaml(folder, resKeyInfo, null)); }
private static void ReplaceBrushesInDrawingGroups(XElement rootElement, ResKeyInfo resKeyInfo) { //three steps of colouring: 1. global Color, 2, global ColorBrush, 3. local ColorBrush //<Color x:Key="ImagesColor1">#FF000000</Color> //<SolidColorBrush x:Key="ImagesColorBrush1" Color="{DynamicResource ImagesColor1}" /> //<SolidColorBrush x:Key="JOG_BrushColor1" Color="{Binding Color, Source={StaticResource ImagesColorBrush1}}" /> var allBrushes = CollectBrushAttributesWithColor(rootElement) .Select(a => a.Value) .Distinct(StringComparer.InvariantCultureIgnoreCase) //same Color only once .Select((s, i) => new { ResKey1 = BuildColorName(i + 1, resKeyInfo), ResKey2 = BuildColorBrushName(i + 1, resKeyInfo), Color = s }) //add numbers .ToList(); //building global Elements like: <SolidColorBrush x:Key="ImagesColorBrush1" Color="{DynamicResource ImagesColor1}" /> rootElement.AddFirst(allBrushes .Select(brush => new XElement(nsDef + "SolidColorBrush", new XAttribute(nsx + "Key", brush.ResKey2), new XAttribute("Color", $"{{DynamicResource {brush.ResKey1}}}")))); //building global Elements like: <Color x:Key="ImagesColor1">#FF000000</Color> rootElement.AddFirst(allBrushes .Select(brush => new XElement(nsDef + "Color", new XAttribute(nsx + "Key", brush.ResKey1), brush.Color))); var colorKeys = allBrushes.ToDictionary(brush => brush.Color, brush => brush.ResKey2); //building local Elements var drawingGroups = rootElement.Elements(nsDef + "DrawingGroup").ToList(); foreach (var node in drawingGroups) { //get Name of DrawingGroup var keyDg = node.Attribute(nsx + "Key").Value; var elemName = GetElemNameFromResKey(keyDg, resKeyInfo); var elemBaseName = elemName.Replace("DrawingGroup", ""); var brushAttributes = CollectBrushAttributesWithColor(node).ToList(); foreach (var brushAttribute in brushAttributes) { var color = brushAttribute.Value; string resKeyColor; if (colorKeys.TryGetValue(color, out resKeyColor)) { //global color found //build resourcename var nameBrush = brushAttributes.Count > 1 ? $"{elemBaseName}Color{brushAttributes.IndexOf(brushAttribute) + 1}Brush" : $"{elemBaseName}ColorBrush"; //dont add number if only one color var resKeyBrush = BuildResKey(nameBrush, resKeyInfo); node.AddBeforeSelf(new XElement(nsDef + "SolidColorBrush", new XAttribute(nsx + "Key", resKeyBrush), new XAttribute("Color", $"{{Binding Color, Source={BuildResKeyReference(resKeyColor, false)}}}"))); //set brush value as Reference // <GeometryDrawing Brush="{DynamicResource {x:Static nsname:Test.cloud-3-iconBrushColor}}" ... /> brushAttribute.Value = BuildResKeyReference(resKeyBrush, true); } } } }
private void ExportDirExecute() { string outFileName = Path.GetFileNameWithoutExtension(CurrentDir) + ".xaml"; var saveDlg = new SaveFileDialog {AddExtension = true, DefaultExt = ".xaml", Filter = "Xaml-File|*.xaml", InitialDirectory = CurrentDir, FileName = outFileName}; if (saveDlg.ShowDialog() == DialogResult.OK) { string namePrefix = null; bool useComponentResKeys = false; string nameSpaceName = null; var nameSpace = Microsoft.VisualBasic.Interaction.InputBox("Enter a NameSpace for using static ComponentResKeys (or leave empty to not use it)", "NameSpace"); if (!string.IsNullOrWhiteSpace(nameSpace)) { useComponentResKeys = true; nameSpaceName = Microsoft.VisualBasic.Interaction.InputBox( "Enter a Name of NameSpace for using static ComponentResKeys", "NamespaceName"); } else { namePrefix = Microsoft.VisualBasic.Interaction.InputBox("Enter a namePrefix (or leave empty to not use it)", "Name Prefix"); if (string.IsNullOrWhiteSpace(namePrefix)) namePrefix = null; } outFileName = Path.GetFullPath(saveDlg.FileName); var resKeyInfo = new ResKeyInfo { XamlName = Path.GetFileNameWithoutExtension(outFileName), Prefix = namePrefix, UseComponentResKeys = useComponentResKeys, NameSpace = nameSpace, NameSpaceName = nameSpaceName, }; File.WriteAllText(outFileName, ConverterLogic.SvgDirToXaml(CurrentDir, resKeyInfo)); BuildBatchFile(outFileName, resKeyInfo); } }
private static void ReplaceBrushesInDrawingGroups(XElement rootElement, ResKeyInfo resKeyInfo) { //three steps of colouring: 1. global Color, 2, global ColorBrush, 3. local ColorBrush //<Color x:Key="ImagesColor1">#FF000000</Color> //<SolidColorBrush x:Key="ImagesColorBrush1" Color="{DynamicResource ImagesColor1}" /> //<SolidColorBrush x:Key="JOG_BrushColor1" Color="{Binding Color, Source={StaticResource ImagesColorBrush1}}" /> var allBrushes = CollectBrushAttributesWithColor(rootElement) .Select(a => a.Value) .Distinct(StringComparer.InvariantCultureIgnoreCase) //same Color only once .Select((s, i) => new { ResKey1 = BuildColorName(i+1, resKeyInfo), ResKey2 = BuildColorBrushName(i + 1, resKeyInfo), Color = s }) //add numbers .ToList(); //building global Elements like: <SolidColorBrush x:Key="ImagesColorBrush1" Color="{DynamicResource ImagesColor1}" /> rootElement.AddFirst(allBrushes .Select(brush => new XElement(nsDef + "SolidColorBrush", new XAttribute(nsx + "Key", brush.ResKey2), new XAttribute("Color", $"{{DynamicResource {brush.ResKey1}}}")))); //building global Elements like: <Color x:Key="ImagesColor1">#FF000000</Color> rootElement.AddFirst(allBrushes .Select(brush => new XElement(nsDef + "Color", new XAttribute(nsx + "Key", brush.ResKey1), brush.Color))); var colorKeys = allBrushes.ToDictionary(brush => brush.Color, brush => brush.ResKey2); //building local Elements var drawingGroups = rootElement.Elements(nsDef + "DrawingGroup").ToList(); foreach (var node in drawingGroups) { //get Name of DrawingGroup var keyDg = node.Attribute(nsx + "Key").Value; var elemName = GetElemNameFromResKey(keyDg, resKeyInfo); var elemBaseName = elemName.Replace("DrawingGroup", ""); var brushAttributes = CollectBrushAttributesWithColor(node).ToList(); foreach (var brushAttribute in brushAttributes) { var color = brushAttribute.Value; string resKeyColor; if (colorKeys.TryGetValue(color, out resKeyColor)) { //global color found //build resourcename var nameBrush = brushAttributes.Count > 1 ? $"{elemBaseName}Color{brushAttributes.IndexOf(brushAttribute) + 1}Brush" : $"{elemBaseName}ColorBrush"; //dont add number if only one color var resKeyBrush = BuildResKey(nameBrush, resKeyInfo); node.AddBeforeSelf(new XElement(nsDef + "SolidColorBrush", new XAttribute(nsx + "Key", resKeyBrush), new XAttribute("Color", $"{{Binding Color, Source={BuildResKeyReference(resKeyColor, false)}}}") )); //set brush value as Reference // <GeometryDrawing Brush="{DynamicResource {x:Static nsname:Test.cloud-3-iconBrushColor}}" ... /> brushAttribute.Value = BuildResKeyReference(resKeyBrush, true); } } } }
public void BuildDrawingImageName_returns_simpleName() { var resKeyInfo = new ResKeyInfo { UseComponentResKeys = false, Prefix = null }; ConverterLogic.BuildDrawingImageName("ElementName", resKeyInfo).Should().Be("ElementNameDrawingImage"); }
internal static ResourceDictionary ConvertFilesToResourceDictionary(IEnumerable<string> files, WpfDrawingSettings wpfDrawingSettings, ResKeyInfo resKeyInfo) { var dict = new ResourceDictionary(); foreach (var file in files) { var drawingGroup = ConvertFileToDrawingGroup(file, wpfDrawingSettings); var elementName = Path.GetFileNameWithoutExtension(file); var keyDg = BuildDrawingGroupName(elementName, resKeyInfo); dict[keyDg] = drawingGroup; } return dict; }
public void SvgDirToXaml_with_defaultSettingsTest() { var resKeyInfo = new ResKeyInfo { XamlName = "Test", Prefix = "NamePrefix" }; var xaml = ConverterLogic.SvgDirToXaml("TestFiles\\", resKeyInfo, null); Console.WriteLine(xaml); }
private static void ExtractGeometries(XElement drawingGroupElement, ResKeyInfo resKeyInfo) { //get Name of DrawingGroup var nameDg = drawingGroupElement.Attribute(nsx + "Key").Value; var name = nameDg.Replace("DrawingGroup", ""); name = GetElemNameFromResKey(name, resKeyInfo); //find this: <GeometryDrawing Brush="{DynamicResource _3d_view_icon_BrushColor}" Geometry="F1 M512,512z M0,0z M436.631,207.445L436.631,298.319z" /> //var geos = drawingGroupElement.XPathSelectElements(".//defns:GeometryDrawing/@defns:Geometry", _nsManager).ToList(); var geos = drawingGroupElement.Descendants() .Where(e => e.Name.LocalName == "GeometryDrawing") .SelectMany(e => e.Attributes()) .Where(a => a.Name.LocalName == "Geometry") .ToList(); foreach (var geo in geos) { //build resourcename int? no = geos.Count > 1 ? geos.IndexOf(geo) + 1 : (int?)null; var localName = BuildGeometryName(name, no, resKeyInfo); //Add this: <Geometry x:Key="cloud_3_iconGeometry">F1 M512,512z M0,0z M409.338,216.254C398.922,351.523z</Geometry> drawingGroupElement.AddBeforeSelf(new XElement(nsDef+"Geometry", new XAttribute(nsx + "Key", localName), geo.Value)); geo.Value = BuildResKeyReference(localName, false); } }
internal static string BuildResKey(string name, ResKeyInfo resKeyInfo) { if (resKeyInfo.UseComponentResKeys) { return $"{{x:Static {resKeyInfo.NameSpaceName}:{resKeyInfo.XamlName}.{ValidateName(name)}Key}}"; } string result = name; if (resKeyInfo.Prefix != null) result = resKeyInfo.Prefix + C_PrefixSeparator + name; result = ValidateName(result); return result; }
internal static string GetElemNameFromResKey(string name, ResKeyInfo resKeyInfo) { if (resKeyInfo.UseComponentResKeys) { //{x:Static NameSpaceName:XamlName.ElementName} var p1 = name.IndexOf("."); var p2 = name.LastIndexOf("}"); if (p1 < p2) return name.Substring(p1 + 1, p2 - p1 - 1); else return name; } else { if (resKeyInfo.Prefix == null) return name; var prefixWithSeparator = resKeyInfo.Prefix + C_PrefixSeparator; if (name.StartsWith(resKeyInfo.Prefix + C_PrefixSeparator, StringComparison.OrdinalIgnoreCase)) name = name.Remove(0, prefixWithSeparator.Length); return name; } }
internal static string BuildColorBrushName(int no, ResKeyInfo resKeyInfo) { var rawName = $"Color{no}Brush"; return BuildResKey(rawName, resKeyInfo); }
internal static string BuildGeometryName(string name, int? no, ResKeyInfo resKeyInfo) { var rawName = no.HasValue ? $"{name}Geometry{no.Value}" : $"{name}Geometry"; //dont add number if only one Geometry return BuildResKey(rawName, resKeyInfo); }
internal static string BuildDrawingImageName(string elementName, ResKeyInfo resKeyInfo) { var rawName = elementName + "DrawingImage"; return BuildResKey(rawName, resKeyInfo); }
internal static ResourceDictionary ConvertFilesToResourceDictionary(IEnumerable <string> files, WpfDrawingSettings wpfDrawingSettings, ResKeyInfo resKeyInfo) { var dict = new ResourceDictionary(); foreach (var file in files) { var drawingGroup = ConvertFileToDrawingGroup(file, wpfDrawingSettings); var elementName = Path.GetFileNameWithoutExtension(file); var keyDg = BuildDrawingGroupName(elementName, resKeyInfo); dict[keyDg] = drawingGroup; } return(dict); }
public void BuildDrawingGroupName_returns_prefixedName() { var resKeyInfo = new ResKeyInfo { UseComponentResKeys = false, Prefix = "NamePrefix" }; ConverterLogic.BuildDrawingGroupName("ElementName", resKeyInfo).Should().Be("NamePrefix_ElementNameDrawingGroup"); }
internal static string BuildDrawingGroupName(string elementName, ResKeyInfo resKeyInfo) { var rawName = elementName + "DrawingGroup"; return(BuildResKey(rawName, resKeyInfo)); }
public static string SvgFileToXaml(string filepath, ResultMode resultMode, ResKeyInfo resKeyInfo, WpfDrawingSettings wpfDrawingSettings = null) { string name; var obj = ConvertSvgToObject(filepath, resultMode, wpfDrawingSettings, out name, resKeyInfo); return SvgObjectToXaml(obj, wpfDrawingSettings != null ? wpfDrawingSettings.IncludeRuntime : false, name); }
public void Handwheel() //Full integrated with all optimizations { var resKeyInfo = new ResKeyInfo { Prefix = "Prefix" }; var xaml = ConverterLogic.SvgFileToXaml("TestFiles\\Handwheel.svg", ResultMode.DrawingGroup, resKeyInfo, null); Console.WriteLine(xaml); Clipboard.SetText(xaml); }
public static string SvgDirToXaml(string folder, ResKeyInfo resKeyInfo) { return SvgDirToXaml(folder, resKeyInfo, null); }
public void BuildDrawingGroupName_returns_prefixedName_using_CompResKey() { var resKeyInfo = new ResKeyInfo { UseComponentResKeys = true, XamlName = "XamlName", NameSpaceName = "NameSpaceName", //Prefix = "NamePrefix" }; var key = ConverterLogic.BuildDrawingGroupName("ElementName", resKeyInfo); Console.WriteLine(key); key.Should().Be("{x:Static NameSpaceName:XamlName.ElementNameDrawingGroupKey}"); }
public static string SvgDirToXaml(string folder, ResKeyInfo resKeyInfo, WpfDrawingSettings wpfDrawingSettings) { //firstChar Upper var firstChar = Char.ToUpper(resKeyInfo.XamlName[0]); resKeyInfo.XamlName = firstChar + resKeyInfo.XamlName.Remove(0, 1); var files = SvgFilesFromFolder(folder); var dict = ConvertFilesToResourceDictionary(files, wpfDrawingSettings, resKeyInfo); var xamlUntidy = WpfObjToXaml(dict, wpfDrawingSettings != null ? wpfDrawingSettings.IncludeRuntime : false); var doc = XDocument.Parse(xamlUntidy); RemoveResDictEntries(doc.Root); var drawingGroupElements = doc.Root.XPathSelectElements("defns:DrawingGroup", _nsManager).ToList(); foreach (var drawingGroupElement in drawingGroupElements) { BeautifyDrawingElement(drawingGroupElement, null); ExtractGeometries(drawingGroupElement, resKeyInfo); } AddNameSpaceDef(doc.Root, resKeyInfo); ReplaceBrushesInDrawingGroups(doc.Root, resKeyInfo); AddDrawingImagesToDrawingGroups(doc.Root); return doc.ToString(); }
public static string SvgDirToXaml(string folder, ResKeyInfo resKeyInfo, bool filterPixelsPerDip) { return(SvgDirToXaml(folder, resKeyInfo, null, filterPixelsPerDip)); }
public static object ConvertSvgToObject(string filepath, ResultMode resultMode, WpfDrawingSettings wpfDrawingSettings, out string name, ResKeyInfo resKeyInfo) { var dg = ConvertFileToDrawingGroup(filepath, wpfDrawingSettings); var elementName = Path.GetFileNameWithoutExtension(filepath); switch (resultMode) { case ResultMode.DrawingGroup: name = BuildDrawingGroupName(elementName, resKeyInfo); return(dg); case ResultMode.DrawingImage: name = BuildDrawingImageName(elementName, resKeyInfo); return(DrawingToImage(dg)); default: throw new ArgumentOutOfRangeException("resultMode"); } }
public void SvgDirToXamlTest_withNamePrefix() { var settings = new WpfDrawingSettings { IncludeRuntime = false, TextAsGeometry = false, OptimizePath = true, }; var resKeyInfo = new ResKeyInfo { XamlName = "Test", Prefix = "NamePrefix" }; var xaml = ConverterLogic.SvgDirToXaml("TestFiles\\", resKeyInfo, settings); Console.WriteLine(xaml); //File.WriteAllText("TestFiles\\ExpectedXaml_SvgDirToXamlTest_withNamePrefix.xaml", xaml); var expectedXaml = File.ReadAllText("TestFiles\\ExpectedXaml_SvgDirToXamlTest_withNamePrefix.xaml"); xaml.Should().Be(expectedXaml); }
internal static string BuildColorBrushName(int no, ResKeyInfo resKeyInfo) { var rawName = $"Color{no}Brush"; return(BuildResKey(rawName, resKeyInfo)); }
private void BuildBatchFile(string outFileName, ResKeyInfo compResKeyInfo) { if (MessageBox.Show(outFileName + "\nhas been written\nCreate a BatchFile to automate next time?", null, MessageBoxButton.YesNoCancel) == MessageBoxResult.Yes) { var outputname = Path.GetFileNameWithoutExtension(outFileName); var outputdir = Path.GetDirectoryName(outFileName); var relOutputDir = FileUtils.MakeRelativePath(CurrentDir, PathIs.Folder, outputdir, PathIs.Folder); var svgToXamlPath =System.Reflection.Assembly.GetEntryAssembly().Location; var relSvgToXamlPath = FileUtils.MakeRelativePath(CurrentDir, PathIs.Folder, svgToXamlPath, PathIs.File); var batchText = $"{relSvgToXamlPath} BuildDict /inputdir \"{"."}\" /outputdir \"{relOutputDir}\" /outputname {outputname}"; if (compResKeyInfo.UseComponentResKeys) { batchText += $" /useComponentResKeys=true /compResKeyNSName={compResKeyInfo.NameSpaceName} /compResKeyNS={compResKeyInfo.NameSpace}"; WriteT4Template(outFileName); } else { if (!string.IsNullOrWhiteSpace(compResKeyInfo.Prefix)) { batchText += " /nameprefix \"" + compResKeyInfo.Prefix + "\""; } } batchText += "\r\npause"; File.WriteAllText(Path.Combine(CurrentDir, "Update.cmd"), batchText); ////Copy ExeFile //var srcFile = Environment.GetCommandLineArgs().First(); //var destFile = Path.Combine(CurrentDir, Path.GetFileName(srcFile)); ////Console.WriteLine("srcFile:", srcFile); ////Console.WriteLine("destFile:", destFile); //if (!string.Equals(srcFile, destFile, StringComparison.OrdinalIgnoreCase)) //{ // Console.WriteLine("Copying file..."); // File.Copy(srcFile, destFile, true); //} } }
private static void AddNameSpaceDef(XElement root, ResKeyInfo resKeyInfo) { if (resKeyInfo.UseComponentResKeys) { root.Add(new XAttribute(XNamespace.Xmlns + resKeyInfo.NameSpaceName, "clr-namespace:" + resKeyInfo.NameSpace)); } }