Select Git revision
FlowGraph.cs
project.js 5.43 KiB
import * as Zdog from "zdog";
import { Model } from "./model.js";
import { Move } from "./command.js";
class Project {
constructor() {
this.model = new Model();
this.addLine(0, 2000, 0, 0, 0);
}
// Draw things only once, then toggle visibility if needed. TODO!
renderAll() {
window.illo.children = []; // Is this ok to do? NO. TODO!
this.refreshGridLines();
this.model.drawAllShapes(); // Good idea? NO. TODO!
}
refreshGridLines() {
// Get grid size or default to 10
if (
!Number.isInteger(parseInt(localStorage.getItem("settingsGridSize"), 10))
) {
localStorage.setItem("settingsGridSize", "10");
}
let gridSize = parseInt(localStorage.getItem("settingsGridSize"), 10);
// Remove old grid if exists
if (window.illoGridGroup) {
window.illo.removeChild(window.illoGridGroup);
}
if (localStorage.getItem("settingsGridDisplay") == "off") return;
// New grid
window.illoGridGroup = new Zdog.Group({
addTo: window.illo,
});
let gridRenderLimit = 250;
let minMaxGridPoint = parseInt(gridRenderLimit / gridSize) * gridSize;
// Horizontal lines
for (var x = -minMaxGridPoint; x < minMaxGridPoint; x += gridSize) {
var color = "#bbbbbb";
if (x == 0) {
color = "#111111";
}
new Zdog.Shape({
addTo: window.illoGridGroup,
path: [
{
y: -gridRenderLimit,
x: x,
z: 0,
},
{
y: gridRenderLimit,
x: x,
z: 0,
},
],
stroke: 0.5,
color: color,
});
new Zdog.Shape({
addTo: window.illoGridGroup,
path: [
{
y: x,
x: -gridRenderLimit,
z: 0,
},
{
y: x,
x: gridRenderLimit,
z: 0,
},
],
stroke: 0.5,
color: color,
});
}
// Vertical center line
/*new Zdog.Shape({
addTo: window.illoGridGroup,
path: [
{
y: 0,
x: 0,
z: -gridRenderLimit,
},
{
y: 0,
x: 0,
z: gridRenderLimit,
},
],
stroke: 0.5,
color: "#111111",
});*/
}
addLine(flow, speed, toX, toY, toZ) {
if (flow < this.model.currentCoordinates().e) {
flow = this.model.currentCoordinates().e;
}
var newLine = new Move(flow, speed, toX, toY, toZ);
//window.currentProject.model.append(newLine);
this.model.append(newLine);
}
addArc(flow, speed, size, directionXY, directionZ, curvature) {
const prevCoords = this.model.currentCoordinates();
var nextStartHeight = 0;
const steps = Math.min(size, 50);
const flowStep = (flow - prevCoords.e) / steps;
const angle = 90;
for (var i = 0; i <= steps; i++) {
var sub_angle = (i / steps) * angle * 0.017453292519943295; // (angle / 180) * Math.PI;
var xi = size * (1 - Math.cos(sub_angle));
var zi = size * Math.sin(sub_angle);
if (nextStartHeight == 0 && xi > 4) nextStartHeight = zi;
if (
(curvature == "1" && directionZ == "2") ||
(curvature == "2" && directionZ == "1")
) {
var tempX = xi;
xi = zi;
zi = tempX;
}
switch (directionXY) {
default:
var newX = prevCoords.x + xi;
var newY = prevCoords.y;
break;
case "2":
var newX = prevCoords.x;
var newY = prevCoords.y + xi;
break;
case "3":
var newX = prevCoords.x - xi;
var newY = prevCoords.y;
break;
case "4":
var newX = prevCoords.x;
var newY = prevCoords.y - xi;
break;
}
switch (directionZ) {
default:
var newZ = prevCoords.z + zi;
break;
case "2":
var newZ = prevCoords.z - zi;
break;
case "3":
var newZ = prevCoords.z;
switch (directionXY) {
default:
var newX = prevCoords.x + zi;
var newY = prevCoords.y + xi;
break;
case "2":
var newX = prevCoords.x - zi;
var newY = prevCoords.y + xi;
break;
case "3":
var newX = prevCoords.x - zi;
var newY = prevCoords.y - xi;
break;
case "4":
var newX = prevCoords.x + zi;
var newY = prevCoords.y - xi;
break;
}
break;
}
var newMove = new Move(
prevCoords.e + flowStep * i,
speed,
newX,
newY,
newZ
);
this.model.append(newMove);
}
}
playbackDelay() {
return new Promise((resolve) => {
setTimeout(resolve, 250);
});
}
async drawPlaybackStart() {
console.log("start simulation");
document.getElementById("playViewButton").lastChild.nodeValue = " Stop";
window.stopPlayback = false;
var cmd;
var i = 0;
while ((cmd = this.model.commands[i])) {
this.model.selectCommand(i);
await this.playbackDelay();
this.model.deselectCommand(i);
i++;
if (window.stopPlayback) {
break;
}
}
console.log("stop simulation");
document.getElementById("playViewButton").lastChild.nodeValue = " Simulate";
}
drawPlaybackStop() {
window.stopPlayback = true;
}
}
export { Project };