From 0b8a056d46932375bddd0c59da8326ae892b68ec Mon Sep 17 00:00:00 2001 From: Joost De Cock Date: Tue, 14 Aug 2018 16:07:36 +0200 Subject: [PATCH] sparkles: Examples for Point, Path, and Utils --- packages/examples/index.html | 4 +- packages/examples/src/back.js | 30 ----- packages/examples/src/front.js | 23 ---- packages/examples/src/index.js | 114 +++++++++++++++++- packages/examples/src/path.attr.js | 25 ++++ packages/examples/src/path.clone.js | 27 +++++ packages/examples/src/path.end.js | 25 ++++ packages/examples/src/path.join.js | 32 +++++ packages/examples/src/path.length.js | 43 +++++++ packages/examples/src/path.offset.js | 40 ++++++ packages/examples/src/path.ops.js | 57 +++++++++ packages/examples/src/path.reverse.js | 26 ++++ packages/examples/src/path.shiftalong.js | 35 ++++++ .../examples/src/path.shiftfractionalong.js | 35 ++++++ packages/examples/src/path.start.js | 25 ++++ packages/examples/src/point.angle.js | 36 ++++++ packages/examples/src/point.attr.js | 22 ++++ packages/examples/src/point.clone.js | 23 ++++ packages/examples/src/point.copy.js | 20 +++ packages/examples/src/point.dist.js | 26 ++++ packages/examples/src/point.dx.js | 27 +++++ packages/examples/src/point.dy.js | 27 +++++ packages/examples/src/point.flipx.js | 58 +++++++++ packages/examples/src/point.flipy.js | 83 +++++++++++++ packages/examples/src/point.rotate.js | 27 +++++ packages/examples/src/point.shift.js | 29 +++++ .../src/point.shiftfractiontowards.js | 43 +++++++ packages/examples/src/point.shiftoutwards.js | 36 ++++++ packages/examples/src/point.shifttowards.js | 37 ++++++ packages/examples/src/point.sitson.js | 25 ++++ packages/examples/src/shared.js | 13 ++ packages/examples/src/utils.beamcrossesx.js | 31 +++++ packages/examples/src/utils.beamcrossesy.js | 30 +++++ packages/examples/src/utils.beamscross.js | 32 +++++ packages/examples/src/utils.linescross.js | 32 +++++ 35 files changed, 1137 insertions(+), 61 deletions(-) delete mode 100644 packages/examples/src/back.js delete mode 100644 packages/examples/src/front.js create mode 100644 packages/examples/src/path.attr.js create mode 100644 packages/examples/src/path.clone.js create mode 100644 packages/examples/src/path.end.js create mode 100644 packages/examples/src/path.join.js create mode 100644 packages/examples/src/path.length.js create mode 100644 packages/examples/src/path.offset.js create mode 100644 packages/examples/src/path.ops.js create mode 100644 packages/examples/src/path.reverse.js create mode 100644 packages/examples/src/path.shiftalong.js create mode 100644 packages/examples/src/path.shiftfractionalong.js create mode 100644 packages/examples/src/path.start.js create mode 100644 packages/examples/src/point.angle.js create mode 100644 packages/examples/src/point.attr.js create mode 100644 packages/examples/src/point.clone.js create mode 100644 packages/examples/src/point.copy.js create mode 100644 packages/examples/src/point.dist.js create mode 100644 packages/examples/src/point.dx.js create mode 100644 packages/examples/src/point.dy.js create mode 100644 packages/examples/src/point.flipx.js create mode 100644 packages/examples/src/point.flipy.js create mode 100644 packages/examples/src/point.rotate.js create mode 100644 packages/examples/src/point.shift.js create mode 100644 packages/examples/src/point.shiftfractiontowards.js create mode 100644 packages/examples/src/point.shiftoutwards.js create mode 100644 packages/examples/src/point.shifttowards.js create mode 100644 packages/examples/src/point.sitson.js create mode 100644 packages/examples/src/shared.js create mode 100644 packages/examples/src/utils.beamcrossesx.js create mode 100644 packages/examples/src/utils.beamcrossesy.js create mode 100644 packages/examples/src/utils.beamscross.js create mode 100644 packages/examples/src/utils.linescross.js diff --git a/packages/examples/index.html b/packages/examples/index.html index fe237e77592..c153dbdd8d9 100644 --- a/packages/examples/index.html +++ b/packages/examples/index.html @@ -3,7 +3,7 @@ Examples - + @@ -19,7 +19,7 @@ var pattern = freesewing.patterns.examples .with(freesewing.plugins.debug) .with(freesewing.plugins.theme) - .with(freesewing.plugins.designer) + //.with(freesewing.plugins.designer) .with(freesewing.plugins.validate) ; pattern.settings.measurements = freesewing.models.men.manSize36; diff --git a/packages/examples/src/back.js b/packages/examples/src/back.js deleted file mode 100644 index 6fbced98ea7..00000000000 --- a/packages/examples/src/back.js +++ /dev/null @@ -1,30 +0,0 @@ -import freesewing from "freesewing"; - -var back = { - draft: function(part) { - // prettier-ignore - let {store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, final, paperless, macro} = part.shorthand(); - - // Do your work here :) - points.start = new Point(0, 0); - points.end = new Point(75, 0); - - paths.example = new Path() - .move(points.start) - .line(points.end) - .attr("data-text", "This is the front part") - .attr("data-text-class", "center"); - - // Final? - if (final) { - } - - // Paperless? - if (paperless) { - } - - return part; - } -}; - -export default back; diff --git a/packages/examples/src/front.js b/packages/examples/src/front.js deleted file mode 100644 index 6be0cd0dc5e..00000000000 --- a/packages/examples/src/front.js +++ /dev/null @@ -1,23 +0,0 @@ -import freesewing from "freesewing"; - -var front = { - draft: function(part) { - // prettier-ignore - let {store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, final, paperless, macro} = part.shorthand(); - - // Building on top of back, just need to change the text - paths.example.attributes.set("data-text", "This is the back part"); - - // Final? - if (final) { - } - - // Paperless? - if (paperless) { - } - - return part; - } -}; - -export default front; diff --git a/packages/examples/src/index.js b/packages/examples/src/index.js index 0c964510499..92749b75e97 100644 --- a/packages/examples/src/index.js +++ b/packages/examples/src/index.js @@ -4,21 +4,123 @@ import pluginBundle from "@freesewing/plugin-bundle"; import config from "../config/config"; import { version } from "../package.json"; -import back from "./back"; -import front from "./front"; +import pointAttr from "./point.attr"; +import pointDist from "./point.dist"; +import pointDx from "./point.dx"; +import pointDy from "./point.dy"; +import pointAngle from "./point.angle"; +import pointRotate from "./point.rotate"; +import pointCopy from "./point.copy"; +import pointFlipX from "./point.flipx"; +import pointFlipY from "./point.flipy"; +import pointShift from "./point.shift"; +import pointShiftTowards from "./point.shifttowards"; +import pointShiftFractionTowards from "./point.shiftfractiontowards"; +import pointShiftOutwards from "./point.shiftoutwards"; +import pointSitsOn from "./point.sitson"; +import pointClone from "./point.clone"; + +import pathOps from "./path.ops"; +import pathAttr from "./path.attr"; +import pathOffset from "./path.offset"; +import pathLength from "./path.length"; +import pathStart from "./path.start"; +import pathEnd from "./path.end"; +import pathClone from "./path.clone"; +import pathJoin from "./path.join"; +import pathReverse from "./path.reverse"; +import pathShiftAlong from "./path.shiftalong"; +import pathShiftFractionAlong from "./path.shiftfractionalong"; + +import utilsLinesCross from "./utils.linescross"; +import utilsBeamsCross from "./utils.beamscross"; +import utilsBeamCrossesX from "./utils.beamcrossesx"; +import utilsBeamCrossesY from "./utils.beamcrossesy"; var pattern = new freesewing.Pattern({ version: version, ...config }).with( pluginBundle ); pattern.draft = function() { - this.parts.back = this.draftBack(new pattern.Part()); - this.parts.front = this.draftFront(new pattern.Part().copy(this.parts.back)); + this.parts.pointAttr = this.draftPointAttr(new pattern.Part()); + this.parts.pointDist = this.draftPointDist(new pattern.Part()); + this.parts.pointDx = this.draftPointDx(new pattern.Part()); + this.parts.pointDy = this.draftPointDy(new pattern.Part()); + this.parts.pointAngle = this.draftPointAngle(new pattern.Part()); + this.parts.pointRotate = this.draftPointRotate(new pattern.Part()); + this.parts.pointCopy = this.draftPointCopy(new pattern.Part()); + this.parts.pointFlipX = this.draftPointFlipX(new pattern.Part()); + this.parts.pointFlipY = this.draftPointFlipY(new pattern.Part()); + this.parts.pointShift = this.draftPointShift(new pattern.Part()); + this.parts.pointShiftTowards = this.draftPointShiftTowards(new pattern.Part()); + this.parts.pointShiftFractionTowards = this.draftPointShiftFractionTowards(new pattern.Part()); + this.parts.pointShiftOutwards = this.draftPointShiftOutwards(new pattern.Part()); + this.parts.pointSitsOn = this.draftPointSitsOn(new pattern.Part()); + this.parts.pointClone = this.draftPointClone(new pattern.Part()); + + this.parts.pathOps = this.draftPathOps(new pattern.Part()); + this.parts.pathAttr = this.draftPathAttr(new pattern.Part()); + this.parts.pathOffset = this.draftPathOffset(new pattern.Part()); + this.parts.pathLength = this.draftPathLength(new pattern.Part()); + this.parts.pathStart = this.draftPathStart(new pattern.Part()); + this.parts.pathEnd = this.draftPathEnd(new pattern.Part()); + this.parts.pathClone = this.draftPathClone(new pattern.Part()); + this.parts.pathJoin = this.draftPathJoin(new pattern.Part()); + this.parts.pathReverse = this.draftPathReverse(new pattern.Part()); + this.parts.pathShiftAlong = this.draftPathShiftAlong(new pattern.Part()); + this.parts.pathShiftFractionAlong = this.draftPathShiftFractionAlong(new pattern.Part()); + + this.parts.utilsLinesCross = this.draftUtilsLinesCross(new pattern.Part()); + this.parts.utilsBeamsCross = this.draftUtilsBeamsCross(new pattern.Part()); + this.parts.utilsBeamCrossesX = this.draftUtilsBeamCrossesX(new pattern.Part()); + this.parts.utilsbeamCrossesY = this.draftUtilsBeamCrossesY(new pattern.Part()); return pattern; }; -pattern.draftBack = part => back.draft(part); -pattern.draftFront = part => front.draft(part); +pattern.draftPointAttr = part => pointAttr.draft(part); +pattern.draftPointDist = part => pointDist.draft(part); +pattern.draftPointDx = part => pointDx.draft(part); +pattern.draftPointDy = part => pointDy.draft(part); +pattern.draftPointAngle = part => pointAngle.draft(part); +pattern.draftPointRotate = part => pointRotate.draft(part); +pattern.draftPointCopy = part => pointCopy.draft(part); +pattern.draftPointFlipX = part => pointFlipX.draft(part); +pattern.draftPointFlipY = part => pointFlipY.draft(part); +pattern.draftPointShift = part => pointShift.draft(part); +pattern.draftPointShiftTowards = part => pointShiftTowards.draft(part); +pattern.draftPointShiftFractionTowards = part => pointShiftFractionTowards.draft(part); +pattern.draftPointShiftOutwards = part => pointShiftOutwards.draft(part); +pattern.draftPointSitsOn = part => pointSitsOn.draft(part); +pattern.draftPointClone = part => pointClone.draft(part); + +pattern.draftPathOps = part => pathOps.draft(part); +pattern.draftPathAttr = part => pathAttr.draft(part); +pattern.draftPathOffset = part => pathOffset.draft(part); +pattern.draftPathLength = part => pathLength.draft(part); +pattern.draftPathStart = part => pathStart.draft(part); +pattern.draftPathEnd = part => pathEnd.draft(part); +pattern.draftPathClone = part => pathClone.draft(part); +pattern.draftPathJoin = part => pathJoin.draft(part); +pattern.draftPathReverse = part => pathReverse.draft(part); +pattern.draftPathShiftAlong = part => pathShiftAlong.draft(part); +pattern.draftPathShiftFractionAlong = part => pathShiftFractionAlong.draft(part); + +pattern.draftUtilsLinesCross = part => utilsLinesCross.draft(part); +pattern.draftUtilsBeamsCross = part => utilsBeamsCross.draft(part); +pattern.draftUtilsBeamCrossesX = part => utilsBeamCrossesX.draft(part); +pattern.draftUtilsBeamCrossesY = part => utilsBeamCrossesY.draft(part); + +// Add custom snippet +pattern.on('preRender', function(next) { + this.defs += ` + + + + +`; + next(); + +}); export default pattern; diff --git a/packages/examples/src/path.attr.js b/packages/examples/src/path.attr.js new file mode 100644 index 00000000000..73815298a58 --- /dev/null +++ b/packages/examples/src/path.attr.js @@ -0,0 +1,25 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pathAttrs = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + points.B = new Point(10, 30); + points.BCp2 = new Point(40, 40); + points.C = new Point(90, 30); + points.CCp1 = new Point(50, -30); + + paths.example = new Path() + .move(points.B) + .curve(points.BCp2, points.CCp1, points.C) + .attr('class', 'stroke-xl canvas') + .attr('data-text', 'I am text placed on a path') + .attr('data-text-class', 'center fill-note'); + + return part; + } +}; + +export default pathAttrs; diff --git a/packages/examples/src/path.clone.js b/packages/examples/src/path.clone.js new file mode 100644 index 00000000000..d5f1206f09e --- /dev/null +++ b/packages/examples/src/path.clone.js @@ -0,0 +1,27 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pathClone = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + points.A = new Point(45, 60); + points.B = new Point(10, 30); + points.BCp2 = new Point(40, 20); + points.C = new Point(90, 30); + points.CCp1 = new Point(50, -30); + + paths.example = new Path() + .move(points.A) + .line(points.B) + .curve(points.BCp2, points.CCp1, points.C); + + paths.clone = paths.example.clone() + .attr('class', 'note lashed stroke-xl'); + + return part; + } +}; + +export default pathClone; diff --git a/packages/examples/src/path.end.js b/packages/examples/src/path.end.js new file mode 100644 index 00000000000..1cc544328e3 --- /dev/null +++ b/packages/examples/src/path.end.js @@ -0,0 +1,25 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pathEnd = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + points.A = new Point(45, 60); + points.B = new Point(10, 30); + points.BCp2 = new Point(40, 20); + points.C = new Point(90, 30); + points.CCp1 = new Point(50, -30); + + paths.example = new Path() + .move(points.A) + .line(points.B) + .curve(points.BCp2, points.CCp1, points.C) + + snippets.x = new Snippet('x', paths.example.end()); + return part; + } +}; + +export default pathEnd; diff --git a/packages/examples/src/path.join.js b/packages/examples/src/path.join.js new file mode 100644 index 00000000000..89803341188 --- /dev/null +++ b/packages/examples/src/path.join.js @@ -0,0 +1,32 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pathJoin = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + points.A = new Point(45, 60); + points.B = new Point(10, 30); + points.BCp2 = new Point(40, 20); + points.C = new Point(90, 30); + points.CCp1 = new Point(50, -30); + + paths.path1 = new Path() + .move(points.A) + .line(points.B) + .attr('class', 'various'); + + paths.path2 = new Path() + .move(points.B) + .curve(points.BCp2, points.CCp1, points.C) + .attr('class', 'canvas'); + + paths.joint = paths.path1.join(paths.path2) + .attr('class', 'note lashed stroke-xl'); + + return part; + } +}; + +export default pathJoin; diff --git a/packages/examples/src/path.length.js b/packages/examples/src/path.length.js new file mode 100644 index 00000000000..fb038d60f22 --- /dev/null +++ b/packages/examples/src/path.length.js @@ -0,0 +1,43 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pathLength = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + points.A = new Point(45, 60); + points.B = new Point(10, 30); + points.BCp2 = new Point(40, 20); + points.C = new Point(90, 30); + points.CCp1 = new Point(50, -30); + + paths.example = new Path() + .move(points.A) + .line(points.B) + .curve(points.BCp2, points.CCp1, points.C) + + macro('pd', { + path: paths.example, + d: -20 + }); + + macro('pd', { + path: new Path() + .move(points.B) + .line(points.A), + d: 10 + }); + + macro('pd', { + path: new Path() + .move(points.B) + .curve(points.BCp2, points.CCp1, points.C), + d: -10 + }); + + return part; + } +}; + +export default pathLength; diff --git a/packages/examples/src/path.offset.js b/packages/examples/src/path.offset.js new file mode 100644 index 00000000000..6e02aca3c0f --- /dev/null +++ b/packages/examples/src/path.offset.js @@ -0,0 +1,40 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pathOffset = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + points.A = new Point(45, 60); + points.B = new Point(10, 30); + points.BCp2 = new Point(40, 20); + points.C = new Point(90, 30); + points.CCp1 = new Point(50, -30); + + paths.example = new Path() + .move(points.A) + .line(points.B) + .curve(points.BCp2, points.CCp1, points.C) + .line(points.A) + .close(); + + paths.offset = paths.example.offset(-10) + .attr('class', 'interfacing'); + + paths.lineOffset = new Path() + .move(points.A) + .line(points.B).offset(-5) + .attr('class', 'various'); + + paths.curveOffset = new Path() + .move(points.B) + .curve(points.BCp2, points.CCp1, points.C) + .offset(-5) + .attr('class', 'canvas'); + + return part; + } +}; + +export default pathOffset; diff --git a/packages/examples/src/path.ops.js b/packages/examples/src/path.ops.js new file mode 100644 index 00000000000..8d2a47cd880 --- /dev/null +++ b/packages/examples/src/path.ops.js @@ -0,0 +1,57 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pathOps = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + box(part); + + points.A = new Point(10, 10) + .attr('data-text', 'Move to point A') + .attr('data-text-class', 'center text-xs'); + points.B = new Point(70, 30); + points.BCp2 = new Point(40, 10); + points.C = new Point(90, -50); + points.CCp1 = new Point(125, -30); + + paths.example = new Path() + .move(points.A) + .line(points.B) + .curve(points.BCp2, points.CCp1, points.C) + .close(); + + + paths.handle1 = new Path().move(points.B).line(points.BCp2).attr('class', 'note dashed'); + paths.handle2 = new Path().move(points.C).line(points.CCp1).attr('class', 'note dashed'); + + snippets.A = new Snippet('notch', points.A); + snippets.B = new Snippet('notch', points.B); + snippets.C = new Snippet('notch', points.C); + snippets.Bcp2 = new Snippet('x', points.BCp2); + snippets.Ccp1 = new Snippet('x', points.CCp1); + + paths.textLine = new Path() + .move(points.A) + .line(points.B) + .attr('data-text', 'Line to point B') + .attr('data-text-class', 'center text-xs'); + + paths.textCurve = new Path() + .move(points.B) + .curve(points.BCp2, points.CCp1, points.C) + .attr('data-text', 'Curve to point C, using BCp2 and CCp1 as control points') + .attr('data-text-class', 'center text-xs'); + + paths.textClose = new Path() + .move(points.A) + .line(points.C) + .attr('data-text', 'Close path') + .attr('data-text-class', 'center text-xs'); + + return part; + } +}; + +export default pathOps; diff --git a/packages/examples/src/path.reverse.js b/packages/examples/src/path.reverse.js new file mode 100644 index 00000000000..999c34bcf3d --- /dev/null +++ b/packages/examples/src/path.reverse.js @@ -0,0 +1,26 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pathReverse = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + points.B = new Point(10, 30); + points.BCp2 = new Point(40, 20); + points.C = new Point(90, 30); + points.CCp1 = new Point(50, -30); + + paths.example = new Path() + .move(points.B) + .curve(points.BCp2, points.CCp1, points.C) + .attr('data-text', 'I am the original path'); + + paths.reverse = paths.example.reverse() + .attr('data-text', 'I am the reversed path'); + + return part; + } +}; + +export default pathReverse; diff --git a/packages/examples/src/path.shiftalong.js b/packages/examples/src/path.shiftalong.js new file mode 100644 index 00000000000..6279072a0fc --- /dev/null +++ b/packages/examples/src/path.shiftalong.js @@ -0,0 +1,35 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pathShiftAlong = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + points.A = new Point(45, 60); + points.B = new Point(10, 30); + points.BCp2 = new Point(40, 20); + points.C = new Point(90, 30); + points.CCp1 = new Point(50, -30); + + paths.example = new Path() + .move(points.A) + .line(points.B) + .curve(points.BCp2, points.CCp1, points.C); + + + points.X1 = paths.example.shiftAlong(20) + .attr('data-text', 'Shifted 2cm along this path') + .attr('data-text-class', 'center'); + points.X2 = paths.example.shiftAlong(90) + .attr('data-text', 'Shifted 9cm along this path') + .attr('data-text-class', 'center'); + + snippets.Xl = new Snippet('x', points.X1); + snippets.X2 = new Snippet('x', points.X2); + + return part; + } +}; + +export default pathShiftAlong; diff --git a/packages/examples/src/path.shiftfractionalong.js b/packages/examples/src/path.shiftfractionalong.js new file mode 100644 index 00000000000..1375f3f7217 --- /dev/null +++ b/packages/examples/src/path.shiftfractionalong.js @@ -0,0 +1,35 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pathShiftFractionAlong = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + points.A = new Point(45, 60); + points.B = new Point(10, 30); + points.BCp2 = new Point(40, 20); + points.C = new Point(90, 30); + points.CCp1 = new Point(50, -30); + + paths.example = new Path() + .move(points.A) + .line(points.B) + .curve(points.BCp2, points.CCp1, points.C); + + + points.X1 = paths.example.shiftFractionAlong(0.25) + .attr('data-text', 'Shifted 20% along this path') + .attr('data-text-class', 'center'); + points.X2 = paths.example.shiftFractionAlong(0.9) + .attr('data-text', 'Shifted 90% along this path') + .attr('data-text-class', 'center'); + + snippets.Xl = new Snippet('x', points.X1); + snippets.X2 = new Snippet('x', points.X2); + + return part; + } +}; + +export default pathShiftFractionAlong; diff --git a/packages/examples/src/path.start.js b/packages/examples/src/path.start.js new file mode 100644 index 00000000000..4a52b8b063c --- /dev/null +++ b/packages/examples/src/path.start.js @@ -0,0 +1,25 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pathStart = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + points.A = new Point(45, 60); + points.B = new Point(10, 30); + points.BCp2 = new Point(40, 20); + points.C = new Point(90, 30); + points.CCp1 = new Point(50, -30); + + paths.example = new Path() + .move(points.A) + .line(points.B) + .curve(points.BCp2, points.CCp1, points.C) + + snippets.x = new Snippet('x', paths.example.start()); + return part; + } +}; + +export default pathStart; diff --git a/packages/examples/src/point.angle.js b/packages/examples/src/point.angle.js new file mode 100644 index 00000000000..443754397b1 --- /dev/null +++ b/packages/examples/src/point.angle.js @@ -0,0 +1,36 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointAngle = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets} = part.shorthand(); + + box(part, 80, 80); + + points.sun = new Point(40, 40); + points.moon1 = new Point(70, 40).attr('data-text', '0').attr('data-text-class', 'text-xl'); + points.moon2 = new Point(40, 10).attr('data-text', 90).attr('data-text-class', 'text-xl'); + points.moon3 = new Point(10, 40).attr('data-text', 180).attr('data-text-class', 'text-xl'); + points.moon4 = new Point(40, 70).attr('data-text', 270).attr('data-text-class', 'text-xl'); + points.moon5 = points.moon1.rotate(-45, points.sun); + points.moon5.attr('data-text', points.sun.angle(points.moon5)).attr('data-text-class', 'text-xl'); + + paths.moon1 = new Path().move(points.sun).line(points.moon1).attr('class', 'dashed note'); + paths.moon2 = new Path().move(points.sun).line(points.moon2).attr('class', 'dashed note'); + paths.moon3 = new Path().move(points.sun).line(points.moon3).attr('class', 'dashed note'); + paths.moon4 = new Path().move(points.sun).line(points.moon4).attr('class', 'dashed note'); + paths.moon5 = new Path().move(points.sun).line(points.moon5).attr('class', 'dashed note'); + + snippets.notch = new Snippet("notch", points.sun); + snippets.notch1 = new Snippet("x", points.moon1); + snippets.notch2 = new Snippet("x", points.moon2); + snippets.notch3 = new Snippet("x", points.moon3); + snippets.notch4 = new Snippet("x", points.moon4); + snippets.notch5 = new Snippet("x", points.moon5); + + return part; + } +}; + +export default pointAngle; diff --git a/packages/examples/src/point.attr.js b/packages/examples/src/point.attr.js new file mode 100644 index 00000000000..2b69beb82e5 --- /dev/null +++ b/packages/examples/src/point.attr.js @@ -0,0 +1,22 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointAttr = { + draft: function(part) { + // prettier-ignore + let {Point, points, Snippet, snippets} = part.shorthand(); + + box(part); + + points.anchor = new Point(50, 25) + .attr("data-text", "Hello world!\nThis is\na line break.") + .attr("data-text-class", "text-xl center") + .attr("data-text-lineheight", 10); + + snippets.notch = new Snippet("x", points.anchor); + + return part; + } +}; + +export default pointAttr; diff --git a/packages/examples/src/point.clone.js b/packages/examples/src/point.clone.js new file mode 100644 index 00000000000..fbdf96f4c73 --- /dev/null +++ b/packages/examples/src/point.clone.js @@ -0,0 +1,23 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointClone = { + draft: function(part) { + // prettier-ignore + let {Point, points, Snippet, snippets} = part.shorthand(); + + box(part); + + points.A= new Point(50, 25) + .attr('data-text', 'Point A') + .attr('data-text-class', 'text-xl') + .attr('data-text-fill-opacity', '0.5'); + points.B = points.A.clone().attr('data-text', 'Point B'); + + snippets.x = new Snippet("x", points.A); + + return part; + } +}; + +export default pointClone; diff --git a/packages/examples/src/point.copy.js b/packages/examples/src/point.copy.js new file mode 100644 index 00000000000..071b37d9722 --- /dev/null +++ b/packages/examples/src/point.copy.js @@ -0,0 +1,20 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointCopy = { + draft: function(part) { + // prettier-ignore + let {Point, points, Snippet, snippets} = part.shorthand(); + + box(part); + + points.A= new Point(50, 25).attr('data-text', 'Point A').attr('data-text-class', 'text-xl'); + points.B = points.A.copy().attr('data-text', 'Point B'); + + snippets.x = new Snippet("x", points.A); + + return part; + } +}; + +export default pointCopy; diff --git a/packages/examples/src/point.dist.js b/packages/examples/src/point.dist.js new file mode 100644 index 00000000000..b87ecc20afe --- /dev/null +++ b/packages/examples/src/point.dist.js @@ -0,0 +1,26 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointDist = { + draft: function(part) { + // prettier-ignore + let {Point, points, Snippet, snippets, macro} = part.shorthand(); + + box(part); + + points.from = new Point(10, 10); + points.to = new Point(90, 40); + + macro('ld', { + from: points.from, + to: points.to + }); + + snippets.notch1 = new Snippet("x", points.from); + snippets.notch2 = new Snippet("x", points.to); + + return part; + } +}; + +export default pointDist; diff --git a/packages/examples/src/point.dx.js b/packages/examples/src/point.dx.js new file mode 100644 index 00000000000..9e23865d603 --- /dev/null +++ b/packages/examples/src/point.dx.js @@ -0,0 +1,27 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointDx = { + draft: function(part) { + // prettier-ignore + let {Point, points, Snippet, snippets, macro} = part.shorthand(); + + box(part); + + points.from = new Point(10, 10); + points.to = new Point(90, 40); + + macro('hd', { + from: points.from, + to: points.to, + y: 25 + }); + + snippets.notch1 = new Snippet("x", points.from); + snippets.notch2 = new Snippet("x", points.to); + + return part; + } +}; + +export default pointDx; diff --git a/packages/examples/src/point.dy.js b/packages/examples/src/point.dy.js new file mode 100644 index 00000000000..226d74efdf3 --- /dev/null +++ b/packages/examples/src/point.dy.js @@ -0,0 +1,27 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointDy = { + draft: function(part) { + // prettier-ignore + let {Point, points, Snippet, snippets, macro} = part.shorthand(); + + box(part); + + points.from = new Point(10, 10); + points.to = new Point(90, 40); + + macro('vd', { + from: points.to, + to: points.from, + x: 50 + }); + + snippets.notch1 = new Snippet("x", points.from); + snippets.notch2 = new Snippet("x", points.to); + + return part; + } +}; + +export default pointDy; diff --git a/packages/examples/src/point.flipx.js b/packages/examples/src/point.flipx.js new file mode 100644 index 00000000000..26964b4225d --- /dev/null +++ b/packages/examples/src/point.flipx.js @@ -0,0 +1,58 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointFlipX = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + box(part); + + points.top = new Point(50, 10); + points.out1 = new Point(70, 30); + points.in1 = new Point(55, 35); + points.out2 = new Point(75, 50); + points.in2 = new Point(60, 55); + points.out3 = new Point(80, 70); + points.in3 = new Point(55, 70); + points.trunkOut = new Point(55, 80); + points.trunkIn = new Point(50, 80); + + points._out1 = points.out1.flipX(points.top); + points._in1 = points.in1.flipX(points.top); + points._out2 = points.out2.flipX(points.top); + points._in2 = points.in2.flipX(points.top); + points._out3 = points.out3.flipX(points.top); + points._in3 = points.in3.flipX(points.top); + points._trunkOut = points.trunkOut.flipX(points.top); + + points.bottom = new Point(50, 80); + + paths.tree = new Path() + .move(points.top) + .line(points.out1) + .line(points.in1) + .line(points.out2) + .line(points.in2) + .line(points.out3) + .line(points.in3) + .line(points.trunkOut) + .line(points._trunkOut) + .line(points._in3) + .line(points._out3) + .line(points._in2) + .line(points._out2) + .line(points._in1) + .line(points._out1) + .close(); + + paths.mirror = new Path() + .move(points.top) + .line(points.bottom) + .attr('class', 'note dashed'); + + return part; + } +}; + +export default pointFlipX; diff --git a/packages/examples/src/point.flipy.js b/packages/examples/src/point.flipy.js new file mode 100644 index 00000000000..4cee25ce29e --- /dev/null +++ b/packages/examples/src/point.flipy.js @@ -0,0 +1,83 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointFlipX = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + box(part); + + points.start = new Point(0, 50); + points.churchTowerWallLeft = new Point(10, 50); + points.churchTowerRoofLeft = new Point(10, 30); + points.churchTowerTop = new Point(15, 10); + points.churchTowerRoofRight = new Point(20, 30); + points.churchRoofRight = new Point(50, 30); + points.churchWallRight = new Point(50, 50); + points.houseWallLeft = new Point(65, 50); + points.houseRoofLeft = new Point(65, 35); + points.houseRoofTop = new Point(75, 25); + points.houseRoofRight = new Point(85, 35); + points.houseWallRight = new Point(85, 50); + points.end = new Point(95, 50); + + points.mirror = new Point(0,60); + points.mirrorLineEnd = new Point(95,60); + + points._start = points.start.flipY(points.mirror); + points._churchTowerWallLeft = points.churchTowerWallLeft.flipY(points.mirror); + points._churchTowerRoofLeft = points.churchTowerRoofLeft.flipY(points.mirror); + points._churchTowerTop = points.churchTowerTop.flipY(points.mirror); + points._churchTowerRoofRight = points.churchTowerRoofRight.flipY(points.mirror); + points._churchRoofRight = points.churchRoofRight.flipY(points.mirror); + points._churchWallRight = points.churchWallRight.flipY(points.mirror); + points._houseWallLeft = points.houseWallLeft.flipY(points.mirror); + points._houseRoofLeft = points.houseRoofLeft.flipY(points.mirror); + points._houseRoofTop = points.houseRoofTop.flipY(points.mirror); + points._houseRoofRight = points.houseRoofRight.flipY(points.mirror); + points._houseWallRight = points.houseWallRight.flipY(points.mirror); + points._end = points.end.flipY(points.mirror); + + paths.skylineTop = new Path() + .move(points.start) + .line(points.churchTowerWallLeft) + .line(points.churchTowerRoofLeft) + .line(points.churchTowerTop) + .line(points.churchTowerRoofRight) + .line(points.churchRoofRight) + .line(points.churchWallRight) + .line(points.houseWallLeft) + .line(points.houseRoofLeft) + .line(points.houseRoofTop) + .line(points.houseRoofRight) + .line(points.houseWallRight) + .line(points.end) + ; + + paths.skylineBottom = new Path() + .move(points._start) + .line(points._churchTowerWallLeft) + .line(points._churchTowerRoofLeft) + .line(points._churchTowerTop) + .line(points._churchTowerRoofRight) + .line(points._churchRoofRight) + .line(points._churchWallRight) + .line(points._houseWallLeft) + .line(points._houseRoofLeft) + .line(points._houseRoofTop) + .line(points._houseRoofRight) + .line(points._houseWallRight) + .line(points._end) + ; + + paths.mirrorLine = new Path() + .move(points.mirror) + .line(points.mirrorLineEnd) + .attr('class', 'note dashed'); + + return part; + } +}; + +export default pointFlipX; diff --git a/packages/examples/src/point.rotate.js b/packages/examples/src/point.rotate.js new file mode 100644 index 00000000000..bcee8c99023 --- /dev/null +++ b/packages/examples/src/point.rotate.js @@ -0,0 +1,27 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointRotate = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets} = part.shorthand(); + + box(part, 80, 80); + + points.sun = new Point(40, 40); + snippets.sun = new Snippet("notch", points.sun); + points.moon = new Point(70, 40); + let angle = 0; + let step = 360 / 36; + for(let i=1; i<37; i++) { + let angle = step * i; + points[`moon${i}`] = points.moon.rotate(angle, points.sun); + paths[`moon${i}`] = new Path().move(points.sun).line(points[`moon${i}`]); + snippets[`moon${i}`] = new Snippet("x", points[`moon${i}`]); + } + + return part; + } +}; + +export default pointRotate; diff --git a/packages/examples/src/point.shift.js b/packages/examples/src/point.shift.js new file mode 100644 index 00000000000..287b221debc --- /dev/null +++ b/packages/examples/src/point.shift.js @@ -0,0 +1,29 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointShift = { + draft: function(part) { + // prettier-ignore + let {Point, points, Snippet, snippets, macro} = part.shorthand(); + + box(part); + + points.A = new Point(90, 40).attr('data-text', 'Point A'); + points.B = points.A.shift(155, 70) + .attr('data-text', "Point B is point A shifted 7cm\nat a 155 degree angle") + .attr('data-text-lineheight', 6); + + snippets.A = new Snippet("x", points.A); + snippets.B = new Snippet("x", points.B); + + macro('ld', { + from: points.B, + to: points.A, + d: -10 + }); + + return part; + } +}; + +export default pointShift; diff --git a/packages/examples/src/point.shiftfractiontowards.js b/packages/examples/src/point.shiftfractiontowards.js new file mode 100644 index 00000000000..d53dde778bf --- /dev/null +++ b/packages/examples/src/point.shiftfractiontowards.js @@ -0,0 +1,43 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointShiftFractionTowards = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + box(part); + + points.A = new Point(90, 70).attr('data-text', 'Point A'); + points.B = new Point(10, 10).attr('data-text', 'Point B'); + points.C = points.A.shiftFractionTowards(points.B, 0.5) + .attr('data-text', "Point C is point A shifted 50%\nin the direction of point B") + .attr('data-text-class', "center") + .attr('data-text-lineheight', 6); + + snippets.A = new Snippet("x", points.A); + snippets.B = new Snippet("x", points.B); + snippets.C = new Snippet("x", points.C); + + paths.direction = new Path() + .move(points.A) + .line(points.B) + .attr('class', 'note dashed'); + + macro('ld', { + from: points.C, + to: points.A, + d: -10 + }); + + macro('ld', { + from: points.B, + to: points.A, + d: 20 + }); + + return part; + } +}; + +export default pointShiftFractionTowards; diff --git a/packages/examples/src/point.shiftoutwards.js b/packages/examples/src/point.shiftoutwards.js new file mode 100644 index 00000000000..5e8073b1530 --- /dev/null +++ b/packages/examples/src/point.shiftoutwards.js @@ -0,0 +1,36 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointShiftOutwards = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + box(part); + + points.A = new Point(90, 70).attr('data-text', 'Point A'); + points.B = new Point(10, 10).attr('data-text', 'Point B'); + points.C = points.A.shiftOutwards(points.B, 30) + .attr('data-text', "Point C is point A shifted 3cm\nbeyond point B") + .attr('data-text-lineheight', 6); + + snippets.A = new Snippet("x", points.A); + snippets.B = new Snippet("x", points.B); + snippets.C = new Snippet("x", points.C); + + paths.direction = new Path() + .move(points.A) + .line(points.C) + .attr('class', 'note dashed'); + + macro('ld', { + from: points.C, + to: points.B, + d: -10 + }); + + return part; + } +}; + +export default pointShiftOutwards; diff --git a/packages/examples/src/point.shifttowards.js b/packages/examples/src/point.shifttowards.js new file mode 100644 index 00000000000..fdd79c3a732 --- /dev/null +++ b/packages/examples/src/point.shifttowards.js @@ -0,0 +1,37 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointShiftTowards = { + draft: function(part) { + // prettier-ignore + let {Point, points, Path, paths, Snippet, snippets, macro} = part.shorthand(); + + box(part); + + points.A = new Point(90, 70).attr('data-text', 'Point A'); + points.B = new Point(10, 10).attr('data-text', 'Point B'); + points.C = points.A.shiftTowards(points.B, 35) + .attr('data-text', "Point C is point A shifted 3.5cm\nin the direction of point B") + .attr('data-text-class', "center") + .attr('data-text-lineheight', 6); + + snippets.A = new Snippet("x", points.A); + snippets.B = new Snippet("x", points.B); + snippets.C = new Snippet("x", points.C); + + paths.direction = new Path() + .move(points.A) + .line(points.B) + .attr('class', 'note dashed'); + + macro('ld', { + from: points.C, + to: points.A, + d: -10 + }); + + return part; + } +}; + +export default pointShiftTowards; diff --git a/packages/examples/src/point.sitson.js b/packages/examples/src/point.sitson.js new file mode 100644 index 00000000000..991dcae1186 --- /dev/null +++ b/packages/examples/src/point.sitson.js @@ -0,0 +1,25 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var pointDx = { + draft: function(part) { + // prettier-ignore + let {Point, points, Snippet, snippets, macro} = part.shorthand(); + + box(part); + + let s; + for(let i=0; i<10; i++) { + points[`a${i}`] = new Point(i * 10, 40); + points[`b${i}`] = new Point(i * 10, i * 8); + if(points[`a${i}`].sitsOn(points[`b${i}`])) s = 'notch'; + else s = 'x'; + snippets[`b${i}`] = new Snippet(s, points[`b${i}`]); + snippets[`a${i}`] = new Snippet(s, points[`a${i}`]); + } + + return part; + } +}; + +export default pointDx; diff --git a/packages/examples/src/shared.js b/packages/examples/src/shared.js new file mode 100644 index 00000000000..4b427d72d66 --- /dev/null +++ b/packages/examples/src/shared.js @@ -0,0 +1,13 @@ +/** + * This draws a (diagonal in a) box + * with with w and height h with a non-visible line. + * This is to force our examples parts to a certain size + */ +export function box(part, w = 100, h = 50) { + part.paths.box = new part.Path() + .move(new part.Point(0, 0)) + .line(new part.Point(w, h)) + .attr("class", "hidden"); + + return part; +} diff --git a/packages/examples/src/utils.beamcrossesx.js b/packages/examples/src/utils.beamcrossesx.js new file mode 100644 index 00000000000..76fae7ee0d9 --- /dev/null +++ b/packages/examples/src/utils.beamcrossesx.js @@ -0,0 +1,31 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var utilsBeamCrossesX = { + draft: function(part) { + // prettier-ignore + let {debug, Point, points, Path, paths, Snippet, snippets, utils} = part.shorthand(); + + points.A = new Point(10, 10); + points.B = new Point(50, 40); + + paths.AB = new Path() + .move(points.A) + .line(points.B); + + snippets.X = new Snippet('x', utils.beamCrossesX( + points.A, + points.B, + 40) + ); + + paths.help = new Path() + .move(new Point(40,0)) + .line(new Point(40,50)) + .attr('class', 'note dashed'); + + return part; + } +}; + +export default utilsBeamCrossesX; diff --git a/packages/examples/src/utils.beamcrossesy.js b/packages/examples/src/utils.beamcrossesy.js new file mode 100644 index 00000000000..571ecc66dca --- /dev/null +++ b/packages/examples/src/utils.beamcrossesy.js @@ -0,0 +1,30 @@ +import freesewing from "freesewing"; + +var utilsBeamCrossesY = { + draft: function(part) { + // prettier-ignore + let {debug, Point, points, Path, paths, Snippet, snippets, utils} = part.shorthand(); + + points.A = new Point(10, 10); + points.B = new Point(50, 40); + + paths.AB = new Path() + .move(points.A) + .line(points.B); + + snippets.X = new Snippet('x', utils.beamCrossesY( + points.A, + points.B, + 30) + ); + + paths.help = new Path() + .move(new Point(0,30)) + .line(new Point(50,30)) + .attr('class', 'note dashed'); + + return part; + } +}; + +export default utilsBeamCrossesY; diff --git a/packages/examples/src/utils.beamscross.js b/packages/examples/src/utils.beamscross.js new file mode 100644 index 00000000000..a6da16928c7 --- /dev/null +++ b/packages/examples/src/utils.beamscross.js @@ -0,0 +1,32 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var utilsBeamsCross = { + draft: function(part) { + // prettier-ignore + let {debug, Point, points, Path, paths, Snippet, snippets, utils} = part.shorthand(); + + points.A = new Point(10, 10); + points.B = new Point(50, 40); + points.C = new Point(45, 20); + points.D = new Point(60, 15); + + paths.AB = new Path() + .move(points.A) + .line(points.B); + paths.CD = new Path() + .move(points.C) + .line(points.D); + + snippets.X = new Snippet('x', utils.beamsCross( + points.A, + points.B, + points.C, + points.D) + ); + + return part; + } +}; + +export default utilsBeamsCross; diff --git a/packages/examples/src/utils.linescross.js b/packages/examples/src/utils.linescross.js new file mode 100644 index 00000000000..eead313dc54 --- /dev/null +++ b/packages/examples/src/utils.linescross.js @@ -0,0 +1,32 @@ +import freesewing from "freesewing"; +import { box } from "./shared"; + +var utilsLinesCross = { + draft: function(part) { + // prettier-ignore + let {debug, Point, points, Path, paths, Snippet, snippets, utils} = part.shorthand(); + + points.A = new Point(10, 10); + points.B = new Point(50, 40); + points.C = new Point(15, 30); + points.D = new Point(60, 15); + + paths.AB = new Path() + .move(points.A) + .line(points.B); + paths.CD = new Path() + .move(points.C) + .line(points.D); + + snippets.X = new Snippet('x', utils.linesCross( + points.A, + points.B, + points.C, + points.D) + ); + + return part; + } +}; + +export default utilsLinesCross;