diff --git a/app/javascript/projects/modelling/components/expression_component.ts b/app/javascript/projects/modelling/components/expression_component.ts index 968a9af5..2ef01181 100644 --- a/app/javascript/projects/modelling/components/expression_component.ts +++ b/app/javascript/projects/modelling/components/expression_component.ts @@ -7,6 +7,8 @@ import { numericDataSocket, numericNumberDataSocket } from "../socket_types" import { exp, isSymbolNode, parse, parser } from 'mathjs' import { PreviewControl } from "../controls/preview" import { isEqual } from "lodash" +import { ProjectProperties } from "." +import { createXYZ } from "ol/tilegrid" interface Expression { @@ -15,14 +17,17 @@ interface Expression { } const ExpressionList: Array = [ - { id: 1, name: `height * scale + error` } + { id: 1, name: `height * scale + error` }, + { id: 2, name: `H^2 * scale + error` }, ] export class ExpressionComponent extends BaseComponent { + projectProps: ProjectProperties - constructor() { + constructor(ProjectProps: ProjectProperties) { super("Expression") this.category = "Arithmetic" + this.projectProps = ProjectProps } async builder(node: Node) { @@ -128,22 +133,31 @@ export class ExpressionComponent extends BaseComponent { const v = inputs[variables[0]][0] as NumericTileGrid - const out = editorNode.meta.output = outputs['out'] = new NumericTileGrid(v.zoom, v.x, v.y, v.width, v.height) - for (let x = v.x; x < v.x + v.width; ++x) { - for (let y = v.y; y < v.y + v.height; ++y) { + const tileGrid = createXYZ() + const outputTileRange = tileGrid.getTileRangeForExtentAndZ(this.projectProps.extent, this.projectProps.zoom) - variables.forEach((i) => { - const variableSource: any = inputs[i][0] - p.set(i, variableSource.get(x, y)) - }) + const out = editorNode.meta.output = outputs['out'] = new NumericTileGrid( + this.projectProps.zoom, + outputTileRange.minX, + outputTileRange.minY, + outputTileRange.getWidth(), + outputTileRange.getHeight() + ) - let r = p.evaluate(expression) + out.iterate((x, y) => { - out.set(x, y, r); - p.clear(); - } - } + variables.forEach((i) => { + const variableSource: any = inputs[i][0] + p.set(i, variableSource.get(x, y)) + }) + + let r = p.evaluate(expression) + + out.set(x, y, r); + p.clear(); + + }) editorNode.data.previousInputs = [inputs, expression] editorNode.data.previewsOutput = out diff --git a/app/javascript/projects/modelling/components/index.ts b/app/javascript/projects/modelling/components/index.ts index 03651cb6..e71f8e2c 100644 --- a/app/javascript/projects/modelling/components/index.ts +++ b/app/javascript/projects/modelling/components/index.ts @@ -102,7 +102,7 @@ export function createDefaultComponents(saveMapLayer: SaveMapLayer, saveModel: S // Arithmetic new MaskNumericDataComponent(), - new ExpressionComponent(), + new ExpressionComponent(projectProps), new BinaryOpComponent('Min', '', numericNumberDataSocket, numericNumberDataSocket, 'Arithmetic', projectProps), new BinaryOpComponent('Max', '', numericNumberDataSocket, numericNumberDataSocket, 'Arithmetic', projectProps), new VariadicOpComponent('Sum', '∑', numericDataSocket, numericDataSocket, 'Arithmetic', 'Sum all inputs'),