///// ------------------------------------------------------------------------------------ //[SetUp] //public void TestSetup() //{ //} /// ------------------------------------------------------------------------------------ private PatternMember CreateMember(PatternPart part, string wildcardSymbol) { var member = new PatternMember(part, false, new[] { "$", "%" }); member.AddGroup(new[] { "a", "e", "i", "o", "u" }); member.FinalizeParse(wildcardSymbol ?? string.Empty, _prj.PhoneticParser); return(member); }
/// ------------------------------------------------------------------------------------ public PatternMember(PatternPart environment, bool ignoreDiacritics, IEnumerable <string> ignoredSuprasegmentals) { _groups = new List <object>(); _patternPart = environment; _ignoreDiacritics = ignoreDiacritics; var ignoredSsegs = ignoredSuprasegmentals.ToList(); _ignoredBaseSuprasegmentals = (from chr in ignoredSsegs let symbolInfo = App.IPASymbolCache[chr] where symbolInfo != null && symbolInfo.IsBase && symbolInfo.Type == IPASymbolType.suprasegmental select chr).ToList(); _ignoredNonBaseSuprasegmentals = (from chr in ignoredSsegs let symbolInfo = App.IPASymbolCache[chr] where symbolInfo != null && !symbolInfo.IsBase && symbolInfo.Type == IPASymbolType.suprasegmental select chr).ToList(); }
public static List <Vector2> CalcLayout(Pattern pattern, OriginPositionEnum partOriginPosition, Vector2 padding) { List <Vector2> result = new List <Vector2>(); Vector2 locationPos = new Vector2(); for (int i = 0; i < pattern.Parts.Count; i++) { PatternPart part = pattern.Parts[i]; PartExtents extents = PartExtents.CalcPartExtents(part); Vector2 pageSize = new Vector2(extents.Width, extents.Height); Vector2 originOffset = PartExtents.CalcOffsetForOrigin(part, partOriginPosition); switch (partOriginPosition) { default: case OriginPositionEnum.LeftTop: locationPos += new Vector2(padding.X, padding.Y); locationPos = PlacePart(locationPos, originOffset, result); locationPos -= new Vector2(padding.X, padding.Y); break; case OriginPositionEnum.LeftBottom: locationPos += new Vector2(padding.X, pageSize.Y - padding.Y); locationPos = PlacePart(locationPos, originOffset, result); locationPos -= new Vector2(padding.X, pageSize.Y - padding.Y); break; case OriginPositionEnum.Center: locationPos += new Vector2((pageSize.X + padding.X) / 2, (pageSize.Y + padding.Y) / 2); locationPos = PlacePart(locationPos, originOffset, result); locationPos -= new Vector2((pageSize.X + padding.X) / 2, (pageSize.Y + padding.Y) / 2); break; } } return(result); }
public override void PrintPattern(float scale, Pattern pattern, List <Vector2> positions, Vector2 padding, string path) { this.scale = scale; //PDF pages are sized in point units. 1 pt == 1/72 inch == 127/360 mm. //< table > //< thead >< tr >< th class="tdw1">Size</th><th class="tdw2">Width x Height(mm)</th><th class="tdw2">Width x Height(in)</th></tr></thead> //<tbody> //<tr><td>4A0</td><td>1682 x 2378 mm</td><td>66.2 x 93.6 in</td></tr> //<tr><td>2A0</td><td>1189 x 1682 mm</td><td>46.8 x 66.2 in</td></tr> //<tr><td>A0</td><td>841 x 1189 mm</td><td>33.1 x 46.8 in</td></tr> //<tr><td>A1</td><td>594 x 841 mm</td><td>23.4 x 33.1 in</td></tr> //<tr><td>A2</td><td>420 x 594 mm</td><td>16.5 x 23.4 in</td></tr> //<tr><td>A3</td><td>297 x 420 mm</td><td>11.7 x 16.5 in</td></tr> //<tr><td>A4</td><td> 210 x 297 mm</td><td>8.3 x 11.7 in</td></tr> //<tr><td>A5</td><td>148 x 210 mm</td><td>5.8 x 8.3 in</td></tr> //<tr><td>A6</td><td>105 x 148 mm</td><td>4.1 x 5.8 in</td></tr> //<tr><td>A7</td><td>74 x 105 mm</td><td>2.9 x 4.1 in</td></tr> //<tr><td>A8</td><td>52 x 74 mm</td><td>2.0 x 2.9 in</td></tr> //<tr><td>A9</td><td>37 x 52 mm</td><td>1.5 x 2.0 in</td></tr> //<tr><td>A10</td><td>26 x 37 mm</td><td>1.0 x 1.5 in</td></tr> //</tbody> //</table> SKDocumentPdfMetadata metadata = new SKDocumentPdfMetadata { Author = "Hoodie Maker", Creation = DateTime.Now, Creator = "Hoodie Maker", Keywords = "PDF, Hoodie, Pattern", Modified = DateTime.Now, Producer = "Hoodie Maker", Subject = "Hoodie Maker Pattern", Title = "Hoodie Pattern", }; using (SKFileWStream stream = new SKFileWStream(path)) using (SKDocument document = SKDocument.CreatePdf(stream, metadata)) { for (int i = 0; i < pattern.Parts.Count; i++) { Vector2 position = positions[i]; PatternPart part = pattern.Parts[i]; //A0 841mm x 1189 mm //float width = pageSize.X * Utils.pntPerMM; //float height = pageSize.Y * Utils.pntPerMM; PartExtents extents = PartExtents.CalcPartExtents(part); using (SKCanvas pdfCanvas = document.BeginPage(Scale(extents.Width + padding.X), Scale(extents.Height + padding.Y))) { canvas = pdfCanvas; DrawPart(part, position, colorFillPrint, MapEntityColorsForPrint(EntityType.Normal), MapEntityColorsForPrint(EntityType.Text)); document.EndPage(); } } document.Close(); } System.Diagnostics.Debug.WriteLine(path); //Task.Run(async () => await OpenDoc(path)); }
private void DrawPart(PatternPart part, Vector2 position, SKColor fillColor, SKColor pathColor, SKColor textColor) { using (var pathBuilder = new SKPath()) { pathBuilder.MoveTo(Scale(position.X), Scale(position.Y)); foreach (PartEntity entity in part.Entities) { if (entity is PartEntityBezier) { AddBezier(canvas, pathBuilder, ((PartEntityBezier)entity), Scale(position), MapEntityColors(entity.EntityType), part.ShowAttributes, part.ShowConstruction, part.ShowSA); } else if (entity is PartEntityLine) { AddLine(canvas, pathBuilder, ((PartEntityLine)entity), Scale(position), MapEntityColors(entity.EntityType), part.ShowConstruction, part.ShowSA); } } pathBuilder.Close(); SKPaint fillPaint = new SKPaint { Style = SKPaintStyle.Fill, Color = fillColor, IsAntialias = true, }; SKPaint strokePaint = new SKPaint { Style = SKPaintStyle.Stroke, Color = pathColor, IsAntialias = true, StrokeWidth = 1, }; if (!part.ShowPath) { strokePaint.Color = colorTransparent; } canvas.DrawPath(pathBuilder, fillPaint); canvas.DrawPath(pathBuilder, strokePaint); foreach (PartEntity entity in part.Entities) { if (entity is PartEntityText) { if (part.ShowText) { AddText(canvas, (PartEntityText)entity, Scale(position), textColor); } } else if (entity is PartEntityContainer) { if (part.ShowText) { AddPartPartEntityContainer(canvas, pathBuilder, (PartEntityContainer)entity, Scale(position), textColor, textColor); } } } } }
public static List <Vector2> CalcLayout( Pattern pattern, Vector2 offsetOnSurface, PartLayoutEnum layout, OriginPositionEnum partOriginPosition, int spacing) { List <Vector2> result = new List <Vector2>(); Vector2 start = new Vector2() { X = 0 + offsetOnSurface.X, Y = 0 + offsetOnSurface.Y }; Vector2 locationPos = new Vector2(); locationPos += start; if (partOriginPosition == OriginPositionEnum.LeftBottom && layout == PartLayoutEnum.LeftToRight) { float tallest = Pattern.CalcTallestPart(pattern); locationPos += new Vector2(0, tallest); } if (partOriginPosition == OriginPositionEnum.Center && layout == PartLayoutEnum.LeftToRight) { float tallest = Pattern.CalcTallestPart(pattern); locationPos += new Vector2(0, tallest / 2); } for (int i = 0; i < pattern.Parts.Count; i++) { PatternPart part = pattern.Parts[i]; Vector2 originOffset = PartExtents.CalcOffsetForOrigin(part, partOriginPosition); PartExtents dims = PartExtents.CalcPartExtents(part); PartExtents partNextDims = null; if (i + 1 < pattern.Parts.Count) { PatternPart partNext = pattern.Parts[i + 1]; partNextDims = PartExtents.CalcPartExtents(partNext); } switch (layout) { default: case PartLayoutEnum.LeftToRight: switch (partOriginPosition) { default: case OriginPositionEnum.LeftTop: case OriginPositionEnum.LeftBottom: case OriginPositionEnum.Center: locationPos = LeftToRight(locationPos, originOffset, dims, result, partOriginPosition, partNextDims, spacing); break; } break; case PartLayoutEnum.TopToBottom: switch (partOriginPosition) { default: case OriginPositionEnum.LeftTop: case OriginPositionEnum.LeftBottom: case OriginPositionEnum.Center: locationPos = TopToBottom(locationPos, originOffset, dims, result, partOriginPosition, partNextDims, spacing); break; } break; } } return(result); }
public static List <List <Vector2> > CalcLayout(List <Pattern> allPatterns, Vector2 offsetOnSurface) { Pattern mainPattern = allPatterns.First(); List <Pattern> layerPatterns = new List <Pattern>(); for (int i = 1; i < allPatterns.Count; i++) //skip first { layerPatterns.Add(allPatterns[i]); } List <List <Vector2> > result = new List <List <Vector2> >(); result.Add(new List <Vector2>()); //mainPattern result layerPatterns.ForEach(x => result.Add(new List <Vector2>())); Vector2 start = new Vector2() { X = 0 + offsetOnSurface.X, Y = 0 + offsetOnSurface.Y }; Vector2 locationPos = new Vector2(); locationPos += start; float tallest = Pattern.CalcTallestPart(mainPattern); locationPos += new Vector2(0, tallest / 2); for (int i = 0; i < mainPattern.Parts.Count; i++) { PatternPart mainPart = mainPattern.Parts[i]; Vector2 mainPartOriginOffset = PartExtents.CalcOffsetForOrigin(mainPart, OriginPositionEnum.Center); PartExtents mainPartExtents = PartExtents.CalcPartExtents(mainPart); PartExtents mainPartNextDims = null; if (i + 1 < mainPattern.Parts.Count) { PatternPart mainPartNext = mainPattern.Parts[i + 1]; mainPartNextDims = PartExtents.CalcPartExtents(mainPartNext); } //pattern main locationPos += new Vector2(-mainPartOriginOffset.X, -mainPartOriginOffset.Y); result[0].Add(locationPos); locationPos += new Vector2(mainPartOriginOffset.X, mainPartOriginOffset.Y); for (int j = 0; j < layerPatterns.Count; j++) { //pattern layer PatternPart layerPart = layerPatterns[j].Parts[i]; Vector2 layerPartOriginOffset = PartExtents.CalcOffsetForOrigin(layerPart, OriginPositionEnum.Center); locationPos += new Vector2(-layerPartOriginOffset.X, -layerPartOriginOffset.Y); result[j + 1].Add(locationPos); locationPos += new Vector2(layerPartOriginOffset.X, layerPartOriginOffset.Y); } //use pattern main to layout locationPos += new Vector2(mainPartExtents.Width / 2, 0); if (mainPartNextDims != null) { locationPos += new Vector2(mainPartNextDims.Width / 2, 0); } locationPos += new Vector2(50, 0);//spacing between parts } return(result); }
public void Add(PatternPart part) { parts.Add(part); }