Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

165 wiersze
3.9KB

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