makerjs 0.18.0 → 0.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -39,12 +39,12 @@ and limitations under the License.
39
39
  * author: Dan Marshall / Microsoft Corporation
40
40
  * maintainers: Dan Marshall <danmar@microsoft.com>
41
41
  * homepage: https://maker.js.org
42
- * version: 0.18.0
42
+ * version: 0.18.2
43
43
  *
44
44
  * browserify:
45
45
  * license: MIT (http://opensource.org/licenses/MIT)
46
46
  * author: James Halliday <mail@substack.net>
47
- * version: 17.0.0
47
+ * version: 17.0.1
48
48
  *
49
49
  * clone:
50
50
  * license: MIT (http://opensource.org/licenses/MIT)
@@ -54,9 +54,9 @@ and limitations under the License.
54
54
  *
55
55
  * graham_scan:
56
56
  * license: MIT (http://opensource.org/licenses/MIT)
57
- * author: Brian Barnett <brian@3kb.co.uk>
57
+ * author: Brian Barnett <me@brianbar.net>
58
58
  * homepage: http://brian3kb.github.io/graham_scan_js
59
- * version: 1.0.4
59
+ * version: 1.0.5
60
60
  *
61
61
  * kdbush:
62
62
  * license: ISC (http://opensource.org/licenses/ISC)
@@ -242,9 +242,10 @@ if (typeof module === 'object' && module.exports) {
242
242
  * Graham's Scan Convex Hull Algorithm
243
243
  * @desc An implementation of the Graham's Scan Convex Hull algorithm in JavaScript.
244
244
  * @author Brian Barnett, brian@3kb.co.uk, http://brianbar.net/ || http://3kb.co.uk/
245
- * @version 1.0.4
245
+ * @version 1.0.5
246
246
  */
247
- function ConvexHullGrahamScan(){this.anchorPoint=void 0,this.reverse=!1,this.points=[]}ConvexHullGrahamScan.prototype={constructor:ConvexHullGrahamScan,Point:function(n,t){this.x=n,this.y=t},_findPolarAngle:function(n,t){var i,o,h=57.295779513082;if(!n||!t)return 0;if(i=t.x-n.x,o=t.y-n.y,0==i&&0==o)return 0;var r=Math.atan2(o,i)*h;return this.reverse?0>=r&&(r+=360):r>=0&&(r+=360),r},addPoint:function(n,t){return void 0===this.anchorPoint?void(this.anchorPoint=new this.Point(n,t)):this.anchorPoint.y>t&&this.anchorPoint.x>n||this.anchorPoint.y===t&&this.anchorPoint.x>n||this.anchorPoint.y>t&&this.anchorPoint.x===n?(this.points.push(new this.Point(this.anchorPoint.x,this.anchorPoint.y)),void(this.anchorPoint=new this.Point(n,t))):void this.points.push(new this.Point(n,t))},_sortPoints:function(){var n=this;return this.points.sort(function(t,i){var o=n._findPolarAngle(n.anchorPoint,t),h=n._findPolarAngle(n.anchorPoint,i);return h>o?-1:o>h?1:0})},_checkPoints:function(n,t,i){var o,h=this._findPolarAngle(n,t),r=this._findPolarAngle(n,i);return h>r?(o=h-r,!(o>180)):r>h?(o=r-h,o>180):!0},getHull:function(){var n,t,i=[];if(this.reverse=this.points.every(function(n){return n.x<0&&n.y<0}),n=this._sortPoints(),t=n.length,3>t)return n.unshift(this.anchorPoint),n;for(i.push(n.shift(),n.shift());;){var o,h,r;if(i.push(n.shift()),o=i[i.length-3],h=i[i.length-2],r=i[i.length-1],this._checkPoints(o,h,r)&&i.splice(i.length-2,1),0==n.length){if(t==i.length){var e=this.anchorPoint;return i=i.filter(function(n){return!!n}),i.some(function(n){return n.x==e.x&&n.y==e.y})||i.unshift(this.anchorPoint),i}n=i,t=n.length,i=[],i.push(n.shift(),n.shift())}}}},"function"==typeof define&&define.amd&&define(function(){return ConvexHullGrahamScan}),"undefined"!=typeof module&&(module.exports=ConvexHullGrahamScan);
247
+ function ConvexHullGrahamScan(){this.anchorPoint=void 0,this.reverse=!1,this.points=[]}ConvexHullGrahamScan.prototype={constructor:ConvexHullGrahamScan,Point:function(a,b){this.x=a,this.y=b},_findPolarAngle:function(a,b){var c,d,e=57.295779513082;if(!a||!b)return 0;if(c=b.x-a.x,d=b.y-a.y,0==c&&0==d)return 0;var f=Math.atan2(d,c)*e;return this.reverse?0>=f&&(f+=360):f>=0&&(f+=360),f},addPoint:function(a,b){var c=void 0===this.anchorPoint||this.anchorPoint.y>b||this.anchorPoint.y===b&&this.anchorPoint.x>a;c?(void 0!==this.anchorPoint&&this.points.push(new this.Point(this.anchorPoint.x,this.anchorPoint.y)),this.anchorPoint=new this.Point(a,b)):this.points.push(new this.Point(a,b))},_sortPoints:function(){var a=this;return this.points.sort(function(b,c){var d=a._findPolarAngle(a.anchorPoint,b),e=a._findPolarAngle(a.anchorPoint,c);return e>d?-1:d>e?1:0})},_checkPoints:function(a,b,c){var d,e=this._findPolarAngle(a,b),f=this._findPolarAngle(a,c);return e>f?(d=e-f,!(d>180)):f>e?(d=f-e,d>180):!0},getHull:function(){var a,b,c=[];if(this.reverse=this.points.every(function(a){return a.x<0&&a.y<0}),a=this._sortPoints(),b=a.length,3>b)return a.unshift(this.anchorPoint),a;for(c.push(a.shift(),a.shift());;){var d,e,f;if(c.push(a.shift()),d=c[c.length-3],e=c[c.length-2],f=c[c.length-1],this._checkPoints(d,e,f)&&c.splice(c.length-2,1),0==a.length){if(b==c.length){var g=this.anchorPoint;return c=c.filter(function(a){return!!a}),c.some(function(a){return a.x==g.x&&a.y==g.y})||c.unshift(this.anchorPoint),c}a=c,b=a.length,c=[],c.push(a.shift(),a.shift())}}}},"function"==typeof define&&define.amd&&define(function(){return ConvexHullGrahamScan}),"undefined"!=typeof module&&(module.exports=ConvexHullGrahamScan);
248
+
248
249
  },{}],4:[function(require,module,exports){
249
250
  (function (global, factory) {
250
251
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
@@ -2009,6 +2010,7 @@ var MakerJs;
2009
2010
  for (var _i = 0; _i < arguments.length; _i++) {
2010
2011
  args[_i] = arguments[_i];
2011
2012
  }
2013
+ var _a, _b;
2012
2014
  function getSpan(origin) {
2013
2015
  var startAngle = MakerJs.angle.ofPointInDegrees(origin, args[clockwise ? 1 : 0]);
2014
2016
  var endAngle = MakerJs.angle.ofPointInDegrees(origin, args[clockwise ? 0 : 1]);
@@ -2039,10 +2041,10 @@ var MakerJs;
2039
2041
  }
2040
2042
  else {
2041
2043
  //find the 2 potential origins
2042
- var origins = MakerJs.path.intersection(new Circle(pointA, this.radius), new Circle(pointB, this.radius));
2044
+ var intersectionPoints = (_b = (_a = MakerJs.path.intersection(new Circle(pointA, this.radius), new Circle(pointB, this.radius))) === null || _a === void 0 ? void 0 : _a.intersectionPoints) !== null && _b !== void 0 ? _b : [pointA, pointB];
2043
2045
  var spans = [];
2044
- for (var i = origins.intersectionPoints.length; i--;) {
2045
- span = getSpan(origins.intersectionPoints[i]);
2046
+ for (var i = intersectionPoints.length; i--;) {
2047
+ span = getSpan(intersectionPoints[i]);
2046
2048
  //insert sorted by size ascending
2047
2049
  if (spans.length == 0 || span.size > spans[0].size) {
2048
2050
  spans.push(span);
@@ -2069,8 +2071,8 @@ var MakerJs;
2069
2071
  //from 3 points
2070
2072
  Circle.apply(this, args);
2071
2073
  var angles = [];
2072
- for (var i = 0; i < 3; i++) {
2073
- angles.push(MakerJs.angle.ofPointInDegrees(this.origin, args[i]));
2074
+ for (var i_1 = 0; i_1 < 3; i_1++) {
2075
+ angles.push(MakerJs.angle.ofPointInDegrees(this.origin, args[i_1]));
2074
2076
  }
2075
2077
  this.startAngle = angles[0];
2076
2078
  this.endAngle = angles[2];
@@ -2673,7 +2675,7 @@ var MakerJs;
2673
2675
  }
2674
2676
  if (modelToDistort.type === MakerJs.models.BezierCurve.typeName) {
2675
2677
  var b = modelToDistort;
2676
- var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true });
2678
+ var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: bezierAccuracy });
2677
2679
  var _loop_1 = function (layer_1) {
2678
2680
  var pathArray = bezierPartsByLayer[layer_1];
2679
2681
  pathArray.forEach(function (p, i) {
@@ -4593,7 +4595,7 @@ var MakerJs;
4593
4595
  if (m) {
4594
4596
  return augment(m);
4595
4597
  }
4596
- return m;
4598
+ return null;
4597
4599
  }
4598
4600
  measure.modelExtents = modelExtents;
4599
4601
  /**
@@ -5028,6 +5030,12 @@ var MakerJs;
5028
5030
  };
5029
5031
  }
5030
5032
  }
5033
+ function lineTypeLayerOptions(layer) {
5034
+ if (opts.layerOptions && opts.layerOptions[layer] && opts.layerOptions[layer].lineType) {
5035
+ return opts.layerOptions[layer].lineType;
5036
+ }
5037
+ return "CONTINUOUS";
5038
+ }
5031
5039
  function defaultLayer(pathContext, parentLayer) {
5032
5040
  var layerId = (pathContext && pathContext.layer) || parentLayer || '0';
5033
5041
  if (layerIds.indexOf(layerId) < 0) {
@@ -5037,9 +5045,10 @@ var MakerJs;
5037
5045
  }
5038
5046
  var map = {};
5039
5047
  map[MakerJs.pathType.Line] = function (line, offset, layer) {
5048
+ var layerId = defaultLayer(line, layer);
5040
5049
  var lineEntity = {
5041
5050
  type: "LINE",
5042
- layer: defaultLayer(line, layer),
5051
+ layer: layerId,
5043
5052
  vertices: [
5044
5053
  {
5045
5054
  x: MakerJs.round(line.origin[0] + offset[0], opts.accuracy),
@@ -5051,24 +5060,28 @@ var MakerJs;
5051
5060
  }
5052
5061
  ]
5053
5062
  };
5063
+ lineEntity.lineType = lineTypeLayerOptions(layerId);
5054
5064
  return lineEntity;
5055
5065
  };
5056
5066
  map[MakerJs.pathType.Circle] = function (circle, offset, layer) {
5067
+ var layerId = defaultLayer(circle, layer);
5057
5068
  var circleEntity = {
5058
5069
  type: "CIRCLE",
5059
- layer: defaultLayer(circle, layer),
5070
+ layer: layerId,
5060
5071
  center: {
5061
5072
  x: MakerJs.round(circle.origin[0] + offset[0], opts.accuracy),
5062
5073
  y: MakerJs.round(circle.origin[1] + offset[1], opts.accuracy)
5063
5074
  },
5064
5075
  radius: MakerJs.round(circle.radius, opts.accuracy)
5065
5076
  };
5077
+ circleEntity.lineType = lineTypeLayerOptions(layerId);
5066
5078
  return circleEntity;
5067
5079
  };
5068
5080
  map[MakerJs.pathType.Arc] = function (arc, offset, layer) {
5081
+ var layerId = defaultLayer(arc, layer);
5069
5082
  var arcEntity = {
5070
5083
  type: "ARC",
5071
- layer: defaultLayer(arc, layer),
5084
+ layer: layerId,
5072
5085
  center: {
5073
5086
  x: MakerJs.round(arc.origin[0] + offset[0], opts.accuracy),
5074
5087
  y: MakerJs.round(arc.origin[1] + offset[1], opts.accuracy)
@@ -5077,6 +5090,7 @@ var MakerJs;
5077
5090
  startAngle: MakerJs.round(arc.startAngle, opts.accuracy),
5078
5091
  endAngle: MakerJs.round(arc.endAngle, opts.accuracy)
5079
5092
  };
5093
+ arcEntity.lineType = lineTypeLayerOptions(layerId);
5080
5094
  return arcEntity;
5081
5095
  };
5082
5096
  //TODO - handle scenario if any bezier seeds get passed
@@ -5098,6 +5112,7 @@ var MakerJs;
5098
5112
  shape: c.chain.endless,
5099
5113
  vertices: []
5100
5114
  };
5115
+ polylineEntity.lineType = lineTypeLayerOptions(polylineEntity.layer);
5101
5116
  c.chain.links.forEach(function (link, i) {
5102
5117
  var bulge;
5103
5118
  if (link.walkedPath.pathContext.type === MakerJs.pathType.Arc) {
@@ -5139,15 +5154,31 @@ var MakerJs;
5139
5154
  name: layerId,
5140
5155
  color: layerColor
5141
5156
  };
5157
+ layerEntity.lineType = lineTypeLayerOptions(layerId);
5142
5158
  return layerEntity;
5143
5159
  }
5144
5160
  function lineTypesOut() {
5161
+ // Dash pattern convention: positive = drawn segment, negative = gap, 0 can be dot.
5162
+ // patternLength is sum of absolute values.
5145
5163
  var lineStyleTable = {
5146
5164
  lineTypes: {
5147
5165
  "CONTINUOUS": {
5148
5166
  name: "CONTINUOUS",
5149
5167
  description: "______",
5150
- patternLength: 0
5168
+ patternLength: 0,
5169
+ elements: []
5170
+ },
5171
+ "DASHED": {
5172
+ name: "DASHED",
5173
+ description: "_ _ _ ",
5174
+ elements: [5, -2.5],
5175
+ patternLength: 7.5
5176
+ },
5177
+ "DOTTED": {
5178
+ name: "DOTTED",
5179
+ description: ". . . ",
5180
+ elements: [0.5, -1.0],
5181
+ patternLength: 1.5
5151
5182
  }
5152
5183
  }
5153
5184
  };
@@ -5239,15 +5270,27 @@ var MakerJs;
5239
5270
  }
5240
5271
  dxf.push.apply(dxf, values);
5241
5272
  }
5273
+ function appendLineType(entity) {
5274
+ var lt = entity.lineType;
5275
+ if (lt) {
5276
+ append("6", lt);
5277
+ }
5278
+ }
5242
5279
  var map = {};
5243
5280
  map["LINE"] = function (line) {
5244
- append("0", "LINE", "8", line.layer, "10", line.vertices[0].x, "20", line.vertices[0].y, "11", line.vertices[1].x, "21", line.vertices[1].y);
5281
+ append("0", "LINE", "8", line.layer);
5282
+ appendLineType(line);
5283
+ append("10", line.vertices[0].x, "20", line.vertices[0].y, "11", line.vertices[1].x, "21", line.vertices[1].y);
5245
5284
  };
5246
5285
  map["CIRCLE"] = function (circle) {
5247
- append("0", "CIRCLE", "8", circle.layer, "10", circle.center.x, "20", circle.center.y, "40", circle.radius);
5286
+ append("0", "CIRCLE", "8", circle.layer);
5287
+ appendLineType(circle);
5288
+ append("10", circle.center.x, "20", circle.center.y, "40", circle.radius);
5248
5289
  };
5249
5290
  map["ARC"] = function (arc) {
5250
- append("0", "ARC", "8", arc.layer, "10", arc.center.x, "20", arc.center.y, "40", arc.radius, "50", arc.startAngle, "51", arc.endAngle);
5291
+ append("0", "ARC", "8", arc.layer);
5292
+ appendLineType(arc);
5293
+ append("10", arc.center.x, "20", arc.center.y, "40", arc.radius, "50", arc.startAngle, "51", arc.endAngle);
5251
5294
  };
5252
5295
  //TODO - handle scenario if any bezier seeds get passed
5253
5296
  //map[pathType.BezierSeed]
@@ -5258,7 +5301,9 @@ var MakerJs;
5258
5301
  }
5259
5302
  };
5260
5303
  map["POLYLINE"] = function (polyline) {
5261
- append("0", "POLYLINE", "8", polyline.layer, "66", 1, "70", polyline.shape ? 1 : 0);
5304
+ append("0", "POLYLINE", "8", polyline.layer);
5305
+ appendLineType(polyline);
5306
+ append("66", 1, "70", polyline.shape ? 1 : 0);
5262
5307
  polyline.vertices.forEach(function (vertex) { return map["VERTEX"](vertex); });
5263
5308
  append("0", "SEQEND");
5264
5309
  };
@@ -5281,11 +5326,14 @@ var MakerJs;
5281
5326
  table(layersOut);
5282
5327
  }
5283
5328
  function layerOut(layer) {
5284
- append("0", "LAYER", "2", layer.name, "70", "0", "62", layer.color, "6", "CONTINUOUS");
5329
+ var lt = (layer.lineType || "CONTINUOUS");
5330
+ append("0", "LAYER", "2", layer.name, "70", "0", "62", layer.color, "6", lt);
5285
5331
  }
5286
5332
  function lineTypeOut(lineType) {
5333
+ var elements = ((lineType.elements) || []);
5287
5334
  append("0", "LTYPE", "72", //72 Alignment code; value is always 65, the ASCII code for A
5288
- "65", "70", "64", "2", lineType.name, "3", lineType.description, "73", "0", "40", lineType.patternLength);
5335
+ "65", "70", "0", "2", lineType.name, "3", lineType.description, "73", elements.length, "40", lineType.patternLength);
5336
+ elements.forEach(function (e) { return append("49", e); });
5289
5337
  }
5290
5338
  function lineTypesOut() {
5291
5339
  var lineTypeTableName = 'lineType';
@@ -6436,7 +6484,7 @@ var MakerJs;
6436
6484
  var beziers;
6437
6485
  if (opts.unifyBeziers) {
6438
6486
  beziers = getBezierModels(modelContext);
6439
- swapBezierPathsWithSeeds(beziers, true);
6487
+ swapBezierPathsWithSeeds(beziers, true, opts.pointMatchingDistance);
6440
6488
  }
6441
6489
  model.walk(modelContext, walkOptions);
6442
6490
  var _loop_3 = function (layer_2) {
@@ -6473,7 +6521,7 @@ var MakerJs;
6473
6521
  _loop_3(layer_2);
6474
6522
  }
6475
6523
  if (beziers) {
6476
- swapBezierPathsWithSeeds(beziers, false);
6524
+ swapBezierPathsWithSeeds(beziers, false, opts.pointMatchingDistance);
6477
6525
  }
6478
6526
  if (opts.byLayers) {
6479
6527
  return chainsByLayer;
@@ -6570,7 +6618,7 @@ var MakerJs;
6570
6618
  /**
6571
6619
  * @private
6572
6620
  */
6573
- function swapBezierPathsWithSeeds(beziers, swap) {
6621
+ function swapBezierPathsWithSeeds(beziers, swap, pointMatchingDistance) {
6574
6622
  var tempKey = 'tempPaths';
6575
6623
  var tempLayerKey = 'tempLayer';
6576
6624
  beziers.forEach(function (wm) {
@@ -6582,7 +6630,7 @@ var MakerJs;
6582
6630
  b.layer = wm.layer;
6583
6631
  }
6584
6632
  //use seeds as path, hide the arc paths from findChains()
6585
- var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true });
6633
+ var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: pointMatchingDistance });
6586
6634
  for (var layer in bezierPartsByLayer) {
6587
6635
  var bezierSeeds = bezierPartsByLayer[layer];
6588
6636
  if (bezierSeeds.length > 0) {
@@ -9001,7 +9049,7 @@ var MakerJs;
9001
9049
  /**
9002
9050
  * @private
9003
9051
  */
9004
- function getActualBezierRange(curve, arc, endpoints, offset) {
9052
+ function getActualBezierRange(curve, arc, endpoints, offset, pointMatchingDistance) {
9005
9053
  var b = getScratch(curve.seed);
9006
9054
  var tPoints = [arc.bezierData.startT, arc.bezierData.endT].map(function (t) { return new TPoint(b, t, offset); });
9007
9055
  var ends = endpoints.slice();
@@ -9010,7 +9058,7 @@ var MakerJs;
9010
9058
  if (endpointDistancetoStart[0] > endpointDistancetoStart[1])
9011
9059
  ends.reverse();
9012
9060
  for (var i = 2; i--;) {
9013
- if (!MakerJs.measure.isPointEqual(ends[i], tPoints[i].point)) {
9061
+ if (!MakerJs.measure.isPointEqual(ends[i], tPoints[i].point, pointMatchingDistance)) {
9014
9062
  return null;
9015
9063
  }
9016
9064
  }
@@ -9019,13 +9067,13 @@ var MakerJs;
9019
9067
  /**
9020
9068
  * @private
9021
9069
  */
9022
- function getChainBezierRange(curve, c, layer, addToLayer) {
9070
+ function getChainBezierRange(curve, c, layer, addToLayer, pointMatchingDistance) {
9023
9071
  var endLinks = [c.links[0], c.links[c.links.length - 1]];
9024
9072
  if (endLinks[0].walkedPath.pathContext.bezierData.startT > endLinks[1].walkedPath.pathContext.bezierData.startT) {
9025
9073
  MakerJs.chain.reverse(c);
9026
9074
  endLinks.reverse();
9027
9075
  }
9028
- var actualBezierRanges = endLinks.map(function (endLink) { return getActualBezierRange(curve, endLink.walkedPath.pathContext, endLink.endPoints, endLink.walkedPath.offset); });
9076
+ var actualBezierRanges = endLinks.map(function (endLink) { return getActualBezierRange(curve, endLink.walkedPath.pathContext, endLink.endPoints, endLink.walkedPath.offset, pointMatchingDistance); });
9029
9077
  var result = {
9030
9078
  startT: actualBezierRanges[0] ? actualBezierRanges[0].startT : null,
9031
9079
  endT: actualBezierRanges[1] ? actualBezierRanges[1].endT : null
@@ -9187,7 +9235,7 @@ var MakerJs;
9187
9235
  };
9188
9236
  MakerJs.model.findChains(curve, function (chains, loose, layer) {
9189
9237
  chains.forEach(function (c) {
9190
- var range = getChainBezierRange(curve, c, layer, addToLayer);
9238
+ var range = getChainBezierRange(curve, c, layer, addToLayer, options.pointMatchingDistance);
9191
9239
  if (range) {
9192
9240
  var b = getScratch(curve.seed);
9193
9241
  var piece = b.split(range.startT, range.endT);
@@ -9202,7 +9250,7 @@ var MakerJs;
9202
9250
  //bezier is linear
9203
9251
  return addToLayer(wp.pathContext, layer, true);
9204
9252
  }
9205
- var range = getActualBezierRange(curve, wp.pathContext, MakerJs.point.fromPathEnds(wp.pathContext), wp.offset);
9253
+ var range = getActualBezierRange(curve, wp.pathContext, MakerJs.point.fromPathEnds(wp.pathContext), wp.offset, options.pointMatchingDistance);
9206
9254
  if (range) {
9207
9255
  var b = getScratch(curve.seed);
9208
9256
  var piece = b.split(range.startT, range.endT);
@@ -10302,6 +10350,6 @@ var MakerJs;
10302
10350
  ];
10303
10351
  })(models = MakerJs.models || (MakerJs.models = {}));
10304
10352
  })(MakerJs || (MakerJs = {}));
10305
- MakerJs.version = "0.18.0";
10353
+ MakerJs.version = "0.18.2";
10306
10354
 
10307
10355
  },{"clone":2,"graham_scan":3,"kdbush":4}]},{},[]);
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- // Type definitions for Maker.js 0.18.0
1
+ // Type definitions for Maker.js 0.18.2
2
2
  // Project: https://github.com/Microsoft/maker.js
3
3
  // Definitions by: Dan Marshall <https://github.com/danmarshall>
4
4
  // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
@@ -2584,7 +2584,7 @@ declare namespace MakerJs.measure {
2584
2584
  * @param atlas Optional atlas to save measurements.
2585
2585
  * @returns object with low and high points.
2586
2586
  */
2587
- function modelExtents(modelToMeasure: IModel, atlas?: Atlas): IMeasureWithCenter;
2587
+ function modelExtents(modelToMeasure: IModel, atlas?: Atlas): IMeasureWithCenter | null;
2588
2588
  /**
2589
2589
  * Augment a measurement - add more properties such as center point, height and width.
2590
2590
  *
@@ -2734,6 +2734,11 @@ declare namespace MakerJs.exporter {
2734
2734
  * Text size for TEXT entities.
2735
2735
  */
2736
2736
  fontSize?: number;
2737
+ /**
2738
+ * DXF linetype name for this layer.
2739
+ * Example: "CONTINUOUS", "DASHED", "DOTTED"
2740
+ */
2741
+ lineType?: 'CONTINUOUS' | 'DASHED' | 'DOTTED';
2737
2742
  }
2738
2743
  /**
2739
2744
  * DXF rendering options.
package/dist/index.js CHANGED
@@ -1592,6 +1592,7 @@ var MakerJs;
1592
1592
  for (var _i = 0; _i < arguments.length; _i++) {
1593
1593
  args[_i] = arguments[_i];
1594
1594
  }
1595
+ var _a, _b;
1595
1596
  function getSpan(origin) {
1596
1597
  var startAngle = MakerJs.angle.ofPointInDegrees(origin, args[clockwise ? 1 : 0]);
1597
1598
  var endAngle = MakerJs.angle.ofPointInDegrees(origin, args[clockwise ? 0 : 1]);
@@ -1622,10 +1623,10 @@ var MakerJs;
1622
1623
  }
1623
1624
  else {
1624
1625
  //find the 2 potential origins
1625
- var origins = MakerJs.path.intersection(new Circle(pointA, this.radius), new Circle(pointB, this.radius));
1626
+ var intersectionPoints = (_b = (_a = MakerJs.path.intersection(new Circle(pointA, this.radius), new Circle(pointB, this.radius))) === null || _a === void 0 ? void 0 : _a.intersectionPoints) !== null && _b !== void 0 ? _b : [pointA, pointB];
1626
1627
  var spans = [];
1627
- for (var i = origins.intersectionPoints.length; i--;) {
1628
- span = getSpan(origins.intersectionPoints[i]);
1628
+ for (var i = intersectionPoints.length; i--;) {
1629
+ span = getSpan(intersectionPoints[i]);
1629
1630
  //insert sorted by size ascending
1630
1631
  if (spans.length == 0 || span.size > spans[0].size) {
1631
1632
  spans.push(span);
@@ -1652,8 +1653,8 @@ var MakerJs;
1652
1653
  //from 3 points
1653
1654
  Circle.apply(this, args);
1654
1655
  var angles = [];
1655
- for (var i = 0; i < 3; i++) {
1656
- angles.push(MakerJs.angle.ofPointInDegrees(this.origin, args[i]));
1656
+ for (var i_1 = 0; i_1 < 3; i_1++) {
1657
+ angles.push(MakerJs.angle.ofPointInDegrees(this.origin, args[i_1]));
1657
1658
  }
1658
1659
  this.startAngle = angles[0];
1659
1660
  this.endAngle = angles[2];
@@ -2256,7 +2257,7 @@ var MakerJs;
2256
2257
  }
2257
2258
  if (modelToDistort.type === MakerJs.models.BezierCurve.typeName) {
2258
2259
  var b = modelToDistort;
2259
- var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true });
2260
+ var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: bezierAccuracy });
2260
2261
  var _loop_1 = function (layer_1) {
2261
2262
  var pathArray = bezierPartsByLayer[layer_1];
2262
2263
  pathArray.forEach(function (p, i) {
@@ -4176,7 +4177,7 @@ var MakerJs;
4176
4177
  if (m) {
4177
4178
  return augment(m);
4178
4179
  }
4179
- return m;
4180
+ return null;
4180
4181
  }
4181
4182
  measure.modelExtents = modelExtents;
4182
4183
  /**
@@ -4611,6 +4612,12 @@ var MakerJs;
4611
4612
  };
4612
4613
  }
4613
4614
  }
4615
+ function lineTypeLayerOptions(layer) {
4616
+ if (opts.layerOptions && opts.layerOptions[layer] && opts.layerOptions[layer].lineType) {
4617
+ return opts.layerOptions[layer].lineType;
4618
+ }
4619
+ return "CONTINUOUS";
4620
+ }
4614
4621
  function defaultLayer(pathContext, parentLayer) {
4615
4622
  var layerId = (pathContext && pathContext.layer) || parentLayer || '0';
4616
4623
  if (layerIds.indexOf(layerId) < 0) {
@@ -4620,9 +4627,10 @@ var MakerJs;
4620
4627
  }
4621
4628
  var map = {};
4622
4629
  map[MakerJs.pathType.Line] = function (line, offset, layer) {
4630
+ var layerId = defaultLayer(line, layer);
4623
4631
  var lineEntity = {
4624
4632
  type: "LINE",
4625
- layer: defaultLayer(line, layer),
4633
+ layer: layerId,
4626
4634
  vertices: [
4627
4635
  {
4628
4636
  x: MakerJs.round(line.origin[0] + offset[0], opts.accuracy),
@@ -4634,24 +4642,28 @@ var MakerJs;
4634
4642
  }
4635
4643
  ]
4636
4644
  };
4645
+ lineEntity.lineType = lineTypeLayerOptions(layerId);
4637
4646
  return lineEntity;
4638
4647
  };
4639
4648
  map[MakerJs.pathType.Circle] = function (circle, offset, layer) {
4649
+ var layerId = defaultLayer(circle, layer);
4640
4650
  var circleEntity = {
4641
4651
  type: "CIRCLE",
4642
- layer: defaultLayer(circle, layer),
4652
+ layer: layerId,
4643
4653
  center: {
4644
4654
  x: MakerJs.round(circle.origin[0] + offset[0], opts.accuracy),
4645
4655
  y: MakerJs.round(circle.origin[1] + offset[1], opts.accuracy)
4646
4656
  },
4647
4657
  radius: MakerJs.round(circle.radius, opts.accuracy)
4648
4658
  };
4659
+ circleEntity.lineType = lineTypeLayerOptions(layerId);
4649
4660
  return circleEntity;
4650
4661
  };
4651
4662
  map[MakerJs.pathType.Arc] = function (arc, offset, layer) {
4663
+ var layerId = defaultLayer(arc, layer);
4652
4664
  var arcEntity = {
4653
4665
  type: "ARC",
4654
- layer: defaultLayer(arc, layer),
4666
+ layer: layerId,
4655
4667
  center: {
4656
4668
  x: MakerJs.round(arc.origin[0] + offset[0], opts.accuracy),
4657
4669
  y: MakerJs.round(arc.origin[1] + offset[1], opts.accuracy)
@@ -4660,6 +4672,7 @@ var MakerJs;
4660
4672
  startAngle: MakerJs.round(arc.startAngle, opts.accuracy),
4661
4673
  endAngle: MakerJs.round(arc.endAngle, opts.accuracy)
4662
4674
  };
4675
+ arcEntity.lineType = lineTypeLayerOptions(layerId);
4663
4676
  return arcEntity;
4664
4677
  };
4665
4678
  //TODO - handle scenario if any bezier seeds get passed
@@ -4681,6 +4694,7 @@ var MakerJs;
4681
4694
  shape: c.chain.endless,
4682
4695
  vertices: []
4683
4696
  };
4697
+ polylineEntity.lineType = lineTypeLayerOptions(polylineEntity.layer);
4684
4698
  c.chain.links.forEach(function (link, i) {
4685
4699
  var bulge;
4686
4700
  if (link.walkedPath.pathContext.type === MakerJs.pathType.Arc) {
@@ -4722,15 +4736,31 @@ var MakerJs;
4722
4736
  name: layerId,
4723
4737
  color: layerColor
4724
4738
  };
4739
+ layerEntity.lineType = lineTypeLayerOptions(layerId);
4725
4740
  return layerEntity;
4726
4741
  }
4727
4742
  function lineTypesOut() {
4743
+ // Dash pattern convention: positive = drawn segment, negative = gap, 0 can be dot.
4744
+ // patternLength is sum of absolute values.
4728
4745
  var lineStyleTable = {
4729
4746
  lineTypes: {
4730
4747
  "CONTINUOUS": {
4731
4748
  name: "CONTINUOUS",
4732
4749
  description: "______",
4733
- patternLength: 0
4750
+ patternLength: 0,
4751
+ elements: []
4752
+ },
4753
+ "DASHED": {
4754
+ name: "DASHED",
4755
+ description: "_ _ _ ",
4756
+ elements: [5, -2.5],
4757
+ patternLength: 7.5
4758
+ },
4759
+ "DOTTED": {
4760
+ name: "DOTTED",
4761
+ description: ". . . ",
4762
+ elements: [0.5, -1.0],
4763
+ patternLength: 1.5
4734
4764
  }
4735
4765
  }
4736
4766
  };
@@ -4822,15 +4852,27 @@ var MakerJs;
4822
4852
  }
4823
4853
  dxf.push.apply(dxf, values);
4824
4854
  }
4855
+ function appendLineType(entity) {
4856
+ var lt = entity.lineType;
4857
+ if (lt) {
4858
+ append("6", lt);
4859
+ }
4860
+ }
4825
4861
  var map = {};
4826
4862
  map["LINE"] = function (line) {
4827
- append("0", "LINE", "8", line.layer, "10", line.vertices[0].x, "20", line.vertices[0].y, "11", line.vertices[1].x, "21", line.vertices[1].y);
4863
+ append("0", "LINE", "8", line.layer);
4864
+ appendLineType(line);
4865
+ append("10", line.vertices[0].x, "20", line.vertices[0].y, "11", line.vertices[1].x, "21", line.vertices[1].y);
4828
4866
  };
4829
4867
  map["CIRCLE"] = function (circle) {
4830
- append("0", "CIRCLE", "8", circle.layer, "10", circle.center.x, "20", circle.center.y, "40", circle.radius);
4868
+ append("0", "CIRCLE", "8", circle.layer);
4869
+ appendLineType(circle);
4870
+ append("10", circle.center.x, "20", circle.center.y, "40", circle.radius);
4831
4871
  };
4832
4872
  map["ARC"] = function (arc) {
4833
- append("0", "ARC", "8", arc.layer, "10", arc.center.x, "20", arc.center.y, "40", arc.radius, "50", arc.startAngle, "51", arc.endAngle);
4873
+ append("0", "ARC", "8", arc.layer);
4874
+ appendLineType(arc);
4875
+ append("10", arc.center.x, "20", arc.center.y, "40", arc.radius, "50", arc.startAngle, "51", arc.endAngle);
4834
4876
  };
4835
4877
  //TODO - handle scenario if any bezier seeds get passed
4836
4878
  //map[pathType.BezierSeed]
@@ -4841,7 +4883,9 @@ var MakerJs;
4841
4883
  }
4842
4884
  };
4843
4885
  map["POLYLINE"] = function (polyline) {
4844
- append("0", "POLYLINE", "8", polyline.layer, "66", 1, "70", polyline.shape ? 1 : 0);
4886
+ append("0", "POLYLINE", "8", polyline.layer);
4887
+ appendLineType(polyline);
4888
+ append("66", 1, "70", polyline.shape ? 1 : 0);
4845
4889
  polyline.vertices.forEach(function (vertex) { return map["VERTEX"](vertex); });
4846
4890
  append("0", "SEQEND");
4847
4891
  };
@@ -4864,11 +4908,14 @@ var MakerJs;
4864
4908
  table(layersOut);
4865
4909
  }
4866
4910
  function layerOut(layer) {
4867
- append("0", "LAYER", "2", layer.name, "70", "0", "62", layer.color, "6", "CONTINUOUS");
4911
+ var lt = (layer.lineType || "CONTINUOUS");
4912
+ append("0", "LAYER", "2", layer.name, "70", "0", "62", layer.color, "6", lt);
4868
4913
  }
4869
4914
  function lineTypeOut(lineType) {
4915
+ var elements = ((lineType.elements) || []);
4870
4916
  append("0", "LTYPE", "72", //72 Alignment code; value is always 65, the ASCII code for A
4871
- "65", "70", "64", "2", lineType.name, "3", lineType.description, "73", "0", "40", lineType.patternLength);
4917
+ "65", "70", "0", "2", lineType.name, "3", lineType.description, "73", elements.length, "40", lineType.patternLength);
4918
+ elements.forEach(function (e) { return append("49", e); });
4872
4919
  }
4873
4920
  function lineTypesOut() {
4874
4921
  var lineTypeTableName = 'lineType';
@@ -6019,7 +6066,7 @@ var MakerJs;
6019
6066
  var beziers;
6020
6067
  if (opts.unifyBeziers) {
6021
6068
  beziers = getBezierModels(modelContext);
6022
- swapBezierPathsWithSeeds(beziers, true);
6069
+ swapBezierPathsWithSeeds(beziers, true, opts.pointMatchingDistance);
6023
6070
  }
6024
6071
  model.walk(modelContext, walkOptions);
6025
6072
  var _loop_3 = function (layer_2) {
@@ -6056,7 +6103,7 @@ var MakerJs;
6056
6103
  _loop_3(layer_2);
6057
6104
  }
6058
6105
  if (beziers) {
6059
- swapBezierPathsWithSeeds(beziers, false);
6106
+ swapBezierPathsWithSeeds(beziers, false, opts.pointMatchingDistance);
6060
6107
  }
6061
6108
  if (opts.byLayers) {
6062
6109
  return chainsByLayer;
@@ -6153,7 +6200,7 @@ var MakerJs;
6153
6200
  /**
6154
6201
  * @private
6155
6202
  */
6156
- function swapBezierPathsWithSeeds(beziers, swap) {
6203
+ function swapBezierPathsWithSeeds(beziers, swap, pointMatchingDistance) {
6157
6204
  var tempKey = 'tempPaths';
6158
6205
  var tempLayerKey = 'tempLayer';
6159
6206
  beziers.forEach(function (wm) {
@@ -6165,7 +6212,7 @@ var MakerJs;
6165
6212
  b.layer = wm.layer;
6166
6213
  }
6167
6214
  //use seeds as path, hide the arc paths from findChains()
6168
- var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true });
6215
+ var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: pointMatchingDistance });
6169
6216
  for (var layer in bezierPartsByLayer) {
6170
6217
  var bezierSeeds = bezierPartsByLayer[layer];
6171
6218
  if (bezierSeeds.length > 0) {
@@ -8584,7 +8631,7 @@ var MakerJs;
8584
8631
  /**
8585
8632
  * @private
8586
8633
  */
8587
- function getActualBezierRange(curve, arc, endpoints, offset) {
8634
+ function getActualBezierRange(curve, arc, endpoints, offset, pointMatchingDistance) {
8588
8635
  var b = getScratch(curve.seed);
8589
8636
  var tPoints = [arc.bezierData.startT, arc.bezierData.endT].map(function (t) { return new TPoint(b, t, offset); });
8590
8637
  var ends = endpoints.slice();
@@ -8593,7 +8640,7 @@ var MakerJs;
8593
8640
  if (endpointDistancetoStart[0] > endpointDistancetoStart[1])
8594
8641
  ends.reverse();
8595
8642
  for (var i = 2; i--;) {
8596
- if (!MakerJs.measure.isPointEqual(ends[i], tPoints[i].point)) {
8643
+ if (!MakerJs.measure.isPointEqual(ends[i], tPoints[i].point, pointMatchingDistance)) {
8597
8644
  return null;
8598
8645
  }
8599
8646
  }
@@ -8602,13 +8649,13 @@ var MakerJs;
8602
8649
  /**
8603
8650
  * @private
8604
8651
  */
8605
- function getChainBezierRange(curve, c, layer, addToLayer) {
8652
+ function getChainBezierRange(curve, c, layer, addToLayer, pointMatchingDistance) {
8606
8653
  var endLinks = [c.links[0], c.links[c.links.length - 1]];
8607
8654
  if (endLinks[0].walkedPath.pathContext.bezierData.startT > endLinks[1].walkedPath.pathContext.bezierData.startT) {
8608
8655
  MakerJs.chain.reverse(c);
8609
8656
  endLinks.reverse();
8610
8657
  }
8611
- var actualBezierRanges = endLinks.map(function (endLink) { return getActualBezierRange(curve, endLink.walkedPath.pathContext, endLink.endPoints, endLink.walkedPath.offset); });
8658
+ var actualBezierRanges = endLinks.map(function (endLink) { return getActualBezierRange(curve, endLink.walkedPath.pathContext, endLink.endPoints, endLink.walkedPath.offset, pointMatchingDistance); });
8612
8659
  var result = {
8613
8660
  startT: actualBezierRanges[0] ? actualBezierRanges[0].startT : null,
8614
8661
  endT: actualBezierRanges[1] ? actualBezierRanges[1].endT : null
@@ -8770,7 +8817,7 @@ var MakerJs;
8770
8817
  };
8771
8818
  MakerJs.model.findChains(curve, function (chains, loose, layer) {
8772
8819
  chains.forEach(function (c) {
8773
- var range = getChainBezierRange(curve, c, layer, addToLayer);
8820
+ var range = getChainBezierRange(curve, c, layer, addToLayer, options.pointMatchingDistance);
8774
8821
  if (range) {
8775
8822
  var b = getScratch(curve.seed);
8776
8823
  var piece = b.split(range.startT, range.endT);
@@ -8785,7 +8832,7 @@ var MakerJs;
8785
8832
  //bezier is linear
8786
8833
  return addToLayer(wp.pathContext, layer, true);
8787
8834
  }
8788
- var range = getActualBezierRange(curve, wp.pathContext, MakerJs.point.fromPathEnds(wp.pathContext), wp.offset);
8835
+ var range = getActualBezierRange(curve, wp.pathContext, MakerJs.point.fromPathEnds(wp.pathContext), wp.offset, options.pointMatchingDistance);
8789
8836
  if (range) {
8790
8837
  var b = getScratch(curve.seed);
8791
8838
  var piece = b.split(range.startT, range.endT);
@@ -9885,5 +9932,5 @@ var MakerJs;
9885
9932
  ];
9886
9933
  })(models = MakerJs.models || (MakerJs.models = {}));
9887
9934
  })(MakerJs || (MakerJs = {}));
9888
- MakerJs.version = "0.18.0";
9935
+ MakerJs.version = "0.18.2";
9889
9936
  var Bezier = require('bezier-js');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makerjs",
3
- "version": "0.18.0",
3
+ "version": "0.18.2",
4
4
  "description": "Maker.js, a Microsoft Garage project, is a JavaScript library for creating and sharing modular line drawings for CNC and laser cutters.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -97,7 +97,7 @@
97
97
  "@jscad/csg": "^0.3.7",
98
98
  "@jscad/stl-serializer": "^0.1.0",
99
99
  "@types/graham_scan": "^1.0.28",
100
- "dxf-parser-typings": "^1.3.0"
100
+ "dxf-parser-typings": "^1.3.1"
101
101
  },
102
102
  "dependencies": {
103
103
  "@danmarshall/jscad-typings": "^1.0.0",