|
- package pattern
-
- import (
- "fmt"
- "gopkg.in/yaml.v3"
- "io/fs"
- "math"
-
- "gopkg.in/Knetic/govaluate.v3"
- )
-
- // DimensionID describe the ID of the dimension.
- type DimensionID string
-
- // Dimensions is a map with dimensions.
- type Dimensions map[DimensionID]Dimension
-
- // Parameters returns a govaluate.MapParameters object based on the dimensions.
- func (d Dimensions) Parameters() govaluate.MapParameters {
- parameters := govaluate.MapParameters{}
- parameters["pi"] = math.Pi
-
- for id, dimension := range d {
- parameters[string(id)] = dimension.Value
- }
-
- return parameters
- }
-
- func (d Dimensions) Names(templateDir fs.FS) (map[string]string, error) {
- f, err := templateDir.Open("dimension_names.yaml")
- if err != nil {
- return nil, fmt.Errorf("open \"dimension_names.yaml\": %w", err)
- }
-
- namedDimensions := Dimensions{}
-
- err = yaml.NewDecoder(f).Decode(&namedDimensions)
- if err != nil {
- return nil, fmt.Errorf("decode yaml from \"dimension_names.yaml\": %w", err)
- }
-
- out := make(map[string]string)
-
- for id, dimension := range d {
- nd, ok := namedDimensions[id]
- if !ok {
- continue
- }
-
- value := math.Round(dimension.Value) / 10
- out[nd.Name] = fmt.Sprintf("%.1f mm", value)
- }
-
- return out, nil
- }
-
- // Dimension is a combination of a name and a value.
- type Dimension struct {
- Name string
- Value float64
- }
-
- // AddDimension adds a dimension to a pattern.
- func (p *Pattern) AddDimension(id DimensionID, dimension Dimension) {
- p.dimensions[id] = dimension
- }
|