@jscad/core 2.6.3 → 2.6.4

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.4](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/core@2.6.3...@jscad/core@2.6.4) (2022-09-23)
7
+
8
+ **Note:** Version bump only for package @jscad/core
9
+
10
+
11
+
12
+
13
+
6
14
  ## [2.6.3](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/core@2.6.2...@jscad/core@2.6.3) (2022-08-21)
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.3",
29
+ "version": "2.6.4",
30
30
  "description": "Core functionality for JSCAD Applications",
31
31
  "homepage": "https://openjscad.xyz/",
32
32
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -62,7 +62,7 @@ module.exports={
62
62
  "license": "MIT",
63
63
  "dependencies": {
64
64
  "@jscad/array-utils": "2.1.4",
65
- "@jscad/io": "2.4.2",
65
+ "@jscad/io": "2.4.3",
66
66
  "@jscad/io-utils": "2.0.22",
67
67
  "@jscad/modeling": "2.10.0",
68
68
  "json5": "2.2.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.2",
535
+ "version": "2.5.3",
536
536
  "description": "SVG Deserializer for JSCAD",
537
537
  "homepage": "https://openjscad.xyz/",
538
538
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -585,7 +585,7 @@ const{inchMM:inchMM,ptMM:ptMM,pcMM:pcMM,svgColors:svgColors}=require("./constant
585
585
  const saxes=require("saxes"),{colors:colors,transforms:transforms}=require("@jscad/modeling"),{toArray:toArray}=require("@jscad/array-utils"),version=require("../package.json").version,{cagLengthX:cagLengthX,cagLengthY:cagLengthY,svgColorForTarget:svgColorForTarget}=require("./helpers"),{svgSvg:svgSvg,svgRect:svgRect,svgCircle:svgCircle,svgGroup:svgGroup,svgLine:svgLine,svgPath:svgPath,svgEllipse:svgEllipse,svgPolygon:svgPolygon,svgPolyline:svgPolyline,svgUse:svgUse}=require("./svgElementHelpers"),shapesMapGeometry=require("./shapesMapGeometry"),shapesMapJscad=require("./shapesMapJscad"),deserialize=(s,e)=>{const t={addMetaData:!0,filename:"svg",output:"script",pxPmm:require("./constants").pxPmm,segments:32,target:"path",pathSelfClosed:"error",version:version};return"script"===(s=Object.assign({},t,s)).output?translate(e,s):instantiate(e,s)},instantiate=(s,e)=>{const{pxPmm:t}=e;if(e&&e.statusCallback&&e.statusCallback({progress:0}),createSvgParser(s,t),!svgObj)throw new Error("SVG parsing failed, no valid SVG data retrieved");e&&e.statusCallback&&e.statusCallback({progress:50});const n=objectify(e,svgObj);return e&&e.statusCallback&&e.statusCallback({progress:100}),n},translate=(s,e)=>{const{filename:t,version:n,pxPmm:r,addMetaData:o}=e;if(e&&e.statusCallback&&e.statusCallback({progress:0}),createSvgParser(s,r),!svgObj)throw new Error("SVG parsing failed, no valid SVG data retrieved");let a=o?`//\n // producer: JSCAD SVG Deserializer ${n}\n // date: ${new Date}\n // source: ${t}\n //\n`:"";return a+="const { colors, geometries, primitives, transforms } = require('@jscad/modeling')\n\n",e&&e.statusCallback&&e.statusCallback({progress:50}),a+=codify(e,svgObj),a+="\nmodule.exports = { main }",e&&e.statusCallback&&e.statusCallback({progress:100}),a};let svgUnitsX,svgUnitsY,svgUnitsV;const svgObjects=[],svgGroups=[],svgDefs=[];let svgObj,svgInDefs=!1,svgUnitsPmm=[1,1];const objectify=(s,e)=>{const{target:t,segments:n,pathSelfClosed:r}=s,o=svgGroups.length;svgGroups.push(e);let a=o;for(;a>0;)a--;let g=[];const l={svgUnitsPmm:svgUnitsPmm,svgUnitsX:svgUnitsX,svgUnitsY:svgUnitsY,svgUnitsV:svgUnitsV,level:o,target:t,svgGroups:svgGroups,segments:n,pathSelfClosed:r};for(a=0;a<e.objects.length;a++){const s=e.objects[a];let n=toArray(shapesMapGeometry(s,objectify,l));n=n.map(e=>{if("transforms"in s){let t=null,n=null,r=null;for(let e=0;e<s.transforms.length;e++){const o=s.transforms[e];"rotate"in o&&(t=o),"scale"in o&&(n=o),"translate"in o&&(r=o)}if(null!==n){let s=Math.abs(n.scale[0]),t=Math.abs(n.scale[1]);e=transforms.scale([s,t,1],e),s=n.scale[0],t=n.scale[1],s<0&&(e=transforms.mirrorX(e)),t<0&&(e=transforms.mirrorY(e))}if(null!==t){const s=0-.017453292519943295*t.rotate;e=transforms.rotateZ(s,e)}if(null!==r){const s=cagLengthX(r.translate[0],svgUnitsPmm,svgUnitsX),t=0-cagLengthY(r.translate[1],svgUnitsPmm,svgUnitsY);e=transforms.translate([s,t,0],e)}}const n=svgColorForTarget(t,s);return n&&(e=colors.colorize(n,e)),e}),g=g.concat(n)}return svgGroups.pop(),g},codify=(s,e)=>{const{target:t,segments:n}=s,r=svgGroups.length;svgGroups.push(e);let o=" ",a=r;for(;a>0;)o+=" ",a--;let g="";0===r&&(g+="function main(params) {\n let levels = {}\n let paths = {}\n let parts\n");const l="levels.l"+r;for(g+=`${o}${l} = []\n`,a=0;a<e.objects.length;a++){const s=e.objects[a],i="paths.p"+a;if(g+=shapesMapJscad(s,codify,{level:r,indent:o,ln:l,on:i,svgUnitsPmm:svgUnitsPmm,svgUnitsX:svgUnitsX,svgUnitsY:svgUnitsY,svgUnitsV:svgUnitsV,svgGroups:svgGroups,target:t,segments:n}),"transforms"in s){let e=null,t=null,n=null;for(let r=0;r<s.transforms.length;r++){const o=s.transforms[r];"rotate"in o&&(e=o),"scale"in o&&(t=o),"translate"in o&&(n=o)}if(null!==t){let s=Math.abs(t.scale[0]),e=Math.abs(t.scale[1]);g+=`${o}${i} = transforms.scale([${s}, ${e}, 1], ${i})\n`,(s=t.scale[0])<0&&(g+=`${o}${i} = transforms.mirrorX(${i})\n`),(e=t.scale[1])<0&&(g+=`${o}${i} = transforms.mirrorY(${i})\n`)}if(null!==e){g+=`${o}${i} = transforms.rotateZ(${0-.017453292519943295*e.rotate}, ${i})\n`}if(null!==n){g+=`${o}${i} = transforms.translate([${cagLengthX(n.translate[0],svgUnitsPmm,svgUnitsX)}, ${0-cagLengthY(n.translate[1],svgUnitsPmm,svgUnitsY)}, 0], ${i})\n`}}const v=svgColorForTarget(t,s);v&&(g+=`${o}${i} = colors.colorize([${v}], ${i})\n`),g+=`${o}${l} = ${l}.concat(${i})\n\n`}return 0===r&&(g+=o+"return "+l+"\n",g+="}\n"),svgGroups.pop(),g},createSvgParser=(s,e)=>{const t=new saxes.SaxesParser;return void 0!==e&&e>t.pxPmm&&(t.pxPmm=e),t.on("error",s=>{console.log(`ERROR: SVG file, line ${t.line}, column ${t.column}`),console.log(s)}),t.on("opentag",s=>{const n={SVG:svgSvg,G:svgGroup,RECT:svgRect,CIRCLE:svgCircle,ELLIPSE:svgEllipse,LINE:svgLine,POLYLINE:svgPolyline,POLYGON:svgPolygon,PATH:svgPath,USE:svgUse,DEFS:()=>{svgInDefs=!0},DESC:()=>void 0,TITLE:()=>void 0,STYLE:()=>void 0,undefined:()=>console.log("WARNING: unsupported SVG element: "+s.name)};s.attributes.position=[t.line+1,t.column+1];const r=s.name.toUpperCase(),o=n[r]?n[r](s.attributes,{svgObjects:svgObjects,customPxPmm:e}):void 0;if(o)if("id"in o&&(svgObjects[o.id]=o),"svg"===o.type)svgGroups.push(o),svgUnitsPmm=o.unitsPmm,svgUnitsX=o.viewW,svgUnitsY=o.viewH,svgUnitsV=o.viewP;else if(!0===svgInDefs){if(svgDefs.length>0){const s=svgDefs.pop();"objects"in s&&s.objects.push(o),svgDefs.push(s)}"group"===o.type&&svgDefs.push(o)}else{if(svgGroups.length>0){const s=svgGroups.pop();"objects"in s&&s.objects.push(o),svgGroups.push(s)}"group"===o.type&&svgGroups.push(o)}}),t.on("closetag",s=>{const e=()=>!0===svgInDefs?svgDefs.pop():svgGroups.pop(),t={SVG:e,DEFS:()=>{svgInDefs=!1},USE:e,G:e,undefined:()=>{}},n=s.name.toUpperCase(),r=t[n]?t[n]():void 0;0===svgGroups.length&&(svgObj=r)}),t.on("end",()=>{}),t.write(s).close(),t},extension="svg";module.exports={deserialize:deserialize,extension:"svg"};
586
586
 
587
587
  },{"../package.json":91,"./constants":92,"./helpers":93,"./shapesMapGeometry":95,"./shapesMapJscad":96,"./svgElementHelpers":97,"@jscad/array-utils":525,"@jscad/modeling":212,"saxes":90}],95:[function(require,module,exports){
588
- const{geometries:geometries,primitives:primitives}=require("@jscad/modeling"),{svg2cagX:svg2cagX,svg2cagY:svg2cagY,cagLengthX:cagLengthX,cagLengthY:cagLengthY,cagLengthP:cagLengthP,reflect:reflect}=require("./helpers"),shapesMapGeometry=(e,s,a)=>{const{svgUnitsPmm:t,svgUnitsX:g,svgUnitsY:o,svgUnitsV:r,svgGroups:n,target:c,segments:p,pathSelfClosed:i}=a;return{group:e=>s({target:c,segments:p},e),rect:(e,s,a,t,g,o,r)=>{let n=cagLengthX(e.x,s,a),p=0-cagLengthY(e.y,s,t);const i=cagLengthX(e.width,s,a),l=cagLengthY(e.height,s,t),v=cagLengthX(e.rx,s,a);let h;return i>0&&l>0&&(n+=i/2,p-=l/2,h=0===v?primitives.rectangle({center:[n,p],size:[i,l]}):primitives.roundedRectangle({center:[n,p],segments:r,size:[i,l],roundRadius:v}),"path"===c&&(h=geometries.path2.fromPoints({closed:!0},geometries.geom2.toPoints(h)))),h},circle:(e,s,a,t,g,o,r)=>{const n=cagLengthX(e.x,s,a),p=0-cagLengthY(e.y,s,t),i=cagLengthP(e.radius,s,g);let l;return i>0&&(l=primitives.circle({center:[n,p],segments:r,radius:i}),"path"===c&&(l=geometries.path2.fromPoints({closed:!0},geometries.geom2.toPoints(l)))),l},ellipse:(e,s,a,t,g,o,r)=>{const n=cagLengthX(e.rx,s,a),p=cagLengthY(e.ry,s,t),i=cagLengthX(e.cx,s,a),l=0-cagLengthY(e.cy,s,t);let v;return n>0&&p>0&&(v=primitives.ellipse({center:[i,l],segments:r,radius:[n,p]}),"path"===c&&(v=geometries.path2.fromPoints({closed:!0},geometries.geom2.toPoints(v)))),v},line:(e,s,a,t,g)=>{const o=cagLengthX(e.x1,s,a),r=0-cagLengthY(e.y1,s,t),n=cagLengthX(e.x2,s,a),c=0-cagLengthY(e.y2,s,t);return primitives.line([[o,r],[n,c]])},polygon:(e,s,a,t)=>{const g=[];for(let o=0;o<e.points.length;o++){const r=e.points[o];if("x"in r&&"y"in r){const e=cagLengthX(r.x,s,a),o=0-cagLengthY(r.y,s,t);g.push([e,o])}}return"geom2"===c?geometries.geom2.fromPoints(g):geometries.path2.fromPoints({},g)},polyline:(e,s,a,t,g)=>{const o=[];for(let g=0;g<e.points.length;g++){const r=e.points[g];if("x"in r&&"y"in r){const e=cagLengthX(r.x,s,a),g=0-cagLengthY(r.y,s,t);o.push([e,g])}}return primitives.line(o)},path:(e,s,a,t,g,o,r)=>{const n=expandPath(e,s,a,t,g,o,r,i);return Object.entries(n).sort((e,s)=>e[0].localeCompare(s[0])).map(e=>{const s=e[1];if("geom2"===c&&s.isClosed){const e=geometries.path2.toPoints(s).slice();return e.push(e[0]),geometries.geom2.fromPoints(e)}return s})}}[e.type](e,t,g,o,r,n,p)};module.exports=shapesMapGeometry;const appendPoints=(e,s)=>s?geometries.path2.appendPoints(e,s):geometries.path2.fromPoints({},e),expandPath=(e,s,a,t,g,o,r,n)=>{const c={};let p=0,i=0,l=0,v=0,h=0,m="path"+h,F=!1,d=0,X=0,f=0,Y=0;const P=()=>{m="path"+ ++h,F=!1},u=()=>{c[m]||(c[m]=geometries.path2.fromPoints({},[]))};for(let a=0;a<e.commands.length;a++){const t=e.commands[a],g=t.p;let o=0;switch(t.c){case"m":for(0===a&&(l=0,v=0),g.length>=o+2&&(l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),P(),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]]),p=l,i=v);g.length>=o+2;)l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"M":for(g.length>=o+2&&(l=parseFloat(g[o++]),v=parseFloat(g[o++]),P(),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]]),p=l,i=v);g.length>=o+2;)l=parseFloat(g[o++]),v=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"a":for(;g.length>=o+7;){const e=parseFloat(g[o++]),a=parseFloat(g[o++]),t=0-.017453292519943295*parseFloat(g[o++]),n="1"===g[o++],p="1"===g[o++];l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendArc({segments:r,endpoint:[svg2cagX(l,s),svg2cagY(v,s)],radius:[svg2cagX(e,s),svg2cagY(a,s)],xaxisrotation:t,clockwise:p,large:n},c[m])}break;case"A":for(;g.length>=o+7;){const e=parseFloat(g[o++]),a=parseFloat(g[o++]),t=0-.017453292519943295*parseFloat(g[o++]),n="1"===g[o++],p="1"===g[o++];l=parseFloat(g[o++]),v=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendArc({segments:r,endpoint:[svg2cagX(l,s),svg2cagY(v,s)],radius:[svg2cagX(e,s),svg2cagY(a,s)],xaxisrotation:t,clockwise:p,large:n},c[m])}break;case"c":for(;g.length>=o+6;){const e=l+parseFloat(g[o++]),a=v+parseFloat(g[o++]);d=l+parseFloat(g[o++]),X=v+parseFloat(g[o++]),l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(e,s),svg2cagY(a,s)],[svg2cagX(d,s),svg2cagY(X,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const t=reflect(d,X,l,v);d=t[0],X=t[1]}break;case"C":for(;g.length>=o+6;){const e=parseFloat(g[o++]),a=parseFloat(g[o++]);d=parseFloat(g[o++]),X=parseFloat(g[o++]),l=parseFloat(g[o++]),v=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(e,s),svg2cagY(a,s)],[svg2cagX(d,s),svg2cagY(X,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const t=reflect(d,X,l,v);d=t[0],X=t[1]}break;case"q":for(;g.length>=o+4;){f=l+parseFloat(g[o++]),Y=v+parseFloat(g[o++]),l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const e=reflect(f,Y,l,v);f=e[0],Y=e[1]}break;case"Q":for(;g.length>=o+4;){f=parseFloat(g[o++]),Y=parseFloat(g[o++]),l=parseFloat(g[o++]),v=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const e=reflect(f,Y,l,v);f=e[0],Y=e[1]}break;case"t":for(;g.length>=o+2;){l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(f,s),svg2cagY(Y,s)],[l,v]]},c[m]);const e=reflect(f,Y,l,v);f=e[0],Y=e[1]}break;case"T":for(;g.length>=o+2;){l=parseFloat(g[o++]),v=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const e=reflect(f,Y,l,v);f=e[0],Y=e[1]}break;case"s":for(;g.length>=o+4;){const e=d,a=X;d=l+parseFloat(g[o++]),X=v+parseFloat(g[o++]),l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(e,s),svg2cagY(a,s)],[svg2cagX(d,s),svg2cagY(X,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const t=reflect(d,X,l,v);d=t[0],X=t[1]}break;case"S":for(;g.length>=o+4;){const e=d,a=X;d=parseFloat(g[o++]),X=parseFloat(g[o++]),l=parseFloat(g[o++]),v=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(e,s),svg2cagY(a,s)],[svg2cagX(d,s),svg2cagY(X,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const t=reflect(d,X,l,v);d=t[0],X=t[1]}break;case"h":for(;g.length>=o+1;)l+=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"H":for(;g.length>=o+1;)l=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"l":for(;g.length>=o+2;)l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"L":for(;g.length>=o+2;)l=parseFloat(g[o++]),v=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"v":for(;g.length>=o+1;)v+=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"V":for(;g.length>=o+1;)v=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"z":case"Z":c[m]=geometries.path2.close(c[m]),l=p,v=i,F=!0;break;default:console.log("Warning: Unknow PATH command ["+t.c+"]")}const h=e=>"z"===e||"Z"===e;if(!0!==F&&c[m]&&c[m].isClosed){let s=e.commands[a+1];if(!s||!h(s.c))if("trim"===n)for(;s&&!h(s.c);)a++,s=e.commands[a+1];else{if("split"!==n)throw new Error(`Malformed svg path at ${e.position[0]}:${t.pos}. Path closed itself with command #${a} ${t.c}${g.join(" ")}`);P()}}}return c};
588
+ const{geometries:geometries,primitives:primitives}=require("@jscad/modeling"),{svg2cagX:svg2cagX,svg2cagY:svg2cagY,cagLengthX:cagLengthX,cagLengthY:cagLengthY,cagLengthP:cagLengthP,reflect:reflect}=require("./helpers"),shapesMapGeometry=(e,s,a)=>{const{svgUnitsPmm:t,svgUnitsX:g,svgUnitsY:o,svgUnitsV:r,svgGroups:n,target:c,segments:p,pathSelfClosed:i}=a;return{group:e=>s({target:c,segments:p},e),rect:(e,s,a,t,g,o,r)=>{let n=cagLengthX(e.x,s,a),p=0-cagLengthY(e.y,s,t);const i=cagLengthX(e.width,s,a),l=cagLengthY(e.height,s,t),v=cagLengthX(e.rx,s,a);let h;return i>0&&l>0&&(n+=i/2,p-=l/2,h=0===v?primitives.rectangle({center:[n,p],size:[i,l]}):primitives.roundedRectangle({center:[n,p],segments:r,size:[i,l],roundRadius:v}),"path"===c&&(h=geometries.path2.fromPoints({closed:!0},geometries.geom2.toPoints(h)))),h},circle:(e,s,a,t,g,o,r)=>{const n=cagLengthX(e.x,s,a),p=0-cagLengthY(e.y,s,t),i=cagLengthP(e.radius,s,g);let l;return i>0&&(l=primitives.circle({center:[n,p],segments:r,radius:i}),"path"===c&&(l=geometries.path2.fromPoints({closed:!0},geometries.geom2.toPoints(l)))),l},ellipse:(e,s,a,t,g,o,r)=>{const n=cagLengthX(e.rx,s,a),p=cagLengthY(e.ry,s,t),i=cagLengthX(e.cx,s,a),l=0-cagLengthY(e.cy,s,t);let v;return n>0&&p>0&&(v=primitives.ellipse({center:[i,l],segments:r,radius:[n,p]}),"path"===c&&(v=geometries.path2.fromPoints({closed:!0},geometries.geom2.toPoints(v)))),v},line:(e,s,a,t,g)=>{const o=cagLengthX(e.x1,s,a),r=0-cagLengthY(e.y1,s,t),n=cagLengthX(e.x2,s,a),c=0-cagLengthY(e.y2,s,t);return primitives.line([[o,r],[n,c]])},polygon:(e,s,a,t)=>{const g=[];for(let o=0;o<e.points.length;o++){const r=e.points[o];if("x"in r&&"y"in r){const e=cagLengthX(r.x,s,a),o=0-cagLengthY(r.y,s,t);g.push([e,o])}}return"geom2"===c?geometries.geom2.fromPoints(g):geometries.path2.fromPoints({},g)},polyline:(e,s,a,t,g)=>{const o=[];for(let g=0;g<e.points.length;g++){const r=e.points[g];if("x"in r&&"y"in r){const e=cagLengthX(r.x,s,a),g=0-cagLengthY(r.y,s,t);o.push([e,g])}}return primitives.line(o)},path:(e,s,a,t,g,o,r)=>{const n=expandPath(e,s,a,t,g,o,r,i);return Object.entries(n).sort((e,s)=>e[0].localeCompare(s[0])).map(e=>{const s=e[1];if("geom2"===c&&s.isClosed){const e=geometries.path2.toPoints(s).slice();return e.push(e[0]),geometries.geom2.fromPoints(e)}return s})}}[e.type](e,t,g,o,r,n,p)};module.exports=shapesMapGeometry;const appendPoints=(e,s)=>s?geometries.path2.appendPoints(e,s):geometries.path2.fromPoints({},e),expandPath=(e,s,a,t,g,o,r,n)=>{const c={};let p=0,i=0,l=0,v=0,h=0,m="path"+h,F=!1,d=0,X=0,f=0,Y=0;const P=()=>{m="path"+ ++h,F=!1},u=()=>{c[m]||(c[m]=geometries.path2.fromPoints({},[]))};for(let a=0;a<e.commands.length;a++){const t=e.commands[a],g=t.p;let o=0;switch(t.c){case"m":for(0===a&&(l=0,v=0),g.length>=o+2&&(l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),P(),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]]),p=l,i=v);g.length>=o+2;)l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"M":for(g.length>=o+2&&(l=parseFloat(g[o++]),v=parseFloat(g[o++]),P(),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]]),p=l,i=v);g.length>=o+2;)l=parseFloat(g[o++]),v=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"a":for(;g.length>=o+7;){const e=parseFloat(g[o++]),a=parseFloat(g[o++]),t=0-.017453292519943295*parseFloat(g[o++]),n="1"===g[o++],p="1"===g[o++];l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendArc({segments:r,endpoint:[svg2cagX(l,s),svg2cagY(v,s)],radius:[svg2cagX(e,s),svg2cagY(a,s)],xaxisrotation:t,clockwise:p,large:n},c[m])}break;case"A":for(;g.length>=o+7;){const e=parseFloat(g[o++]),a=parseFloat(g[o++]),t=0-.017453292519943295*parseFloat(g[o++]),n="1"===g[o++],p="1"===g[o++];l=parseFloat(g[o++]),v=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendArc({segments:r,endpoint:[svg2cagX(l,s),svg2cagY(v,s)],radius:[svg2cagX(e,s),svg2cagY(a,s)],xaxisrotation:t,clockwise:p,large:n},c[m])}break;case"c":for(;g.length>=o+6;){const e=l+parseFloat(g[o++]),a=v+parseFloat(g[o++]);d=l+parseFloat(g[o++]),X=v+parseFloat(g[o++]),l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(e,s),svg2cagY(a,s)],[svg2cagX(d,s),svg2cagY(X,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const t=reflect(d,X,l,v);d=t[0],X=t[1]}break;case"C":for(;g.length>=o+6;){const e=parseFloat(g[o++]),a=parseFloat(g[o++]);d=parseFloat(g[o++]),X=parseFloat(g[o++]),l=parseFloat(g[o++]),v=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(e,s),svg2cagY(a,s)],[svg2cagX(d,s),svg2cagY(X,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const t=reflect(d,X,l,v);d=t[0],X=t[1]}break;case"q":for(;g.length>=o+4;){f=l+parseFloat(g[o++]),Y=v+parseFloat(g[o++]),l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const e=reflect(f,Y,l,v);f=e[0],Y=e[1]}break;case"Q":for(;g.length>=o+4;){f=parseFloat(g[o++]),Y=parseFloat(g[o++]),l=parseFloat(g[o++]),v=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const e=reflect(f,Y,l,v);f=e[0],Y=e[1]}break;case"t":for(;g.length>=o+2;){l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(f,s),svg2cagY(Y,s)],[l,v]]},c[m]);const e=reflect(f,Y,l,v);f=e[0],Y=e[1]}break;case"T":for(;g.length>=o+2;){l=parseFloat(g[o++]),v=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(f,s),svg2cagY(Y,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const e=reflect(f,Y,l,v);f=e[0],Y=e[1]}break;case"s":for(;g.length>=o+4;){const e=d,a=X;d=l+parseFloat(g[o++]),X=v+parseFloat(g[o++]),l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(e,s),svg2cagY(a,s)],[svg2cagX(d,s),svg2cagY(X,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const t=reflect(d,X,l,v);d=t[0],X=t[1]}break;case"S":for(;g.length>=o+4;){const e=d,a=X;d=parseFloat(g[o++]),X=parseFloat(g[o++]),l=parseFloat(g[o++]),v=parseFloat(g[o++]),u(),c[m]=geometries.path2.appendBezier({segments:r,controlPoints:[[svg2cagX(e,s),svg2cagY(a,s)],[svg2cagX(d,s),svg2cagY(X,s)],[svg2cagX(l,s),svg2cagY(v,s)]]},c[m]);const t=reflect(d,X,l,v);d=t[0],X=t[1]}break;case"h":for(;g.length>=o+1;)l+=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"H":for(;g.length>=o+1;)l=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"l":for(;g.length>=o+2;)l+=parseFloat(g[o++]),v+=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"L":for(;g.length>=o+2;)l=parseFloat(g[o++]),v=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"v":for(;g.length>=o+1;)v+=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"V":for(;g.length>=o+1;)v=parseFloat(g[o++]),c[m]=appendPoints([[svg2cagX(l,s),svg2cagY(v,s)]],c[m]);break;case"z":case"Z":c[m]=geometries.path2.close(c[m]),l=p,v=i,F=!0;break;default:console.log("Warning: Unknow PATH command ["+t.c+"]")}const h=e=>"z"===e||"Z"===e;if(!0!==F&&c[m]&&c[m].isClosed){let s=e.commands[a+1];if(s&&!h(s.c))if("trim"===n)for(;s&&!h(s.c);)a++,s=e.commands[a+1];else{if("split"!==n)throw new Error(`Malformed svg path at ${e.position[0]}:${t.pos}. Path closed itself with command #${a} ${t.c}${g.join(" ")}`);P()}}}return c};
589
589
 
590
590
  },{"./helpers":93,"@jscad/modeling":212}],96:[function(require,module,exports){
591
591
  const{svg2cagX:svg2cagX,svg2cagY:svg2cagY,cagLengthX:cagLengthX,cagLengthY:cagLengthY,cagLengthP:cagLengthP,reflect:reflect}=require("./helpers"),shapesMap=(e,t,s)=>{const{level:a,indent:g,on:n,svgUnitsPmm:o,svgUnitsX:r,svgUnitsY:$,svgUnitsV:i,svgGroups:c,target:p,segments:h}=s;return{group:e=>{let s=t({target:p,segments:h},e);return s+=`${g}${n} = levels.l${a+1}\n`},rect:(e,t,s,a,o,r,$,i)=>{let c=cagLengthX(e.x,t,s),h=0-cagLengthY(e.y,t,a);const l=cagLengthX(e.width,t,s),f=cagLengthY(e.height,t,a),v=cagLengthX(e.rx,t,s);let m;return l>0&&f>0&&(c=(c+l/2).toFixed(4),h=(h-f/2).toFixed(4),m=0===v?`${g}${n} = primitives.rectangle({center: [${c}, ${h}], size: [${l}, ${f}]}) // line ${e.position}\n`:`${g}${n} = primitives.roundedRectangle({center: [${c}, ${h}], segments: ${i}, size: [${l}, ${f}], roundRadius: ${v}}) // line ${e.position}\n`,"path"===p&&(m+=`${g}${n} = geometries.path2.fromPoints({closed: true}, geometries.geom2.toPoints(${n}))\n`)),m},circle:(e,t,s,a,o,r,$,i)=>{const c=cagLengthX(e.x,t,s),h=0-cagLengthY(e.y,t,a),l=cagLengthP(e.radius,t,o);let f;return l>0&&(f=`${g}${n} = primitives.circle({center: [${c}, ${h}], segments: ${i}, radius: ${l}}) // line ${e.position}\n`,"path"===p&&(f+=`${g}${n} = geometries.path2.fromPoints({closed: true}, geometries.geom2.toPoints(${n}))\n`)),f},ellipse:(e,t,s,a,o,r,$,i)=>{const c=cagLengthX(e.rx,t,s),h=cagLengthY(e.ry,t,a),l=cagLengthX(e.cx,t,s),f=0-cagLengthY(e.cy,t,a);let v;return c>0&&h>0&&(v=`${g}${n} = primitives.ellipse({center: [${l}, ${f}], segments: ${i}, radius: [${c}, ${h}]}) // line ${e.position}\n`,"path"===p&&(v+=`${g}${n} = geometries.path2.fromPoints({closed: true}, geometries.geom2.toPoints(${n}))\n`)),v},line:(e,t,s,a,o)=>{const r=cagLengthX(e.x1,t,s),$=0-cagLengthY(e.y1,t,a),i=cagLengthX(e.x2,t,s),c=0-cagLengthY(e.y2,t,a);return`${g}${n} = primitives.line([[${r}, ${$}], [${i}, ${c}]]) // line ${e.position}\n`},polygon:(e,t,s,a)=>{let o=`${g}${n} = primitives.polygon({points: [\n`;for(let n=0;n<e.points.length;n++){const r=e.points[n];if("x"in r&&"y"in r){const e=cagLengthX(r.x,t,s),n=0-cagLengthY(r.y,t,a);o+=`${g} [${e}, ${n}],\n`}}return o+=`${g}]}) // line ${e.position}\n`,"path"===p&&(o+=`${g}${n} = geometries.path2.fromPoints({closed: true}, geometries.geom2.toPoints(${n}))\n`),o},polyline:(e,t,s,a,o)=>{let r=`${g}${n} = geometries.path2.fromPoints({}, [\n`;for(let n=0;n<e.points.length;n++){const o=e.points[n];if("x"in o&&"y"in o){const e=cagLengthX(o.x,t,s),n=0-cagLengthY(o.y,t,a);r+=`${g} [${e}, ${n}],\n`}}return r+=`${g}]) // line ${e.position}\n`},path:path}[e.type](e,o,r,$,i,s,c,h)};module.exports=shapesMap;const path=(e,t,s,a,g,n,o,r)=>{const{indent:$,on:i,target:c}=n;let p=`${$}parts = [] // line ${e.position}\n`,h=0,l=0,f=0,v=0,m=0,F=i+m,X=!1,Y=0,d=0,P=0,u=0;for(let s=0;s<e.commands.length;s++){const a=e.commands[s],g=a.p;switch(a.c){case"m":for(0===s&&(f=0,v=0),m>0&&!1===X&&(p+=`${$}parts.push(${F})\n`),g.length>=2&&(f+=parseFloat(g.shift()),v+=parseFloat(g.shift()),X=!1,p+=`${$}${F=i+ ++m} = geometries.path2.fromPoints({}, [[${svg2cagX(f,t)}, ${svg2cagY(v,t)}]])\n`,h=f,l=v);g.length>=2;)f+=parseFloat(g.shift()),v+=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendPoints([${svg2cagX(f,t)}, ${svg2cagY(v,t)}], ${F})\n`;break;case"M":for(m>0&&!1===X&&(p+=`${$}parts.push(${F})\n`),g.length>=2&&(f=parseFloat(g.shift()),v=parseFloat(g.shift()),X=!1,p+=`${$}${F=i+ ++m} = geometries.path2.fromPoints({}, [[${svg2cagX(f,t)}, ${svg2cagY(v,t)}]])\n`,h=f,l=v);g.length>=2;)f=parseFloat(g.shift()),v=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendPoints([${svg2cagX(f,t)}, ${svg2cagY(v,t)}], ${F})\n`;break;case"a":for(;g.length>=7;){const e=parseFloat(g.shift()),s=parseFloat(g.shift()),a=0-.017453292519943295*parseFloat(g.shift()),n="1"===g.shift(),o="1"===g.shift();f+=parseFloat(g.shift()),v+=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendArc({segments: ${r}, endpoint: [${svg2cagX(f,t)}, ${svg2cagY(v,t)}], radius: [${svg2cagX(e,t)}, ${svg2cagY(s,t)}], xaxisrotation: ${a}, clockwise: ${o}, large: ${n}}, ${F})\n`}break;case"A":for(;g.length>=7;){const e=parseFloat(g.shift()),s=parseFloat(g.shift()),a=0-.017453292519943295*parseFloat(g.shift()),n="1"===g.shift(),o="1"===g.shift();f=parseFloat(g.shift()),v=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendArc({segments: ${r}, endpoint: [${svg2cagX(f,t)}, ${svg2cagY(v,t)}], radius: [${svg2cagX(e,t)}, ${svg2cagY(s,t)}], xaxisrotation: ${a}, clockwise: ${o}, large: ${n}}, ${F})\n`}break;case"c":for(;g.length>=6;){const e=f+parseFloat(g.shift()),s=v+parseFloat(g.shift());Y=f+parseFloat(g.shift()),d=v+parseFloat(g.shift()),f+=parseFloat(g.shift()),v+=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendBezier({segments: ${r}, controlPoints: [[${svg2cagX(e,t)}, ${svg2cagY(s,t)}], [${svg2cagX(Y,t)}, ${svg2cagY(d,t)}], [${svg2cagX(f,t)}, ${svg2cagY(v,t)}]]}, ${F})\n`;const a=reflect(Y,d,f,v);Y=a[0],d=a[1]}break;case"C":for(;g.length>=6;){const e=parseFloat(g.shift()),s=parseFloat(g.shift());Y=parseFloat(g.shift()),d=parseFloat(g.shift()),f=parseFloat(g.shift()),v=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendBezier({segments: ${r}, controlPoints: [[${svg2cagX(e,t)}, ${svg2cagY(s,t)}], [${svg2cagX(Y,t)}, ${svg2cagY(d,t)}], [${svg2cagX(f,t)}, ${svg2cagY(v,t)}]]}, ${F})\n`;const a=reflect(Y,d,f,v);Y=a[0],d=a[1]}break;case"q":for(;g.length>=4;){P=f+parseFloat(g.shift()),u=v+parseFloat(g.shift()),f+=parseFloat(g.shift()),v+=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendBezier({segments: ${r}, controlPoints: [[${svg2cagX(P,t)}, ${svg2cagY(u,t)}], [${svg2cagX(f,t)}, ${svg2cagY(v,t)}]]}, ${F})\n`;const e=reflect(P,u,f,v);P=e[0],u=e[1]}break;case"Q":for(;g.length>=4;){P=parseFloat(g.shift()),u=parseFloat(g.shift()),f=parseFloat(g.shift()),v=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendBezier({segments: ${r}, controlPoints: [[${svg2cagX(P,t)}, ${svg2cagY(u,t)}], [${svg2cagX(f,t)}, ${svg2cagY(v,t)}]]}, ${F})\n`;const e=reflect(P,u,f,v);P=e[0],u=e[1]}break;case"t":for(;g.length>=2;){f+=parseFloat(g.shift()),v+=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendBezier({segments: ${r}, controlPoints: [[${svg2cagX(P,t)}, ${svg2cagY(u,t)}], [${svg2cagX(f,t)}, ${svg2cagY(v,t)}]]}, ${F})\n`;const e=reflect(P,u,f,v);P=e[0],u=e[1]}break;case"T":for(;g.length>=2;){f=parseFloat(g.shift()),v=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendBezier({segments: ${r}, controlPoints: [[${svg2cagX(P,t)}, ${svg2cagY(u,t)}], [${svg2cagX(f,t)}, ${svg2cagY(v,t)}]]}, ${F})\n`;const e=reflect(P,u,f,v);P=e[0],u=e[1]}break;case"s":for(;g.length>=4;){const e=Y,s=d;Y=f+parseFloat(g.shift()),d=v+parseFloat(g.shift()),f+=parseFloat(g.shift()),v+=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendBezier({segments: ${r}, controlPoints: [[${svg2cagX(e,t)}, ${svg2cagY(s,t)}], [${svg2cagX(Y,t)}, ${svg2cagY(d,t)}], [${svg2cagX(f,t)}, ${svg2cagY(v,t)}]]}, ${F})\n`;const a=reflect(Y,d,f,v);Y=a[0],d=a[1]}break;case"S":for(;g.length>=4;){const e=Y,s=d;Y=parseFloat(g.shift()),d=parseFloat(g.shift()),f=parseFloat(g.shift()),v=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendBezier({segments: ${r}, controlPoints: [[${svg2cagX(e,t)}, ${svg2cagY(s,t)}], [${svg2cagX(Y,t)}, ${svg2cagY(d,t)}], [${svg2cagX(f,t)}, ${svg2cagY(v,t)}]]}, ${F})\n`;const a=reflect(Y,d,f,v);Y=a[0],d=a[1]}break;case"h":for(;g.length>=1;)f+=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendPoints([[${svg2cagX(f,t)}, ${svg2cagY(v,t)}]], ${F})\n`;break;case"H":for(;g.length>=1;)f=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendPoints([[${svg2cagX(f,t)}, ${svg2cagY(v,t)}]], ${F})\n`;break;case"l":for(;g.length>=2;)f+=parseFloat(g.shift()),v+=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendPoints([[${svg2cagX(f,t)}, ${svg2cagY(v,t)}]], ${F})\n`;break;case"L":for(;g.length>=2;)f=parseFloat(g.shift()),v=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendPoints([[${svg2cagX(f,t)}, ${svg2cagY(v,t)}]], ${F})\n`;break;case"v":for(;g.length>=1;)v+=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendPoints([[${svg2cagX(f,t)}, ${svg2cagY(v,t)}]], ${F})\n`;break;case"V":for(;g.length>=1;)v=parseFloat(g.shift()),p+=`${$}${F} = geometries.path2.appendPoints([[${svg2cagX(f,t)}, ${svg2cagY(v,t)}]], ${F})\n`;break;case"z":case"Z":p+=`${$}${F} = geometries.path2.close(${F})\n`,"geom2"===c&&(p+=`${$}${F} = geometries.geom2.fromPoints(geometries.path2.toPoints(${F}))\n`),p+=`${$}parts.push(${F})\n`,f=h,v=l,X=!0;break;default:console.log("Warning: Unknow PATH command ["+a.c+"]")}}return m>0&&!1===X&&(p+=`${$}parts.push(${F})\n`),p+=`${$}${i} = parts\n`};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jscad/core",
3
- "version": "2.6.3",
3
+ "version": "2.6.4",
4
4
  "description": "Core functionality for JSCAD Applications",
5
5
  "homepage": "https://openjscad.xyz/",
6
6
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -36,7 +36,7 @@
36
36
  "license": "MIT",
37
37
  "dependencies": {
38
38
  "@jscad/array-utils": "2.1.4",
39
- "@jscad/io": "2.4.2",
39
+ "@jscad/io": "2.4.3",
40
40
  "@jscad/io-utils": "2.0.22",
41
41
  "@jscad/modeling": "2.10.0",
42
42
  "json5": "2.2.0",
@@ -53,5 +53,5 @@
53
53
  "url": "https://opencollective.com/openjscad",
54
54
  "logo": "https://opencollective.com/openjscad/logo.txt"
55
55
  },
56
- "gitHead": "13572067545460affd53b64b3ab834a39af8c7e5"
56
+ "gitHead": "a27a6bc32c6cd313453da8b67f3fce29e008099f"
57
57
  }