From 829baa469b7e0a1fb474efeef9f30af21730542d Mon Sep 17 00:00:00 2001 From: Joost De Cock Date: Fri, 7 Sep 2018 16:09:14 +0200 Subject: [PATCH] :recycle: Reworked sampling/anchor code --- src/pattern.js | 81 ++++++++++++++++++++----------------------- tests/path.test.js | 21 +++++++++++ tests/pattern.test.js | 6 ++-- tests/point.test.js | 19 ++++++++++ 4 files changed, 80 insertions(+), 47 deletions(-) diff --git a/src/pattern.js b/src/pattern.js index 886f0f64cd7..d5c0b2200f3 100644 --- a/src/pattern.js +++ b/src/pattern.js @@ -106,6 +106,37 @@ Pattern.prototype.sampleParts = function() { return parts; }; +Pattern.prototype.sampleRun = function(parts, anchors, l, extraClass = false) { + this.draft(); + for (let i in this.parts) { + let anchor = false; + let dx = 0; + let dy = 0; + if (this.parts[i].points.anchor) { + if (typeof anchors[i] === "undefined") + anchors[i] = this.parts[i].points.anchor; + else { + if (!anchors[i].sitsOn(this.parts[i].points.anchor)) { + dx = this.parts[i].points.anchor.dx(anchors[i]); + dy = this.parts[i].points.anchor.dy(anchors[i]); + } + } + } + for (let j in this.parts[i].paths) { + parts[i].paths[j + "_" + l] = this.parts[i].paths[j] + .clone() + .attr("class", "sample sample-" + l, true); + if (this.parts[i].points.anchor) + parts[i].paths[j + "_" + l] = parts[i].paths[j + "_" + l].translate( + dx, + dy + ); + if (extraClass !== false) + parts[i].paths[j + "_" + l].attributes.add("class", extraClass); + } + } +}; + /** * Handles option sampling */ @@ -127,32 +158,7 @@ Pattern.prototype.sampleOption = function(optionName) { debugStyle("info", "🔬 Sample run"), `Sampling option ${optionName} with value ${round(val)}` ); - this.draft(); - for (let i in this.parts) { - let anchor = false; - let dx = 0; - let dy = 0; - if (this.parts[i].points.anchor) { - if (typeof anchors[i] === "undefined") - anchors[i] = this.parts[i].points.anchor; - else { - if (!anchors[i].sitsOn(this.parts[i].points.anchor)) { - dx = this.parts[i].points.anchor.dx(anchors[i]); - dy = this.parts[i].points.anchor.dy(anchors[i]); - } - } - } - for (let j in this.parts[i].paths) { - parts[i].paths[j + "_" + l] = this.parts[i].paths[j] - .clone() - .attr("class", "sample-" + l, true); - if (this.parts[i].points.anchor) - parts[i].paths[j + "_" + l] = parts[i].paths[j + "_" + l].translate( - dx, - dy - ); - } - } + this.sampleRun(parts, anchors, l); val += step; } this.parts = parts; @@ -164,6 +170,7 @@ Pattern.prototype.sampleOption = function(optionName) { * Handles measurement sampling */ Pattern.prototype.sampleMeasurement = function(measurementName) { + let anchors = {}; let parts = this.sampleParts(); let val = this.settings.measurements[measurementName]; if (val === undefined) throw "Cannot sample a measurement that is undefined"; @@ -175,14 +182,7 @@ Pattern.prototype.sampleMeasurement = function(measurementName) { debugStyle("info", "🔬 Sample run"), `Sampling measurement ${measurementName} with value ${round(val)}` ); - this.draft(); - for (let i in this.parts) { - for (let j in this.parts[i].paths) { - parts[i].paths[j + "_" + l] = this.parts[i].paths[j] - .clone() - .attr("class", "sample-" + l, true); - } - } + this.sampleRun(parts, anchors, l); val += step; } this.parts = parts; @@ -194,22 +194,15 @@ Pattern.prototype.sampleMeasurement = function(measurementName) { * Handles models sampling */ Pattern.prototype.sampleModels = function(models, focus = false) { + let anchors = {}; let parts = this.sampleParts(); let count = 0; for (let l in models) { count++; this.settings.measurements = models[l]; this.debug(debugStyle("info", "🔬 Sample run"), `Sampling model ${l}`); - this.draft(); - for (let i in this.parts) { - for (let j in this.parts[i].paths) { - parts[i].paths[j + "_" + count] = this.parts[i].paths[j] - .clone() - .attr("class", "sample sample-" + count, true); - if (l === focus) - parts[i].paths[j + "_" + count].attr("class", "sample-focus"); - } - } + let className = l === focus ? "sample-focus" : ""; + this.sampleRun(parts, anchors, count, className); } this.parts = parts; diff --git a/tests/path.test.js b/tests/path.test.js index 48e34628d4c..d12279140ad 100644 --- a/tests/path.test.js +++ b/tests/path.test.js @@ -702,3 +702,24 @@ it("Should trim a path when a curves overlap", () => { expect(test.ops[2].to.x).to.equal(50); expect(test.ops[2].to.y).to.equal(11.01); }); + +it("Should translate a path", () => { + let pattern = new freesewing.Pattern(); + pattern.parts.a = new pattern.Part(); + let a = pattern.parts.a; + a.points.A = new a.Point(0, 0); + a.points.B = new a.Point(100, 100); + a.points.C = new a.Point(0, 100); + a.points.D = new a.Point(100, 0); + + let base = new a.Path() + .move(a.points.A) + .curve(a.points.B, a.points.C, a.points.D); + let test = base.translate(10, 20); + + expect(test.ops.length).to.equal(2); + expect(test.ops[0].to.x).to.equal(10); + expect(test.ops[0].to.y).to.equal(20); + expect(test.ops[1].to.x).to.equal(110); + expect(test.ops[1].to.y).to.equal(20); +}); diff --git a/tests/pattern.test.js b/tests/pattern.test.js index 7c89abdec1e..f045b503ef6 100644 --- a/tests/pattern.test.js +++ b/tests/pattern.test.js @@ -171,9 +171,9 @@ it("Should sample models with focus", () => { expect(pattern.parts.a.paths.test_1.attributes.get("class")).to.equal( "sample sample-1 sample-focus" ); - expect(pattern.parts.b.paths.test_2.attributes.get("class")).to.equal( - "sample sample-2" - ); + expect( + pattern.parts.b.paths.test_2.attributes.get("class") + ).to.equalIgnoreSpaces("sample sample-2"); }); it("Should register a hook via on", () => { diff --git a/tests/point.test.js b/tests/point.test.js index 55040095cd7..7725c54879d 100644 --- a/tests/point.test.js +++ b/tests/point.test.js @@ -50,12 +50,24 @@ it("Should check points for equality", () => { expect(a).to.deep.equal(b); }); +it("Should flip point around X value zero", () => { + let result = new Point(2, 4).flipX(); + expect(result.x).to.equal(-2); + expect(result.y).to.equal(4); +}); + it("Should flip point around X value", () => { let result = new Point(2, 4).flipX(new Point(-20, 19)); expect(result.x).to.equal(-42); expect(result.y).to.equal(4); }); +it("Should flip point around Y value zero", () => { + let result = new Point(2, 4).flipY(); + expect(result.x).to.equal(2); + expect(result.y).to.equal(-4); +}); + it("Should flip point around Y value", () => { let result = new Point(2, 4).flipY(new Point(12, -14)); expect(result.x).to.equal(2); @@ -190,3 +202,10 @@ it("Should clone a point", () => { expect(p2.sitsOn(p1)).to.equal(true); expect(p2.attributes.get("class")).to.equal("something else"); }); + +it("Should translate a point", () => { + let p1 = new Point(10, 20); + let p2 = p1.translate(15, 50); + expect(p2.x).to.equal(25); + expect(p2.y).to.equal(70); +});