diff --git a/packages/core/src/index.mjs b/packages/core/src/index.mjs index 8735fe5411b..85ab05ed4b7 100644 --- a/packages/core/src/index.mjs +++ b/packages/core/src/index.mjs @@ -26,6 +26,7 @@ import { lineIntersectsCircle, lineIntersectsCurve, linesIntersect, + mergeOptions, pctBasedOn, pointOnBeam, pointOnCurve, @@ -70,6 +71,7 @@ export { lineIntersectsCircle, lineIntersectsCurve, linesIntersect, + mergeOptions, pctBasedOn, pointOnBeam, pointOnCurve, diff --git a/packages/core/src/pattern/pattern-drafter.mjs b/packages/core/src/pattern/pattern-drafter.mjs index e9db84e1549..d5c82f36bbd 100644 --- a/packages/core/src/pattern/pattern-drafter.mjs +++ b/packages/core/src/pattern/pattern-drafter.mjs @@ -1,6 +1,6 @@ import { PatternDraftQueue } from './pattern-draft-queue.mjs' import { Part } from '../part.mjs' -import { __macroName } from '../utils.mjs' +import { __macroName, mergeOptions } from '../utils.mjs' /** * A class to handle drafting a pattern @@ -202,7 +202,11 @@ PatternDrafter.prototype.__loadAbsoluteOptionsSet = function (set) { */ PatternDrafter.prototype.__snappedPercentageOption = function (optionName, set) { const conf = this.pattern.config.options[optionName] - const abs = conf.toAbs(this.pattern.settings[set].options[optionName], this.pattern.settings[set]) + const abs = conf.toAbs( + this.pattern.settings[set].options[optionName], + this.pattern.settings[set], + mergeOptions(this.pattern.settings[set], this.pattern.config.options) + ) // Handle units-specific config - Side-step immutability for the snap conf let snapConf = conf.snap if (!Array.isArray(snapConf) && snapConf.metric && snapConf.imperial) diff --git a/packages/core/src/utils.mjs b/packages/core/src/utils.mjs index 7fbc23f4e5e..e8f19c5c036 100644 --- a/packages/core/src/utils.mjs +++ b/packages/core/src/utils.mjs @@ -441,6 +441,29 @@ export function lineIntersectsCurve(start, end, from, cp1, cp2, to) { else return intersections } +/** + * Helper method to merge passed in options with default options from the pattern config + * + * @param {object} settings - The settings passed to the pattern + * @param {object} optionsConfig - The pattern's options config + * @return {object} result - An object with the merged options and their values + */ +export function mergeOptions(settings, optionsConfig) { + const merged = typeof settings.options === 'undefined' ? {} : { ...settings.option } + for (const [key, option] of Object.entries(optionsConfig)) { + if (typeof option === 'object') { + if (typeof option.pct !== 'undefined') merged[key] = option.pct / 100 + else if (typeof option.mm !== 'undefined') merged[key] = option.mm + else if (typeof option.deg !== 'undefined') merged[key] = option.deg + else if (typeof option.count !== 'undefined') merged[key] = option.count + else if (typeof option.bool !== 'undefined') merged[key] = option.bool + else if (typeof option.dflt !== 'undefined') merged[key] = option.dflt + } else merged[key] = option + } + + return merged +} + /** * Helper method to calculate abolute option value based on a measurement * diff --git a/sites/shared/components/workbench/menus/design-options/index.mjs b/sites/shared/components/workbench/menus/design-options/index.mjs index 770f4a3f517..6829d5707dd 100644 --- a/sites/shared/components/workbench/menus/design-options/index.mjs +++ b/sites/shared/components/workbench/menus/design-options/index.mjs @@ -90,7 +90,7 @@ export const DesignOptions = ({ name: 'design-options:designOptions', language, ns: menuNs, - passProps: { settings }, + passProps: { settings, patternConfig }, updateFunc: (name, value) => update.settings(['options', ...name], value), }} /> diff --git a/sites/shared/components/workbench/menus/design-options/values.mjs b/sites/shared/components/workbench/menus/design-options/values.mjs index dd935ea3867..c1f2f1909b1 100644 --- a/sites/shared/components/workbench/menus/design-options/values.mjs +++ b/sites/shared/components/workbench/menus/design-options/values.mjs @@ -1,14 +1,19 @@ import { formatMm, formatPercentage } from 'shared/utils.mjs' import { ListValue, HighlightedValue, PlainValue, BoolValue } from '../shared/values' +import { mergeOptions } from '@freesewing/core' /** Displays the current percentatge value, and the absolute value if configured */ -export const PctOptionValue = ({ config, current, settings, changed }) => { +export const PctOptionValue = ({ config, current, settings, changed, patternConfig }) => { const val = changed ? current : config.pct / 100 return ( {formatPercentage(val)} - {config.toAbs && settings.measurements ? ` | ${formatMm(config.toAbs(val, settings))}` : null} + {config.toAbs && settings.measurements + ? ` | ${formatMm( + config.toAbs(val, settings, mergeOptions(settings, patternConfig.options)) + )}` + : null} ) }