diff --git a/web/app/sketcher/canvas.js b/web/app/sketcher/canvas.js index 68226188..c469dbad 100644 --- a/web/app/sketcher/canvas.js +++ b/web/app/sketcher/canvas.js @@ -74,9 +74,12 @@ TCAD.TWO.Viewer = function(canvas) { window.addEventListener( 'resize', onWindowResize, false ); this.ctx = this.canvas.getContext("2d"); + this._activeLayer = null; this.layers = []; this._serviceLayers = []; - this._workspace = [this.layers, this._serviceLayers]; + this.dimLayer = new TCAD.TWO.Layer("_dim", TCAD.TWO.Styles.DIM); + this.dimLayers = [this.dimLayer]; + this._workspace = [this.dimLayers, this.layers, this._serviceLayers]; this.toolManager = new TCAD.TWO.ToolManager(this, new TCAD.TWO.PanTool(this)); this.parametricManager = new TCAD.TWO.ParametricManager(this); @@ -87,8 +90,6 @@ TCAD.TWO.Viewer = function(canvas) { this.snapped = []; this._setupServiceLayer(); - this.dimLayer = new TCAD.TWO.Layer("_dim", TCAD.TWO.Styles.DIM); - this.layers.push(this.dimLayer); this.refresh(); }; @@ -317,6 +318,21 @@ TCAD.TWO.Viewer.prototype.mark = function(obj, style) { this.selected.push(obj); }; +TCAD.TWO.Viewer.prototype.activeLayer = function() { + var layer = this._activeLayer; + if (layer == null) { + if (this.layers.length == 0) { + this.layers.push(new TCAD.TWO.Layer("JustALayer", TCAD.TWO.Styles.DEFAULT)); + } + layer = this.layers[0]; + } + return layer; +}; + +TCAD.TWO.Viewer.prototype.setActiveLayer = function(layer) { + this._activeLayer = layer; +}; + TCAD.TWO.Viewer.prototype.deselectAll = function() { for (var i = 0; i < this.selected.length; i++) { this.selected[i].marked = null; diff --git a/web/app/sketcher/main2d.js b/web/app/sketcher/main2d.js index bc270eb7..0729a02d 100644 --- a/web/app/sketcher/main2d.js +++ b/web/app/sketcher/main2d.js @@ -6,7 +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); - var app = this; this.actions = {}; @@ -17,26 +16,26 @@ TCAD.App2D = function() { this.registerAction = function(id, desc, action) { app.actions[id] = {id: id, desc: desc, action: action}; app._actionsOrder.push(id); - } + }; this.registerAction('addPoint', "Add Point", function () { - app.viewer.toolManager.takeControl(new TCAD.TWO.AddPointTool(app.viewer, layer)); + app.viewer.toolManager.takeControl(new TCAD.TWO.AddPointTool(app.viewer)); }); this.registerAction('addSegment', "Add Segment", function () { - app.viewer.toolManager.takeControl(new TCAD.TWO.AddSegmentTool(app.viewer, layer, false)); + app.viewer.toolManager.takeControl(new TCAD.TWO.AddSegmentTool(app.viewer, false)); }); this.registerAction('addMultiSegment', "Add Multi Segment", function () { - app.viewer.toolManager.takeControl(new TCAD.TWO.AddSegmentTool(app.viewer, layer, true)); + app.viewer.toolManager.takeControl(new TCAD.TWO.AddSegmentTool(app.viewer, true)); }); this.registerAction('addArc', "Add Arc", function () { - app.viewer.toolManager.takeControl(new TCAD.TWO.AddArcTool(app.viewer, layer)); + app.viewer.toolManager.takeControl(new TCAD.TWO.AddArcTool(app.viewer)); }); this.registerAction('addCircle', "Add Circle", function () { - app.viewer.toolManager.takeControl(new TCAD.TWO.EditCircleTool(app.viewer, layer)); + app.viewer.toolManager.takeControl(new TCAD.TWO.EditCircleTool(app.viewer)); }); this.registerAction('pan', "Pan", function () { @@ -61,28 +60,32 @@ TCAD.App2D = function() { 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 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.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 toSave = [app.viewer.dimLayers, app.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.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; + } } } } @@ -209,19 +212,23 @@ TCAD.App2D.prototype.loadSketch = function(sketch) { var layerIdGen = 0; function getLayer(viewer, name) { - for (var i = 0; i < viewer.layers.length; ++i) { - if (name === viewer.layers[i].name) { - return viewer.layers[i]; - } - } 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); @@ -264,17 +271,14 @@ TCAD.App2D.prototype.loadSketch = function(sketch) { } } } - - for (l = 0; l < this.viewer.layers.length; ++l) { - layer = this.viewer.layers[l]; - for (i = 0; i < layer.objects.length; ++i) { - obj = layer.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]; - } - } - } + + 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); @@ -287,6 +291,9 @@ TCAD.App2D.prototype.loadSketch = function(sketch) { } this.viewer.parametricManager.notify(); } + if (activeLayerCandidate < this.viewer.layers.length) { + this.viewer.setActiveLayer(this.viewer.layers[activeLayerCandidate]); + } }; TCAD.App2D.prototype.updateBoundary = function (boundary) { diff --git a/web/app/sketcher/parametric.js b/web/app/sketcher/parametric.js index 97c3cfc2..06208118 100644 --- a/web/app/sketcher/parametric.js +++ b/web/app/sketcher/parametric.js @@ -53,6 +53,14 @@ TCAD.TWO.ParametricManager.prototype._add = function(constr) { break; } subSystem.constraints.push(constr); + this.checkRedundancy(subSystem, constr); +}; + +TCAD.TWO.ParametricManager.prototype.checkRedundancy = function (subSystem, constr) { + var solver = this.prepareForSubSystem([], subSystem); + if (TCAD.parametric.diagnose(solver.system).conflict) { + alert("Most likely this "+constr.NAME + "." + constr.id +" constraint is CONFLICTING!") + } }; TCAD.TWO.ParametricManager.prototype.refresh = function() { @@ -79,7 +87,7 @@ TCAD.TWO.ParametricManager.prototype.remove = function(constr) { for (var i = 0; i < sub.constraints.length; ++i) { var p = sub.constraints[i]; if (p === constr) { - sub.constraints(i, 1); + sub.constraints.splice(i, 1); if (p.NAME === 'coi') { this.unlinkObjects(p.a, p.b); } diff --git a/web/app/sketcher/shapes/arc.js b/web/app/sketcher/shapes/arc.js index 436a81bc..41911ff6 100644 --- a/web/app/sketcher/shapes/arc.js +++ b/web/app/sketcher/shapes/arc.js @@ -71,9 +71,8 @@ TCAD.TWO.Arc.prototype.stabilize = function(viewer) { viewer.parametricManager._add(new TCAD.TWO.Constraints.P2PDistanceV(this.a, this.c, this.r)); }; -TCAD.TWO.AddArcTool = function(viewer, layer) { +TCAD.TWO.AddArcTool = function(viewer) { this.viewer = viewer; - this.layer = layer; this.arc = null; this.point = null; this._v = new TCAD.Vector(0, 0, 0); @@ -120,7 +119,7 @@ TCAD.TWO.AddArcTool.prototype.mouseup = function(e) { new TCAD.TWO.EndPoint(p.x, p.y) ); this.point = this.arc.a; - this.layer.objects.push(this.arc); + this.viewer.activeLayer().objects.push(this.arc); this.viewer.refresh(); } else if (this.point.id === this.arc.a.id) { this.point = this.arc.b; diff --git a/web/app/sketcher/shapes/circle.js b/web/app/sketcher/shapes/circle.js index 6c03064b..3c2d4d67 100644 --- a/web/app/sketcher/shapes/circle.js +++ b/web/app/sketcher/shapes/circle.js @@ -41,9 +41,8 @@ TCAD.TWO.Circle.prototype.getDefaultTool = function(viewer) { }; -TCAD.TWO.EditCircleTool = function(viewer, layer) { +TCAD.TWO.EditCircleTool = function(viewer) { this.viewer = viewer; - this.layer = layer; this.circle = null; }; @@ -76,7 +75,7 @@ TCAD.TWO.EditCircleTool.prototype.mouseup = function(e) { this.circle = new TCAD.TWO.Circle( new TCAD.TWO.EndPoint(p.x, p.y) ); - this.layer.objects.push(this.circle); + this.viewer.activeLayer().objects.push(this.circle); this.viewer.refresh(); } else { this.solveRequest(false); diff --git a/web/app/sketcher/shapes/segment.js b/web/app/sketcher/shapes/segment.js index 9f86b3a5..16cc2023 100644 --- a/web/app/sketcher/shapes/segment.js +++ b/web/app/sketcher/shapes/segment.js @@ -1,7 +1,6 @@ -TCAD.TWO.AddSegmentTool = function(viewer, layer, multi) { +TCAD.TWO.AddSegmentTool = function(viewer, multi) { this.viewer = viewer; - this.layer = layer; this.line = null; this.multi = multi; }; @@ -38,7 +37,7 @@ TCAD.TWO.AddSegmentTool.prototype.mouseup = function(e) { this.viewer.cleanSnap(); needSnap = true; } - this.line = this.viewer.addSegment(a.x, a.y, b.x, b.y, this.layer); + this.line = this.viewer.addSegment(a.x, a.y, b.x, b.y, this.viewer.activeLayer()); if (needSnap) { this.viewer.parametricManager.linkObjects([this.line.a, a]); } @@ -54,7 +53,7 @@ TCAD.TWO.AddSegmentTool.prototype.mouseup = function(e) { } if (this.multi) { var b = this.line.b; - this.line = this.viewer.addSegment(b.x, b.y, b.x, b.y, this.layer); + this.line = this.viewer.addSegment(b.x, b.y, b.x, b.y, this.viewer.activeLayer()); this.viewer.parametricManager.linkObjects([this.line.a, b]); } else { this.line = null; @@ -77,9 +76,8 @@ TCAD.TWO.AddSegmentTool.prototype.keypress = function(e) {}; TCAD.TWO.AddSegmentTool.prototype.keyup = function(e) {}; -TCAD.TWO.AddPointTool = function(viewer, layer) { +TCAD.TWO.AddPointTool = function(viewer) { this.viewer = viewer; - this.layer = layer; }; TCAD.TWO.AddPointTool.prototype.mousemove = function(e) { @@ -94,8 +92,9 @@ TCAD.TWO.AddPointTool.prototype.mousedown = function(e) { TCAD.TWO.AddPointTool.prototype.mouseup = function(e) { var a = this.viewer.screenToModel(e); var p = new TCAD.TWO.EndPoint(a.x, a.y); - this.layer.objects.push(p); - p.layer = this.layer; + var layer = this.viewer.activeLayer(); + layer.objects.push(p); + p.layer = layer; this.viewer.refresh(); };