Skip to content

Commit

Permalink
Add line drawing for polyline layers
Browse files Browse the repository at this point in the history
  • Loading branch information
mbloch committed Mar 17, 2024
1 parent bfbbab5 commit c2add97
Show file tree
Hide file tree
Showing 24 changed files with 863 additions and 212 deletions.
2 changes: 1 addition & 1 deletion src/gui/gui-canvas.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ export function DisplayCanvas() {
_ctx.beginPath();
_ctx.fillStyle = style.vertex_overlay_color || 'black';
p = style.vertex_overlay;
drawCircle(p[0] * t.mx + t.bx, p[1] * t.my + t.by, radius * 1.6, _ctx);
drawCircle(p[0] * t.mx + t.bx, p[1] * t.my + t.by, radius * 2, _ctx);
_ctx.fill();
_ctx.closePath();
}
Expand Down
1 change: 1 addition & 0 deletions src/gui/gui-display-arcs.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export function enhanceArcCollectionForDisplay(unfilteredArcs) {
return filteredArcs;
}

// TODO: better job of detecting arc change... e.g. revision number
unfilteredArcs.getScaledArcs = function(ext) {
if (filteredArcs) {
// match simplification of unfiltered arcs
Expand Down
103 changes: 3 additions & 100 deletions src/gui/gui-display-utils.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -18,48 +18,12 @@ export function getDatasetCrsInfo(dataset) {
};
}

export function flattenArcs(lyr) {
lyr.source.dataset.arcs.flatten();
if (isProjectedLayer(lyr)) {
lyr.arcs.flatten();
}
}

export function setZ(lyr, z) {
lyr.source.dataset.arcs.setRetainedInterval(z);
if (isProjectedLayer(lyr)) {
lyr.arcs.setRetainedInterval(z);
}
}

export function updateZ(lyr) {
if (isProjectedLayer(lyr) && !lyr.source.dataset.arcs.isFlat()) {
lyr.arcs.setThresholds(lyr.source.dataset.arcs.getVertexData().zz);
}
}

export function insertVertex(lyr, id, dataPoint) {
internal.insertVertex(lyr.source.dataset.arcs, id, dataPoint);
if (isProjectedLayer(lyr)) {
internal.insertVertex(lyr.arcs, id, lyr.projectPoint(dataPoint[0], dataPoint[1]));
}
}

export function deleteVertex(lyr, id) {
internal.deleteVertex(lyr.arcs, id);
if (isProjectedLayer(lyr)) {
internal.deleteVertex(lyr.source.dataset.arcs, id);
}
}

// Convert a point from display CRS coordinates to data coordinates.
// These are only different when using dynamic reprojection (basemap view).
export function translateDisplayPoint(lyr, p) {
return isProjectedLayer(lyr) ? lyr.invertPoint(p[0], p[1]) : p;
}

export function getPointCoords(lyr, fid) {
return internal.cloneShape(lyr.source.layer.shapes[fid]);
}

// bbox: display coords
// intended to work with rectangular projections like Mercator
export function getBBoxCoords(lyr, bbox) {
Expand All @@ -72,68 +36,7 @@ export function getBBoxCoords(lyr, bbox) {
return bounds.toArray();
}

export function getVertexCoords(lyr, id) {
return lyr.source.dataset.arcs.getVertex2(id);
}

export function setVertexCoords(lyr, ids, dataPoint) {
internal.snapVerticesToPoint(ids, dataPoint, lyr.source.dataset.arcs, true);
if (isProjectedLayer(lyr)) {
var p = lyr.projectPoint(dataPoint[0], dataPoint[1]);
internal.snapVerticesToPoint(ids, p, lyr.arcs, true);
}
}

// coords: [x, y] point in data CRS (not display CRS)
export function setPointCoords(lyr, fid, coords) {
lyr.source.layer.shapes[fid] = coords;
if (isProjectedLayer(lyr)) {
lyr.layer.shapes[fid] = projectPointCoords(coords, lyr.projectPoint);
}
}

export function updateVertexCoords(lyr, ids) {
if (!isProjectedLayer(lyr)) return;
var p = lyr.arcs.getVertex2(ids[0]);
internal.snapVerticesToPoint(ids, lyr.invertPoint(p[0], p[1]), lyr.source.dataset.arcs, true);
}

export function setRectangleCoords(lyr, ids, coords) {
ids.forEach(function(id, i) {
var p = coords[i];
internal.snapVerticesToPoint([id], p, lyr.source.dataset.arcs, true);
if (isProjectedLayer(lyr)) {
internal.snapVerticesToPoint([id], lyr.projectPoint(p[0], p[1]), lyr.arcs, true);
}
});
}

// lyr: display layer
// export function updateRectangleCoords(lyr, ids, coords) {
// if (!isProjectedLayer(lyr)) return;
// ids.forEach(function(id, i) {
// var p = coords[i];
// internal.snapVerticesToPoint([id], lyr.invertPoint(p[0], p[1]), lyr.source.dataset.arcs, true);
// });
// }

function isProjectedLayer(lyr) {
export function isProjectedLayer(lyr) {
// TODO: could do some validation on the layer's contents
return !!(lyr.source && lyr.invertPoint);
}

// Update source data coordinates by projecting display coordinates
export function updatePointCoords(lyr, fid) {
if (!isProjectedLayer(lyr)) return;
var displayShp = lyr.layer.shapes[fid];
lyr.source.layer.shapes[fid] = projectPointCoords(displayShp, lyr.invertPoint);
}

function projectPointCoords(src, proj) {
var dest = [], p;
for (var i=0; i<src.length; i++) {
p = proj(src[i][0], src[i][1]);
if (p) dest.push(p);
}
return dest.length ? dest : null;
}
2 changes: 1 addition & 1 deletion src/gui/gui-draw-lines.mjs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { error, internal } from './gui-core';
import { updatePointCoords } from './gui-display-utils';
import { updatePointCoords } from './gui-drawing-utils';

export function initLineDrawing(gui, ext, mouse, hit) {
var _on = false;
Expand Down
Loading

0 comments on commit c2add97

Please sign in to comment.