import { useTranslation } from 'next-i18next' import { CutLayoutSettings } from './settings.mjs' import { Draft } from '../draft/index.mjs' import { fabricPlugin } from '../plugin-layout-part.mjs' import { cutLayoutPlugin } from './plugin-cut-layout.mjs' import { pluginCutlist } from '@freesewing/plugin-cutlist' import { pluginFlip } from '@freesewing/plugin-flip' import { measurementAsMm } from 'shared/utils.mjs' import { useEffect } from 'react' import get from 'lodash.get' const activeFabricPath = ['_state', 'layout', 'forCutting', 'activeFabric'] const useFabricSettings = (gist) => { const isImperial = gist.units === 'imperial' const sheetHeight = measurementAsMm(isImperial ? 36 : 100, gist.units) const activeFabric = get(gist, activeFabricPath) || 'fabric' const gistSettings = get(gist, ['_state', 'layout', 'forCutting', 'fabric', activeFabric]) const sheetWidth = gistSettings?.sheetWidth || measurementAsMm(isImperial ? 54 : 120, gist.units) const grainDirection = gistSettings?.grainDirection === undefined ? 90 : gistSettings.grainDirection return { activeFabric, sheetWidth, grainDirection, sheetHeight } } const useFabricDraft = (gist, design, fabricSettings) => { // get the appropriate layout for the view const layout = get(gist, ['layouts', gist._state.view, fabricSettings.activeFabric]) || gist.layout || true // hand it separately to the design const draft = new design({ ...gist, layout }) const layoutSettings = { sheetWidth: fabricSettings.sheetWidth, sheetHeight: fabricSettings.sheetHeight, } let patternProps try { // add the fabric plugin to the draft draft.use(fabricPlugin(layoutSettings)) // add the cutLayout plugin draft.use(cutLayoutPlugin(fabricSettings.activeFabric, fabricSettings.grainDirection)) // also, pluginCutlist and pluginFlip are needed draft.use(pluginCutlist) draft.use(pluginFlip) // draft the pattern draft.draft() patternProps = draft.getRenderProps() } catch (err) { console.log(err, gist) } return { draft, patternProps } } const useFabricList = (draft) => { const cutList = draft.setStores[0].get('cutlist') const fabricList = ['fabric'] for (const partName in cutList) { if (draft.settings[0].only && !draft.settings[0].only.includes(partName)) continue for (const matName in cutList[partName].materials) { if (!fabricList.includes(matName)) fabricList.push(matName) } } return fabricList } const bgProps = { fill: 'none' } export const CutLayout = (props) => { const { t } = useTranslation(['workbench', 'plugin']) const { gist, design, updateGist } = props // disable xray useEffect(() => { if (gist?._state?.xray?.enabled) updateGist(['_state', 'xray', 'enabled'], false) }) const fabricSettings = useFabricSettings(gist) const { draft, patternProps } = useFabricDraft(gist, design, fabricSettings) const fabricList = useFabricList(draft) const setCutFabric = (newFabric) => { updateGist(activeFabricPath, newFabric) } let name = design.designConfig.data.name name = name.replace('@freesewing/', '') const settingsProps = { gist, updateGist, patternProps, unsetGist: props.unsetGist, ...fabricSettings, } return patternProps ? (

{t('layoutThing', { thing: name }) + ': ' + t('forCutting')}

{fabricList.length > 1 ? (
{fabricList.map((title) => ( ))}
) : null}
) : null }