"use strict"; function createRiver() { if (customization) return; closeDialogs(); if (!layerIsOn("toggleRivers")) toggleRivers(); document.getElementById("toggleCells").dataset.forced = +!layerIsOn("toggleCells"); if (!layerIsOn("toggleCells")) toggleCells(); tip("Click to add river point, click again to remove", true); debug.append("g").attr("id", "controlCells"); viewbox.style("cursor", "crosshair").on("click", onCellClick); createRiver.cells = []; const body = document.getElementById("riverCreatorBody"); $("#riverCreator").dialog({ title: "Create River", resizable: false, position: {my: "left top", at: "left+10 top+10", of: "#map"}, close: closeRiverCreator }); if (modules.createRiver) return; modules.createRiver = true; // add listeners document.getElementById("riverCreatorComplete").addEventListener("click", addRiver); document.getElementById("riverCreatorCancel").addEventListener("click", () => $("#riverCreator").dialog("close")); body.addEventListener("click", function (ev) { const el = ev.target; const cl = el.classList; const cell = +el.parentNode.dataset.cell; if (cl.contains("editFlux")) pack.cells.fl[cell] = +el.value; else if (cl.contains("icon-trash-empty")) removeCell(cell); }); function onCellClick() { const cell = findCell(...d3.mouse(this)); if (createRiver.cells.includes(cell)) removeCell(cell); else addCell(cell); } function addCell(cell) { createRiver.cells.push(cell); drawCells(createRiver.cells); const flux = pack.cells.fl[cell]; const line = `
Cell ${cell} Flux
`; body.innerHTML += line; } function removeCell(cell) { createRiver.cells = createRiver.cells.filter(c => c !== cell); drawCells(createRiver.cells); body.querySelector(`div[data-cell='${cell}']`)?.remove(); } function drawCells(cells) { debug .select("#controlCells") .selectAll(`polygon`) .data(cells) .join("polygon") .attr("points", d => getPackPolygon(d)) .attr("class", "current"); } function addRiver() { const {rivers, cells} = pack; const {addMeandering, getApproximateLength, getWidth, getOffset, getName, getRiverPath} = Rivers; const riverId = last(rivers).i + 1; const riverCells = createRiver.cells; riverCells.forEach(cell => { if (!cells.r[cell]) cells.r[cell] = riverId; }); const source = riverCells[0]; const mouth = riverCells[riverCells.length - 1]; const sourceWidth = 0.05; const widthFactor = 1; const meanderedPoints = addMeandering(riverCells); const discharge = cells.fl[mouth]; // m3 in second const length = getApproximateLength(meanderedPoints); const width = getWidth(getOffset(discharge, meanderedPoints.length, widthFactor, sourceWidth)); const name = getName(mouth); rivers.push({i: riverId, source, mouth, discharge, length, width, widthFactor, sourceWidth, parent: riverId, cells: riverCells, basin: riverId, name, type: "River"}); // render river lineGen.curve(d3.curveCatmullRom.alpha(0.1)); viewbox .select("#rivers") .append("path") .attr("id", "river" + riverId) .attr("d", getRiverPath(meanderedPoints, widthFactor, sourceWidth)); editRiver(riverId); } function closeRiverCreator() { debug.select("#controlCells").remove(); restoreDefaultEvents(); clearMainTip(); const forced = +document.getElementById("toggleCells").dataset.forced; document.getElementById("toggleCells").dataset.forced = 0; if (forced && layerIsOn("toggleCells")) toggleCells(); } }