From 4ae7bec65e3d5739a1e1db02db22ebf78fc660ab Mon Sep 17 00:00:00 2001 From: Nathan Crawford Date: Sat, 5 Apr 2008 04:29:42 +0000 Subject: [PATCH] Fixed several bugs in filterStitches(), added paramaters to control filtering. --- PesFile/PesFile.cs | 43 ++++++++++++++++++++++------- PesFile/Properties/AssemblyInfo.cs | 4 +-- PesFile/bin/Debug/PesFile.dll | Bin 28672 -> 28672 bytes PesFile/bin/Release/PesFile.dll | Bin 24576 -> 24576 bytes 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/PesFile/PesFile.cs b/PesFile/PesFile.cs index 47af3b4..04f31a3 100644 --- a/PesFile/PesFile.cs +++ b/PesFile/PesFile.cs @@ -79,6 +79,8 @@ namespace PesFile private bool formatWarning = false; + private bool classWarning = false; + //bool _readyToUse = false; public PesFile(string filename) @@ -283,15 +285,17 @@ namespace PesFile //not yet supported foundAClass = true; formatWarning = true; + classWarning = true; } if (tempstring.Contains("CGroupObject")) { //not yet supported; this seems to go with CEmbLine foundAClass = true; formatWarning = true; + classWarning = true; } - if(!foundAClass) + if (!foundAClass) { readyStatus = statusEnum.ReadError; lastError = "No headers or classes found"; @@ -495,7 +499,7 @@ namespace PesFile } if (yValue == -32765) { - int skipafew=0; + int skipafew = 0; for (int x = 0; x < 4; x++) { skipafew = file.ReadInt16(); @@ -534,7 +538,7 @@ namespace PesFile //} } - List filterStitches(List input) + List filterStitches(List input, int threshold) { List retval = new List(); List tempStitchData = new List(); @@ -543,15 +547,21 @@ namespace PesFile for (int i = 0; i < input[x].stitches.Length; i++) { - if (i > 0) + if (i > 0)//need a previous point to check against, can't check the first { - if (Math.Abs(Math.Sqrt(Math.Pow(input[x].stitches[i].X - input[x].stitches[i - 1].X, 2) + Math.Pow(input[x].stitches[i].Y - input[x].stitches[i - 1].Y, 2))) < 105) //check distance between this point and the last one + double diffx = Math.Abs(input[x].stitches[i].X - input[x].stitches[i - 1].X); + double diffy = Math.Abs(input[x].stitches[i].Y - input[x].stitches[i - 1].Y); + if (Math.Sqrt(Math.Pow(diffx, 2.0) + Math.Pow(diffy, 2.0)) < threshold) //check distance between this point and the last one { + if (tempStitchData.Count == 0 && i > 1)//first stitch of block gets left out without this, except for very first stitch + { + tempStitchData.Add(input[x].stitches[i - 1]); + } tempStitchData.Add(input[x].stitches[i]); } - else + else//stitch is too far from the previous one { - if (tempStitchData.Count > 2) + if (tempStitchData.Count > 2)//add the block and start a new one { stitchBlock tempBlock = new stitchBlock(); tempBlock.color = input[x].color; @@ -561,8 +571,16 @@ namespace PesFile retval.Add(tempBlock); tempStitchData = new List(); } + else//reset variables + { + tempStitchData = new List(); + } } } + else //just add the first one, don't have anything to compare against + { + tempStitchData.Add(input[x].stitches[i]); + } } if (tempStitchData.Count > 2) { @@ -907,6 +925,11 @@ namespace PesFile return formatWarning; } + public bool getClassWarning() + { + return classWarning; + } + private Color getColorFromIndex(int index) { Color retval;// = Color.White; @@ -1113,7 +1136,7 @@ namespace PesFile return retval; } - public Bitmap designToBitmap(Single threadThickness) + public Bitmap designToBitmap(Single threadThickness, bool filterUglyStitches, int filterUglyStitchesThreshold) { Bitmap DrawArea; Graphics xGraph; @@ -1128,9 +1151,9 @@ namespace PesFile #if DEBUG tmpblocks = blocks; #else - if (!formatWarning) //only filter stitches if we think we understand the format + if (filterUglyStitches && !formatWarning) //only filter stitches if we think we understand the format { - tmpblocks = filterStitches(blocks); + tmpblocks = filterStitches(blocks, filterUglyStitchesThreshold); } else { diff --git a/PesFile/Properties/AssemblyInfo.cs b/PesFile/Properties/AssemblyInfo.cs index 3b640c7..9998a67 100644 --- a/PesFile/Properties/AssemblyInfo.cs +++ b/PesFile/Properties/AssemblyInfo.cs @@ -55,5 +55,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.1.145")] -[assembly: AssemblyFileVersion("1.0.1.145")] +[assembly: AssemblyVersion("1.0.1.171")] +[assembly: AssemblyFileVersion("1.0.1.171")] diff --git a/PesFile/bin/Debug/PesFile.dll b/PesFile/bin/Debug/PesFile.dll index b2179eb0efa96e2b4f71f2917967766b57f95e67..9112c1e5e5e1bb7a8da3ffdc8c1e65795b6d0ea3 100644 GIT binary patch delta 4730 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 O)n(1CAI=!9)&B(+Q8dy3 diff --git a/PesFile/bin/Release/PesFile.dll b/PesFile/bin/Release/PesFile.dll index 028af2e7f4a91e9ccf162437c74bb3ea3e13edef..6341500f64e8a8ddbad9946a25832c30701e5119 100644 GIT binary patch literal 24576 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 literal 24576 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