From 904b23a1210742a841f522a68be2bfb8b998df40 Mon Sep 17 00:00:00 2001 From: joostdecock Date: Sun, 25 Sep 2022 16:41:05 +0200 Subject: [PATCH] chore(plugin-dimension): Changes for v3. See #2856 --- plugins/plugin-dimension/src/index.mjs | 108 ++++++++++-------- .../plugin-dimension/tests/plugin.test.mjs | 52 +++++---- 2 files changed, 90 insertions(+), 70 deletions(-) diff --git a/plugins/plugin-dimension/src/index.mjs b/plugins/plugin-dimension/src/index.mjs index 092aff47f4c..1108bc8a018 100644 --- a/plugins/plugin-dimension/src/index.mjs +++ b/plugins/plugin-dimension/src/index.mjs @@ -10,12 +10,12 @@ const markers = ` ` const prefix = '__paperless' -function drawDimension(from, to, so, self) { - const dimension = new self.Path() +function drawDimension(from, to, so, { Path, units }) { + const dimension = new Path() .move(from) .line(to) .attr('class', 'mark') - .attr('data-text', so.text || self.units(from.dist(to))) + .attr('data-text', so.text || units(from.dist(to))) .attr('data-text-class', 'fill-mark center') if (!so.noStartMarker) dimension.attributes.set('marker-start', 'url(#dimensionFrom)') if (!so.noEndMarker) dimension.attributes.set('marker-end', 'url(#dimensionTo)') @@ -23,35 +23,37 @@ function drawDimension(from, to, so, self) { return dimension } -function drawLeader(self, from, to, id) { - self.paths[id] = new self.Path().move(from).line(to).attr('class', 'mark dotted') +function drawLeader({ paths, Path }, from, to, id) { + paths[id] = new Path().move(from).line(to).attr('class', 'mark dotted') } -function hleader(so, type, self, id) { +function hleader(so, type, props, id) { + const { Point } = props let point if (typeof so.y === 'undefined' || so[type].y === so.y) { point = so[type] } else { - point = new self.Point(so[type].x, so.y) - drawLeader(self, so[type], point, id) + point = new Point(so[type].x, so.y) + drawLeader(props, so[type], point, id) } return point } -function vleader(so, type, self, id) { +function vleader(so, type, props, id) { + const { Point } = props let point if (typeof so.x === 'undefined' || so[type].x === so.x) { point = so[type] } else { - point = new self.Point(so.x, so[type].y) - drawLeader(self, so[type], point, id) + point = new Point(so.x, so[type].y) + drawLeader(props, so[type], point, id) } return point } -function lleader(so, type, self, id) { +function lleader(so, type, props, id) { let point, rot, other if (type === 'from') { rot = 1 @@ -64,7 +66,7 @@ function lleader(so, type, self, id) { point = so[type] } else { point = so[type].shiftTowards(so[other], so.d).rotate(90 * rot, so[type]) - drawLeader(self, so[type], point, id) + drawLeader(props, so[type], point, id) } return point @@ -80,69 +82,75 @@ export const plugin = { }, macros: { // horizontal - hd: function (so) { - const id = so.id || this.getId(prefix) - this.paths[id] = drawDimension( - hleader(so, 'from', this, id + '_ls'), - hleader(so, 'to', this, id + '_le'), + hd: function (so, props) { + const { getId, paths } = props + const id = so.id || getId(prefix) + paths[id] = drawDimension( + hleader(so, 'from', props, id + '_ls'), + hleader(so, 'to', props, id + '_le'), so, - this + props ) }, // vertical - vd: function (so) { - const id = so.id || this.getId(prefix) - this.paths[id] = drawDimension( - vleader(so, 'from', this, id + '_ls'), - vleader(so, 'to', this, id + '_le'), + vd: function (so, props) { + const { getId, paths } = props + const id = so.id || getId(prefix) + paths[id] = drawDimension( + vleader(so, 'from', props, id + '_ls'), + vleader(so, 'to', props, id + '_le'), so, - this + props ) }, // linear - ld: function (so) { - const id = so.id || this.getId(prefix) - this.paths[id] = drawDimension( - lleader(so, 'from', this, id + '_ls'), - lleader(so, 'to', this, id + '_le'), + ld: function (so, props) { + const { getId, paths } = props + const id = so.id || getId(prefix) + paths[id] = drawDimension( + lleader(so, 'from', props, id + '_ls'), + lleader(so, 'to', props, id + '_le'), so, - this + props ) }, // path - pd: function (so) { - const id = so.id || this.getId(prefix) - if (typeof so.d === 'undefined') so.d = 10 * this.context.settings.scale + pd: function (so, props) { + const { getId, paths, scale, units } = props + const id = so.id || getId(prefix) + if (typeof so.d === 'undefined') so.d = 10 * scale const dimension = so.path .offset(so.d) .attr('class', 'mark') - .attr('data-text', so.text || this.units(so.path.length())) + .attr('data-text', so.text || units(so.path.length())) .attr('data-text-class', 'fill-mark center') if (!so.noStartMarker) dimension.attributes.set('marker-start', 'url(#dimensionFrom)') if (!so.noEndMarker) dimension.attributes.set('marker-end', 'url(#dimensionTo)') - this.paths[id] = dimension - drawLeader(this, so.path.start(), dimension.start(), id + '_ls') - drawLeader(this, so.path.end(), dimension.end(), id + '_le') + paths[id] = dimension + drawLeader(props, so.path.start(), dimension.start(), id + '_ls') + drawLeader(props, so.path.end(), dimension.end(), id + '_le') }, // Remove dimension - rmd: function (so) { - if (this.paths[so.id]) delete this.paths[so.id] - if (this.paths[`${so.id}_ls`]) delete this.paths[`${so.id}_ls`] - if (this.paths[`${so.id}_le`]) delete this.paths[`${so.id}_le`] + rmd: function (so, props) { + const { paths } = props + if (paths[so.id]) delete this.paths[so.id] + if (paths[`${so.id}_ls`]) delete paths[`${so.id}_ls`] + if (paths[`${so.id}_le`]) delete paths[`${so.id}_le`] if (Array.isArray(so.ids)) { for (const id of so.ids) { - if (this.paths[id]) delete this.paths[id] - if (this.paths[`${id}_ls`]) delete this.paths[`${id}_ls`] - if (this.paths[`${id}_le`]) delete this.paths[`${id}_le`] + if (paths[id]) delete paths[id] + if (paths[`${id}_ls`]) delete paths[`${id}_ls`] + if (paths[`${id}_le`]) delete paths[`${id}_le`] } } }, // Remove all dimensions (with standard prefix) - rmad: function () { - for (let type of ['paths', 'points']) { - for (let id in this[type]) { - if (id.slice(0, prefix.length) === prefix) delete this[type][id] - } + rmad: function ({ prefix = '' }, { paths, points }) { + for (let id in points) { + if (id.slice(0, prefix.length) === prefix) delete points[id] + } + for (let id in paths) { + if (id.slice(0, prefix.length) === prefix) delete paths[id] } }, }, diff --git a/plugins/plugin-dimension/tests/plugin.test.mjs b/plugins/plugin-dimension/tests/plugin.test.mjs index 3553909c138..3a43f2e256c 100644 --- a/plugins/plugin-dimension/tests/plugin.test.mjs +++ b/plugins/plugin-dimension/tests/plugin.test.mjs @@ -8,7 +8,7 @@ describe('Dimension Plugin Tests', () => { describe('Measures horizontal dimensions', function () { const part = { name: 'test', - draft: ({ Point, points, macro }) => { + draft: ({ Point, points, macro, part }) => { points.from = new Point(10, 20) points.to = new Point(200, 20) macro('hd', { @@ -16,14 +16,17 @@ describe('Dimension Plugin Tests', () => { to: points.to, y: 35, }) + + return part }, + plugins: [plugin], } - const Test = new Design({ plugins: [plugin], parts: [part] }) + const Test = new Design({ parts: [part] }) const pattern = new Test() pattern.draft() it('should draw a line and add text to indicate its length', () => { - const c = pattern.parts.test.paths['__paperless1'] + const c = pattern.parts[0].test.paths['__paperless1'] expect(c.attributes.get('class')).to.equal('mark') expect(c.attributes.get('marker-start')).to.equal('url(#dimensionFrom)') expect(c.attributes.get('marker-end')).to.equal('url(#dimensionTo)') @@ -38,7 +41,7 @@ describe('Dimension Plugin Tests', () => { }) it('should draw the start marker', () => { - const c = pattern.parts.test.paths['__paperless1_ls'] + const c = pattern.parts[0].test.paths['__paperless1_ls'] expect(c.attributes.get('class')).to.equal('mark dotted') expect(c.ops[0].type).to.equal('move') expect(c.ops[1].type).to.equal('line') @@ -49,7 +52,7 @@ describe('Dimension Plugin Tests', () => { }) it('should draw the end marker', () => { - const c = pattern.parts.test.paths['__paperless1_le'] + const c = pattern.parts[0].test.paths['__paperless1_le'] expect(c.attributes.get('class')).to.equal('mark dotted') expect(c.ops[0].type).to.equal('move') expect(c.ops[1].type).to.equal('line') @@ -63,7 +66,7 @@ describe('Dimension Plugin Tests', () => { describe('Measures vertical dimensions', () => { const part = { name: 'test', - draft: ({ Point, points, macro }) => { + draft: ({ Point, points, macro, part }) => { points.from = new Point(10, 20) points.to = new Point(10, 200) macro('vd', { @@ -71,14 +74,17 @@ describe('Dimension Plugin Tests', () => { to: points.to, x: 25, }) + + return part }, + plugins: [plugin], } - const Test = new Design({ plugins: [plugin], parts: [part] }) + const Test = new Design({ parts: [part] }) const pattern = new Test() pattern.draft() it('Should draw a line and add text to indicate its length', () => { - const c = pattern.parts.test.paths['__paperless1'] + const c = pattern.parts[0].test.paths['__paperless1'] expect(c.attributes.get('class')).to.equal('mark') expect(c.attributes.get('marker-start')).to.equal('url(#dimensionFrom)') expect(c.attributes.get('marker-end')).to.equal('url(#dimensionTo)') @@ -93,7 +99,7 @@ describe('Dimension Plugin Tests', () => { }) it('Should draw the start marker', () => { - const c = pattern.parts.test.paths['__paperless1_ls'] + const c = pattern.parts[0].test.paths['__paperless1_ls'] expect(c.attributes.get('class')).to.equal('mark dotted') expect(c.ops[0].type).to.equal('move') expect(c.ops[1].type).to.equal('line') @@ -104,7 +110,7 @@ describe('Dimension Plugin Tests', () => { }) it('Should draw the end marker', () => { - const c = pattern.parts.test.paths['__paperless1_le'] + const c = pattern.parts[0].test.paths['__paperless1_le'] expect(c.attributes.get('class')).to.equal('mark dotted') expect(c.ops[0].type).to.equal('move') expect(c.ops[1].type).to.equal('line') @@ -118,7 +124,7 @@ describe('Dimension Plugin Tests', () => { describe('Measures the length of straight lines', () => { const part = { name: 'test', - draft: ({ Point, points, macro }) => { + draft: ({ Point, points, macro, part }) => { points.from = new Point(10, 10) points.to = new Point(100, 100) macro('ld', { @@ -126,14 +132,17 @@ describe('Dimension Plugin Tests', () => { to: points.to, d: 15, }) + + return part }, + plugins: [plugin], } - const Test = new Design({ plugins: [plugin], parts: [part] }) + const Test = new Design({ parts: [part] }) const pattern = new Test() pattern.draft() it('Should draw a line and add text to indicate its length', () => { - const c = pattern.parts.test.paths['__paperless1'] + const c = pattern.parts[0].test.paths['__paperless1'] expect(c.attributes.get('class')).to.equal('mark') expect(c.attributes.get('marker-start')).to.equal('url(#dimensionFrom)') expect(c.attributes.get('marker-end')).to.equal('url(#dimensionTo)') @@ -148,7 +157,7 @@ describe('Dimension Plugin Tests', () => { }) it('Should draw the start marker', () => { - const c = pattern.parts.test.paths['__paperless1_ls'] + const c = pattern.parts[0].test.paths['__paperless1_ls'] expect(c.attributes.get('class')).to.equal('mark dotted') expect(c.ops[0].type).to.equal('move') expect(c.ops[1].type).to.equal('line') @@ -159,7 +168,7 @@ describe('Dimension Plugin Tests', () => { }) it('Should draw the end marker', () => { - const c = pattern.parts.test.paths['__paperless1_le'] + const c = pattern.parts[0].test.paths['__paperless1_le'] expect(c.attributes.get('class')).to.equal('mark dotted') expect(c.ops[0].type).to.equal('move') expect(c.ops[1].type).to.equal('line') @@ -173,7 +182,7 @@ describe('Dimension Plugin Tests', () => { describe('Measures curved lines', () => { const part = { name: 'test', - draft: ({ Point, points, macro, Path }) => { + draft: ({ Point, points, macro, Path, part }) => { points.from = new Point(10, 10) points.cp1 = new Point(100, 10) points.cp2 = new Point(10, 100) @@ -182,14 +191,17 @@ describe('Dimension Plugin Tests', () => { path: new Path().move(points.from).curve(points.cp1, points.cp2, points.to), d: 15, }) + + return part }, + plugins: [plugin], } - const Test = new Design({ plugins: [plugin], parts: [part] }) + const Test = new Design({ parts: [part] }) const pattern = new Test() pattern.draft() it('Should draw a line and add text to indicate the length', () => { - const c = pattern.parts.test.paths['__paperless1'] + const c = pattern.parts[0].test.paths['__paperless1'] expect(c.attributes.get('class')).to.equal('mark') expect(c.attributes.get('marker-start')).to.equal('url(#dimensionFrom)') expect(c.attributes.get('marker-end')).to.equal('url(#dimensionTo)') @@ -204,7 +216,7 @@ describe('Dimension Plugin Tests', () => { }) it('Should draw the start marker', () => { - const c = pattern.parts.test.paths['__paperless1_ls'] + const c = pattern.parts[0].test.paths['__paperless1_ls'] expect(c.attributes.get('class')).to.equal('mark dotted') expect(c.ops[0].type).to.equal('move') expect(c.ops[1].type).to.equal('line') @@ -215,7 +227,7 @@ describe('Dimension Plugin Tests', () => { }) it('Should draw the end marker', () => { - const c = pattern.parts.test.paths['__paperless1_le'] + const c = pattern.parts[0].test.paths['__paperless1_le'] expect(c.attributes.get('class')).to.equal('mark dotted') expect(c.ops[0].type).to.equal('move') expect(c.ops[1].type).to.equal('line')