diff --git a/web/app/sketcher/canvas.js b/web/app/sketcher/canvas.js index c469dbad..193d2faf 100644 --- a/web/app/sketcher/canvas.js +++ b/web/app/sketcher/canvas.js @@ -61,6 +61,8 @@ TCAD.TWO.utils.setStyle = function(style, ctx, scale) { TCAD.TWO.Viewer = function(canvas) { this.canvas = canvas; + this.io = new TCAD.IO(this); + this.historyManager = new TCAD.HistoryManager(this); var viewer = this; function updateCanvasSize() { canvas.width = canvas.parentNode.offsetWidth; @@ -346,6 +348,11 @@ TCAD.TWO.Layer = function(name, style) { this.objects = []; }; +TCAD.TWO.Viewer.prototype.fullHeavyUIRefresh = function() { + this.refresh(); + this.parametricManager.notify(); +}; + TCAD.TWO.Polygon = function(points) { this.points = points; this.style = null; @@ -684,8 +691,8 @@ TCAD.TWO.ToolManager.prototype.getTool = function() { TCAD.TWO.PanTool = function(viewer) { this.viewer = viewer; this.dragging = false; - this.x = 0.0; - this.y = 0.0; + this.originX = this.x = 0.0; + this.originY = this.y = 0.0; }; TCAD.TWO.PanTool.prototype.keydown = function(e) {}; @@ -732,8 +739,8 @@ TCAD.TWO.PanTool.prototype.mousedown = function(e) { this.dragging = true; this.deselectOnUp = true; - this.x = e.pageX; - this.y = e.pageY; + this.originX = this.x = e.pageX; + this.originY = this.y = e.pageY; }; TCAD.TWO.PanTool.prototype.mouseup = function(e) { @@ -743,6 +750,10 @@ TCAD.TWO.PanTool.prototype.mouseup = function(e) { this.viewer.refresh(); } this.deselectOnUp = false; + var traveled = TCAD.math.distance(this.originX, this.x, this.originY, this.y); + if (traveled > 10) { + this.viewer.historyManager.lightCheckpoint(10); + } }; TCAD.TWO.PanTool.prototype.mousewheel = function(e) { diff --git a/web/app/sketcher/history.js b/web/app/sketcher/history.js new file mode 100644 index 00000000..909fd09c --- /dev/null +++ b/web/app/sketcher/history.js @@ -0,0 +1,117 @@ +TCAD.HistoryManager = function(viewer) { + this.viewer = viewer; + this.dmp = new diff_match_patch(); + this.historyPointer = -1; + this.diffs = []; + this._counter = 0; +}; + + +TCAD.HistoryManager.prototype.init = function(sketchData) { + this.lastCheckpoint = sketchData; + this.diffs = []; + this.historyPointer = -1; +}; + +TCAD.HistoryManager.prototype.undo = function () { + console.log("Undo " + this.diffs.length); + var currentState = this.viewer.io.serializeSketch(); + if (currentState == this.lastCheckpoint) { + if (this.historyPointer != -1) { + var diff = this.diffs[this.historyPointer]; + this.lastCheckpoint = this.applyDiff(this.lastCheckpoint, diff); + this.viewer.io.loadSketch(this.lastCheckpoint); + this.viewer.fullHeavyUIRefresh(); + this.historyPointer --; + } + } else { + var diffToCurr = this.getDiff(currentState, this.lastCheckpoint); + if (this.historyPointer != this.diffs.length - 1) { + this.diffs.splice(this.historyPointer + 1, this.diffs.length - this.historyPointer + 1) + } + this.diffs.push(diffToCurr); + this.viewer.io.loadSketch(this.lastCheckpoint); + this.viewer.fullHeavyUIRefresh(); + } +}; + +TCAD.HistoryManager.prototype.lightCheckpoint = function (weight) { + this._counter += weight; + if (this._counter >= 100) { + this.checkpoint(); + } +}; + +TCAD.HistoryManager.prototype.checkpoint = function () { + try { + this._checkpoint(); + } catch(e) { + console.log(e); + } +}; + +TCAD.HistoryManager.prototype._checkpoint = function () { + this._counter = 0; + var currentState = this.viewer.io.serializeSketch(); + if (currentState == this.lastCheckpoint) { + return; + } + var diffToCurr = this.getDiff(currentState, this.lastCheckpoint); + if (this.historyPointer != this.diffs.length - 1) { + this.diffs.splice(this.historyPointer + 1, this.diffs.length - this.historyPointer + 1) + } + this.diffs.push(diffToCurr); + this.historyPointer = this.diffs.length - 1; + this.lastCheckpoint = currentState; +}; + +TCAD.HistoryManager.prototype.redo = function () { + var currentState = this.viewer.io.serializeSketch(); + if (currentState != this.lastCheckpoint) { + return; + } + if (this.historyPointer != this.diffs.length - 1 && this.diffs.length != 0) { + this.historyPointer ++; + var diff = this.diffs[this.historyPointer]; + this.lastCheckpoint = this.applyDiffInv(this.lastCheckpoint, diff); + this.viewer.io.loadSketch(this.lastCheckpoint); + this.viewer.fullHeavyUIRefresh(); + } +}; + +TCAD.HistoryManager.prototype.applyDiff = function (text1, diff) { + var dmp = this.dmp; + var results = dmp.patch_apply(diff, text1); + return results[0]; +}; + +TCAD.HistoryManager.prototype.applyDiffInv = function (text1, diff) { + this.reversePatch(diff); + var result = this.applyDiff(text1, diff); + this.reversePatch(diff); + return result; +}; + +TCAD.HistoryManager.prototype.reversePatch = function (plist) { + for (var i = 0; i < plist.length; i++) { + var patch = plist[i]; + for (var j = 0; j < patch.diffs.length; j++) { + var diff = patch.diffs[j]; + diff[0] *= -1; + } + } +}; + +TCAD.HistoryManager.prototype.getDiff = function (text1, text2) { + var dmp = this.dmp; + var diff = dmp.diff_main(text1, text2, true); + + if (diff.length > 2) { + dmp.diff_cleanupSemantic(diff); + } + + var patch_list = dmp.patch_make(text1, text2, diff); + //var patch_text = dmp.patch_toText(patch_list); + //console.log(patch_list); + return patch_list; +}; diff --git a/web/app/sketcher/io.js b/web/app/sketcher/io.js new file mode 100644 index 00000000..3e520a11 --- /dev/null +++ b/web/app/sketcher/io.js @@ -0,0 +1,208 @@ +TCAD.IO = function(viewer) { + this.viewer = viewer; +}; + +TCAD.IO.prototype.loadSketch = function(sketchData) { + return this._loadSketch(JSON.parse(sketchData)); +}; + +TCAD.IO.prototype.serializeSketch = function() { + return JSON.stringify(this._serializeSketch()); +}; + +TCAD.IO.prototype._loadSketch = function(sketch) { + + this.cleanUpData(); + + var index = {}; + + function endPoint(p) { + var id = p[0]; + var ep = index[id]; + if (ep !== undefined) { + return + } + 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; + } + + var layerIdGen = 0; + function getLayer(viewer, name) { + if (name === undefined) { + name = "layer_" + layerIdGen++; + } else { + if (name === viewer.dimLayer.name) { + return viewer.dimLayer; + } + for (var i = 0; i < viewer.layers.length; ++i) { + if (name === viewer.layers[i].name) { + return viewer.layers[i]; + } + } + } + var layer = new TCAD.TWO.Layer(name, TCAD.TWO.Styles.DEFAULT); + viewer.layers.push(layer); + return layer; + } + var activeLayerCandidate = this.viewer.layers.length; + if (sketch.layers !== undefined) { + for (var l = 0; l < sketch.layers.length; ++l) { + var layer = getLayer(this.viewer, sketch.layers[l].name); + for (var i = 0; i < sketch.layers[l].data.length; ++i) { + var obj = sketch.layers[l].data[i]; + var skobj = null; + if (obj._class === 'TCAD.TWO.Segment') { + var a = endPoint(obj.points[0]); + var b = endPoint(obj.points[1]); + skobj = new TCAD.TWO.Segment(a, b); + } else if (obj._class === 'TCAD.TWO.EndPoint') { + skobj = endPoint(obj.location); + } else if (obj._class === 'TCAD.TWO.Arc') { + var a = endPoint(obj.points[0]); + var b = endPoint(obj.points[1]); + var c = endPoint(obj.points[2]); + skobj = new TCAD.TWO.Arc(a, b, c); + skobj.stabilize(this.viewer); + } else if (obj._class === 'TCAD.TWO.Circle') { + var c = endPoint(obj.c); + skobj = new TCAD.TWO.Circle(c); + skobj.r.set(obj.r); + } else if (obj._class === 'TCAD.TWO.HDimension') { + skobj = new TCAD.TWO.HDimension(obj.a, obj.b); + skobj.flip = obj.flip; + } else if (obj._class === 'TCAD.TWO.VDimension') { + skobj = new TCAD.TWO.VDimension(obj.a, obj.b); + skobj.flip = obj.flip; + } else if (obj._class === 'TCAD.TWO.Dimension') { + skobj = new TCAD.TWO.Dimension(obj.a, obj.b); + skobj.flip = obj.flip; + } + if (skobj != null) { + if (!!obj.aux) skobj.accept(function(o){o.aux = true; return true;}); + if (obj.edge !== undefined) { + skobj.edge = obj.edge; + } + layer.objects.push(skobj); + skobj.layer = layer; + index[obj.id] = skobj; + } + } + } + } + + for (i = 0; i < this.viewer.dimLayer.objects.length; ++i) { + obj = this.viewer.dimLayer.objects[i]; + //if (obj._class === 'TCAD.TWO.Dimension' || obj._class === 'TCAD.TWO.HDimension' || obj._class === 'TCAD.TWO.VDimension') { + obj.a = index[obj.a]; + obj.b = index[obj.b]; + //} + } + + if (sketch.boundary !== undefined && sketch.boundary != null) { + this.updateBoundary(sketch.boundary); + } + + if (sketch.constraints !== undefined) { + for (var i = 0; i < sketch.constraints.length; ++i) { + var c = this.parseConstr(sketch.constraints[i], index); + this.viewer.parametricManager._add(c); + } + this.viewer.parametricManager.notify(); + } + if (activeLayerCandidate < this.viewer.layers.length) { + this.viewer.setActiveLayer(this.viewer.layers[activeLayerCandidate]); + } +}; + +TCAD.IO.prototype.cleanUpData = function() { + for (var l = 0; l < this.viewer.layers.length; ++l) { + var layer = this.viewer.layers[l]; + if (layer.objects.length != 0) { + layer.objects = []; + } + } + this.viewer.deselectAll(); + TCAD.TWO.utils.ID_COUNTER = 0; + if (this.viewer.parametricManager.subSystems.length != 0) { + this.viewer.parametricManager.subSystems = []; + this.viewer.parametricManager.notify(); + } +}; + +TCAD.IO.prototype._serializeSketch = function() { + var sketch = {}; + //sketch.boundary = boundary; + sketch.layers = []; + function point(p) { + return [ p.id, [p._x.id, p.x], [p._y.id, p.y] ]; + } + var toSave = [this.viewer.dimLayers, this.viewer.layers]; + for (var t = 0; t < toSave.length; ++t) { + var layers = toSave[t]; + for (var l = 0; l < layers.length; ++l) { + var layer = layers[l]; + var isBoundary = layer.name === ''; + var toLayer = {name : layer.name, data : []}; + 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}; + if (obj.aux) to.aux = obj.aux; + if (obj.edge !== undefined) to.edge = obj.edge; + toLayer.data.push(to); + if (obj._class === 'TCAD.TWO.Segment') { + to.points = [point(obj.a), point(obj.b)]; + } else if (obj._class === 'TCAD.TWO.EndPoint') { + to.location = point(obj); + } else if (obj._class === 'TCAD.TWO.Arc') { + to.points = [point(obj.a), point(obj.b), point(obj.c)]; + } else if (obj._class === 'TCAD.TWO.Circle') { + to.c = point(obj.c); + to.r = obj.r.get(); + } else if (obj._class === 'TCAD.TWO.Dimension' || obj._class === 'TCAD.TWO.HDimension' || obj._class === 'TCAD.TWO.VDimension') { + to.a = obj.a.id; + to.b = obj.b.id; + to.flip = obj.flip; + } + } + } + } + + var constrs = sketch.constraints = []; + var subSystems = this.viewer.parametricManager.subSystems; + for (var j = 0; j < subSystems.length; j++) { + var sub = subSystems[j]; + for (var i = 0; i < sub.constraints.length; ++i) { + if (!sub.constraints[i].aux) { + constrs.push(this.serializeConstr(sub.constraints[i])); + } + } + + } + return sketch; +}; + +TCAD.IO.prototype.parseConstr = function (c, index) { + function find(id) { + var p = index[id]; + if (!p) { + throw "CAN'T READ SKETCH. Object ref is not found."; + } + return p; + } + var name = c[0]; + var ps = c[1]; + var constrCreate = TCAD.TWO.Constraints.Factory[name]; + if (constrCreate === undefined) { + throw "CAN'T READ SKETCH. Constraint " + name + " hasn't been registered."; + } + return constrCreate(find, ps); +}; + +TCAD.IO.prototype.serializeConstr = function (c) { + return c.serialize(); +}; + diff --git a/web/app/sketcher/main2d.js b/web/app/sketcher/main2d.js index 0e6445de..ef563749 100644 --- a/web/app/sketcher/main2d.js +++ b/web/app/sketcher/main2d.js @@ -6,10 +6,6 @@ TCAD.App2D = function() { this.viewer = new TCAD.TWO.Viewer(document.getElementById('viewer')); this.boundaryLayer = new TCAD.TWO.Layer("default", TCAD.TWO.Styles.DEFAULT); this.viewer.layers.push(this.boundaryLayer); - this.dmp = new diff_match_patch(); - this.historyPointer = -1; - this.diffs = []; - var app = this; this.actions = {}; @@ -23,15 +19,15 @@ TCAD.App2D = function() { }; this.registerAction('undo', "Undo", function () { - app.undo(); + app.viewer.historyManager.undo(); }); this.registerAction('redo', "Redo", function () { - app.redo(); + app.viewer.historyManager.redo(); }); this.registerAction('checkpoint', "Checkpoint", function () { - app.checkpoint(); + app.viewer.historyManager.checkpoint(); }); this.registerAction('addPoint', "Add Point", function () { @@ -74,7 +70,7 @@ TCAD.App2D = function() { }); this.registerAction('save', "Save", function () { - var sketchData = app.saveSketch(); + var sketchData = app.viewer.io.serializeSketch(); console.log(sketchData); var sketchId = app.getSketchId(); localStorage.setItem(app.getSketchId(), sketchData); @@ -138,7 +134,7 @@ TCAD.App2D = function() { }); this.registerAction('CLEAN UP', "Clean All Draw", function () { - app.cleanUp(); + app.cleanUpData(); app.viewer.refresh(); }); }; @@ -146,193 +142,13 @@ TCAD.App2D = function() { TCAD.App2D.prototype.loadFromLocalStorage = function() { var sketchId = this.getSketchId(); var sketchData = localStorage.getItem(sketchId); - var boundary = null; if (sketchData != null) { - this.lastCheckpoint = sketchData; - this.diffs = []; - this.historyPointer = -1; - - var sketch = JSON.parse(sketchData); - boundary = this.loadSketch(sketch); + this.viewer.historyManager.init(sketchData); + this.viewer.io.loadSketch(sketchData); } this.viewer.repaint(); }; -TCAD.App2D.prototype.cleanUp = function() { - for (var l = 0; l < this.viewer.layers.length; ++l) { - var layer = this.viewer.layers[l]; - if (layer.objects.length != 0) { - layer.objects = []; - } - } - this.viewer.deselectAll(); - TCAD.TWO.utils.ID_COUNTER = 0; - if (this.viewer.parametricManager.subSystems.length != 0) { - this.viewer.parametricManager.subSystems = []; - this.viewer.parametricManager.notify(); - } -}; - -TCAD.App2D.prototype.saveSketch = function() { - var sketch = {}; - //sketch.boundary = boundary; - sketch.layers = []; - function point(p) { - return [ p.id, [p._x.id, p.x], [p._y.id, p.y] ]; - } - var toSave = [this.viewer.dimLayers, this.viewer.layers] - for (var t = 0; t < toSave.length; ++t) { - var layers = toSave[t]; - for (var l = 0; l < layers.length; ++l) { - var layer = layers[l]; - var isBoundary = layer.name === ''; - var toLayer = {name : layer.name, data : []}; - 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}; - if (obj.aux) to.aux = obj.aux; - if (obj.edge !== undefined) to.edge = obj.edge; - toLayer.data.push(to); - if (obj._class === 'TCAD.TWO.Segment') { - to.points = [point(obj.a), point(obj.b)]; - } else if (obj._class === 'TCAD.TWO.EndPoint') { - to.location = point(obj); - } else if (obj._class === 'TCAD.TWO.Arc') { - to.points = [point(obj.a), point(obj.b), point(obj.c)]; - } else if (obj._class === 'TCAD.TWO.Circle') { - to.c = point(obj.c); - to.r = obj.r.get(); - } else if (obj._class === 'TCAD.TWO.Dimension' || obj._class === 'TCAD.TWO.HDimension' || obj._class === 'TCAD.TWO.VDimension') { - to.a = obj.a.id; - to.b = obj.b.id; - to.flip = obj.flip; - } - } - } - } - - var constrs = sketch.constraints = []; - var subSystems = this.viewer.parametricManager.subSystems; - for (var j = 0; j < subSystems.length; j++) { - var sub = subSystems[j]; - for (var i = 0; i < sub.constraints.length; ++i) { - if (!sub.constraints[i].aux) { - constrs.push(this.serializeConstr(sub.constraints[i])); - } - } - - } - return JSON.stringify(sketch); -}; - -TCAD.App2D.prototype.loadSketch = function(sketch) { - - this.cleanUp(); - - var index = {}; - - function endPoint(p) { - var id = p[0]; - var ep = index[id]; - if (ep !== undefined) { - return - } - 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; - } - - var layerIdGen = 0; - function getLayer(viewer, name) { - if (name === undefined) { - name = "layer_" + layerIdGen++; - } else { - if (name === viewer.dimLayer.name) { - return viewer.dimLayer; - } - for (var i = 0; i < viewer.layers.length; ++i) { - if (name === viewer.layers[i].name) { - return viewer.layers[i]; - } - } - } - var layer = new TCAD.TWO.Layer(name, TCAD.TWO.Styles.DEFAULT); - viewer.layers.push(layer); - return layer; - } - var activeLayerCandidate = this.viewer.layers.length; - if (sketch.layers !== undefined) { - for (var l = 0; l < sketch.layers.length; ++l) { - var layer = getLayer(this.viewer, sketch.layers[l].name); - for (var i = 0; i < sketch.layers[l].data.length; ++i) { - var obj = sketch.layers[l].data[i]; - var skobj = null; - if (obj._class === 'TCAD.TWO.Segment') { - var a = endPoint(obj.points[0]); - var b = endPoint(obj.points[1]); - skobj = new TCAD.TWO.Segment(a, b); - } else if (obj._class === 'TCAD.TWO.EndPoint') { - skobj = endPoint(obj.location); - } else if (obj._class === 'TCAD.TWO.Arc') { - var a = endPoint(obj.points[0]); - var b = endPoint(obj.points[1]); - var c = endPoint(obj.points[2]); - skobj = new TCAD.TWO.Arc(a, b, c); - skobj.stabilize(this.viewer); - } else if (obj._class === 'TCAD.TWO.Circle') { - var c = endPoint(obj.c); - skobj = new TCAD.TWO.Circle(c); - skobj.r.set(obj.r); - } else if (obj._class === 'TCAD.TWO.HDimension') { - skobj = new TCAD.TWO.HDimension(obj.a, obj.b); - skobj.flip = obj.flip; - } else if (obj._class === 'TCAD.TWO.VDimension') { - skobj = new TCAD.TWO.VDimension(obj.a, obj.b); - skobj.flip = obj.flip; - } else if (obj._class === 'TCAD.TWO.Dimension') { - skobj = new TCAD.TWO.Dimension(obj.a, obj.b); - skobj.flip = obj.flip; - } - if (skobj != null) { - if (!!obj.aux) skobj.accept(function(o){o.aux = true; return true;}); - if (obj.edge !== undefined) { - skobj.edge = obj.edge; - } - layer.objects.push(skobj); - skobj.layer = layer; - index[obj.id] = skobj; - } - } - } - } - - for (i = 0; i < this.viewer.dimLayer.objects.length; ++i) { - obj = this.viewer.dimLayer.objects[i]; - //if (obj._class === 'TCAD.TWO.Dimension' || obj._class === 'TCAD.TWO.HDimension' || obj._class === 'TCAD.TWO.VDimension') { - obj.a = index[obj.a]; - obj.b = index[obj.b]; - //} - } - - if (sketch.boundary !== undefined && sketch.boundary != null) { - this.updateBoundary(sketch.boundary); - } - - if (sketch.constraints !== undefined) { - for (var i = 0; i < sketch.constraints.length; ++i) { - var c = this.parseConstr(sketch.constraints[i], index); - this.viewer.parametricManager._add(c); - } - this.viewer.parametricManager.notify(); - } - if (activeLayerCandidate < this.viewer.layers.length) { - this.viewer.setActiveLayer(this.viewer.layers[activeLayerCandidate]); - } -}; - TCAD.App2D.prototype.updateBoundary = function (boundary) { var edges = []; @@ -382,27 +198,6 @@ TCAD.App2D.prototype.updateBoundary = function (boundary) { } }; -TCAD.App2D.prototype.parseConstr = function (c, index) { - function find(id) { - var p = index[id]; - if (!p) { - throw "CAN'T READ SKETCH. Object ref is not found."; - } - return p; - } - var name = c[0]; - var ps = c[1]; - var constrCreate = TCAD.TWO.Constraints.Factory[name]; - if (constrCreate === undefined) { - throw "CAN'T READ SKETCH. Constraint " + name + " hasn't been registered."; - } - return constrCreate(find, ps); -}; - -TCAD.App2D.prototype.serializeConstr = function (c) { - return c.serialize(); -}; - TCAD.App2D.prototype.getSketchId = function() { var id = window.location.hash.substring(1); if (!id) { @@ -410,91 +205,3 @@ TCAD.App2D.prototype.getSketchId = function() { } return "TCAD.projects." + id; }; - -TCAD.App2D.prototype.undo = function () { - var currentState = this.saveSketch(); - if (currentState == this.lastCheckpoint) { - if (this.historyPointer != -1) { - var diff = this.diffs[this.historyPointer]; - this.lastCheckpoint = this.applyDiff(this.lastCheckpoint, diff); - this.loadSketch(JSON.parse(this.lastCheckpoint)); - this.viewer.refresh(); - console.log(this.lastCheckpoint); - this.historyPointer --; - } - } else { - var diffToCurr = this.getDiff(currentState, this.lastCheckpoint); - if (this.historyPointer != this.diffs.length - 1) { - this.diffs.splice(this.historyPointer + 1, this.diffs.length - this.historyPointer + 1) - } - this.diffs.push(diffToCurr); - this.loadSketch(JSON.parse(this.lastCheckpoint)); - this.viewer.refresh(); - } -}; - -TCAD.App2D.prototype.checkpoint = function () { - var currentState = this.saveSketch(); - if (currentState == this.lastCheckpoint) { - return; - } - var diffToCurr = this.getDiff(currentState, this.lastCheckpoint); - if (this.historyPointer != this.diffs.length - 1) { - this.diffs.splice(this.historyPointer + 1, this.diffs.length - this.historyPointer + 1) - } - this.diffs.push(diffToCurr); - this.historyPointer = this.diffs.length - 1; - this.lastCheckpoint = currentState; -}; - -TCAD.App2D.prototype.redo = function () { - var currentState = this.saveSketch(); - if (currentState != this.lastCheckpoint) { - return; - } - if (this.historyPointer != this.diffs.length - 1 && this.diffs.length != 0) { - this.historyPointer ++; - var diff = this.diffs[this.historyPointer]; - this.lastCheckpoint = this.applyDiffInv(this.lastCheckpoint, diff); - console.log(this.lastCheckpoint); - this.loadSketch(JSON.parse(this.lastCheckpoint)); - this.viewer.refresh(); - } -}; - -TCAD.App2D.prototype.applyDiff = function (text1, diff) { - var dmp = this.dmp; - var results = dmp.patch_apply(diff, text1); - return results[0]; -}; - -TCAD.App2D.prototype.applyDiffInv = function (text1, diff) { - this.reversePatch(diff); - var result = this.applyDiff(text1, diff); - this.reversePatch(diff); - return result; -}; - -TCAD.App2D.prototype.reversePatch = function (plist) { - for (var i = 0; i < plist.length; i++) { - var patch = plist[i]; - for (var j = 0; j < patch.diffs.length; j++) { - var diff = patch.diffs[j]; - diff[0] *= -1; - } - } -}; - -TCAD.App2D.prototype.getDiff = function (text1, text2) { - var dmp = this.dmp; - var diff = dmp.diff_main(text1, text2, true); - - if (diff.length > 2) { - dmp.diff_cleanupSemantic(diff); - } - - var patch_list = dmp.patch_make(text1, text2, diff); - //var patch_text = dmp.patch_toText(patch_list); - //console.log(patch_list); - return patch_list; -}; diff --git a/web/app/sketcher/parametric.js b/web/app/sketcher/parametric.js index bc463891..d5e862fd 100644 --- a/web/app/sketcher/parametric.js +++ b/web/app/sketcher/parametric.js @@ -71,6 +71,7 @@ TCAD.TWO.ParametricManager.prototype.refresh = function() { TCAD.TWO.ParametricManager.prototype.add = function(constr) { this._add(constr); + this.viewer.historyManager.checkpoint(); this.refresh(); }; diff --git a/web/app/sketcher/shapes/arc.js b/web/app/sketcher/shapes/arc.js index dd4682c1..1aced757 100644 --- a/web/app/sketcher/shapes/arc.js +++ b/web/app/sketcher/shapes/arc.js @@ -123,6 +123,7 @@ TCAD.TWO.AddArcTool.prototype.mousemove = function(e) { TCAD.TWO.AddArcTool.prototype.mouseup = function(e) { if (this.arc == null) { + this.viewer.historyManager.checkpoint(); var p = this.viewer.screenToModel(e); this.arc = new TCAD.TWO.Arc( new TCAD.TWO.EndPoint(p.x, p.y), diff --git a/web/app/sketcher/shapes/circle.js b/web/app/sketcher/shapes/circle.js index 3c2d4d67..7fa4f7b0 100644 --- a/web/app/sketcher/shapes/circle.js +++ b/web/app/sketcher/shapes/circle.js @@ -71,6 +71,7 @@ TCAD.TWO.EditCircleTool.prototype.solveRequest = function(rough) { TCAD.TWO.EditCircleTool.prototype.mouseup = function(e) { if (this.circle == null) { + this.viewer.historyManager.checkpoint(); var p = this.viewer.screenToModel(e); this.circle = new TCAD.TWO.Circle( new TCAD.TWO.EndPoint(p.x, p.y) diff --git a/web/app/sketcher/shapes/dim.js b/web/app/sketcher/shapes/dim.js index 06a8f536..bcb14702 100644 --- a/web/app/sketcher/shapes/dim.js +++ b/web/app/sketcher/shapes/dim.js @@ -181,6 +181,7 @@ TCAD.TWO.AddDimTool.prototype.mouseup = function(e) { this.viewer.cleanSnap(); if (this.dim == null) { + this.viewer.historyManager.checkpoint(); this.dim = this.dimCreation(p, new TCAD.TWO.EndPoint(p.x, p.y)); this.layer.objects.push(this.dim); this.viewer.refresh(); diff --git a/web/app/sketcher/shapes/segment.js b/web/app/sketcher/shapes/segment.js index 16cc2023..1c64284b 100644 --- a/web/app/sketcher/shapes/segment.js +++ b/web/app/sketcher/shapes/segment.js @@ -90,6 +90,7 @@ TCAD.TWO.AddPointTool.prototype.mousedown = function(e) { }; TCAD.TWO.AddPointTool.prototype.mouseup = function(e) { + this.viewer.historyManager.checkpoint(); var a = this.viewer.screenToModel(e); var p = new TCAD.TWO.EndPoint(a.x, a.y); var layer = this.viewer.activeLayer(); diff --git a/web/app/test/suite.js b/web/app/test/suite.js index cf84de6b..2b9ce4a0 100644 --- a/web/app/test/suite.js +++ b/web/app/test/suite.js @@ -16,7 +16,7 @@ TCAD.test.runSuite = function() { }; _loadFixture = function(name) { - APP.loadSketch(TCAD.test.fixtures[name]); + APP._loadSketch(TCAD.test.fixtures[name]); }; _loadFixturesToLocalStorage = function() { diff --git a/web/sketcher.html b/web/sketcher.html index 4de2d09a..09907c02 100644 --- a/web/sketcher.html +++ b/web/sketcher.html @@ -186,6 +186,8 @@ + +