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 }