From 3bcbc4125b40a7297dfdfbf3d3791eb9a0b6f182 Mon Sep 17 00:00:00 2001 From: Val Erastov Date: Fri, 12 Aug 2022 22:21:36 -0700 Subject: [PATCH] make dxf-writer work --- package-lock.json | 25 +++++-- package.json | 1 + web/app/sketcher/io.ts | 158 +++++++++++++++++++---------------------- webpack.config.js | 12 ++++ 4 files changed, 105 insertions(+), 91 deletions(-) diff --git a/package-lock.json b/package-lock.json index a14948b4..a4fc46ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,10 +11,11 @@ "dependencies": { "classnames": "2.2.5", "clipper-lib": "6.2.1", + "dxf-writer": "^1.18.2", "earcut": "2.1.1", "font-awesome": "4.7.0", "immer": "^9.0.12", - "jsketcher-occ-engine": "1.0.1-9e267e3f1d283ebaa7cb1d5d11b529823e00b360", + "jsketcher-occ-engine": "1.0.1-5efaf53accb45bac475155fc4d5552642c19e91e", "jszip": "^3.10.0", "less": "^3.11.1", "libtess": "1.2.2", @@ -5352,6 +5353,11 @@ "stream-shift": "^1.0.0" } }, + "node_modules/dxf-writer": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/dxf-writer/-/dxf-writer-1.18.2.tgz", + "integrity": "sha512-o15+ldbVE3GiFRBVAhMwt0/KQFPPKLblxcPUXQ0kVcjwVlIhk9ITP2wrzhsxgBNwva9f/K71yMIT0+BCweqgoQ==" + }, "node_modules/earcut": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.1.1.tgz", @@ -9759,9 +9765,9 @@ } }, "node_modules/jsketcher-occ-engine": { - "version": "1.0.1-9e267e3f1d283ebaa7cb1d5d11b529823e00b360", - "resolved": "https://registry.npmjs.org/jsketcher-occ-engine/-/jsketcher-occ-engine-1.0.1-9e267e3f1d283ebaa7cb1d5d11b529823e00b360.tgz", - "integrity": "sha512-Eyj1ooaO+BqWLtM9GHHJ7GP18r23p9pCcHc437L8XmCBSEEVXgvLG7Hwr0FZUYSaszdevmHmQVEkuYlTPXYLmg==" + "version": "1.0.1-5efaf53accb45bac475155fc4d5552642c19e91e", + "resolved": "https://registry.npmjs.org/jsketcher-occ-engine/-/jsketcher-occ-engine-1.0.1-5efaf53accb45bac475155fc4d5552642c19e91e.tgz", + "integrity": "sha512-AMeSAaxYA81mIJlYzNheBnDDvUqWGcsS0Niny/+BnAd12awC156FGG5zkvlcl5PvHG7xwb/PCjnDGidsOW/v5Q==" }, "node_modules/json-parse-better-errors": { "version": "1.0.2", @@ -21130,6 +21136,11 @@ "stream-shift": "^1.0.0" } }, + "dxf-writer": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/dxf-writer/-/dxf-writer-1.18.2.tgz", + "integrity": "sha512-o15+ldbVE3GiFRBVAhMwt0/KQFPPKLblxcPUXQ0kVcjwVlIhk9ITP2wrzhsxgBNwva9f/K71yMIT0+BCweqgoQ==" + }, "earcut": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.1.1.tgz", @@ -24642,9 +24653,9 @@ "dev": true }, "jsketcher-occ-engine": { - "version": "1.0.1-9e267e3f1d283ebaa7cb1d5d11b529823e00b360", - "resolved": "https://registry.npmjs.org/jsketcher-occ-engine/-/jsketcher-occ-engine-1.0.1-9e267e3f1d283ebaa7cb1d5d11b529823e00b360.tgz", - "integrity": "sha512-Eyj1ooaO+BqWLtM9GHHJ7GP18r23p9pCcHc437L8XmCBSEEVXgvLG7Hwr0FZUYSaszdevmHmQVEkuYlTPXYLmg==" + "version": "1.0.1-5efaf53accb45bac475155fc4d5552642c19e91e", + "resolved": "https://registry.npmjs.org/jsketcher-occ-engine/-/jsketcher-occ-engine-1.0.1-5efaf53accb45bac475155fc4d5552642c19e91e.tgz", + "integrity": "sha512-AMeSAaxYA81mIJlYzNheBnDDvUqWGcsS0Niny/+BnAd12awC156FGG5zkvlcl5PvHG7xwb/PCjnDGidsOW/v5Q==" }, "json-parse-better-errors": { "version": "1.0.2", diff --git a/package.json b/package.json index 92684ed5..c46d0cbb 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "dependencies": { "classnames": "2.2.5", "clipper-lib": "6.2.1", + "dxf-writer": "^1.18.2", "earcut": "2.1.1", "font-awesome": "4.7.0", "immer": "^9.0.12", diff --git a/web/app/sketcher/io.ts b/web/app/sketcher/io.ts index d08726bb..c84c05e1 100644 --- a/web/app/sketcher/io.ts +++ b/web/app/sketcher/io.ts @@ -23,6 +23,7 @@ import { BoundaryGeneratorSchema } from "./generators/boundaryGenerator"; import { SketchTypes } from "./shapes/sketch-types"; import { SketchObject } from "./shapes/sketch-object"; import { Label } from "sketcher/shapes/label"; +import Drawing from 'dxf-writer'; @@ -355,30 +356,30 @@ export class IO { svgExport() { - var T = SketchTypes; - var out = new TextBuilder(); + let T = SketchTypes; + let out = new TextBuilder(); - var bbox = new BBox(); + let bbox = new BBox(); - var a = new Vector(); - var b = new Vector(); + let a = new Vector(); + let b = new Vector(); - var prettyColors = new PrettyColors(); - var toExport = this.getLayersToExport(); - for (var l = 0; l < toExport.length; ++l) { - var layer = toExport[l]; - var color = prettyColors.next(); + let prettyColors = new PrettyColors(); + let toExport = this.getLayersToExport(); + for (let l = 0; l < toExport.length; ++l) { + let layer = toExport[l]; + let color = prettyColors.next(); out.fline('', [layer.name, "none", color, '2']); - for (var i = 0; i < layer.objects.length; ++i) { - var obj = layer.objects[i]; + for (let i = 0; i < layer.objects.length; ++i) { + let obj = layer.objects[i]; if (obj._class !== T.POINT) bbox.check(obj); if (obj._class === T.SEGMENT) { out.fline('', [obj.a.x, obj.a.y, obj.b.x, obj.b.y]); } else if (obj._class === T.ARC) { a.set(obj.a.x - obj.c.x, obj.a.y - obj.c.y, 0); b.set(obj.b.x - obj.c.x, obj.b.y - obj.c.y, 0); - var dir = a.cross(b).z > 0 ? 0 : 1; - var r = obj.r.get(); + let dir = a.cross(b).z > 0 ? 0 : 1; + let r = obj.r.get(); out.fline('', [obj.a.x, obj.a.y, r, r, dir, 1, obj.b.x, obj.b.y]); } else if (obj._class === T.CIRCLE) { out.fline('', [obj.c.x, obj.c.y, obj.r.get()]); @@ -392,91 +393,80 @@ export class IO { }; dxfExport() { - const Drawing = window.Drawing; - let d = new window.Drawing(); + let d = new Drawing(); - var T = SketchTypes; - var out = new TextBuilder(); - var bbox = new BBox(); - var toExport = this.getLayersToExport(); - bbox.checkLayers(toExport); + let T = SketchTypes; + let out = new TextBuilder(); + let bbox = new BBox(); + let toExport = this.getLayersToExport(); + bbox.checkLayers(toExport); - out.numberln(bbox.bbox[0]); - out.numberln(bbox.bbox[1]); - out.numberln(bbox.bbox[2]); - out.numberln(bbox.bbox[3]); - const maxWidth = bbox.bbox[0] - bbox.bbox[2]; - const maxheight = bbox.bbox[1] - bbox.bbox[3]; - const textHeight = Math.abs((maxWidth > maxheight) ? maxWidth / 50 : maxheight / 50) * .5; - var i; + out.numberln(bbox.bbox[0]); + out.numberln(bbox.bbox[1]); + out.numberln(bbox.bbox[2]); + out.numberln(bbox.bbox[3]); + const maxWidth = bbox.bbox[0] - bbox.bbox[2]; + const maxheight = bbox.bbox[1] - bbox.bbox[3]; + const textHeight = Math.abs((maxWidth > maxheight) ? maxWidth / 50 : maxheight / 50) * .5; + for (let i = 0; i < toExport.length; i++) { + const newLayerName = i + 0; + toExport[i].layerId = newLayerName + '_green'; + d.addLayer(toExport[i].layerId, Drawing.ACI.GREEN, 'CONTINUOUS'); + } + d.setUnits('Millimeters'); - for (i = 0; i < toExport.length; i++) { - const newLayerName = i + 0; - toExport[i].layerId = newLayerName + '_green'; - d.addLayer(toExport[i].layerId, Drawing.ACI.GREEN, 'CONTINUOUS'); - } + for (let l = 0; l < toExport.length; l++) { + let layer = toExport[l]; + d.setActiveLayer(layer.layerId); - d.setUnits('Millimeters'); + for (let i = 0; i < layer.viewer.labelLayer.objects.length; ++i) { + let obj = layer.viewer.labelLayer.objects[i]; - - for (var l = 0; l < toExport.length; l++) { - var lid = l + 1; - var layer = toExport[l]; - d.setActiveLayer(layer.layerId); - - - for (i = 0; i < layer.viewer.labelLayer.objects.length; ++i) { - var obj = layer.viewer.labelLayer.objects[i]; - console.log("this is a label", obj); - //const objectOriginPoint = obj.assignedObject.labelCenter; - - let labelX = obj.offsetX + obj.assignedObject.labelCenter.x; - let labelY = obj.offsetY + obj.assignedObject.labelCenter.y; + let labelX = obj.offsetX + obj.assignedObject.labelCenter.x; + let labelY = obj.offsetY + obj.assignedObject.labelCenter.y; d.drawText(labelX, labelY, Math.abs(textHeight), 0, obj.text, 'center', 'middle'); - } + } - for (i = 0; i < layer.objects.length; ++i) { - var obj = layer.objects[i]; - console.log("exporting this", obj); - if (obj._class === T.POINT) { - d.drawPoint(obj.x, obj.y); - } else if (obj._class === T.SEGMENT) { - d.drawLine(obj.a.x, obj.a.y, obj.b.x, obj.b.y); - } else if (obj._class === T.ARC) { + for (let i = 0; i < layer.objects.length; ++i) { + let obj = layer.objects[i]; + console.debug("exporting object", obj); + + if (obj._class === T.POINT) { + d.drawPoint(obj.x, obj.y); + } else if (obj._class === T.SEGMENT) { + d.drawLine(obj.a.x, obj.a.y, obj.b.x, obj.b.y); + } else if (obj._class === T.ARC) { d.drawArc( - obj.c.x, - obj.c.y, - obj.r.get(), - (obj.getStartAngle() * (180 / Math.PI)), - (obj.getEndAngle() * (180 / Math.PI))); - } else if (obj._class === T.CIRCLE) { - d.drawCircle(obj.c.x, obj.c.y, obj.r.get()); - } else if (obj._class === T.ELLIPSE) { - console.log("ELLIPSE", obj); - d.drawEllipse(10, 10, 8, 0, 1, 3.14, 4.71); - d.drawEllipse(obj.centerX,obj.centerY,); - } else if (obj._class === T.BEZIER) { - d.drawSpline([ - [obj.p0.x, obj.p0.y], - [obj.p1.x, obj.p1.y], - [obj.p2.x, obj.p2.y], - [obj.p3.x, obj.p3.y], - ], 3) - } else if (obj._class === T.DIM || obj._class === T.HDIM || obj._class === T.VDIM) { - } - } - } - + obj.c.x, + obj.c.y, + obj.r.get(), + (obj.getStartAngle() * (180 / Math.PI)), + (obj.getEndAngle() * (180 / Math.PI))); + } else if (obj._class === T.CIRCLE) { + d.drawCircle(obj.c.x, obj.c.y, obj.r.get()); + } else if (obj._class === T.ELLIPSE) { + const majorX = Math.cos(obj.rotation) * obj.radiusX; + const majorY = Math.sin(obj.rotation) * obj.radiusX; + d.drawEllipse(obj.centerX, obj.centerY, majorX, majorY, obj.radiusY / obj.radiusX, 0, 2 * Math.PI); + } else if (obj._class === T.BEZIER) { + d.drawSpline([ + [obj.p0.x, obj.p0.y], + [obj.p1.x, obj.p1.y], + [obj.p2.x, obj.p2.y], + [obj.p3.x, obj.p3.y], + ], 3) + } else if (obj._class === T.DIM || obj._class === T.HDIM || obj._class === T.VDIM) { + } + } + } //console.log(d.toDxfString()); - console.log(d.generateAutocadExtras()); - console.log(toExport); - + d.generateAutocadExtras(); return d.toDxfString(); }; } diff --git a/webpack.config.js b/webpack.config.js index 3c236a4d..10b6d53c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -55,6 +55,18 @@ module.exports = { loader: 'babel-loader', include: [MODULES, WEB_APP, INTEGRATION_TESTS] }, + { + //Temporary until dxf-writer library publishes browser friendly bundle + test: /\.js$/, + include: [`${NODE_MODULES}/dxf-writer`], + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'], + plugins: [ + "@babel/proposal-class-properties" + ] + } + }, { test: /\.(less|css)$/, include: [GLOBAL_CSS, INTEGRATION_TESTS],