This guide is only relevant for Dynamo Sandbox, not to be confused with the Dynamo plugin for Revit!
dynamo module has been developed by VIKTOR which can be used for
easy updating of Dynamo input files and processing output files (results + geometry). With the Generic
worker, you will also be able to completely automate an integration with Dynamo Sandbox.
Updating a model
An existing Dynamo model can be passed to VIKTOR's
DynamoFile as shown below. With the
the value of input nodes can be updated. When all inputs have been updated as desired, the
generate method can be
used to generate an updated
from viktor import Filefrom viktor.external.dynamo import DynamoFilefile = File.from_path(Path(__file__).parent / "template.dyn")dyn_file = DynamoFile(file)# update input nodesradius = params.radiusdyn_file.update('Radius', radius) # input node called "Radius"...# generate updated fileinput_file = dyn_file.generate()
Running an analysis
Integrating with Dynamo Sandbox can be done using the
GenericAnalysis class (worker required):
from io import BytesIOfrom viktor.external.generic import GenericAnalysisfiles = [ ('input.dyn', BytesIO(input_file.getvalue_binary())),]# run the analysisgeneric_analysis = GenericAnalysis(files=files, executable_key="dynamo", output_filenames=["output.xml", "geometry.json"])generic_analysis.execute(timeout=60)
GenericAnalysis.execute needs to be mocked within
the context of (automated) testing.
executable_key in the example above refers to the "dynamo" command. This command should also be specified in the
configuration file on the server, located in the same directory as the worker. By pointing to the file location of
DynamoWPFCLI.exe (Dynamo Sandbox command-line interface), the Dynamo Sandbox integration can be established. With
additional arguments we can specify where the input model is located and where the results should be exported to.
See the Dynamo Sandbox documentation for more info on running Dynamo from the command-line.
Geometry can also be exported, for which an installation of either "FormIt" or "Revit" is required:
- 'C:\Program Files\Autodesk\FormIt' # or Revit
After running the analysis, the output file (.xml) can be obtained using:
output_file = generic_analysis.get_output_file("output.xml", as_file=True)
as_file flag, VIKTOR is instructed to return a
File object which can directly be passed to the
get_dynamo_result function. The results can then
be obtained by node id, which corresponds to the same node id as the input file.
from viktor.external.dynamo import DynamoFile, get_dynamo_resultdyn_file = DynamoFile(file)...output_id = dyn_file.get_node_id("Area") # output node called "Area"with output_file.open_binary() as f: result = get_dynamo_result(f, id_=output_id)
Results will be returned as
str type, which means you will need to take care of conversions in the app.
In a similar matter the geometry file can be obtained after the analysis has been performed. With the helper function
convert_geometry_to_glb, you can convert it
to a GLB type file, which can directly be visualized in a
from viktor.external.dynamo import convert_geometry_to_glbfrom viktor.views import GeometryView, GeometryResult@GeometryView(...)def geometry_view(self, params, **kwargs): ... geometry_file = generic_analysis.get_output_file('geometry.json', as_file=True) glb_file = convert_geometry_to_glb(geometry_file) return GeometryResult(glb_file)