Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
calculate_python_expression [2026/08/03 17:39] hermann |
calculate_python_expression [2026/08/18 20:55] (current) hermann |
||
|---|---|---|---|
| Line 8: | Line 8: | ||
| ^ Name ^ Type ^ Description ^ | ^ Name ^ Type ^ Description ^ | ||
| - | | expression | [[ego_script#constants|Code]] | The expression that will run on Python. ''Code'' values cannot be written as plain text constants in EGO Script — see [[#writing_the_expression_in_ego_script|Writing the expression in EGO Script]] below. | | + | | expression | [[code_type|Code]] | The expression that will run on Python. Written directly as a Code constant using its own raw string syntax — see [[#writing_the_expression_in_ego_script|Writing the expression in EGO Script]] below. | |
| ===== Optional Inputs ===== | ===== Optional Inputs ===== | ||
| Line 57: | Line 57: | ||
| | [[Extract Struct Tuple]] | A tuple value | | | [[Extract Struct Tuple]] | A tuple value | | ||
| - | Each functor takes two inputs: the ''Struct'' returned by ''CalculatePythonExpression'', and the name of the entry to extract as a string constant. For example, to retrieve a numeric output named ''patchCount'' and a table output named ''filteredPatches'' — the ''String $"(...)"'' wrapper around the Python code is explained in [[#writing_the_expression_in_ego_script|Writing the expression in EGO Script]] below: | + | Each functor takes two inputs: the ''Struct'' returned by ''CalculatePythonExpression'', and the name of the entry to extract as a string constant. For example, to retrieve a numeric output named ''patchCount'' and a table output named ''filteredPatches'' — the ''$"(...)"'' raw string syntax wrapping the Python code is explained in [[#writing_the_expression_in_ego_script|Writing the expression in EGO Script]] below: |
| <code> | <code> | ||
| - | result := CalculatePythonExpression (String $"( | + | result := CalculatePythonExpression $"( |
| myTable = [["PatchId*", "Area"], [1, 12.4], [2, 8.7]] | myTable = [["PatchId*", "Area"], [1, 12.4], [2, 8.7]] | ||
| dinamica.outputs['patchCount'] = 42 | dinamica.outputs['patchCount'] = 42 | ||
| dinamica.outputs['filteredPatches'] = dinamica.prepareTable(myTable, 1) | dinamica.outputs['filteredPatches'] = dinamica.prepareTable(myTable, 1) | ||
| - | )") {{ }}; | + | )" {{ }}; |
| patchCount := ExtractStructNumber result "patchCount"; | patchCount := ExtractStructNumber result "patchCount"; | ||
| filteredPatches := ExtractStructTable result "filteredPatches"; | filteredPatches := ExtractStructTable result "filteredPatches"; | ||
| Line 73: | Line 73: | ||
| === Installing packages === | === Installing packages === | ||
| - | Packages can be installed in two ways: calling ''dinamica.package(...)'' from within the expression, or listing package names on the //packages// input port, one per line. The two differ in timing: ''dinamica.package(...)'' runs **during** the expression, so it can be called conditionally; the //packages// port always runs **before** the expression executes. Because ''dinamica.package(...)'' runs together with the script, it may fail if a package is already loaded in an incompatible version. | + | Packages can be installed in two ways: calling ''dinamica.package(...)'' from within the expression, or listing package names on the //packages// input port. The two differ in timing: ''dinamica.package(...)'' runs **during** the expression, so it can be called conditionally; the //packages// port always runs **before** the expression executes. |
| - | ''dinamica.package(packageName, installPath=None, loadPath=None)'' installs (if needed via pip) and imports the requested module. | + | **dinamica.package()** |
| + | |||
| + | ''dinamica.package(packageName, installPath=None, loadPath=None)'' installs (if needed via pip) and imports the requested module. Because it runs together with the script, it may fail if a package is already loaded in an incompatible version. | ||
| ^ Parameter ^ Type ^ Default ^ Description ^ | ^ Parameter ^ Type ^ Default ^ Description ^ | ||
| Line 109: | Line 111: | ||
| </code> | </code> | ||
| - | The //packages// port takes one package identifier per line, in any form accepted by ''pip''. It only installs — unlike ''dinamica.package()'', it does not also import the module, and it does not support specifying a separate install name and import name. Every listed package is installed before the expression runs, but the expression must still import each one itself, using its actual importable name (which may differ from the name given to ''pip''): | + | **The packages port** |
| + | |||
| + | The //packages// input port takes one package identifier per line, in any form accepted by ''pip''. Every listed package is installed before the expression runs. Unlike ''dinamica.package()'', the port only installs — it does not also import the module, and it does not support specifying a separate install name and import name. The expression must still import each package itself, using its actual importable name (which may differ from the name given to ''pip''). | ||
| The //packages// port: | The //packages// port: | ||
| Line 217: | Line 221: | ||
| ==== Writing the expression in EGO Script ==== | ==== Writing the expression in EGO Script ==== | ||
| - | When writing a script by hand, the ''expression'' input cannot be filled in directly as a text constant: the [[ego_script#constants|Code]] type is represented in the underlying script using base64 encoding, which is impractical to write or edit directly. Instead, connect a ''String'' carrier functor containing the expression text to the ''expression'' port — its output is accepted wherever a ''Code'' value is expected. Since only this one output is needed, the carrier can be [[ego_script#inline_syntax|inlined]] directly into the call. | + | The ''expression'' input can be filled in directly as a text constant, using [[code_type|Code Type]]'s own raw string syntax — the same ''$"<delimiter>( raw_characters )<delimiter>"'' form used by String constants. This is also the form the Dinamica EGO GUI's dedicated code editor generates when it writes the ''expression'' port's value, so a hand-written script and one produced by the GUI take the same shape. See [[code_type|Code Type]] for the full grammar, including the base64 alternative form. |
| - | + | ||
| - | This limitation is specific to hand-written EGO Script. In the Dinamica EGO GUI, the ''expression'' port has a dedicated code editor that edits the ''Code'' value directly — the ''String'' carrier workaround is only necessary when writing or editing the ''.ego'' file as text. | + | |
| The following counts the patches in a land cover areas table whose area meets a minimum threshold: | The following counts the patches in a land cover areas table whose area meets a minimum threshold: | ||
| <code> | <code> | ||
| - | result := CalculatePythonExpression (String $"( | + | result := CalculatePythonExpression $"( |
| total = 0 | total = 0 | ||
| for row in dinamica.inputs['t1'][1:]: | for row in dinamica.inputs['t1'][1:]: | ||
| Line 230: | Line 232: | ||
| total += 1 | total += 1 | ||
| dinamica.outputs['patchCount'] = total | dinamica.outputs['patchCount'] = total | ||
| - | )") {{ | + | )" {{ |
| NumberTable landCoverAreas 1; | NumberTable landCoverAreas 1; | ||
| NumberValue minimumArea 1; | NumberValue minimumArea 1; | ||
| Line 242: | Line 244: | ||
| <code> | <code> | ||
| - | result := CalculatePythonExpression (String $"( | + | result := CalculatePythonExpression $"( |
| dinamica.package('numpy') | dinamica.package('numpy') | ||
| Line 260: | Line 262: | ||
| dinamica.outputs['outlierPatches'] = dinamica.prepareTable(outlierTable, 1) | dinamica.outputs['outlierPatches'] = dinamica.prepareTable(outlierTable, 1) | ||
| - | )") {{ | + | )" {{ |
| NumberTable landCoverPatches 1; | NumberTable landCoverPatches 1; | ||
| }}; | }}; | ||
| Line 277: | Line 279: | ||
| CalculatePythonExpression | CalculatePythonExpression | ||
| - | |||