Mercurial > hg > digilib
changeset 1366:da796a73024c
Merge with 1ad07ddb4bf8fa0468a6f65b05dcba2bd80c7410
author | robcast |
---|---|
date | Fri, 20 Feb 2015 20:29:14 +0100 |
parents | 82a0b95c4e22 (current diff) 1ad07ddb4bf8 (diff) |
children | 4711b8ffd77f |
files | |
diffstat | 2 files changed, 45 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/webapp/src/main/webapp/jquery/jquery.digilib.geometry.js Fri Feb 20 20:28:11 2015 +0100 +++ b/webapp/src/main/webapp/jquery/jquery.digilib.geometry.js Fri Feb 20 20:29:14 2015 +0100 @@ -168,6 +168,16 @@ var dy = pos.y - this.y; return Math.sqrt(dx * dx + dy * dy); }; + // radians of angle between line and the positive X axis + that.rad = function (pos) { + return Math.atan2(pos.y - this.y, pos.x - this.x); + } + + // degree of angle between line and the positive X axis + that.deg = function (pos) { + return this.rad(pos) / Math.PI * 180; + } + // returns position in css-compatible format that.getAsCss = function() { return {
--- a/webapp/src/main/webapp/jquery/jquery.digilib.measure.js Fri Feb 20 20:28:11 2015 +0100 +++ b/webapp/src/main/webapp/jquery/jquery.digilib.measure.js Fri Feb 20 20:29:14 2015 +0100 @@ -790,8 +790,9 @@ }, drawshape : function(data) { var shape = newShape(data); + var layer = data.measureLayer; $(data).trigger('createShape', shape); - digilib.actions.addShape(data, shape, shapeCompleted); + digilib.actions.addShape(data, shape, shapeCompleted, layer); _debug_shape('action drawshape', shape); } }; @@ -861,18 +862,6 @@ return Math.round(num * 10000 + 0.00001) / 10000 }; - // radians of angle between line and the positive X axis - var rad = function (p1, p2) { - var dx = p2.x - p1.x; - var dy = p2.y - p1.y; - return Math.atan2(dy, dx); - } - - // degree of angle between line and the positive X axis - var deg = function (p1, p2) { - return rad(p1, p2) / Math.PI * 180; - } - // calculate the distance of the first 2 points of a shape (rectified digilib coords) var rectifiedDist = function(data, shape) { var coords = shape.geometry.coordinates; @@ -979,15 +968,16 @@ var newShape = function(data) { var shapeType = getActiveShapeType(data); return { - 'geometry' : { - 'type' : shapeType + 'id': fn.createId(null, CSS+'measure-'), + 'geometry': { + 'type': shapeType }, - 'properties' : { - 'editable' : true, - 'selected' : false, - 'stroke' : getSelectedStroke(data), - 'stroke-width' : 1, - 'cssclass' : shapeClass(shapeType) + 'properties': { + 'editable': true, + 'selected': false, + 'stroke': getSelectedStroke(data), + 'stroke-width': 1, + 'cssclass': shapeClass(shapeType) // 'center' : data.settings.drawFromCenter } }; @@ -1081,9 +1071,8 @@ // show or hide SVG element (not possible via jQuery .hide/.show) var showSVG = function(data, on) { - var layers = data.vectorLayers; - if (layers == null) return; - $svg = layers[0].$elem; + var layer = data.measureLayer; + $svg = layer.$elem; if (on) { $svg.removeAttr("display"); } else { @@ -1116,9 +1105,7 @@ // remove selected shapes - or the most recent one, if none was selected var removeSelectedShapes = function(data) { - var layers = data.vectorLayers; - if (layers == null) return; - var layer = layers[0]; // hopefully the correct layer? + var layer = data.measureLayer; var shapes = layer.shapes; if (shapes == null) return; var shapesDeleted = 0; @@ -1204,13 +1191,16 @@ var p = props.screenpos; var vtx = props.vtx; if (vtx > 1 || p.length > 2) { - var pv = p[2]; - var pd = geom.position(p[1].x - p[0].x, p[1].y - p[0].y); - var pe = (Math.abs(pd.y) > Math.abs(pd.x)) - ? geom.position(pv.x - p[1].x, pd.x/pd.y * (pv.x - p[1].x)) - : geom.position(pd.y/pd.x * (p[1].y - pv.y), p[1].y - pv.y); - p[2] = geom.position(p[1].x + pe.x, p[1].y - pe.y); - p[3] = geom.position(p[0].x + pe.x, p[0].y - pe.y); + var dx = p[2].x - p[1].x; + var dy = p[1].y - p[2].y + var d = p[0].delta(p[1]); + var ratio = d.x/d.y; + var inv = d.y/d.x; + var z = Math.abs(d.y) > Math.abs(d.x) + ? geom.position(dx, ratio * -dx) + : geom.position(inv * dy, -dy); + p[2] = p[1].copy().add(z); + p[3] = p[0].copy().add(z); shape.geometry.coordinates[2] = data.imgTrafo.invtransform(p[2]).toArray(); shape.geometry.coordinates[3] = data.imgTrafo.invtransform(p[3]).toArray(); } @@ -1221,19 +1211,20 @@ factory['Grid'] = function (shape) { var $s = factory['Line'](shape); var place = $s.place; + var gridID = shape.id + '-grid'; var props = shape.properties; props.maxvtx = 2; - var $g = $(fn.svgElement('g')); + var $g = $(fn.svgElement('g', {'id': shape.id + '-g'})); var $defs = $(fn.svgElement('defs')); - var $pat = $(fn.svgElement('pattern', {'id': 'grid', 'height': '10%', 'width': '10%', 'patternUnits': 'objectBoundingBox'})); + var $pat = $(fn.svgElement('pattern', {'id': gridID, 'height': '10%', 'width': '10%', 'patternUnits': 'objectBoundingBox'})); var $path = $(fn.svgElement('path', {'d': "M100,0 L0,0 0,100", 'fill': 'none', 'stroke': props.stroke, 'stroke-width': '1'})); - var $r = $(fn.svgElement('rect', {stroke: props.stroke, fill: 'url(#grid)'})); + var $r = $(fn.svgElement('rect', {'id': shape.id + '-rect', stroke: props.stroke, fill: 'url(#'+gridID+')'})); $g.append($defs.append($pat.append($path))).append($r).append($s); $g.place = function () { place.call($s); var p = props.screenpos; var d = p[0].distance(p[1]); - var angle = mRound(deg(p[0], p[1])); + var angle = mRound(p[0].deg(p[1])); var rotate = 'rotate('+angle+' '+p[0].x+' '+p[0].y+')'; $r.attr({x:p[0].x, y:p[0].y, height:d, width:d, transform:rotate}); $pat.attr({patternTransform:rotate}); @@ -1313,7 +1304,12 @@ data.measureFactor = 1.0, setupMeasureBar(data); setupSvgFactory(data); - data.vectorLayers[0].handleType = 'diamond'; + data.measureLayer = { + 'shapes': [], + 'projection': 'screen', + 'handleType': 'diamond' + }; + digilib.actions.addVectorLayer(data, data.measureLayer); }; // event handler for scaler update