@jscad/core 2.6.1 → 2.6.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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [2.6.2](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/core@2.6.1...@jscad/core@2.6.2) (2022-07-17)
7
+
8
+ **Note:** Version bump only for package @jscad/core
9
+
10
+
11
+
12
+
13
+
6
14
  ## [2.6.1](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/core@2.6.0...@jscad/core@2.6.1) (2022-06-12)
7
15
 
8
16
  **Note:** Version bump only for package @jscad/core
@@ -26,7 +26,7 @@ var cachedSetTimeout,cachedClearTimeout,process=module.exports={};function defau
26
26
  },{}],8:[function(require,module,exports){
27
27
  module.exports={
28
28
  "name": "@jscad/core",
29
- "version": "2.6.1",
29
+ "version": "2.6.2",
30
30
  "description": "Core functionality for JSCAD Applications",
31
31
  "homepage": "https://openjscad.xyz/",
32
32
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -62,9 +62,9 @@ module.exports={
62
62
  "license": "MIT",
63
63
  "dependencies": {
64
64
  "@jscad/array-utils": "2.1.4",
65
- "@jscad/io": "2.4.0",
66
- "@jscad/io-utils": "2.0.20",
67
- "@jscad/modeling": "2.9.5",
65
+ "@jscad/io": "2.4.1",
66
+ "@jscad/io-utils": "2.0.21",
67
+ "@jscad/modeling": "2.9.6",
68
68
  "json5": "2.2.0",
69
69
  "strip-bom": "4.0.0"
70
70
  },
@@ -196,7 +196,7 @@ const zipSync=require("fflate").zipSync,strToU8=require("fflate").strToU8,string
196
196
  },{"xmlchars/xml/1.0/ed5":42,"xmlchars/xml/1.1/ed2":43,"xmlchars/xmlns/1.0/ed3":44}],46:[function(require,module,exports){
197
197
  module.exports={
198
198
  "name": "@jscad/amf-deserializer",
199
- "version": "2.3.0",
199
+ "version": "2.3.1",
200
200
  "description": "AMF Deserializer for JSCAD",
201
201
  "repository": "https://github.com/jscad/OpenJSCAD.org/",
202
202
  "main": "src/index.js",
@@ -227,7 +227,7 @@ module.exports={
227
227
  ],
228
228
  "license": "MIT",
229
229
  "dependencies": {
230
- "@jscad/modeling": "2.9.5",
230
+ "@jscad/modeling": "2.9.6",
231
231
  "saxes": "5.0.1"
232
232
  },
233
233
  "devDependencies": {
@@ -285,7 +285,7 @@ const{geometries:geometries,maths:maths,primitives:primitives}=require("@jscad/m
285
285
  },{"./helpers":59,"@jscad/modeling":212}],62:[function(require,module,exports){
286
286
  module.exports={
287
287
  "name": "@jscad/dxf-deserializer",
288
- "version": "2.3.17",
288
+ "version": "2.3.18",
289
289
  "description": "DXF Deserializer for JSCAD",
290
290
  "homepage": "https://openjscad.xyz/",
291
291
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -313,7 +313,7 @@ module.exports={
313
313
  ],
314
314
  "license": "MIT",
315
315
  "dependencies": {
316
- "@jscad/modeling": "2.9.5"
316
+ "@jscad/modeling": "2.9.6"
317
317
  },
318
318
  "devDependencies": {
319
319
  "ava": "3.15.0",
@@ -369,7 +369,7 @@ const{flatten:flatten,toArray:toArray}=require("@jscad/array-utils"),version=req
369
369
  },{"./package.json":77,"@jscad/array-utils":525}],77:[function(require,module,exports){
370
370
  module.exports={
371
371
  "name": "@jscad/json-deserializer",
372
- "version": "2.0.21",
372
+ "version": "2.0.22",
373
373
  "description": "JSON Deserializer for JSCAD",
374
374
  "homepage": "https://openjscad.xyz/",
375
375
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -400,7 +400,7 @@ module.exports={
400
400
  "@jscad/array-utils": "2.1.4"
401
401
  },
402
402
  "devDependencies": {
403
- "@jscad/modeling": "2.9.5",
403
+ "@jscad/modeling": "2.9.6",
404
404
  "ava": "3.15.0",
405
405
  "nyc": "15.1.0"
406
406
  },
@@ -416,7 +416,7 @@ const{colors:colors,primitives:primitives}=require("@jscad/modeling"),version=re
416
416
  },{"./package.json":80,"@jscad/modeling":212}],80:[function(require,module,exports){
417
417
  module.exports={
418
418
  "name": "@jscad/obj-deserializer",
419
- "version": "2.0.20",
419
+ "version": "2.0.21",
420
420
  "description": "OBJ Deserializer for JSCAD",
421
421
  "homepage": "https://openjscad.xyz/",
422
422
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -448,7 +448,7 @@ module.exports={
448
448
  ],
449
449
  "license": "MIT",
450
450
  "dependencies": {
451
- "@jscad/modeling": "2.9.5"
451
+ "@jscad/modeling": "2.9.6"
452
452
  },
453
453
  "devDependencies": {
454
454
  "ava": "3.15.0",
@@ -466,7 +466,7 @@ const{maths:maths,primitives:primitives}=require("@jscad/modeling"),{BinaryReade
466
466
  },{"./package.json":83,"@jscad/io-utils":70,"@jscad/modeling":212}],83:[function(require,module,exports){
467
467
  module.exports={
468
468
  "name": "@jscad/stl-deserializer",
469
- "version": "2.1.17",
469
+ "version": "2.1.18",
470
470
  "description": "STL Deserializer for JSCAD",
471
471
  "homepage": "https://openjscad.xyz/",
472
472
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -498,8 +498,8 @@ module.exports={
498
498
  ],
499
499
  "license": "MIT",
500
500
  "dependencies": {
501
- "@jscad/io-utils": "2.0.20",
502
- "@jscad/modeling": "2.9.5"
501
+ "@jscad/io-utils": "2.0.21",
502
+ "@jscad/modeling": "2.9.6"
503
503
  },
504
504
  "devDependencies": {
505
505
  "ava": "3.15.0",
@@ -532,7 +532,7 @@ const{geometries:geometries,modifiers:modifiers}=require("@jscad/modeling"),{fla
532
532
  },{"xmlchars/xml/1.0/ed5":87,"xmlchars/xml/1.1/ed2":88,"xmlchars/xmlns/1.0/ed3":89}],91:[function(require,module,exports){
533
533
  module.exports={
534
534
  "name": "@jscad/svg-deserializer",
535
- "version": "2.5.0",
535
+ "version": "2.5.1",
536
536
  "description": "SVG Deserializer for JSCAD",
537
537
  "homepage": "https://openjscad.xyz/",
538
538
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -565,7 +565,7 @@ module.exports={
565
565
  "license": "MIT",
566
566
  "dependencies": {
567
567
  "@jscad/array-utils": "2.1.4",
568
- "@jscad/modeling": "2.9.5",
568
+ "@jscad/modeling": "2.9.6",
569
569
  "saxes": "5.0.1"
570
570
  },
571
571
  "devDependencies": {
@@ -602,7 +602,7 @@ const{geometries:geometries,maths:maths,measurements:measurements,utils:utils}=r
602
602
  },{}],100:[function(require,module,exports){
603
603
  module.exports={
604
604
  "name": "@jscad/svg-serializer",
605
- "version": "2.3.8",
605
+ "version": "2.3.9",
606
606
  "description": "SVG Serializer for JSCAD",
607
607
  "homepage": "https://openjscad.xyz/",
608
608
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -634,7 +634,7 @@ module.exports={
634
634
  ],
635
635
  "license": "MIT",
636
636
  "dependencies": {
637
- "@jscad/modeling": "2.9.5",
637
+ "@jscad/modeling": "2.9.6",
638
638
  "onml": "1.3.0"
639
639
  },
640
640
  "devDependencies": {
@@ -659,7 +659,7 @@ module.exports={
659
659
  },{"xmlchars/xml/1.0/ed5":101,"xmlchars/xml/1.1/ed2":102,"xmlchars/xmlns/1.0/ed3":103}],105:[function(require,module,exports){
660
660
  module.exports={
661
661
  "name": "@jscad/x3d-deserializer",
662
- "version": "2.2.0",
662
+ "version": "2.2.1",
663
663
  "description": "X3D Deserializer for JSCAD",
664
664
  "repository": "https://github.com/jscad/OpenJSCAD.org/",
665
665
  "main": "src/index.js",
@@ -686,7 +686,7 @@ module.exports={
686
686
  },
687
687
  "dependencies": {
688
688
  "@jscad/array-utils": "2.1.4",
689
- "@jscad/modeling": "2.9.5",
689
+ "@jscad/modeling": "2.9.6",
690
690
  "saxes": "5.0.1"
691
691
  },
692
692
  "devDependencies": {
@@ -897,9 +897,9 @@ const vec2=require("../../maths/vec2"),fromPoints=require("./fromPoints"),toPoin
897
897
  const vec2=require("../../maths/vec2"),vec3=require("../../maths/vec2"),appendPoints=require("./appendPoints"),toPoints=require("./toPoints"),appendBezier=(e,t)=>{let{controlPoints:o,segments:r}=Object.assign({},{segments:16},e);if(!Array.isArray(o))throw new Error("controlPoints must be an array of one or more points");if(o.length<1)throw new Error("controlPoints must be an array of one or more points");if(r<4)throw new Error("segments must be four or more");if(t.isClosed)throw new Error("the given geometry cannot be closed");const n=toPoints(t);if(n.length<1)throw new Error("the given path must contain one or more points (as the starting point for the bezier curve)");if(null===(o=o.slice())[0]){if(o.length<2)throw new Error("a null control point must be passed with one more control points");let e=n[n.length-2];if("lastBezierControlPoint"in t&&(e=t.lastBezierControlPoint),!Array.isArray(e))throw new Error("the given path must contain TWO or more points if given a null control point");const r=vec2.scale(vec2.create(),n[n.length-1],2);vec2.subtract(r,r,e),o[0]=r}o.unshift(n[n.length-1]);const s=o.length-1,i=[];let c=1;for(let e=0;e<=s;++e)e>0&&(c*=e),i.push(c);const a=[];for(let e=0;e<=s;++e){const t=i[s]/(i[e]*i[s-e]);a.push(t)}const l=vec2.create(),h=vec2.create(),p=vec3.create(),u=e=>{let t=1,r=Math.pow(1-e,s);const n=1!==e?1/(1-e):1,i=vec2.create();for(let c=0;c<=s;++c){c===s&&(r=1);const h=a[c]*t*r,p=vec2.scale(l,o[c],h);vec2.add(i,i,p),t*=e,r*=n}return i},v=[],f=[],m=s+1;for(let e=0;e<m;++e){const t=e/(m-1),o=u(t);v.push(o),f.push(t)}let g=1;const w=2*Math.PI/r,P=Math.sin(w);for(;g<v.length-1;){const e=vec2.subtract(l,v[g],v[g-1]);vec2.normalize(e,e);const t=vec2.subtract(h,v[g+1],v[g]);vec2.normalize(t,t);const o=vec2.cross(p,e,t);if(Math.abs(o[2])>P){const e=f[g-1],t=f[g+1],o=e+1*(t-e)/3,r=e+2*(t-e)/3,n=u(o),s=u(r);v.splice(g,1,n,s),f.splice(g,1,o,r),--g<1&&(g=1)}else++g}v.shift();const b=appendPoints(v,t);return b.lastBezierControlPoint=o[o.length-2],b};module.exports=appendBezier;
898
898
 
899
899
  },{"../../maths/vec2":310,"./appendPoints":173,"./toPoints":186}],173:[function(require,module,exports){
900
- const fromPoints=require("./fromPoints"),toPoints=require("./toPoints"),appendPoints=(o,t)=>{if(t.isClosed)throw new Error("cannot append points to a closed path");let n=toPoints(t);return n=n.concat(o),fromPoints({},n)};module.exports=appendPoints;
900
+ const concat=require("./concat"),create=require("./create"),appendPoints=(e,c)=>concat(c,create(e));module.exports=appendPoints;
901
901
 
902
- },{"./fromPoints":181,"./toPoints":186}],174:[function(require,module,exports){
902
+ },{"./concat":177,"./create":178}],174:[function(require,module,exports){
903
903
  const mat4=require("../../maths/mat4"),vec2=require("../../maths/vec2"),applyTransforms=r=>mat4.isIdentity(r.transforms)?r:(r.points=r.points.map(s=>vec2.transform(vec2.create(),s,r.transforms)),r.transforms=mat4.create(),r);module.exports=applyTransforms;
904
904
 
905
905
  },{"../../maths/mat4":263,"../../maths/vec2":310}],175:[function(require,module,exports){
@@ -909,7 +909,7 @@ const clone=e=>Object.assign({},e);module.exports=clone;
909
909
  const{EPS:EPS}=require("../../maths/constants"),vec2=require("../../maths/vec2"),clone=require("./clone"),close=e=>{if(e.isClosed)return e;const t=clone(e);if(t.isClosed=!0,t.points.length>1){const e=t.points,n=e[0];let o=e[e.length-1];for(;vec2.distance(n,o)<EPS*EPS&&(e.pop(),1!==e.length);)o=e[e.length-1]}return t};module.exports=close;
910
910
 
911
911
  },{"../../maths/constants":214,"../../maths/vec2":310,"./clone":175}],177:[function(require,module,exports){
912
- const fromPoints=require("./fromPoints"),toPoints=require("./toPoints"),{equals:equals}=require("../../maths/vec2"),concat=(...o)=>{let t=!1;for(const e of o){if(t)throw new Error("Cannot concatenate to a closed path");t=e.isClosed}let e=[];return o.forEach(o=>{const t=toPoints(o);e.length>0&&t.length>0&&equals(t[0],e[e.length-1])&&t.shift(),e=e.concat(t)}),fromPoints({closed:t},e)};module.exports=concat;
912
+ const fromPoints=require("./fromPoints"),toPoints=require("./toPoints"),{equals:equals}=require("../../maths/vec2"),concat=(...t)=>{let o=!1,e=[];return t.forEach((t,n)=>{const s=toPoints(t).slice();if(e.length>0&&s.length>0&&equals(s[0],e[e.length-1])&&s.shift(),s.length>0&&o)throw new Error(`Cannot concatenate to a closed path; check the ${n}th path`);o=t.isClosed,e=e.concat(s)}),fromPoints({closed:o},e)};module.exports=concat;
913
913
 
914
914
  },{"../../maths/vec2":310,"./fromPoints":181,"./toPoints":186}],178:[function(require,module,exports){
915
915
  const mat4=require("../../maths/mat4"),create=e=>(void 0===e&&(e=[]),{points:e,isClosed:!1,transforms:mat4.create()});module.exports=create;
@@ -1788,7 +1788,7 @@ const flatten=require("../../utils/flatten"),measureEpsilon=require("../../measu
1788
1788
  module.exports={generalize:require("./generalize"),snap:require("./snap")};
1789
1789
 
1790
1790
  },{"./generalize":468,"./snap":474}],470:[function(require,module,exports){
1791
- const constants=require("../../maths/constants"),vec3=require("../../maths/vec3"),poly3=require("../../geometries/poly3"),assert=!1,getTag=e=>`${e}`,addSide=(e,t,n,s,c,r)=>{const l=getTag(s),o=getTag(c);const i=`${l}/${o}`,g=`${o}/${l}`;if(e.has(g))return deleteSide(e,t,n,c,s,null),null;const a={vertex0:s,vertex1:c,polygonindex:r};return e.has(i)?e.get(i).push(a):e.set(i,[a]),l in t?t[l].push(i):t[l]=[i],o in n?n[o].push(i):n[o]=[i],i},deleteSide=(e,t,n,s,c,r)=>{const l=getTag(s),o=getTag(c),i=`${l}/${o}`;let g=-1;const a=e.get(i);for(let e=0;e<a.length;e++){const t=a[e];let n=getTag(t.vertex0);if(n===l&&((n=getTag(t.vertex1))===o&&(null===r||t.polygonindex===r))){g=e;break}}a.splice(g,1),0===a.length&&e.delete(i),g=t[l].indexOf(i),t[l].splice(g,1),0===t[l].length&&delete t[l],g=n[o].indexOf(i),n[o].splice(g,1),0===n[o].length&&delete n[o]},insertTjunctions=e=>{const t=new Map;for(let n=0;n<e.length;n++){const s=e[n],c=s.vertices.length;if(c>=3){let e=s.vertices[0],r=getTag(e);for(let l=0;l<c;l++){let o=l+1;o===c&&(o=0);const i=s.vertices[o],g=getTag(i),a=`${r}/${g}`,v=`${g}/${r}`;if(t.has(v)){const e=t.get(v);e.splice(-1,1),0===e.length&&t.delete(v)}else{const s={vertex0:e,vertex1:i,polygonindex:n};t.has(a)?t.get(a).push(s):t.set(a,[s])}e=i,r=g}}else console.warn("warning: invalid polygon found during insertTjunctions")}if(t.size>0){const n={},s={},c={};for(const[e,r]of t)c[e]=!0,r.forEach(t=>{const c=getTag(t.vertex0),r=getTag(t.vertex1);c in n?n[c].push(e):n[c]=[e],r in s?s[r].push(e):s[r]=[e]});const r=e.slice(0);for(;0!==t.size;){for(const e of t.keys())c[e]=!0;let e=!1;for(;;){const l=Object.keys(c);if(0===l.length)break;const o=l[0];let i=!0;if(t.has(o)){const l=t.get(o);0;const g=l[0];for(let l=0;l<2;l++){const o=0===l?g.vertex0:g.vertex1,a=0===l?g.vertex1:g.vertex0,v=getTag(o),d=getTag(a);let f=[];0===l?v in s&&(f=s[v]):v in n&&(f=n[v]);for(let g=0;g<f.length;g++){const v=f[g],u=t.get(v)[0],x=0===l?u.vertex0:u.vertex1,h=0===l?u.vertex1:u.vertex0,p=getTag(x);getTag(h);if(p===d){deleteSide(t,n,s,o,a,null),deleteSide(t,n,s,a,o,null),i=!1,l=2,e=!0;break}{const g=o,v=a,d=x,f=vec3.subtract(vec3.create(),d,g),h=vec3.dot(vec3.subtract(vec3.create(),v,g),f)/vec3.dot(f,f);if(h>0&&h<1){const o=vec3.scale(vec3.create(),f,h);if(vec3.add(o,o,g),vec3.squaredDistance(o,v)<constants.EPS*constants.EPS){const o=u.polygonindex,g=r[o],v=getTag(u.vertex1);let d=-1;for(let e=0;e<g.vertices.length;e++)if(getTag(g.vertices[e])===v){d=e;break}0;const f=g.vertices.slice(0);f.splice(d,0,a);const x=poly3.create(f);r[o]=x,deleteSide(t,n,s,u.vertex0,u.vertex1,o);const h=addSide(t,n,s,u.vertex0,a,o),p=addSide(t,n,s,a,u.vertex1,o);null!==h&&(c[h]=!0),null!==p&&(c[p]=!0),i=!1,l=2,e=!0;break}}}}}}i&&delete c[o]}if(!e)break}e=r}return t.clear(),e};module.exports=insertTjunctions;
1791
+ const constants=require("../../maths/constants"),vec3=require("../../maths/vec3"),poly3=require("../../geometries/poly3"),assert=!1,getTag=e=>`${e}`,addSide=(e,t,s,n,r,c)=>{const o=getTag(n),g=getTag(r);const l=`${o}/${g}`,a=`${g}/${o}`;if(e.has(a))return deleteSide(e,t,s,r,n,null),null;const i={vertex0:n,vertex1:r,polygonindex:c};return e.has(l)?e.get(l).push(i):e.set(l,[i]),t.has(o)?t.get(o).push(l):t.set(o,[l]),s.has(g)?s.get(g).push(l):s.set(g,[l]),l},deleteSide=(e,t,s,n,r,c)=>{const o=getTag(n),g=getTag(r),l=`${o}/${g}`;let a=-1;const i=e.get(l);for(let e=0;e<i.length;e++){const t=i[e];let s=getTag(t.vertex0);if(s===o&&((s=getTag(t.vertex1))===g&&(null===c||t.polygonindex===c))){a=e;break}}i.splice(a,1),0===i.length&&e.delete(l),a=t.get(o).indexOf(l),t.get(o).splice(a,1),0===t.get(o).length&&t.delete(o),a=s.get(g).indexOf(l),s.get(g).splice(a,1),0===s.get(g).length&&s.delete(g)},insertTjunctions=e=>{const t=new Map;for(let s=0;s<e.length;s++){const n=e[s],r=n.vertices.length;if(r>=3){let e=n.vertices[0],c=getTag(e);for(let o=0;o<r;o++){let g=o+1;g===r&&(g=0);const l=n.vertices[g],a=getTag(l),i=`${c}/${a}`,v=`${a}/${c}`;if(t.has(v)){const e=t.get(v);e.splice(-1,1),0===e.length&&t.delete(v)}else{const n={vertex0:e,vertex1:l,polygonindex:s};t.has(i)?t.get(i).push(n):t.set(i,[n])}e=l,c=a}}else console.warn("warning: invalid polygon found during insertTjunctions")}if(t.size>0){const s=new Map,n=new Map,r=new Map;for(const[e,c]of t)r.set(e,!0),c.forEach(t=>{const r=getTag(t.vertex0),c=getTag(t.vertex1);s.has(r)?s.get(r).push(e):s.set(r,[e]),n.has(c)?n.get(c).push(e):n.set(c,[e])});const c=e.slice(0);for(;0!==t.size;){for(const e of t.keys())r.set(e,!0);let e=!1;for(;;){const o=Array.from(r.keys());if(0===o.length)break;const g=o[0];let l=!0;if(t.has(g)){const o=t.get(g);0;const a=o[0];for(let o=0;o<2;o++){const g=0===o?a.vertex0:a.vertex1,i=0===o?a.vertex1:a.vertex0,v=getTag(g),d=getTag(i);let h=[];0===o?n.has(v)&&(h=n.get(v)):s.has(v)&&(h=s.get(v));for(let a=0;a<h.length;a++){const v=h[a],f=t.get(v)[0],u=0===o?f.vertex0:f.vertex1,x=0===o?f.vertex1:f.vertex0,p=getTag(u);getTag(x);if(p===d){deleteSide(t,s,n,g,i,null),deleteSide(t,s,n,i,g,null),l=!1,o=2,e=!0;break}{const a=g,v=i,d=u,h=vec3.subtract(vec3.create(),d,a),x=vec3.dot(vec3.subtract(vec3.create(),v,a),h)/vec3.dot(h,h);if(x>0&&x<1){const g=vec3.scale(vec3.create(),h,x);if(vec3.add(g,g,a),vec3.squaredDistance(g,v)<constants.EPS*constants.EPS){const g=f.polygonindex,a=c[g],v=getTag(f.vertex1);let d=-1;for(let e=0;e<a.vertices.length;e++)if(getTag(a.vertices[e])===v){d=e;break}0;const h=a.vertices.slice(0);h.splice(d,0,i);const u=poly3.create(h);c[g]=u,deleteSide(t,s,n,f.vertex0,f.vertex1,g);const x=addSide(t,s,n,f.vertex0,i,g),p=addSide(t,s,n,i,f.vertex1,g);null!==x&&r.set(x,!0),null!==p&&r.set(p,!0),l=!1,o=2,e=!0;break}}}}}}l&&r.delete(g)}if(!e)break}e=c}return t.clear(),e};module.exports=insertTjunctions;
1792
1792
 
1793
1793
  },{"../../geometries/poly3":199,"../../maths/constants":214,"../../maths/vec3":341}],471:[function(require,module,exports){
1794
1794
  const aboutEqualNormals=require("../../maths/utils/aboutEqualNormals"),vec3=require("../../maths/vec3"),poly3=require("../../geometries/poly3"),createEdges=e=>{const n=poly3.toPoints(e),t=[];for(let e=0;e<n.length;e++){const l=(e+1)%n.length,r={v1:n[e],v2:n[l]};t.push(r)}for(let e=0;e<t.length;e++){const l=(e+1)%n.length;t[e].next=t[l],t[l].prev=t[e]}return t},insertEdge=(e,n)=>{const t=`${n.v1}:${n.v2}`;e.set(t,n)},deleteEdge=(e,n)=>{const t=`${n.v1}:${n.v2}`;e.delete(t)},findOppositeEdge=(e,n)=>{const t=`${n.v2}:${n.v1}`;return e.get(t)},calculateAnglesBetween=(e,n,t)=>{let l=e.prev.v1,r=e.prev.v2,o=n.next.v2;const v=calculateAngle(l,r,o,t);return l=n.prev.v1,r=n.prev.v2,o=e.next.v2,[v,calculateAngle(l,r,o,t)]},v1=vec3.create(),v2=vec3.create(),calculateAngle=(e,n,t,l)=>{const r=vec3.subtract(v1,n,e),o=vec3.subtract(v2,t,n);return vec3.cross(r,r,o),vec3.dot(r,l)},createPolygonAnd=e=>{let n;const t=[];for(;e.next;){const n=e.next;t.push(e.v1),e.v1=null,e.v2=null,e.next=null,e.prev=null,e=n}return t.length>0&&(n=poly3.create(t)),n},mergeCoplanarPolygons=e=>{if(e.length<2)return e;const n=e[0].plane,t=e.slice(),l=new Map;for(;t.length>0;){const e=t.shift(),r=createEdges(e);for(let e=0;e<r.length;e++){const t=r[e],o=findOppositeEdge(l,t);if(o){const e=calculateAnglesBetween(t,o,n);if(e[0]>=0&&e[1]>=0){const n=o.next,r=t.next;t.prev.next=o.next,t.next.prev=o.prev,o.prev.next=t.next,o.next.prev=t.prev,t.v1=null,t.v2=null,t.next=null,t.prev=null,deleteEdge(l,o),o.v1=null,o.v2=null,o.next=null,o.prev=null;const v=(e,n,t)=>{const l={v1:t.v1,v2:n.v2,next:n.next,prev:t.prev};t.prev.next=l,n.next.prev=l,deleteEdge(e,n),n.v1=null,n.v2=null,n.next=null,n.prev=null,deleteEdge(e,t),t.v1=null,t.v2=null,t.next=null,t.prev=null};0===e[0]&&v(l,n,n.prev),0===e[1]&&v(l,r,r.prev)}}else t.next&&insertEdge(l,t)}}const r=[];return l.forEach(e=>{const n=createPolygonAnd(e);n&&r.push(n)}),l.clear(),r},coplanar=(e,n)=>Math.abs(e[3]-n[3])<1.5e-7&&aboutEqualNormals(e,n),mergePolygons=(e,n)=>{const t=[];n.forEach(e=>{const n=t.find(n=>coplanar(n[0],poly3.plane(e)));if(n){n[1].push(e)}else t.push([poly3.plane(e),[e]])});let l=[];return t.forEach(e=>{const n=e[1],t=mergeCoplanarPolygons(n);l=l.concat(t)}),l};module.exports=mergePolygons;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jscad/core",
3
- "version": "2.6.1",
3
+ "version": "2.6.2",
4
4
  "description": "Core functionality for JSCAD Applications",
5
5
  "homepage": "https://openjscad.xyz/",
6
6
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -36,9 +36,9 @@
36
36
  "license": "MIT",
37
37
  "dependencies": {
38
38
  "@jscad/array-utils": "2.1.4",
39
- "@jscad/io": "2.4.0",
40
- "@jscad/io-utils": "2.0.20",
41
- "@jscad/modeling": "2.9.5",
39
+ "@jscad/io": "2.4.1",
40
+ "@jscad/io-utils": "2.0.21",
41
+ "@jscad/modeling": "2.9.6",
42
42
  "json5": "2.2.0",
43
43
  "strip-bom": "4.0.0"
44
44
  },
@@ -53,5 +53,5 @@
53
53
  "url": "https://opencollective.com/openjscad",
54
54
  "logo": "https://opencollective.com/openjscad/logo.txt"
55
55
  },
56
- "gitHead": "225b034db0d94f748992da72b269833954a2e212"
56
+ "gitHead": "9768af96e5da00cd113c00ddeb0f6046707819b1"
57
57
  }