diff --git a/web/app/sketcher/io.js b/web/app/sketcher/io.js index d8b14a9f..a5d6f237 100644 --- a/web/app/sketcher/io.js +++ b/web/app/sketcher/io.js @@ -1,3 +1,5 @@ +TCAD.io = {}; + TCAD.IO = function(viewer) { this.viewer = viewer; }; @@ -259,22 +261,42 @@ TCAD.IO.prototype.serializeConstr = function (c) { return c.serialize(); }; + +TCAD.io._format = function(str, args) { + var i = 0; + return str.replace(/\$/g, function() { + var val = args[i] !== undefined ? args[i] : match; + if (typeof val === 'number') val = val.toPrecision(); + i ++; + return val; + }); +}; + + TCAD.IO.prototype.svgExport = function () { - var format = function(str, args) { - return str.replace(/{(\d+)}/g, function(match, number) { - var val = args[number] !== undefined ? args[number] : match; - if (typeof val === 'number') val = val.toPrecision(); - return val; - }); - }; var colors = ["#000000", "#00008B", "#006400", "#8B0000", "#FF8C00", "#E9967A"]; var svg = ""; function append(chunk) { var args = Array.prototype.slice.call(arguments, 1); - svg += format(chunk, args) + "\n" + svg += TCAD.io._format(chunk, args) + "\n" } + var bbox = [Number.MAX_VALUE, Number.MAX_VALUE, - Number.MAX_VALUE, - Number.MAX_VALUE]; + function checkBounds(x, y) { + bbox[0] = Math.min(bbox[0], x); + bbox[1] = Math.min(bbox[1], y); + bbox[2] = Math.max(bbox[2], x); + bbox[3] = Math.max(bbox[3], y); + } + + function checkCircBounds(x, y, r) { + checkBounds(x + r, y + r); + checkBounds(x - r, y + r); + checkBounds(x - r, y - r); + checkBounds(x - r, y + r); + } + var a = new TCAD.Vector(); var b = new TCAD.Vector(); @@ -286,26 +308,34 @@ TCAD.IO.prototype.svgExport = function () { var layer = layers[l]; if (layer.readOnly) continue; var color = colors[colIdx++ % colors.length]; - append('', layer.name, "none", color, '2'); + append('', layer.name, "none", color, '2'); for (var i = 0; i < layer.objects.length; ++i) { var obj = layer.objects[i]; if (obj._class === 'TCAD.TWO.Segment') { - append('', obj.a.x, obj.a.y, obj.b.x, obj.b.y); + append('', obj.a.x, obj.a.y, obj.b.x, obj.b.y); + checkBounds(obj.a.x, obj.a.y); + checkBounds(obj.b.x, obj.b.y); } else if (obj._class === 'TCAD.TWO.EndPoint') { } else if (obj._class === 'TCAD.TWO.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(); - append('', obj.a.x, obj.a.y, r, r, dir, 1, obj.b.x, obj.b.y); + append('', obj.a.x, obj.a.y, r, r, dir, 1, obj.b.x, obj.b.y); + checkCircBounds(obj.c.x, obj.c.y, r); } else if (obj._class === 'TCAD.TWO.Circle') { - append('', obj.c.x, obj.c.y, obj.r.get()); + var r = obj.r.get(); + append('', obj.c.x, obj.c.y, r); + checkCircBounds(obj.c.x, obj.c.y, r); } else if (obj._class === 'TCAD.TWO.Dimension' || obj._class === 'TCAD.TWO.HDimension' || obj._class === 'TCAD.TWO.VDimension') { } } append(''); } } - - return "\n" + svg + "" + bbox[0] -= 20; + bbox[1] -= 20; + bbox[2] += 20; + bbox[3] += 20; + return TCAD.io._format("\n", bbox) + svg + "" }; diff --git a/web/app/sketcher/main2d.js b/web/app/sketcher/main2d.js index 6c3f485b..09b69cc7 100644 --- a/web/app/sketcher/main2d.js +++ b/web/app/sketcher/main2d.js @@ -17,8 +17,8 @@ TCAD.App2D = function() { var link = document.getElementById("downloader"); link.href = "data:," + app.viewer.io.svgExport(); link.download = app.getSketchId() + ".svg"; - //link.click(); - console.log(app.viewer.io.svgExport()); + link.click(); + //console.log(app.viewer.io.svgExport()); }); this.registerAction('undo', "Undo", function () {