From c9300e67399f913ca14572f3bd1b9cb4fbaba93d Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Fri, 18 Apr 2025 13:00:40 +0000 Subject: [PATCH] [core] fix: stack anchoring (#261) Fixes #54 Also adds the fabric class to lumina parts for proper line width and rainbow coloring. The last commit is probably not right. It works, but I'm not sure if these are the right functions to change. ![image](/attachments/7a017a76-c7ba-4078-a1a1-e6c900f7d5ee) Reviewed-on: https://codeberg.org/freesewing/freesewing/pulls/261 Reviewed-by: Joost De Cock Co-authored-by: Jonathan Haas Co-committed-by: Jonathan Haas --- designs/lumina/src/leg.mjs | 1 + designs/lumina/src/panel.mjs | 1 + designs/lumina/src/pocket.mjs | 1 + designs/lumina/src/waistband.mjs | 8 +++++++- packages/core/src/part.mjs | 1 + packages/core/src/stack.mjs | 13 ++++++++++++- packages/core/src/svg.mjs | 8 +++++++- packages/react/components/Pattern/part.mjs | 6 +++++- 8 files changed, 35 insertions(+), 4 deletions(-) diff --git a/designs/lumina/src/leg.mjs b/designs/lumina/src/leg.mjs index 69d98f20852..63e46df9bd0 100644 --- a/designs/lumina/src/leg.mjs +++ b/designs/lumina/src/leg.mjs @@ -22,6 +22,7 @@ export const leg = { .join(paths.frontWaistband) .join(paths.frontSplit) .close() + .addClass('fabric') if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') diff --git a/designs/lumina/src/panel.mjs b/designs/lumina/src/panel.mjs index 684322006e0..f6436c79ab2 100644 --- a/designs/lumina/src/panel.mjs +++ b/designs/lumina/src/panel.mjs @@ -25,6 +25,7 @@ export const panel = { .join(paths.panelHem.reverse()) .reverse() .close() + .addClass('fabric') if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') diff --git a/designs/lumina/src/pocket.mjs b/designs/lumina/src/pocket.mjs index a8a4ebf44f8..1bcba40cea1 100644 --- a/designs/lumina/src/pocket.mjs +++ b/designs/lumina/src/pocket.mjs @@ -80,6 +80,7 @@ export const pocket = { .join(paths.frontPocket.reverse()) .close() .reverse() + .addClass('fabric') if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') diff --git a/designs/lumina/src/waistband.mjs b/designs/lumina/src/waistband.mjs index 319d9cf2e24..551f0aedf09 100644 --- a/designs/lumina/src/waistband.mjs +++ b/designs/lumina/src/waistband.mjs @@ -109,6 +109,8 @@ export const waistband = { .join(paths.waistband.reverse()) } + points.anchor = points.waistFront + paths.front = new Path() .move(points.waistbandFront) .line(points.waistFront) @@ -152,7 +154,11 @@ export const waistband = { .join(paths.waistband) .hide() - paths.seam = new Path().move(points.waistbandFront).line(points.waistFront).join(paths.seamSA) + paths.seam = new Path() + .move(points.waistbandFront) + .line(points.waistFront) + .join(paths.seamSA) + .addClass('fabric') if (sa) { const seamSA = paths.seamSA.offset(sa) diff --git a/packages/core/src/part.mjs b/packages/core/src/part.mjs index 7f404d77afe..6bbc6c81d34 100644 --- a/packages/core/src/part.mjs +++ b/packages/core/src/part.mjs @@ -62,6 +62,7 @@ Part.prototype.asRenderProps = function () { paths, points, snippets, + anchor: points.anchor ?? new Point(0, 0), attributes: this.attributes.asRenderProps(), height: this.height, width: this.width, diff --git a/packages/core/src/stack.mjs b/packages/core/src/stack.mjs index b3e5a2e1838..27346437c72 100644 --- a/packages/core/src/stack.mjs +++ b/packages/core/src/stack.mjs @@ -58,8 +58,19 @@ Stack.prototype.home = function () { for (const part of this.getPartList()) { part.__boundary() + let partAnchor = part.points.anchor + + let bounds = part + + if (partAnchor) { + bounds = { + topLeft: part.topLeft.translate(-partAnchor.x, -partAnchor.y), + bottomRight: part.bottomRight.translate(-partAnchor.x, -partAnchor.y), + } + } + const { topLeft, bottomRight } = utils.getTransformedBounds( - part, + bounds, part.attributes.getAsArray('transform') ) diff --git a/packages/core/src/svg.mjs b/packages/core/src/svg.mjs index 3b5493afc22..cc7377e0175 100644 --- a/packages/core/src/svg.mjs +++ b/packages/core/src/svg.mjs @@ -301,9 +301,15 @@ Svg.prototype.__renderPathText = function (path) { * @return {string} svg - The SVG markup for the Part object */ Svg.prototype.__renderPart = function (part) { + const attributes = part.attributes.clone() + attributes.add( + 'transform', + `translate(${-part.asRenderProps().anchor.x}, ${-part.asRenderProps().anchor.y})` + ) + let svg = this.__openGroup( `${this.idPrefix}stack-${this.activeStack}-part-${part.name}`, - part.attributes + attributes ) for (let key in part.paths) { let path = part.paths[key] diff --git a/packages/react/components/Pattern/part.mjs b/packages/react/components/Pattern/part.mjs index 1d86bbd13ab..c044671e703 100644 --- a/packages/react/components/Pattern/part.mjs +++ b/packages/react/components/Pattern/part.mjs @@ -54,7 +54,11 @@ export const Part = ({ stackName, partName, part, settings, components, strings, const { Group } = components return ( - + )