///// ------------------------------------------------------------------------------------
        //[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);
        }
Example #2
0
        /// ------------------------------------------------------------------------------------
        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();
        }
Example #3
0
        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);
                        }
                    }
                }
            }
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
 public void Add(PatternPart part)
 {
     parts.Add(part);
 }