diff --git a/src/Gcode.Utils/Gcode.Utils.csproj b/src/Gcode.Utils/Gcode.Utils.csproj index cdbb576..d947616 100644 --- a/src/Gcode.Utils/Gcode.Utils.csproj +++ b/src/Gcode.Utils/Gcode.Utils.csproj @@ -13,10 +13,10 @@ gcode 3d-printing reprap reprap-3d-printer marlin marlin-firmware repitier repitier-firmware json json-parsing gcode-json cura kisslicer slic3r simplify3d git Anton Maisak - 0.2.0.20 + 0.2.0.21 - 0.2.20 - 0.2.0.20 + 0.2.21 + 0.2.0.21 LICENSE logo.png @@ -48,4 +48,19 @@ + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + diff --git a/src/Gcode.Utils/GcodeCrc.cs b/src/Gcode.Utils/GcodeCrc.cs index 42e5d4b..a0ab6b4 100644 --- a/src/Gcode.Utils/GcodeCrc.cs +++ b/src/Gcode.Utils/GcodeCrc.cs @@ -1,5 +1,4 @@ -using System; -using Gcode.Utils.Entity; +using Gcode.Utils.Entity; namespace Gcode.Utils { @@ -26,30 +25,26 @@ public static class GcodeCrc /// public static int FrameCrc(this GcodeCommandFrame gcodeCommandFrame) { - if (gcodeCommandFrame.N <= 0) throw new Exception("Frame line number expected (>0)"); - - var f = gcodeCommandFrame.ToString(); - var check = 0; - - foreach (var ch in f) check ^= ch & 0xff; - - check ^= 32; - - return check; + if (gcodeCommandFrame.N <= 0) throw new GcodeException(Resources.FrameLineNumExpected); + return SetCheckSum(gcodeCommandFrame.ToString()); } // ReSharper disable once UnusedMember.Global public static int FrameCrc(this string gcodeCommandFrame) { var gcode = GcodeParser.ToGCode(gcodeCommandFrame); - if (gcode.N <= 0) throw new Exception("Frame line number expected (>0)"); - - var f = gcodeCommandFrame; + if (gcode.N <= 0) throw new GcodeException(Resources.FrameLineNumExpected); + return SetCheckSum(gcodeCommandFrame); + } + /// + /// Set CheckSum. + /// + /// + /// + private static int SetCheckSum(string rawFrame) + { var check = 0; - - foreach (var ch in f) check ^= ch & 0xff; - + foreach (var ch in rawFrame) check ^= ch & 0xff; check ^= 32; - return check; } } diff --git a/src/Gcode.Utils/GcodeException.cs b/src/Gcode.Utils/GcodeException.cs new file mode 100644 index 0000000..6d202ee --- /dev/null +++ b/src/Gcode.Utils/GcodeException.cs @@ -0,0 +1,11 @@ +using System; + +namespace Gcode.Utils +{ + /// + /// GcodeException. + /// + public class GcodeException : Exception { + public GcodeException(string message): base (message: message) {} + } +} diff --git a/src/Gcode.Utils/GcodeParser.cs b/src/Gcode.Utils/GcodeParser.cs index 05880bd..2939dcf 100644 --- a/src/Gcode.Utils/GcodeParser.cs +++ b/src/Gcode.Utils/GcodeParser.cs @@ -14,10 +14,8 @@ namespace Gcode.Utils /// public static class GcodeParser { - #region private private static readonly CultureInfo Culture = CultureInfo.InvariantCulture; private static string _rawFrame; - private const string CommentChar = ";"; /// /// To Gcode CommandFrame /// @@ -27,31 +25,21 @@ private static GcodeCommandFrame ToGcodeCommandFrame(IEnumerable)) continue; - //объект назначения - var obj = gcodeCommandFrame; - //значение поля - var fieldValue = value; //свойства поля кадра fileldInfoType = fileldInfoType.GetGenericArguments()[0]; //указание значения сегмента кадра - fieldInfo.SetValue(obj, Convert.ChangeType(fieldValue, fileldInfoType, Culture)); + fieldInfo.SetValue(gcodeCommandFrame, Convert.ChangeType(frameSegment.Value, fileldInfoType, Culture)); } return gcodeCommandFrame; } - #endregion /// /// To GCode /// @@ -80,7 +68,7 @@ public static GcodeCommandFrame ToGCode(string raw) //содержит комментарий if (_rawFrame.ContainsGcodeComment()) { - var r = _rawFrame.Split(CommentChar); + var r = _rawFrame.Split(Resources.CommentChar); if (r.Length == 2) { _rawFrame = r[0].Trim(); @@ -122,27 +110,23 @@ public static string ToStringCommand(this GcodeCommandFrame gcodeCommandFrame, b var isNotEmpty = !string.IsNullOrWhiteSpace(objProp.Value?.Trim()); if (!isNotEmpty) continue; - if (objProp.Key != "Comment") + if (objProp.Key != Resources.CommentTag) { var commandKey = objProp.Key; if (addedLines == 0) commandSeparator = string.Empty; - if (objProp.Key == "CheckSum" && !string.IsNullOrWhiteSpace(objProp.Value)) commandKey = "*"; + if (objProp.Key == Resources.CheckSumTag && !string.IsNullOrWhiteSpace(objProp.Value)) commandKey = "*"; var cmdFrameSegmentStr = $"{commandSeparator}{commandKey}{objProp.Value}"; cmdSegmentStringBuilder.Append(cmdFrameSegmentStr); addedLines++; } - else - { - if (!ignoreComments) commentString = objProp.Value; - } + else if (!ignoreComments) commentString = objProp.Value; } - var res = !string.IsNullOrWhiteSpace(commentString) ? $"{cmdSegmentStringBuilder} ;{commentString}" : cmdSegmentStringBuilder.ToString(); - return res.Trim(); + return (!string.IsNullOrWhiteSpace(commentString) ? $"{cmdSegmentStringBuilder} ;{commentString}" : cmdSegmentStringBuilder.ToString()).Trim(); } /// /// ToJson @@ -154,7 +138,7 @@ public static string GcodeToJson(this string raw) const string objJsonStart = "{"; const string objJsonEnd = "}"; - if (_rawFrame.IsGcodeComment() || _rawFrame.IsNullOrErrorFrame()) return $"{{Comment:{raw.Replace(";", null).Replace("\r", null).Trim()}}}"; + if (_rawFrame.IsGcodeComment() || _rawFrame.IsNullOrErrorFrame()) return $"{{{Resources.CommentTag}:{raw.Replace(";", null).Replace("\r", null).Trim()}}}"; var commentString = string.Empty; @@ -162,7 +146,7 @@ public static string GcodeToJson(this string raw) { var arr = _rawFrame.Split(";"); _rawFrame = arr[0].Trim(); - commentString = $",\"Comment\":\"{arr[1].Trim().Replace("\r", null)}\""; + commentString = $",\"{Resources.CommentTag}\":\"{arr[1].Trim().Replace("\r", null)}\""; } var segments = _rawFrame.ToKeyValuePair(); @@ -254,7 +238,7 @@ public static string NormalizeGcodeRawFrame(this string raw) public static bool ContainsGcodeComment(this string raw) { _rawFrame = raw.Trim(); - return !_rawFrame.StartsWith(CommentChar) && _rawFrame.Contains(CommentChar); + return !_rawFrame.StartsWith(Resources.CommentChar) && _rawFrame.Contains(Resources.CommentChar); } /// /// IsComment @@ -264,7 +248,7 @@ public static bool ContainsGcodeComment(this string raw) public static bool IsGcodeComment(this string raw) { _rawFrame = raw.Trim(); - return !_rawFrame.IsNullOrErrorFrame() && _rawFrame.StartsWith(CommentChar); + return !_rawFrame.IsNullOrErrorFrame() && _rawFrame.StartsWith(Resources.CommentChar); } /// /// Is Null Or Error Frame @@ -284,7 +268,7 @@ public static bool IsNullOrErrorFrame(this string raw) public static bool IsEmptyComment(this string raw) { _rawFrame = raw.Trim(); - return _rawFrame.Length == 1 && _rawFrame == CommentChar; + return _rawFrame.Length == 1 && _rawFrame == Resources.CommentChar; } /// diff --git a/src/Gcode.Utils/Resources.Designer.cs b/src/Gcode.Utils/Resources.Designer.cs new file mode 100644 index 0000000..c3c8582 --- /dev/null +++ b/src/Gcode.Utils/Resources.Designer.cs @@ -0,0 +1,99 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gcode.Utils { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Gcode.Utils.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to CheckSum. + /// + internal static string CheckSumTag { + get { + return ResourceManager.GetString("CheckSumTag", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ;. + /// + internal static string CommentChar { + get { + return ResourceManager.GetString("CommentChar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Comment. + /// + internal static string CommentTag { + get { + return ResourceManager.GetString("CommentTag", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Frame line number expected (>0). + /// + internal static string FrameLineNumExpected { + get { + return ResourceManager.GetString("FrameLineNumExpected", resourceCulture); + } + } + } +} diff --git a/src/Gcode.Utils/Resources.resx b/src/Gcode.Utils/Resources.resx new file mode 100644 index 0000000..f7d31f7 --- /dev/null +++ b/src/Gcode.Utils/Resources.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + CheckSum + + + ; + + + Comment + + + Frame line number expected (>0) + + \ No newline at end of file diff --git a/src/Gcode.Utils/SlicerParser/KisSlicerParser.cs b/src/Gcode.Utils/SlicerParser/KisSlicerParser.cs index e33e4de..681547f 100644 --- a/src/Gcode.Utils/SlicerParser/KisSlicerParser.cs +++ b/src/Gcode.Utils/SlicerParser/KisSlicerParser.cs @@ -1,6 +1,5 @@ using System; using System.Linq; -using Gcode.Utils.Entity; using Gcode.Utils.Entity.Slicer; using LibBase.Extensions; diff --git a/tools/TestSuite/Gcode.Test/Gcode.Test.csproj b/tools/TestSuite/Gcode.Test/Gcode.Test.csproj index cbc9154..2f6329c 100644 --- a/tools/TestSuite/Gcode.Test/Gcode.Test.csproj +++ b/tools/TestSuite/Gcode.Test/Gcode.Test.csproj @@ -15,8 +15,8 @@ - - + + diff --git a/tools/TestSuite/Gcode.Test/Parser/PrusaSlicerParserTests.cs b/tools/TestSuite/Gcode.Test/Parser/PrusaSlicerParserTests.cs index 9c3b184..56a6971 100644 --- a/tools/TestSuite/Gcode.Test/Parser/PrusaSlicerParserTests.cs +++ b/tools/TestSuite/Gcode.Test/Parser/PrusaSlicerParserTests.cs @@ -5,25 +5,23 @@ namespace Gcode.Test.Parser { [TestClass] - // [Ignore("Run this tests manually")] + [Ignore("Run this tests manually")] public class PrusaSlicerParserTests { [TestMethod] public void PrusaSlicerParserTest1() { string[] src = TestSuiteDataSource.GetDataSourceArray(@"prusa_slicer\2.2.0-rc4\test_rc.gcode"); - if (src?.Length > 0) - { - var parser = new PrusaSlicerParser(); - var res = parser.GetSlicerInfo(src); - Assert.IsNotNull(res); - Assert.IsTrue(res.Edition == string.Empty); - Assert.IsTrue(res.Version == "2.2.0-rc4+win64"); - Assert.IsTrue(res.FilamentUsedExtruder1 == (decimal)0.8); - Assert.IsTrue(res.FilamentUsedExtruder2 == null); - Assert.IsTrue(res.FilamentDiameter == (decimal)1.75); - Assert.IsTrue(res.EstimatedBuildTime == (decimal)6.32); - } + var parser = new PrusaSlicerParser(); + Assert.IsNotNull(parser); + var res = parser.GetSlicerInfo(src); + Assert.IsNotNull(res); + Assert.IsTrue(res.Edition == string.Empty); + Assert.IsTrue(res.Version == "2.2.0-rc4+win64"); + Assert.IsTrue(res.FilamentUsedExtruder1 == (decimal)0.8); + Assert.IsTrue(res.FilamentUsedExtruder2 == null); + Assert.IsTrue(res.FilamentDiameter == (decimal)1.75); + Assert.IsTrue(res.EstimatedBuildTime == (decimal)6.32); } } }