diff --git a/web/app/main2d.js b/web/app/main2d.js index 8ecd7fe3..3f5a3916 100644 --- a/web/app/main2d.js +++ b/web/app/main2d.js @@ -7,7 +7,7 @@ TCAD.App2D = function() { var layer = new TCAD.TWO.Layer("test", TCAD.TWO.Styles.DEFAULT); this.viewer.layers.push(layer); - var sketchId = "TCAD.projects." + window.location.hash.substring(1); + var sketchId = this.getSketchId(); var sketchData = localStorage.getItem(sketchId); var boundary = null; @@ -19,13 +19,21 @@ TCAD.App2D = function() { // layer.objects.push(poly); } else { var sketch = JSON.parse(sketchData); - boundary = sketch.boundary; - var bbox = this.makePolygon(boundary.shell, layer); - for (var i = 0; i < sketch.boundary.holes.length; ++i ) { - this.makePolygon(sketch.boundary.holes[i], layer); - } - this.viewer.showBounds(bbox[0], bbox[1], bbox[2], bbox[3]) } + + if (sketch != null) { + try { + this.loadSketch(sketch); + } catch(e) { + if (typeof(e) === String) { + console.error(e); + } else { + throw e; + } + } + } + + this.viewer.repaint(); var app = this; @@ -56,20 +64,39 @@ TCAD.App2D = function() { }, save : function() { - var sketch = {boundary : boundary}; - - sketch.segments = []; - var params = {}; - for (var i = 0; i < layer.objects.length; ++i) { - var obj = layer.objects[i]; - - if (obj._class === 'TCAD.TWO.Segment') { - params[obj.a._x] - sketch.segments.push([obj.a.x, obj.a.y, obj.b.x, obj.b.y]); + var sketch = {}; + sketch.boundary = boundary; + sketch.layers = []; + sketch.index = {}; + function point(p) { + return [ p.id, [p._x.id, p.x], [p._y.id, p.y] ]; + } + for (var l = 0; l < app.viewer.layers.length; ++l) { + var layer = app.viewer.layers[l]; + var toLayer = []; + sketch.layers.push(toLayer); + for (var i = 0; i < layer.objects.length; ++i) { + var obj = layer.objects[i]; + var to = {id: obj.id, _class: obj._class}; + toLayer.push(to); + if (obj._class === 'TCAD.TWO.Segment') { + to.points = [point(obj.a), point(obj.b)]; + } else if (obj._class === 'TCAD.TWO.Arc') { + } else if (obj._class === 'TCAD.TWO.Circle') { + } } } - sketch.constraints = {} + var constrs = sketch.constraints = []; + var sys = app.viewer.parametricManager.system; + for (var i = 0; i < sys.length; ++i) { + constrs.push(app.serializeConstr(sys[i])); + } + var sketchData = JSON.stringify(sketch); + console.log(sketchData); + + var sketchId = app.getSketchId(); + localStorage.setItem(app.getSketchId(), sketchData); }, @@ -163,6 +190,108 @@ TCAD.App2D = function() { }; +TCAD.App2D.prototype.loadSketch = function(sketch) { + + var boundary = sketch.boundary; + if (boundary != null) { + var bbox = this.makePolygon(boundary.shell, layer); + for (var i = 0; i < sketch.boundary.holes.length; ++i ) { + this.makePolygon(sketch.boundary.holes[i], layer); + } + this.viewer.showBounds(bbox[0], bbox[1], bbox[2], bbox[3]) + } + + var index = {}; + + function createEndPoint(p) { + var id = p[0]; + var ep = new TCAD.TWO.EndPoint(p[1][1], p[2][1]); + index[p[1][0]] = ep._x; + index[p[2][0]] = ep._y; + index[id] = ep; + return ep; + } + + for (var l = 0; l < sketch.layers.length; ++l) { + var layer = new TCAD.TWO.Layer("layer_" + l, TCAD.TWO.Styles.DEFAULT); + this.viewer.layers.push(layer); + for (var i = 0; i < sketch.layers[l].length; ++i) { + var obj = sketch.layers[l][i]; + if (obj._class === 'TCAD.TWO.Segment') { + var a = createEndPoint(obj.points[0]); + var b = createEndPoint(obj.points[1]); + var line = new TCAD.TWO.Segment(a, b); + layer.objects.push(line); + line.layer = layer; + index[obj.id] = line; + } else if (obj._class === 'TCAD.TWO.Arc') { + } else if (obj._class === 'TCAD.TWO.Circle') { + } + } + } + + for (var i = 0; i < sketch.constraints.length; ++i) { + var c = this.parseConstr(sketch.constraints[i], index); + this.viewer.parametricManager.system.push(c); + } +}; + +TCAD.App2D.prototype.parseConstr = function (c, index) { + function find(id) { + var p = index[id]; + if (!p) throw "CAN'T READ SKETCH"; + return p; + } + var name = c[0]; + var ps = c[1]; + switch (name) { + case "equal": + return new TCAD.TWO.Constraints.Equal(find(ps[0]), find(ps[1])); + case "equalsTo": + return new TCAD.TWO.Constraints.EqualsTo(find(ps[0]), ps[1]); + case "perpendicular": + return new TCAD.TWO.Constraints.Perpendicular(find(ps[0]), find(ps[1])); + case "parallel": + return new TCAD.TWO.Constraints.Parallel(find(ps[0]), find(ps[1])); + case "P2LDistance": + return new TCAD.TWO.Constraints.P2LDistance(find(ps[0]), find(ps[1]), ps[2]); + case "P2LDistanceV": + return new TCAD.TWO.Constraints.P2LDistanceV(find(ps[0]), find(ps[1]), find(ps[2])); + case "P2PDistance": + return new TCAD.TWO.Constraints.P2PDistance(find(ps[0]), find(ps[1]), ps[2]); + case "P2PDistanceV": + return new TCAD.TWO.Constraints.P2PDistanceV(find(ps[0]), find(ps[1]), find(ps[2])); + } +}; + +TCAD.App2D.prototype.serializeConstr = function (c) { + switch (c.NAME) { + case "equal": + return ['equal', [c.p1.id, c.p2.id]]; + case "equalsTo": + return ['equalsTo', [c.p.id, c.v]]; + case "perpendicular": + return ['perpendicular', [c.l1.id, c.l2.id]]; + case "parallel": + return ['parallel', [c.l1.id, c.l2.id]]; + case "P2LDistance": + return ['P2LDistance', [c.p.id, c.l.id, c.d]]; + case "P2LDistanceV": + return ['P2LDistanceV', [c.p.id, c.l.id, c.d.get()]]; + case "P2PDistance": + return ['P2PDistance', [c.p1.id, c.p2.id, c.d]]; + case "P2PDistanceV": + return ['P2PDistanceV', [c.p1.id, c.p2.id, c.d.get()]]; + } +}; + +TCAD.App2D.prototype.getSketchId = function() { + var id = window.location.hash.substring(1); + if (!!id) { + id = "untitled"; + } + return "TCAD.projects." + id; +}; TCAD.App2D.prototype.makePolygon = function(points, layer) { var n = points.length; @@ -179,4 +308,4 @@ TCAD.App2D.prototype.makePolygon = function(points, layer) { bounds[3] = Math.max(bounds[3], k*points[q].y); } return bounds; -}; \ No newline at end of file +}; diff --git a/web/app/parametric.js b/web/app/parametric.js index b7b8e3c0..b686fa61 100644 --- a/web/app/parametric.js +++ b/web/app/parametric.js @@ -274,8 +274,10 @@ TCAD.TWO.Constraints.Equal = function(p1, p2) { this.p2 = p2; }; +TCAD.TWO.Constraints.Equal.prototype.NAME = 'equal'; + TCAD.TWO.Constraints.Equal.prototype.getSolveData = function() { - return ['equal', [this.p1, this.p2], []]; + return [this.NAME, [this.p1, this.p2], []]; }; TCAD.TWO.Constraints.EqualsTo = function(p, v) { @@ -283,8 +285,10 @@ TCAD.TWO.Constraints.EqualsTo = function(p, v) { this.v = v; }; +TCAD.TWO.Constraints.EqualsTo.prototype.NAME = 'equalsTo'; + TCAD.TWO.Constraints.EqualsTo.prototype.getSolveData = function() { - return ['equalsTo', [this.p], [this.v]]; + return [this.NAME, [this.p], [this.v]]; }; TCAD.TWO.Constraints.Parallel = function(l1, l2) { @@ -292,11 +296,13 @@ TCAD.TWO.Constraints.Parallel = function(l1, l2) { this.l2 = l2; }; +TCAD.TWO.Constraints.Parallel.prototype.NAME = 'parallel'; + TCAD.TWO.Constraints.Parallel.prototype.getSolveData = function() { var params = []; this.l1.collectParams(params); this.l2.collectParams(params); - return ['parallel', params, []]; + return [this.NAME, params, []]; }; TCAD.TWO.Constraints.Perpendicular = function(l1, l2) { @@ -304,11 +310,13 @@ TCAD.TWO.Constraints.Perpendicular = function(l1, l2) { this.l2 = l2; }; +TCAD.TWO.Constraints.Perpendicular.prototype.NAME = 'perpendicular'; + TCAD.TWO.Constraints.Perpendicular.prototype.getSolveData = function() { var params = []; this.l1.collectParams(params); this.l2.collectParams(params); - return ['perpendicular', params, []]; + return [this.NAME, params, []]; }; TCAD.TWO.Constraints.P2LDistance = function(p, l, d) { @@ -317,11 +325,13 @@ TCAD.TWO.Constraints.P2LDistance = function(p, l, d) { this.d = d; }; +TCAD.TWO.Constraints.P2LDistance.prototype.NAME = 'P2LDistance'; + TCAD.TWO.Constraints.P2LDistance.prototype.getSolveData = function() { var params = []; this.p.collectParams(params); this.l.collectParams(params); - return ['P2LDistance', params, [this.d]]; + return [this.NAME, params, [this.d]]; }; @@ -331,12 +341,14 @@ TCAD.TWO.Constraints.P2LDistanceV = function(p, l, d) { this.d = d; }; +TCAD.TWO.Constraints.P2LDistanceV.prototype.NAME = 'P2LDistanceV'; + TCAD.TWO.Constraints.P2LDistanceV.prototype.getSolveData = function() { var params = []; this.p.collectParams(params); this.l.collectParams(params); params.push(this.d); - return ['P2LDistanceV', params]; + return [this.NAME, params]; }; @@ -346,11 +358,13 @@ TCAD.TWO.Constraints.P2PDistance = function(p1, p2, d) { this.d = d; }; +TCAD.TWO.Constraints.P2PDistance.prototype.NAME = 'P2PDistance'; + TCAD.TWO.Constraints.P2PDistance.prototype.getSolveData = function() { var params = []; this.p1.collectParams(params); this.p2.collectParams(params); - return ['P2PDistance', params, [this.d]]; + return [this.NAME, params, [this.d]]; }; TCAD.TWO.Constraints.P2PDistanceV = function(p1, p2, d) { @@ -359,10 +373,12 @@ TCAD.TWO.Constraints.P2PDistanceV = function(p1, p2, d) { this.d = d; }; +TCAD.TWO.Constraints.P2PDistanceV.prototype.NAME = 'P2PDistanceV'; + TCAD.TWO.Constraints.P2PDistanceV.prototype.getSolveData = function() { var params = []; this.p1.collectParams(params); this.p2.collectParams(params); params.push(this.d); - return ['P2PDistanceV', params]; + return [this.NAME, params]; }; \ No newline at end of file