makerjs 0.18.1 → 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.1
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() :
@@ -2674,7 +2675,7 @@ var MakerJs;
2674
2675
  }
2675
2676
  if (modelToDistort.type === MakerJs.models.BezierCurve.typeName) {
2676
2677
  var b = modelToDistort;
2677
- var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true });
2678
+ var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: bezierAccuracy });
2678
2679
  var _loop_1 = function (layer_1) {
2679
2680
  var pathArray = bezierPartsByLayer[layer_1];
2680
2681
  pathArray.forEach(function (p, i) {
@@ -4594,7 +4595,7 @@ var MakerJs;
4594
4595
  if (m) {
4595
4596
  return augment(m);
4596
4597
  }
4597
- return m;
4598
+ return null;
4598
4599
  }
4599
4600
  measure.modelExtents = modelExtents;
4600
4601
  /**
@@ -5029,6 +5030,12 @@ var MakerJs;
5029
5030
  };
5030
5031
  }
5031
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
+ }
5032
5039
  function defaultLayer(pathContext, parentLayer) {
5033
5040
  var layerId = (pathContext && pathContext.layer) || parentLayer || '0';
5034
5041
  if (layerIds.indexOf(layerId) < 0) {
@@ -5038,9 +5045,10 @@ var MakerJs;
5038
5045
  }
5039
5046
  var map = {};
5040
5047
  map[MakerJs.pathType.Line] = function (line, offset, layer) {
5048
+ var layerId = defaultLayer(line, layer);
5041
5049
  var lineEntity = {
5042
5050
  type: "LINE",
5043
- layer: defaultLayer(line, layer),
5051
+ layer: layerId,
5044
5052
  vertices: [
5045
5053
  {
5046
5054
  x: MakerJs.round(line.origin[0] + offset[0], opts.accuracy),
@@ -5052,24 +5060,28 @@ var MakerJs;
5052
5060
  }
5053
5061
  ]
5054
5062
  };
5063
+ lineEntity.lineType = lineTypeLayerOptions(layerId);
5055
5064
  return lineEntity;
5056
5065
  };
5057
5066
  map[MakerJs.pathType.Circle] = function (circle, offset, layer) {
5067
+ var layerId = defaultLayer(circle, layer);
5058
5068
  var circleEntity = {
5059
5069
  type: "CIRCLE",
5060
- layer: defaultLayer(circle, layer),
5070
+ layer: layerId,
5061
5071
  center: {
5062
5072
  x: MakerJs.round(circle.origin[0] + offset[0], opts.accuracy),
5063
5073
  y: MakerJs.round(circle.origin[1] + offset[1], opts.accuracy)
5064
5074
  },
5065
5075
  radius: MakerJs.round(circle.radius, opts.accuracy)
5066
5076
  };
5077
+ circleEntity.lineType = lineTypeLayerOptions(layerId);
5067
5078
  return circleEntity;
5068
5079
  };
5069
5080
  map[MakerJs.pathType.Arc] = function (arc, offset, layer) {
5081
+ var layerId = defaultLayer(arc, layer);
5070
5082
  var arcEntity = {
5071
5083
  type: "ARC",
5072
- layer: defaultLayer(arc, layer),
5084
+ layer: layerId,
5073
5085
  center: {
5074
5086
  x: MakerJs.round(arc.origin[0] + offset[0], opts.accuracy),
5075
5087
  y: MakerJs.round(arc.origin[1] + offset[1], opts.accuracy)
@@ -5078,6 +5090,7 @@ var MakerJs;
5078
5090
  startAngle: MakerJs.round(arc.startAngle, opts.accuracy),
5079
5091
  endAngle: MakerJs.round(arc.endAngle, opts.accuracy)
5080
5092
  };
5093
+ arcEntity.lineType = lineTypeLayerOptions(layerId);
5081
5094
  return arcEntity;
5082
5095
  };
5083
5096
  //TODO - handle scenario if any bezier seeds get passed
@@ -5099,6 +5112,7 @@ var MakerJs;
5099
5112
  shape: c.chain.endless,
5100
5113
  vertices: []
5101
5114
  };
5115
+ polylineEntity.lineType = lineTypeLayerOptions(polylineEntity.layer);
5102
5116
  c.chain.links.forEach(function (link, i) {
5103
5117
  var bulge;
5104
5118
  if (link.walkedPath.pathContext.type === MakerJs.pathType.Arc) {
@@ -5140,15 +5154,31 @@ var MakerJs;
5140
5154
  name: layerId,
5141
5155
  color: layerColor
5142
5156
  };
5157
+ layerEntity.lineType = lineTypeLayerOptions(layerId);
5143
5158
  return layerEntity;
5144
5159
  }
5145
5160
  function lineTypesOut() {
5161
+ // Dash pattern convention: positive = drawn segment, negative = gap, 0 can be dot.
5162
+ // patternLength is sum of absolute values.
5146
5163
  var lineStyleTable = {
5147
5164
  lineTypes: {
5148
5165
  "CONTINUOUS": {
5149
5166
  name: "CONTINUOUS",
5150
5167
  description: "______",
5151
- 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
5152
5182
  }
5153
5183
  }
5154
5184
  };
@@ -5240,15 +5270,27 @@ var MakerJs;
5240
5270
  }
5241
5271
  dxf.push.apply(dxf, values);
5242
5272
  }
5273
+ function appendLineType(entity) {
5274
+ var lt = entity.lineType;
5275
+ if (lt) {
5276
+ append("6", lt);
5277
+ }
5278
+ }
5243
5279
  var map = {};
5244
5280
  map["LINE"] = function (line) {
5245
- 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);
5246
5284
  };
5247
5285
  map["CIRCLE"] = function (circle) {
5248
- 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);
5249
5289
  };
5250
5290
  map["ARC"] = function (arc) {
5251
- 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);
5252
5294
  };
5253
5295
  //TODO - handle scenario if any bezier seeds get passed
5254
5296
  //map[pathType.BezierSeed]
@@ -5259,7 +5301,9 @@ var MakerJs;
5259
5301
  }
5260
5302
  };
5261
5303
  map["POLYLINE"] = function (polyline) {
5262
- 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);
5263
5307
  polyline.vertices.forEach(function (vertex) { return map["VERTEX"](vertex); });
5264
5308
  append("0", "SEQEND");
5265
5309
  };
@@ -5282,11 +5326,14 @@ var MakerJs;
5282
5326
  table(layersOut);
5283
5327
  }
5284
5328
  function layerOut(layer) {
5285
- 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);
5286
5331
  }
5287
5332
  function lineTypeOut(lineType) {
5333
+ var elements = ((lineType.elements) || []);
5288
5334
  append("0", "LTYPE", "72", //72 Alignment code; value is always 65, the ASCII code for A
5289
- "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); });
5290
5337
  }
5291
5338
  function lineTypesOut() {
5292
5339
  var lineTypeTableName = 'lineType';
@@ -6437,7 +6484,7 @@ var MakerJs;
6437
6484
  var beziers;
6438
6485
  if (opts.unifyBeziers) {
6439
6486
  beziers = getBezierModels(modelContext);
6440
- swapBezierPathsWithSeeds(beziers, true);
6487
+ swapBezierPathsWithSeeds(beziers, true, opts.pointMatchingDistance);
6441
6488
  }
6442
6489
  model.walk(modelContext, walkOptions);
6443
6490
  var _loop_3 = function (layer_2) {
@@ -6474,7 +6521,7 @@ var MakerJs;
6474
6521
  _loop_3(layer_2);
6475
6522
  }
6476
6523
  if (beziers) {
6477
- swapBezierPathsWithSeeds(beziers, false);
6524
+ swapBezierPathsWithSeeds(beziers, false, opts.pointMatchingDistance);
6478
6525
  }
6479
6526
  if (opts.byLayers) {
6480
6527
  return chainsByLayer;
@@ -6571,7 +6618,7 @@ var MakerJs;
6571
6618
  /**
6572
6619
  * @private
6573
6620
  */
6574
- function swapBezierPathsWithSeeds(beziers, swap) {
6621
+ function swapBezierPathsWithSeeds(beziers, swap, pointMatchingDistance) {
6575
6622
  var tempKey = 'tempPaths';
6576
6623
  var tempLayerKey = 'tempLayer';
6577
6624
  beziers.forEach(function (wm) {
@@ -6583,7 +6630,7 @@ var MakerJs;
6583
6630
  b.layer = wm.layer;
6584
6631
  }
6585
6632
  //use seeds as path, hide the arc paths from findChains()
6586
- var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true });
6633
+ var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: pointMatchingDistance });
6587
6634
  for (var layer in bezierPartsByLayer) {
6588
6635
  var bezierSeeds = bezierPartsByLayer[layer];
6589
6636
  if (bezierSeeds.length > 0) {
@@ -9002,7 +9049,7 @@ var MakerJs;
9002
9049
  /**
9003
9050
  * @private
9004
9051
  */
9005
- function getActualBezierRange(curve, arc, endpoints, offset) {
9052
+ function getActualBezierRange(curve, arc, endpoints, offset, pointMatchingDistance) {
9006
9053
  var b = getScratch(curve.seed);
9007
9054
  var tPoints = [arc.bezierData.startT, arc.bezierData.endT].map(function (t) { return new TPoint(b, t, offset); });
9008
9055
  var ends = endpoints.slice();
@@ -9011,7 +9058,7 @@ var MakerJs;
9011
9058
  if (endpointDistancetoStart[0] > endpointDistancetoStart[1])
9012
9059
  ends.reverse();
9013
9060
  for (var i = 2; i--;) {
9014
- if (!MakerJs.measure.isPointEqual(ends[i], tPoints[i].point)) {
9061
+ if (!MakerJs.measure.isPointEqual(ends[i], tPoints[i].point, pointMatchingDistance)) {
9015
9062
  return null;
9016
9063
  }
9017
9064
  }
@@ -9020,13 +9067,13 @@ var MakerJs;
9020
9067
  /**
9021
9068
  * @private
9022
9069
  */
9023
- function getChainBezierRange(curve, c, layer, addToLayer) {
9070
+ function getChainBezierRange(curve, c, layer, addToLayer, pointMatchingDistance) {
9024
9071
  var endLinks = [c.links[0], c.links[c.links.length - 1]];
9025
9072
  if (endLinks[0].walkedPath.pathContext.bezierData.startT > endLinks[1].walkedPath.pathContext.bezierData.startT) {
9026
9073
  MakerJs.chain.reverse(c);
9027
9074
  endLinks.reverse();
9028
9075
  }
9029
- 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); });
9030
9077
  var result = {
9031
9078
  startT: actualBezierRanges[0] ? actualBezierRanges[0].startT : null,
9032
9079
  endT: actualBezierRanges[1] ? actualBezierRanges[1].endT : null
@@ -9188,7 +9235,7 @@ var MakerJs;
9188
9235
  };
9189
9236
  MakerJs.model.findChains(curve, function (chains, loose, layer) {
9190
9237
  chains.forEach(function (c) {
9191
- var range = getChainBezierRange(curve, c, layer, addToLayer);
9238
+ var range = getChainBezierRange(curve, c, layer, addToLayer, options.pointMatchingDistance);
9192
9239
  if (range) {
9193
9240
  var b = getScratch(curve.seed);
9194
9241
  var piece = b.split(range.startT, range.endT);
@@ -9203,7 +9250,7 @@ var MakerJs;
9203
9250
  //bezier is linear
9204
9251
  return addToLayer(wp.pathContext, layer, true);
9205
9252
  }
9206
- 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);
9207
9254
  if (range) {
9208
9255
  var b = getScratch(curve.seed);
9209
9256
  var piece = b.split(range.startT, range.endT);
@@ -10303,6 +10350,6 @@ var MakerJs;
10303
10350
  ];
10304
10351
  })(models = MakerJs.models || (MakerJs.models = {}));
10305
10352
  })(MakerJs || (MakerJs = {}));
10306
- MakerJs.version = "0.18.1";
10353
+ MakerJs.version = "0.18.2";
10307
10354
 
10308
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.1
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
@@ -2257,7 +2257,7 @@ var MakerJs;
2257
2257
  }
2258
2258
  if (modelToDistort.type === MakerJs.models.BezierCurve.typeName) {
2259
2259
  var b = modelToDistort;
2260
- var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true });
2260
+ var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: bezierAccuracy });
2261
2261
  var _loop_1 = function (layer_1) {
2262
2262
  var pathArray = bezierPartsByLayer[layer_1];
2263
2263
  pathArray.forEach(function (p, i) {
@@ -4177,7 +4177,7 @@ var MakerJs;
4177
4177
  if (m) {
4178
4178
  return augment(m);
4179
4179
  }
4180
- return m;
4180
+ return null;
4181
4181
  }
4182
4182
  measure.modelExtents = modelExtents;
4183
4183
  /**
@@ -4612,6 +4612,12 @@ var MakerJs;
4612
4612
  };
4613
4613
  }
4614
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
+ }
4615
4621
  function defaultLayer(pathContext, parentLayer) {
4616
4622
  var layerId = (pathContext && pathContext.layer) || parentLayer || '0';
4617
4623
  if (layerIds.indexOf(layerId) < 0) {
@@ -4621,9 +4627,10 @@ var MakerJs;
4621
4627
  }
4622
4628
  var map = {};
4623
4629
  map[MakerJs.pathType.Line] = function (line, offset, layer) {
4630
+ var layerId = defaultLayer(line, layer);
4624
4631
  var lineEntity = {
4625
4632
  type: "LINE",
4626
- layer: defaultLayer(line, layer),
4633
+ layer: layerId,
4627
4634
  vertices: [
4628
4635
  {
4629
4636
  x: MakerJs.round(line.origin[0] + offset[0], opts.accuracy),
@@ -4635,24 +4642,28 @@ var MakerJs;
4635
4642
  }
4636
4643
  ]
4637
4644
  };
4645
+ lineEntity.lineType = lineTypeLayerOptions(layerId);
4638
4646
  return lineEntity;
4639
4647
  };
4640
4648
  map[MakerJs.pathType.Circle] = function (circle, offset, layer) {
4649
+ var layerId = defaultLayer(circle, layer);
4641
4650
  var circleEntity = {
4642
4651
  type: "CIRCLE",
4643
- layer: defaultLayer(circle, layer),
4652
+ layer: layerId,
4644
4653
  center: {
4645
4654
  x: MakerJs.round(circle.origin[0] + offset[0], opts.accuracy),
4646
4655
  y: MakerJs.round(circle.origin[1] + offset[1], opts.accuracy)
4647
4656
  },
4648
4657
  radius: MakerJs.round(circle.radius, opts.accuracy)
4649
4658
  };
4659
+ circleEntity.lineType = lineTypeLayerOptions(layerId);
4650
4660
  return circleEntity;
4651
4661
  };
4652
4662
  map[MakerJs.pathType.Arc] = function (arc, offset, layer) {
4663
+ var layerId = defaultLayer(arc, layer);
4653
4664
  var arcEntity = {
4654
4665
  type: "ARC",
4655
- layer: defaultLayer(arc, layer),
4666
+ layer: layerId,
4656
4667
  center: {
4657
4668
  x: MakerJs.round(arc.origin[0] + offset[0], opts.accuracy),
4658
4669
  y: MakerJs.round(arc.origin[1] + offset[1], opts.accuracy)
@@ -4661,6 +4672,7 @@ var MakerJs;
4661
4672
  startAngle: MakerJs.round(arc.startAngle, opts.accuracy),
4662
4673
  endAngle: MakerJs.round(arc.endAngle, opts.accuracy)
4663
4674
  };
4675
+ arcEntity.lineType = lineTypeLayerOptions(layerId);
4664
4676
  return arcEntity;
4665
4677
  };
4666
4678
  //TODO - handle scenario if any bezier seeds get passed
@@ -4682,6 +4694,7 @@ var MakerJs;
4682
4694
  shape: c.chain.endless,
4683
4695
  vertices: []
4684
4696
  };
4697
+ polylineEntity.lineType = lineTypeLayerOptions(polylineEntity.layer);
4685
4698
  c.chain.links.forEach(function (link, i) {
4686
4699
  var bulge;
4687
4700
  if (link.walkedPath.pathContext.type === MakerJs.pathType.Arc) {
@@ -4723,15 +4736,31 @@ var MakerJs;
4723
4736
  name: layerId,
4724
4737
  color: layerColor
4725
4738
  };
4739
+ layerEntity.lineType = lineTypeLayerOptions(layerId);
4726
4740
  return layerEntity;
4727
4741
  }
4728
4742
  function lineTypesOut() {
4743
+ // Dash pattern convention: positive = drawn segment, negative = gap, 0 can be dot.
4744
+ // patternLength is sum of absolute values.
4729
4745
  var lineStyleTable = {
4730
4746
  lineTypes: {
4731
4747
  "CONTINUOUS": {
4732
4748
  name: "CONTINUOUS",
4733
4749
  description: "______",
4734
- 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
4735
4764
  }
4736
4765
  }
4737
4766
  };
@@ -4823,15 +4852,27 @@ var MakerJs;
4823
4852
  }
4824
4853
  dxf.push.apply(dxf, values);
4825
4854
  }
4855
+ function appendLineType(entity) {
4856
+ var lt = entity.lineType;
4857
+ if (lt) {
4858
+ append("6", lt);
4859
+ }
4860
+ }
4826
4861
  var map = {};
4827
4862
  map["LINE"] = function (line) {
4828
- 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);
4829
4866
  };
4830
4867
  map["CIRCLE"] = function (circle) {
4831
- 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);
4832
4871
  };
4833
4872
  map["ARC"] = function (arc) {
4834
- 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);
4835
4876
  };
4836
4877
  //TODO - handle scenario if any bezier seeds get passed
4837
4878
  //map[pathType.BezierSeed]
@@ -4842,7 +4883,9 @@ var MakerJs;
4842
4883
  }
4843
4884
  };
4844
4885
  map["POLYLINE"] = function (polyline) {
4845
- 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);
4846
4889
  polyline.vertices.forEach(function (vertex) { return map["VERTEX"](vertex); });
4847
4890
  append("0", "SEQEND");
4848
4891
  };
@@ -4865,11 +4908,14 @@ var MakerJs;
4865
4908
  table(layersOut);
4866
4909
  }
4867
4910
  function layerOut(layer) {
4868
- 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);
4869
4913
  }
4870
4914
  function lineTypeOut(lineType) {
4915
+ var elements = ((lineType.elements) || []);
4871
4916
  append("0", "LTYPE", "72", //72 Alignment code; value is always 65, the ASCII code for A
4872
- "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); });
4873
4919
  }
4874
4920
  function lineTypesOut() {
4875
4921
  var lineTypeTableName = 'lineType';
@@ -6020,7 +6066,7 @@ var MakerJs;
6020
6066
  var beziers;
6021
6067
  if (opts.unifyBeziers) {
6022
6068
  beziers = getBezierModels(modelContext);
6023
- swapBezierPathsWithSeeds(beziers, true);
6069
+ swapBezierPathsWithSeeds(beziers, true, opts.pointMatchingDistance);
6024
6070
  }
6025
6071
  model.walk(modelContext, walkOptions);
6026
6072
  var _loop_3 = function (layer_2) {
@@ -6057,7 +6103,7 @@ var MakerJs;
6057
6103
  _loop_3(layer_2);
6058
6104
  }
6059
6105
  if (beziers) {
6060
- swapBezierPathsWithSeeds(beziers, false);
6106
+ swapBezierPathsWithSeeds(beziers, false, opts.pointMatchingDistance);
6061
6107
  }
6062
6108
  if (opts.byLayers) {
6063
6109
  return chainsByLayer;
@@ -6154,7 +6200,7 @@ var MakerJs;
6154
6200
  /**
6155
6201
  * @private
6156
6202
  */
6157
- function swapBezierPathsWithSeeds(beziers, swap) {
6203
+ function swapBezierPathsWithSeeds(beziers, swap, pointMatchingDistance) {
6158
6204
  var tempKey = 'tempPaths';
6159
6205
  var tempLayerKey = 'tempLayer';
6160
6206
  beziers.forEach(function (wm) {
@@ -6166,7 +6212,7 @@ var MakerJs;
6166
6212
  b.layer = wm.layer;
6167
6213
  }
6168
6214
  //use seeds as path, hide the arc paths from findChains()
6169
- var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true });
6215
+ var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: pointMatchingDistance });
6170
6216
  for (var layer in bezierPartsByLayer) {
6171
6217
  var bezierSeeds = bezierPartsByLayer[layer];
6172
6218
  if (bezierSeeds.length > 0) {
@@ -8585,7 +8631,7 @@ var MakerJs;
8585
8631
  /**
8586
8632
  * @private
8587
8633
  */
8588
- function getActualBezierRange(curve, arc, endpoints, offset) {
8634
+ function getActualBezierRange(curve, arc, endpoints, offset, pointMatchingDistance) {
8589
8635
  var b = getScratch(curve.seed);
8590
8636
  var tPoints = [arc.bezierData.startT, arc.bezierData.endT].map(function (t) { return new TPoint(b, t, offset); });
8591
8637
  var ends = endpoints.slice();
@@ -8594,7 +8640,7 @@ var MakerJs;
8594
8640
  if (endpointDistancetoStart[0] > endpointDistancetoStart[1])
8595
8641
  ends.reverse();
8596
8642
  for (var i = 2; i--;) {
8597
- if (!MakerJs.measure.isPointEqual(ends[i], tPoints[i].point)) {
8643
+ if (!MakerJs.measure.isPointEqual(ends[i], tPoints[i].point, pointMatchingDistance)) {
8598
8644
  return null;
8599
8645
  }
8600
8646
  }
@@ -8603,13 +8649,13 @@ var MakerJs;
8603
8649
  /**
8604
8650
  * @private
8605
8651
  */
8606
- function getChainBezierRange(curve, c, layer, addToLayer) {
8652
+ function getChainBezierRange(curve, c, layer, addToLayer, pointMatchingDistance) {
8607
8653
  var endLinks = [c.links[0], c.links[c.links.length - 1]];
8608
8654
  if (endLinks[0].walkedPath.pathContext.bezierData.startT > endLinks[1].walkedPath.pathContext.bezierData.startT) {
8609
8655
  MakerJs.chain.reverse(c);
8610
8656
  endLinks.reverse();
8611
8657
  }
8612
- 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); });
8613
8659
  var result = {
8614
8660
  startT: actualBezierRanges[0] ? actualBezierRanges[0].startT : null,
8615
8661
  endT: actualBezierRanges[1] ? actualBezierRanges[1].endT : null
@@ -8771,7 +8817,7 @@ var MakerJs;
8771
8817
  };
8772
8818
  MakerJs.model.findChains(curve, function (chains, loose, layer) {
8773
8819
  chains.forEach(function (c) {
8774
- var range = getChainBezierRange(curve, c, layer, addToLayer);
8820
+ var range = getChainBezierRange(curve, c, layer, addToLayer, options.pointMatchingDistance);
8775
8821
  if (range) {
8776
8822
  var b = getScratch(curve.seed);
8777
8823
  var piece = b.split(range.startT, range.endT);
@@ -8786,7 +8832,7 @@ var MakerJs;
8786
8832
  //bezier is linear
8787
8833
  return addToLayer(wp.pathContext, layer, true);
8788
8834
  }
8789
- 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);
8790
8836
  if (range) {
8791
8837
  var b = getScratch(curve.seed);
8792
8838
  var piece = b.split(range.startT, range.endT);
@@ -9886,5 +9932,5 @@ var MakerJs;
9886
9932
  ];
9887
9933
  })(models = MakerJs.models || (MakerJs.models = {}));
9888
9934
  })(MakerJs || (MakerJs = {}));
9889
- MakerJs.version = "0.18.1";
9935
+ MakerJs.version = "0.18.2";
9890
9936
  var Bezier = require('bezier-js');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makerjs",
3
- "version": "0.18.1",
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",