From 48f62500d5d040b878be2fdc8ef3c800de7dfd88 Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 26 May 2026 15:43:54 +0200 Subject: [PATCH] Added Generator for Template SVG --- .gitignore | 1 + cmd/generate.go | 23 ---------- cmd/generate_template.go | 42 +++++++++++++++++ internal/svgtemplate/data.go | 41 +++++++++++++++++ internal/svgtemplate/template.go | 77 ++++++++++++++++++++++++++++++++ 5 files changed, 161 insertions(+), 23 deletions(-) create mode 100644 .gitignore delete mode 100644 cmd/generate.go create mode 100644 cmd/generate_template.go create mode 100644 internal/svgtemplate/data.go create mode 100644 internal/svgtemplate/template.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b87b1c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +svg_template/ \ No newline at end of file diff --git a/cmd/generate.go b/cmd/generate.go deleted file mode 100644 index 12a44e0..0000000 --- a/cmd/generate.go +++ /dev/null @@ -1,23 +0,0 @@ -package cmd - -import ( - "github.com/spf13/cobra" -) - -var generateCmd = &cobra.Command{ - Use: "generate", - Short: "Generate project artifacts", -} - -var generateTemplateCmd = &cobra.Command{ - Use: "template", - Short: "Generate a template", - Run: func(cmd *cobra.Command, args []string) { - // TODO: implement template generation - }, -} - -func init() { - generateCmd.AddCommand(generateTemplateCmd) - rootCmd.AddCommand(generateCmd) -} diff --git a/cmd/generate_template.go b/cmd/generate_template.go new file mode 100644 index 0000000..13df8bb --- /dev/null +++ b/cmd/generate_template.go @@ -0,0 +1,42 @@ +package cmd + +import ( + "fmt" + "path/filepath" + + "github.com/spf13/cobra" + "printer.backend/internal/svgtemplate" +) + +var ( + sizeFlag float64 + bleedFlag float64 + marginFlag float64 + paddingFlag float64 + outputFlag string +) + +var generateTemplateCmd = &cobra.Command{ + Use: "template", + Short: "Generate a square SVG mask template with bleed and margins", + RunE: func(cmd *cobra.Command, args []string) error { + data := svgtemplate.Build(sizeFlag, bleedFlag, marginFlag, paddingFlag) + + outPath := filepath.Join(svgtemplate.OutputDir, filepath.Base(outputFlag)) + if err := svgtemplate.WriteFile(outputFlag, data); err != nil { + return fmt.Errorf("write svg: %w", err) + } + + cmd.Printf("Template erfolgreich generiert: %s\n", outPath) + return nil + }, +} + +func init() { + rootCmd.AddCommand(generateTemplateCmd) + generateTemplateCmd.Flags().Float64VarP(&sizeFlag, "size", "s", 100.0, "Size of the final square product in mm") + generateTemplateCmd.Flags().Float64VarP(&bleedFlag, "bleed", "b", 2.0, "Bleed (Überdruck) in mm") + generateTemplateCmd.Flags().Float64VarP(&marginFlag, "margin", "m", 5.0, "Margin to the outer elements in mm") + generateTemplateCmd.Flags().Float64VarP(&paddingFlag, "padding", "p", 3.0, "Inner padding (safety margin) in mm") + generateTemplateCmd.Flags().StringVarP(&outputFlag, "output", "o", "mask_template.svg", "Output file path") +} diff --git a/internal/svgtemplate/data.go b/internal/svgtemplate/data.go new file mode 100644 index 0000000..4d65352 --- /dev/null +++ b/internal/svgtemplate/data.go @@ -0,0 +1,41 @@ +package svgtemplate + +// Data holds dynamic values for the SVG mask template. +type Data struct { + Size float64 + Bleed float64 + Margin float64 + Padding float64 + ViewBoxMin float64 + ViewBoxSize float64 + MaskSize float64 + OuterSize float64 + OuterOffset float64 + InnerSize float64 + InnerOffset float64 + MarkLength float64 +} + +const defaultMarkLength = 6.0 // mm + +// Build computes template data from product dimensions. +func Build(size, bleed, margin, padding float64) Data { + offset := bleed + margin + defaultMarkLength + viewBoxMin := -offset + viewBoxSize := size + (offset * 2) + + return Data{ + Size: size, + Bleed: bleed, + Margin: margin, + Padding: padding, + ViewBoxMin: viewBoxMin, + ViewBoxSize: viewBoxSize, + MarkLength: defaultMarkLength, + MaskSize: size, + OuterSize: size + (bleed * 2), + OuterOffset: -bleed, + InnerSize: size - (padding * 2), + InnerOffset: padding, + } +} diff --git a/internal/svgtemplate/template.go b/internal/svgtemplate/template.go new file mode 100644 index 0000000..b5d9ba2 --- /dev/null +++ b/internal/svgtemplate/template.go @@ -0,0 +1,77 @@ +package svgtemplate + +import ( + "io" + "os" + "path/filepath" + "text/template" +) + +const svgTemplate = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +` + +var tmpl = template.Must( + template.New("svg").Funcs(template.FuncMap{ + "appendBleed": func(bleed, mark float64) float64 { return bleed + mark }, + "add": func(a, b float64) float64 { return a + b }, + "addThree": func(a, b, c float64) float64 { return a + b + c }, + }).Parse(svgTemplate), +) + +// Write renders the SVG template to w. +func Write(w io.Writer, data Data) error { + return tmpl.Execute(w, data) +} + +// OutputDir is the directory where generated SVG files are written. +const OutputDir = "svg_template" + +// WriteFile renders the SVG template into OutputDir. +func WriteFile(path string, data Data) error { + outPath := filepath.Join(OutputDir, filepath.Base(filepath.Clean(path))) + if err := os.MkdirAll(OutputDir, 0o755); err != nil { + return err + } + + file, err := os.Create(outPath) + if err != nil { + return err + } + defer file.Close() + + if err := Write(file, data); err != nil { + return err + } + return file.Close() +}