1
0
Fork 0

rotate parts to be along grain

This commit is contained in:
Enoch Riese 2023-03-01 12:34:18 -06:00
parent 58b0633fd1
commit a51665f30d
5 changed files with 204 additions and 123 deletions

View file

@ -6,11 +6,14 @@ const redraftAndFlip = ({ part, macro }) => {
return part
}
export const cutLayoutPlugin = function (material) {
const opTypes = ['to', 'cp1', 'cp2']
export const cutLayoutPlugin = function (material, grainAngle) {
return {
hooks: {
postPartDraft: (pattern) => {
if (pattern.activePart.startsWith('cut.') || pattern.activePart === 'fabric') return
const part = pattern.parts[pattern.activeSet][pattern.activePart]
if (pattern.activePart.startsWith('cut.') || pattern.activePart === 'fabric' || part.hidden)
return
const partCutlist = pattern.setStores[pattern.activeSet].get([
'cutlist',
@ -18,15 +21,23 @@ export const cutLayoutPlugin = function (material) {
])
if (partCutlist?.materials ? !partCutlist.materials[material] : material !== 'fabric') {
pattern.parts[pattern.activeSet][pattern.activePart].hide()
part.hide()
return
}
const { macro } = part.shorthand()
if (partCutlist?.cutOnFold) {
const { macro } = pattern.parts[pattern.activeSet][pattern.activePart].shorthand()
macro('mirrorOnFold', { fold: partCutlist.cutOnFold })
}
if (
partCutlist?.grain !== undefined &&
partCutlist.grain !== grainAngle &&
partCutlist.grain + 180 != grainAngle
) {
macro('rotateToGrain', { partGrain: partCutlist.grain, grainAngle })
}
const matCutConfig = partCutlist?.materials?.[material]
if (!matCutConfig) return
@ -83,6 +94,35 @@ export const cutLayoutPlugin = function (material) {
})
}
},
rotateToGrain: ({ partGrain, grainAngle }, { paths, snippets, Point, points }) => {
const pivot = points.grainlineFrom || points.cutonfoldFrom || new Point(0, 0)
const toRotate = grainAngle - partGrain
for (const pathName in paths) {
const path = paths[pathName]
if (paths[pathName].hidden) continue
path.ops.forEach((op) => {
opTypes.forEach((t) => {
if (op[t]) op[t] = op[t].rotate(toRotate, pivot)
})
})
}
for (const snippetName in snippets) {
snippets[snippetName].anchor = snippets[snippetName].anchor.rotate(toRotate, pivot)
}
for (const pointName in points) {
const point = points[pointName]
const pointAttrs = point.attributes
if (Object.keys(pointAttrs.list).length) {
points[pointName] = point.rotate(toRotate, pivot)
points[pointName].attributes = pointAttrs.clone()
}
}
},
},
}
}