diff --git a/docs/demos/index.html b/docs/demos/index.html index 5aa3a9fde..a9e96b7f5 100644 --- a/docs/demos/index.html +++ b/docs/demos/index.html @@ -14,11 +14,11 @@

Demos

-
+
-
+
@@ -30,9 +30,9 @@

Demos

-
+
-
+
@@ -44,7 +44,7 @@

Demos

-
+
@@ -76,7 +76,7 @@

Demos

-
+
@@ -88,9 +88,9 @@

Demos

-
+
-
+
@@ -114,6 +114,6 @@

Demos

-
+
\ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 38c2a75cf..200f19ad6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -18,9 +18,9 @@

Latest demos

-
+
-
+

see all demos

diff --git a/docs/target/js/browser.maker.js b/docs/target/js/browser.maker.js index 0d1a52e0d..c0febd240 100644 --- a/docs/target/js/browser.maker.js +++ b/docs/target/js/browser.maker.js @@ -2674,7 +2674,7 @@ var MakerJs; } if (modelToDistort.type === MakerJs.models.BezierCurve.typeName) { var b = modelToDistort; - var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true }); + var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: bezierAccuracy }); var _loop_1 = function (layer_1) { var pathArray = bezierPartsByLayer[layer_1]; pathArray.forEach(function (p, i) { @@ -6437,7 +6437,7 @@ var MakerJs; var beziers; if (opts.unifyBeziers) { beziers = getBezierModels(modelContext); - swapBezierPathsWithSeeds(beziers, true); + swapBezierPathsWithSeeds(beziers, true, opts.pointMatchingDistance); } model.walk(modelContext, walkOptions); var _loop_3 = function (layer_2) { @@ -6474,7 +6474,7 @@ var MakerJs; _loop_3(layer_2); } if (beziers) { - swapBezierPathsWithSeeds(beziers, false); + swapBezierPathsWithSeeds(beziers, false, opts.pointMatchingDistance); } if (opts.byLayers) { return chainsByLayer; @@ -6571,7 +6571,7 @@ var MakerJs; /** * @private */ - function swapBezierPathsWithSeeds(beziers, swap) { + function swapBezierPathsWithSeeds(beziers, swap, pointMatchingDistance) { var tempKey = 'tempPaths'; var tempLayerKey = 'tempLayer'; beziers.forEach(function (wm) { @@ -6583,7 +6583,7 @@ var MakerJs; b.layer = wm.layer; } //use seeds as path, hide the arc paths from findChains() - var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true }); + var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: pointMatchingDistance }); for (var layer in bezierPartsByLayer) { var bezierSeeds = bezierPartsByLayer[layer]; if (bezierSeeds.length > 0) { @@ -9002,7 +9002,7 @@ var MakerJs; /** * @private */ - function getActualBezierRange(curve, arc, endpoints, offset) { + function getActualBezierRange(curve, arc, endpoints, offset, pointMatchingDistance) { var b = getScratch(curve.seed); var tPoints = [arc.bezierData.startT, arc.bezierData.endT].map(function (t) { return new TPoint(b, t, offset); }); var ends = endpoints.slice(); @@ -9011,7 +9011,7 @@ var MakerJs; if (endpointDistancetoStart[0] > endpointDistancetoStart[1]) ends.reverse(); for (var i = 2; i--;) { - if (!MakerJs.measure.isPointEqual(ends[i], tPoints[i].point)) { + if (!MakerJs.measure.isPointEqual(ends[i], tPoints[i].point, pointMatchingDistance)) { return null; } } @@ -9020,13 +9020,13 @@ var MakerJs; /** * @private */ - function getChainBezierRange(curve, c, layer, addToLayer) { + function getChainBezierRange(curve, c, layer, addToLayer, pointMatchingDistance) { var endLinks = [c.links[0], c.links[c.links.length - 1]]; if (endLinks[0].walkedPath.pathContext.bezierData.startT > endLinks[1].walkedPath.pathContext.bezierData.startT) { MakerJs.chain.reverse(c); endLinks.reverse(); } - var actualBezierRanges = endLinks.map(function (endLink) { return getActualBezierRange(curve, endLink.walkedPath.pathContext, endLink.endPoints, endLink.walkedPath.offset); }); + var actualBezierRanges = endLinks.map(function (endLink) { return getActualBezierRange(curve, endLink.walkedPath.pathContext, endLink.endPoints, endLink.walkedPath.offset, pointMatchingDistance); }); var result = { startT: actualBezierRanges[0] ? actualBezierRanges[0].startT : null, endT: actualBezierRanges[1] ? actualBezierRanges[1].endT : null @@ -9188,7 +9188,7 @@ var MakerJs; }; MakerJs.model.findChains(curve, function (chains, loose, layer) { chains.forEach(function (c) { - var range = getChainBezierRange(curve, c, layer, addToLayer); + var range = getChainBezierRange(curve, c, layer, addToLayer, options.pointMatchingDistance); if (range) { var b = getScratch(curve.seed); var piece = b.split(range.startT, range.endT); @@ -9203,7 +9203,7 @@ var MakerJs; //bezier is linear return addToLayer(wp.pathContext, layer, true); } - var range = getActualBezierRange(curve, wp.pathContext, MakerJs.point.fromPathEnds(wp.pathContext), wp.offset); + var range = getActualBezierRange(curve, wp.pathContext, MakerJs.point.fromPathEnds(wp.pathContext), wp.offset, options.pointMatchingDistance); if (range) { var b = getScratch(curve.seed); var piece = b.split(range.startT, range.endT); diff --git a/packages/maker.js/src/core/chain.ts b/packages/maker.js/src/core/chain.ts index e666af7fa..02a8f0684 100644 --- a/packages/maker.js/src/core/chain.ts +++ b/packages/maker.js/src/core/chain.ts @@ -235,7 +235,7 @@ var beziers: IWalkModel[]; if (opts.unifyBeziers) { beziers = getBezierModels(modelContext); - swapBezierPathsWithSeeds(beziers, true); + swapBezierPathsWithSeeds(beziers, true, opts.pointMatchingDistance); } walk(modelContext, walkOptions); @@ -280,7 +280,7 @@ } if (beziers) { - swapBezierPathsWithSeeds(beziers, false); + swapBezierPathsWithSeeds(beziers, false, opts.pointMatchingDistance); } if (opts.byLayers) { @@ -398,7 +398,7 @@ /** * @private */ - function swapBezierPathsWithSeeds(beziers: IWalkModel[], swap: boolean) { + function swapBezierPathsWithSeeds(beziers: IWalkModel[], swap: boolean, pointMatchingDistance: number) { const tempKey = 'tempPaths'; const tempLayerKey = 'tempLayer'; @@ -414,7 +414,7 @@ } //use seeds as path, hide the arc paths from findChains() - var bezierPartsByLayer = models.BezierCurve.getBezierSeeds(b, { byLayers: true }); + var bezierPartsByLayer = models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance }); for (var layer in bezierPartsByLayer) { var bezierSeeds = bezierPartsByLayer[layer]; @@ -436,7 +436,7 @@ //revert the above if (tempKey in b) { - b.paths = b[tempKey]; + b.paths = b[tempKey] as IPathMap; delete b[tempKey]; } @@ -444,7 +444,7 @@ if (b[tempLayerKey] == undefined) { delete (b as IModel).layer; } else { - (b as IModel).layer = b[tempLayerKey]; + (b as IModel).layer = b[tempLayerKey] as string; } delete b[tempLayerKey]; } diff --git a/packages/maker.js/src/core/model.ts b/packages/maker.js/src/core/model.ts index c74205fba..6de841c86 100644 --- a/packages/maker.js/src/core/model.ts +++ b/packages/maker.js/src/core/model.ts @@ -475,7 +475,7 @@ namespace MakerJs.model { if (modelToDistort.type === models.BezierCurve.typeName) { const b = modelToDistort as models.BezierCurve; - const bezierPartsByLayer = models.BezierCurve.getBezierSeeds(b, { byLayers: true }); + const bezierPartsByLayer = models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: bezierAccuracy }); for (let layer in bezierPartsByLayer) { let pathArray = bezierPartsByLayer[layer] pathArray.forEach((p, i) => { diff --git a/packages/maker.js/src/models/BezierCurve.ts b/packages/maker.js/src/models/BezierCurve.ts index 435c66d21..e5707908f 100644 --- a/packages/maker.js/src/models/BezierCurve.ts +++ b/packages/maker.js/src/models/BezierCurve.ts @@ -245,7 +245,7 @@ /** * @private */ - function getActualBezierRange(curve: BezierCurve, arc: IPathArcInBezierCurve, endpoints: IPoint[], offset: IPoint): IBezierRange { + function getActualBezierRange(curve: BezierCurve, arc: IPathArcInBezierCurve, endpoints: IPoint[], offset: IPoint, pointMatchingDistance: number): IBezierRange { var b = getScratch(curve.seed); var tPoints = [arc.bezierData.startT, arc.bezierData.endT].map(t => new TPoint(b, t, offset)); var ends = endpoints.slice(); @@ -255,7 +255,7 @@ if (endpointDistancetoStart[0] > endpointDistancetoStart[1]) ends.reverse(); for (var i = 2; i--;) { - if (!measure.isPointEqual(ends[i], tPoints[i].point)) { + if (!measure.isPointEqual(ends[i], tPoints[i].point, pointMatchingDistance)) { return null; } } @@ -273,7 +273,7 @@ /** * @private */ - function getChainBezierRange(curve: BezierCurve, c: IChain, layer: string, addToLayer: IAddToLayer): IBezierRange { + function getChainBezierRange(curve: BezierCurve, c: IChain, layer: string, addToLayer: IAddToLayer, pointMatchingDistance: number): IBezierRange { var endLinks = [c.links[0], c.links[c.links.length - 1]]; if ((endLinks[0].walkedPath.pathContext as IPathArcInBezierCurve).bezierData.startT > (endLinks[1].walkedPath.pathContext as IPathArcInBezierCurve).bezierData.startT) { @@ -281,7 +281,7 @@ endLinks.reverse(); } - var actualBezierRanges = endLinks.map(endLink => getActualBezierRange(curve, endLink.walkedPath.pathContext as IPathArcInBezierCurve, endLink.endPoints, endLink.walkedPath.offset)); + var actualBezierRanges = endLinks.map(endLink => getActualBezierRange(curve, endLink.walkedPath.pathContext as IPathArcInBezierCurve, endLink.endPoints, endLink.walkedPath.offset, pointMatchingDistance)); var result: IBezierRange = { startT: actualBezierRanges[0] ? actualBezierRanges[0].startT : null, @@ -523,7 +523,7 @@ model.findChains(curve, function (chains: IChain[], loose: IWalkPath[], layer: string) { chains.forEach(c => { - var range = getChainBezierRange(curve, c, layer, addToLayer); + var range = getChainBezierRange(curve, c, layer, addToLayer, options.pointMatchingDistance); if (range) { var b = getScratch(curve.seed); var piece = b.split(range.startT, range.endT); @@ -538,7 +538,7 @@ //bezier is linear return addToLayer(wp.pathContext, layer, true); } - var range = getActualBezierRange(curve, wp.pathContext as IPathArcInBezierCurve, point.fromPathEnds(wp.pathContext), wp.offset); + var range = getActualBezierRange(curve, wp.pathContext as IPathArcInBezierCurve, point.fromPathEnds(wp.pathContext), wp.offset, options.pointMatchingDistance); if (range) { var b = getScratch(curve.seed); var piece = b.split(range.startT, range.endT); diff --git a/packages/maker.js/test/data/newrocker-NewRocker-Regular.json b/packages/maker.js/test/data/newrocker-NewRocker-Regular.json index 9ad4bdcf0..25edfb5dd 100644 --- a/packages/maker.js/test/data/newrocker-NewRocker-Regular.json +++ b/packages/maker.js/test/data/newrocker-NewRocker-Regular.json @@ -978,12 +978,12 @@ "arc_1": { "type": "arc", "origin": [ - 34.21829549156312, - 20.29048503372315 + 34.21829499017781, + 20.290491976000105 ], - "radius": 24.489835405737637, - "startAngle": 245.1291957434888, - "endAngle": 248.37085975705295, + "radius": 24.489841674393777, + "startAngle": 245.12920363866954, + "endAngle": 248.37086683423286, "bezierData": { "startT": 0.375, "endT": 0.765625 @@ -992,12 +992,12 @@ "arc_2": { "type": "arc", "origin": [ - 31.345750652972885, - 14.049104010594398 + 31.345837857608277, + 14.049286424965011 ], - "radius": 17.619183600608075, - "startAngle": 242.64611943578197, - "endAngle": 245.06799726651286, + "radius": 17.61938577599639, + "startAngle": 242.6461401266273, + "endAngle": 245.0679901692163, "bezierData": { "startT": 0.765625, "endT": 1