diff --git a/Exercises/__init__.py b/Exercises/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/Exercises/exercise-0/__init__.py b/Exercises/exercise-0/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/main.py b/main.py index 51432a8..bccb934 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,80 @@ """ This main entry point is the command line interface for the Speckle Automate function. """ +import random +from pydantic import Field from speckle_automate import ( - execute_automate_function, + execute_automate_function, AutomateBase, AutomationContext, ) -import Exercises.exercise_0.inputs.FunctionInputs as FunctionInputs -import Exercises.exercise_0.function.automate_function as automate_function +from Utilities.flatten import flatten_base + + +class FunctionInputs(AutomateBase): + """These are function author defined values. + + Automate will make sure to supply them matching the types specified here. + Please use the pydantic model schema to define your inputs: + https://docs.pydantic.dev/latest/usage/models/ + """ + + comment_phrase: str = Field( + title="Comment Phrase", + description="This phrase will be added to a random model element.", + ) + + +def automate_function( + automate_context: AutomationContext, + function_inputs: FunctionInputs, +) -> None: + """This is an example Speckle Automate function. + + Args: + automate_context: A context helper object, that carries relevant information + about the runtime context of this function. + It gives access to the Speckle project data, that triggered this run. + It also has convenience methods attach result data to the Speckle model. + function_inputs: An instance object matching the defined schema. + """ + + # the context provides a convenient way, to receive the triggering version + version_root_object = automate_context.receive_version() + + flat_list_of_objects = flatten_base(version_root_object) + + # filter the list to only include objects that are displayable. + # this is a simple example, that checks if the object has a displayValue + displayable_objects = [ + speckle_object + for speckle_object in flat_list_of_objects + if ( + getattr(speckle_object, "displayValue", None) + or getattr(speckle_object, "@displayValue", None) + ) and getattr(speckle_object, "id", None) is not None + ] + + if len(displayable_objects) == 0: + automate_context.mark_run_failed( + "Automation failed: No displayable objects found." + ) + + else: + # select a random object from the list + random_object = random.choice(displayable_objects) + + automate_context.attach_info_to_objects( + category="Selected Object", + object_ids=[random_object.id], + message=function_inputs.comment_phrase, + ) + + automate_context.mark_run_success("Added a comment to a random object.") + + # set the automation context view, to the original model / version view + automate_context.set_context_view() + # make sure to call the function with the executor # Pass in the function reference with the inputs schema to the executor.