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.

125 wiersze
2.9KB

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