Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

144 Zeilen
3.6KB

  1. package renderer
  2. import (
  3. "fmt"
  4. "git.wtrh.nl/patterns/gopatterns/pkg/config"
  5. "git.wtrh.nl/patterns/gopatterns/pkg/dimensions"
  6. "git.wtrh.nl/patterns/gopatterns/pkg/template"
  7. "github.com/stoewer/go-strcase"
  8. "github.com/tdewolff/canvas"
  9. "github.com/tdewolff/canvas/renderers"
  10. "golang.org/x/image/font/gofont/goregular"
  11. "path/filepath"
  12. "strings"
  13. )
  14. type Storage interface {
  15. LoadDimensions(sizes config.Sizes) (dimensions.Dimensions, error)
  16. LoadTemplate(name string) (template.Template, error)
  17. }
  18. // RenderPatterns loads a [Request] from yaml file and renders the pattern to an SVG.
  19. func RenderPatterns(s Storage, request config.Request, outputDir string, debug bool) ([]string, error) {
  20. loadedTemplate, err := s.LoadTemplate(request.Template)
  21. if err != nil {
  22. return nil, fmt.Errorf("load pattern %q: %w", request.Template, err)
  23. }
  24. filenames := make([]string, 0, len(loadedTemplate.Panels))
  25. dim, err := s.LoadDimensions(request.Sizes)
  26. if err != nil {
  27. return nil, fmt.Errorf("load dimensions: %w", err)
  28. }
  29. // renderer := Renderer{dimensions: dim, owner: request.Owner, pattern: request.Template}
  30. for name := range loadedTemplate.Panels {
  31. newPanel, err := loadedTemplate.GetPanel(template.Request{Dims: dim, Panel: name, Owner: request.Owner})
  32. if err != nil {
  33. return nil, err
  34. }
  35. //
  36. //pat := pattern.NewPattern()
  37. //pat.SetDimensions(dim)
  38. //
  39. //err = loadedTemplate.Points.AddToPattern(pat)
  40. //if err != nil {
  41. // return nil, fmt.Errorf("add generic points to pattern: %w", err)
  42. //}
  43. //
  44. //err = renderer.BuildPanel(panel, pat)
  45. //if err != nil {
  46. // return nil, fmt.Errorf("constructing %s panel: %w", name, err)
  47. //}
  48. c := canvas.New(200, 200)
  49. err = newPanel.Draw(c, loadFont(), debug)
  50. if err != nil {
  51. return nil, fmt.Errorf("write pattern to canvas: %w", err)
  52. }
  53. c.Fit(10)
  54. filename := filepath.Join(outputDir, strings.Join([]string{
  55. request.Template, name,
  56. strcase.SnakeCase(request.Owner),
  57. }, "_")+".pdf")
  58. filenames = append(filenames, filename)
  59. err = renderers.Write(filename, c)
  60. if err != nil {
  61. return nil, fmt.Errorf("write canvas to file: %w", err)
  62. }
  63. }
  64. return filenames, nil
  65. }
  66. func loadFont() *canvas.FontFace {
  67. fontDejaVu := canvas.NewFontFamily("latin")
  68. if err := fontDejaVu.LoadFont(goregular.TTF, 0, canvas.FontRegular); err != nil {
  69. panic(err)
  70. }
  71. return fontDejaVu.Face(12.0, canvas.Black, canvas.FontRegular)
  72. }
  73. type Renderer struct {
  74. dimensions dimensions.Dimensions
  75. owner string
  76. pattern string
  77. }
  78. //// BuildPanel translates the panel to the provided [pattern.Pattern].
  79. //func (r Renderer) BuildPanel(panel template.Panel, pat *pattern.Pattern) error {
  80. // err := panel.Points.AddToPattern(pat)
  81. // if err != nil {
  82. // return err
  83. // }
  84. //
  85. // err = panel.Lines.Build(pat)
  86. // if err != nil {
  87. // return err
  88. // }
  89. //
  90. // err = r.GenerateInformation(panel, pat)
  91. // if err != nil {
  92. // return err
  93. // }
  94. //
  95. // return nil
  96. //}
  97. //func (r Renderer) GenerateInformation(p panel.Panel, pat *pattern.Pattern) error {
  98. // err := template.Points{"_information": p.Information.Point}
  99. // if err != nil {
  100. // return err
  101. // }
  102. //
  103. // dims := make([]string, 0, len(r.dimensions))
  104. // for _, dimension := range r.dimensions {
  105. // dims = append(dims, fmt.Sprintf(" %s: %.1f cm", dimension.Name, dimension.Value/10))
  106. // }
  107. //
  108. // slices.Sort(dims)
  109. // dims = append([]string{
  110. // "For: " + r.owner,
  111. // "Pattern: " + startCase(r.pattern),
  112. // "Panel: " + p.Name,
  113. // "Hem allowance: " + p.Allowances.Hem,
  114. // "Seam allowance: " + p.Allowances.Seam,
  115. // "\nMeasurements:",
  116. // }, dims...)
  117. //
  118. // point := pat.GetPoint("_information")
  119. // point.SetHide()
  120. // pat.AddText(text.NewText(point, "", strings.Join(dims, "\n")))
  121. //
  122. // return nil
  123. //}