mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-12 11:25:04 +01:00
first approach to saving
This commit is contained in:
parent
d49f72a3ed
commit
3ef1f743c2
2 changed files with 172 additions and 27 deletions
|
|
@ -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;
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
};
|
||||
Loading…
Reference in a new issue