Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

116 rindas
2.8KB

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