package renderer import ( "fmt" "git.wtrh.nl/patterns/gopatterns/pkg/config" "git.wtrh.nl/patterns/gopatterns/pkg/dimensions" "git.wtrh.nl/patterns/gopatterns/pkg/template" "github.com/stoewer/go-strcase" "github.com/tdewolff/canvas" "github.com/tdewolff/canvas/renderers" "golang.org/x/image/font/gofont/goregular" "path/filepath" "strings" ) type Storage interface { LoadDimensions(sizes config.Sizes) (dimensions.Dimensions, error) LoadTemplate(name string) (template.Template, error) } // RenderPatterns loads a [Request] from yaml file and renders the pattern to an SVG. func RenderPatterns(s Storage, request config.Request, outputDir string, debug bool) ([]string, error) { loadedTemplate, err := s.LoadTemplate(request.Template) if err != nil { return nil, fmt.Errorf("load pattern %q: %w", request.Template, err) } filenames := make([]string, 0, len(loadedTemplate.Panels)) dim, err := s.LoadDimensions(request.Sizes) if err != nil { return nil, fmt.Errorf("load dimensions: %w", err) } // renderer := Renderer{dimensions: dim, owner: request.Owner, pattern: request.Template} for name := range loadedTemplate.Panels { newPanel, err := loadedTemplate.GetPanel(template.Request{Dims: dim, Panel: name, Owner: request.Owner}) if err != nil { return nil, err } // //pat := pattern.NewPattern() //pat.SetDimensions(dim) // //err = loadedTemplate.Points.AddToPattern(pat) //if err != nil { // return nil, fmt.Errorf("add generic points to pattern: %w", err) //} // //err = renderer.BuildPanel(panel, pat) //if err != nil { // return nil, fmt.Errorf("constructing %s panel: %w", name, err) //} c := canvas.New(200, 200) err = newPanel.Draw(c, loadFont(), debug) if err != nil { return nil, fmt.Errorf("write pattern to canvas: %w", err) } c.Fit(10) filename := filepath.Join(outputDir, strings.Join([]string{ request.Template, name, strcase.SnakeCase(request.Owner), }, "_")+".pdf") filenames = append(filenames, filename) err = renderers.Write(filename, c) if err != nil { return nil, fmt.Errorf("write canvas to file: %w", err) } } return filenames, nil } func loadFont() *canvas.FontFace { fontDejaVu := canvas.NewFontFamily("latin") if err := fontDejaVu.LoadFont(goregular.TTF, 0, canvas.FontRegular); err != nil { panic(err) } return fontDejaVu.Face(12.0, canvas.Black, canvas.FontRegular) } type Renderer struct { dimensions dimensions.Dimensions owner string pattern string } //// BuildPanel translates the panel to the provided [pattern.Pattern]. //func (r Renderer) BuildPanel(panel template.Panel, pat *pattern.Pattern) error { // err := panel.Points.AddToPattern(pat) // if err != nil { // return err // } // // err = panel.Lines.Build(pat) // if err != nil { // return err // } // // err = r.GenerateInformation(panel, pat) // if err != nil { // return err // } // // return nil //} //func (r Renderer) GenerateInformation(p panel.Panel, pat *pattern.Pattern) error { // err := template.Points{"_information": p.Information.Point} // if err != nil { // return err // } // // dims := make([]string, 0, len(r.dimensions)) // for _, dimension := range r.dimensions { // dims = append(dims, fmt.Sprintf(" %s: %.1f cm", dimension.Name, dimension.Value/10)) // } // // slices.Sort(dims) // dims = append([]string{ // "For: " + r.owner, // "Pattern: " + startCase(r.pattern), // "Panel: " + p.Name, // "Hem allowance: " + p.Allowances.Hem, // "Seam allowance: " + p.Allowances.Seam, // "\nMeasurements:", // }, dims...) // // point := pat.GetPoint("_information") // point.SetHide() // pat.AddText(text.NewText(point, "", strings.Join(dims, "\n"))) // // return nil //}