From 3409bb22d69a4500b21209f10e0014793630a527 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Wed, 17 Jan 2024 21:22:49 +0100 Subject: [PATCH 01/35] WIP: setting testing env for ci --- .github/actions/ghpython-components/README.md | 1 + .../actions/ghpython-components/action.yml | 32 ++++++++++++++++++ .../ghpython-components/componentize.py | 33 +++++++++++-------- .github/workflows/build.yml | 27 ++++++++------- 4 files changed, 68 insertions(+), 25 deletions(-) create mode 100644 .github/actions/ghpython-components/README.md create mode 100644 .github/actions/ghpython-components/action.yml rename componentize.py => .github/actions/ghpython-components/componentize.py (94%) diff --git a/.github/actions/ghpython-components/README.md b/.github/actions/ghpython-components/README.md new file mode 100644 index 0000000..ae5089b --- /dev/null +++ b/.github/actions/ghpython-components/README.md @@ -0,0 +1 @@ +This action was implemented from the [compass componentizer](https://github.com/compas-dev/compas-actions.ghpython_components/tree/main). We retain no credit for the code, and only modified it to work with our own repository. \ No newline at end of file diff --git a/.github/actions/ghpython-components/action.yml b/.github/actions/ghpython-components/action.yml new file mode 100644 index 0000000..1fd6a18 --- /dev/null +++ b/.github/actions/ghpython-components/action.yml @@ -0,0 +1,32 @@ +# This action was implemented from the [compass componentizer](https://github.com/compas-dev/compas-actions.ghpython_components/tree/main). We retain no credit for the code, and only modified it to work with our own repository. + +name: 'Grasshopper componentizer' +description: 'Create GHUser components from Python source code' +inputs: + source: + description: 'Source directory where code for all components is stored' + required: true + target: + description: 'Target directory for ghuser files' + required: true + prefix: + description: 'Add this prefix to the name of each generated component' + required: false +runs: + using: 'composite' + steps: + - run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json + shell: pwsh + - run: | + $command="python" + $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib" + $prefix="${{ inputs.prefix }}" + if( $prefix ) + { + $params=$params + "--prefix", "$prefix" + } + & $command $params + shell: pwsh +branding: + icon: 'box' + color: 'orange' diff --git a/componentize.py b/.github/actions/ghpython-components/componentize.py similarity index 94% rename from componentize.py rename to .github/actions/ghpython-components/componentize.py index 53cf436..903ae31 100644 --- a/componentize.py +++ b/.github/actions/ghpython-components/componentize.py @@ -1,5 +1,3 @@ -from __future__ import print_function - import argparse import base64 import json @@ -7,15 +5,15 @@ import re import sys import tempfile -import urllib +import urllib.request, urllib.parse, urllib.error import zipfile -import StringIO +from io import StringIO import clr import System import System.IO -GHPYTHON_SCRIPT_GUID = System.Guid("410755b1-224a-4c1e-a407-bf32fb45ea7e") +GHPYTHON_SCRIPT_GUID = System.Guid("410755b1-224a-4c1e-a407-bf32fb45ea7d") TEMPLATE_VER = re.compile("{{version}}") TEMPLATE_NAME = re.compile("{{name}}") TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}") @@ -87,8 +85,14 @@ def find_ghio_assembly(libdir): def bitmap_from_image_path(image_path): with open(image_path, "rb") as imageFile: + # Ensure img_string is a string, not a bytes object img_string = base64.b64encode(imageFile.read()) - return System.Convert.FromBase64String(img_string) + if isinstance(img_string, bytes): + img_string = img_string.decode() + + # Now you can pass img_string to the FromBase64String method + return System.Convert.FromBase64String(img_string) + # return System.Convert.FromBase64String(img_string) def validate_source_bundle(source): @@ -316,6 +320,7 @@ def create_ghuser_component(source, target, version=None, prefix=None): po_chunk.SetInt32("Mapping", 2) # print(ghpython_root.Serialize_Xml()) + root.SetByteArray("Object", ghpython_root.Serialize_Binary()) System.IO.File.WriteAllBytes(target, root.Serialize_Binary()) @@ -378,14 +383,16 @@ def create_ghuser_component(source, target, version=None, prefix=None): os.mkdir(targetdir) print("[x]") - print("[ ] GH_IO assembly: {}\r".format(gh_io or args.ghio), end="") + # print("[ ] GH_IO assembly: {}\r".format(gh_io or args.ghio), end="") if not gh_io: - print("[-]") - print(" Cannot find GH_IO Assembly! Aborting.") + print("[-] Cannot find GH_IO Assembly! Aborting.") sys.exit(-1) - clr.AddReferenceToFileAndPath(gh_io) - print("[x]") - print() + + gh_io = os.path.abspath(gh_io) + gh_io = gh_io[:-4] + clr.AddReference(gh_io) + + print("[x] GH_IO assembly: {}".format(gh_io)) print("Processing component bundles:") for d in source_bundles: @@ -393,4 +400,4 @@ def create_ghuser_component(source, target, version=None, prefix=None): target = os.path.join(targetdir, d + ".ghuser") print(" [ ] {}\r".format(d), end="") create_ghuser_component(source, target, args.version, args.prefix) - print(" [x] {} => {}".format(d, target)) + print(" [x] {} => {}".format(d, target)) \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 69736fe..21f55a9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,24 +1,27 @@ name: build - on: [push] jobs: - build: - name: windows-ironpython + build_ghuser_components: runs-on: windows-latest + name: Build components steps: - uses: actions/checkout@v2 - uses: NuGet/setup-nuget@v1.0.5 - - name: Install IronPython - run: | - choco install ironpython --version=2.7.8.1 - - name: Install dependencies - run: | - nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json - - name: Run + + - name: Install Python and pythonnet + uses: actions/setup-python@v2 + with: + python-version: '3.9.10' + - name: Install pythonnet run: | - ipy componentize.py examples build + pip install pythonnet + - uses: ./.github/actions/ghpython-components + with: + source: examples + target: build + - uses: actions/upload-artifact@v2 with: name: ghuser-components - path: build + path: build \ No newline at end of file From ced3d735d594175b56db011c8ffbcda6575d067b Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Wed, 17 Jan 2024 21:24:14 +0100 Subject: [PATCH 02/35] WIP: testing on cpy_dev ci branch --- .github/workflows/build.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 21f55a9..be1b715 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,5 +1,8 @@ name: build -on: [push] +on: + push: + branches: + - cpy_dev jobs: build_ghuser_components: From 87e10e0420710045b4391997087dd691b4e3ed0b Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Wed, 17 Jan 2024 21:25:41 +0100 Subject: [PATCH 03/35] WIP: added also main for ci testing --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index be1b715..17144e7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,6 +3,7 @@ on: push: branches: - cpy_dev + - main jobs: build_ghuser_components: From 27456c294b5fba706e1a7b8f9b48638f1ce7506e Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Wed, 17 Jan 2024 21:51:00 +0100 Subject: [PATCH 04/35] WIP-CAP: ironpy to cpy compiling olc cpy --- .github/actions/ghpython-components/componentize.py | 4 ++-- .github/workflows/build.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/actions/ghpython-components/componentize.py b/.github/actions/ghpython-components/componentize.py index 903ae31..abf5f6e 100644 --- a/.github/actions/ghpython-components/componentize.py +++ b/.github/actions/ghpython-components/componentize.py @@ -13,7 +13,7 @@ import System import System.IO -GHPYTHON_SCRIPT_GUID = System.Guid("410755b1-224a-4c1e-a407-bf32fb45ea7d") +GHPYTHON_SCRIPT_GUID = System.Guid("410755b1-224a-4c1e-a407-bf32fb45ea7e") TEMPLATE_VER = re.compile("{{version}}") TEMPLATE_NAME = re.compile("{{name}}") TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}") @@ -391,7 +391,7 @@ def create_ghuser_component(source, target, version=None, prefix=None): gh_io = os.path.abspath(gh_io) gh_io = gh_io[:-4] clr.AddReference(gh_io) - + print("[x] GH_IO assembly: {}".format(gh_io)) print("Processing component bundles:") diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 17144e7..d0059fb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,7 +2,7 @@ name: build on: push: branches: - - cpy_dev + - cpy_dev # TODO: to erase once merged - main jobs: @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v2 - uses: NuGet/setup-nuget@v1.0.5 - - name: Install Python and pythonnet + - name: Install Python3 uses: actions/setup-python@v2 with: python-version: '3.9.10' From b372b93787c55feb8048e8c0c3dbb7703882c3c7 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Thu, 18 Jan 2024 00:10:19 +0100 Subject: [PATCH 05/35] WIP: notes on xml, next it's testing deserialization on ghuser cpy --- .../ghpython-components/componentize.py | 155 ++++++++++++------ .gitignore | 3 + 2 files changed, 104 insertions(+), 54 deletions(-) diff --git a/.github/actions/ghpython-components/componentize.py b/.github/actions/ghpython-components/componentize.py index abf5f6e..8535ced 100644 --- a/.github/actions/ghpython-components/componentize.py +++ b/.github/actions/ghpython-components/componentize.py @@ -13,11 +13,12 @@ import System import System.IO -GHPYTHON_SCRIPT_GUID = System.Guid("410755b1-224a-4c1e-a407-bf32fb45ea7e") +GHPYTHON_SCRIPT_GUID = System.Guid("c9b2d725-6f87-4b07-af90-bd9aefef68eb") # <<<<<<<<<<<< changed TEMPLATE_VER = re.compile("{{version}}") TEMPLATE_NAME = re.compile("{{name}}") TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}") +# TODO: we might want to double check this list if the guid are the same in Rhino 8 TYPES_MAP = dict( none="35915213-5534-4277-81b8-1bdc9e7383d2", ghdoc="87f87f55-5b71-41f4-8aea-21d494016f81", @@ -49,6 +50,7 @@ geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26", ) +#TODO: double check, don't know this param EXPOSURE = dict(valid=set([-1, 2, 4, 8, 16, 32, 64, 128]), default=2) ACCESS = dict(valid=set([0, 1, 2]), map=dict(item=0, list=1, tree=2), default=0) PARAM_TYPE = dict( @@ -213,7 +215,7 @@ def replace_templates(code, version, name, ghuser_name): return code - +# FIXME: main function to port for GHUser in Python3 def create_ghuser_component(source, target, version=None, prefix=None): from GH_IO.Serialization import GH_LooseChunk @@ -221,6 +223,7 @@ def create_ghuser_component(source, target, version=None, prefix=None): code = replace_templates(code, version, data["name"], os.path.basename(target)) + # new guid instance_guid = data.get("instanceGuid") if not instance_guid: instance_guid = System.Guid.NewGuid() @@ -229,101 +232,145 @@ def create_ghuser_component(source, target, version=None, prefix=None): prefix = prefix or "" + # ------------------------------ + # ------------------------------ + # root root = GH_LooseChunk("UserObject") - root.SetGuid("BaseID", GHPYTHON_SCRIPT_GUID) - root.SetString("Name", prefix + data["name"]) - root.SetString("NickName", data["nickname"]) - root.SetString("Description", data.get("description", "")) - root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"])) - root.SetString("Category", data["category"]) - root.SetString("SubCategory", data["subcategory"]) - root.SetGuid("InstanceGuid", instance_guid) - root.SetByteArray("Icon", icon) - - ghpython_data = data["ghpython"] + # ------------------------------ + # main object chunk (root) + + # LEGEND: + # ok :: is in bth ipy and cpy + # ?? :: cannot find it in the serialized xml or ghx + # !! :: is in ipy but not in cpy + + root.SetGuid("BaseID", GHPYTHON_SCRIPT_GUID) # ?? TODO: where this comes from? where it goes? + root.SetString("Name", prefix + data["name"]) # ok + root.SetString("NickName", data["nickname"]) # ok + root.SetString("Description", data.get("description", "")) # ok + root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"])) # ?? + root.SetString("Category", data["category"]) # ?? + root.SetString("SubCategory", data["subcategory"]) # ?? + root.SetGuid("InstanceGuid", instance_guid) # ok + root.SetByteArray("Icon", icon) # ?? + + # ------------------------------ + # this is the "Container" + ghpython_data = data["ghpython"] # this a tuple containg code and other properties + ghpython_root = GH_LooseChunk("UserObject") - ghpython_root.SetString("Description", data.get("description", "")) - ghpython_root.SetBoolean("HideOutput", ghpython_data.get("hideOutput", True)) - ghpython_root.SetBoolean("HideInput", ghpython_data.get("hideInput", True)) + + ghpython_root.SetString("Description", data.get("description", "")) # ok : this is still in container's items + ghpython_root.SetBoolean("HideOutput", ghpython_data.get("hideOutput", True)) # !! this is still in container's items + ghpython_root.SetBoolean("HideInput", ghpython_data.get("hideInput", True)) # !! this is still in container's items ghpython_root.SetBoolean( - "IsAdvancedMode", ghpython_data.get("isAdvancedMode", False) + "IsAdvancedMode", ghpython_data.get("isAdvancedMode", False) # !! this is still in container's items ) - ghpython_root.SetInt32("IconDisplay", ghpython_data.get("iconDisplay", 0)) - ghpython_root.SetString("Name", data["name"]) - ghpython_root.SetString("NickName", data["nickname"]) + ghpython_root.SetInt32("IconDisplay", ghpython_data.get("iconDisplay", 0)) # !! this is still in container's items + ghpython_root.SetString("Name", data["name"]) # ok + ghpython_root.SetString("NickName", data["nickname"]) # ok ghpython_root.SetBoolean( - "MarshalOutGuids", ghpython_data.get("marshalOutGuids", True) + "MarshalOutGuids", ghpython_data.get("marshalOutGuids", True) # **!! it changed to "MarshalGuids" in cpy ) + + # ------------------------------ + # code + + # FIXME: does not exist anymore, need a new chunk ghpython_root.SetString("CodeInput", code) + print("CodeInput", code) + # ------------------------------ + # ------------------------------ + # attributes + # paramter data TODO: why this was originally commented out? # ghpython_root.CreateChunk('Attributes') # for mf in ('Bounds', 'Pivot', 'Selected'): - params = ghpython_root.CreateChunk("ParameterData") - inputParam = ghpython_data.get("inputParameters", []) - outputParam = ghpython_data.get("outputParameters", []) - params.SetInt32("InputCount", len(inputParam)) + # ------------------------------ + # ------------------------------ + # parameters + params = ghpython_root.CreateChunk("ParameterData") # ok + inputParam = ghpython_data.get("inputParameters", []) # ok + outputParam = ghpython_data.get("outputParameters", []) # ok + + params.SetInt32("InputCount", len(inputParam)) # ok for i, _pi in enumerate(inputParam): params.SetGuid( - "InputId", i, System.Guid.Parse("84fa917c-1ed8-4db3-8be1-7bdc4a6495a2") + "InputId", i, System.Guid.Parse("08908df5-fa14-4982-9ab2-1aa0927566aa") # ok <<<<<<<<<<<< changed ) - params.SetInt32("OutputCount", len(outputParam)) + params.SetInt32("OutputCount", len(outputParam)) # ok for i, _po in enumerate(outputParam): params.SetGuid( - "OutputId", i, System.Guid.Parse("8ec86459-bf01-4409-baee-174d0d2b13d0") + "OutputId", i, System.Guid.Parse("3ede854e-c753-40eb-84cb-b48008f14fd4") # ok <<<<<<<<<<<< changed ) + # ------------------------------ + # input parameters for i, pi in enumerate(inputParam): input_instance_guid = System.Guid.NewGuid() pi_chunk = params.CreateChunk("InputParam", i) - pi_chunk.SetString("Name", pi["name"]) - pi_chunk.SetString("NickName", pi.get("nickname") or pi["name"]) - pi_chunk.SetString("Description", pi.get("description")) - pi_chunk.SetBoolean("Optional", pi.get("optional", True)) - pi_chunk.SetBoolean("AllowTreeAccess", pi.get("allowTreeAccess", True)) - pi_chunk.SetBoolean("ShowTypeHints", pi.get("showTypeHints", True)) + pi_chunk.SetString("Name", pi["name"]) # ok + pi_chunk.SetString("NickName", pi.get("nickname") or pi["name"]) # ok + pi_chunk.SetString("Description", pi.get("description")) # ok + pi_chunk.SetBoolean("Optional", pi.get("optional", True)) # ok + pi_chunk.SetBoolean("AllowTreeAccess", pi.get("allowTreeAccess", True)) # ok + pi_chunk.SetBoolean("ShowTypeHints", pi.get("showTypeHints", True)) # ok pi_chunk.SetInt32( "ScriptParamAccess", - parse_param_access(pi.get("scriptParamAccess", ACCESS["default"])), + parse_param_access(pi.get("scriptParamAccess", ACCESS["default"])), # ok ) - pi_chunk.SetInt32("SourceCount", 0) - pi_chunk.SetGuid("InstanceGuid", input_instance_guid) - pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID"))) + pi_chunk.SetInt32("SourceCount", 0) # ok + pi_chunk.SetGuid("InstanceGuid", input_instance_guid) # ok + pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID"))) # ok pi_chunk.SetInt32( "WireDisplay", - parse_wire_display(pi.get("wireDisplay", WIRE_DISPLAY["default"])), + parse_wire_display(pi.get("wireDisplay", WIRE_DISPLAY["default"])), # !! TODO: not sure if not shown by default, for test get out ) - pi_chunk.SetBoolean("ReverseData", pi.get("reverse", False)) - pi_chunk.SetBoolean("SimplifyData", pi.get("simplify", False)) + pi_chunk.SetBoolean("ReverseData", pi.get("reverse", False)) # !! TODO: not sure if not shown by default, for test get out + pi_chunk.SetBoolean("SimplifyData", pi.get("simplify", False)) # !! TODO: not sure if not shown by default, for test get out # Mutually exclusive options if pi.get("flatten", False): - pi_chunk.SetInt32("Mapping", 1) + pi_chunk.SetInt32("Mapping", 1) # !! elif pi.get("graft", False): - pi_chunk.SetInt32("Mapping", 2) + pi_chunk.SetInt32("Mapping", 2) # !! + # ------------------------------ + # output parameters for i, po in enumerate(outputParam): output_instance_guid = System.Guid.NewGuid() - po_chunk = params.CreateChunk("OutputParam", i) - po_chunk.SetString("Name", po["name"]) - po_chunk.SetString("NickName", po.get("nickname") or po["name"]) - po_chunk.SetString("Description", po.get("description")) - po_chunk.SetBoolean("Optional", po.get("optional", False)) - po_chunk.SetInt32("SourceCount", 0) - po_chunk.SetGuid("InstanceGuid", output_instance_guid) - po_chunk.SetBoolean("ReverseData", po.get("reverse", False)) - po_chunk.SetBoolean("SimplifyData", po.get("simplify", False)) + po_chunk = params.CreateChunk("OutputParam", i) # ok + po_chunk.SetString("Name", po["name"]) # ok + po_chunk.SetString("NickName", po.get("nickname") or po["name"]) # ok + po_chunk.SetString("Description", po.get("description")) # ok + po_chunk.SetBoolean("Optional", po.get("optional", False)) # ok + po_chunk.SetInt32("SourceCount", 0) # ok + po_chunk.SetGuid("InstanceGuid", output_instance_guid) # ok + po_chunk.SetBoolean("ReverseData", po.get("reverse", False)) # !! TODO: see above + po_chunk.SetBoolean("SimplifyData", po.get("simplify", False)) # !! # Mutually exclusive options if po.get("flatten", False): - po_chunk.SetInt32("Mapping", 1) + po_chunk.SetInt32("Mapping", 1) # !! elif po.get("graft", False): - po_chunk.SetInt32("Mapping", 2) + po_chunk.SetInt32("Mapping", 2) # !! + # ------------------------------ + # ------------------------------ + # Serialization + # TODO: test, get rid at merge # print(ghpython_root.Serialize_Xml()) + xml_serialized = ghpython_root.Serialize_Xml() + # save to file + with open(r"F:\compas-actions.ghpython_components\build\test.xml", "w") as f: + f.write(xml_serialized) + # ------------------------------ root.SetByteArray("Object", ghpython_root.Serialize_Binary()) System.IO.File.WriteAllBytes(target, root.Serialize_Binary()) + # ------------------------------ + if __name__ == "__main__": diff --git a/.gitignore b/.gitignore index b6e4761..6881b55 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,6 @@ dmypy.json # Pyre type checker .pyre/ + +# avoid temp folder +temp/ \ No newline at end of file From 7d7a1f94082bca1afd2b1b5dfc7cfd1a5e62097f Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Fri, 19 Jan 2024 09:38:24 +0100 Subject: [PATCH 06/35] WIP: working on deseriaization --- assets/TestUserObjectCpy.ghuser | Bin 0 -> 4412 bytes assets/componentize_old.py | 403 +++++++++++++++++++++++++ assets/deserializer.py | 55 ++++ assets/unnamed_cpy.ghx | 192 ++++++++++++ assets/unnamed_fullfile.ghx | 516 ++++++++++++++++++++++++++++++++ assets/unnamed_ipy.ghx | 210 +++++++++++++ 6 files changed, 1376 insertions(+) create mode 100644 assets/TestUserObjectCpy.ghuser create mode 100644 assets/componentize_old.py create mode 100644 assets/deserializer.py create mode 100644 assets/unnamed_cpy.ghx create mode 100644 assets/unnamed_fullfile.ghx create mode 100644 assets/unnamed_ipy.ghx diff --git a/assets/TestUserObjectCpy.ghuser b/assets/TestUserObjectCpy.ghuser new file mode 100644 index 0000000000000000000000000000000000000000..676ace230aa947c5bdefa08860e6fc85228c4340 GIT binary patch literal 4412 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 COVMZm literal 0 HcmV?d00001 diff --git a/assets/componentize_old.py b/assets/componentize_old.py new file mode 100644 index 0000000..abf5f6e --- /dev/null +++ b/assets/componentize_old.py @@ -0,0 +1,403 @@ +import argparse +import base64 +import json +import os +import re +import sys +import tempfile +import urllib.request, urllib.parse, urllib.error +import zipfile +from io import StringIO + +import clr +import System +import System.IO + +GHPYTHON_SCRIPT_GUID = System.Guid("410755b1-224a-4c1e-a407-bf32fb45ea7e") +TEMPLATE_VER = re.compile("{{version}}") +TEMPLATE_NAME = re.compile("{{name}}") +TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}") + +TYPES_MAP = dict( + none="35915213-5534-4277-81b8-1bdc9e7383d2", + ghdoc="87f87f55-5b71-41f4-8aea-21d494016f81", + float="39fbc626-7a01-46ab-a18e-ec1c0c41685b", + bool="d60527f5-b5af-4ef6-8970-5f96fe412559", + int="48d01794-d3d8-4aef-990e-127168822244", + complex="309690df-6229-4774-91bb-b1c9c0bfa54d", + str="37261734-eec7-4f50-b6a8-b8d1f3c4396b", + datetime="09bcf900-fe83-4efa-8d32-33d89f7a3e66", + guid="5325b8e1-51d7-4d36-837a-d98394626c35", + color="24b1d1a3-ab79-498c-9e44-c5b14607c4d3", + point="e1937b56-b1da-4c12-8bd8-e34ee81746ef", + vector="15a50725-e3d3-4075-9f7c-142ba5f40747", + plane="3897522d-58e9-4d60-b38c-978ddacfedd8", + interval="589748aa-e558-4dd9-976f-78e3ab91fc77", + uvinterval="74c906f3-db02-4cea-bd58-de375cb5ae73", + box="f29cb021-de79-4e63-9f04-fc8e0df5f8b6", + transform="c4b38e4c-21ff-415f-a0d1-406d282428dd", + line="f802a8cd-e699-4a94-97ea-83b5406271de", + circle="3c5409a1-3293-4181-a6fa-c24c37fc0c32", + arc="9c80ec18-b48c-41b0-bc6e-cd93d9c916aa", + polyline="66fa617b-e3e8-4480-9f1e-2c0688c1d21b", + rectangle="83da014b-a550-4bf5-89ff-16e54225bd5d", + curve="9ba89ec2-5315-435f-a621-b66c5fa2f301", + mesh="794a1f9d-21d5-4379-b987-9e8bbf433912", + surface="f4070a37-c822-410f-9057-100d2e22a22d", + subd="20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08", + brep="2ceb0405-fdfe-403d-a4d6-8786da45fb9d", + geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26", +) + +EXPOSURE = dict(valid=set([-1, 2, 4, 8, 16, 32, 64, 128]), default=2) +ACCESS = dict(valid=set([0, 1, 2]), map=dict(item=0, list=1, tree=2), default=0) +PARAM_TYPE = dict( + valid=set(TYPES_MAP.values()), map=TYPES_MAP, default=TYPES_MAP["ghdoc"] +) +WIRE_DISPLAY = dict( + valid=set([0, 1, 2]), map=dict(default=0, faint=1, hidden=2), default=0 +) + + +def fetch_ghio_lib(target_folder="temp"): + """Fetch the GH_IO.dll library from the NuGet packaging system.""" + ghio_dll = "GH_IO.dll" + filename = "lib/net48/" + ghio_dll + + response = urllib.urlopen("https://www.nuget.org/api/v2/package/Grasshopper/") + dst_file = os.path.join(target_folder, ghio_dll) + zip_file = zipfile.ZipFile(StringIO.StringIO(response.read())) + + with zip_file.open(filename, "r") as zipped_dll: + with open(dst_file, "wb") as fp: + fp.write(zipped_dll.read()) + + return dst_file + + +def find_ghio_assembly(libdir): + for root, _dirs, files in os.walk(libdir): + for basename in files: + if basename.upper() == "GH_IO.DLL": + filename = os.path.join(root, basename) + return filename + + +def bitmap_from_image_path(image_path): + with open(image_path, "rb") as imageFile: + # Ensure img_string is a string, not a bytes object + img_string = base64.b64encode(imageFile.read()) + if isinstance(img_string, bytes): + img_string = img_string.decode() + + # Now you can pass img_string to the FromBase64String method + return System.Convert.FromBase64String(img_string) + # return System.Convert.FromBase64String(img_string) + + +def validate_source_bundle(source): + icon = os.path.join(source, "icon.png") + code = os.path.join(source, "code.py") + data = os.path.join(source, "metadata.json") + + if not os.path.exists(icon): + raise ValueError( + "icon missing, make sure icon.png is present in the source bundle: {}".format( + source + ) + ) + if not os.path.exists(code): + raise ValueError( + "code missing, make sure code.py is present in the source bundle: {}".format( + source + ) + ) + if not os.path.exists(data): + raise ValueError( + "metadata missing, make sure metadata.json is present in the source bundle: {}".format( + source + ) + ) + + icon = bitmap_from_image_path(icon) + + with open(code, "r") as f: + python_code = f.read() + + with open(data, "r") as f: + data = json.load(f) + + if "exposure" not in data: + data["exposure"] = EXPOSURE["default"] + + if data["exposure"] not in EXPOSURE["valid"]: + raise ValueError( + "Invalid exposure value. Accepted values are {}".format( + sorted(EXPOSURE["valid"]) + ) + ) + + ghpython = data.get("ghpython") + sdk_mode = ghpython and ghpython.get("isAdvancedMode", False) + + if r'"""' not in python_code and sdk_mode is False: + python_code = r'"""{}"""{}{}'.format( + data.get("description", "Generated by Componentizer"), + os.linesep, + python_code, + ) + + return icon, python_code, data + + +def parse_param_access(access): + try: + access = int(access) + except ValueError: + # Maybe string? + access = ACCESS["map"].get(access) + + if access not in ACCESS["valid"]: + raise ValueError( + "Invalid param access value. Valid values are {}".format( + sorted(ACCESS["valid"]) + ) + ) + + return access + + +def parse_wire_display(wire_display): + try: + wire_display = int(wire_display) + except ValueError: + wire_display = WIRE_DISPLAY["map"].get(wire_display) + + if wire_display not in WIRE_DISPLAY["valid"]: + raise ValueError( + "Invalid wire display value. Valid values are {}".format( + sorted(WIRE_DISPLAY["valid"]) + ) + ) + + return wire_display + + +def parse_param_type_hint(type_hint_id): + type_hint_id = type_hint_id or PARAM_TYPE["default"] + + if type_hint_id in TYPES_MAP: + type_hint_id = TYPES_MAP[type_hint_id] + + if type_hint_id not in PARAM_TYPE["valid"]: + raise ValueError( + 'Invalid param type hint ID ("{}"). Valid values are {}'.format( + type_hint_id, sorted(PARAM_TYPE["valid"]) + ) + ) + + try: + type_hint_id = System.Guid.Parse(type_hint_id) + except SystemError: + raise ValueError("Unable to parse type hint ID: {}".format(type_hint_id)) + + return type_hint_id + + +def replace_templates(code, version, name, ghuser_name): + if version: + code = TEMPLATE_VER.sub(version, code) + + code = TEMPLATE_NAME.sub(name, code) + code = TEMPLATE_GHUSER_NAME.sub(ghuser_name, code) + + return code + + +def create_ghuser_component(source, target, version=None, prefix=None): + from GH_IO.Serialization import GH_LooseChunk + + icon, code, data = validate_source_bundle(source) + + code = replace_templates(code, version, data["name"], os.path.basename(target)) + + instance_guid = data.get("instanceGuid") + if not instance_guid: + instance_guid = System.Guid.NewGuid() + else: + instance_guid = System.Guid.Parse(instance_guid) + + prefix = prefix or "" + + root = GH_LooseChunk("UserObject") + + root.SetGuid("BaseID", GHPYTHON_SCRIPT_GUID) + root.SetString("Name", prefix + data["name"]) + root.SetString("NickName", data["nickname"]) + root.SetString("Description", data.get("description", "")) + root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"])) + root.SetString("Category", data["category"]) + root.SetString("SubCategory", data["subcategory"]) + root.SetGuid("InstanceGuid", instance_guid) + root.SetByteArray("Icon", icon) + + ghpython_data = data["ghpython"] + ghpython_root = GH_LooseChunk("UserObject") + ghpython_root.SetString("Description", data.get("description", "")) + ghpython_root.SetBoolean("HideOutput", ghpython_data.get("hideOutput", True)) + ghpython_root.SetBoolean("HideInput", ghpython_data.get("hideInput", True)) + ghpython_root.SetBoolean( + "IsAdvancedMode", ghpython_data.get("isAdvancedMode", False) + ) + ghpython_root.SetInt32("IconDisplay", ghpython_data.get("iconDisplay", 0)) + ghpython_root.SetString("Name", data["name"]) + ghpython_root.SetString("NickName", data["nickname"]) + ghpython_root.SetBoolean( + "MarshalOutGuids", ghpython_data.get("marshalOutGuids", True) + ) + ghpython_root.SetString("CodeInput", code) + + # ghpython_root.CreateChunk('Attributes') + # for mf in ('Bounds', 'Pivot', 'Selected'): + params = ghpython_root.CreateChunk("ParameterData") + inputParam = ghpython_data.get("inputParameters", []) + outputParam = ghpython_data.get("outputParameters", []) + + params.SetInt32("InputCount", len(inputParam)) + for i, _pi in enumerate(inputParam): + params.SetGuid( + "InputId", i, System.Guid.Parse("84fa917c-1ed8-4db3-8be1-7bdc4a6495a2") + ) + params.SetInt32("OutputCount", len(outputParam)) + for i, _po in enumerate(outputParam): + params.SetGuid( + "OutputId", i, System.Guid.Parse("8ec86459-bf01-4409-baee-174d0d2b13d0") + ) + + for i, pi in enumerate(inputParam): + input_instance_guid = System.Guid.NewGuid() + pi_chunk = params.CreateChunk("InputParam", i) + pi_chunk.SetString("Name", pi["name"]) + pi_chunk.SetString("NickName", pi.get("nickname") or pi["name"]) + pi_chunk.SetString("Description", pi.get("description")) + pi_chunk.SetBoolean("Optional", pi.get("optional", True)) + pi_chunk.SetBoolean("AllowTreeAccess", pi.get("allowTreeAccess", True)) + pi_chunk.SetBoolean("ShowTypeHints", pi.get("showTypeHints", True)) + pi_chunk.SetInt32( + "ScriptParamAccess", + parse_param_access(pi.get("scriptParamAccess", ACCESS["default"])), + ) + pi_chunk.SetInt32("SourceCount", 0) + pi_chunk.SetGuid("InstanceGuid", input_instance_guid) + pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID"))) + pi_chunk.SetInt32( + "WireDisplay", + parse_wire_display(pi.get("wireDisplay", WIRE_DISPLAY["default"])), + ) + pi_chunk.SetBoolean("ReverseData", pi.get("reverse", False)) + pi_chunk.SetBoolean("SimplifyData", pi.get("simplify", False)) + # Mutually exclusive options + if pi.get("flatten", False): + pi_chunk.SetInt32("Mapping", 1) + elif pi.get("graft", False): + pi_chunk.SetInt32("Mapping", 2) + + for i, po in enumerate(outputParam): + output_instance_guid = System.Guid.NewGuid() + po_chunk = params.CreateChunk("OutputParam", i) + po_chunk.SetString("Name", po["name"]) + po_chunk.SetString("NickName", po.get("nickname") or po["name"]) + po_chunk.SetString("Description", po.get("description")) + po_chunk.SetBoolean("Optional", po.get("optional", False)) + po_chunk.SetInt32("SourceCount", 0) + po_chunk.SetGuid("InstanceGuid", output_instance_guid) + po_chunk.SetBoolean("ReverseData", po.get("reverse", False)) + po_chunk.SetBoolean("SimplifyData", po.get("simplify", False)) + # Mutually exclusive options + if po.get("flatten", False): + po_chunk.SetInt32("Mapping", 1) + elif po.get("graft", False): + po_chunk.SetInt32("Mapping", 2) + + # print(ghpython_root.Serialize_Xml()) + + root.SetByteArray("Object", ghpython_root.Serialize_Binary()) + + System.IO.File.WriteAllBytes(target, root.Serialize_Binary()) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Create GHUser components out of python code." + ) + parser.add_argument( + "source", + type=str, + help="Source directory where code for all components is stored", + ) + parser.add_argument("target", type=str, help="Target directory for ghuser files") + parser.add_argument( + "--ghio", + type=str, + required=False, + help="Folder where the GH_IO.dll assembly is located. Defaults to ./lib", + ) + parser.add_argument( + "--version", type=str, required=False, help="Version to tag components" + ) + parser.add_argument( + "--prefix", + type=str, + required=False, + help="Add this prefix to the name of each generated component", + ) + args = parser.parse_args() + + sourcedir = args.source + if not os.path.isabs(sourcedir): + sourcedir = os.path.abspath(sourcedir) + + targetdir = args.target + if not os.path.isabs(targetdir): + targetdir = os.path.abspath(targetdir) + + if args.ghio is None: + libdir = tempfile.mkdtemp("ghio") + fetch_ghio_lib(libdir) + else: + libdir = os.path.abspath(args.ghio) + gh_io = find_ghio_assembly(libdir) + source_bundles = [ + d + for d in os.listdir(sourcedir) + if os.path.isdir(os.path.join(sourcedir, d)) + and d not in ("__pycache__", ".git") + ] + + print("GHPython componentizer") + print("======================") + + print("[x] Source: {} ({} components)".format(sourcedir, len(source_bundles))) + print("[ ] Target: {}\r".format(targetdir), end="") + if not os.path.exists(targetdir): + os.mkdir(targetdir) + print("[x]") + + # print("[ ] GH_IO assembly: {}\r".format(gh_io or args.ghio), end="") + if not gh_io: + print("[-] Cannot find GH_IO Assembly! Aborting.") + sys.exit(-1) + + gh_io = os.path.abspath(gh_io) + gh_io = gh_io[:-4] + clr.AddReference(gh_io) + + print("[x] GH_IO assembly: {}".format(gh_io)) + + print("Processing component bundles:") + for d in source_bundles: + source = os.path.join(sourcedir, d) + target = os.path.join(targetdir, d + ".ghuser") + print(" [ ] {}\r".format(d), end="") + create_ghuser_component(source, target, args.version, args.prefix) + print(" [x] {} => {}".format(d, target)) \ No newline at end of file diff --git a/assets/deserializer.py b/assets/deserializer.py new file mode 100644 index 0000000..85e15d7 --- /dev/null +++ b/assets/deserializer.py @@ -0,0 +1,55 @@ +import argparse +import base64 +import json +import os +import re +import sys +import tempfile +import urllib.request, urllib.parse, urllib.error +import zipfile +from io import StringIO + +import clr +import System +import System.IO + + + + +def main(): + from GH_IO.Serialization import GH_LooseChunk + ghuser_path : str = r"F:\compas-actions.ghpython_components\temp\TestUserObjectCpy.ghuser" + + deserialized_data = GH_LooseChunk("UserObject") + + data_bytes = System.IO.File.ReadAllBytes(ghuser_path) + + # get if the data_bytes is empty + if data_bytes: + deserialized_data.Deserialize_Binary(data_bytes) + else: + deserialized_data = None + print("No data found in file") + + deserialized_data.Deserialize_Binary(data_bytes) + + # convert to xml + xml = deserialized_data.Serialize_Xml() + + print(xml) + + + + + + +if "__main__" == __name__: + + gh_io : str = r"C:\Users\andre\.nuget\packages\grasshopper\8.0.23164.14305-wip\lib\net48\GH_IO.dll" + gh_io = os.path.abspath(gh_io) + gh_io = gh_io[:-4] + clr.AddReference(gh_io) + + + + main() \ No newline at end of file diff --git a/assets/unnamed_cpy.ghx b/assets/unnamed_cpy.ghx new file mode 100644 index 0000000..2672b85 --- /dev/null +++ b/assets/unnamed_cpy.ghx @@ -0,0 +1,192 @@ + + + c9b2d725-6f87-4b07-af90-bd9aefef68eb + 066d0a87-236f-4eae-a0f4-9e42f5327962 + Script + + + + + Scripting component + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQdSURBVEhL3ZRbTJtlHMbxwmTGxCjRMONkbkx0Y0P6tf3aDhgCkwyXbcTordELl6gcC4NxGitgvFiM0ZuFHiiHcj5LCwgUWuuQOdyBEVd1rjB3p3HgIcRo/o//9/s+IFzWmJj4JP+0Td739z553udtzH8q6d3mQ7oCh1OX7wjrCpw/pxS6/tIVun+UrJ6w3tphl0t79mhLo5eUb09n8P2UfGcTg1el4hZIxa1gMPSlXTCU98FQ1vOHVDXwpLYlOqUUOBqEe/FdKmxx6a0ehntgONOrwnmMlcMwnB2uUzZEK12By87O13VFrV7J2rm+4dpYMQDj2SGeQchVo5BrvB5tS3SSClrKpOL2gFTaydMV0Jf1BhgeMJQP/Cmcy9UMrx3nA8ajO0BvbXrcYG1+2mDt2j7VQ+pUDv8k1/hgYripbhImm99DK3kJPE5aPlFOSzmxGmq7+EJf4YZclkraoC/r4unmvHtgqOhXI6kcYbdjCliu5U+Gm20zMNXPeuhengV3TgDf5gJLR1exmPaYhlUlHEuFzb9JJe1qQwRYuUgBF1l/osEnVOfnpxk+qxxgbgi66Pvj6QgfA25mA1czQPOHqzS0Kq6fU3W80RAGi8sUrkXWm5FMqc7rA7A0BGFpDMHUGMqlcM7buJEFLBwBvrCAgoY5Da1KX9p5fdO10pJBGIXrjTiEc4abz/sZPquAzY2hdUtDyHF37tVYupZ5B1+mAXNmIGAATSbfB2Ie0PAc0Zne31UwZ10lsvbBWDu2bKr79PTrH3ky3SONr7m9Yt5Xh38vXXoji24e/QBXj6zicioQkoEZCZhMBrwHAPfuHRqeD6jo/0FxrMVhrPatZ703EsfNuMDzC+7mQZmVU8Dt41DyXuS8v1IjwWdGwK8DJg4Bo8+DBvZ9p6FV8Wuclqu9ataieucmXVjJS9sEi1k+yS15Gfg6B7ieCVxJVyMJMnzqBWD8IDDyHNCfAHTFt2hoVaYaX9HGJZq5ISbbdC47/3gTHuEKfqNUELj2IpS8LzF8Vq9GMpYEDCcCfXuBznhQW9xBDa3KXNLzkHxu4p5ygM0Pi20mm1ZO2RX4RiRcQVrIIJpPJQrKRH6JaCKZaPQA0WAiUfczRO27bpEr7k0Nu11y3dgjJtvMO+b6YFtqfSiJInyAgItIuIJ0Jf1Xbem/Iwofs2PpJTUSkTdHQgF9hKaSI+RLitBIYoT6EiLUEf+htiU60WK2XbxKpYKfm7byHt0PGkpco569DurYtUYtO//Zvynn/RbmD3MFud9+7ve4qOB+YPBZUPduu7LGvdNBTbFFyoZohdmMHfzkb2E6ZauCA/tEBUGtT62RM85BF2Nv0IW4h7Ut0QsL+gf5VZ6m4UQf9e25zZGscyRhsj/hpYuP5sMds/Va/6eKifkb1QMSMlhsgFAAAAAASUVORK5CYII= + + 1d7e8eb9-8214-4016-8b53-2821a2ad5c7e + true + Script + S + + false + false + true + + + + + + 33 + 83 + 134 + 44 + + + 124 + 105 + + + + + + 2 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 2 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 08908df5-fa14-4982-9ab2-1aa0927566aa + + + + + true + No conversion + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + eb160794-2ba0-4d2c-80fc-6e99cc683047 + + compasnew_x + true + 0 + true + 0 + 6a184b65-baa3-42d1-a548-3915b401de53 + + + + + + 35 + 85 + 74 + 20 + + + 73.5 + 95 + + + + + + + + true + No conversion + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + 75bfb3d0-3f57-4470-965d-079319d0ff9f + y + y + true + 0 + true + 0 + 6a184b65-baa3-42d1-a548-3915b401de53 + + + + + + 35 + 105 + 74 + 20 + + + 73.5 + 115 + + + + + + + + The execution information, as output and error streams + 19be98d8-069e-4240-b172-af9cb83b8dc0 + out + out + false + 0 + + + + + + 139 + 85 + 26 + 20 + + + 152 + 95 + + + + + + + + false + No conversion + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + 0d6f139a-f87b-46ce-b5ea-9b0b0c8e5c61 + a + a + false + 0 + true + 0 + 6a184b65-baa3-42d1-a548-3915b401de53 + + + + + + 139 + 105 + 26 + 20 + + + 152 + 115 + + + + + + + + + + IiIiVGhpcyBpcyBhIG5ldyBzY3JpcHQgaW5zdGFuY2UiIiINCmltcG9ydCBTeXN0ZW0NCmltcG9ydCBSaGlubw0KaW1wb3J0IEdyYXNzaG9wcGVyDQoNCmltcG9ydCByaGlub3NjcmlwdHN5bnRheCBhcyBycw0KDQoNCmNsYXNzIE15Q29tcG9uZW50KEdyYXNzaG9wcGVyLktlcm5lbC5HSF9TY3JpcHRJbnN0YW5jZSk6DQogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBjb21wYXNuZXdfeCwgeSk6DQogICAgICAgICIiIkdyYXNzaG9wcGVyIFNjcmlwdCBjb21wYXMgYWN0aW9uIiIiDQogICAgICAgIGEgPSAiSGVsbG8gUHl0aG9uIDMgaW4gR3Jhc3Nob3BwZXIhIg0KICAgICAgICBwcmludChhKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuDQo= + S + + + + + mcneel.pythonnet.python + 3.9.10 + + + + + + + + \ No newline at end of file diff --git a/assets/unnamed_fullfile.ghx b/assets/unnamed_fullfile.ghx new file mode 100644 index 0000000..5f1beaf --- /dev/null +++ b/assets/unnamed_fullfile.ghx @@ -0,0 +1,516 @@ + + + + + + + + 0 + 2 + 2 + + + + + + + 1 + 0 + 7 + + + + + + cfdd9c76-c721-4e43-b0f7-236cc4a885cb + Shaded + 1 + + 100;255;0;0 + + + 100;0;150;0 + + + + + + 638411238108069159 + + false + unnamed.ghx + + + + + 0 + + + + + + 87 + 224 + + 1.5 + + + + + 0 + + + + + + + 0 + + + + + 2 + + + + + RhinoCodePluginGH, Version=8.2.23346.13001, Culture=neutral, PublicKeyToken=552281e97c755530 + 8.2.23346.13001 + + 066d0a87-236f-4eae-a0f4-9e42f5327962 + RhinoCodePluginGH + + + + + + GhPython, Version=8.2.23346.13001, Culture=neutral, PublicKeyToken=null + 8.2.23346.13001 + + 00000000-0000-0000-0000-000000000000 + + + + + + + + + 2 + + + + + c9b2d725-6f87-4b07-af90-bd9aefef68eb + 066d0a87-236f-4eae-a0f4-9e42f5327962 + Script + + + + + Scripting component + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQdSURBVEhL3ZRbTJtlHMbxwmTGxCjRMONkbkx0Y0P6tf3aDhgCkwyXbcTordELl6gcC4NxGitgvFiM0ZuFHiiHcj5LCwgUWuuQOdyBEVd1rjB3p3HgIcRo/o//9/s+IFzWmJj4JP+0Td739z553udtzH8q6d3mQ7oCh1OX7wjrCpw/pxS6/tIVun+UrJ6w3tphl0t79mhLo5eUb09n8P2UfGcTg1el4hZIxa1gMPSlXTCU98FQ1vOHVDXwpLYlOqUUOBqEe/FdKmxx6a0ehntgONOrwnmMlcMwnB2uUzZEK12By87O13VFrV7J2rm+4dpYMQDj2SGeQchVo5BrvB5tS3SSClrKpOL2gFTaydMV0Jf1BhgeMJQP/Cmcy9UMrx3nA8ajO0BvbXrcYG1+2mDt2j7VQ+pUDv8k1/hgYripbhImm99DK3kJPE5aPlFOSzmxGmq7+EJf4YZclkraoC/r4unmvHtgqOhXI6kcYbdjCliu5U+Gm20zMNXPeuhengV3TgDf5gJLR1exmPaYhlUlHEuFzb9JJe1qQwRYuUgBF1l/osEnVOfnpxk+qxxgbgi66Pvj6QgfA25mA1czQPOHqzS0Kq6fU3W80RAGi8sUrkXWm5FMqc7rA7A0BGFpDMHUGMqlcM7buJEFLBwBvrCAgoY5Da1KX9p5fdO10pJBGIXrjTiEc4abz/sZPquAzY2hdUtDyHF37tVYupZ5B1+mAXNmIGAATSbfB2Ie0PAc0Zne31UwZ10lsvbBWDu2bKr79PTrH3ky3SONr7m9Yt5Xh38vXXoji24e/QBXj6zicioQkoEZCZhMBrwHAPfuHRqeD6jo/0FxrMVhrPatZ703EsfNuMDzC+7mQZmVU8Dt41DyXuS8v1IjwWdGwK8DJg4Bo8+DBvZ9p6FV8Wuclqu9ataieucmXVjJS9sEi1k+yS15Gfg6B7ieCVxJVyMJMnzqBWD8IDDyHNCfAHTFt2hoVaYaX9HGJZq5ISbbdC47/3gTHuEKfqNUELj2IpS8LzF8Vq9GMpYEDCcCfXuBznhQW9xBDa3KXNLzkHxu4p5ygM0Pi20mm1ZO2RX4RiRcQVrIIJpPJQrKRH6JaCKZaPQA0WAiUfczRO27bpEr7k0Nu11y3dgjJtvMO+b6YFtqfSiJInyAgItIuIJ0Jf1Xbem/Iwofs2PpJTUSkTdHQgF9hKaSI+RLitBIYoT6EiLUEf+htiU60WK2XbxKpYKfm7byHt0PGkpco569DurYtUYtO//Zvynn/RbmD3MFud9+7ve4qOB+YPBZUPduu7LGvdNBTbFFyoZohdmMHfzkb2E6ZauCA/tEBUGtT62RM85BF2Nv0IW4h7Ut0QsL+gf5VZ6m4UQf9e25zZGscyRhsj/hpYuP5sMds/Va/6eKifkb1QMSMlhsgFAAAAAASUVORK5CYII= + + 1d7e8eb9-8214-4016-8b53-2821a2ad5c7e + true + Script + S + + false + false + true + + + + + + 33 + 83 + 134 + 44 + + + 124 + 105 + + + + + + 2 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 2 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 08908df5-fa14-4982-9ab2-1aa0927566aa + + + + + true + No conversion + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + eb160794-2ba0-4d2c-80fc-6e99cc683047 + + compasnew_x + true + 0 + true + 0 + 6a184b65-baa3-42d1-a548-3915b401de53 + + + + + + 35 + 85 + 74 + 20 + + + 73.5 + 95 + + + + + + + + true + No conversion + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + 75bfb3d0-3f57-4470-965d-079319d0ff9f + y + y + true + 0 + true + 0 + 6a184b65-baa3-42d1-a548-3915b401de53 + + + + + + 35 + 105 + 74 + 20 + + + 73.5 + 115 + + + + + + + + The execution information, as output and error streams + 19be98d8-069e-4240-b172-af9cb83b8dc0 + out + out + false + 0 + + + + + + 139 + 85 + 26 + 20 + + + 152 + 95 + + + + + + + + false + No conversion + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + 0d6f139a-f87b-46ce-b5ea-9b0b0c8e5c61 + a + a + false + 0 + true + 0 + 6a184b65-baa3-42d1-a548-3915b401de53 + + + + + + 139 + 105 + 26 + 20 + + + 152 + 115 + + + + + + + + + + IiIiVGhpcyBpcyBhIG5ldyBzY3JpcHQgaW5zdGFuY2UiIiINCmltcG9ydCBTeXN0ZW0NCmltcG9ydCBSaGlubw0KaW1wb3J0IEdyYXNzaG9wcGVyDQoNCmltcG9ydCByaGlub3NjcmlwdHN5bnRheCBhcyBycw0KDQoNCmNsYXNzIE15Q29tcG9uZW50KEdyYXNzaG9wcGVyLktlcm5lbC5HSF9TY3JpcHRJbnN0YW5jZSk6DQogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBjb21wYXNuZXdfeCwgeSk6DQogICAgICAgICIiIkdyYXNzaG9wcGVyIFNjcmlwdCBjb21wYXMgYWN0aW9uIiIiDQogICAgICAgIGEgPSAiSGVsbG8gUHl0aG9uIDMgaW4gR3Jhc3Nob3BwZXIhIg0KICAgICAgICBwcmludChhKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuDQo= + S + + + + + mcneel.pythonnet.python + 3.9.10 + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Kitchen sink component example + + + + + """ +Do something silly. + +This component does nothing useful, it's only a kitchen sink example showing most available options. + + Args: + x: X value + y: Y value + z: Z value + Returns: + result: The sum of all three values. +""" +from ghpythonlib.componentbase import executingcomponent as component + + +class KitchenSinkComponent(component): + def RunScript(self, x, y, z): + self.Message = 'COMPONENT v{{version}}' + return x + y + z + + Do something silly. +This component does nothing useful, it's only a kitchen sink example showing most available options. + + 342 + 342 + + + 925 + 1079 + + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAALiIAAC4iAari3ZIAAAPpSURBVEhLtVVpT5RnFDWxppEmAl202iX9UGtq6hZtbdqaVFuXD/0DNG0NsVarxGgTm9bE1NRYht1AhRGXYiX9ZqwOYmsiMAvLzADixjBDHGZQQBClMwwwGxzPfZlhVoof9CQX7vs8997zvs8995lZAJ6pKX9eLzRMa6/m659PV2k/T1Vpf3o5V/eHmPhpKu2mBfn6lGQ5Yk9EwOIpqdnajFfydBdWHzfZN1de84qtLjfZ5+fpNanZdd8wZm6y3BkJ+JZfv1fa1JlX70Rzrxu+4DhDJ+EPTqC1z42ixm4sKzN28mu+jc9nWHKC1woNs5lQvOtSB/o9PqmnYMQfxN5/bJB1jy8YWgUGR/3Yx3XmqJk7M8GLOdriw7ouyY3B7QEPUo7UYe6RWtzs94RWI8jll7JX6v8lSM/RZezQdEh8Aoz3XHi7uAHvlDTC1OMKrcZCctNztJnTEaQsKjA4lvzeiN/0Dnh4JNHYfPYaKm/cxyXbIDbRn5gIbRBe9ie/wYnFJQ1YWKDvZa1ULkcIRAk8wwxp6NnrfeAzlh5rgsb6AFLnvGUAn1a00JvEutMtONPWq/hCuFJtAiWLCq5JDdbK4laEgGe3gVK82NY3LDlK437414Y15Wa4fAGsYgE5ojBaqKoVaiMejgawosyIrGorBeFX9rqGxvBGkaGaboSAWv+Z2u7yUX7RGAuMs3kObLtogW1wBHddXvQN++D4b4wv0IkDV+9gOEpRgnGW+OhUs5VuhECmc0tlm1cCotHj9mIxG3ufcv1OY8FbR+uVRm8n4YMRP5aw4UIYDw6jk/8iBC/l6ipIkBC59Xw7DtbcUXxp+hd/XcdnZ1qn5kAa++W5W4ofjS3xBDyiA2vKTQ6Z0DBqux7hk9PNCEbJpaChGyoqLBofnDCjio0OQ8ITjohN3si7pfpG/2STs1mEx4Zfau2QNWm+mAyYWPhZ9g7V2cETUGIFTvbnzaL6y3QjBJTlC/Oy67YWG+9KDJZTGc/9WkMVmbC+onXKeLby+TFr7/ML5hyuAe8tJbfMfA+stZduhEAGTWZhWWmT0+UNwNzjhsrgwKOxgORMoYNKaueVEQ034+Wa0DmHFNWtPWke4EykcSuWQIwDkikX13TYdsGCr87dDj0l4scrneAt/L3U4mMiQYjkuLxRMuys6kDm3+2hp1iU8mhYvDJch0vJCeTKparUey5b4Y4bomQEIt/9k2/+5xNd12Fjwva1J8zdhfxRsT0c5YRO8LfAqhyT+PahUZRQFB+eNPcwdnd8/owEYgvy9POoiCzeLZqPTzVbeAE63j3W6BCfUqwStTAmLVluDMGztKSLT88w6zFUynsImAaGxQAAAABJRU5ErkJggg== + + false + 012ecff8-abad-4d60-a6e1-4ffa79e66b93 + true + true + Kitchen sink component example + Everything + + + + + + 53 + 182 + 173 + 64 + + + 156 + 214 + + true + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + X value + 9ee5242a-881b-4d88-bf62-0ec3cb2650d1 + x + compasold_x + true + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + 1 + + + + + + 55 + 184 + 86 + 20 + + + 107.5 + 194 + + true + + + + + + + true + Y value + abb8246c-4353-4d67-ab37-944eb9d708a5 + y + y + true + 0 + true + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 55 + 204 + 86 + 20 + + + 107.5 + 214 + + true + + + + + + + true + Z value + 23bdcf15-b128-43b9-83b9-b88b280a0594 + 1 + z + z + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + 1 + + + + + + 55 + 224 + 86 + 20 + + + 107.5 + 234 + + true + + + + + + + The sum of all three values. + 99dd5a96-0a5c-4eab-b6e3-307974766460 + 2 + result + result + false + 0 + + + + + + 171 + 184 + 53 + 60 + + + 189.5 + 214 + + true + + + + + + + + + + + + + + + + + + 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 + + + + + \ No newline at end of file diff --git a/assets/unnamed_ipy.ghx b/assets/unnamed_ipy.ghx new file mode 100644 index 0000000..b0c1067 --- /dev/null +++ b/assets/unnamed_ipy.ghx @@ -0,0 +1,210 @@ + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Kitchen sink component example + + + + + """ +Do something silly. + +This component does nothing useful, it's only a kitchen sink example showing most available options. + +Args: +x: X value +y: Y value +z: Z value +Returns: +result: The sum of all three values. +""" +from ghpythonlib.componentbase import executingcomponent as component + + +class KitchenSinkComponent(component): +def RunScript(self, x, y, z): +self.Message = 'COMPONENT v{{version}}' +return x + y + z + + Do something silly. +This component does nothing useful, it's only a kitchen sink example showing most available options. + + 342 + 342 + + + 925 + 1079 + + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAALiIAAC4iAari3ZIAAAPpSURBVEhLtVVpT5RnFDWxppEmAl202iX9UGtq6hZtbdqaVFuXD/0DNG0NsVarxGgTm9bE1NRYht1AhRGXYiX9ZqwOYmsiMAvLzADixjBDHGZQQBClMwwwGxzPfZlhVoof9CQX7vs8997zvs8995lZAJ6pKX9eLzRMa6/m659PV2k/T1Vpf3o5V/eHmPhpKu2mBfn6lGQ5Yk9EwOIpqdnajFfydBdWHzfZN1de84qtLjfZ5+fpNanZdd8wZm6y3BkJ+JZfv1fa1JlX70Rzrxu+4DhDJ+EPTqC1z42ixm4sKzN28mu+jc9nWHKC1woNs5lQvOtSB/o9PqmnYMQfxN5/bJB1jy8YWgUGR/3Yx3XmqJk7M8GLOdriw7ouyY3B7QEPUo7UYe6RWtzs94RWI8jll7JX6v8lSM/RZezQdEh8Aoz3XHi7uAHvlDTC1OMKrcZCctNztJnTEaQsKjA4lvzeiN/0Dnh4JNHYfPYaKm/cxyXbIDbRn5gIbRBe9ie/wYnFJQ1YWKDvZa1ULkcIRAk8wwxp6NnrfeAzlh5rgsb6AFLnvGUAn1a00JvEutMtONPWq/hCuFJtAiWLCq5JDdbK4laEgGe3gVK82NY3LDlK437414Y15Wa4fAGsYgE5ojBaqKoVaiMejgawosyIrGorBeFX9rqGxvBGkaGaboSAWv+Z2u7yUX7RGAuMs3kObLtogW1wBHddXvQN++D4b4wv0IkDV+9gOEpRgnGW+OhUs5VuhECmc0tlm1cCotHj9mIxG3ufcv1OY8FbR+uVRm8n4YMRP5aw4UIYDw6jk/8iBC/l6ipIkBC59Xw7DtbcUXxp+hd/XcdnZ1qn5kAa++W5W4ofjS3xBDyiA2vKTQ6Z0DBqux7hk9PNCEbJpaChGyoqLBofnDCjio0OQ8ITjohN3si7pfpG/2STs1mEx4Zfau2QNWm+mAyYWPhZ9g7V2cETUGIFTvbnzaL6y3QjBJTlC/Oy67YWG+9KDJZTGc/9WkMVmbC+onXKeLby+TFr7/ML5hyuAe8tJbfMfA+stZduhEAGTWZhWWmT0+UNwNzjhsrgwKOxgORMoYNKaueVEQ034+Wa0DmHFNWtPWke4EykcSuWQIwDkikX13TYdsGCr87dDj0l4scrneAt/L3U4mMiQYjkuLxRMuys6kDm3+2hp1iU8mhYvDJch0vJCeTKparUey5b4Y4bomQEIt/9k2/+5xNd12Fjwva1J8zdhfxRsT0c5YRO8LfAqhyT+PahUZRQFB+eNPcwdnd8/owEYgvy9POoiCzeLZqPTzVbeAE63j3W6BCfUqwStTAmLVluDMGztKSLT88w6zFUynsImAaGxQAAAABJRU5ErkJggg== + + false + 012ecff8-abad-4d60-a6e1-4ffa79e66b93 + true + true + Kitchen sink component example + Everything + + + + + + 53 + 182 + 173 + 64 + + + 156 + 214 + + true + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + X value + 9ee5242a-881b-4d88-bf62-0ec3cb2650d1 + x + compasold_x + true + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + 1 + + + + + + 55 + 184 + 86 + 20 + + + 107.5 + 194 + + true + + + + + + + true + Y value + abb8246c-4353-4d67-ab37-944eb9d708a5 + y + y + true + 0 + true + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 55 + 204 + 86 + 20 + + + 107.5 + 214 + + true + + + + + + + true + Z value + 23bdcf15-b128-43b9-83b9-b88b280a0594 + 1 + z + z + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + 1 + + + + + + 55 + 224 + 86 + 20 + + + 107.5 + 234 + + true + + + + + + + The sum of all three values. + 99dd5a96-0a5c-4eab-b6e3-307974766460 + 2 + result + result + false + 0 + + + + + + 171 + 184 + 53 + 60 + + + 189.5 + 214 + + true + + + + + + + + + + \ No newline at end of file From 80900a4948efa8ce0593585b24f1fe48f5dc9997 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Fri, 19 Jan 2024 09:39:08 +0100 Subject: [PATCH 07/35] WIP: test commit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 151fa1f..ac88481 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +# TOERASE-TEST # GHPython Componentizer > A github action to make Grasshopper development 164% [1] version-control friendlier and 82% more pleasant. From f42fba7997240c4c04723adc41b8f70966a65b1a Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Fri, 19 Jan 2024 09:40:44 +0100 Subject: [PATCH 08/35] FIX: got rid of test in readme --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index ac88481..151fa1f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -# TOERASE-TEST # GHPython Componentizer > A github action to make Grasshopper development 164% [1] version-control friendlier and 82% more pleasant. From dd0d6300ab944095ab058e41f439ef2b668d0a63 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Fri, 19 Jan 2024 10:53:44 +0100 Subject: [PATCH 09/35] WIP: compilationg works but component is C#, why? --- .../ghpython-components/componentize.py | 71 ++++++++++++------ .../deserialized_exo/TestUserObjectCpy.ghuser | Bin 0 -> 4412 bytes .../deserialized_exo/Test_KitchenSink.ghuser | Bin 0 -> 3142 bytes .../deserialized_TestUserObjectCpy.xml | 18 +++++ ...eserialized_Test_KitchenSinkghuser_ipy.xml | 18 +++++ assets/deserializer.py | 9 +-- 6 files changed, 87 insertions(+), 29 deletions(-) create mode 100644 assets/deserialized_exo/TestUserObjectCpy.ghuser create mode 100644 assets/deserialized_exo/Test_KitchenSink.ghuser create mode 100644 assets/deserialized_exo/deserialized_TestUserObjectCpy.xml create mode 100644 assets/deserialized_exo/deserialized_Test_KitchenSinkghuser_ipy.xml diff --git a/.github/actions/ghpython-components/componentize.py b/.github/actions/ghpython-components/componentize.py index 8535ced..fb9bf41 100644 --- a/.github/actions/ghpython-components/componentize.py +++ b/.github/actions/ghpython-components/componentize.py @@ -14,6 +14,7 @@ import System.IO GHPYTHON_SCRIPT_GUID = System.Guid("c9b2d725-6f87-4b07-af90-bd9aefef68eb") # <<<<<<<<<<<< changed +# GHPYTHON_SCRIPT_LIB = System.Guid("066d0a87-236f-4eae-a0f4-9e42f5327962") # ?? test unsure # <<<<<<<<<<<< changed TODO: to verify if it changes anything in py anc c# TEMPLATE_VER = re.compile("{{version}}") TEMPLATE_NAME = re.compile("{{name}}") TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}") @@ -245,13 +246,15 @@ def create_ghuser_component(source, target, version=None, prefix=None): # ?? :: cannot find it in the serialized xml or ghx # !! :: is in ipy but not in cpy - root.SetGuid("BaseID", GHPYTHON_SCRIPT_GUID) # ?? TODO: where this comes from? where it goes? + # this is the ghuser domain + root.SetGuid("BaseID", GHPYTHON_SCRIPT_GUID) # ok + # root.SetGuid("LibID", GHPYTHON_SCRIPT_LIB) # ?? test unsure root.SetString("Name", prefix + data["name"]) # ok root.SetString("NickName", data["nickname"]) # ok root.SetString("Description", data.get("description", "")) # ok - root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"])) # ?? - root.SetString("Category", data["category"]) # ?? - root.SetString("SubCategory", data["subcategory"]) # ?? + root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"])) # ok + root.SetString("Category", data["category"]) # ok + root.SetString("SubCategory", data["subcategory"]) # ok root.SetGuid("InstanceGuid", instance_guid) # ok root.SetByteArray("Icon", icon) # ?? @@ -262,24 +265,28 @@ def create_ghuser_component(source, target, version=None, prefix=None): ghpython_root = GH_LooseChunk("UserObject") ghpython_root.SetString("Description", data.get("description", "")) # ok : this is still in container's items - ghpython_root.SetBoolean("HideOutput", ghpython_data.get("hideOutput", True)) # !! this is still in container's items - ghpython_root.SetBoolean("HideInput", ghpython_data.get("hideInput", True)) # !! this is still in container's items - ghpython_root.SetBoolean( - "IsAdvancedMode", ghpython_data.get("isAdvancedMode", False) # !! this is still in container's items - ) - ghpython_root.SetInt32("IconDisplay", ghpython_data.get("iconDisplay", 0)) # !! this is still in container's items + + # ghpython_root.SetString("ToolTip", "this is an example of tooltip") # <<<<<<<<<<<< added FIXME: might not working + ghpython_root.SetBoolean("UsingLibraryInputParam", False) # <<<<<<<<<<<< added (default might stay) + ghpython_root.SetBoolean("UsingScriptInputParam", False) # <<<<<<<<<<<< added (default might stay) + ghpython_root.SetBoolean("UsingStandardOutputParam", False) # <<<<<<<<<<<< added (default might stay) + + # ghpython_root.SetBoolean("HideOutput", ghpython_data.get("hideOutput", True)) # !! this is still in container's items + # ghpython_root.SetBoolean("HideInput", ghpython_data.get("hideInput", True)) # !! this is still in container's items + # ghpython_root.SetBoolean( + # "IsAdvancedMode", ghpython_data.get("isAdvancedMode", False) # !! this is still in container's items + # ) + # ghpython_root.SetInt32("IconDisplay", ghpython_data.get("iconDisplay", 0)) # !! this is still in container's items + ghpython_root.SetString("Name", data["name"]) # ok ghpython_root.SetString("NickName", data["nickname"]) # ok - ghpython_root.SetBoolean( - "MarshalOutGuids", ghpython_data.get("marshalOutGuids", True) # **!! it changed to "MarshalGuids" in cpy - ) - # ------------------------------ - # code + # ghpython_root.SetBoolean( + # "MarshalOutGuids", ghpython_data.get("marshalOutGuids", True) # **!! it changed to "MarshalGuids" in cpy + # ) + ghpython_root.SetBoolean("MarshalGuids", True) # <<<<<<<<<<<< added (TODO: default value to replace) - # FIXME: does not exist anymore, need a new chunk - ghpython_root.SetString("CodeInput", code) - print("CodeInput", code) + # ------------------------------ # ------------------------------ @@ -323,7 +330,7 @@ def create_ghuser_component(source, target, version=None, prefix=None): ) pi_chunk.SetInt32("SourceCount", 0) # ok pi_chunk.SetGuid("InstanceGuid", input_instance_guid) # ok - pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID"))) # ok + # pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID"))) # ok pi_chunk.SetInt32( "WireDisplay", parse_wire_display(pi.get("wireDisplay", WIRE_DISPLAY["default"])), # !! TODO: not sure if not shown by default, for test get out @@ -332,9 +339,9 @@ def create_ghuser_component(source, target, version=None, prefix=None): pi_chunk.SetBoolean("SimplifyData", pi.get("simplify", False)) # !! TODO: not sure if not shown by default, for test get out # Mutually exclusive options if pi.get("flatten", False): - pi_chunk.SetInt32("Mapping", 1) # !! + pi_chunk.SetInt32("Mapping", 1) # !! TODO: not sure if not shown by default, for test get out elif pi.get("graft", False): - pi_chunk.SetInt32("Mapping", 2) # !! + pi_chunk.SetInt32("Mapping", 2) # !! TODO: not sure if not shown by default, for test get out # ------------------------------ # output parameters @@ -347,13 +354,29 @@ def create_ghuser_component(source, target, version=None, prefix=None): po_chunk.SetBoolean("Optional", po.get("optional", False)) # ok po_chunk.SetInt32("SourceCount", 0) # ok po_chunk.SetGuid("InstanceGuid", output_instance_guid) # ok + po_chunk.SetBoolean("ReverseData", po.get("reverse", False)) # !! TODO: see above - po_chunk.SetBoolean("SimplifyData", po.get("simplify", False)) # !! + po_chunk.SetBoolean("SimplifyData", po.get("simplify", False)) # !! TODO: see above # Mutually exclusive options if po.get("flatten", False): - po_chunk.SetInt32("Mapping", 1) # !! + po_chunk.SetInt32("Mapping", 1) # !! TODO: see above elif po.get("graft", False): - po_chunk.SetInt32("Mapping", 2) # !! + po_chunk.SetInt32("Mapping", 2) # !! TODO: see above + + # ------------------------------ + # code + + # FIXME: does not exist anymore, need a new chunk + script = ghpython_root.CreateChunk("Script") + # TODO: here the code from the component needs to go in base64 + script.SetString("Text", "IiIiVGhpcyBpcyBhIG5ldyBzY3JpcHQgaW5zdGFuY2UiIiINCmltcG9ydCBTeXN0ZW0NCmltcG9ydCBSaGlubw0KaW1wb3J0IEdyYXNzaG9wcGVyDQoNCmltcG9ydCByaGlub3NjcmlwdHN5bnRheCBhcyBycw0KDQoNCmNsYXNzIE15Q29tcG9uZW50KEdyYXNzaG9wcGVyLktlcm5lbC5HSF9TY3JpcHRJbnN0YW5jZSk6DQogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBjb21wYXNuZXdfeCwgeSk6DQogICAgICAgICIiIkdyYXNzaG9wcGVyIFNjcmlwdCBjb21wYXMgYWN0aW9uIiIiDQogICAgICAgIGEgPSAiSGVsbG8gUHl0aG9uIDMgaW4gR3Jhc3Nob3BwZXIhIg0KICAgICAgICBwcmludChhKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuDQo=") + script.SetString("Title", "S") + + language_spec = ghpython_root.CreateChunk("LanguageSpec") + language_spec.SetString("Taxon", "mcneel.pythonnet.python") + language_spec.SetString("Version", "3.9.10") # TODO: the version might be a parameter + + # print("CodeInput", code) # ------------------------------ # ------------------------------ diff --git a/assets/deserialized_exo/TestUserObjectCpy.ghuser b/assets/deserialized_exo/TestUserObjectCpy.ghuser new file mode 100644 index 0000000000000000000000000000000000000000..676ace230aa947c5bdefa08860e6fc85228c4340 GIT binary patch literal 4412 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 COVMZm literal 0 HcmV?d00001 diff --git a/assets/deserialized_exo/Test_KitchenSink.ghuser b/assets/deserialized_exo/Test_KitchenSink.ghuser new file mode 100644 index 0000000000000000000000000000000000000000..c747b6320654a5b163a8f09b84e492aa82c3946e GIT binary patch literal 3142 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 literal 0 HcmV?d00001 diff --git a/assets/deserialized_exo/deserialized_TestUserObjectCpy.xml b/assets/deserialized_exo/deserialized_TestUserObjectCpy.xml new file mode 100644 index 0000000..1eb6a1c --- /dev/null +++ b/assets/deserialized_exo/deserialized_TestUserObjectCpy.xml @@ -0,0 +1,18 @@ + + + c9b2d725-6f87-4b07-af90-bd9aefef68eb + Componentizer + Scripting component test for deserialization + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAJmSURBVEhL3ZW/ixNBFMe/m2Szu9Gzsctp4h+hiL0oaGEhihx4KhzcH2CloGBnpaCdjYKdxjIgcj/wONFT2/RiTOPFzU04TEQz63u7M7mZya6VjT54kMx+9/OdffPeLv6rGFIKlUWhrxdp0mtexpoJMXyGBNUwweKt3kxeu9NFqSTFc0wKNX4gd/g6sJsh7RDwqwnKFYm3chtrky7W5ec0N+Qn3HgSI4gSRPtlrmaTNH5AG4wSz8NYMZ3gXbR3tnHsdHcK0HBO/s1rrobhV27HePgmRqs3nK/ivCI6wQYmYEt+teB6t6bmI2k0fJ00rd5u3cclRXSCDTTg5fc+DtY7uP7Ihpsmr0Z9VIIO7q1kcF4ng0M+FhTRCW2QluVxjJtPBzhxdq8UpoEuy932AMfP7GnYIMCSIjrBBm7N3Xqb8LQsE1tDBvMhFhXRCW5Ft+YMNQEWPEfTFrLoCQT3edqKbs01gNuzSq0Y7kumcFPDLVwqS2KNMqQdIh2iaE5OS2Em77ziS8HDWCvQ0Lp4gR/EyjdIB6VMO1j9ZR+qLktY+wuDxvCjp7pTE7fmvOYevKmhQasHuKqITuhB0yabsj9zoJymSc6gFXeROWiv6cay38GDjYEFN00KBo0MLiuiE9pAP/L9tdgql2mgNTmD9mcDt+bumZjwVJMzaAGWFdEK7iKZdoJZc4ZqE+4gbtE8jZ6TaK6wi9Qc0BB9oJveyy9WvpPfGJDOQZ5mi7J2IBEt/CRWwRx43pg+d+MjEZYbES4cDnGxGWKB/p9rZm9IvnHEmkYNS40AJ5vUkqzh5HWlyf2i/YsB/AY4TfDJsUowIAAAAABJRU5ErkJggg== + + befa656d-a0b2-4a86-ac96-df3b07485a12 + TestUserObjectCpy + CTS + + 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 + + ALL + + \ No newline at end of file diff --git a/assets/deserialized_exo/deserialized_Test_KitchenSinkghuser_ipy.xml b/assets/deserialized_exo/deserialized_Test_KitchenSinkghuser_ipy.xml new file mode 100644 index 0000000..f4d6f30 --- /dev/null +++ b/assets/deserialized_exo/deserialized_Test_KitchenSinkghuser_ipy.xml @@ -0,0 +1,18 @@ + + + c9b2d725-6f87-4b07-af90-bd9aefef68eb + Componentizer + This is an example with the everything and the kitchen sink in it, just to show all available options. + 4 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAC4jAAAuIwF4pT92AAAGtmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDYwLCAyMDIwLzA1LzEyLTE2OjA0OjE3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDEtMjBUMTI6NTM6MzIrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTAxLTA4VDE0OjQ3KzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIxLTAxLTA4VDE0OjQ3KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc5NWY1YjQ4LTM1ZTktMTI0My05NGNiLTFjNmRkYWViYzQ4YyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjUwYmMyZmNiLTkwM2YtMzY0ZC04MWQxLWJiMWE5NzFmOGU5NiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjEzNmZlZjU3LTNhY2QtNDM0Ny1hY2FkLWUzYmFlZWViMGE4ZiI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MTM2ZmVmNTctM2FjZC00MzQ3LWFjYWQtZTNiYWVlZWIwYThmIiBzdEV2dDp3aGVuPSIyMDIwLTAxLTIwVDEyOjUzOjMyKzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTVhZGJhYzItMjYyNS1hZTQ4LWI0NmQtZjhmYWUxNTZmYjY5IiBzdEV2dDp3aGVuPSIyMDIxLTAxLTA4VDE0OjQ3KzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc5NWY1YjQ4LTM1ZTktMTI0My05NGNiLTFjNmRkYWViYzQ4YyIgc3RFdnQ6d2hlbj0iMjAyMS0wMS0wOFQxNDo0NyswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjIgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgWtIBMAAAO3SURBVEjHtVZpT5NZFDZRY2QSAddR1PhBx4xxjWtcEsdx++AfYDIzhriOEuNMolETo9EoZZ/ACBU3VDLfjKMF1EkG6MLSFhB1pLTE0qKAIIotBbrRx+e+SuUtraIJJznNfe899zz3nvOcczsKwKiRVOlnZoYuon6bph0Xq1Bvjlaoj01O0VwTKsYxCvXWaWnaqEj7hgVA51HRSer4KamaO8svGqzbCh66hS7PM1inpmpV0Ullv9Jm/FcB8JS/LMypakwtt6O61QmPvx8D4vUHUNvmRGZlMxbl6ht5m93DBojL0I3mhqwDRQ1od3mCTnu8fhy+b4GYd3n8wfnOXi9+5zz3KOOGAzAxWZ11VtOEUHna4ULUuTKMP1eKJ+2uIespvClzpfwkQGyyJn6fqgHhRP/CgblZFfguuxKGFkdYG7E3NlmdEAkgaka6zjb/r0qc19rg8vplm7fdfIiCxy9RZOnEVo4DgY9rbuYnrcKOedkVmJ6ubaWvaBmAYAJjGC8SevNRG/iNBReqoDK/gvBz29SBjfk1QYcbrtbgel2rNBaAS5UGkLLI55zwQV+JMgDGbhOpeLeurTuYuD8eWLAizwiHx4dldCBCNCA1ZNUSpR6ve31YkqtHYrGZhPBKa01dfZiVqSuWAZDrx8ntJo8/IAtLn6+fybNh110TLJ09eO5wo63bA9vbPh6gESf+e4ZujzyU/XSx9kq1WQYgqnN7QZ07NGktTjfmMbEvSde9KhPm/FkuJXoPAV/1eDGfCReAocJitMsAJqVo8gkwxHLn7XqcLHkmjUXSd/z9CD9erw3WgUjsT7f+HwKwPRSAITqxIs9g8w4KUWnTG6y/Wg3/ILqkVzRDQYYNllWXjChkogckEC5ETPIW9pbix+3vk5xEJwwbTpVaIeZE8oWKAhM68C3WTpdZMemDrRA78zM7s/xeKE2/mZBUtjNL/1wyWkxmjDlTQhYZ8EN+bVAZW3F92dxK3mDs2RKwb0l7c40vQF+HhxSaqIVFOVV2h9sHY4sTCp0Nb/p8snA0kEn1HfI24aS9aBMae5fEutWXjR2siZiwrYIFkiAaVyTZdceEn289jbh+9N9GsAv/9slmR5CL4kThZH9hAxL+qQ+7lsPQ0HnBcNq1YJXy0D0znCFFFA5A0PfI+5PfiPvCB2fP6kvG5gw+KpbXvazQAN8CsxQmMbZ29SKbpFhz2dhC24Nf9WROS9VOICMS2VtU665Um9gAbd9fqLSJMalYKNhCm5jPPpkj/q9iJPUdVMp7CLMr2e0AAAAASUVORK5CYII= + + cdd47086-f902-4b77-825b-6b79c3aaecc1 + Kitchen sink component example + Everything + + vVVRaBxFGN5NSprbSyxiQUQtPxFMSo+g4IsHgkcumrPuXcmd2MSnye5cdpK5mWVn9nJ7sS/imxC10AdRDArFBykIPgiC9aEoPvooIkjfRcGXgi3Umd3bvb27SI1WhxvY++bfmf/7vv+ftV4ROGhs7WBH3lWjYBiGqWZhhbu4xvwwRi2F/Di9sLBgVTkI3sHSI2wbBKE0WraslkcEOLzjc4aZBJdjAYwnMaHA7ZCWgMhFAZzRCBDsEul4mKn32S7gHur4FIPw+J5+ocOFBNRFhKItBXNfEs6EOgXUqATbohw/6dErw0XoIhriDIrKsDEG9cuwmYPWsQwDltslwCKksgwtTyURdoC3AVEK0gswTt5Tp2vu7YB3YNvzI+kpImRrOaO8hQQGov4EUvHBTigVk6EgKKeOZVkORULA+USEptJgJV1cysLOJvm5uA3rIWs6AfHlksC0XYJeCaIS9M8OGWh82cZCoG0Mz8HiSsO+0Kiv1lvQ3d/v4kAoBS9dWswx1hJAD85BpGbfKlaxiI9Qganf7dhV9UMs82iPSE8JgwGrXaPEYMTcGBoxlTBleAl2QuWl5LG3saiTvhbWSK7QdOmZloYaocxjxZrDWZUIn6JIg9MKnFLzgZqouF3EHOzaqmKz+FM2CoSHqNrmxZC4Ils4UUcdnHI8cz6f9NCwAd/ZOnF28/HWasZ7/gIK1IrEQRVJpANmVMAJHRSzWeEhk2mmep6M4Zpr6O5S8/V3/3jzhzOf22/d3P/pJffKx+m6eY/1qb9YLyaKjZyr95pN8OHBG+53B+bXheqXvz5sz5976Psk35iODpk3knGqQinfa6kmqDiOqq2hFUcUy+O6eQa9qBtIF0Qm5/JcjQmpPdJWpLfM4vPGlfefOKxca33SPLw8Uxsxxrw4ob3Zm23EZyI6TGVdF6LAqQUx+GDSLTGhYerTA1rzTVWLrcjHa4TJIam5pmpfStpRfiuj2ORh4OARTfWw0g1q1ZTOk9/eftbsf/rCRwe/PDZX8V4rvkoCPFawZlYdcXLmv1J741hqV05/8dWdJfvl99DsZ+/Ur98ZVXtjUu3o76lt3D+1zfustjGqdnxb/GO1N4+l9je1m298eGN17frVp8hB/dEPTtrI99WlkS+EUQc2Jx3o/+8O/Bf1PriWsuulMNjyKKUfWY8/xXmRQ4l0xJEq3zq89cxvP+/Yb994+nL12tXfx1WeGld5JvnUT0id4uN6G0fqfTzp/gQ= + + ALL + + \ No newline at end of file diff --git a/assets/deserializer.py b/assets/deserializer.py index 85e15d7..e38f242 100644 --- a/assets/deserializer.py +++ b/assets/deserializer.py @@ -18,7 +18,9 @@ def main(): from GH_IO.Serialization import GH_LooseChunk - ghuser_path : str = r"F:\compas-actions.ghpython_components\temp\TestUserObjectCpy.ghuser" + + # ghuser_path : str = r"F:\compas-actions.ghpython_components\assets\TestUserObjectCpy.ghuser" # cpy + ghuser_path : str = r"F:\compas-actions.ghpython_components\build\Test_KitchenSink.ghuser" # ipy deserialized_data = GH_LooseChunk("UserObject") @@ -36,9 +38,8 @@ def main(): # convert to xml xml = deserialized_data.Serialize_Xml() - print(xml) - + print(xml) @@ -50,6 +51,4 @@ def main(): gh_io = gh_io[:-4] clr.AddReference(gh_io) - - main() \ No newline at end of file From 666e009bbe4267e9ce8d395564348f4f01cd68b6 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Sat, 20 Jan 2024 22:54:01 +0100 Subject: [PATCH 10/35] WIP-CAP: changed all output guid to no_hint (out parameter is not defualt) --- .../ghpython-components/componentize.py | 28 +- assets/cpythondoc.ghx | 85 ++++ assets/deserializer.py | 1 + assets/print_hints.py | 37 ++ assets/testTypeHint.ghx | 364 ++++++++++++++++++ 5 files changed, 507 insertions(+), 8 deletions(-) create mode 100644 assets/cpythondoc.ghx create mode 100644 assets/print_hints.py create mode 100644 assets/testTypeHint.ghx diff --git a/.github/actions/ghpython-components/componentize.py b/.github/actions/ghpython-components/componentize.py index fb9bf41..f02c808 100644 --- a/.github/actions/ghpython-components/componentize.py +++ b/.github/actions/ghpython-components/componentize.py @@ -13,6 +13,8 @@ import System import System.IO +# 1. x failed to find Type Hint. Using "No Type Hint" instead. (Missing Hint: 87f87f55-5b71-41f4-8aea-21d494016f81) + GHPYTHON_SCRIPT_GUID = System.Guid("c9b2d725-6f87-4b07-af90-bd9aefef68eb") # <<<<<<<<<<<< changed # GHPYTHON_SCRIPT_LIB = System.Guid("066d0a87-236f-4eae-a0f4-9e42f5327962") # ?? test unsure # <<<<<<<<<<<< changed TODO: to verify if it changes anything in py anc c# TEMPLATE_VER = re.compile("{{version}}") @@ -21,9 +23,9 @@ # TODO: we might want to double check this list if the guid are the same in Rhino 8 TYPES_MAP = dict( - none="35915213-5534-4277-81b8-1bdc9e7383d2", - ghdoc="87f87f55-5b71-41f4-8aea-21d494016f81", - float="39fbc626-7a01-46ab-a18e-ec1c0c41685b", + none="6a184b65-baa3-42d1-a548-3915b401de53", # <<<<<<<<<<<< changed + ghdoc="1c282eeb-dd16-439f-94e4-7d92b542fe8b", # <<<<<<<<<<<< changed + float="9d51e32e-c038-4352-9554-f4137ca91b9a", # <<<<<<<<<<<< changed bool="d60527f5-b5af-4ef6-8970-5f96fe412559", int="48d01794-d3d8-4aef-990e-127168822244", complex="309690df-6229-4774-91bb-b1c9c0bfa54d", @@ -48,7 +50,7 @@ surface="f4070a37-c822-410f-9057-100d2e22a22d", subd="20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08", brep="2ceb0405-fdfe-403d-a4d6-8786da45fb9d", - geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26", + geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26" ) #TODO: double check, don't know this param @@ -297,6 +299,9 @@ def create_ghuser_component(source, target, version=None, prefix=None): # ------------------------------ # ------------------------------ + # FIXME: here the component gives back this error: + # 1. Error running script: Unable to cast object of type 'Grasshopper.Kernel.Parameters.Param_String' to type 'RhinoCodePluginGH.Parameters.ScriptVariableParam'. + # needs to change the type of the parameters for both input and output # parameters params = ghpython_root.CreateChunk("ParameterData") # ok inputParam = ghpython_data.get("inputParameters", []) # ok @@ -305,13 +310,14 @@ def create_ghuser_component(source, target, version=None, prefix=None): params.SetInt32("InputCount", len(inputParam)) # ok for i, _pi in enumerate(inputParam): params.SetGuid( - "InputId", i, System.Guid.Parse("08908df5-fa14-4982-9ab2-1aa0927566aa") # ok <<<<<<<<<<<< changed + "InputId", i, System.Guid.Parse("08908df5-fa14-4982-9ab2-1aa0927566aa") # ?? <<<<<<<<<<<< changed ?? ) params.SetInt32("OutputCount", len(outputParam)) # ok for i, _po in enumerate(outputParam): params.SetGuid( - "OutputId", i, System.Guid.Parse("3ede854e-c753-40eb-84cb-b48008f14fd4") # ok <<<<<<<<<<<< changed + "OutputId", i, System.Guid.Parse("08908df5-fa14-4982-9ab2-1aa0927566aa") # ?? <<<<<<<<<<<< changed ?? ) + # FIXME: the "out" guis is 3ede854e-c753-40eb-84cb-b48008f14fd4 to replace up if you want to add it # ------------------------------ # input parameters @@ -330,7 +336,7 @@ def create_ghuser_component(source, target, version=None, prefix=None): ) pi_chunk.SetInt32("SourceCount", 0) # ok pi_chunk.SetGuid("InstanceGuid", input_instance_guid) # ok - # pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID"))) # ok + pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID"))) # ok FIXME: this one is maybe to modify pi_chunk.SetInt32( "WireDisplay", parse_wire_display(pi.get("wireDisplay", WIRE_DISPLAY["default"])), # !! TODO: not sure if not shown by default, for test get out @@ -353,7 +359,12 @@ def create_ghuser_component(source, target, version=None, prefix=None): po_chunk.SetString("Description", po.get("description")) # ok po_chunk.SetBoolean("Optional", po.get("optional", False)) # ok po_chunk.SetInt32("SourceCount", 0) # ok + + # po_chunk.SetGuid("TypeHintID", System.Guid.Parse("0b057941-4ed8-4cde-9c90-bacf7ba51cb7")) + po_chunk.SetGuid("InstanceGuid", output_instance_guid) # ok + # FIXME: here the param hint needs to be added/modified + po_chunk.SetBoolean("ReverseData", po.get("reverse", False)) # !! TODO: see above po_chunk.SetBoolean("SimplifyData", po.get("simplify", False)) # !! TODO: see above @@ -369,10 +380,11 @@ def create_ghuser_component(source, target, version=None, prefix=None): # FIXME: does not exist anymore, need a new chunk script = ghpython_root.CreateChunk("Script") # TODO: here the code from the component needs to go in base64 + code = base64.b64encode(code.encode("utf-8")) script.SetString("Text", "IiIiVGhpcyBpcyBhIG5ldyBzY3JpcHQgaW5zdGFuY2UiIiINCmltcG9ydCBTeXN0ZW0NCmltcG9ydCBSaGlubw0KaW1wb3J0IEdyYXNzaG9wcGVyDQoNCmltcG9ydCByaGlub3NjcmlwdHN5bnRheCBhcyBycw0KDQoNCmNsYXNzIE15Q29tcG9uZW50KEdyYXNzaG9wcGVyLktlcm5lbC5HSF9TY3JpcHRJbnN0YW5jZSk6DQogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBjb21wYXNuZXdfeCwgeSk6DQogICAgICAgICIiIkdyYXNzaG9wcGVyIFNjcmlwdCBjb21wYXMgYWN0aW9uIiIiDQogICAgICAgIGEgPSAiSGVsbG8gUHl0aG9uIDMgaW4gR3Jhc3Nob3BwZXIhIg0KICAgICAgICBwcmludChhKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuDQo=") script.SetString("Title", "S") - language_spec = ghpython_root.CreateChunk("LanguageSpec") + language_spec = script.CreateChunk("LanguageSpec") language_spec.SetString("Taxon", "mcneel.pythonnet.python") language_spec.SetString("Version", "3.9.10") # TODO: the version might be a parameter diff --git a/assets/cpythondoc.ghx b/assets/cpythondoc.ghx new file mode 100644 index 0000000..d1bb42f --- /dev/null +++ b/assets/cpythondoc.ghx @@ -0,0 +1,85 @@ + + + + + + + + 0 + 2 + 2 + + + + + + + 1 + 0 + 7 + + + + + + 270470a3-090e-4199-8a96-d6d60083f906 + Shaded + 1 + + 100;255;0;0 + + + 100;0;150;0 + + + + + + 638412573507187527 + + false + cpythondoc.ghx + + + + + 0 + + + + + + 201 + 292 + + 1.0837505 + + + + + 0 + + + + + + + 0 + + + + + 0 + + + + + + + + iVBORw0KGgoAAAANSUhEUgAAAOEAAACWCAIAAACn9nhUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAGXSURBVHhe7dJBDQAhEACx9W8TIceHhJyDIWk1dOABH1Tdowt6HKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXudxSazlHomtmpFvoOOsRmzAAAAABJRU5ErkJggg== + + + + + \ No newline at end of file diff --git a/assets/deserializer.py b/assets/deserializer.py index e38f242..3a4c36a 100644 --- a/assets/deserializer.py +++ b/assets/deserializer.py @@ -51,4 +51,5 @@ def main(): gh_io = gh_io[:-4] clr.AddReference(gh_io) + main() \ No newline at end of file diff --git a/assets/print_hints.py b/assets/print_hints.py new file mode 100644 index 0000000..cec893f --- /dev/null +++ b/assets/print_hints.py @@ -0,0 +1,37 @@ +import argparse +import base64 +import json +import os +import re +import sys +import tempfile +import urllib.request, urllib.parse, urllib.error +import zipfile +from io import StringIO + +import clr +import System +import System.IO + + + + +def main(): + from GH_IO.Serialization import GH_LooseChunk + + # get all the types and corresponding guids + # rewrite this: 08908df5-fa14-4982-9ab2-1aa0927566aa in majuscule + # i ncomment the line below + print(GH_LooseChunk.GetKnownTypes()) + + + +if "__main__" == __name__: + + gh_io : str = r"C:\Users\andre\.nuget\packages\grasshopper\8.0.23164.14305-wip\lib\net48\GH_IO.dll" + gh_io = os.path.abspath(gh_io) + gh_io = gh_io[:-4] + clr.AddReference(gh_io) + + + main() \ No newline at end of file diff --git a/assets/testTypeHint.ghx b/assets/testTypeHint.ghx new file mode 100644 index 0000000..412c760 --- /dev/null +++ b/assets/testTypeHint.ghx @@ -0,0 +1,364 @@ + + + + + + + + 0 + 2 + 2 + + + + + + + 1 + 0 + 7 + + + + + + f8be2b46-c707-45df-94e6-6ce5d1c1ffdf + Shaded + 1 + + 100;255;0;0 + + + 100;0;150;0 + + + + + + 638413868051787861 + + false + testTypeHint.ghx + + + + + 0 + + + + + + -33 + -48 + + 3.9772015 + + + + + 0 + + + + + + + 0 + + + + + 1 + + + + + RhinoCodePluginGH, Version=8.2.23346.13001, Culture=neutral, PublicKeyToken=552281e97c755530 + 8.2.23346.13001 + + 066d0a87-236f-4eae-a0f4-9e42f5327962 + RhinoCodePluginGH + + + + + + + + 1 + + + + + c9b2d725-6f87-4b07-af90-bd9aefef68eb + 066d0a87-236f-4eae-a0f4-9e42f5327962 + Script + + + + + Scripting component + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQdSURBVEhL3ZRbTJtlHMbxwmTGxCjRMONkbkx0Y0P6tf3aDhgCkwyXbcTordELl6gcC4NxGitgvFiM0ZuFHiiHcj5LCwgUWuuQOdyBEVd1rjB3p3HgIcRo/o//9/s+IFzWmJj4JP+0Td739z553udtzH8q6d3mQ7oCh1OX7wjrCpw/pxS6/tIVun+UrJ6w3tphl0t79mhLo5eUb09n8P2UfGcTg1el4hZIxa1gMPSlXTCU98FQ1vOHVDXwpLYlOqUUOBqEe/FdKmxx6a0ehntgONOrwnmMlcMwnB2uUzZEK12By87O13VFrV7J2rm+4dpYMQDj2SGeQchVo5BrvB5tS3SSClrKpOL2gFTaydMV0Jf1BhgeMJQP/Cmcy9UMrx3nA8ajO0BvbXrcYG1+2mDt2j7VQ+pUDv8k1/hgYripbhImm99DK3kJPE5aPlFOSzmxGmq7+EJf4YZclkraoC/r4unmvHtgqOhXI6kcYbdjCliu5U+Gm20zMNXPeuhengV3TgDf5gJLR1exmPaYhlUlHEuFzb9JJe1qQwRYuUgBF1l/osEnVOfnpxk+qxxgbgi66Pvj6QgfA25mA1czQPOHqzS0Kq6fU3W80RAGi8sUrkXWm5FMqc7rA7A0BGFpDMHUGMqlcM7buJEFLBwBvrCAgoY5Da1KX9p5fdO10pJBGIXrjTiEc4abz/sZPquAzY2hdUtDyHF37tVYupZ5B1+mAXNmIGAATSbfB2Ie0PAc0Zne31UwZ10lsvbBWDu2bKr79PTrH3ky3SONr7m9Yt5Xh38vXXoji24e/QBXj6zicioQkoEZCZhMBrwHAPfuHRqeD6jo/0FxrMVhrPatZ703EsfNuMDzC+7mQZmVU8Dt41DyXuS8v1IjwWdGwK8DJg4Bo8+DBvZ9p6FV8Wuclqu9ataieucmXVjJS9sEi1k+yS15Gfg6B7ieCVxJVyMJMnzqBWD8IDDyHNCfAHTFt2hoVaYaX9HGJZq5ISbbdC47/3gTHuEKfqNUELj2IpS8LzF8Vq9GMpYEDCcCfXuBznhQW9xBDa3KXNLzkHxu4p5ygM0Pi20mm1ZO2RX4RiRcQVrIIJpPJQrKRH6JaCKZaPQA0WAiUfczRO27bpEr7k0Nu11y3dgjJtvMO+b6YFtqfSiJInyAgItIuIJ0Jf1Xbem/Iwofs2PpJTUSkTdHQgF9hKaSI+RLitBIYoT6EiLUEf+htiU60WK2XbxKpYKfm7byHt0PGkpco569DurYtUYtO//Zvynn/RbmD3MFud9+7ve4qOB+YPBZUPduu7LGvdNBTbFFyoZohdmMHfzkb2E6ZauCA/tEBUGtT62RM85BF2Nv0IW4h7Ut0QsL+gf5VZ6m4UQf9e25zZGscyRhsj/hpYuP5sMds/Va/6eKifkb1QMSMlhsgFAAAAAASUVORK5CYII= + + e98563e8-3930-435f-b288-b340ed9a8197 + true + Script + S + + false + false + true + + + + + + 54 + 51 + 147 + 64 + + + 121 + 83 + + + + + + 3 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 3 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + + + + + true + No conversion + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + 58f70747-b4db-4eea-9609-7c7f35c7d972 + + nohintIN + true + 0 + true + 0 + 6a184b65-baa3-42d1-a548-3915b401de53 + + + + + + 56 + 53 + 50 + 20 + + + 82.5 + 63 + + + + + + + + true + Contains a collection of floating point numbers + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVbKLVpFN7ITnI+s5HDdj6fz5QoUeSQiUgOF27dqb+GXIyo/0a4kUMhKfqLnENEOYWEFLlkxAwKGzN65n1ee+9+Y/7/N1fTrFrtr/1977PWetaz1qv4r0xtYGDwKH7xL/wn4R8zExOT7a6uLqyurmJ5eRnz8/OYmprC6Ogo+vr60NLSgpqaGuTk5CApKQk+Pj4QCZ2Lo8pXhO+YkZFRnjj4R29vL+Li4qTHxsYiOjoakZGRCAsLQ3BwMPz9/SWwp6cnAgMDYW5ufmdoaPhJC/NNU1paWv42NDSEwsJCmR09MTFRBmKQiIgIhISESFBfX194e3tL9/LygghwLzBUr1D/YMbGxr9UVlb+2djYiJSUFKSlpUnnM4OwkqioKFlFUFAQ/Pz8kJ6ejoaGBlmJSO5JUPVFC/fO1E5OTo9tbW3Izs5Ge3s7BgcHMTIyguHhYfkfq2CA8PBw5Obmor+/H6enp1hbW4ObmxtcXV3ZC1YR9Qr5lQnulwsKClBaWoqBgQFsbm4iIyMDWVlZuLy8xP7+PpKTk2WAmJgYVFdXo6enB+fn59jb25Pgzs7OsLa2fhFBtrWwesuxs7PTFBcXQ1AkM1pcXNRTdHBwAI1Gg9bW1jcUVVVV4erqCkdHRzKAYADu7u4QKrwTmKWv0KKxIvtf4+PjQW9ubsb29rYMoGsyAzw9PWFjY+NNkxng+voaJycnUKlUcHR0lEE8PDxI1e8C20whOv+zra2thuDMjLzu7u5iZmZGL1PS8/z8jIuLizcyJU03NzcygIuLCxwcHGBjYyNVJZ4fRIDPChHpJiAgQB6is6k7OzuYnp6WdNB1AR4fH+U3/J4SJZ26AOTf3t6ePZCBQkNDOd03DPBZyOueZfNgd3e3bPDExIRUC51NJDgr4DeUp1qtRkVFhaTo+PhY0iOYgJWVlfxGqIoVtApXmJEv6phl19fXY2VlBWNjY/qqWNHDwwOWlpZk5gTn92VlZVJhh4eHMnvSw0o4L6Kvrz3QWqlSqbzjYeqd4OPj4zIgfWtrC7e3t3KgyC/BqZaSkhKcnZ3JBHTZs2eCIs6CXkXSqF3x4oXZNTU1yeVGcMqRHDMIn7n8FhYWpGrYA75bX1+X4DwrZuRFwL2bA1osdwklxkrq6urQ0dEhe9LZ2SnlyWmdnZ3F5OQkamtr5XalpOfm5lBeXo78/HxYWFiQ+/eTTBNVfBE8PpEGDs7XzowpRXLMhpJzHS0CVG5aoZxnAfPNXURTsQpWwGw5NDonKOWnA2ZDhfq4puV73g2ij9/fplr7JLR8T77F+tC7DpQ612VtZmYGU1NTuVFF1QT/4X1AUwqqLrgKEhISkJqaKgEyMzPl4mOmeXl54GIsKioC9xeXojjzsRtNa7xf/37n/sg/fif/j0yh+AuVqtAmN2lbmQAAAABJRU5ErkJggg== + + f50101bf-590f-4d1b-9ad0-aa939bf64d7c + + floatIN + true + 0 + true + 0 + 9d51e32e-c038-4352-9554-f4137ca91b9a + + + + + + 56 + 73 + 50 + 20 + + + 82.5 + 83 + + + + + + + + true + rhinoscriptsyntax geometry + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + f9878e13-3729-4963-adf4-425c01da1947 + + ghdocIN + true + 0 + true + 0 + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 56 + 93 + 50 + 20 + + + 82.5 + 103 + + + + + + + + The execution information, as output and error streams + 7a28daf9-b80f-43d1-b104-277848a24ec3 + out + out + false + 0 + + + + + + 136 + 53 + 63 + 20 + + + 167.5 + 63 + + + + + + + + false + No conversion + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + 89210f0e-52b1-422f-9902-7951d4400654 + + nohintOUT + false + 0 + true + 0 + 6a184b65-baa3-42d1-a548-3915b401de53 + + + + + + 136 + 73 + 63 + 20 + + + 167.5 + 83 + + + + + + + + false + Contains a collection of floating point numbers + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVbKLVpFN7ITnI+s5HDdj6fz5QoUeSQiUgOF27dqb+GXIyo/0a4kUMhKfqLnENEOYWEFLlkxAwKGzN65n1ee+9+Y/7/N1fTrFrtr/1977PWetaz1qv4r0xtYGDwKH7xL/wn4R8zExOT7a6uLqyurmJ5eRnz8/OYmprC6Ogo+vr60NLSgpqaGuTk5CApKQk+Pj4QCZ2Lo8pXhO+YkZFRnjj4R29vL+Li4qTHxsYiOjoakZGRCAsLQ3BwMPz9/SWwp6cnAgMDYW5ufmdoaPhJC/NNU1paWv42NDSEwsJCmR09MTFRBmKQiIgIhISESFBfX194e3tL9/LygghwLzBUr1D/YMbGxr9UVlb+2djYiJSUFKSlpUnnM4OwkqioKFlFUFAQ/Pz8kJ6ejoaGBlmJSO5JUPVFC/fO1E5OTo9tbW3Izs5Ge3s7BgcHMTIyguHhYfkfq2CA8PBw5Obmor+/H6enp1hbW4ObmxtcXV3ZC1YR9Qr5lQnulwsKClBaWoqBgQFsbm4iIyMDWVlZuLy8xP7+PpKTk2WAmJgYVFdXo6enB+fn59jb25Pgzs7OsLa2fhFBtrWwesuxs7PTFBcXQ1AkM1pcXNRTdHBwAI1Gg9bW1jcUVVVV4erqCkdHRzKAYADu7u4QKrwTmKWv0KKxIvtf4+PjQW9ubsb29rYMoGsyAzw9PWFjY+NNkxng+voaJycnUKlUcHR0lEE8PDxI1e8C20whOv+zra2thuDMjLzu7u5iZmZGL1PS8/z8jIuLizcyJU03NzcygIuLCxwcHGBjYyNVJZ4fRIDPChHpJiAgQB6is6k7OzuYnp6WdNB1AR4fH+U3/J4SJZ26AOTf3t6ePZCBQkNDOd03DPBZyOueZfNgd3e3bPDExIRUC51NJDgr4DeUp1qtRkVFhaTo+PhY0iOYgJWVlfxGqIoVtApXmJEv6phl19fXY2VlBWNjY/qqWNHDwwOWlpZk5gTn92VlZVJhh4eHMnvSw0o4L6Kvrz3QWqlSqbzjYeqd4OPj4zIgfWtrC7e3t3KgyC/BqZaSkhKcnZ3JBHTZs2eCIs6CXkXSqF3x4oXZNTU1yeVGcMqRHDMIn7n8FhYWpGrYA75bX1+X4DwrZuRFwL2bA1osdwklxkrq6urQ0dEhe9LZ2SnlyWmdnZ3F5OQkamtr5XalpOfm5lBeXo78/HxYWFiQ+/eTTBNVfBE8PpEGDs7XzowpRXLMhpJzHS0CVG5aoZxnAfPNXURTsQpWwGw5NDonKOWnA2ZDhfq4puV73g2ij9/fplr7JLR8T77F+tC7DpQ612VtZmYGU1NTuVFF1QT/4X1AUwqqLrgKEhISkJqaKgEyMzPl4mOmeXl54GIsKioC9xeXojjzsRtNa7xf/37n/sg/fif/j0yh+AuVqtAmN2lbmQAAAABJRU5ErkJggg== + + 6fb8450c-3afe-4a9e-89e5-66d8f96bc6fe + + floatOUT + false + 0 + true + 0 + 9d51e32e-c038-4352-9554-f4137ca91b9a + + + + + + 136 + 93 + 63 + 20 + + + 167.5 + 103 + + + + + + + + + + IiIiR3Jhc3Nob3BwZXIgU2NyaXB0IiIiDQphID0gIkhlbGxvIFB5dGhvbiAzIGluIEdyYXNzaG9wcGVyISINCnByaW50KGEpDQo= + S + + + + + mcneel.pythonnet.python + 3.9.10 + + + + + + + + + + + + + + + + iVBORw0KGgoAAAANSUhEUgAAAOEAAACWCAIAAACn9nhUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAABVmSURBVHhe7ZxpUFVHvsDzIaVVSb7mw5sP71WMiXlxUuOWOHmUS7Y3ajLGfd9QcUMWIaIgyCIqRtzQGDRiEFREcEMBWRXZ931HFjUKgkpMysQsc9+P23d4jFGkhIv9Hv/fpM70PbdPd5/uX/+7z+WULwjC/wEMgqAr/+vodTNw8+bNGzduODs737t374cffvi+C3Qx2/9jHjx4UF1dvWHDBrrC1I99GDM6eu3atcbGRtQ8d+7c8uXL79+/39raysencvfuXVPqn1qbPhjh448//kiehw8fUuAvRu7cuUP5nOl4rZmgIjB9MA/cYF1d3cKFC1NTU7lf5rmpT/skZnT01q1b33333eTJkyl8woQJ9Dtn6G7F7du3W1pacEt9bG5uZmyamppqamo8PDxQja84njx5knHCRTLzUZVAjMGSkJCQq1evHjp0KCwsjMBTXFx84sQJsqkCuw9F0SRqBJrHvdBmEvX19Uw/0qZ8ZoDCqXTQoEF0nY2NDTdO7aZu7XuY0VFCoJWVFSXv3r2bZYtebmhoYICBRElJSVJS0qVLl9SQZGZmnj17lqsqKipWrFgRHx+fnp6OECkpKeTkJIm4uDikCQgImDFjBoVQeHZ29uLFiwcPHkyBlLZo0SLEUlV0B2IYTUpLS2MFYKPCx4KCAhJFRUV8a2dn5+TkRI20VuXvcairtLSUDdKmTZvoQF9f37686JvLUcIAQe7FF1+0t7enZFdXV2KPcpQjBrCQMdLTp0+PjY2NiYmZP38+HpOZDBMnTvT09Jw0aRJObN269cqVKw4ODmvWrJk9e3Z4ePi+fftGjRqVk5PDyaysLILu+vXrXVxc8vPzV61apeJcN6GQ0NBQjKfkdevWUQtNZSNBOiIiYsGCBXPmzGHaMOtMF/Q0OMrtbN68ma774IMPBg4cyKrCSVPn9jHM5SirNpGAYv38/CiZkMDJdkcxeOnSpbW1tceOHSNIYACBk2xEUKIpm9eff/6ZEeLbbdu2JSYmomNubm50dDQeYyeukBkjscfR0TEjI4Ojj48P53vEUYIxghJHqYXGBAcHMwd+//33tWvXEvj9/f2PHDnCNpH4arqgp0FHIre7uzsNYEq8+uqr7Oz77HJPJyhFe9hRepld1LBhw1577TUiqJeXV8c4SnevXLmyqqqKhZtIyYpGdOQ80RQjMRUDCJBBQUHe3t4EWiRGzdOnTxPYWPSJwexusRw7V69enZCQUFlZOXLkSEtLS+KNGubuQCHW1taHDx9m44usNABRuCMCPM3bvn0786FHJsOTUHGUiojW/fr1I2xzv6ae7XuYy1HAUfaIr7zyCis+vawGVcUevt2xYwcGsOFDBZ6TbG1teTggcGIqsZPM6BsVFRUYGMgz0/79+4kruEiC8Vu2bBkX7t27l4Fks8tmgCEkYBNNuZAquglTiCmBpkwAnsN4YiOosw9hXhG5k5OT2QSTgZaYLuhp6B8WmTFjxjAuLPTl5eXsjoyd2hcxo6METkaXxxqC0LRp01j9laPAAKgBJg+QmbWMb8nDSb4iAyfxlaNymqP6yJGtgiqBkxw5w96Xkzx+cd5YQ7egEDSlQEqmSXykeSrNt9QIPVLRk+A2mcA4ysRgiSCuq17qm5jRUaBn6V9iGztFJShD+yQ6/7YrdF4C1TfUm/4jbTrbKR0LfFLaHNBveXl5bL5//fVXJkZfFhTM6ygQkNh3fvHFF8Qhep+A91y41lDHsbKquqKyiiPtuN6AZ+pL7aCvcJRdeF9e4tvpPUeJo/Q+W89ehjrr62qvZBW5Hr44Y8vJyd7h07acWf11TGRKodHb59Ckp0JfiaPt9IajbK1wlPXxuQhRV3u1sLTC6WCkd1Dsf7udGGQdNNju+H+uCfv71ui0vFI0NeXTCRzNzc0VRxW95ygLPb1Pupe5Vlebnlcya2vYsj0XPnQN/4tj6AinU8PWnXnfLfJ4fH5D3bWq6jpTVm1gPufk5IijCrM7yrM2mvLMpARl3e8EMhjjyNNzdgUKqa+taaitKSkrP3A22Ss4cVdY8pehV8a6nx/qHGnhGX88IbepPqm2Oq+yus50TRd4pHk90tRHYD5nZ2fLe08KMzrK02hjY2Nra+uFCxesrKyIDU8dTta4goKCyspK0+c/wFcUwhBWVFRQBWn1SxAfUYcz7ddS09Wa6uMX06y/irTaF2N3MMEh4PLawGS7wymjPS8Od435r03JIYnpvzfZPWywvFYRU1HVVU3bqyBBpWxgHmkwzePISdrDFL116xb3TgvpEDKT4DYVfAWcV/mNV7dBCfn5+YsWLcrIyJD3nszoKL1P506dOpXCx40bR5reZyQeCyNHhi+//HLTpk1btmyJjY1lXHm8ZSBVBvVRlcD4EZsDAgIKCwv9/PwCAwObmprS09MPHz5MNlP+q9XRyTljXEIH2R7/s0PYnx1PDXY6N3h91DsuccPdYod5JFlszYlITjNcn2+oGvZ9nkNbCyqr1bXKeERRNaqPpDGM+/Ly8kpMTOTuqOvixYvUrn4uVZnJw+MO+Tl58uTJ9evXOzs7p6SkMF2PHDly5coVzp83cujQIfUegq+vLxeCqh0ohOmn3nuys7O7e/cuV6le7YOY0VHWqWXLllHynj17GCqGjd5nvB8Lo0LM+PDDD7Fz7dq1DCHKnjlzJjo6mrHnQhLqpL+//5QpU8rLyxcvXqz+Lvr2229TQvtfLElTT11NlVtg3GD7EyOcwoc5hQ91jnrPPXmkR8pfvdL/ujnnva2FNsFVDSXBhsKPDBlDH6aMry7NKq9sC3KALkwDCqcBfGSeFBcXh4aGsv7euXPH3t6eyYCdnM/MzExKSiopKUlLSzt9+jRikRg/fnxkZCSC0s74+PigoCAmKhKvWLGCk/fu3fPx8fH09OSW6Ra6iMcjaunYOfQVdfGteu9px44d8t5TGz3rKGGGMWh/78nFxYWu78RRhpBRt7CwUC9wMLSMItei3YEDBzBy27ZtrH3Ezp07d5INgWxsbAhLbNocHR15JkMOxpuqKY16rlZVrvaPG+x4arjz2ZEbY5yDUy4knY9PPRabGhKTHHop7cT1Qi9D4ThDyghDwuBfEyxqilLaHWUmEMtnz569atWqjRs30mya4e3tPWPGDLYitIqK5s6de/DgwVOnTu3du5cAOXnyZIIi2+7Lly+PGDGC4IqRKE74ZLGmeWjNfZEfy7mFzZs3//TTT/v37ycqNzc3c4OgagccTU1NpUa6buzYsfLek1kcZWzUe08MISUzeGoM1GA8Fpy2trYmarI4MqJowcBkZWXNmzePNX379u0ETgYbO1kfGWD2uDhqa2uLFhwZbCzhcoqinqtVFWsDLr3jFDFkQ4z1N1m3G7413JtuuDvZ0PS54doEQ/VHhvyRhitDDbF/MZz/jweRf6ssyS2rqFYtwVHUZG5g58qVK1kH+MhdEM9Yl2leTEwMYRtZw8PDEY6cTCGuQlwuoWH4ZGlpqWJtS0uLq6sreYiL586dY+GmQALk/fv32ai4u7tzoaq3HRWPVaX0g7z3pBTtYUcZJAZj6NChAwYMIM1IlJWV0fscH4sam/nz53NEtePHj8+aNYvVn7DK0o9/Tk5OxDY2ZwkJCajABpSwip2ENBZWwtu7777L5VTdVlpZWU1VeUBk5lC3+CEe6YEXU/7RaGtommCo/dRQNcZQ8p4he4gh+W1D7EBDxJ8M4f/WeHlLaXmN8bo2sMHDw4N5woqPagTFJUuWcBdIScikJTgaERHBxDhx4gR7aPzbvXs3wY/Qy66AlZ0LEZoWoiyNnDRpEtPMzc0N7SiH0iic/iEPxuOoqrcdNhtMRbwn0b9/f4qV95563lFgDBiel19+mRV/5syZPGHQ+wTXx6LGBhc57tq1ixEKCQlhjFkxMZXNKMGJKEsEQgW8QQ5CGsGGgSSk3b59m49IQxxVBVaUl+UXFjsFZ4zfmXP60pV/fLfCUPc3Q+lH3xetuV3o05zj3pzpdid5zb24pbcSvcuL80rLKtWFQPBDO9Zl9RInAZ4jDcAwyqci7ovdCBE0KioKa8PCwo4ePYqOZKN57FIwj6d1Fuvly5djJNtQOoQtJpsHAjMZkI8OYQZ+9dVXVGeq+J9QFK6r955ef/11+qQv/1BqRkcZpNbWVhZrViu2a4w0fW0ahCfAyHFkhDiyQ2VvwKrHSQXDz5FCKIrHFJVWRz5ykgwkjCWV8n8VbbWVxKSX5RekPqyyNJSONuRYtGZYN6V5tlx2vJ2wtio3oaj8WnH51ZLScuMVJiiENhDRSavylUZqmvEVR5Ugj9rAcFRNIpu6U1AThlvgXnCO/JRANkrjWxJcxcn2NrfDSSLxqFGj2NWQZs9DZ5q6te9hRkeBnqV/2ZCxj1QjwbETHsnQ8eOT0h354/my0pLK8sqq0rSfCucackYYLo8wxA0yXHjzXtziB+EW15P8ispquc6U+3G0l/mkSjvyx8x/vKor5eAuW22esX777Td578m8joL6WyjxQPU+4aTXKSkuKWvO9TCkvGOIHmg4+ydD6L83R1o3XbCryEkoKi035dIJAnNycjIbcflbKPSeo3T9c3K0qKi4rKQw+0a6X2vcgh/Pj7t/5u9NkQ6VWdFFJToKCjhKHBVHFb3naBGqtPnyXCgsLCotKKqgCUWFBUWF/K+ksLjc9KV+sFtNSkoSRxW95Ki9vX0hnrTJ8hwpKigsLigq4T/SpnNawp718uXLbOLFUTC7ozeN7z05OjryoNqJo4/96vk6Te0K0+deBEcTExOdnZ3lvScwo6M8jar3niIjIxcvXqwGu6CHwPjKykoKrDKSl5fHRkL9ZGPK0Q0ohK0zx4yMjM7bTDbui5yszleN0AYa0/bLU1mZapX6WarG+JIKTe1KJ5Cf/ejChQszMzPv37/PJDf1aZ/EjI6q956mT59O4Z988skjw6M8UL9BMq6urq5xcXEMpPqKk6RZ7Fjy1DMEQ95+lfpJcv/+/Ti0ffv2AwcO1NXVEXi+/vprLjQW3y2ogpIXLVrk5+fn6elJ1Uo1jjQAKZV2fExPT+cMm5nY2FgHBwc7O7ujR48yOU8Y4Zbj4+MDAwNDQ0PZ7VhbW69bty4lJYULTTU9AQqn2DfffJOuYysv7z0ZDTWDo6xTy5cvp+Tdu3ez/afT6X2OoCINjwXHjh3DLdI2NjbffPPNmTNnlJEMeVhY2IIFCy5duoQQISEhZ8+eJZt64D1y5Ai6z5s3DwPmzp371ltvUWZERMTs2bPRwljDs0MjmTMbN26cOXNmVFQUt8AESE1NRbW0tDQaQDooKAjVmA9Tp07dunUrZz777LNDhw6dP39+0qRJFy5c4CQlEP/UX8u4KXT/9NNPExISsrOz2/vhSZCfG3dycmKG0IE7d+6U957a6FlHCaIsbe3vPRE/srKy6H3sVCsgUXPatGkbNmwYM2YM471ixYqlS5dOmTLF398/JiaGsecS9e86kVi1ahX+ETgJq3zF4F28eHHlypWoTJroRS24zo4CoVUVzwyNRETmzPjx4zGMWJ6cnDxjxgwXFxfWBBbf4ODg9evXz5kzB41oPA3w8vLiRrjl+vp6TKUxGOnt7U1APXnypJWVFR2CviTQvb0TOoFQTSds2rSJrhs7duwbb7wh7z31vKNN//rvPfHM1NFR1nGGnGDz4MED/GM8EI5jeHg4ERcDGOmWlpYlS5awYhLP2DMQdJGY9RRTKZydn6WlJY5yIb5SiJubG2Khl6qiOyA6URPzaDMKenh40NRffvmFNvv6+tJIwtv777+vfmZnbqAjmRuM7zhjsK2t7a5du7gEq06dOkWzcff06dNMIbVbfSo4yk2x/6Hr5L0ncznK8LCLGjJkyIABA+hcupsIRO/nGmEsGVf2ZwTUzz//nCWbNKPCGsr2y93dHeHIzy6W1ZbVE0HZCRCf1AtQlIDurPVcgsd4wL5w+PDhaq1XVXQHRGcm4B8WItyePXuYCWw6qWvfvn0s2dT48ccfs3CzEwgICOChcNy4cYRVriW+fvvttyhOgku4ccpBX7YunMFRVUXnsJOJjo728fGhhP79+8+aNUvee+p5RwFHGbaXXnqpX79+LOv0O73P2g3IyraM4SdkTpw4EdV49GHI2Y8yMOo1FFZwoiM5kYAn3GXLlqEy17IrwAzc3bx5s4ph7EQJVMQt8qOXqqI7MHNY5dlGswGlFqIa8ZtK1fMT0ZSAja9sUVTbyEDgZ99JI2kGedhxMpdo6urVq9mt8gyEx+xQSZjq6BQu56rRo0czLkxyViR576mNHneU3VhrayvhcP78+TxS0O8dHSVEsY7z9MMmTz3q8i3n1fMEHzkyNqjMkfN4gOUk+KhKUAWqI9kYfvKQUFV0BwpR5ZNW5aMdaY6kqUg1g2zUSDtVI1VONUlUQp1XGThD+0m0VfA0KIr+sbCwYBqz8ZD3nszlKNCzRFO6mBWcmETvM0jAGLN8E0Q5z0ZNudUJ7RcqHvnYO3SstCtpeOZ2ojVxl/6R957AvI4Cm1GekFgccZTeZx1XMH7qtySiC7HWdFYwwhzGUR405W+h0BuO8gzOTjEjIwMvTYMgdApxlGcmnhGbm5tN/diHMbujwFrPs62vry8h85mXv74DXcR+lIWe50g29KZO7MP0hqONjY0s60QFHo2thS5gZWXl6ura0NBws2//CyWK3nCULT8bf+BpnccjoXNYbUpLS1taWm4Z/5kdUyf2YXrDUcWNGzfodKErSPjsSO85KgjPhjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KujOvzgqCHpiclQQ9OWFF/4HE59Us1VShOYAAAAASUVORK5CYII= + + + + + \ No newline at end of file From ccd6ffc56d245b02d27009aced8643b0e56f8ff2 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Sun, 21 Jan 2024 17:48:30 +0100 Subject: [PATCH 11/35] FIX: modified and verified guid typeHint compatibility --- .../ghpython-components/componentize.py | 58 +- assets/CHANGELOG.md | 4 + assets/testTypeHint.ghx | 1024 +++++++++++++++-- 3 files changed, 985 insertions(+), 101 deletions(-) create mode 100644 assets/CHANGELOG.md diff --git a/.github/actions/ghpython-components/componentize.py b/.github/actions/ghpython-components/componentize.py index f02c808..6c7df0a 100644 --- a/.github/actions/ghpython-components/componentize.py +++ b/.github/actions/ghpython-components/componentize.py @@ -13,47 +13,42 @@ import System import System.IO -# 1. x failed to find Type Hint. Using "No Type Hint" instead. (Missing Hint: 87f87f55-5b71-41f4-8aea-21d494016f81) - GHPYTHON_SCRIPT_GUID = System.Guid("c9b2d725-6f87-4b07-af90-bd9aefef68eb") # <<<<<<<<<<<< changed -# GHPYTHON_SCRIPT_LIB = System.Guid("066d0a87-236f-4eae-a0f4-9e42f5327962") # ?? test unsure # <<<<<<<<<<<< changed TODO: to verify if it changes anything in py anc c# TEMPLATE_VER = re.compile("{{version}}") TEMPLATE_NAME = re.compile("{{name}}") TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}") -# TODO: we might want to double check this list if the guid are the same in Rhino 8 TYPES_MAP = dict( none="6a184b65-baa3-42d1-a548-3915b401de53", # <<<<<<<<<<<< changed ghdoc="1c282eeb-dd16-439f-94e4-7d92b542fe8b", # <<<<<<<<<<<< changed float="9d51e32e-c038-4352-9554-f4137ca91b9a", # <<<<<<<<<<<< changed - bool="d60527f5-b5af-4ef6-8970-5f96fe412559", - int="48d01794-d3d8-4aef-990e-127168822244", - complex="309690df-6229-4774-91bb-b1c9c0bfa54d", - str="37261734-eec7-4f50-b6a8-b8d1f3c4396b", - datetime="09bcf900-fe83-4efa-8d32-33d89f7a3e66", - guid="5325b8e1-51d7-4d36-837a-d98394626c35", - color="24b1d1a3-ab79-498c-9e44-c5b14607c4d3", - point="e1937b56-b1da-4c12-8bd8-e34ee81746ef", - vector="15a50725-e3d3-4075-9f7c-142ba5f40747", - plane="3897522d-58e9-4d60-b38c-978ddacfedd8", - interval="589748aa-e558-4dd9-976f-78e3ab91fc77", - uvinterval="74c906f3-db02-4cea-bd58-de375cb5ae73", - box="f29cb021-de79-4e63-9f04-fc8e0df5f8b6", - transform="c4b38e4c-21ff-415f-a0d1-406d282428dd", - line="f802a8cd-e699-4a94-97ea-83b5406271de", - circle="3c5409a1-3293-4181-a6fa-c24c37fc0c32", - arc="9c80ec18-b48c-41b0-bc6e-cd93d9c916aa", - polyline="66fa617b-e3e8-4480-9f1e-2c0688c1d21b", - rectangle="83da014b-a550-4bf5-89ff-16e54225bd5d", - curve="9ba89ec2-5315-435f-a621-b66c5fa2f301", - mesh="794a1f9d-21d5-4379-b987-9e8bbf433912", - surface="f4070a37-c822-410f-9057-100d2e22a22d", - subd="20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08", - brep="2ceb0405-fdfe-403d-a4d6-8786da45fb9d", - geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26" + bool="d60527f5-b5af-4ef6-8970-5f96fe412559", # <<<<<<<<<<<< same + int="48d01794-d3d8-4aef-990e-127168822244", # <<<<<<<<<<<< sasme + complex="309690df-6229-4774-91bb-b1c9c0bfa54d", # <<<<<<<<<<<< same + str="3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88", # <<<<<<<<<<<< changed + datetime="09bcf900-fe83-4efa-8d32-33d89f7a3e66", # <<<<<<<<<<<< same + guid="5325b8e1-51d7-4d36-837a-d98394626c35", # <<<<<<<<<<<< same + color="24b1d1a3-ab79-498c-9e44-c5b14607c4d3", # <<<<<<<<<<<< same + point="e1937b56-b1da-4c12-8bd8-e34ee81746ef", # <<<<<<<<<<<< same + vector="15a50725-e3d3-4075-9f7c-142ba5f40747", # <<<<<<<<<<<< same + plane="3897522d-58e9-4d60-b38c-978ddacfedd8", # <<<<<<<<<<<< same + interval="589748aa-e558-4dd9-976f-78e3ab91fc77", # <<<<<<<<<<<< same + uvinterval="74c906f3-db02-4cea-bd58-de375cb5ae73", # <<<<<<<<<<<< same + box="f29cb021-de79-4e63-9f04-fc8e0df5f8b6", # <<<<<<<<<<<< same + transform="c4b38e4c-21ff-415f-a0d1-406d282428dd", # <<<<<<<<<<<< same + line="f802a8cd-e699-4a94-97ea-83b5406271de", # <<<<<<<<<<<< same + circle="3c5409a1-3293-4181-a6fa-c24c37fc0c32", # <<<<<<<<<<<< same + arc="9c80ec18-b48c-41b0-bc6e-cd93d9c916aa", # <<<<<<<<<<<< same + polyline="66fa617b-e3e8-4480-9f1e-2c0688c1d21b", # <<<<<<<<<<<< same + rectangle="83da014b-a550-4bf5-89ff-16e54225bd5d", # <<<<<<<<<<<< same + curve="9ba89ec2-5315-435f-a621-b66c5fa2f301", # <<<<<<<<<<<< same + mesh="794a1f9d-21d5-4379-b987-9e8bbf433912", # <<<<<<<<<<<< same + surface="f4070a37-c822-410f-9057-100d2e22a22d", # <<<<<<<<<<<< same + subd="20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08", # <<<<<<<<<<<< same + brep="2ceb0405-fdfe-403d-a4d6-8786da45fb9d", # <<<<<<<<<<<< same + geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26" # <<<<<<<<<<<< same ) -#TODO: double check, don't know this param EXPOSURE = dict(valid=set([-1, 2, 4, 8, 16, 32, 64, 128]), default=2) ACCESS = dict(valid=set([0, 1, 2]), map=dict(item=0, list=1, tree=2), default=0) PARAM_TYPE = dict( @@ -317,7 +312,8 @@ def create_ghuser_component(source, target, version=None, prefix=None): params.SetGuid( "OutputId", i, System.Guid.Parse("08908df5-fa14-4982-9ab2-1aa0927566aa") # ?? <<<<<<<<<<<< changed ?? ) - # FIXME: the "out" guis is 3ede854e-c753-40eb-84cb-b48008f14fd4 to replace up if you want to add it + # FIXME: the "out" guis is 3ede854e-c753-40eb-84cb-b48008f14fd4 to replace up if you want to add it : + # here we could add a "out" parameter as an option to be set in the metadata.json <<<< # ------------------------------ # input parameters diff --git a/assets/CHANGELOG.md b/assets/CHANGELOG.md new file mode 100644 index 0000000..a2de4d9 --- /dev/null +++ b/assets/CHANGELOG.md @@ -0,0 +1,4 @@ +- port to py3 +- added new guid for typehints (extrusion and pointcloud) and modified the old ones for str, float, ghdoc, and none. + +- [?] propose type-hint for component hints instead of the metadata (?) \ No newline at end of file diff --git a/assets/testTypeHint.ghx b/assets/testTypeHint.ghx index 412c760..98ed55c 100644 --- a/assets/testTypeHint.ghx +++ b/assets/testTypeHint.ghx @@ -49,10 +49,10 @@ - -33 - -48 + -292 + -3174 - 3.9772015 + 6.476208 @@ -98,9 +98,9 @@ - Scripting component + - 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 e98563e8-3930-435f-b288-b340ed9a8197 true @@ -115,29 +115,55 @@ - 54 - 51 - 147 - 64 + 55 + 43 + 184 + 604 - 121 - 83 + 159 + 345 - - 3 + + 30 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa - 3 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 2 3ede854e-c753-40eb-84cb-b48008f14fd4 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - + true @@ -158,14 +184,14 @@ - 56 - 53 - 50 + 57 + 45 + 87 20 - 82.5 - 63 + 102 + 55 @@ -191,14 +217,14 @@ - 56 - 73 - 50 + 57 + 65 + 87 20 - 82.5 - 83 + 102 + 75 @@ -224,106 +250,964 @@ - 56 - 93 - 50 + 57 + 85 + 87 20 - 82.5 - 103 + 102 + 95 - - - The execution information, as output and error streams - 7a28daf9-b80f-43d1-b104-277848a24ec3 - out - out - false + + + true + Contains a collection of boolean values + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC + + 34d04512-af02-4f48-8ead-6cb031558fd1 + + boolIN + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 57 + 105 + 87 + 20 + + + 102 + 115 + + + + + + + + true + Contains a collection of integer numbers + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOdSURBVEhL1VU5SGNRFI2KQSTuu3E37rvRuOGCCwhRAioOphPsbKxEUIIgDFiksbXQRsRCgjbaaBGwESdgZWWlMDPIDCl0Js5MOHPPS/7H0bhMNcyFS15+fs4995z73jP8q7BERUV9k0/8Rb6TfFvExcV9WF9fx8nJCbxeL46OjnBwcIDd3V1sbm5idXUVMzMzsNvt6OrqQllZGYTQR/mrMYTwQsTExDjkjz83NjbQ1tam0mazoaWlBc3NzWhoaEBtbS0qKysVcHFxMaqrq2EymW6jo6MXwzDPhjEpKenL9vY2xsfHFTtmZ2enKsQiTU1NqKurU6Dl5eUoLS1VWVJSAilwJxjmEFSEiI2NfT89Pf1reXkZ3d3d2Nrawktxfn6uwIuKilQnQu5epPKE4Z6EJTs7O7C2toaBgQH09vbi4uIiDBU5VlZWYLFYVIH8/Hzk5eXRC3ZhDUE+CNHeOzY2hqmpKSXL6OgogsEgfD4f9vf3sbe3B4/Ho4y+vr5Wv1E2rQDBc3JykJKSEpQivjCsHvb09PTvk5OT6k/UfH5+HktLS6oTysVnNLu1tRU3Nzc4Pj5GRUWFLhELiAIoKCiATOGtYDpD0GKssP/U3t4OJo3UikQyeXZ2VskzNzenm1xYWAiz2YysrCxVhAWli6+CbTKI8660tLTvBOcIchQJRLYEZT4c08PDQ/j9fjQ2NupjSv1zc3ORmZmJ1NRUVVTW3Khug1TyV1VVqdlmsghH0Wq1/pF8xm4CgQB2dnZ09g/1z8jIoAeqUH19PXe3nwXcMl53nG2tENcsRJZMrvnM5XIpeZxOpzL3IXvKI0ogOTlZ4cjzUAfUiXrxZe5OJjdRTU2N3hXXfHZ6eoqrqysdnIZSe+pO9pSHnVBS8TXkQTicRqPxlm1TV35yQrSCXPf19Sn23CcauCYNJdHY0zP5zr2gT5EKzi5f5JantkwyZXLtdrtVAY4tZSHzx+B8V8Y4KHBP9gHDxrOEpkXKy8tLnJ2dKdbUnLJo4DSW8gwNDSExMZHaP93JDOnCIy/ekzGBtBwZGVHsFxYWFGsaSs015gKqRlgm54fAPHsWMczsgh5QBrLUkqBkrAGTsUwfEhIS1O+8G8THl0/TcCxKy3ecHDk+9NRAKYfGWu4AxMfHo7+/nz4R/NX7gGEUqT5zLDs6OtDT06MAqO/w8LBi6nA4wINxYmICPL8GBwfffqOFg/fr4zv3tXz7nfwfhcHwG4jlh0fOcQdLAAAAAElFTkSuQmCC + + c9441893-a6a4-4129-8bcf-916e2d02a6c0 + + intIN + true + 0 + true + 0 + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 57 + 125 + 87 + 20 + + + 102 + 135 + + + + + + + + true + Contains a collection of complex numbers + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAARUSURBVEhL1VVXSGZnELVgRRFBUFx774i9d+y9V+xdUBELliiCYosgPogF1AcRVFTcBxVRwQcLykYM+OTzriy6SSSrf9TN5Dvz/xGX3Yh5Chm43J/73+/MzDln5sr9V2EhLy9/K+70L64Mcb0uVFVV3+Xm5tLx8TEdHBzQ3t4ebW1t0erqKs3MzNDg4CBVVVVRSkoKBQYGkqmpKYmC3oujylKEF0JRUTFBS0vrYWpqiry8vMjX15f8/PwoICCAgoODKTQ0lJ/b29uTjY0N2dnZkYuLC6mpqX1WUFBok8H8YyirqKh86unpocbGRiosLKScnBxKT0+n6OhoTuTq6kqenp7k7+/Pv62srDiRra0tugCtb6RQ3wklJaVeCwuLL11dXQyAiiMiIhg8MTGRsrKyKC0tjYKCgsjJyYkrRzJra2sS50hbW/teJFmRwX0TFoJ7yfj4OLW1tVFLSws1NzdTbW0tlZaWUnJyMifFFRcXxwnd3d25enSCDgwMDNDFZ4HlKoV8FoL7PfANWnCHeOHh4QyGqvEcybKzs/l/6ID/kNDc3JwcHR25E6HfF5HknQxWGgI8Vl1dXdLe3s6V9/f3s1N6e3upo6ODqqurKSkpiTWIj4+n8vJyvjs4OLDooNLY2Ji7gOgC73cBmy1FF8IK7j9mZmZSXl4ehYWFkbe3N/n4+PBh8J+fn08NDQ2cDNZ0c3PjrmAAAOJddKKvr89JZbb9JLA15IS1ftDU1LyLiYnhyrq7u2lsbIwmJiZoZGSE4Ch4HmKHhIRwN/X19Sxua2srra+v09HRERcF0XV1dfk/wQgcNYAEv6HCgYEB5jkyMpI8PDxYOOgQGxtLlZWVNDw8TH19fZz05OSE7u/v6e/Y2NggQ0ND7sLIyIjMzMzI2dkZ0/2rnGjlR6G+BKBIAP7n5+dpaWmJZmdnWYuysjJOury8LIP8Ojo7O3kQTUxMmC7QJCx7xx2AJyHKL2gXHEM8tIpJhVvAOQCmp6cpNTWVkz8PdIJhgyaoHlSBoicNZJGNUY+KiuKK19bWaGdnh3fP0NAQQR8M19zcHF1fX8ugpXF6evo04XAT3tPQ0AD/Ty7iEEP2c0VFBRUUFPDL8DZoKS4upoWFBRodHaWrqysGPTw85GcITD1MoKOjQ0VFRWRpafmnqP4nGexX4SGouq2rq6Pt7W06Ozuj3d1ddkpGRgbd3d0x4ObmJmHaYUV0CVPArlgdJSUlJCwP7r+dZITo4q2Yg0fMAsYegq2srNDDwwODX1xcMA1YhAkJCTx8uINzGEGcuReuXJXBfTfeiBduJycn6fLykvb390kikTA4vgmoFILDjjAE3FJTU8NrArMhqHl5m8qiTXha0tTURI+PjwwOSuB17BoIjbWAedDT0+PVgiEUmv2Bs1KIl0NZdPFxcXGRwW9ubhjg/Pyc3YQvHDYpEsKaEBtbVZz7gLOM8IrA9/X59/Y11+u/yf+jkJP7C1KGDFdrAynWAAAAAElFTkSuQmCC + + 20191268-d2a6-48bd-9e65-c88245cb497e + + complexIN + true + 0 + true + 0 + 309690df-6229-4774-91bb-b1c9c0bfa54d + + + + + + 57 + 145 + 87 + 20 + + + 102 + 155 + + + + + + + + true + Contains a collection of text fragments + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAO8SURBVEhL1VVLLJxhFB3ERMT7zXgb71e8X/GId2IhQZTuJGwktjaNxqpYNAQbsWBHiDRsbNgIC4lWYiUs7LSVtLqY6UNNTu+58/9Caaurpie5md/85px7z733+yz/CnYPD4/P8om/iCcSj4OPj8/r+fl57O3tYWdnB9vb29jc3MTa2hoWFxcxMTGB/v5+tLW1oaqqCqmpqZCE3spPrW6G38DLy6tdfvh9YWEBZWVlGqWlpSguLkZhYSHy8/ORk5ODjIwMJU5KSkJWVhb8/Pwcnp6ezwyaX8IaGBj4YWlpCZ2dnZodo7KyEu3t7TBxcnKipGlpaUhJSdFITk6GCDiFw+amegDe3t4v+vr6rkdHR1FdXY3a2loNPs/NzcHlchkSQHNzM9LT05U8MTFRK5HkvolVrwy6e7BHRUV9nZ6eRkNDgxLX19dr8Pns7AwrKysGPTA5Oak22e12FYiLi0NsbCx7wSqK3JS3IN7vdHR0oLe3V225LTAwMIDj4+M7Nh0dHd0RIHl0dDSCg4NdIvLGoL1BW1hY2Jfu7m5tKj2/bdHy8jKmpqa02aenp4YEUFdXd2MRBcQBxMfHQ6bQIZxP3dTSWMn+XXl5ORicFlOElVDo4uICLS0t+m52dtagB8bGxlQgISEBNpsNkZGRKkJBqeKjcPtZpPPPQ0NDv5CcI8hRJBGzpdDQ0JDugjmmXV1dBj1wcHCgzaX/MTExiIiIQEhIiIrKMxf1pUWUPmVmZupsMyhSUFCAoqIijY2NDQwPD+t35g6cn58bEtBKTf/Dw8PZAxXKy8vjdn+iwEsZL2dubi5MIT6TjBU4HA6D6mGMjIxo9rRHnEBQUJDySFXuCugT/WKpnAoGlyg7O1szX11d1Wd+x3dcrp6eHoMe2N/fV9+ZPe1hJbRX+urugYGnVqvVwR9z/fnJJTo8PMTg4KA+m+/oL0fz8vJSBa6vr7VaM3tWLRZxF26mSMHZpXdceZKMj48rAQX4N4NVmku1u7ur74mZmRklp3BJSYlL6O7tAVHKs4QEXCITTqdTjwmOIonZo/X1dVxdXRn/4cbW1haampoQEBBA7+9vMiFVvBIfvzFbTsbt4JyzmfSYDaXnpi1CqiMsk3MlNL88iwgbq6DfzJbNM4OktNAkZkNl+uDv76/veTdIH39/mhp4JrPs5OTI8XETJinn3Mxa7gD4+vrqeSVVk/yP9wFhFavecywrKipQU1OjBPS3tbVVM+Whx4ORW83zq7Gx8fE3mgHerz/fuX+Kx9/J/xEslh9QdsIn89F0TQAAAABJRU5ErkJggg== + + 54638b6b-4503-4b8e-9f7c-405ac455fddf + + strIN + true + 0 + true + 0 + 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + + + + + + 57 + 165 + 87 + 20 + + + 102 + 175 + + + + + + + + true + Contains a collection of date time format strings + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAP7SURBVEhL1VVZKOVxFL7ITbr2PUv27GK4tpCtlAeFTOZNefEuybVvMbaskcKDeNIoyQtlSd5GQjx5xKSZLu6dO2OGM+c7d2lmjGWepvnqdOX//33nd77znfNX/CsEWVlZfeFf+ot4zfEy2NnZvZ+amqKdnR3a2tqi9fV1Wl1dpcXFRZqdnaWenh6qqqqioqIiysjIoLCwMOILnfNRpZHhCdjY2BTzwW8zMzOUkpIioVarKSkpiRITEyk+Pp5iYmIoIiJCiIOCgigqKoocHBx01tbWGhPNo1A6OTl9XFhYoNLSUrkdIj09XRIhSUJCAsXGxgppeHg4hYSESAQHBxMn0DOHr5HqD7C1te2qrKz83tLSQpmZmZSdnU35+fk0OjpKR0dHZMbJyQlNTk5SWlqakAcGBkolfLmvLNU7E90DhHp7e38ZHh6mvLw8IS8rK6PT01MT7UPo9XqqqamRBP7+/uTn54deoAq1kfInsPZbJSUlVFFRIbLk5OTQ5eWlEGm1WlpaWqLe3l7q7u6m+fl5Oj4+lmdAQ0ODkPv4+JCLi8sdJ3lvorWgyN3d3VBeXi5aQ/OOjg45fH9/TzqdjiYmJqirq4s6Ozupra2NIOPKyoq8c3t7KxWzAhQQEEDsQh1zvjFSc2P59hepqamEQCORZHd3Vw5vbm7Szc0NXV9f09jYGLW3t1Nrays1NzdTY2Oj2BhAVV5eXpIEknEVn5hbpeDON7m5uRlADgvCikhydXUlB0E6Pj4uCZBobW1N5DEYDPL/gYEBee/8/Jw8PT3J1dVVGs9/f+YE/QrOpI2MjBRvI5AEVjQDmkOWkZERkQK4uLigjY0NSyUAnnl4eKAHkiguLg7TrUWCfraXHt42J8LfaCwwNDQkmoNscHBQLAtp0Nj6+nrq6+uT987OzoiVIGdnZ+FhV6GCtxwKFfSCjzGdCAzR9va2HFxeXpaG4qZNTU2/kNfV1UklwNzcnMgDJ2Hyua/GHpjwRqlU6jCZGH/81tbWykH0AjKZiTUajYUc1gUgD4yB2+OXJcIsWFwkgHf5wR1GHk1Ckv39fSHAPMAlqAJJpqen6fDwUJ4BGDaQh4aGUnJy8h3TPZgDQI1dAouZg1+WtfAYMB/V1dXSWMhTUFBAjo6O0P6VkfI3cBXv+MWvqACTiUBv0OC9vT0TLdHBwYHYE1Xi5kwq9mbn3DLNo7sI8EUVOIjdgqExB4YI9oMV4RbcmN2HNS3P8W3gPj69TU3QcMn66Oho4vVhCTMp5DDfWqVSkb29PeXm5qJvIH/2ewAoWaoPsCrWcVZWlhBA38LCQrlpcXExYTFi22J/YaXzmTOcNVI8D3xff//mPhcv/yb/R1AofgDDYCWfApckvgAAAABJRU5ErkJggg== + + a92dc761-ffa4-4aba-a5f3-3bdc91cd9691 + + datetimeIN + true + 0 + true + 0 + 09bcf900-fe83-4efa-8d32-33d89f7a3e66 + + + + + + 57 + 185 + 87 + 20 + + + 102 + 195 + + + + + + + + true + Contains a collection of Globally Unique Identifiers + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAANySURBVEhL1VXJSmNREI2KQSRxinGKUzTOExqNEyo4gJBFcMDWZCGCfyE0WTUYEMGtC925EjeCuHATcBvMNwR7ALtxoa2mI9V1Kq80xnboVdMHitx338upW6fOvdf0r+DMyMi45V/6i/jA8T7k5OREtre36fT0lMLhMJ2cnNDR0RHt7+/T7u4ura+v0+rqKnm9XhoeHqaGhgbiBX3hv5qTDK8gKyvLx3/8tbOzQ/39/RIej4d6e3upp6eHurq6qL29nZqbm4XY6XRSa2srWSyWq8zMzDWD5kWY8/Pzv+/t7dHc3JysDjE0NCSJkKS7u5s6OjqEtLGxkerr6yXq6uqIE1wzhyNJ9QdkZ2d/WllZSQSDQRoZGaGxsTEJjJEElbjdbqmira2NmpqahLy2tlYq4cXdsVQHBt0zOMvKym63trZoYmKC0oFK0pFIJOj4+FiSV1VVUWVlJXqBKtxJyhSw9uHZ2VlaWloSssXFRYOGyO/3y9zMzIwx8xTn5+fSl/LyciosLLznJBGD9gHe4uLim4WFBdEaK4IsilSJFJBocHCQzs7O5Hlzc5NYAaquriZ24RVz+pPU3Fhe/deBgQFCoJGaRIGxNlmhTV5eXpbnaDRKpaWlkgQ94Sp+MLfFxJ3/aLPZbkCO5sGKIEpdbapNFWpT/e7i4oJKSkqoqKhIGs/jn5xgw8SZLltaWkRDBJLAinCLAmPM4Z1CLYokQDweJ7vdjh5Ios7OTuzuSyTYYHtdw9uaCONUMowxh3cKl8sl1tSqUAErQQUFBcLDrkIFIQ6TBXrhY5SNgL5oogJjzOGdAt+joYFAQJ7RbMgDJ0E27muyBwb8ZrP5CmWjZPxiEykw1ncKkKOySCQiz6FQSFYPM7BE2AsPLhLAu9AOWx7aYgcrxsfHZW50dNSYeYpYLCYVQba+vr57pnu2DwAPzhJYDJGOmpoaY/QI7OTDw0PpD+SZmpqivLw8aP98JwNcxQF/eIfVYtunhsPhoIqKCtEYfodjtKlMKs1m58SZ5sWzCHCgCuiNswWbRgOkkFCJsWJ2H1mtVnmPu4H7+PppamCNvXwN5/Dx8RBKCp/rqvkOoNzcXO0RyN+8DwAzS/UNtsRZg8aCAPpOT0/LSn0+H+FgnJ+fJ5xfk5OTOBo+479JireB+zX9zn0r3n8n/0cwmX4DjLDvWeS4uIwAAAAASUVORK5CYII= + + 7a50333d-270f-435c-8b34-272d4cff535e + + guidIN + true + 0 + true + 0 + 5325b8e1-51d7-4d36-837a-d98394626c35 + + + + + + 57 + 205 + 87 + 20 + + + 102 + 215 + + + + + + + + true + Contains a collection of RGB colours + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVHSKxnFB0VjMqz99577w17xYJYg7NREBVcKS4UhKCrB5EsRdCFG1FcyODKhRWjiChPREQXloWQPJGE2Dsn37njyHuaV7IKuXD5Z+af/5x7zz33+zX/VQQYGRndqiv+Rf6o8vvCzMzsw/DwMFZWVrC0tIS5uTlMT09jcnISExMTmJ+fR3t7O0pLS5Geno7AwECogn5Xj5rqEb4SJiYmFerBh5GRESQnJ0smJSUhISEBcXFx6Ovrw9raGnJycgTY19dX/hMUFHRlbGzc8wzzzxEQEPCDtbX1H+Pj46iurpbqmpqaUFdXJyAkmZqawubmJsLCwggKf39/NDY2Ii0tDYrgSsG469FeBQAjc3Pz921tbY+9vb3IyMhAfn4+9vf3sbq6KgDsZGNjAx0dHQgPD0dwcLAQ+Pj4SCequDslle4Z8k0EuLi43I2OjkrVWVlZKCwsxOHhIU5PT5GdnS1dbG1tITExEREREQgJCYHqWgg8PT3h4eHBWbCLJD3kJ6G0/7Wqqgr19fUiDQlyc3PR39+P8/NzaLVapKam4vj4GCUlJW8ICO7q6gpbW1uSfHiGfYlSBweHG4PWlIMSkYRJNy0vL8twHx4ecH9/j7Gxsc8kIoFSAF5eXlAuvFSYWj20spaq/mNKSgry8vJQW1uLzMzMFxIOkDYl6NPT00seHR1hcHAQra2t8Pb2hru7O5ydnYWEhKqLPxX2O42a/E/29vY3bL+mpgb0P72v0+mwt7eHi4sL3N7eSuUEZvDK7+vr62Jd6u/m5gYnJyfY2dlJV4rsWhH8olFMf4WGhoqmzOjoaMTGxiI+Pl4ISXRzc/NZB4+Pj/Kd7uIuGPR3dHSUGZAoKiqK231Ogp+Vva4iIyNhIOJnEsXExGBgYACXl5fSBUENMyApf+/u7pbqKY9SAjY2NoKjJGMH71Vq3lEv+piuYHKJ6HOS7e7uYnFxETs7O2LXk5MTXF9fY2ZmBgsLC2LjsrIyNDQ0SOXshPuipNfP4Dm0pqaml9xMtswrh93c3CyEdEtRUZG0XVFRgbOzM1RWVoo0HDJ3g0bgsOlCRcRdeHGRBL2rbjz5+flJ5eXl5ejp6RGfc2hMdkmHsIuhoSGpllXTgXQd90eZ5UnBvdkDRjzPEgKwCi4ZPxuS4IZtPTg4wPb2thRC3TlYuoebb2VlRe3j9ZCvQnWhUw/csWoCGZKycbF42LFqLt3s7CxaWlpkqApU7KokvFcwXzyLGO7sgjNgtVwaJheus7NTZKIVu7q65H3AuVhaWsp/+G5Qc/zyafpJ9KiWr+gidXxIkozglIFyUDLDfQsLC5FT3Sf4198Hz2GqpPpIq3K7eWwQoKCgAMXFxVIpncSDkYvI84vHunrmNz6rh/h28P36+p37rfz+d/L/KDSavwHpj9jOYnz2uwAAAABJRU5ErkJggg== + + 71d7f714-14ff-49c9-8cd5-da817b22bee0 + + colorIN + true + 0 + true + 0 + 24b1d1a3-ab79-498c-9e44-c5b14607c4d3 + + + + + + 57 + 225 + 87 + 20 + + + 102 + 235 + + + + + + + + true + Contains a collection of three-dimensional points + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOVSURBVEhL1VVJS5tRFI2KQSTOs3E2zrNxnnEAIYuAisXsBP+FUFwVLLhx60IXiisJuFCcRXBZ/4UmFVpcaFtb4+k9N3kfonXoqvTC5XvfdM695977nu1fmSsqKuqbXPEX/k78bRYXF/dpaWkJp6enODk5wcHBAba3t7GxsYGVlRXMz89jZmYGHo8H3d3dKCsrgwQUkF/tYYQXLCYmxis//lpeXkZ7e7t6W1sbWlpa0NzcjIaGBtTW1qKyslKBi4uLUV1dDYfDcR0dHT0bgXnW7ElJSV/W19cxPj6u0dG7urqUiCRNTU2oq6tT0PLycpSWlqqXlJRACG4EwxmG+oPFxsZ+mJ6evpubm0Nvby/6+/vVuSYJM3G73ZpFTU0NKioqFLyoqEgzkeBuRSp/BO6JubKzs38sLi5iaGhIgQcHB9W5ZibMggSNjY2WTC6XSwny8/ORl5fHWjALdxjygYn2J2NjY5iamlIwQ+Dz+eD3+zEwMGARtLa2Ym1tDcPDwxYBwXNycpCSkhISkrMIrGWe9PT075OTkwpCOSgL6xAMBnF/f4/j42Ml7ujowO7urj4LBAL6rSEQBVBQUADpwmvB9IWhpbASfZA/0llIQ8KoDw8PFYx+dHSE/f19635nZ0dlKiwshNPpRFZWlpKQULL4KtgOm1T+PaMnOIvHViQJC0qinp4eC9QY18yCncTiUv/c3FxkZmYiNTVVC5+RkcFBXbAJ01VVVZUWjU4StiK1Nk65KFUoFMLd3R0uLy+10KaDjP4CyhooUX19Paf7igQLycnJN+xtQ8Q1iQjCghrNjXG9t7enc2CipzxpaWkQLMURyZjBR3Gbg3oxVepJZ+rsc2ZCnQloQLe2tqx7vmMG1J3RUx5mQnmtGkTMZ7fbrxkRx59XDhH1Pz8/t8DM9G5ubuqzi4sLDYKSmOhZN7nnLFhdpCaMZ/yQI2/Gnz3e19eH1dVVzYxZMmI6N8MImAXO70XSkMA9mQNaG/cSA/DY2YpmWqk5ZTHgLCzlGRkZQWJiIrV/Osk0ycIvH94yegI9dPY5gakxC0rNTeQCqu0tnfNTYJ7di2hOZmG6g1EaJygjNsCMWDY3JCQk6HueDVLHl3fTiM1KyjfsIhlAyw0o5TBRyxmA+Ph43bMka4K/eh7Q7CLVZ3ZMZ2enFpkA1Hd0dFQj9Xq94MY4MTEB7l/c9OSft51oEeP5+vjMfc3ffib/R2az/QbZBI6jxUGJaAAAAABJRU5ErkJggg== + + f0ee7fe5-3f0a-4c1a-8d4b-6d8de84318d2 + + pointIN + true + 0 + true + 0 + e1937b56-b1da-4c12-8bd8-e34ee81746ef + + + + + + 57 + 245 + 87 + 20 + + + 102 + 255 + + + + + + + + true + Contains a collection of three-dimensional vectors + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOTSURBVEhL1ZXJS5thEMajYhCJe1zjFo0x7ks0iiLihkIOwYUUvSl6EFFB1ItSPBUsCiLeBBU8eBKPIqiHgMf232h7aPGgTWKr03nm+95gTFx6Kh0YvojJb2aeZ973M/yrsMXExPzkJ/1FvuN8WyQkJHza3d2lq6sr8vl8dHFxQaenp3R8fEwHBwe0vr5Ok5OT5Ha7qb29ncrKyogb+sI/NWqEFyIuLs7DP/y1v79PLS0tki6Xi5qamqixsZHq6uqourqaHA6HgK1WK1VWVpLJZLqJjY1d0THPhjElJeX70dERDQ8PS3fItrY2KYQiDQ0NVFNTI1C73U6lpaWSJSUlxAVumWHRUFEiPj7+w/j4+O+1tTXq6Oigzs5OSXxGEUzidDpliqqqKiovLxd4cXGxTMLNBVmqEx0XEdacnJzA9vY29fT0CLi7u1sSnzEJpkCB+vp6mWRqaorgFTwqKCig/Px8eIEpnBryUbD2PpblfnR0VGDRCgwODtLGxoYYHwgESMXh4aHAc3NzKS0t7Z6LfNaxoXCbzWa/1+uVLiFHNIn29vZ0ZHhMTExIAVaACgsLibfwhpljGpqN5e6/tra2EhJGqiLRTD4/P9exWvj9fvHCYrFQdna2FIEnPMUPZpsM7Pz7jIwMP+AwD6sIEAwFFKnWdHl5mYLBoI7W4vLyUvTPy8ujrKwsSk9PF+MzMzNxUD8auNJ1RUWF7DYSRWAgzHycS0tLAn94eJDn2dmZFFhdXQ3pz1B4IIVqa2txuq9RYJPX6xa7rQrhMwphW5CLi4th8Lm5ObLZbLSzsyOyonvIw0pQamqqcNgLTLDJaTBBL+wxTicShwh7jmILCwth8NnZWYHj+zAU2kN3dA95MAkkZV81D/QYMxqNNziZOP54wrj5+fkIOPRVcCUNJFHdwzP+G2chtEUS2F18EUcekP7+/jD4zMyMgLEhMBWdP4Vjsubm5nvGRZwDhAt3CQAqt7a2BD49PU1FRUWh0wrNIYuCw1jI09fXR8nJydA+8iQjeIoT/mIQEwCE7Orqkic6Bhhdw1BorjpnqKw3b84dY569ixAWTAEP0C26VAkoOlZgdMzbR0lJSfJ/vBvYx5dvUz1WeORbbBFfH6FUUMihuuZ3ACUmJsp9xVMD/ur7AGFkqb5hVXFFqEsP+g4MDEinHo+HhoaGaGRkhHB/9fb2vv2Npgfer0/fua/l29/J/1EYDH8AZ/CWe/XcHf0AAAAASUVORK5CYII= + + 3e2592d7-f6ba-4bb9-be76-dc519e8d544c + + vectorIN + true + 0 + true + 0 + 15a50725-e3d3-4075-9f7c-142ba5f40747 + + + + + + 57 + 265 + 87 + 20 + + + 102 + 275 + + + + + + + + true + Contains a collection of three-dimensional axis-systems + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQeSURBVEhL1VVZKC1qFN7ITjLPbPOUeTqmDClDSFHIzXlTHrxI5mEbSydOzgMPHsjwYBbHg6IQER64hDyQvCiXMuwH+x7HsfvOv9Yecq97znGfbver1d67/f/fWv+3vvX/kv8K3np6en+KT/yL+E3E22BkZPR7f38/Njc3sb6+jpWVFSwsLGBmZgbDw8Po7OxEcXExsrKyEB8fDx8fH4iC/hBbpWqGn8DAwCBHbPw2NDSEmJgYjujoaERGRiIiIgKhoaEICgqCn58fE3t4eCAgIAAmJiYP+vr6cg3NDyE1Nze/HR8fR15eHldHERcXx4koSXh4OIqKirCxsYGTkxPExsbCy8sLnp6eEAmUgkOmpvoHGBoafhCbn1tbW5GYmIikpCQO+k5JSkpKsL+/j5fY29vTnUQU91VI9VlD9woeDg4Ojz09PUhJSWHi5ORkjurqahwdHWkogbu7O+7H5eUl/56YmICLiwucnZ2pF3SKd2rKFxDarwtZVIWFhSwLJWhubmYZtLi9vWViuVyOhoYGTE5O4unpif9rbGyEo6MjLC0tVSLJnoZWhywbG5svBQUFrHVpaSlOT095I+Hm5gZzc3NoaWlBW1sbRkZGcHBwwPIsLi5CpVJxouzsbLi6ukK48EFwvldTi8aK6q+oWRTUyPv7eya+vr7miqkndJrp6WkcHx9jZ2cHAwMDLF15eTmvIVAhYWFhcHd3J6nuBLeJRHS+2dra+guRkwXJiufn57yhq6uLiZuamliCpaUlrK6uoqamBlVVVaioqEBZWRnHxcUF79ne3mZX2dra0qB+lIhMCn9/f/Y2BSVZW1vjxX19fay3VvPe3l5udn19PSorK1FXV4fZ2VndiQlUgJ2dHUJCQmi6FZTgk7CXMjg4GNpEY2NjvHhqaorJiKi2tpbj8PAQg4ODWF5ehlKp5HWEra0tUA8tLCyYR/RCfQLSifQiH9N0UrS3t/MmkoTkoCC9Ozo6WL7n52f+nzA/P4/MzEySBFZWVuwkmnzRV3UPNHgvlUoffH19eWhooAi7u7usdXd3918G7PHxEaOjo0hISGBCkkT0kasnF4rfNAs6FzHIu7SQRj49PZ2JyEVnZ2f8naBQKLgP5BSZTPaK3NvbG1FRUSpB92oOCNF0l5DF6PJ6iaurK/Y/yUfT6uTkBDH1OnIxXCxPWloazMzMSPvXk0wQp/gsFn4lm1ETqaHkczc3N66YiKlqe3t71lxbuSBlewvnPAmaH95FBBmdgnpBdwtVqQ0ipYq1xFSxcB9MTU35f3obRB9/fptqIBdHVgYGBkJcH7rQkpIc2qrFGwBjY2O+EMWpifyX7wFBKqS6pj7QFa29VUnfjIwMrjQnJwe5ubnIz89n76empr79RdOA3te/v7m/ire/yf8jSCTfAVRIIgekIvzJAAAAAElFTkSuQmCC + + 4eea64b8-b512-4309-b10c-919320df4e6d + + planeIN + true + 0 + true + 0 + 3897522d-58e9-4d60-b38c-978ddacfedd8 + + + + + + 57 + 285 + 87 + 20 + + + 102 + 295 + + + + + + + + true + Contains a collection of numeric domains + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOYSURBVEhL1VVJS1thFI2KQcR51jgb53meUMEJIYuAitWAC8Gl+geC1VXBQje6VNSdIKi4UhAHBLf+AkXBRdtFSxStta2e3nOTF2xtNF2VXvj4XvLeO+fcc+/9nulfhTUgIOCL7PiL9UqWfxESEnI8Pz+Po6MjHB4eYnd3F1tbW1hbW8Py8jJmZmYwOjoKm82G5uZm5ObmQgS9l1fNboRnIigoyC4vfl9aWkJ9fT2amppQV1eHmpoaVFVVoby8HCUlJSgoKNCVlZWFoqIihIWFXQcGBjo9MD7DHBkZ+WllZQV9fX2qrrOzU0lIRpLKykqUlpYqaEVFBXJycnRlZ2dDCG4Ew+KG+kMEBwe/GRkZ+TE9PY2Wlha0tbUpEa+NTKqrqzWL4uJi/Z/gmZmZmomIuxOrNjxwT8KalJT0dXZ2Fh0dHQre3t6OiYkJvWY2zIIEVE6bHA4HrFarEqSlpSE1NZW1YBbVbshHId4f9vb2YmhoSMEMgp2dHZ8Em5ubXgKCJycnIzo6+l5Ijj2w3rDFxcXdDgwMeAtrWHRxceHTovPzc69FJBAHkJ6eDunCa8F0uKGlsKL+Q0NDA7hYSIOEqq+urnwW+fLyUgkyMjJgsViQmJioJCSULD4LdphJKv86Njb2tqurC8PDw5iamgJb9ODgQBU+PDzAV/DeyckJtre3MTc3p/Xq7u7Wdk5ISOCgvjUJk6uwsFBVsmiTk5NYXFzE/v4+zs7OPFC+4zHB+Pg4KDQvLw9lZWWcbhcJ3kl73dCOwcFBOJ1OLCwsYG9vTwn8yYBTzu4bGxvTuaGd0lXuDOgT/WIfG9NJf1lEdgp95jX/4z2qY+fweZfLpd7T9/j4eMTExGgnsRmkru4aeMJhNpuv+TLPFe75+fkKyCx4bdxjUQnObjk9PVVA8RtSR0RFRal6+c1Z8HaRBnuXD3LkCcJFpevr697fBDaGispXV1d/AefztbW19wL3ZA4YdTxLCPB48ajgzlY0pjUlJUVt4WlKcBkutYcFjoiIoPdPJ5khWWzIg3dUSyAuDhZ3KiYwLWG/03PWhsoFVFtTOuebwPg8ixgWZkG/qZYqScadoLSDwFRNxSQMDw/3ZiN1fP409YRTUr6hOjk+FJi7AUo7DNXS3ggNDdUzS4QQ/MXvAcMsVn1kWzY2NqK1tVUB6G9PT48qtdvt4MHY398Pnl/sfXnHvy+aJ/h9/f2b+9Ly/5v8H4XJ9BNGgKhjNsiLlAAAAABJRU5ErkJggg== + + 12a5ecab-2cd3-41b9-b37a-e584cc175d39 + + intervalIN + true + 0 + true + 0 + 589748aa-e558-4dd9-976f-78e3ab91fc77 + + + + + + 57 + 305 + 87 + 20 + + + 102 + 315 + + + + + + + + true + Contains a collection of 2D number domains + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAN0SURBVEhL1ZXbK6VhFMY3spOcz2xn2/l8PoVyKHGhkIlSlJI/wJWaXE1RQ5ErhTtXcqmUSHE382/MkJlcMObYmvVbe38ybIe5muaplW337edZ61nP+36ufwVvUFDQF/0rf1GvtF6GsLCwd+vr63JyciLHx8dycHAge3t7srOzI1tbW7KwsCBTU1PS398vra2tkp+fL9rQB/2p28fwBEJCQgb0hz82NzelsbHRqq+vT+rq6qSmpkYqKyulrKxM2trajDgnJ0dKSkokIiLiKjg4eM5P8yjc0dHRn7a3t2VoaMi6o2ZnZ00IkerqaikvL5eZmRkpKCiQvLw8q9zcXFGBa+Xw+KgCIDQ09M3k5OTP+fl567Cjo8NqY2NDWlpapKGhQWpra22KtbU1KSwsNPLs7GybRJv7plbt+ukewJuSkvJ1ZWVFurq6jLizs9Pq9PTUJmEKBKqqquTo6EiKiorE6/WaQEZGhqSnp7MLpqj1Ud6Ben88ODgoo6OjRnZX4OLi4oHA+fn5HwKQp6amSmxs7C8Vee+nvUV/QkLCzcjIiCUDz7GFziF/DIiQsOXlZZmYmDDrMjMzRVN4pZxjPmpdrHb/sampSSgWSad47iwZ7O/v/1HAWXJWVpZ4PB5JTk4Wtdkm0ik+K3eESzf/Oj4+/gZyOiCKiLBQhCgQSMCJKf6npaVJUlKSxMXFmah+5qAuulTpsri42LJNIUIU8dopEEjASZDjf2JiIjswoYqKCk73JQJvNV7XZNsR4jNCLJMCgQTudo896oTExMQYj37vmwCf8IuHSQXFySwtLb2dCgQSYKF4j+90jz1Mgr26V98O/Bhzu91XLI3lTk9Py+rqqhweHlpSHsPZ2ZmJLS4uWrw5eOxMLeIs3KbIQHbxjiOPtxQZpyDif6Z0DhXf0S2/cazh2fr6+l9K9+AcgAbuEgjuF1knis5pxXM6d8hZLPb09PRIVFQU3j88yUCn2NUHv9EtRE4tLS2Z1xDTNQvFFqdzJbV4a3K+K82jdxHwMAW7oFuWR42PjxspHbNMiPFc0yeRkZH2DDeA7vHp29SPOR35mhTp9WHFZ0ixATvomib0HSDh4eF2X+nUkD/7PgButeqMqDY3N0t7e7sR4G9vb691OjAwIFyMw8PDwv3V3d398jeaH7xf779zn6uXv5P/I7hcvwHdIrFxM9F9sQAAAABJRU5ErkJggg== + + 6d2404a6-b402-4db3-8382-68ab0a4e2105 + + UVIntervalIN + true + 0 + true + 0 + 74c906f3-db02-4cea-bd58-de375cb5ae73 + + + + + + 57 + 325 + 87 + 20 + + + 102 + 335 + + + + + + + + true + Contains a collection of boxes + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQpSURBVEhL1VVHSKRpFGwVGxFzllYxYxYcI6KCAXPOAQMYEMWAx5HFg6wB1otHBQXFHBBELyYUxVPjSb0YQWdEXUW7d2Z0hjdfve6W3pmdcfa0bEHhwf7qfd97Ve+X/Fdw19HR+Sj+0r9goeCvwcDAQD4wMEDb29u0ublJq6urtLy8TLOzszQ8PEw9PT1UXV1NqampFBkZSR4eHiQu9E4claoUfgI9Pb1McfB5aGiIwsLCmKGhoRQcHExBQUEUGBhIfn5+5OXlxcIuLi7k4+NDxsbGCl1d3bdqmR9Campqejs+Pk65ubl8OzAlJYUaGxupoaGB8vPzKTo6mkU9PT3Jzc2N6erqSqKAUmjIVFL/AH19/d+rqqo+d3R0UFRUFMXExFBJSQm1t7fTyckJ3d/f08rKCvX29lJNTQ1lZGTw6/AKUFzuk2jVvFruO7jb2dl97O/vp7i4OIqNjaX6+nrq6uqi6+trFr+4uKDb21tSKBT08PBAa2trPI+KigoKDw8nBwcHzAKvCFVJakH0fisnJ4eKi4u5QHNzM/X19ZFSqaS7uzs6PT3lVxwfHzPPz8+52OPjIxcrKysje3t7Mjc3RxG5WvYFqVZWVh8KCgp4qOj34OAgPT090c3NzYu4doGjoyPa39+nzs5OAiorK0l0gJycnEi4UCE0S1TSYrDi9u/xRBBuaWtro+fnZ9rd3aWNjQ06PDz8WwGI7+zsUG1tLWVmZnIBtMnW1paLODs74xV/Cm0jiZj8b5aWlh8gDgvCiq2trXxofn6eOTc3x1xaWqK9vT2ampqioqIiys7OpvT0dP5teXk52djYkIWFBbtKFPtLFPhDIirde3t7s7dBFGlqauJDCJaGMzMzTIjn5eWxOG6vXcDa2ppngEIBAQFI9wMK9Ap7Kf39/UlTCDMANKLg9PQ0i09OThLMkJWVxeLICIAhi06QmZkZ68hkMrygS1BihH7Bx0gnCHsCENQmxCcmJl7EsSqSk5P5t6WlpdweOAnZEHNVzUCNEqlUqkAyEf+6ujo+BEGNqIZIuba45rWFhYV8e7hQtAhZeHERA94V//iCyCOlwMLCAgtqODY2xkRbII6cIIDd3d2cfHd3dwoJCfki5L7LAfAGuwQWw3PX19c5RJeXl+wcFBsdHWWmpaXR4uIinZ2dUUtLC98a/U9ISCATExP0/o1K8huIV8yLPn6CAxITE7kQVgHsiTRfXV2RXC6ng4MD2traYuegrUKU7S3OPQmZH+4iQIZX4JCjoyMPzNfXl/cSeowliDyMjIzwohNOwZrmcGEmYo4/36ZqvBVeVkJYrI8XogUwANoh+syOMTIyIkNDQ76ACBfEX/0eAFLRqvfY9xEREbz7IYD+JiUl8U0RMGQBgcP+io+Px2q4xFmVxOvA9/Xbb+5r/PVv8v8IEslXpPMnRAO0o3EAAAAASUVORK5CYII= + + 71b75a87-0ee7-4c6d-b270-4ee307b88bac + + boxIN + true + 0 + true + 0 + f29cb021-de79-4e63-9f04-fc8e0df5f8b6 + + + + + + 57 + 345 + 87 + 20 + + + 102 + 355 + + + + + + + + true + Contains a collection of three-dimensional transformations + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL3VVZKK1rGF4IK5nHZVrmmczLTKYy22ZbLkjJpcSNcuRilxtXrijihi0pRbniwlBqk9IJV4jk1Gpf2G1rWYb1nvd515DOZu99t+s89bVaf9//PO/7vM/3/Yo/BbWNjc0D/9JvLiOvRl6/B0dHxy/T09O0t7dH29vbtLm5SRsbG7SyskJzc3M0Pj5OPT09VF1dTXl5eRQVFUVckJZfVZoYfgI7O7sPVVVVT7Ozs5SVlSVLo9FQRkYGpaWlUXJyMiUmJlJsbKwQh4WFUXx8PLm4uNzb2tr+ZaZ5F0re+HVxcZEaGhqkOqzc3FwRgkhqaiolJSUJaXR0NEVERFB4eLgIscB35lCZqN6Avb39eFdX1/PY2BgVFBRQUVERlZWVEXdENTU1VFFRQSUlJZSdnS1d5OTkiEBoaKgIuLm5GdiqJTPdD1D7+PgYJicnqbS0VMhBPDAwQIeHh/T09ETPz890dnZGExMTVFtbSzc3N1RcXCwCwcHBFBQUhFnomEtjonwF9n67vr7e2NHRIbZApL+/n/R6Pb0FrVYrvwgCBEDu7+9PHh4eRhb520xrRZWXl5e+paVFvIbnSMj+/r6QHBwcUGdnJ9XV1dHo6ChdXl7KcwuGhoZEQKVSkVqtJqVSiVl8NFHzYLn6f+ArFgYJEXj+8PAgBIgkusrMzJTZXF1dyXML7u7uKCUlhfz8/EQE8+AuvjK3kwLR8vb21oMcEUQUIQL/LWhra5P/GHB3dzctLCzQ+vo67e7u0unpKd3e3tLy8jL5+vqSp6enDJ7nqWeBTwpW+oZMIxVYEElPT6fKykrS6XRmCRNgDQ4gBhsXF2dNkMV/JsUMpBPwsMA3WPSJ46VDtvGSJX7z8/NWga2tLRocHKTV1VV6eXmhnZ0dOXywAukJCAgQUp4jubu7yxlhUVMHDCX8wmZ0gpWfn0/X19fU19dHRqORDAaDDBn+I8ZAb2+vHLDAwEDxHdXDHnQCcbYeM7BeHR8dHBy+42Ti+CNFJycnQri0tCSE5+fnkn10AoyMjIhFIIT3luoxSxa7B6eJ2gxklzcaURUqOD4+ls0QOTo6EtLHx0fpBjY1NTWJPa/JURwHBDfrD+cA0HBbupCQELlr1tbWqLGxUeaCmczMzIhtFxcXNDw8TDExMVZyDBb24FpxdnZ++yQD3MVn3miAVUgRYoj8R0ZGymwQgISEBPH+deWurq4Sby7skWnevYsAFW5ECGC1t7fT1NSUkCMlIMUwQYyKOX24puU5Tj7mCA4T1TvAweOW71EpEgJfEUMLKeywVM12kJOTkxxAHjis+eX3AEBstcgyvC8sLBSC8vJyua5RKV+KMp/m5mZqbW0V7/EO3jVR/BofeCEN//32vrewF+/876BQ/AtJDtfQgQWgYgAAAABJRU5ErkJggg== + + af953a17-ced4-476a-950d-640d7cfb03cd + + transformIN + true + 0 + true + 0 + c4b38e4c-21ff-415f-a0d1-406d282428dd + + + + + + 57 + 365 + 87 + 20 + + + 102 + 375 + + + + + + + + true + Contains a collection of line segments + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAANVSURBVEhL1ZU5S2RREIVbxUak3Xfb3Xbft3ZDBRcQDAQVWzsQFf+FMBgNOGBiaqCZkRgamQim/o0ZgxkM1NaZ0Zr6qr1NuzvRMAeK9/r1u6eqzql7n+dfIZCQkHCjV/mLCGl8DCkpKWc7OztyenoqJycncnx8LEdHR3JwcCB7e3uyubkpa2trMjU1JYODg1JTUyNa0Lku9UYZ3kBSUtK0Lvy1u7srvb29FsFgULq7u6Wzs1Pa2tqkublZ6uvrjbiyslIaGxslLS3tMjExcf2B5lV4MzIyvu/v78vs7KxVRwwMDFgiknR0dEhLS4uR1tbWSnV1tUVVVZVogivl8EepXkBycvLnlZWV3xsbGzI0NCQjIyMW3JOETrq6uqyLpqYmqaurM/KKigrrRIu7VakOH+ieIVBYWHizvb0tY2NjRjw6OmrBPZ3QBQna29vlKUpLS6WkpAQv6CIYpYyDan8yMzMji4uLRvaRBLrMAkBeVFQkWVlZd5rkzEjjMJWbmxuZn583EuR4S6Ll5WUj1XWPEqgCUlZWJjqFl/o8DDHwavXf+vr6hMBIl+Qlk9UjiUQiRhoPv98vBQUFlgRPtIsfyu3zqPOfcnJyIpBjHqMIEdVCSrgxXV1dNfL7+3u7LiwsmLnoX1xcLPn5+ZKdnW3G6/21JtjyaKaLhoYGm22CJIwiUsSHq9yR45WbIKd/Xl4eHlii1tZW5LsgwZaO1xWz7RJxTyLMJNA8njwcDksgEHhUPfKoEpKZmWk8+pwOvmh4fOjFy+xOgk3EnJNsaWnpWeWOHEPRHt2pHnnoBEnV16gHDwh7vd5Ldibbn+tTXF9fm+bI4sidNEjiqscz/c1eiE2RgdnVP+7Y8pAAfRwbw1AoZMRojixU/pScznp6eu50zbN9AIKcJRAQQJ/FEpSXl8d2K5ojiyPHWOSZmJiQ9PR0tO+C8Bm0i0N98dZ1EA8qhpiqMRTNXeVKauOtk/NTaV49i4CfLvCAaqnSBaRU7IipWKePY9r+59ugPr59mj5gXVu+Yor0+IiFI0UOV7XP55PU1FQ7r7RryN/9HgCvSnXOqPb398vw8LARoO/k5KRVOj09LRyMc3Nzwvk1Pj7O0fCVtVGK98H3NWbyB+Pj3+T/CB7PH/DZitGURVqaAAAAAElFTkSuQmCC + + 7cbd2a83-2d7a-4d0b-86c3-6dd69b9017dc + + lineIN + true + 0 + true + 0 + f802a8cd-e699-4a94-97ea-83b5406271de + + + + + + 57 + 385 + 87 + 20 + + + 102 + 395 + + + + + + + + true + Contains a collection of circles + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPGSURBVEhL1VVbKO15FN7ITnK/s5H7/X6/ptxSHuSSk02KPHjiQZ5OTfIwZTIvHnnAg5TSyZMiilJKJqXkQV6UcdJMB5s9ew6+Wd/a+y+NcZmnaVat9q7/+n1rre9bv/Uz/VeW5Obmdie/+Bf+Sfxj5uXltT8zM4OdnR1sb29jY2MDq6urWF5extzcHCYmJjAwMIDm5mZUVlYiOTkZUtCvctTsRHjDPDw8WuTg99nZWZSWlqqXlJSgqKgIBQUFyM3NRVZWFtLS0hQ4Pj4eGRkZ8PHxsbm7u392wbxqZn9//98WFxfR3t6u1dErKio0EZPk5+cjOztbQVNSUpCYmKiekJAASXArGBYn1D+Yp6fnj319ffdjY2Oorq5GTU2NOv8zCTspLCzULjIzM5GamqrgcXFx2okU5xCqvrjgXlh8RETEH1NTU6irq1Pg2tpaMNnW1hZOT0/x+PiofnJygvX1dQwPDyMpKUkTxMTEIDo6mlqwi0In5DMT7reFloeuri6lhRQdHR3h/v4eKysr6O/vV5rYAWOWlpb028HBAcrKyhQ8MjISgYGBD5LkFxfskzWHhITYOzs7FYQdnJ2d4ebmBkNDQ69S1NPTg6urK+2IdAkDiI2NhUyhTTCtTmgRVqq/YBV0Cjk9Pa1UjI+PvyvyyMiIxk5OTiI8PFyTkDLp4nfB9jGJ8j8EBwfbCc7KOIrHx8ew2+0oLy9/d0ypwd3dHQ4PDxEWFoagoCAVPjQ0lBf1J5Nk+paenq6H6AS4vLzE9fW10mE4KzfAGW+MKKsllRcXFwSlBpooJyeHt/sbE/ws43XLto1E+/v72vbg4CDy8vIUmN8NcPLNyjmaVqtVY3d3dyFMICAgQGNEC2cH5Il8MZht08k9D7Gq1tZWFZSc8xsrN8AbGxtxfn6usaOjo0oPJ4mUiq5ODVxmNZvNNh4mr6xgb29PDzocDiwsLKC3txdVVVUqOKuen5/Xb4zhziItrJ6ayX/ehacpUuPsMohXntySks3NTQV4y9fW1nQ0Cc7OiouLHwTuxT2glXCXULTnzgtGEJvN9gRKUbldu7u7lXcKS3oaGhrg5+dH7l/eZJp08UUCHeyAN/O5WywWREVFKcecd06MIaqA6gjL5PwpMK/uIpqFXVAL7hZeGsMJSgoNYFYs0wdfX1/9zrdBdHx7m7rss7R8y8mR9fHkBijpMKqWNwDe3t66FKVrgr/7HtDMQtVXjiUnxtiq5LepqUkrbWlpQVtbGzo6OsD9VV9f//EXzWV8X//+5r7nH3+T/0dmMv0FMAW6A1HabBsAAAAASUVORK5CYII= + + 52490cf3-cbed-42c2-8d9e-f0a2b381dcf7 + + circleIN + true + 0 + true + 0 + 3c5409a1-3293-4181-a6fa-c24c37fc0c32 + + + + + + 57 + 405 + 87 + 20 + + + 102 + 415 + + + + + + + + true + Contains a collection of circular arcs + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOuSURBVEhL1VU5SFxRFB23QWTcd8d937fRcUMEFxAGGVAxKAgKio2VdgpBm4CBWNiJiBaCNmIpaGXUMgraiKVNTGFIMRNjXE7uuTNfBvdUIRcus7z/z7n3nPveM/2ryPbz8/spn/iLfCf5tggODv6ysLCA/f197O7uYmdnB5ubm1hfX8fy8jJmZmYwNDQEh8OBhoYG5OTkQAr6Kq+aPQgvREBAgFNevF5aWkJNTQ26u7vhdDpRVVWFyspKlJWVobi4GPn5+QqckZGBwsJCWCwWl7+//6QX5tkwh4eHX6yurqKrqwvNzc1YXFxET0+PkpGkoqICJSUlCpqbm4usrCzNzMxMCIFbMKweqCciKCjow+Dg4M3U1BQaGxsxPT2Ng4MDJaqvr4fdbofNZtMuioqKkJeXp+Dp6enaiRR3JVJteOEeRUZCQsKvubk5tLS0oKmpCUdHRzg+PkZHR4dqzS5IUF5efi9Tdna2EqSkpCA5OZlesAubB9InRPvPIsttb2+vgg0MDOD6+hp3d3dwu91q7EsEBE9MTERkZOStkBx4Ye/DERMTc2loTTnYyenpKQ4PD5WEubW1hdra2iclIoEogNTUVMgUugSzzwMtxkr153yRSSPr6uqwsrKCiYkJ7YaesAuS7O3tKYGvyWlpabBarYiPj1cSEkoX3wXbYhLn30dHR18alXEUqf/o6KgazY5obn9/Py4uLpSEk+U7ptQ/KSkJcXFxiIqKUtLY2Fhu1I8mYfpRUFCgmjJJwqppNPU2kuM5PDyMm5sbTe4NX3mov4DSAyUqLS3l7v5Bgk8yXm7OtkHERQLSTCZJuc61+fl57YK73Ld6yiNKICIiQnHEC08H1Il68WG2zaSBTKMrfqfmXCOhy+VSEnZJ7ak7q6c87ISSiq8eD7zRZzabXTSNyelgGoT8zv+pOWVZW1tTgtnZWQWkJEb19Ex+cy/cT5EGZ5cPEsBIzjjT+M0uqfnIyIgS8CD0Beez1dXVtwL3aB8w7NKW2wB5mBxFY7dy4khwfn6u4DSW8rS1tSEsLIzaP97JjMDAwA154YqVEMxImka9x8fHsb29jbOzMxhxcnICHo5jY2Mc798C8+xZxLDyRKTeBKZ5RnJKKAfNZNWsWKYPoaGhus67QXx8+TT1xqS07ObkyPFxnwYo5aDeIgXvAISEhOhpKx4R/NX7gGEWw79xLHkmcVcTgPq2t7drpdxknZ2dehnx/GptbX37jeYN3q8P79zX8u138n8UJtMfvcmFuevNx+AAAAAASUVORK5CYII= + + eac72910-a336-4f72-b2b9-4850dec2ce1e + + arcIN + true + 0 + true 0 + 9c80ec18-b48c-41b0-bc6e-cd93d9c916aa - 136 - 53 - 63 + 57 + 425 + 87 20 - 167.5 - 63 + 102 + 435 - + - false - No conversion + true + Contains a collection of line segments - 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 - 89210f0e-52b1-422f-9902-7951d4400654 + c07c558f-360c-4f24-ad05-462d9371baba - nohintOUT - false + polylineIN + true 0 true 0 - 6a184b65-baa3-42d1-a548-3915b401de53 + 66fa617b-e3e8-4480-9f1e-2c0688c1d21b - 136 - 73 - 63 + 57 + 445 + 87 + 20 + + + 102 + 455 + + + + + + + + true + Contains a collection of rectangles + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQkSURBVEhL1VVHS2RpFC0VC5EyZ8tsmbNlFnNEMaBiaMyoYAQFF9o4CIZBYVauVAzgQhCkUREFEUFxYWr8AS5009ObGXrRTlc5NnfuuWVJzfS07W6YCx/vvar3nXvvOee7T/FfhcbMzEzHV3ppmZubmz7X8XpdWFlZvV9cXKTT01M6OTmho6Mj2tvbo83NTVpdXaWZmRnq7++npqYmysjIoKCgIOKCfuWtSgPCC2FhYVFRWlr658rKCiUnJ1Nubi41NzdTXl4excfHU0xMDOXn51NLSwslJCSQv78/hYeHk0ql+swdvX2C+W4o7ezsfltfX6fq6mpKT0+XVVdXR1NTU1RWVia/T05OUmFhIQUHB1NgYKCsgIAAUHbPGGoD1L+EpaXldFtb2+P4+Li0npWVJQv3PT09dH19TWdnZ1RfX08REREUEhIi4H5+ftIJF6dnqt49wX0TGnd3d93c3JzQAWDQg4X7hYUFMsbExARFRkZSaGgoaTQaSYDl5eUFLdBFkgHSJJj7k6qqKmpoaBBaTBMsLy8L8MbGBu3u7so9ujQmgAbZ2dly7+DggCTvn2Cfo9TZ2flLY2MjpaamUlpa2jNFcA1ie3ubSkpKKDMzk3Z2duS3sbEx0mq11NvbK4V4eHiQj48PsQs/M+YbAzQLy9V/TElJoYqKCmINBBxJjJUfHBxQa2urCFxQUEB4d2tr6/k/7AE9bm5uxDQLXdzF74ytUrDyPzk5OX3Bpri4OBFzenqa1tbWBOD4+JiGh4epu7ub0CGKyMnJkWfE7e2t0OPp6Umurq7k6OgownOyPzjBLwrO9CksLExEw4LXl5aWZPPd3Z0cKlAxNDREnZ2dYtmRkRHS6XR0cXFB7e3tUhCKc3FxEQ2QKDo6Gqf7ExLMsr3uo6KiCIngb1BzeHgoSfb39wVgdHSUBgYGJKFer6fLy0uxqre3NxUVFVFHR4eIbG9vLzhqtRod/MxLoQJf8HFSUhINDg5SbW2tbAb44+OjCAxrzs/P/w0cgjKQ8I7OQZURh3U1aPAUb6A8RgBcghOKQ4Suzs/P6eHhQeYRrqbgEBbOASWsI/n6+oqb+Bln4dlFEvAuv/wVR954/NEyuL25uRG6rq6uxPOgBZWbgoMavJ+YmPiV4b45BwgtZonxVBpXbGwsYbKik9nZWZmccAxoMYJDWLgHFra1tQX3WgPkP4K7eMcv6lE92gdNfX19MjnBLSzc1dUlHcAxxsoZVDRg5zwwzHdnEUKNLqABqII7oAuowCFC5eXl5fIbqmf3kY2NjXTDI56USuXL0/Qp3nLL9/gWYNagUh4jUi1owBW0gW+AW1tbi7DcNcB/+D1AKJmqjxATcwmuAgD4LS4ulkorKyvFyjU1NXJFR7znA/YaIH4c+L6afm9fs17/Tf4fhULxF9PjvLlVdlKCAAAAAElFTkSuQmCC + + b8fbe768-e625-4ea7-8f19-b1ce169c37a9 + + rectangleIN + true + 0 + true + 0 + 83da014b-a550-4bf5-89ff-16e54225bd5d + + + + + + 57 + 465 + 87 + 20 + + + 102 + 475 + + + + + + + + true + Contains a collection of generic curves + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5Hz+Xw+5HwsF3LIZIuIG0lusUuulMmWHC6c4sYhkVxIkkJcaQ8p4VYxeyvTKmuN2cbume95raVpm723uZrmrTe/9f//877v8zzv92v+qwgyMzP7Xf3Fv8ifVL4urKysPkxOTuLg4AB7e3vY3t7GxsYGVlZWMDs7i/7+frS0tKCsrAyZmZkIDg6GauhX9ar2CeE7YWFhUa5e/HNmZgapqamSKSkpSEpKQkJCAmJjYxEVFYWwsDAB9vf3R15eHtzd3Q3m5ubvjDDfDK29vf3twsICqqqqpDtmRkaGFGKR+Ph4REdHIyIiAiEhIQgMDERlZSWmpqagChgUxpsnqH8IS0vLvqampsfe3l5kZWUhJydHktcsUlJSgpGRESwvL2NgYAChoaFSwM/PD+fn51DNfVZUrRrhXkSQh4fHH8PDwygoKBDg/Px8SV4PDQ2JBh0dHaitrcXp6alcBwUFIS4uDgxvb29qwSkSnyD/For7PY7Kl0mLqQCF5Pj8nTQlJiYK4ObmJnp6eqRAV1cX9Ho9PD094ejo+EUV+cUI+xxlLi4u9zU1NQJCOkhLRUUFxsbGpFB7ezsWFxfl9+zsbBgMBikeGRmJq6srHB0dQTEAX19fKBfqFebbJ2glrOr+Y1paGpgUkkWKi4sxMTEh4Kurq2hra0Nubq48Q6p2dnZE5OnpaaFncHCQTpIi1ERN8ZvCttEo5XucnZ3v+SItSCuyyNzcnABubW0JPSab0gA6nU6s2djYiMfHRzw8PCA5ORlubm5wcnIS4dU1F/W9RlXShYeHi7eZLNLd3S0CEowdknfac3x8HPf396irq5PJbm9vpfvR0VHh39XVlRpIoZiYGG63jgXeK3sZ6G0W4o39/X0pxA1uaGgQe66vr+P6+hqtra1IT0/HxcWFgJ+dnSEgIEDoUUzAwcFBcHx8fDjBzyo1NuSLG8ntrK+vl+OA4nECBinhJKSItNExDBbkdOSd3ZMeTsLNV7o+aWCMt1qtVk/R+vr6npeIBZm85r3m5mbc3NwI+N3dnbiJgKTE1D0Nov7nLjy7SILe5YOdnZ3Y3d0VoehxZlFREdbW1gSYwYOPBb8G57NK7C8K7sUeMFJ4lnCJKN7h4SHm5+dxfHxshAUuLy9FAy8vL6HFBE5hSQ8bsbOzI/cvN5mhplhVD36mQ5aWlnByciLJa3VGUTjpmoKSc1PnClT0UQZ5UDDfPIsYbzgFxycYuzQlQdmxCZgdK/fB1tZW7nOrlY7fP02N8U6NbKCL1PHxnCZQ0mHq2sbGBtbW1rITSjOC//B7wNAqqj7xvKff6RQCkN/S0lLptLy8XL4B1dXV4PlVWFj4+i+aMfh9/fqb+6N8/Tf5fxQazV+PmcVeVawFwQAAAABJRU5ErkJggg== + + 383f0529-5c2b-4feb-81bc-569ceeabcc1c + + curveIN + true + 0 + true + 0 + 9ba89ec2-5315-435f-a621-b66c5fa2f301 + + + + + + 57 + 485 + 87 + 20 + + + 102 + 495 + + + + + + + + true + Contains a collection of polygon meshes + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAARYSURBVEhL1VVHSJ1pFLUQUZTYu7H3Hk2xGyuIvVfsILpIdBeMjAoyKhhQcaUSdaWIEhQUFHVhLAjRENzoSlCQWajIYJnMGM585+rIkEwSZzXMhY/H/7/3zr3nnHvvp/FfhZOmpuaF+sS/ODnq3C10dXW3BgYGsLq6iuXlZSwtLWFhYQEzMzMYHh5GZ2cnampqkJWVhYiICLi5uUEVdKj+qnON8J3Q1tZOT05O/mNoaAhPnz4VAAJFRUWhvLwcAQEBCAkJQXp6Ovz9/REaGgpvb28YGBicaWlpvbqB+WboGBoaHo+OjqKkpAQxMTGoqKhAUlKSJGttbUVCQgJevnyJyMhIuLu7Izs7Gz4+PggMDIRKcK4wbK+h/iHu3bv3swK8amlpQUFBAerq6pCRkSFgYWFhGBsbw8jICNLS0gTUw8MD9fX1yMnJERaquE9Kqrc3cF+Fk5WV1W99fX0oLCwU8La2NgwODmJqakp8WFlZwdraGt69e4e5uTmMj4+jp6cHDQ0NwoRyKYnJIvAa8m+hvljmjyhNcXExGhsbERsbK4faE3hnZwfBwcEiR25uLmZnZzExMQFHR0fY2dnB1dUVDg4OnxWLrRvY20g2MzO7zMvLgzIYiYmJaG9vR3R0NMrKyrCxsYHq6mocHh5KAhbx8eNHqXpxcVESBAUFITU1VTpKT0/vTGEWXUMrY1X1v7Az2DHh4eFiKKlTKrYpwfnu9PRUTN/f3xeWNJnJybKpqQmenp5QMos3isWJwjbQUM7/ZGpqekn9Hj58KJU8evQI9GJychKlpaV48uSJvLu4uMDx8bFIRjBWu7m5KeazQAsLC5iYmMDPzw/m5uYc1HYNlelXdgBfkj475Pnz5+jt7ZXB2trawt7eHo6OjiTB1dUVLi8v5Znv379/j+npaXR1dYmcLNTJyUnmRSU4ZYLXRkZG50zg5eUlSSorK2VaaSYPpdrd3cXJyYn8hhKwNVk9zbexsYGlpaUwogJU4sGDB2TwWh0NA+rFrKRNH6g3NfX19ZU5YFtyLg4ODm6Hi8xSUlIwPz8vuvO3HEgaTrmUr9ce3ESRjo7OGStjEoLU1tbi2bNn4MqgbHy3vb0tK2J9fV26ja3JqWfFRUVF8szilBechdsuklAsPpCms7MzXFxcRAIOG1uVzzx/LTy2sa2tLaytrdHR0YGqqir2v8zB48ePPyu4r+aAEcFdQqloOpcbk5BJc3Mzuru7ZarfvHmD/v5+eaaMbGGyUcDC7v79+9Q++Bryi1As3qo2+8RKKBUp83DvsP9fvHghVZMpv8/MzERcXBxBxVy1XX9XMN/cRQxbsqDe9vb2Yp7qBtGV0tFE1d9iJBcgv2fn8JMslI/f36Y38crY2PicXaHWhwBygNQwSnuyejLks7oDoK+vL5OsPCL4D+8Dho6S6oiycG3QZALwHiADtia15iVEj/Lz8xEfH3/3G+0m8tX58s790bn7nfw/Cg2NPwGZ3c2r5lT8fwAAAABJRU5ErkJggg== + + 28ef77e3-0a4a-4267-a585-4b017e2dc7fb + + meshIN + true + 0 + true + 0 + 794a1f9d-21d5-4379-b987-9e8bbf433912 + + + + + + 57 + 505 + 87 + 20 + + + 102 + 515 + + + + + + + + true + Contains a collection of generic surfaces + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQqSURBVEhL1VVpKK5pGLZ0viTZ933ProxdKFvkByEnR7YSUhJ/bCWJkXKQUOfYI2tyHFkKnQhlm39+KfyQmfkxyDLmzMzpmud6Pr7OHOMc82uau+6e7+V9r+u+r3t51P4rc1ZXV/9VnPgX/lL480xLS2u/p6cHm5ubWF9fx+rqKhYXFzE9PY3BwUE0NzcjPz8fiYmJCAsLg4uLC0RAP4pPFUqEr5impmaS+PCPgYEBBAUFSQ8MDIS/vz/8/Pzg6+sLLy8vuLm5SWAHBwd4eHhAR0fnRkNDo+Ye5klT6Onp/TI2NobU1FQZHf3m5gZP2eXlJZycnODo6AhBcCswrJRQ/2AvXrz4Pi8v78+6ujqEh4cjMjIScXFxuLu7Q2ZmpnTKxDMrKws5OTmSxN7eXmYigvsopJq5h3tkzubm5r91dHQgOjpagkdFRaGgoAAnJyfIzs5Gbm4u3r17J/Xn34uKilQENjY2sLa2Zi2YxXdKyM9MaL+ekpKCjIwMKcsDAeVaXl5GYWEhSkpK8P79e3mWlpaivLxcRUBwCwsLGBgYfBIkP9zDqizR2Nj4Lj09XRY1NDRUSlRcXIyLiwvU1tairKwMlZWVmJ+fR0VFBaqqqlBTU/M3AqEAbG1tIbrwRmC+UkKLworofwoODgad3UISRnl9fY2VlRU0NjaiuroaTU1NkoA1qq+vR0NDgySws7ODlZUVzMzMJAkJRRbnAltHTVS+1sjI6I7gbEG2YkJCgoz87du36OrqkhKNjo5iZGREEnAOWlpa0NraKgmov6WlJUxNTWFoaCi7SvzmoL5WE0yX7u7usrfpJBkfH8fGxoaMmGDt7e2YmprC7u4uDg4OsL29jZ2dHflMe9DfxMSENZBEPj4+nO5LErwW7XXr7e2NB6Lj42MMDw9LYHZVZ2cnuru78eHDB0xMTKC3txf9/f0YGhqSBIye8ggloK+vL3FEVsoMqBP1Yh9zOunse66KN2/eyLOvr09mtbe3J2WiXHyenJyUBNSd0VMeZsLJF3VV1uDeXikUihtXV1c5/ldXV/LD09NTKQn3EGVhwTloMzMzmJ2dxdzcnHyPkjxEzwYRz5wFVRdJY+/yRY48i0RPTk5GW1ubJKRsLPDCwgKWlpZk4bkEaQ/gzs7OCAgI+CTgHs0BLZC7hC32pbM+W1tbODs7k8VfW1tTOY2FpTyxsbHQ1dWl9o8nmSaymBEvfmT07IzPnQPEenDxHR0dYX9/X0UgQGV7i875XcA8uYtoVsyCtWBvs3gPzi6hhBEREbJ7Dg8PJfj5+bn8P+8GUcevb9N7qxEp33p6ekKsD5VTZ8pAOag3oxZ3ALS1teXOElkT/Jv3AU0hpPqZl0hISIiMmADUNz4+XkaalJQELsa0tDRwf8XExDz/Rrs33q9f3rnf8uffyf8jU1P7C+pJDEYi1scaAAAAAElFTkSuQmCC + + ae5c95e9-46cb-4f13-9680-9888e11bd7ff + + surfaceIN + true + 0 + true + 0 + f4070a37-c822-410f-9057-100d2e22a22d + + + + + + 57 + 525 + 87 + 20 + + + 102 + 535 + + + + + + + + true + Contains a collection of SubDs + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPGSURBVEhL1VVJS6RJFCy3QqUR963c932nRBRFURBFXBBm0IugF/UnNMxJRhHEgwfB/SqiDoonDy6jBw+OuIMevIgWqG07WG05Wka/yPqq6Na2dU7DBDyqvi/zReaLF5mf7r9CtJOTk0V+8S/iF4n3wcPDY+vs7AzE09MTrFYrHh4ecH9/D7PZjKurK5hMJpyenuLo6Ajd3d2QDZ1Lqt7G8BO4uLjUDgwMWG9vb3FwcPBd7O/vq9jb28Pu7q6KnZ0d9dzc3Hzn7Oz8UaN5FXqDwfDp5uYGm5ubWF1ddcTKygqWl5extLSkftfX17G2tqb+Ly4uYmpqClK5WTgMNqofwM3N7ffJyckn7nZmZgazs7MqFhYWcHh4iMvLSzw+PirpnoPVtLS0PIhUsxrdC8Tl5ORYqOn4+DiGh4cxOjqK7e1tpf9b4Jz+/n6kpqbeCZfRRvkNRPs/Ozs7Ifqjq6sLPT09atevwWKx4OLiAtfX19oboK+vD+3t7Wz4XxqtA9WhoaGWtrY2FBQUoKmpCUNDQ1qaDayMVU1PTys3EVtbW8jLy0NUVBTCwsIQHByMiIgIuLu73wpnk41aGuvq6moqLS1FYWGhSsjPz8fGxoYiIebn51FTU4OSkhKIjGhsbFQWJQYHBxEZGQkxB4KCgtQiXFCq+CTcH3Rird8CAwPvioqKkJmZqQjq6upUMkHfk5gLc4xz0tLSHHNOTk4QHh4OUQDCA19fX8TGxnKxL7JAn05W+iyNUUkMEoyNjalkYm5uDrm5ucjOznaQJycnIysrS42zF5QnJCQEAQEB8PHxUQtlZGTwdP/NBXq9vb3NTGYiCehtOzo6OhRxenq6gzwxMRFxcXHaDKjdUx4/Pz8Il5ojkrGCbgndB+oVExODpKQkFfS0HRMTE7QeUlJS1FhCQoIij46O1mZA6c7dUx5WYjQaIdLbeqChSa/X3zI5Pj4e5+fnWiqUY2praxUxx6gvyekWOyiJffc0iDzzRDtcpEDvyi6srOQ5eC/19vaiqqpKOYRNpWvssJNTOnGiVehenAPCKGWZucNvQYneCxpCFqL2uTbKZ5AqZkVH2ynSQIe0trZC7igcHx9rb1+CV3hxcfE/cqb+0Oh+CAOroLftYAMZdAm1ZjMpCRtqB8erq6shffz5barhozT0i5YLf39/FXZS+px6e3l5aTOAsrIyNp/kb34PCL1IZaqvr8fIyAjLVgQVFRWorKxUO6WrGhoa1JXOKC8v59VwxlwbxRuQ78KvEmqn8vhqeHp6qtCe3/9N/h9Bp/sKcJmebux1WzIAAAAASUVORK5CYII= + + 1f58aa18-d0d6-46c5-a795-93de1832297d + + subdIN + true + 0 + true + 0 + 20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08 + + + + + + 57 + 545 + 87 + 20 + + + 102 + 555 + + + + + + + + true + Contains a collection of Breps (Boundary REPresentations) + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPkSURBVEhL1VVbKOV7FN7ITnK/RYNcNrkrx11SbokHuWQyb0ryRN5ocuLBKadELsktHuTywKBcXgiRUiYvJOVSknNw5LK3OWbO9J31/famOWfPGPN0OqtW+7/r9/vWWt/61vpp/ivTWVhY3MsvfsBfi7/MbGxstvr6+rC+vo7V1VUsLi5ifn4eExMTGBoaQnNzM8rLy5GXl4eUlBQEBQVBEjqTq1ojwjNmZWWVLxc/DQ4OIiEhQXl8fDxiY2MRExOD6OhoREREICQkRAH7+/sjLCwMdnZ2ektLy7cmmG+a1tHR8Y/R0VEUFRWp7OjJyclISkrC8PAwHh4ecHNzg4WFBeTm5iIwMFB5QEAAJIBBMF4Zob5i1tbWv5SVlf3V0NCA1NRUpKWlPTmpOjw8RHd3N3p7e7G0tITb21v138/PT1UiyT0IVe9McGam8/T0/LO9vR0ZGRkKND09HZmZmVhbW4Ner0dnZycmJydRUVGBqqoq1NfX4+joSPWHQby9vdkLVvGTEfILE+5XSUtpaamihQEIzkYT/PLyEgy+ubmJ2tpa1eiBgQG0trbi4OAAXV1d8PLygrOz82cJ8t4E+2R5bm5uH0pKSlRTyTkDPGZO8OPjY4yPj2Nubg4rKysKfHp6Wp3hN+li5b6+vhAV6gXzjRFaGivZ/5aYmAg61cKGkvMvwXd2dlT2LS0tODs7U98E39vbw/7+vurJ7OwshGZFl1RxJdh2Gun8z66urh8ITglSiiMjIzAYDGbgBBkbG0NHRwfOz89xcXGhztB6enpwfX0NFxcXpSp3d3cO6q8aiXQdGhqqtE1nEIJfXV2Zgc/MzIASZrMbGxsVVScnJ9jY2FDKYsXSA3h4eCAqKorTfc0ALSIvQ2RkJB4D3d/fq4tfA+/v70dbWxuamppQWVmJ6upq9X93d1cFcXJyUjjSC2MF5Il8UcecTjozOz09fRa8rq5OSZWS3draUvwLLUpJnHzpq7EHJnuj1Wr1wcHBavwLCgpwd3eH5eXlF4OTFmZPFco3Z+FJRcqkivc8xJFnk3iJFfwIuE6nQ1xc3GeBM5sDWjx3CSVGp6qoEMqVqnkOnI2lerKysuDg4EDuzSeZJlW8k4MPrIBjz3K5BqioqakpNcE1NTXY3t7+R+YCquQtyvkoMN/cRbRXrIK98PHxUUNDz87OVhNM+bI3XBlsqKgP9vb26gzfBunj89vUZG+lZEN4eDhkfTy5DKOigXQ8Zi1vAGxtbdVSlKoJ/t33gKYVqn7nI/K4kwhAfnNyclSm+fn5KCwsRHFxMbi/uBTlzsteNJPxff33m/s9f/mb/D8yjeZvU880QlAx2/0AAAAASUVORK5CYII= + + e2677740-8f51-406f-9f0b-cb1c051ccf27 + + brepIN + true + 0 + true + 0 + 2ceb0405-fdfe-403d-a4d6-8786da45fb9d + + + + + + 57 + 565 + 87 + 20 + + + 102 + 575 + + + + + + + + true + Contains a collection of Extrusions + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQJSURBVEhL3VVJSGRXFC1HFMV5nudZnEecRRQ3xoUKFqIuBBeCC8GFaHqjLQqKC3HnsFHEEQRBHEAEERQUut0IojhbGimhraY7JJ68c6vLNEl3WrIJ5MDlL97/59x7z73va/4r/KTidxV4ZfBdfvMq2FpYWNytr6/j/v4ep6enODg4wMbGBiYnJzE4OIj29nbU1dUhLy8PkZGRcHV1pYhOhY0w/ABv6uvrP+3u7qKgoEBIsrOzkZmZidTUVCQlJSE2NhYREREIDQ1FYGAgfH19YW1tbVDf/myk+D587OzsDHt7e9BqtcjKypLIyMhAWloakpOTkZCQIALMPCwsDEFBQfDz84OHhweroIiPMH0LZmZmM6r83wYGBpCTk4Pc3FyJlpYWzM7O4vr6WmJqagoNDQ0IDw9HcHAwAgIC4O3tDVtb28+KZsbI9ndkqJc+jo2NoaSkBPn5+SgsLATFbm9vsbi4iImJCSwsLGBrawt3d3fo6upCSEiICPj4+MDd3R0qyY+KK91I+SfMzM3N3zc3Nz/X1tZK30lOIZ1Oh+7ubjG2p6cHw8PDUgGNZzUUoA8U8PT0hGrxs+J7R05h/gKtevGpsbFRDGVbaDBFiKWlJfT29qKzsxNDQ0NYW1vD1dWVnH1dAX1gq6ysrD4ozlojtUZjp7J/YLacFBpKEZMHxObmJk5OTnBzcwODwYCzszP09/fLGU3+WoBtoojifSA3jX2r5tjA6eCUcBQpwumhEMGRfXx8xMXFBVZXV6WKpqYmOaPJnCKSktzZ2VkEHR0d6cVbCuiZRVxcnIygSYRjmZ6eLiQU0Ov1OD8/x/LyMvr6+sB2EqY9YP+5cE5OTiLEPVECeqnA3t7eEBMT8yKSmJgoQgxiZ2dH2nN0dIT5+XkxnXtCmLJneyigMpcdUSKsoEeFxk6JPLCs6OhoEWHEx8dLEPTg+PgY+/v7cl1wPKurq+XMlL2pPRRjgor3F3JTgNDSeZYVFRUlQgxWRaysrODw8BDb29vgnnBkq6qq5MzLy0uyd3FxEQH6p9r0pDhfpohQRZi9U1k8837hhlKMwXGcm5sTH3gBjoyMoLW1Vbb78vJSyN3c3KT3/E5V/c09INLVuBrYKk4G55vR0dEh/ef9xBt1fHwc09PTQt7W1ibkzJxP7o26Ltj7NCPlX6CqmFGGf/b39weDYnzW1NQIMceUkzQ6OorKykoxleQODg4yeaq9vyqa795FBG9CA02jeVweBo1jsN80k2HqOcl5VlpaCktLy3++Tb/gjY2NzROzJyHFGOy1aVOZuUmAvS8uLuY+sDU//B8Qtip0zIrzzEnibqSkpLxcIUVFRSgrK0N5eTkqKirk3uI3Kl71RyP+zT+5QsX/DhrNH+hKzrIgQx7oAAAAAElFTkSuQmCC + + 167ec099-c721-4c47-9375-8f0af153c701 + + extrusionIN + true + 0 + true + 0 + 55816132-8684-4462-9786-df5a0e165430 + + + + + + 57 + 585 + 87 + 20 + + + 102 + 595 + + + + + + + + true + Contains a collection of point clouds + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAI/SURBVDhPrVNNSGJRGH0pZESgi8DxDzMwdCEEJiK2EDchMga6sr0hIQqCCKbLIHAhtFERCVczbtwE5UIsiAghxYVBgksxdZGgk2MOdube68DQ0MxiZg58vL97zvvO+e7l/jc+kpqRwm+KfqNr3sUSn8/vFgoF3Nzc4Pz8HPl8HplMBolEAkdHR3C73VSkS0rAGL8g6nQ6vxaLRdTrdUwmEzw9PSGXyyEUCiEQCMDr9UKlUj2TtZE55Scki4uLz8lkErVaDQ8PD0ilUuw6m82YWKVSgcfjwc7ODhYWFqjIhzmVgLz4vLu7++34+JgR0uk0YrEYIpEIWq0Wa//+/h6Xl5dMQCKRvBDapzmb47ZWVlbGtM1yuYzpdIpSqYRqtQoqSDOhNprNJuuk3W5DLpfTLMak9ByPx7vb2Nh4pR77/T4jnZ2dIR6PYzQa4fHxEQ6HA0ajEXq9nlnc29vD8vLyKxG4YwJE8ZW2eXV1xVqkdXp6il6vh8FgwLwbDAZsbm4yG36/H0KhcC5AsEVExtvb2xgOhzg8PITL5UI2mwXJBcFgENFoFOFwmFmhk9FqtSAjn1ugoCESxRefz8dGSEFtmEwm9ueLiws0Gg2cnJzAYrFALBa/CZFCQkcjk8mwtrYGnU6HTqeD6+tr3N7esnulUgmpVMqyIB2/HeMPRAUCwReFQsEWqtVqHBwcYH9/nz2LRCJYrVYq9O5Golgi1V1dXcX6+jo0Gg0LzWw2w2azseTtdvsftzLFPx2mvwDHfQd5R26d9WPu3AAAAABJRU5ErkJggg== + + a9a4f07d-33be-4958-8e39-d2e8dd99df23 + + pointcloudIN + true + 0 + true + 0 + d73c9fb0-365d-458f-9fb5-f4141399311f + + + + + + 57 + 605 + 87 + 20 + + + 102 + 615 + + + + + + + + true + Contains a collection of generic geometry + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAShSURBVEhL3VVbSFZpFFUTNVBMyEuWqKmZqWmalqkkaWZe0PCaZl4QJdPSLAWvYF6nvGaiqEgQPaSgEnhBFBTM8IZTgS8+CjkPEz3410wzseZb+/+bpmaagnmbDZtz/v+cb+1vr7X2d/T+awDQZ+p+fnc46+vrv1VXMI2NjWFqagpzc3OYmZnBwMBA/uf1L5nChd8VJiYmq319fVhaWsLKyook7xcWFjAzM4Ph4WHU1NTgwoULCAsLg7+/P3bt2vXK2dnZWAfx9VAvxkZHR//2+PFjZGdno6CgQK7M3NxcFBUVob6+XgqUlJQgODgYx44dg6urq8bIyKjyW3QZWVhY/Dw2NoZbt24hJiYGZ86cQWpqKrKyspCZmYnIyEj4+fkhPz8fd+/eRVVVFc6dOwcPDw84ODi8VevtdFh/j927dzdev379966uLgG+du0aBgYGMDQ0hCdPnmB8fBwTExPo7++XQrGxsWhvb5duAgICcPjw4feqyLjqwkAH+SlUey62tra/PHjwABEREaisrATvR0ZG0N3dLbS0tLRgampKtJienhYNLl26JEVIpQKHm5vbO7VRPx3sp1AF5i9fvoycnBzJ3t5eDA4OIikpCRkZGVKwuLgYp0+fRnNzM9bW1jA5OQlfX180NDSgsbFRxFZ6fLC2tv7xSy2irKys3uXl5SEwMBBNTU0Czh1y8fPnz7G5uYmtrS2sr6+Lcx4+fIjV1VXcuHEDKSkp6OjoQEJCAry9vXHo0CGNsm2aDlvPyNDQcPvUqVPC6/nz50U8UsKFz549kwK07eLiInZ2doS2xMREvHz5UgqdOHFCaLx69arQFBISQtu+VtimeqpS9d69e9+xAB9w1yygxEZpaan4v7OzE8ePHxfhGdvb22LNjY0N0USJi56eHty8eROKHoSHh8PGxoaD+oOemtg3R44cwdGjR8XT7IIck29a8enTp+IkAnp5eeHevXtCG9978eIFRkdH4e7ujvv376OwsBD79u3DyZMnhSpV4A0LtOzZs0fDxewiKCgItbW1uH37NkJDQzE7O4vl5WWhhF5XLpHNPHr0SCaccxAVFYXW1lZcvHhRKGKn9vb22g7Ikyry2snJSVzA3XBC29ra/rTr/Py8gNH/tCSPC/7mQLJ7vsMNcQCZNIHSVauBLlLV+bNDLn18fHD27FkZHgrNBWVlZQLKQpyBubk5EZdU0Ah37tzBlStXYGlpKZ0q/jXE1ELrQom9ph5IAXWuID09XahiUnz6nUcGkyK6uLjI2URwbkBZUyyunn0glg72s/BXbWkOHjwoRQiQlpaGiooKEb26uhqcEyaPEP5XV1cnhx81cXR0lPeVnuTeVwv5RSgtRpRlfyU4RadgFJ3tc5fkmqKWl5eLJXkWHThwgILK/CjnvCeGDu4fY79qT0MtuIiOYevqjBKv06pMT09P8iyW5Dt0lzri+WEi9/u1UF+PCnXkagiijg9J9SGRQkzqww55tbOzky8d7azeIXiFFuLfw0i1+RPt93G6CUBhSQN3GhcXh/j4eHFMcnKy2FKtecW1WohvR7JK+e5+TAXwWX75XCXX/O9CT+8PGjgO9AIw770AAAAASUVORK5CYII= + + 6723a5fe-2e96-42c5-8793-97a79d1364e2 + + geometrybaseIN + true + 0 + true + 0 + c37956f4-d39c-49c7-af71-1e87f8031b26 + + + + + + 57 + 625 + 87 20 - 167.5 - 83 + 102 + 635 + + + + + + + + The execution information, as output and error streams + 7a28daf9-b80f-43d1-b104-277848a24ec3 + out + out + false + 0 + + + + + + 174 + 45 + 63 + 300 + + + 205.5 + 195 - + false - Contains a collection of floating point numbers + No conversion - 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 - 6fb8450c-3afe-4a9e-89e5-66d8f96bc6fe + 89210f0e-52b1-422f-9902-7951d4400654 - floatOUT + nohintOUT false 0 true 0 - 9d51e32e-c038-4352-9554-f4137ca91b9a + 6a184b65-baa3-42d1-a548-3915b401de53 - 136 - 93 + 174 + 345 63 - 20 + 300 - 167.5 - 103 + 205.5 + 495 @@ -339,8 +1223,8 @@ - mcneel.pythonnet.python - 3.9.10 + *.*.python + 3.-1 @@ -356,7 +1240,7 @@ - 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6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KuiOOCrojjgq6I44KujOvzgqCHpiclQQ9OWFF/4HE59Us1VShOYAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAAOEAAACWCAIAAACn9nhUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAACm2SURBVHhe7Z13VJRX17ejMTEmUexRo1ixd6MC6mPvXYjd2EuwoCg27J2iiIpRLCgWwIIISDEqKKKiicH4GEJVeaMCCkbR9TzJStb3Xc6e8PJqkkFmJDOu8/tj1pl9n3Pudt2/vQ/MwDtKSiag/6ekZKz6X0b/5w89efLE399f4tOmTXv27NnEiRPd3Nxu3759/fr174xbqampjo6O7du3T0lJuXPnzpAhQ6ZOnUojMTGxZcuWGzduTEtLs7CwWL9+/a+//pqdnX3jxg1GxcbG0oeLwJm2atXq4cOHzZs3X7lyJZMwYZcuXRYsWPD48ePhw4fb2to+evTI09OTSW7evMlwLkuvXr0qVarUu3dv+sthKOmjH3/8MTQ09F//+te///3vP2f0p59+evr06bhx42RTjRo1mjVrtnPnThNitF27dsLo4MGDp0yZksuoq6vrgwcPvLy8ypUrB1L9+vXr1q0bm3gCLS0thw0bVrduXTi+f/9+XkY7d+4Moz///DMdbGxshNE6deoIo/Hx8dHR0R988AHXVDFqEOlmFHEjuRP29vbvv/8+W83MzLy9vbnTxs/o999/HxkZGRISQgOFh4efOXOGBjAFBwcDU1xcXFJSEpfAyclpzZo1Z8+e/eGHHy5evOjs7Lxw4cKAgACQpU9QUND58+dlklOnTjHnrVu3IjTiwsXExAQGBtKNPXJNmIEJmZ/OchhK+ighISEsLEwHoyREvCQnJ4ebh51gKtu3bzcJH+UIsTegoYEAi/OUNoYHQzToRgcMMjk5WbYSp02EPjIJDeZ5MUyDIO1vv/2W2RAR+ktPERHeyk61ISU9lC8fzVVWVtbvv/8+cuTITZs2mQSjSm+BXo9RalMWEJ9//rm7u7tJ5Hqlt0D5yvW5UowqFb4KzqjK9UqFo4LnesWoUuFIL0ZZ24KpktIbVQEZZV2fmpqqGFUqBMXHx586dUoxqmS8UowqGbtem9GsrKyhQ4cqRpUKTfllNC0tLT09/fnz50+ePLGxsXk7GP1BI+0bJWNVvhgF0MePH7OQX7ZsWevWrc3Nzb28vEydUVaL/v7+Bw8ejIuL04Ze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 From f916e3da79ab094aa5c261b8a308aa436a71e558 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Sun, 21 Jan 2024 21:21:36 +0100 Subject: [PATCH 12/35] CAP: working marshalling python code --- .../ghpython-components/componentize.py | 278 +++++++----------- assets/CHANGELOG.md | 7 +- assets/testTypeHint.ghx | 218 +++++++++++++- examples/TestCpy_KitchenSink/code.py | 26 ++ examples/TestCpy_KitchenSink/icon.png | Bin 0 -> 2759 bytes examples/TestCpy_KitchenSink/metadata.json | 65 ++++ examples/Test_KitchenSink/code.py | 2 + examples/Test_KitchenSink/metadata.json | 5 +- 8 files changed, 425 insertions(+), 176 deletions(-) create mode 100644 examples/TestCpy_KitchenSink/code.py create mode 100644 examples/TestCpy_KitchenSink/icon.png create mode 100644 examples/TestCpy_KitchenSink/metadata.json diff --git a/.github/actions/ghpython-components/componentize.py b/.github/actions/ghpython-components/componentize.py index 6c7df0a..218a734 100644 --- a/.github/actions/ghpython-components/componentize.py +++ b/.github/actions/ghpython-components/componentize.py @@ -13,40 +13,42 @@ import System import System.IO -GHPYTHON_SCRIPT_GUID = System.Guid("c9b2d725-6f87-4b07-af90-bd9aefef68eb") # <<<<<<<<<<<< changed + +GHPYTHON_SCRIPT_GUID = System.Guid("c9b2d725-6f87-4b07-af90-bd9aefef68eb") +CPY_VER = "3.9.10" TEMPLATE_VER = re.compile("{{version}}") TEMPLATE_NAME = re.compile("{{name}}") TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}") TYPES_MAP = dict( - none="6a184b65-baa3-42d1-a548-3915b401de53", # <<<<<<<<<<<< changed - ghdoc="1c282eeb-dd16-439f-94e4-7d92b542fe8b", # <<<<<<<<<<<< changed - float="9d51e32e-c038-4352-9554-f4137ca91b9a", # <<<<<<<<<<<< changed - bool="d60527f5-b5af-4ef6-8970-5f96fe412559", # <<<<<<<<<<<< same - int="48d01794-d3d8-4aef-990e-127168822244", # <<<<<<<<<<<< sasme - complex="309690df-6229-4774-91bb-b1c9c0bfa54d", # <<<<<<<<<<<< same - str="3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88", # <<<<<<<<<<<< changed - datetime="09bcf900-fe83-4efa-8d32-33d89f7a3e66", # <<<<<<<<<<<< same - guid="5325b8e1-51d7-4d36-837a-d98394626c35", # <<<<<<<<<<<< same - color="24b1d1a3-ab79-498c-9e44-c5b14607c4d3", # <<<<<<<<<<<< same - point="e1937b56-b1da-4c12-8bd8-e34ee81746ef", # <<<<<<<<<<<< same - vector="15a50725-e3d3-4075-9f7c-142ba5f40747", # <<<<<<<<<<<< same - plane="3897522d-58e9-4d60-b38c-978ddacfedd8", # <<<<<<<<<<<< same - interval="589748aa-e558-4dd9-976f-78e3ab91fc77", # <<<<<<<<<<<< same - uvinterval="74c906f3-db02-4cea-bd58-de375cb5ae73", # <<<<<<<<<<<< same - box="f29cb021-de79-4e63-9f04-fc8e0df5f8b6", # <<<<<<<<<<<< same - transform="c4b38e4c-21ff-415f-a0d1-406d282428dd", # <<<<<<<<<<<< same - line="f802a8cd-e699-4a94-97ea-83b5406271de", # <<<<<<<<<<<< same - circle="3c5409a1-3293-4181-a6fa-c24c37fc0c32", # <<<<<<<<<<<< same - arc="9c80ec18-b48c-41b0-bc6e-cd93d9c916aa", # <<<<<<<<<<<< same - polyline="66fa617b-e3e8-4480-9f1e-2c0688c1d21b", # <<<<<<<<<<<< same - rectangle="83da014b-a550-4bf5-89ff-16e54225bd5d", # <<<<<<<<<<<< same - curve="9ba89ec2-5315-435f-a621-b66c5fa2f301", # <<<<<<<<<<<< same - mesh="794a1f9d-21d5-4379-b987-9e8bbf433912", # <<<<<<<<<<<< same - surface="f4070a37-c822-410f-9057-100d2e22a22d", # <<<<<<<<<<<< same - subd="20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08", # <<<<<<<<<<<< same - brep="2ceb0405-fdfe-403d-a4d6-8786da45fb9d", # <<<<<<<<<<<< same - geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26" # <<<<<<<<<<<< same + none="6a184b65-baa3-42d1-a548-3915b401de53", + ghdoc="1c282eeb-dd16-439f-94e4-7d92b542fe8b", + float="9d51e32e-c038-4352-9554-f4137ca91b9a", + bool="d60527f5-b5af-4ef6-8970-5f96fe412559", + int="48d01794-d3d8-4aef-990e-127168822244", + complex="309690df-6229-4774-91bb-b1c9c0bfa54d", + str="3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88", + datetime="09bcf900-fe83-4efa-8d32-33d89f7a3e66", + guid="5325b8e1-51d7-4d36-837a-d98394626c35", + color="24b1d1a3-ab79-498c-9e44-c5b14607c4d3", + point="e1937b56-b1da-4c12-8bd8-e34ee81746ef", + vector="15a50725-e3d3-4075-9f7c-142ba5f40747", + plane="3897522d-58e9-4d60-b38c-978ddacfedd8", + interval="589748aa-e558-4dd9-976f-78e3ab91fc77", + uvinterval="74c906f3-db02-4cea-bd58-de375cb5ae73", + box="f29cb021-de79-4e63-9f04-fc8e0df5f8b6", + transform="c4b38e4c-21ff-415f-a0d1-406d282428dd", + line="f802a8cd-e699-4a94-97ea-83b5406271de", + circle="3c5409a1-3293-4181-a6fa-c24c37fc0c32", + arc="9c80ec18-b48c-41b0-bc6e-cd93d9c916aa", + polyline="66fa617b-e3e8-4480-9f1e-2c0688c1d21b", + rectangle="83da014b-a550-4bf5-89ff-16e54225bd5d", + curve="9ba89ec2-5315-435f-a621-b66c5fa2f301", + mesh="794a1f9d-21d5-4379-b987-9e8bbf433912", + surface="f4070a37-c822-410f-9057-100d2e22a22d", + subd="20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08", + brep="2ceb0405-fdfe-403d-a4d6-8786da45fb9d", + geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26" ) EXPOSURE = dict(valid=set([-1, 2, 4, 8, 16, 32, 64, 128]), default=2) @@ -213,7 +215,6 @@ def replace_templates(code, version, name, ghuser_name): return code -# FIXME: main function to port for GHUser in Python3 def create_ghuser_component(source, target, version=None, prefix=None): from GH_IO.Serialization import GH_LooseChunk @@ -221,7 +222,6 @@ def create_ghuser_component(source, target, version=None, prefix=None): code = replace_templates(code, version, data["name"], os.path.basename(target)) - # new guid instance_guid = data.get("instanceGuid") if not instance_guid: instance_guid = System.Guid.NewGuid() @@ -230,178 +230,126 @@ def create_ghuser_component(source, target, version=None, prefix=None): prefix = prefix or "" - # ------------------------------ - # ------------------------------ - # root root = GH_LooseChunk("UserObject") - - # ------------------------------ - # main object chunk (root) - - # LEGEND: - # ok :: is in bth ipy and cpy - # ?? :: cannot find it in the serialized xml or ghx - # !! :: is in ipy but not in cpy - - # this is the ghuser domain - root.SetGuid("BaseID", GHPYTHON_SCRIPT_GUID) # ok - # root.SetGuid("LibID", GHPYTHON_SCRIPT_LIB) # ?? test unsure - root.SetString("Name", prefix + data["name"]) # ok - root.SetString("NickName", data["nickname"]) # ok - root.SetString("Description", data.get("description", "")) # ok - root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"])) # ok - root.SetString("Category", data["category"]) # ok - root.SetString("SubCategory", data["subcategory"]) # ok - root.SetGuid("InstanceGuid", instance_guid) # ok - root.SetByteArray("Icon", icon) # ?? - - # ------------------------------ - # this is the "Container" - ghpython_data = data["ghpython"] # this a tuple containg code and other properties + root.SetGuid("BaseID", GHPYTHON_SCRIPT_GUID) + root.SetString("Name", prefix + data["name"]) + root.SetString("NickName", data["nickname"]) + root.SetString("Description", data.get("description", "")) + root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"])) + root.SetString("Category", data["category"]) + root.SetString("SubCategory", data["subcategory"]) + root.SetGuid("InstanceGuid", instance_guid) + root.SetByteArray("Icon", icon) + # FIXME: needs to override icon display + + ghpython_data = data["ghpython"] ghpython_root = GH_LooseChunk("UserObject") + ghpython_root.SetString("Description", data.get("description", "")) + ghpython_root.SetBoolean("UsingLibraryInputParam", False) + ghpython_root.SetBoolean("UsingScriptInputParam", False) + ghpython_root.SetBoolean("UsingStandardOutputParam", False) + ghpython_root.SetInt32("IconDisplay", ghpython_data.get("iconDisplay", 0)) + ghpython_root.SetString("Name", data["name"]) + ghpython_root.SetString("NickName", data["nickname"]) + ghpython_root.SetBoolean("MarshalGuids", ghpython_data.get("marshalGuids", True)) + # TODO: add ToolTip/gh_string - ghpython_root.SetString("Description", data.get("description", "")) # ok : this is still in container's items - - # ghpython_root.SetString("ToolTip", "this is an example of tooltip") # <<<<<<<<<<<< added FIXME: might not working - ghpython_root.SetBoolean("UsingLibraryInputParam", False) # <<<<<<<<<<<< added (default might stay) - ghpython_root.SetBoolean("UsingScriptInputParam", False) # <<<<<<<<<<<< added (default might stay) - ghpython_root.SetBoolean("UsingStandardOutputParam", False) # <<<<<<<<<<<< added (default might stay) - - # ghpython_root.SetBoolean("HideOutput", ghpython_data.get("hideOutput", True)) # !! this is still in container's items - # ghpython_root.SetBoolean("HideInput", ghpython_data.get("hideInput", True)) # !! this is still in container's items - # ghpython_root.SetBoolean( - # "IsAdvancedMode", ghpython_data.get("isAdvancedMode", False) # !! this is still in container's items - # ) - # ghpython_root.SetInt32("IconDisplay", ghpython_data.get("iconDisplay", 0)) # !! this is still in container's items - - ghpython_root.SetString("Name", data["name"]) # ok - ghpython_root.SetString("NickName", data["nickname"]) # ok - - # ghpython_root.SetBoolean( - # "MarshalOutGuids", ghpython_data.get("marshalOutGuids", True) # **!! it changed to "MarshalGuids" in cpy - # ) - ghpython_root.SetBoolean("MarshalGuids", True) # <<<<<<<<<<<< added (TODO: default value to replace) - - - # ------------------------------ - # ------------------------------ - # attributes - # paramter data TODO: why this was originally commented out? # ghpython_root.CreateChunk('Attributes') # for mf in ('Bounds', 'Pivot', 'Selected'): - # ------------------------------ - # ------------------------------ - # FIXME: here the component gives back this error: - # 1. Error running script: Unable to cast object of type 'Grasshopper.Kernel.Parameters.Param_String' to type 'RhinoCodePluginGH.Parameters.ScriptVariableParam'. - # needs to change the type of the parameters for both input and output - # parameters - params = ghpython_root.CreateChunk("ParameterData") # ok - inputParam = ghpython_data.get("inputParameters", []) # ok - outputParam = ghpython_data.get("outputParameters", []) # ok - - params.SetInt32("InputCount", len(inputParam)) # ok + params = ghpython_root.CreateChunk("ParameterData") + inputParam = ghpython_data.get("inputParameters", []) + outputParam = ghpython_data.get("outputParameters", []) + + params.SetInt32("InputCount", len(inputParam)) for i, _pi in enumerate(inputParam): params.SetGuid( - "InputId", i, System.Guid.Parse("08908df5-fa14-4982-9ab2-1aa0927566aa") # ?? <<<<<<<<<<<< changed ?? + "InputId", i, System.Guid.Parse("08908df5-fa14-4982-9ab2-1aa0927566aa") ) - params.SetInt32("OutputCount", len(outputParam)) # ok + params.SetInt32("OutputCount", len(outputParam)) for i, _po in enumerate(outputParam): params.SetGuid( - "OutputId", i, System.Guid.Parse("08908df5-fa14-4982-9ab2-1aa0927566aa") # ?? <<<<<<<<<<<< changed ?? + "OutputId", i, System.Guid.Parse("08908df5-fa14-4982-9ab2-1aa0927566aa") ) - # FIXME: the "out" guis is 3ede854e-c753-40eb-84cb-b48008f14fd4 to replace up if you want to add it : - # here we could add a "out" parameter as an option to be set in the metadata.json <<<< - # ------------------------------ - # input parameters for i, pi in enumerate(inputParam): input_instance_guid = System.Guid.NewGuid() pi_chunk = params.CreateChunk("InputParam", i) - pi_chunk.SetString("Name", pi["name"]) # ok - pi_chunk.SetString("NickName", pi.get("nickname") or pi["name"]) # ok - pi_chunk.SetString("Description", pi.get("description")) # ok - pi_chunk.SetBoolean("Optional", pi.get("optional", True)) # ok - pi_chunk.SetBoolean("AllowTreeAccess", pi.get("allowTreeAccess", True)) # ok - pi_chunk.SetBoolean("ShowTypeHints", pi.get("showTypeHints", True)) # ok + pi_chunk.SetString("Name", pi["name"]) + pi_chunk.SetString("NickName", pi.get("nickname") or pi["name"]) + pi_chunk.SetString("Description", pi.get("description")) + pi_chunk.SetBoolean("Optional", pi.get("optional", True)) + pi_chunk.SetBoolean("AllowTreeAccess", pi.get("allowTreeAccess", True)) + pi_chunk.SetBoolean("ShowTypeHints", pi.get("showTypeHints", True)) pi_chunk.SetInt32( "ScriptParamAccess", - parse_param_access(pi.get("scriptParamAccess", ACCESS["default"])), # ok + parse_param_access(pi.get("scriptParamAccess", ACCESS["default"])), ) - pi_chunk.SetInt32("SourceCount", 0) # ok - pi_chunk.SetGuid("InstanceGuid", input_instance_guid) # ok - pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID"))) # ok FIXME: this one is maybe to modify + pi_chunk.SetInt32("SourceCount", pi.get("sourceCount", 0)) + pi_chunk.SetGuid("InstanceGuid", input_instance_guid) + pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID"))) pi_chunk.SetInt32( "WireDisplay", - parse_wire_display(pi.get("wireDisplay", WIRE_DISPLAY["default"])), # !! TODO: not sure if not shown by default, for test get out + parse_wire_display(pi.get("wireDisplay", WIRE_DISPLAY["default"])), ) - pi_chunk.SetBoolean("ReverseData", pi.get("reverse", False)) # !! TODO: not sure if not shown by default, for test get out - pi_chunk.SetBoolean("SimplifyData", pi.get("simplify", False)) # !! TODO: not sure if not shown by default, for test get out - # Mutually exclusive options + pi_chunk.SetBoolean("ReverseData", pi.get("reverse", False)) + pi_chunk.SetBoolean("SimplifyData", pi.get("simplify", False)) if pi.get("flatten", False): - pi_chunk.SetInt32("Mapping", 1) # !! TODO: not sure if not shown by default, for test get out + pi_chunk.SetInt32("Mapping", 1) elif pi.get("graft", False): - pi_chunk.SetInt32("Mapping", 2) # !! TODO: not sure if not shown by default, for test get out + pi_chunk.SetInt32("Mapping", 2) - # ------------------------------ - # output parameters for i, po in enumerate(outputParam): output_instance_guid = System.Guid.NewGuid() - po_chunk = params.CreateChunk("OutputParam", i) # ok - po_chunk.SetString("Name", po["name"]) # ok - po_chunk.SetString("NickName", po.get("nickname") or po["name"]) # ok - po_chunk.SetString("Description", po.get("description")) # ok - po_chunk.SetBoolean("Optional", po.get("optional", False)) # ok - po_chunk.SetInt32("SourceCount", 0) # ok - - # po_chunk.SetGuid("TypeHintID", System.Guid.Parse("0b057941-4ed8-4cde-9c90-bacf7ba51cb7")) - - po_chunk.SetGuid("InstanceGuid", output_instance_guid) # ok - # FIXME: here the param hint needs to be added/modified - - - po_chunk.SetBoolean("ReverseData", po.get("reverse", False)) # !! TODO: see above - po_chunk.SetBoolean("SimplifyData", po.get("simplify", False)) # !! TODO: see above - # Mutually exclusive options + po_chunk = params.CreateChunk("OutputParam", i) + po_chunk.SetString("Name", po["name"]) + po_chunk.SetString("NickName", po.get("nickname") or po["name"]) + po_chunk.SetString("Description", po.get("description")) + po_chunk.SetBoolean("Optional", po.get("optional", False)) + po_chunk.SetInt32("SourceCount", po.get("sourceCount", 0)) + po_chunk.SetGuid("InstanceGuid", output_instance_guid) + po_chunk.SetBoolean("ReverseData", po.get("reverse", False)) + po_chunk.SetBoolean("SimplifyData", po.get("simplify", False)) if po.get("flatten", False): - po_chunk.SetInt32("Mapping", 1) # !! TODO: see above + po_chunk.SetInt32("Mapping", 1) elif po.get("graft", False): - po_chunk.SetInt32("Mapping", 2) # !! TODO: see above - - # ------------------------------ - # code + po_chunk.SetInt32("Mapping", 2) - # FIXME: does not exist anymore, need a new chunk script = ghpython_root.CreateChunk("Script") - # TODO: here the code from the component needs to go in base64 - code = base64.b64encode(code.encode("utf-8")) - script.SetString("Text", "IiIiVGhpcyBpcyBhIG5ldyBzY3JpcHQgaW5zdGFuY2UiIiINCmltcG9ydCBTeXN0ZW0NCmltcG9ydCBSaGlubw0KaW1wb3J0IEdyYXNzaG9wcGVyDQoNCmltcG9ydCByaGlub3NjcmlwdHN5bnRheCBhcyBycw0KDQoNCmNsYXNzIE15Q29tcG9uZW50KEdyYXNzaG9wcGVyLktlcm5lbC5HSF9TY3JpcHRJbnN0YW5jZSk6DQogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBjb21wYXNuZXdfeCwgeSk6DQogICAgICAgICIiIkdyYXNzaG9wcGVyIFNjcmlwdCBjb21wYXMgYWN0aW9uIiIiDQogICAgICAgIGEgPSAiSGVsbG8gUHl0aG9uIDMgaW4gR3Jhc3Nob3BwZXIhIg0KICAgICAgICBwcmludChhKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuDQo=") - script.SetString("Title", "S") + + + # import marshal + # code_binary = marshal.dumps(compile(code, "", "exec")) + + # code_binary = System.Text.Encoding.UTF8.GetBytes(code) # ipy + + code_base64 = base64.b64encode(code.encode("utf-8")) # cpy + print(code_base64) + + # get rid of the b' and ' at the beginning and end of the string + code_base64 = str(code_base64)[2:-1] + + script.SetString("Text", f"{code_base64}") + # script.SetString("Text", "IiIiCkRvIHNvbWV0aGluZyBzaWxseS4KClRoaXMgY29tcG9uZW50IGRvZXMgbm90aGluZyB1c2VmdWwsIGl0J3Mgb25seSBhIG1pbmltYWwgZXhhbXBsZS4KCiAgICBBcmdzOgogICAgICAgIHg6IFggdmFsdWUKICAgICAgICB5OiBZIHZhbHVlCiAgICAgICAgejogWiB2YWx1ZQogICAgUmV0dXJuczoKICAgICAgICBhOiBUaGUgc3VtIG9mIGFsbCB0aHJlZSB2YWx1ZXMuCiIiIgoKZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgpjbGFzcyBNaW5pbWFsU2RrQ29tcG9uZW50KGNvbXBvbmVudCk6CiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsIHgsIHksIHopOgogICAgICAgIHNlbGYuTWVzc2FnZSA9ICdDT01QT05FTlQgdnt7dmVyc2lvbn19JwogICAgICAgIHJldHVybiAoeCArIHkgKyB6KQo=") + # FIXME: solve the encoding because it set to script + # script.SetString("Text", "IiIiVGhpcyBpcyBhIG5ldyBzY3JpcHQgaW5zdGFuY2UiIiINCmltcG9ydCBTeXN0ZW0NCmltcG9ydCBSaGlubw0KaW1wb3J0IEdyYXNzaG9wcGVyDQoNCmltcG9ydCByaGlub3NjcmlwdHN5bnRheCBhcyBycw0KDQoNCmNsYXNzIE15Q29tcG9uZW50KEdyYXNzaG9wcGVyLktlcm5lbC5HSF9TY3JpcHRJbnN0YW5jZSk6DQogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBjb21wYXNuZXdfeCwgeSk6DQogICAgICAgICIiIkdyYXNzaG9wcGVyIFNjcmlwdCBjb21wYXMgYWN0aW9uIiIiDQogICAgICAgIGEgPSAiSGVsbG8gUHl0aG9uIDMgaW4gR3Jhc3Nob3BwZXIhIg0KICAgICAgICBwcmludChhKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuDQo=") + + # convert this base64 to string: + # code2convert = "IiIiVGhpcyBpcyBhIG5ldyBzY3JpcHQgaW5zdGFuY2UiIiINCmltcG9ydCBTeXN0ZW0NCmltcG9ydCBSaGlubw0KaW1wb3J0IEdyYXNzaG9wcGVyDQoNCmltcG9ydCByaGlub3NjcmlwdHN5bnRheCBhcyBycw0KDQoNCmNsYXNzIE15Q29tcG9uZW50KEdyYXNzaG9wcGVyLktlcm5lbC5HSF9TY3JpcHRJbnN0YW5jZSk6DQogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBjb21wYXNuZXdfeCwgeSk6DQogICAgICAgICIiIkdyYXNzaG9wcGVyIFNjcmlwdCBjb21wYXMgYWN0aW9uIiIiDQogICAgICAgIGEgPSAiSGVsbG8gUHl0aG9uIDMgaW4gR3Jhc3Nob3BwZXIhIg0KICAgICAgICBwcmludChhKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuDQo=" + # code2convert = base64.b64decode(code2convert).decode("utf-8") + # # print(code2convert) + + script.SetString("Title", "S") # FIXME:to parametrize language_spec = script.CreateChunk("LanguageSpec") language_spec.SetString("Taxon", "mcneel.pythonnet.python") - language_spec.SetString("Version", "3.9.10") # TODO: the version might be a parameter - - # print("CodeInput", code) - - # ------------------------------ - # ------------------------------ - # Serialization - # TODO: test, get rid at merge - # print(ghpython_root.Serialize_Xml()) - xml_serialized = ghpython_root.Serialize_Xml() - # save to file - with open(r"F:\compas-actions.ghpython_components\build\test.xml", "w") as f: - f.write(xml_serialized) - # ------------------------------ - - root.SetByteArray("Object", ghpython_root.Serialize_Binary()) + language_spec.SetString("Version", CPY_VER) + # xml_serialized = ghpython_root.Serialize_Xml() + root.SetByteArray("Object", ghpython_root.Serialize_Binary()) System.IO.File.WriteAllBytes(target, root.Serialize_Binary()) - # ------------------------------ - if __name__ == "__main__": diff --git a/assets/CHANGELOG.md b/assets/CHANGELOG.md index a2de4d9..a104b41 100644 --- a/assets/CHANGELOG.md +++ b/assets/CHANGELOG.md @@ -1,4 +1,9 @@ - port to py3 - added new guid for typehints (extrusion and pointcloud) and modified the old ones for str, float, ghdoc, and none. -- [?] propose type-hint for component hints instead of the metadata (?) \ No newline at end of file +- [?] propose type-hint for component hints instead of the metadata (?) +- [?] propose to have the "out" parameter as out and set to false by default in the metadata.json (guid out param: 3ede854e-c753-40eb-84cb-b48008f14fd4) + + +doubts: +- I have doubts about the utility of setting the "SourceCount" in the metadata.json. I think it is not necessary, since the number of inputs is already defined by the number of parameters in the function. I think it is to leave it by deafult to 0. diff --git a/assets/testTypeHint.ghx b/assets/testTypeHint.ghx index 98ed55c..8491abc 100644 --- a/assets/testTypeHint.ghx +++ b/assets/testTypeHint.ghx @@ -49,10 +49,10 @@ - -292 - -3174 + -210 + 37 - 6.476208 + 2.0761244 @@ -86,9 +86,9 @@ - 1 + 2 - + c9b2d725-6f87-4b07-af90-bd9aefef68eb @@ -1233,6 +1233,212 @@ + + + c9b2d725-6f87-4b07-af90-bd9aefef68eb + 066d0a87-236f-4eae-a0f4-9e42f5327962 + Kitchen sink component example + + + + + This is an example with the everything and the kitchen sink in it, just to show all available options. + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQdSURBVEhL3ZRbTJtlHMbxwmTGxCjRMONkbkx0Y0P6tf3aDhgCkwyXbcTordELl6gcC4NxGitgvFiM0ZuFHiiHcj5LCwgUWuuQOdyBEVd1rjB3p3HgIcRo/o//9/s+IFzWmJj4JP+0Td739z553udtzH8q6d3mQ7oCh1OX7wjrCpw/pxS6/tIVun+UrJ6w3tphl0t79mhLo5eUb09n8P2UfGcTg1el4hZIxa1gMPSlXTCU98FQ1vOHVDXwpLYlOqUUOBqEe/FdKmxx6a0ehntgONOrwnmMlcMwnB2uUzZEK12By87O13VFrV7J2rm+4dpYMQDj2SGeQchVo5BrvB5tS3SSClrKpOL2gFTaydMV0Jf1BhgeMJQP/Cmcy9UMrx3nA8ajO0BvbXrcYG1+2mDt2j7VQ+pUDv8k1/hgYripbhImm99DK3kJPE5aPlFOSzmxGmq7+EJf4YZclkraoC/r4unmvHtgqOhXI6kcYbdjCliu5U+Gm20zMNXPeuhengV3TgDf5gJLR1exmPaYhlUlHEuFzb9JJe1qQwRYuUgBF1l/osEnVOfnpxk+qxxgbgi66Pvj6QgfA25mA1czQPOHqzS0Kq6fU3W80RAGi8sUrkXWm5FMqc7rA7A0BGFpDMHUGMqlcM7buJEFLBwBvrCAgoY5Da1KX9p5fdO10pJBGIXrjTiEc4abz/sZPquAzY2hdUtDyHF37tVYupZ5B1+mAXNmIGAATSbfB2Ie0PAc0Zne31UwZ10lsvbBWDu2bKr79PTrH3ky3SONr7m9Yt5Xh38vXXoji24e/QBXj6zicioQkoEZCZhMBrwHAPfuHRqeD6jo/0FxrMVhrPatZ703EsfNuMDzC+7mQZmVU8Dt41DyXuS8v1IjwWdGwK8DJg4Bo8+DBvZ9p6FV8Wuclqu9ataieucmXVjJS9sEi1k+yS15Gfg6B7ieCVxJVyMJMnzqBWD8IDDyHNCfAHTFt2hoVaYaX9HGJZq5ISbbdC47/3gTHuEKfqNUELj2IpS8LzF8Vq9GMpYEDCcCfXuBznhQW9xBDa3KXNLzkHxu4p5ygM0Pi20mm1ZO2RX4RiRcQVrIIJpPJQrKRH6JaCKZaPQA0WAiUfczRO27bpEr7k0Nu11y3dgjJtvMO+b6YFtqfSiJInyAgItIuIJ0Jf1Xbem/Iwofs2PpJTUSkTdHQgF9hKaSI+RLitBIYoT6EiLUEf+htiU60WK2XbxKpYKfm7byHt0PGkpco569DurYtUYtO//Zvynn/RbmD3MFud9+7ve4qOB+YPBZUPduu7LGvdNBTbFFyoZohdmMHfzkb2E6ZauCA/tEBUGtT62RM85BF2Nv0IW4h7Ut0QsL+gf5VZ6m4UQf9e25zZGscyRhsj/hpYuP5sMds/Va/6eKifkb1QMSMlhsgFAAAAAASUVORK5CYII= + + 8fdc3b58-58ea-4a9f-9f09-e694b361d6de + true + Kitchen sink component example + Everything + + false + false + false + + + + + + 306 + 89 + 115 + 64 + + + 351 + 121 + + + + + + 3 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 1 + 08908df5-fa14-4982-9ab2-1aa0927566aa + + + + + true + Contains a collection of floating point numbers + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVbKLVpFN7ITnI+s5HDdj6fz5QoUeSQiUgOF27dqb+GXIyo/0a4kUMhKfqLnENEOYWEFLlkxAwKGzN65n1ee+9+Y/7/N1fTrFrtr/1977PWetaz1qv4r0xtYGDwKH7xL/wn4R8zExOT7a6uLqyurmJ5eRnz8/OYmprC6Ogo+vr60NLSgpqaGuTk5CApKQk+Pj4QCZ2Lo8pXhO+YkZFRnjj4R29vL+Li4qTHxsYiOjoakZGRCAsLQ3BwMPz9/SWwp6cnAgMDYW5ufmdoaPhJC/NNU1paWv42NDSEwsJCmR09MTFRBmKQiIgIhISESFBfX194e3tL9/LygghwLzBUr1D/YMbGxr9UVlb+2djYiJSUFKSlpUnnM4OwkqioKFlFUFAQ/Pz8kJ6ejoaGBlmJSO5JUPVFC/fO1E5OTo9tbW3Izs5Ge3s7BgcHMTIyguHhYfkfq2CA8PBw5Obmor+/H6enp1hbW4ObmxtcXV3ZC1YR9Qr5lQnulwsKClBaWoqBgQFsbm4iIyMDWVlZuLy8xP7+PpKTk2WAmJgYVFdXo6enB+fn59jb25Pgzs7OsLa2fhFBtrWwesuxs7PTFBcXQ1AkM1pcXNRTdHBwAI1Gg9bW1jcUVVVV4erqCkdHRzKAYADu7u4QKrwTmKWv0KKxIvtf4+PjQW9ubsb29rYMoGsyAzw9PWFjY+NNkxng+voaJycnUKlUcHR0lEE8PDxI1e8C20whOv+zra2thuDMjLzu7u5iZmZGL1PS8/z8jIuLizcyJU03NzcygIuLCxwcHGBjYyNVJZ4fRIDPChHpJiAgQB6is6k7OzuYnp6WdNB1AR4fH+U3/J4SJZ26AOTf3t6ePZCBQkNDOd03DPBZyOueZfNgd3e3bPDExIRUC51NJDgr4DeUp1qtRkVFhaTo+PhY0iOYgJWVlfxGqIoVtApXmJEv6phl19fXY2VlBWNjY/qqWNHDwwOWlpZk5gTn92VlZVJhh4eHMnvSw0o4L6Kvrz3QWqlSqbzjYeqd4OPj4zIgfWtrC7e3t3KgyC/BqZaSkhKcnZ3JBHTZs2eCIs6CXkXSqF3x4oXZNTU1yeVGcMqRHDMIn7n8FhYWpGrYA75bX1+X4DwrZuRFwL2bA1osdwklxkrq6urQ0dEhe9LZ2SnlyWmdnZ3F5OQkamtr5XalpOfm5lBeXo78/HxYWFiQ+/eTTBNVfBE8PpEGDs7XzowpRXLMhpJzHS0CVG5aoZxnAfPNXURTsQpWwGw5NDonKOWnA2ZDhfq4puV73g2ij9/fplr7JLR8T77F+tC7DpQ612VtZmYGU1NTuVFF1QT/4X1AUwqqLrgKEhISkJqaKgEyMzPl4mOmeXl54GIsKioC9xeXojjzsRtNa7xf/37n/sg/fif/j0yh+AuVqtAmN2lbmQAAAABJRU5ErkJggg== + + 5179ba42-8925-49c6-b025-e9e530f4cac3 + X + x + true + true + 0 + true + 0 + 9d51e32e-c038-4352-9554-f4137ca91b9a + 1 + + + + + + 308 + 91 + 28 + 20 + + + 331.5 + 101 + + + + + + + + true + Contains a collection of floating point numbers + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVbKLVpFN7ITnI+s5HDdj6fz5QoUeSQiUgOF27dqb+GXIyo/0a4kUMhKfqLnENEOYWEFLlkxAwKGzN65n1ee+9+Y/7/N1fTrFrtr/1977PWetaz1qv4r0xtYGDwKH7xL/wn4R8zExOT7a6uLqyurmJ5eRnz8/OYmprC6Ogo+vr60NLSgpqaGuTk5CApKQk+Pj4QCZ2Lo8pXhO+YkZFRnjj4R29vL+Li4qTHxsYiOjoakZGRCAsLQ3BwMPz9/SWwp6cnAgMDYW5ufmdoaPhJC/NNU1paWv42NDSEwsJCmR09MTFRBmKQiIgIhISESFBfX194e3tL9/LygghwLzBUr1D/YMbGxr9UVlb+2djYiJSUFKSlpUnnM4OwkqioKFlFUFAQ/Pz8kJ6ejoaGBlmJSO5JUPVFC/fO1E5OTo9tbW3Izs5Ge3s7BgcHMTIyguHhYfkfq2CA8PBw5Obmor+/H6enp1hbW4ObmxtcXV3ZC1YR9Qr5lQnulwsKClBaWoqBgQFsbm4iIyMDWVlZuLy8xP7+PpKTk2WAmJgYVFdXo6enB+fn59jb25Pgzs7OsLa2fhFBtrWwesuxs7PTFBcXQ1AkM1pcXNRTdHBwAI1Gg9bW1jcUVVVV4erqCkdHRzKAYADu7u4QKrwTmKWv0KKxIvtf4+PjQW9ubsb29rYMoGsyAzw9PWFjY+NNkxng+voaJycnUKlUcHR0lEE8PDxI1e8C20whOv+zra2thuDMjLzu7u5iZmZGL1PS8/z8jIuLizcyJU03NzcygIuLCxwcHGBjYyNVJZ4fRIDPChHpJiAgQB6is6k7OzuYnp6WdNB1AR4fH+U3/J4SJZ26AOTf3t6ePZCBQkNDOd03DPBZyOueZfNgd3e3bPDExIRUC51NJDgr4DeUp1qtRkVFhaTo+PhY0iOYgJWVlfxGqIoVtApXmJEv6phl19fXY2VlBWNjY/qqWNHDwwOWlpZk5gTn92VlZVJhh4eHMnvSw0o4L6Kvrz3QWqlSqbzjYeqd4OPj4zIgfWtrC7e3t3KgyC/BqZaSkhKcnZ3JBHTZs2eCIs6CXkXSqF3x4oXZNTU1yeVGcMqRHDMIn7n8FhYWpGrYA75bX1+X4DwrZuRFwL2bA1osdwklxkrq6urQ0dEhe9LZ2SnlyWmdnZ3F5OQkamtr5XalpOfm5lBeXo78/HxYWFiQ+/eTTBNVfBE8PpEGDs7XzowpRXLMhpJzHS0CVG5aoZxnAfPNXURTsQpWwGw5NDonKOWnA2ZDhfq4puV73g2ij9/fplr7JLR8T77F+tC7DpQ612VtZmYGU1NTuVFF1QT/4X1AUwqqLrgKEhISkJqaKgEyMzPl4mOmeXl54GIsKioC9xeXojjzsRtNa7xf/37n/sg/fif/j0yh+AuVqtAmN2lbmQAAAABJRU5ErkJggg== + + 1c194f12-6a2b-43a6-9a00-898e63cc24c1 + Y + y + true + 0 + true + true + 0 + 9d51e32e-c038-4352-9554-f4137ca91b9a + + + + + + 308 + 111 + 28 + 20 + + + 331.5 + 121 + + + + + + + + true + Contains a collection of floating point numbers + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVbKLVpFN7ITnI+s5HDdj6fz5QoUeSQiUgOF27dqb+GXIyo/0a4kUMhKfqLnENEOYWEFLlkxAwKGzN65n1ee+9+Y/7/N1fTrFrtr/1977PWetaz1qv4r0xtYGDwKH7xL/wn4R8zExOT7a6uLqyurmJ5eRnz8/OYmprC6Ogo+vr60NLSgpqaGuTk5CApKQk+Pj4QCZ2Lo8pXhO+YkZFRnjj4R29vL+Li4qTHxsYiOjoakZGRCAsLQ3BwMPz9/SWwp6cnAgMDYW5ufmdoaPhJC/NNU1paWv42NDSEwsJCmR09MTFRBmKQiIgIhISESFBfX194e3tL9/LygghwLzBUr1D/YMbGxr9UVlb+2djYiJSUFKSlpUnnM4OwkqioKFlFUFAQ/Pz8kJ6ejoaGBlmJSO5JUPVFC/fO1E5OTo9tbW3Izs5Ge3s7BgcHMTIyguHhYfkfq2CA8PBw5Obmor+/H6enp1hbW4ObmxtcXV3ZC1YR9Qr5lQnulwsKClBaWoqBgQFsbm4iIyMDWVlZuLy8xP7+PpKTk2WAmJgYVFdXo6enB+fn59jb25Pgzs7OsLa2fhFBtrWwesuxs7PTFBcXQ1AkM1pcXNRTdHBwAI1Gg9bW1jcUVVVV4erqCkdHRzKAYADu7u4QKrwTmKWv0KKxIvtf4+PjQW9ubsb29rYMoGsyAzw9PWFjY+NNkxng+voaJycnUKlUcHR0lEE8PDxI1e8C20whOv+zra2thuDMjLzu7u5iZmZGL1PS8/z8jIuLizcyJU03NzcygIuLCxwcHGBjYyNVJZ4fRIDPChHpJiAgQB6is6k7OzuYnp6WdNB1AR4fH+U3/J4SJZ26AOTf3t6ePZCBQkNDOd03DPBZyOueZfNgd3e3bPDExIRUC51NJDgr4DeUp1qtRkVFhaTo+PhY0iOYgJWVlfxGqIoVtApXmJEv6phl19fXY2VlBWNjY/qqWNHDwwOWlpZk5gTn92VlZVJhh4eHMnvSw0o4L6Kvrz3QWqlSqbzjYeqd4OPj4zIgfWtrC7e3t3KgyC/BqZaSkhKcnZ3JBHTZs2eCIs6CXkXSqF3x4oXZNTU1yeVGcMqRHDMIn7n8FhYWpGrYA75bX1+X4DwrZuRFwL2bA1osdwklxkrq6urQ0dEhe9LZ2SnlyWmdnZ3F5OQkamtr5XalpOfm5lBeXo78/HxYWFiQ+/eTTBNVfBE8PpEGDs7XzowpRXLMhpJzHS0CVG5aoZxnAfPNXURTsQpWwGw5NDonKOWnA2ZDhfq4puV73g2ij9/fplr7JLR8T77F+tC7DpQ612VtZmYGU1NTuVFF1QT/4X1AUwqqLrgKEhISkJqaKgEyMzPl4mOmeXl54GIsKioC9xeXojjzsRtNa7xf/37n/sg/fif/j0yh+AuVqtAmN2lbmQAAAABJRU5ErkJggg== + + a4dc04ec-29c9-4732-8362-4a384fa2643c + 1 + Z + z + true + 0 + true + 0 + 9d51e32e-c038-4352-9554-f4137ca91b9a + 1 + + + + + + 308 + 131 + 28 + 20 + + + 331.5 + 141 + + + + + + + + false + No conversion + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + c5cf596e-ac3f-4ecb-98bb-f96ae5aae063 + 2 + result + result + false + 0 + true + 0 + 6a184b65-baa3-42d1-a548-3915b401de53 + + + + + + 366 + 91 + 53 + 60 + + + 384.5 + 121 + + + + + + + + + + IiIiR3Jhc3Nob3BwZXIgU2NyaXB0IiIiDQphID0gIkhlbGxvIFB5dGhvbiAzIGluIEdyYXNzaG9wcGVyISINCnByaW50KGEpDQo= + Everything + + + + + mcneel.pythonnet.python + 3.9.10 + + + + + + + + @@ -1240,7 +1446,7 @@ - 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 diff --git a/examples/TestCpy_KitchenSink/code.py b/examples/TestCpy_KitchenSink/code.py new file mode 100644 index 0000000..ed1675f --- /dev/null +++ b/examples/TestCpy_KitchenSink/code.py @@ -0,0 +1,26 @@ +""" +Do something silly. + +This component does nothing useful, it's only a kitchen sink example showing most available options. + + Args: + x: X value + y: Y value + z: Z value + Returns: + result: The sum of all three values. +""" +# from ghpythonlib.componentbase import executingcomponent as component + +import System +import Rhino +import Grasshopper + +import rhinoscriptsyntax as rs + + +class MyComponent(Grasshopper.Kernel.GH_ScriptInstance): + def RunScript(self, x: float, y: float, z: float): + self.Message = 'COMPONENT v{{version}}' + result = x + y + z + return result diff --git a/examples/TestCpy_KitchenSink/icon.png b/examples/TestCpy_KitchenSink/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c8df236e3a30d99b26c306af3495da68e531e6e3 GIT binary patch literal 2759 zcmcgudsGu=77ubjprv&IvC67ruz-)rJo11HL4;BCF^%yq$8 zJf7omT9s%_RK{QgqZQyJqoxFAt)4^kctOEtJx-)kMnFxa(mEOc{>e^0K$9|lf>;SF z^21wMkA)d1+{hSI43ja{sJJQ00Lo)HS^o$85$BmSXZ|xfhBOnT^ z5EK&&F(JAHMlcwjfGQc1)>v#%#0rH2REP)@`Tq*XDTc(2_=}MwfoT|n7Uz2;}mz*a&mjLBdOTu6?W@Y#7qSXi8a(a;&(0=p_A6i|eRNf4<-0-^$BoTyTXDRit6 z*AbLLF5`2B5zsV=`Afwbv04-W3dNKZL{O0sl!^#7h!7Hz#3?l)3LvKJRvKt-GvXP~dbP45 zIgf}?qMN`72LSR~DI{k2SPqSe&q$x#Lk zj0*?D3G0TC@d>LED3U)pO+Tj|FBN&x-jqghPG6vpiRdh&F`94#6_U!;?j;lm{T6)| z&w4R=T#S=yoIpWTf{H<$;@YYfNk~u=pus6bEYYYX(y8QajYAXQ&g0p)E94=n$nIln>6N>aJS6c1>1Nj(e`z$NyLfX+`g*tS&5y6o zPeFx+Cw94gA5$CezW;(BRr7_@On((RP`uyalEU#HT^BuPWF9zr`eJP!uoHCXxX^v; z^Qa%drdnrT>0h_pmpux4^x=alHqhmZ`ah~}r)mlXwYim_%$;>8j@h-gzEl}|VZHm} zGlhu}yGZnE0npHm$j!pgJ#V#uDs? z-tS!cmxfI-VEg`#%g&{p^X+erOpogylxrxV=MQ(hES2AV<+%M^Psw0mqkXt*n#ocS zoAX)j?>}eqD@>NLFMs-GBb0k9=#k&|h4wI#RGqo@+pTeyYd1nKeTo(bC+zgS*Sz5F zqR$qwbz=*cXB_s)tvP6SL;kcY|I?(Iqk@xeg`N?KUTyx8r0N;Yz@`-)-$9xD;^GnlpgT75&yDWV(D?V)2*0rR~&P$m_yaBmoKZy4l zEpeE2@FTRdV2JI%lwb0bIHbs{`O5X|4TnUYdC_|u%MO2it7<4Dc?ZfnqjPUCw>LKh zR-6c)m)Ocb?^M)X#C>FhiU2Wr*{yC~OU{85 z_k2o&fmfnyT58T7!FxBjFRhlD|Eb^K)NkM4zii$|zw>>PQ>ZHqdjA(=+ry}1Nshol zHYcPyP(*{V{)0#xr06}h*nMy;N$_U&>vqW_W~9b>R^G>5>Z9j)K6Pos&hTl&t$W#3 zOD#Sn;TKI~zc>YNY;nDkANk|T_9yeFwaPs57GQ1s^C=HrbBU+F^=j-~=lT@rIFKL; z3n_FhU$eK^kF1@(aE3r0Gwk`W{ATyP`@5^;zOQ=4?pe2BP(HkE=QMY02)q)zHwn4@ zPScFQ2g1N3V;lXHo%_mE$A!^P*Q4uVG{w@@p`Npc!g957v)|ghrSET1e^2?b&#jeF z6Su%lRQGkMqiEvyxscVQr&GqR-9k9&-+P> cdf~`i)t_^mjx6cBXZ_SvgvZL8LsJU=4QD(61^@s6 literal 0 HcmV?d00001 diff --git a/examples/TestCpy_KitchenSink/metadata.json b/examples/TestCpy_KitchenSink/metadata.json new file mode 100644 index 0000000..86fde85 --- /dev/null +++ b/examples/TestCpy_KitchenSink/metadata.json @@ -0,0 +1,65 @@ +{ + "name": "Kitchen sink component example", + "nickname": "Everything", + "category": "Componentizer", + "subcategory": "ALL", + "description": "This is an example with the everything and the kitchen sink in it, just to show all available options.", + "exposure": 4, + "instanceGuid": "cdd47086-f902-4b77-825b-6b79c3aaecc1", + "ghpython": { + "marshalGuids": true, + "iconDisplay": 2, + "inputParameters": [ + { + "name": "X", + "nickname": "x", + "description": "The X value of the component.", + "optional": true, + "allowTreeAccess": true, + "showTypeHints": true, + "scriptParamAccess": "item", + "wireDisplay": "faint", + "sourceCount": 0, + "typeHintID": "float", + "reverse": true, + "simplify": false + }, + { + "name": "Y", + "nickname": "y", + "description": "The Y value of the component.", + "optional": true, + "allowTreeAccess": true, + "showTypeHints": true, + "scriptParamAccess": "item", + "wireDisplay": "default", + "sourceCount": 0, + "typeHintID": "float", + "simplify": true + }, + { + "name": "Z", + "nickname": "z", + "description": "The Z value of the component.", + "optional": true, + "allowTreeAccess": true, + "showTypeHints": true, + "scriptParamAccess": "item", + "wireDisplay": "faint", + "sourceCount": 0, + "typeHintID": "float", + "flatten": true + } + ], + "outputParameters": [ + { + "name": "result", + "nickname": "result", + "description": "Result of the computation", + "optional": false, + "sourceCount": 0, + "graft": true + } + ] + } +} \ No newline at end of file diff --git a/examples/Test_KitchenSink/code.py b/examples/Test_KitchenSink/code.py index b0acc64..6961b81 100644 --- a/examples/Test_KitchenSink/code.py +++ b/examples/Test_KitchenSink/code.py @@ -17,3 +17,5 @@ class KitchenSinkComponent(component): def RunScript(self, x, y, z): self.Message = 'COMPONENT v{{version}}' return x + y + z + + \ No newline at end of file diff --git a/examples/Test_KitchenSink/metadata.json b/examples/Test_KitchenSink/metadata.json index 0974e77..86fde85 100644 --- a/examples/Test_KitchenSink/metadata.json +++ b/examples/Test_KitchenSink/metadata.json @@ -7,10 +7,7 @@ "exposure": 4, "instanceGuid": "cdd47086-f902-4b77-825b-6b79c3aaecc1", "ghpython": { - "hideOutput": true, - "hideInput": true, - "isAdvancedMode": true, - "marshalOutGuids": true, + "marshalGuids": true, "iconDisplay": 2, "inputParameters": [ { From fc6f6016a57c1ce6be5b1f0e1fa401f6e32400a8 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Sun, 21 Jan 2024 21:57:44 +0100 Subject: [PATCH 13/35] MILESTONE: working, rearraning structure for PR --- .../ghpython-components/componentize.py | 37 +--- assets/testTypeHint.ghx | 185 ++++++++++++++---- examples/TestCpy_KitchenSink/code.py | 13 +- 3 files changed, 157 insertions(+), 78 deletions(-) diff --git a/.github/actions/ghpython-components/componentize.py b/.github/actions/ghpython-components/componentize.py index 218a734..d857b0c 100644 --- a/.github/actions/ghpython-components/componentize.py +++ b/.github/actions/ghpython-components/componentize.py @@ -15,7 +15,7 @@ GHPYTHON_SCRIPT_GUID = System.Guid("c9b2d725-6f87-4b07-af90-bd9aefef68eb") -CPY_VER = "3.9.10" +CPY_VER = "3.-1" TEMPLATE_VER = re.compile("{{version}}") TEMPLATE_NAME = re.compile("{{name}}") TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}") @@ -215,6 +215,7 @@ def replace_templates(code, version, name, ghuser_name): return code + def create_ghuser_component(source, target, version=None, prefix=None): from GH_IO.Serialization import GH_LooseChunk @@ -240,12 +241,13 @@ def create_ghuser_component(source, target, version=None, prefix=None): root.SetString("SubCategory", data["subcategory"]) root.SetGuid("InstanceGuid", instance_guid) root.SetByteArray("Icon", icon) - # FIXME: needs to override icon display ghpython_data = data["ghpython"] ghpython_root = GH_LooseChunk("UserObject") ghpython_root.SetString("Description", data.get("description", "")) + bitmap_icon = System.Drawing.Bitmap.FromStream(System.IO.MemoryStream(icon)) + ghpython_root.SetDrawingBitmap("IconOverride", bitmap_icon) ghpython_root.SetBoolean("UsingLibraryInputParam", False) ghpython_root.SetBoolean("UsingScriptInputParam", False) ghpython_root.SetBoolean("UsingStandardOutputParam", False) @@ -253,8 +255,6 @@ def create_ghuser_component(source, target, version=None, prefix=None): ghpython_root.SetString("Name", data["name"]) ghpython_root.SetString("NickName", data["nickname"]) ghpython_root.SetBoolean("MarshalGuids", ghpython_data.get("marshalGuids", True)) - # TODO: add ToolTip/gh_string - # ghpython_root.CreateChunk('Attributes') # for mf in ('Bounds', 'Pivot', 'Selected'): @@ -319,32 +319,12 @@ def create_ghuser_component(source, target, version=None, prefix=None): script = ghpython_root.CreateChunk("Script") - - # import marshal - # code_binary = marshal.dumps(compile(code, "", "exec")) - - # code_binary = System.Text.Encoding.UTF8.GetBytes(code) # ipy - - code_base64 = base64.b64encode(code.encode("utf-8")) # cpy - print(code_base64) - - # get rid of the b' and ' at the beginning and end of the string + code_base64 = base64.b64encode(code.encode("utf-8")) code_base64 = str(code_base64)[2:-1] - - script.SetString("Text", f"{code_base64}") - # script.SetString("Text", "IiIiCkRvIHNvbWV0aGluZyBzaWxseS4KClRoaXMgY29tcG9uZW50IGRvZXMgbm90aGluZyB1c2VmdWwsIGl0J3Mgb25seSBhIG1pbmltYWwgZXhhbXBsZS4KCiAgICBBcmdzOgogICAgICAgIHg6IFggdmFsdWUKICAgICAgICB5OiBZIHZhbHVlCiAgICAgICAgejogWiB2YWx1ZQogICAgUmV0dXJuczoKICAgICAgICBhOiBUaGUgc3VtIG9mIGFsbCB0aHJlZSB2YWx1ZXMuCiIiIgoKZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgpjbGFzcyBNaW5pbWFsU2RrQ29tcG9uZW50KGNvbXBvbmVudCk6CiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsIHgsIHksIHopOgogICAgICAgIHNlbGYuTWVzc2FnZSA9ICdDT01QT05FTlQgdnt7dmVyc2lvbn19JwogICAgICAgIHJldHVybiAoeCArIHkgKyB6KQo=") - # FIXME: solve the encoding because it set to script - # script.SetString("Text", "IiIiVGhpcyBpcyBhIG5ldyBzY3JpcHQgaW5zdGFuY2UiIiINCmltcG9ydCBTeXN0ZW0NCmltcG9ydCBSaGlubw0KaW1wb3J0IEdyYXNzaG9wcGVyDQoNCmltcG9ydCByaGlub3NjcmlwdHN5bnRheCBhcyBycw0KDQoNCmNsYXNzIE15Q29tcG9uZW50KEdyYXNzaG9wcGVyLktlcm5lbC5HSF9TY3JpcHRJbnN0YW5jZSk6DQogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBjb21wYXNuZXdfeCwgeSk6DQogICAgICAgICIiIkdyYXNzaG9wcGVyIFNjcmlwdCBjb21wYXMgYWN0aW9uIiIiDQogICAgICAgIGEgPSAiSGVsbG8gUHl0aG9uIDMgaW4gR3Jhc3Nob3BwZXIhIg0KICAgICAgICBwcmludChhKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuDQo=") - - # convert this base64 to string: - # code2convert = "IiIiVGhpcyBpcyBhIG5ldyBzY3JpcHQgaW5zdGFuY2UiIiINCmltcG9ydCBTeXN0ZW0NCmltcG9ydCBSaGlubw0KaW1wb3J0IEdyYXNzaG9wcGVyDQoNCmltcG9ydCByaGlub3NjcmlwdHN5bnRheCBhcyBycw0KDQoNCmNsYXNzIE15Q29tcG9uZW50KEdyYXNzaG9wcGVyLktlcm5lbC5HSF9TY3JpcHRJbnN0YW5jZSk6DQogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBjb21wYXNuZXdfeCwgeSk6DQogICAgICAgICIiIkdyYXNzaG9wcGVyIFNjcmlwdCBjb21wYXMgYWN0aW9uIiIiDQogICAgICAgIGEgPSAiSGVsbG8gUHl0aG9uIDMgaW4gR3Jhc3Nob3BwZXIhIg0KICAgICAgICBwcmludChhKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuDQo=" - # code2convert = base64.b64decode(code2convert).decode("utf-8") - # # print(code2convert) - - script.SetString("Title", "S") # FIXME:to parametrize - + script.SetString("Text", code_base64) + script.SetString("Title", "S") language_spec = script.CreateChunk("LanguageSpec") - language_spec.SetString("Taxon", "mcneel.pythonnet.python") + language_spec.SetString("Taxon", "*.*.python") language_spec.SetString("Version", CPY_VER) # xml_serialized = ghpython_root.Serialize_Xml() @@ -409,7 +389,6 @@ def create_ghuser_component(source, target, version=None, prefix=None): os.mkdir(targetdir) print("[x]") - # print("[ ] GH_IO assembly: {}\r".format(gh_io or args.ghio), end="") if not gh_io: print("[-] Cannot find GH_IO Assembly! Aborting.") sys.exit(-1) diff --git a/assets/testTypeHint.ghx b/assets/testTypeHint.ghx index 8491abc..c774767 100644 --- a/assets/testTypeHint.ghx +++ b/assets/testTypeHint.ghx @@ -49,10 +49,10 @@ - -210 - 37 + 341 + 292 - 2.0761244 + 0.92118764 @@ -86,9 +86,9 @@ - 2 + 4 - + c9b2d725-6f87-4b07-af90-bd9aefef68eb @@ -1245,9 +1245,9 @@ This is an example with the everything and the kitchen sink in it, just to show all available options. 2 - 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 - 8fdc3b58-58ea-4a9f-9f09-e694b361d6de + e8b72c60-dc20-4902-b89f-e4df7c57d541 true Kitchen sink component example Everything @@ -1260,14 +1260,14 @@ - 306 - 89 + 622 + 96 115 64 - 351 - 121 + 667 + 128 @@ -1282,20 +1282,21 @@ - + true Contains a collection of floating point numbers iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVbKLVpFN7ITnI+s5HDdj6fz5QoUeSQiUgOF27dqb+GXIyo/0a4kUMhKfqLnENEOYWEFLlkxAwKGzN65n1ee+9+Y/7/N1fTrFrtr/1977PWetaz1qv4r0xtYGDwKH7xL/wn4R8zExOT7a6uLqyurmJ5eRnz8/OYmprC6Ogo+vr60NLSgpqaGuTk5CApKQk+Pj4QCZ2Lo8pXhO+YkZFRnjj4R29vL+Li4qTHxsYiOjoakZGRCAsLQ3BwMPz9/SWwp6cnAgMDYW5ufmdoaPhJC/NNU1paWv42NDSEwsJCmR09MTFRBmKQiIgIhISESFBfX194e3tL9/LygghwLzBUr1D/YMbGxr9UVlb+2djYiJSUFKSlpUnnM4OwkqioKFlFUFAQ/Pz8kJ6ejoaGBlmJSO5JUPVFC/fO1E5OTo9tbW3Izs5Ge3s7BgcHMTIyguHhYfkfq2CA8PBw5Obmor+/H6enp1hbW4ObmxtcXV3ZC1YR9Qr5lQnulwsKClBaWoqBgQFsbm4iIyMDWVlZuLy8xP7+PpKTk2WAmJgYVFdXo6enB+fn59jb25Pgzs7OsLa2fhFBtrWwesuxs7PTFBcXQ1AkM1pcXNRTdHBwAI1Gg9bW1jcUVVVV4erqCkdHRzKAYADu7u4QKrwTmKWv0KKxIvtf4+PjQW9ubsb29rYMoGsyAzw9PWFjY+NNkxng+voaJycnUKlUcHR0lEE8PDxI1e8C20whOv+zra2thuDMjLzu7u5iZmZGL1PS8/z8jIuLizcyJU03NzcygIuLCxwcHGBjYyNVJZ4fRIDPChHpJiAgQB6is6k7OzuYnp6WdNB1AR4fH+U3/J4SJZ26AOTf3t6ePZCBQkNDOd03DPBZyOueZfNgd3e3bPDExIRUC51NJDgr4DeUp1qtRkVFhaTo+PhY0iOYgJWVlfxGqIoVtApXmJEv6phl19fXY2VlBWNjY/qqWNHDwwOWlpZk5gTn92VlZVJhh4eHMnvSw0o4L6Kvrz3QWqlSqbzjYeqd4OPj4zIgfWtrC7e3t3KgyC/BqZaSkhKcnZ3JBHTZs2eCIs6CXkXSqF3x4oXZNTU1yeVGcMqRHDMIn7n8FhYWpGrYA75bX1+X4DwrZuRFwL2bA1osdwklxkrq6urQ0dEhe9LZ2SnlyWmdnZ3F5OQkamtr5XalpOfm5lBeXo78/HxYWFiQ+/eTTBNVfBE8PpEGDs7XzowpRXLMhpJzHS0CVG5aoZxnAfPNXURTsQpWwGw5NDonKOWnA2ZDhfq4puV73g2ij9/fplr7JLR8T77F+tC7DpQ612VtZmYGU1NTuVFF1QT/4X1AUwqqLrgKEhISkJqaKgEyMzPl4mOmeXl54GIsKioC9xeXojjzsRtNa7xf/37n/sg/fif/j0yh+AuVqtAmN2lbmQAAAABJRU5ErkJggg== - 5179ba42-8925-49c6-b025-e9e530f4cac3 + 69cdabc9-5ea5-40d6-bbed-b3bfe862dde7 X x true true 0 true - 0 + f34a32b3-2d81-48e5-9626-3c2dd60edbf1 + 1 9d51e32e-c038-4352-9554-f4137ca91b9a 1 @@ -1303,68 +1304,70 @@ - 308 - 91 + 624 + 98 28 20 - 331.5 - 101 + 647.5 + 108 - + true Contains a collection of floating point numbers iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVbKLVpFN7ITnI+s5HDdj6fz5QoUeSQiUgOF27dqb+GXIyo/0a4kUMhKfqLnENEOYWEFLlkxAwKGzN65n1ee+9+Y/7/N1fTrFrtr/1977PWetaz1qv4r0xtYGDwKH7xL/wn4R8zExOT7a6uLqyurmJ5eRnz8/OYmprC6Ogo+vr60NLSgpqaGuTk5CApKQk+Pj4QCZ2Lo8pXhO+YkZFRnjj4R29vL+Li4qTHxsYiOjoakZGRCAsLQ3BwMPz9/SWwp6cnAgMDYW5ufmdoaPhJC/NNU1paWv42NDSEwsJCmR09MTFRBmKQiIgIhISESFBfX194e3tL9/LygghwLzBUr1D/YMbGxr9UVlb+2djYiJSUFKSlpUnnM4OwkqioKFlFUFAQ/Pz8kJ6ejoaGBlmJSO5JUPVFC/fO1E5OTo9tbW3Izs5Ge3s7BgcHMTIyguHhYfkfq2CA8PBw5Obmor+/H6enp1hbW4ObmxtcXV3ZC1YR9Qr5lQnulwsKClBaWoqBgQFsbm4iIyMDWVlZuLy8xP7+PpKTk2WAmJgYVFdXo6enB+fn59jb25Pgzs7OsLa2fhFBtrWwesuxs7PTFBcXQ1AkM1pcXNRTdHBwAI1Gg9bW1jcUVVVV4erqCkdHRzKAYADu7u4QKrwTmKWv0KKxIvtf4+PjQW9ubsb29rYMoGsyAzw9PWFjY+NNkxng+voaJycnUKlUcHR0lEE8PDxI1e8C20whOv+zra2thuDMjLzu7u5iZmZGL1PS8/z8jIuLizcyJU03NzcygIuLCxwcHGBjYyNVJZ4fRIDPChHpJiAgQB6is6k7OzuYnp6WdNB1AR4fH+U3/J4SJZ26AOTf3t6ePZCBQkNDOd03DPBZyOueZfNgd3e3bPDExIRUC51NJDgr4DeUp1qtRkVFhaTo+PhY0iOYgJWVlfxGqIoVtApXmJEv6phl19fXY2VlBWNjY/qqWNHDwwOWlpZk5gTn92VlZVJhh4eHMnvSw0o4L6Kvrz3QWqlSqbzjYeqd4OPj4zIgfWtrC7e3t3KgyC/BqZaSkhKcnZ3JBHTZs2eCIs6CXkXSqF3x4oXZNTU1yeVGcMqRHDMIn7n8FhYWpGrYA75bX1+X4DwrZuRFwL2bA1osdwklxkrq6urQ0dEhe9LZ2SnlyWmdnZ3F5OQkamtr5XalpOfm5lBeXo78/HxYWFiQ+/eTTBNVfBE8PpEGDs7XzowpRXLMhpJzHS0CVG5aoZxnAfPNXURTsQpWwGw5NDonKOWnA2ZDhfq4puV73g2ij9/fplr7JLR8T77F+tC7DpQ612VtZmYGU1NTuVFF1QT/4X1AUwqqLrgKEhISkJqaKgEyMzPl4mOmeXl54GIsKioC9xeXojjzsRtNa7xf/37n/sg/fif/j0yh+AuVqtAmN2lbmQAAAABJRU5ErkJggg== - 1c194f12-6a2b-43a6-9a00-898e63cc24c1 + 54277e48-30d4-4a6f-ab8b-900d88ea0d1d Y y true 0 true true - 0 + f34a32b3-2d81-48e5-9626-3c2dd60edbf1 + 1 9d51e32e-c038-4352-9554-f4137ca91b9a - 308 - 111 + 624 + 118 28 20 - 331.5 - 121 + 647.5 + 128 - + true Contains a collection of floating point numbers iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVbKLVpFN7ITnI+s5HDdj6fz5QoUeSQiUgOF27dqb+GXIyo/0a4kUMhKfqLnENEOYWEFLlkxAwKGzN65n1ee+9+Y/7/N1fTrFrtr/1977PWetaz1qv4r0xtYGDwKH7xL/wn4R8zExOT7a6uLqyurmJ5eRnz8/OYmprC6Ogo+vr60NLSgpqaGuTk5CApKQk+Pj4QCZ2Lo8pXhO+YkZFRnjj4R29vL+Li4qTHxsYiOjoakZGRCAsLQ3BwMPz9/SWwp6cnAgMDYW5ufmdoaPhJC/NNU1paWv42NDSEwsJCmR09MTFRBmKQiIgIhISESFBfX194e3tL9/LygghwLzBUr1D/YMbGxr9UVlb+2djYiJSUFKSlpUnnM4OwkqioKFlFUFAQ/Pz8kJ6ejoaGBlmJSO5JUPVFC/fO1E5OTo9tbW3Izs5Ge3s7BgcHMTIyguHhYfkfq2CA8PBw5Obmor+/H6enp1hbW4ObmxtcXV3ZC1YR9Qr5lQnulwsKClBaWoqBgQFsbm4iIyMDWVlZuLy8xP7+PpKTk2WAmJgYVFdXo6enB+fn59jb25Pgzs7OsLa2fhFBtrWwesuxs7PTFBcXQ1AkM1pcXNRTdHBwAI1Gg9bW1jcUVVVV4erqCkdHRzKAYADu7u4QKrwTmKWv0KKxIvtf4+PjQW9ubsb29rYMoGsyAzw9PWFjY+NNkxng+voaJycnUKlUcHR0lEE8PDxI1e8C20whOv+zra2thuDMjLzu7u5iZmZGL1PS8/z8jIuLizcyJU03NzcygIuLCxwcHGBjYyNVJZ4fRIDPChHpJiAgQB6is6k7OzuYnp6WdNB1AR4fH+U3/J4SJZ26AOTf3t6ePZCBQkNDOd03DPBZyOueZfNgd3e3bPDExIRUC51NJDgr4DeUp1qtRkVFhaTo+PhY0iOYgJWVlfxGqIoVtApXmJEv6phl19fXY2VlBWNjY/qqWNHDwwOWlpZk5gTn92VlZVJhh4eHMnvSw0o4L6Kvrz3QWqlSqbzjYeqd4OPj4zIgfWtrC7e3t3KgyC/BqZaSkhKcnZ3JBHTZs2eCIs6CXkXSqF3x4oXZNTU1yeVGcMqRHDMIn7n8FhYWpGrYA75bX1+X4DwrZuRFwL2bA1osdwklxkrq6urQ0dEhe9LZ2SnlyWmdnZ3F5OQkamtr5XalpOfm5lBeXo78/HxYWFiQ+/eTTBNVfBE8PpEGDs7XzowpRXLMhpJzHS0CVG5aoZxnAfPNXURTsQpWwGw5NDonKOWnA2ZDhfq4puV73g2ij9/fplr7JLR8T77F+tC7DpQ612VtZmYGU1NTuVFF1QT/4X1AUwqqLrgKEhISkJqaKgEyMzPl4mOmeXl54GIsKioC9xeXojjzsRtNa7xf/37n/sg/fif/j0yh+AuVqtAmN2lbmQAAAABJRU5ErkJggg== - a4dc04ec-29c9-4732-8362-4a384fa2643c + 984bff6c-4c46-4295-b02b-482539db4206 1 Z z true 0 true - 0 + f34a32b3-2d81-48e5-9626-3c2dd60edbf1 + 1 9d51e32e-c038-4352-9554-f4137ca91b9a 1 @@ -1372,14 +1375,14 @@ - 308 - 131 + 624 + 138 28 20 - 331.5 - 141 + 647.5 + 148 @@ -1392,7 +1395,7 @@ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== - c5cf596e-ac3f-4ecb-98bb-f96ae5aae063 + 84441956-499f-4390-b645-c0399472f8d6 2 result result @@ -1406,14 +1409,14 @@ - 366 - 91 + 682 + 98 53 60 - 384.5 - 121 + 700.5 + 128 @@ -1423,14 +1426,14 @@ - IiIiR3Jhc3Nob3BwZXIgU2NyaXB0IiIiDQphID0gIkhlbGxvIFB5dGhvbiAzIGluIEdyYXNzaG9wcGVyISINCnByaW50KGEpDQo= - Everything + IiIiCkRvIHNvbWV0aGluZyBzaWxseSBpbiBjcHkuCgpUaGlzIGNvbXBvbmVudCBkb2VzIG5vdGhpbmcgdXNlZnVsLCBpdCdzIG9ubHkgYSBraXRjaGVuIHNpbmsgKGJ1dCBpbiBjcHkpIGV4YW1wbGUgc2hvd2luZyBtb3N0IGF2YWlsYWJsZSBvcHRpb25zLgoKICAgIEFyZ3M6CiAgICAgICAgeDogWCB2YWx1ZQogICAgICAgIHk6IFkgdmFsdWUKICAgICAgICB6OiBaIHZhbHVlCiAgICBSZXR1cm5zOgogICAgICAgIHJlc3VsdDogVGhlIHN1bSBvZiBhbGwgdGhyZWUgdmFsdWVzLgoiIiIKZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CmltcG9ydCBTeXN0ZW0KaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBSaGlubwppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IHJoaW5vc2NyaXB0c3ludGF4IGFzIHJzCgoKY2xhc3MgTXlDb21wb25lbnQoY29tcG9uZW50KToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgeDogZmxvYXQsIHk6IGZsb2F0LCB6OiBmbG9hdCk6CiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk1lc3NhZ2UgPSBmIkNweSBWZXJzaW9uOiB7cGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKX0iCiAgICAgICAgcmVzdWx0ID0geCArIHkgKyB6CiAgICAgICAgcmV0dXJuIHJlc3VsdAo= + S - mcneel.pythonnet.python - 3.9.10 + *.*.python + 3.-1 @@ -1439,6 +1442,104 @@ + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + f34a32b3-2d81-48e5-9626-3c2dd60edbf1 + Number Slider + + false + 0 + + + + + + 428 + 119 + 160 + 20 + + + 428.71396 + 119.202194 + + + + + + 3 + 1 + 1 + 100 + 0 + 0 + 0 + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + e8d2fbec-ef21-4d83-b1f0-b75714e3a9e1 + Panel + + false + 0 + 84441956-499f-4390-b645-c0399472f8d6 + 1 + Double click to edit panel content… + + + + + + 758 + 105 + 80 + 46 + + 0 + 0 + 0 + + 758.1729 + 105.996445 + + + + + + + 255;255;255;255 + + true + true + true + false + false + true + + + + + + @@ -1446,7 +1547,7 @@ - iVBORw0KGgoAAAANSUhEUgAAAOEAAACWCAIAAACn9nhUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAABmuSURBVHhe7Z3pbxv5eYDzbxTth6YIWrRBi3xIgWTbIu2HLJAGyYemLZpNgA0Cd7P2erNtXENwbMvetWVbh3WLuqyDOqjLknVRFCVRoi6LuiyKlCiSum1vvPba3rWzWSAtUvUx31nG4+WuD3G4cv0+MAa/+c2QGg6feY8hJX9JUZ4DdhRlr/J7R999990bN268//7777333vXr11mNw/zNmzdZwq9+9Stj1kru3r3b399/+fJlDuaa8gJjchT5tre3Z2ZmotEoiiAHXsKdO3eYD4VCm5ubW1tbjFOgqTqqCCZH0aK7uzs7O3twcNDv94djLC8vd3R0dHZ2FhYW5uTkMEBixCXQWgoXhsvlUkeVBI5euHAhLy+vvb29rq6uubk5Pz+/tLS0tbW1oqKisrLy8OHDV65cUUeVlGFy9NatW9PT0263u7e3t6enB0UaGxvb2tqGhoZIu0RQYqrNZgsGg1SlhkqWoY4qgslRzKDQxD9kZUywfNAixWAeV1jevn2bYjFmkbWoo4rwqKN7B3VUEUyOSkMtinw6WH56xlKS6yg5gSRgPHVq4fhJRFevXjUORXlKTI5yHjmnuMjbKWN5X1kK8k6nRtYkOsozjI6ONjU1UVJf+oSOlEDryc9dWlpCU+NolKfE5KjH43E6nVScW1tbdrt9fX09EolQm25ubnq9Xvr9+vr6kZER+voUnHEOIymOovvq6qrD4fjNb34Tr7C5AFj90Ho++uijcDjc0tLCaTQOSHlKTI4Wx2hoaCAAFBQUcGYvXrxYV1c3PDxMm19aWpqZmXn27Nm5ubmk5N/PJymOkg2QY2Njo7+/f3JykvDpdrsHBgaam5tXVlZ++9vf/tpiuBLef/99zmcKztj/V0yOFhYWEiZxkagjUZM31WazDQ0NDQ4OVldX8zanpaURR58XR6lMEPT73/8+V1dvby8BlZfAJceyq6vr3r17xFT5RE3ia9IhcpOF1NHdYHJ0YWGBwAPLy8uEGU5uIBDg5AaDQd5dUj95k7ecSsB4tJUkxVFS7eHDh3/+859TxlAaHjt2jOuQSy4nJ4cnJ8JRKXI1Tk1NUWTzupLO9vY2uZ4frY4+MyZHue5j7YrRJPG2McNOMgbZxFIebClJcZRsi5f79u0j11O30DMhaF5eXn5+Pk9OGUDB/cYbb9BR8boMrZKKOrp7TI4ac3uDpDjKdcXylVdeIdeTcMfHx4mab7/9dltbW3d3N4k4FApRXpMukIm8IVzd3rq2jWDG6m7gWchI6uhuMDlKlpdQamyMwSQxhlNM1JG+mDeeSWOzZSSrZ5KHE0H9fj/lNWrKh72EN9GIrZhEJUMZA9tbm6FwdDkc3d7c4F98/tng+SmcCOHq6DNjchT/6JlIfxRqjIU7d+7MzMwwTztMHKJmJfbgMW+/pXAMfX19u3QUuKKIZAROXgjec6UBA7ykyF4zc217s9s7++Osjm+mNR8sH1oOr21ubBrbngyc5ocaryF2j5mSVx3dDSZHeRdra2vp3ycmJvCD/tfr9RJ1yJLl5eVFRUVkSXKlz+fDXeNNsIwkOgo9PT308rw0dGlqaqqvr19cXMQnNBWi0dXN9bX3rm6UdY7tL3L+/fFLXz3c7Z66cn17LbrKblFjPzPRaJRI+fDzANG6ublZlsRvfhAv5P79+7wo45iUp+FRR+vq6nj/pGKrrKwsKyujliopKamqqsJOzvuBAwfm5+efI0d5UWfOnDl37hxXGq+Fy49039LSwpgaVFL5g+Va9PJc4LVC5z9n9f1rrvdbp0f+/Oj85Ss1/731n5FwOBJ5oCNHhZFSqMqjeAb6LSIlEZT8wyRXNaeOecoJ9m9tbSUFHTx4kNdy9+5dZozDUp4Yk6PUndPT05xNSijOLC7Ozs6OjY3RUjA/NTXFe+DxeKjknpdcf+/ePZvN9vLLL3PtEUrRiI4eWXlpmMQOvDoKGMS9eW3rXNPoH/7M8VK669WSwVfLRtJbxj7w/2xn8qsbQU94dRsRHQ7H4OAgz9Pf3z80NMSxcX5qampOnz5N6SzWct66uroaGxvfeecd9ueqZs/z589/+9vf5odS0MuBKU+OyVGufgIk5Zo0SSxZjQ8ANdmaAkEhKY5+/PHH+/bty87OJtqReYmFRFDxkgjHC+GSS0tLw7xb17fONE9++dDwkK9+5+6Pd7Z/sLP0rZ3BP/hd919FA1ORtS2eIesTSCwsyS2kmuLi4lOnTlERISjRlDhKIqKikDsJdrsdp7nmf/jDH/ITCerGkSlPjMlRw469QVIc5YoiA3zjG98g3eMNkYxilMBGICTIkbJpAQl4dIGr4ZXh6cCh+uCNyMmd9b/9yL//3uWf3fa+tT1VsxRapeuKN44kcUpbXKfWREeeCgtxnQsAeHJ+0Nzc3PHjx69cuYKXlPWvvPLKq6++Khe5HJjy5Hymo2zjhBJZZZUx0ZQlsEkmLSUpjvI8hC5cISPzbHSEDQ0N8kkv0RSlyPIMqF6CwaVwaHllZfN24OTO+Jf/p++vP+j5UXjO6w+/S5ZfWgriMbsBvjLmsVQOsgRmgsEg8dLv9xM7+SlUFyyRmIuEjpOXwwk0Dkt5GkyOYmQcqitOPfUTTTGWkMU4+8zQtzLmvTf2swxC4O4dBY6fYyZ8EjUfBLqYVcxgFR23fOpLwW0QXAkvjtwePXiv95+2RkqCD2aWZMsTgs7yhAxY4jQBmP4MR40DUp6SxI6ygZNLaUWMQU0qOfJXXl4e3TGtBs0TIcHY1TKS5SiBHzvJuSR6ljQxvBZa+5hRATR9GNb9gdBCYHUhGPEHw4uBoLHhKZEnFzhdFAbaLT0ziR0l9pAfaTUqKirIjEVFRWhaVlZGi/CLX/yCYut5cZR4/8EHH1AjFhQUkHYpDRGUmhJZudgIePhEKCVNcyn+HkyVf7uG5+clqKO7IbGjxB7eOd5ImgNaYFwBWgTeS0zlvLODsatl4KjT6dylo7dv38bIr3/96/RMRND79+/TgKMmLwRlGXAp0tTzGgl49E9JB005h1zh6ugzk9hRIALFmyTCKrtKyc+5TkExCklx9OOPP/7JT35is9mIoI2NjaSFkydPnj59uqqqijgqJempU6dI/ViLr0kHTbkAqIbV0WfmMx39wkmKoyR6/HjppZcopjs6OigN9+3bl5mZSTtP300cJcpmZGTQeuMTBWvS4Wmp6dXR3fB5cfSReJma8BknKY5yzGhaW1tLt0dhDdXV1SwprEn9BFHs5Ef4fD6K7FkL4GlHR0f5ibwc45iUp8TkKOvIwfvKQD7IlhmZZCll6FZKIPDs3lGgUOHg7XY7FSel58jIiMfj8Xq90iehKfMsYx1O8uHJyfXEbHX0mTE5Sp+0tra2urqKnTRJJERcQdYbN27QGtMt1dTU8DbPzMwgq5hkHclyFNCUSpRoShco0GjHoqrl0C0VFRX19vbq/dFnxuRoSUkJ51Tey/LyclaLi4t5O1lSUcnvhdJh4CjvuqGSZSTRUbo9rjoiKOEzxcjv90nTqTwbJke53Nvb23NzczGV5EgAqK+vd7vd8vUI3CWyHjlyhBrr+XIUOGCy7ReCdku7xOSo1KBkKKooESUcDkejUflclDKAYlT2ka2WklxHlecXk6MPmqMYbIgPaDjioA5L5kUjS1FHFcHkqMiRGgUfC45Se6ijSgJHH0ZC6Wbslydj33J+8A1ICahWo44qwmc6ip20wxSjoVDozp079Em0TQMDAzT1VKs80tjPMtRRRUjsKIJiJz1+V1dXcXHxxYsXq6qqCgsLT5w4YbPZrPvLMw+jjiqCyVFyuoCj9O8FBQUVFRU1NTV2ux1dSkpKuru79+/fL/fwjV0tAzXVUQUSO0oY29jYmJiYIMVjyeLi4tLSks/nW1tbGxsbI/uzg7GrZaijipDYUUE+HZEmCeTzT/l2s7GHlaijivB5jn6xqKOKkMBRgiVRU8ZxiJ3EUR7AphQkekBNp9MZDAZv6TeGXmxMjsoX71FweXkZReJ3QxmHw2Hq0UAgQDEaiUQeq6lUBfJwfowMjG1PBmq2tLSkpaXR4Ot3Ml5kTI7SD7W1tTU0NDAYHBwkjNE2EclY7ezszM7OPn36tMPhmJycxDlDpUQgKC3X0NAQe/r9frSurq52uVxYa+zxBKDmwMDAd7/73aNHj967d884XuXFw+RoTk5Ofn5+VVVVcXGxzWaTL4xmZGSwWllZKfeh3nzzzcfeeyIAu91uduYZeLampqYzZ8709/c/laPsjOLt7e3f+c53PvzwQ+N4lRcPk6N9fX34193dzYDYSb/CklWJiD09PUtLS7W1tYTGz0/cFK/s2dHRMTw8LH+1hojIU32+2Y9Aru/q6vra176G4nfv3jWOV3nxMDmKecAsMslmoBbEOeZlQG36JPee2J8niSOPNbY9GeR6LEdT/cudLzgmRyki9w4UDL29vbOzs3rv6QXnMY4Sz1g+0sXLJquhHqW60PujyqOOoiCJVfIyakYiEcYP/pBXNLq2tiYNe2pQRxUhQRwlvS4vL6+uriIoijBTX19P31NaWkqz73Q6p6am8Fh2tg51VBFMjqIFbUpVVVVOTg79eEtLS3V1dWNjY1lZGYKWl5dnZ2cfP37c5/PxSEMly1BHFcHkKN03bQo65uXloSZSsmxoaKipqSGO1tXVEUHT09MJtBpHlZRhcpTSMxgMEkcxg+pTPvMk6ZP6kWZ9fV2aJ/nVUKuhr1dHFTA5ihkYCfF7mczEB4KM0dRqiKPd3d3qqGJyVORIjYKPhcJDHVUggaOChExjJZbl5RMjCbHGrJWoo4pgchT/5CYoLRHtkcfjQUpWKQ0nJydpm7q6usbHx+fn55k0VLIMdVQRTI6OjY3R17tcrosXL9rtdpqnjo4OZhhUVFTI74XS8uMrEhsqWYY6qggmR4mUbre7tra2paUlPz8/OzubQWVlJY46nc6SkhKWBw4c8Pl86qiSMkyORiKRiYmJQCBAQA3GILP7/f6lGHNzc1QC09PToVAoBX2VOqoIJkcxT1oiwiRLGcg9UTZJDcoOjJHVaiiFKX/VUcXkqGHH3gBHNY4q8JmOEjIJn8bK2tojMdWYtRJ1VBFMjrKOiGRzBqurqxSmFIWsoibjkZGRmZkZKU8x2FDJMtRRRTA56oqBiL29vXRL/f39ckO0oqKioaGBNv/EiRN0/XRUcifVUtRRRTA5WlBQgIJHjhxpa2vLy8s7f/58ZWWl3W4vLi5ubGxkWVdXt3//fp/Pp44qKcPkaGZmZmdn5+joaEdHB0tiKorA4OCg2+1mlSzf1NS0sLDwcKlqEeqoIpgclf+QiRgJMsBFYCyrlKGow1K+HmUpHJzee1LA5CgiGoLsATg4dVQBk6OGHYkg+T7cyxuzVsLBqaMKmBzdiH0fDwUZxD9qQk2JrxSj0Wg0EkM0shQOTh1VwOTo4uLi7OwsCs7NzbW3t4+Pj09PTweDQeal04dLly4xn4KqgINTRxUwOXru3Ln8/Pzz58/LPVEG8gt3WVlZtbW1NpstNzc3LS0Nb9RRJWWYHO3s7GxtbSWCys0mu93e0tJCBHU6nV6vF02npqYyMjIIrtQAhkqWwcGpowqYHMU8+d6dlJ6IwurDTRID9on91RLLoSDmmlFHFZOjmIGIDy9lIMQnZdVq1FFFeNRRSJmFn486qggmR+N2MogjM2R5+iSQu6QyaSnqqCKYHA3HaG5ujkQiuIgoDChAUZNOvyr2V8M9Ho/P55OtloKjly5dUkcVk6OVlZUOhwMX+/r6qqurWW1sbETZCxcuMFlQUHDixInMzEx8TUHnpHFUEUyOFhYWoqPNZkPHkydP1tXVtbe3v/3227W1tfX19aWlpS6X6+DBg3ijjiopw+QowTIUCi0uLmLG1NRUIAarMzMzwWBwfn6e1D87O/vwh6LWsb29rbleAZOjmEehSZ/EcuOTv09GhyST0irF61SrUUcV4VFHDUH2AOqoIjzeUTp9Iqh8JYolY2Kqsc1K1FFFMDm6srKyFftfGfBDboXC9evXJyYmhoaG+vv7R0dHqU0XFhZSoKk6qggmR+nccbG3t7elpaWxsRE1h4eH+/r6mpubi4qKcnJyjh07Vl5e7vV68dhQyTLUUUUwOWqz2TIyMqqrq7OyshwOR3p6OsujR4/m5eWxqaSkpKGh4bXXXpucnFRHlZRhcpQg6nK5UHB8fHxxcdHpdI6NjbW2tg4ODno8noGBgUAg0N7ePj8/T+UqH0pZB8VGR0eHOqqYHKX6JEDGbzPRJDGIF6bAJKspEBTUUUUwOWrYsTdQRxXhiRwlcMaRYtHYYCXqqCKYHJVEL7leMjtjJhdi+P3+UCi0vLzM0vAoxvpqdGMtuhpNsrjqqCKYHKUfCgaDc3NzmDEyMoKLs7OzNE+dnZ3l5eV09/T7bW1tXq8Xg8UkAqtvPjA24w8uhdaSqqk6qggmR/NjVFRUZGRkIGVubm5TU1N2drbceAJmDh06RNcvjm6tr3YOT//b2Yt/+VbDDzJ7J+dDa6uGu7tHHVUEk6Pyn9i6XC7kIIIWFRURQXNycurr65ubm1lOTk6iL948KAMi4c21SFX3+H+Uur6X0fNnh3qaPZevbyyGVqIryWBzc1MdVcDkqASwpaUl6YooRhmQ8eOtElCqItBaNDw56/9RdtfL7/T847mRv3ln7CtHFtyXG3+3+ePI8lxSNFVHFSGBo2BoEiPh6rWNaEH7+B/tb/6Hd1yHap3/VdeX1eG+c+X1nfGvbC20L0e2ZOfdoI4qgslRw45Peflprm5Ey3um//jQiGvSsXP/X3auf28n9Hc7g3/4v51/sbboDUXWjf12gTqqCIkdBdE0LivpPn5DisloeGU+sHzq4srGcs7O6jd/feXAh5Nv3hpP355tDYVX5SG7RB1VhEcdRcHp6WnaI4ykHg0EAtSg29vbAwMDZWVldrvd7XbTOdEyRSPh9fVrN5dLdsb+ZKfnT+93/2B9fiC4dksM2z042t7ero4qCRydmprKyspqbGzESGR1OBzYWVNTk5eXl56eTl/v9Xqlcwqt0FIt3Jw6+4H7369OVLNO5H3gVzJQRxXB5CgtPFETR+UuaW5uLo5WVlaiJoPi4mKn0/nGG2+MjY2hMjs/+NQpFAmGt4ORa0uRzVBoJTaZHDY2NtRRBR51VBgZGZFPmNBxYWFhfn6eAoAlm5inACDOyZ7WgaMXL15UR5XEjsqd0Qe9UaxDenBfNAZqytLYz0o0jipCYkf3AuqoIjzqKBFUFHmY5eVlwud67LfsJbIaG6xEc70imBxFwe7ubspNdBTknujW1pbP5+vq6hoaGkKaubm5FGiqjiqCyVG3233u3DmXy0WSRdaampqmpia73c6YwZkzZ375y1/abDaPx/NJX28h6qgimBwtKCi4cOFCcXFxQ0NDWlpaVVVVWVlZaWkpSzYVFhYyv2/fvtHRURylALAU4jeOTk1NqaMvOCZHe3p6xsfHvV4vgXNkZIQYNjY2xgxLsjxR1u/3d8S+tkdrb6hkGeqoIpgclVtOEO+NZBVYBdREnRQICuqoIpgcNezYG+BoW1ub1qNKYkcJnI8ES5oYwiqTwNiYtRJ1VBESOzoxMTE/Py8ZHynX1tYWFxdJu9SjEAgEUqCpOKq5XjE5uvQJRUVFLpeLJsnj8SwsLNA2URpmZGScOnWK1p7+iZhq7GoZXBjqqAKJHc3LyyssLMzKyqqoqDh58iQDVhE3Pz//zTffpPFXR5WUkdjRpqYmh8PR1dXV399fVVXV3t7udDrr6uomJyezs7OpBCgAjF0tQx1VhMSOEiZB2iNKUvkyHjOsUqRSLBr7WYk6qgiJHd0LqKOK8BhHHw6ZqQmfcdRRRTA5ioVkczI7g/gYXeROE8tI7E9CMBaNLEUdVYRHHZ2ZmRkZGZmfn/f7/YuLi/RJly9fphKleSooKCgrK+vu7qavx9SgxVD4tra2qqOKyVGMpH9vaGg4e/ZsSUlJb2+v3W5HzeLiYlbz8vJOnDiRnp7u8XhooQyVLEMdVQSTo+Xl5cTLioqKqqqq5ubmjo4OLDlz5gzuIi6aulyut956iziqjiopw+QoyX1iYuLKlSsLCwtUhPKJKJM+n4/Uz5hJtjI2PLISdVQRTI6ioLRE0hXFxwxYlUlZGh5ZiTqqCCZHDTv2BuqoIjyRo/JFp2jsr5BSiRJKjQ1Woo4qgslRXIyDJeHY9/BlSZ/kcDjiv0NCujf2swwuiZaWFhy9efOmcbDKC0liR4maAwMDjY2NNTGcTmd9fT0NflpaWm5uLpvYwdjVMtRRRUjgKBGUZVFRkRhZXFx86dKltra2nJwcrP3pT39KKCXjy87WoY4qQuI4iqak9a6uLvnPwOWzpcHBwYWFhZ6enunpac31SspI7ChIGSp3nRjTJxE7GTOZAkFBHVWEz3T0C0cdVQSTo/FOiAGBU8YCsVMmGUjBajXqqCKYHPV4PPiHiAx8Ph/JPZ7fZ2dnh4eHmaQ8nZubw6FFi6HAaG5uVkcVk6OFhYUDAwPj4+NZWVn0RrRKfX19eMlkU1PTqVOnjh8/Xl1d3d/fj8eGSpbBhaGOKmBy9Pz589iZEyM3NzczM7OsrOzYsWPMFxQU5OfnFxUVvf7660RZdVRJGSZHXS6XzWarrKzs7e2lFiSUut3uurq6S5cuEVAdDsfk5CSxlkBLAWCoZBnqqCKYHKX6xE7KTQbxDokx1af0TFSrqJOCYhTUUUUwOYoZeImIYskXC45SBKujislRRdmbGI4qyt7lS1/6Pzgsqo3BJaYrAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAAOEAAACWCAIAAACn9nhUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAA62SURBVHhe7Z1bU1vXFYDzF/vc/9HX5KmTmU4900zTxAw4tsHiJiFAkkGArlwkISEECF24CiVcZBOPp5PUeWs/zjpWsSWRpnbatcn6xj5ztPc+x0c+n9YFkPjEMBzgn4ahlX87+q1h6MMcNbRjjhraMUcN7ZijhnbMUUM75qihHXPU0I45amjHHDW0Y44a2jFHDe2Yo4Z2zFFDO+aooR1z1NCOOWpoxxw1tGOOGtoxRw3tmKOGdsxRQzvmqKEdc9TQjjlqaMccNbRjjhraMUcN7ZijhnbMUUM75qihHXPU0I45amjHHDW0Y44a2jFHDe2Yo4Z2tDv63XffsT09PW39t3Bsu92W8xguot3R8/PzcrlcucXOzk6tVtt/S7Va9ScGUyqVzs7OTFNHUe1op9NJJpNzc3OvX7++8njx4gVxMZvNMr6xsbG8vJzJZGRqEC9fvtzd3T04ODBHHUW1o5eXl9vb26lUCs8IqHBxcUH6LhaLREfMA0Ip8slsX9CUZYeHh+aoo6h2FCNRcG1tjfDpG3d+jrhMke6RtV6vNxoNf2IA5qjrqHYUNVdWVsLh8PX1NYYJOErinp+fn5ycDIVCiUSClbjoT/fAekpYc9RdVDuKVfQ6W1tbBFTPtxvQEXfJ/myBMOlPDECbo1w/T+c/gZX+Mb9ttMdRwiRxFCNlhDvXbDYjkcjCwsLz58+JsvF4nPE7/OMQPY5yMScnJ9Qee3t7bLmwQVBwd/s8juKVxvY9ZFDOfI9R7Sg3gHp0dXWVmyEjhBYczefzlKHcY+7i0dFRu92W2b5wEu63Bke5+OPjY15y0Wh0Y2ODi+eqBsHs5uamXDP/CVh74/TuDnLvV/ere/y9GaQu1/Da+1VR7Shq0tcnk0l2EFHAOQoAtKtWq6VSiUpAFvvTPWDGR3GU83Q6V/zhYtj/pXAGypJcLvfFF18EAgEyAFd+1mp9e3bzp81TugWLuVoWcCCvSbrGYrHIk90ub6eyqUg8kkgnZhdmC5sFpvBezn9fUe1op9PJZDK0R+z4xnnfMeK2MUjG506zQG6qP90D9+/DHeUkRL1kMruykl5fXyd6EdU4LS+hnwW3CPbff/89F8ATIS0sLy+Xy2Uu+eDwKF1vr9bPuDy52larRTFAsGQB6eLVq1cE1FKxRN7gWTcbzXKlvJZfyxfz64X1er3OGk5ujv7f4KZyzyTlyS0EMZJgRlji3tye6stHcRS3crnCH//4188//yoWW4xE5imI8Q91EEVAXH/vXZBsaGhoZmaGV9TExARxNBaLkRw2c+uZ3cPx+qtg89XWfmN2JjQ7OxsMBgmflNqs/PLLL3n41d++KpVLnZeds/OzH3/88c0/3vz0009v3vhbHL1dr99LVDtKz7S0tDQ9Pc2OlwN9MO/09HRxcTEUCnE78ZgRf64H1ESmD3T0xYsbRz/99M+fffZgbGwcLYjiqVSKVEtcvANZMDk5SZbnMqggyQDISj2az22Udvdj++eL+99WdveymQwNYjqdZk02m+U1gLIEVGxuHDZ+ePPD9etr7tF7EEQ5c7dev5fwNPU66mXYA24neolwMkhJypacSCkmP24is335KI5yLP8O1W+hUCTO0cRgj3TfP4uX1m9eb1wzcRdfeXVhIaX0zttiYXenskd97SHtERQKBQIkh1AneEL2gf8KNJWLvK/wNPU6SjYnlxFRuBMSLEmdhA0GEfcmFOXzBCpxkQV94TxY8oGOAod7PVOHqyJu/SLkn+ZA/H7w4MHw8DDpnudFJ1RmaOum9+NvF4aocIipPHH5WhWvit5agkGm5DneY1Q7ihCIyO0URxkhxhCEyIkMkuVpmOhgCKX/A0c/CvKq4+JJ9yhIHh8EfRUreeJcttQ2/vO5BYNMaXhevyqqHeV/X+ot9uWucEu4bZLumZV0f4egwLF6HAUunu0dBXQXWWmodlR6pqmpKcIPMaML5mEnvRS9CzFJRmSqF2xQ5ajxS9EeR5GMlCfJDhgkgkoQxUu23SmBEfAfeLCApgSnGZfTGm6h2lH5ivf8/DxSim1UnxEP+enmeDxOYcfUTVJvtcj7rKeYI2ry0FP0lIxJMKaKJSr75zWcQrWjdMQ0uRgmoZESjZhKO4yayEpHD7TAxEhmxVHEpRdhp+sox6ZSKcYpGPzzGk6h2lH5gmI2myWCIiKwwyDaiZH7HogosyAH+g88MJtcz3qZMpxDtaNkZ1I5PRO53jfu5ATb8HJsbGx2dla+z4SstzV9Dxwl1h4dHVk96iiqHZV4SX6XqHmbZrNJTAUU9IcGwLEUDOaou2iPozRAwWCQ/O4b5zlXqVQIn0BtGovFGCReymwv5qjrqHaUFL+3t5dIJG4HS3Qk1xcKhc3NTe/b2rv458/1wxx1He2OoiAlKZ4hmYB2tVptxwNTi8UiI/5cPyhVWcOOOeooqh0l16dSKXI9+yIc4CvWTk5OkuXn5ubi8fjh4aE/1w9z1HVUO4pVZPlcLkekRMQuaCoLmCX1+6MDYIE56jTa4yghc2Jign0RDtXq9fr8/Pz09HQoFGKHUCrjsqAXc9R1VDtKO99sNjOZDJ4deOAcI+W30DxRmzIis30hBtNdmaPuotrRy8vLra2thYUFakrfOO/Nygyura1RA6TTaQxGXH+uH+ao66h2tNPp4GI4HKYAJVgKOEefJIk+Eokkk0kGcVFme8FO2n9z1F1UO4pVRFA0xTDfuGaTepTAibXAjv+m3sGwxhx1GtWO0jMtLy8HAgH6dxGOeEkQHRoakp7p2bNns7Ozd2tqjrqO9jhKt7S6uoqaiMgW1dh6bzirV6tVsZP9k6OD48PmzQc99sB6c9RpVDsq77mjHpW+nv3FxUUiaywWS6VS2Ww2Go3Gl5ZaxwerxZ3UJjoeNRrvi8qBee/DPMxRR1Ht6NXVFS05vZGEz/X1dfmUBPI7pi4tLZH3CxtryXzld39a+cvUo85Rtta4+QLqbQi05qjTqHb0/PycahIpJaGjKQ+BsFqr1YiRpPt6dSecbWRX/vD33O+P9tbN0fuHakelZ6IxEim7oGkkEhkdHaVtmpmZoS+6rM4fVbLVxjvLBFTO5XLmqLuodhSr6OjpmfAM2wiKqAYSTQmrQq22X60f79eP2BEvb2OOuo5qR+mZMpnM5OQkhqEatSmVKBGU2BkMBumfKFVBviM6CHPUdVQ7eul9lP3CwgI1JbZtb2+veNDUJ5PJtbU1uihqTapSNB0E0XdjY8McdRfVjl5cXKAm/TuxENvYR1Ygv+OufHAXjoqLgzBHXUe1o/J+Jnomqs+bTz18C9oRSsfHx2mb5ubm9vb2cNGf6wGzCbfmqLuodhSr2u12Npt9T0EJqNI5EWL90QGYo66jPY4mEomxsTGSO8FSwDkaqXA4TOdEiA2FQgziosz2gt/mqNOodpR6lLROPYqXvnGec5ShaEeVybZUKu16v+5oEOao66h2lL6eXj4ajWKqb5z3q7fQji19vXwCmT8xAHPUdVQ72ul0KEbpjSg6kbIL2uVyuUAggL6RSIQeHxf9uR4oA+QnUM1RR1HtKFa1Wq10On1bQQT14uMebZPUAP7EAMxR11HtqLwv9MmTJ8RRCZaFQuHx48ejo6NTU1M0TCMjI+wwhYts+8JRlATmqLuodvT8/By3aO3xDNtExHw+j6nFYrFcLtMwMVKpVG5kHIA56jqqHb26ukLHUChEThdBCavyocyIy07M+w0yjFscvcdod5SoGQwGqUGxjXg56/22wkmPp0+f8jAej0scZSs7AtZiJ1vqURw9sc/DdxbVjmLV8fExIRPVREFkFfAPGCHdy5RAAUAZwKB8DZX2n4ecAVOpHPzzGk6h2tFuz1Sv130HKxXUJL8HAgG6pUePHhFQGZTYiaA8/Oabb6anp2mtHj58yDIiMdVCOBy+vr72z2s4hfY42mq1UqkU/omgXRhBVkno29vb/qgXR7e2thiRHbZE0GQy2Wg0LI46impH5XNKxsfHSe5oJ2AnuZvQCDMzMwRIBrFTZsXU7g6wnnqUmsHqUUdR7ejl5SWBkMZIgqVA7MS5aDQ6Pz9PgATW+HP9wNFsNmt9vbuodlQ+N29xcRHPEFGgGaINoh/CP1oi2fHn+kEozWQy5qi7qHZUeia6H3K9CIesc3Nzo6Oj9EMjIyNM0Tl1C9C+mKOuo9pRrGq322RzFEREoVQq8RBrSfqAtf7EAFicTqfNUXfRHkfR6+nTp9SjvnFbW0jJ4LNnzxiHiYkJBomXMtuLOeo6qh29uLioVquRSIR87Rvn6Sgf/ATIR+NPZPXn+mGOuo52R4mg9O94hogC2uXzeUpMunvKgOXlZUb8uX7gdCqVMkfdRbWj5HpcJKFTd/rGec4xSNs0PDw8NjYWDAblm5+DMEddR7WjWEXPRGuPaogIJH2cY0t8RVziKw9lahBEWcKtOeou2uMogo6MjKAjtm1ubhJTeUjD9PjxY4KowFRX4l7MUddR7ah8tuPCwgIKIii20f1ks1lyPembbS6Xo39i6g441hx1GtWOXl1d4eX09DQJHdtoj+jlUZYt+4TYcDgcjUYJlqJjX8RR+369u6h2tNPprK+vk80pQAuFQiAQYH9qamp8fHxiYoK8zwiaMoWLbPuCwYlEwhx1F9WOYlWr1YrH45Lr2dIkEVkFxMU/eXvTHZijrqPa0ZcvX5LQh4eHR0dHv/766ydPnrD/8OFDounQ0BA7bOmfsPAOsBlHrR51F9WO0jOdnJxQcc7MzMRiMQKq1KOMPH/+nBEpTFHwblh2enpqjjqKakcBTUnTtXep1+v+Xq128+amO6lWqwcHByaou2h3FND04sPgDP65DAdxwFHjN445amjHHDW0Y44a2jFHDe2Yo4Z2zFFDO+aooR1z1NCOOWpoxxw1tGOOGtoxRw3tmKOGdsxRQzvmqKEdc9TQjjlqaMccNbRjjhraMUcN7ZijhnbMUUM75qihHXPU0I45amjHHDW0Y44a2jFHDe2Yo4Z2zFFDO+aooZ13HDUMnfiOGoZePvnkX86jFe+KI1wIAAAAAElFTkSuQmCC diff --git a/examples/TestCpy_KitchenSink/code.py b/examples/TestCpy_KitchenSink/code.py index ed1675f..5efb3c3 100644 --- a/examples/TestCpy_KitchenSink/code.py +++ b/examples/TestCpy_KitchenSink/code.py @@ -1,7 +1,7 @@ """ -Do something silly. +Do something silly in cpy. -This component does nothing useful, it's only a kitchen sink example showing most available options. +This component does nothing useful, it's only a kitchen sink (but in cpy) example showing most available options. Args: x: X value @@ -10,17 +10,16 @@ Returns: result: The sum of all three values. """ -# from ghpythonlib.componentbase import executingcomponent as component - +from ghpythonlib.componentbase import executingcomponent as component import System +import platform import Rhino import Grasshopper - import rhinoscriptsyntax as rs -class MyComponent(Grasshopper.Kernel.GH_ScriptInstance): +class MyComponent(component): def RunScript(self, x: float, y: float, z: float): - self.Message = 'COMPONENT v{{version}}' + ghenv.Component.Message = f"Cpy Version: {platform.python_version()}" result = x + y + z return result From ea74a49f57093b81cdfb83ab0072f47d1af7c75a Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Sun, 21 Jan 2024 22:04:10 +0100 Subject: [PATCH 14/35] WIP: preparing restructure for pr - test commit --- .github/actions/ghpython-components/README.md | 1 - .github/actions/ghpython-components/action.yml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 .github/actions/ghpython-components/README.md diff --git a/.github/actions/ghpython-components/README.md b/.github/actions/ghpython-components/README.md deleted file mode 100644 index ae5089b..0000000 --- a/.github/actions/ghpython-components/README.md +++ /dev/null @@ -1 +0,0 @@ -This action was implemented from the [compass componentizer](https://github.com/compas-dev/compas-actions.ghpython_components/tree/main). We retain no credit for the code, and only modified it to work with our own repository. \ No newline at end of file diff --git a/.github/actions/ghpython-components/action.yml b/.github/actions/ghpython-components/action.yml index 1fd6a18..01284ef 100644 --- a/.github/actions/ghpython-components/action.yml +++ b/.github/actions/ghpython-components/action.yml @@ -20,7 +20,7 @@ runs: - run: | $command="python" $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib" - $prefix="${{ inputs.prefix }}" + $prefix="${{ inputs.prefix }}" if( $prefix ) { $params=$params + "--prefix", "$prefix" From 7c7046e0361a6a4f34871e09a214dc9b1b443546 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Sun, 21 Jan 2024 22:16:44 +0100 Subject: [PATCH 15/35] WIP: testin on local ci --- .../actions/ghpython-components/action.yml | 32 - .github/workflows/build.yml | 13 +- action.yml | 6 +- assets/CHANGELOG.md | 9 - assets/TestUserObjectCpy.ghuser | Bin 4412 -> 0 bytes assets/componentize_old.py | 403 ----- assets/cpythondoc.ghx | 85 - .../deserialized_exo/TestUserObjectCpy.ghuser | Bin 4412 -> 0 bytes .../deserialized_exo/Test_KitchenSink.ghuser | Bin 3142 -> 0 bytes .../deserialized_TestUserObjectCpy.xml | 18 - ...eserialized_Test_KitchenSinkghuser_ipy.xml | 18 - assets/deserializer.py | 55 - assets/print_hints.py | 37 - assets/testTypeHint.ghx | 1555 ----------------- assets/unnamed_cpy.ghx | 192 -- assets/unnamed_fullfile.ghx | 516 ------ assets/unnamed_ipy.ghx | 210 --- .../componentize.py => componentize.py | 0 18 files changed, 10 insertions(+), 3139 deletions(-) delete mode 100644 .github/actions/ghpython-components/action.yml delete mode 100644 assets/CHANGELOG.md delete mode 100644 assets/TestUserObjectCpy.ghuser delete mode 100644 assets/componentize_old.py delete mode 100644 assets/cpythondoc.ghx delete mode 100644 assets/deserialized_exo/TestUserObjectCpy.ghuser delete mode 100644 assets/deserialized_exo/Test_KitchenSink.ghuser delete mode 100644 assets/deserialized_exo/deserialized_TestUserObjectCpy.xml delete mode 100644 assets/deserialized_exo/deserialized_Test_KitchenSinkghuser_ipy.xml delete mode 100644 assets/deserializer.py delete mode 100644 assets/print_hints.py delete mode 100644 assets/testTypeHint.ghx delete mode 100644 assets/unnamed_cpy.ghx delete mode 100644 assets/unnamed_fullfile.ghx delete mode 100644 assets/unnamed_ipy.ghx rename .github/actions/ghpython-components/componentize.py => componentize.py (100%) diff --git a/.github/actions/ghpython-components/action.yml b/.github/actions/ghpython-components/action.yml deleted file mode 100644 index 01284ef..0000000 --- a/.github/actions/ghpython-components/action.yml +++ /dev/null @@ -1,32 +0,0 @@ -# This action was implemented from the [compass componentizer](https://github.com/compas-dev/compas-actions.ghpython_components/tree/main). We retain no credit for the code, and only modified it to work with our own repository. - -name: 'Grasshopper componentizer' -description: 'Create GHUser components from Python source code' -inputs: - source: - description: 'Source directory where code for all components is stored' - required: true - target: - description: 'Target directory for ghuser files' - required: true - prefix: - description: 'Add this prefix to the name of each generated component' - required: false -runs: - using: 'composite' - steps: - - run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json - shell: pwsh - - run: | - $command="python" - $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib" - $prefix="${{ inputs.prefix }}" - if( $prefix ) - { - $params=$params + "--prefix", "$prefix" - } - & $command $params - shell: pwsh -branding: - icon: 'box' - color: 'orange' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d0059fb..60c3177 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,14 +1,11 @@ name: build -on: - push: - branches: - - cpy_dev # TODO: to erase once merged - - main + +on: [push] jobs: build_ghuser_components: + name: windows-cpython runs-on: windows-latest - name: Build components steps: - uses: actions/checkout@v2 - uses: NuGet/setup-nuget@v1.0.5 @@ -20,7 +17,9 @@ jobs: - name: Install pythonnet run: | pip install pythonnet - - uses: ./.github/actions/ghpython-components + + - name: Run the action in root + uses: ./action with: source: examples target: build diff --git a/action.yml b/action.yml index a24768c..01284ef 100644 --- a/action.yml +++ b/action.yml @@ -1,3 +1,5 @@ +# This action was implemented from the [compass componentizer](https://github.com/compas-dev/compas-actions.ghpython_components/tree/main). We retain no credit for the code, and only modified it to work with our own repository. + name: 'Grasshopper componentizer' description: 'Create GHUser components from Python source code' inputs: @@ -16,9 +18,9 @@ runs: - run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json shell: pwsh - run: | - $command="ipy" + $command="python" $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib" - $prefix="${{ inputs.prefix }}" + $prefix="${{ inputs.prefix }}" if( $prefix ) { $params=$params + "--prefix", "$prefix" diff --git a/assets/CHANGELOG.md b/assets/CHANGELOG.md deleted file mode 100644 index a104b41..0000000 --- a/assets/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -- port to py3 -- added new guid for typehints (extrusion and pointcloud) and modified the old ones for str, float, ghdoc, and none. - -- [?] propose type-hint for component hints instead of the metadata (?) -- [?] propose to have the "out" parameter as out and set to false by default in the metadata.json (guid out param: 3ede854e-c753-40eb-84cb-b48008f14fd4) - - -doubts: -- I have doubts about the utility of setting the "SourceCount" in the metadata.json. I think it is not necessary, since the number of inputs is already defined by the number of parameters in the function. I think it is to leave it by deafult to 0. diff --git a/assets/TestUserObjectCpy.ghuser b/assets/TestUserObjectCpy.ghuser deleted file mode 100644 index 676ace230aa947c5bdefa08860e6fc85228c4340..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4412 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 COVMZm diff --git a/assets/componentize_old.py b/assets/componentize_old.py deleted file mode 100644 index abf5f6e..0000000 --- a/assets/componentize_old.py +++ /dev/null @@ -1,403 +0,0 @@ -import argparse -import base64 -import json -import os -import re -import sys -import tempfile -import urllib.request, urllib.parse, urllib.error -import zipfile -from io import StringIO - -import clr -import System -import System.IO - -GHPYTHON_SCRIPT_GUID = System.Guid("410755b1-224a-4c1e-a407-bf32fb45ea7e") -TEMPLATE_VER = re.compile("{{version}}") -TEMPLATE_NAME = re.compile("{{name}}") -TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}") - -TYPES_MAP = dict( - none="35915213-5534-4277-81b8-1bdc9e7383d2", - ghdoc="87f87f55-5b71-41f4-8aea-21d494016f81", - float="39fbc626-7a01-46ab-a18e-ec1c0c41685b", - bool="d60527f5-b5af-4ef6-8970-5f96fe412559", - int="48d01794-d3d8-4aef-990e-127168822244", - complex="309690df-6229-4774-91bb-b1c9c0bfa54d", - str="37261734-eec7-4f50-b6a8-b8d1f3c4396b", - datetime="09bcf900-fe83-4efa-8d32-33d89f7a3e66", - guid="5325b8e1-51d7-4d36-837a-d98394626c35", - color="24b1d1a3-ab79-498c-9e44-c5b14607c4d3", - point="e1937b56-b1da-4c12-8bd8-e34ee81746ef", - vector="15a50725-e3d3-4075-9f7c-142ba5f40747", - plane="3897522d-58e9-4d60-b38c-978ddacfedd8", - interval="589748aa-e558-4dd9-976f-78e3ab91fc77", - uvinterval="74c906f3-db02-4cea-bd58-de375cb5ae73", - box="f29cb021-de79-4e63-9f04-fc8e0df5f8b6", - transform="c4b38e4c-21ff-415f-a0d1-406d282428dd", - line="f802a8cd-e699-4a94-97ea-83b5406271de", - circle="3c5409a1-3293-4181-a6fa-c24c37fc0c32", - arc="9c80ec18-b48c-41b0-bc6e-cd93d9c916aa", - polyline="66fa617b-e3e8-4480-9f1e-2c0688c1d21b", - rectangle="83da014b-a550-4bf5-89ff-16e54225bd5d", - curve="9ba89ec2-5315-435f-a621-b66c5fa2f301", - mesh="794a1f9d-21d5-4379-b987-9e8bbf433912", - surface="f4070a37-c822-410f-9057-100d2e22a22d", - subd="20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08", - brep="2ceb0405-fdfe-403d-a4d6-8786da45fb9d", - geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26", -) - -EXPOSURE = dict(valid=set([-1, 2, 4, 8, 16, 32, 64, 128]), default=2) -ACCESS = dict(valid=set([0, 1, 2]), map=dict(item=0, list=1, tree=2), default=0) -PARAM_TYPE = dict( - valid=set(TYPES_MAP.values()), map=TYPES_MAP, default=TYPES_MAP["ghdoc"] -) -WIRE_DISPLAY = dict( - valid=set([0, 1, 2]), map=dict(default=0, faint=1, hidden=2), default=0 -) - - -def fetch_ghio_lib(target_folder="temp"): - """Fetch the GH_IO.dll library from the NuGet packaging system.""" - ghio_dll = "GH_IO.dll" - filename = "lib/net48/" + ghio_dll - - response = urllib.urlopen("https://www.nuget.org/api/v2/package/Grasshopper/") - dst_file = os.path.join(target_folder, ghio_dll) - zip_file = zipfile.ZipFile(StringIO.StringIO(response.read())) - - with zip_file.open(filename, "r") as zipped_dll: - with open(dst_file, "wb") as fp: - fp.write(zipped_dll.read()) - - return dst_file - - -def find_ghio_assembly(libdir): - for root, _dirs, files in os.walk(libdir): - for basename in files: - if basename.upper() == "GH_IO.DLL": - filename = os.path.join(root, basename) - return filename - - -def bitmap_from_image_path(image_path): - with open(image_path, "rb") as imageFile: - # Ensure img_string is a string, not a bytes object - img_string = base64.b64encode(imageFile.read()) - if isinstance(img_string, bytes): - img_string = img_string.decode() - - # Now you can pass img_string to the FromBase64String method - return System.Convert.FromBase64String(img_string) - # return System.Convert.FromBase64String(img_string) - - -def validate_source_bundle(source): - icon = os.path.join(source, "icon.png") - code = os.path.join(source, "code.py") - data = os.path.join(source, "metadata.json") - - if not os.path.exists(icon): - raise ValueError( - "icon missing, make sure icon.png is present in the source bundle: {}".format( - source - ) - ) - if not os.path.exists(code): - raise ValueError( - "code missing, make sure code.py is present in the source bundle: {}".format( - source - ) - ) - if not os.path.exists(data): - raise ValueError( - "metadata missing, make sure metadata.json is present in the source bundle: {}".format( - source - ) - ) - - icon = bitmap_from_image_path(icon) - - with open(code, "r") as f: - python_code = f.read() - - with open(data, "r") as f: - data = json.load(f) - - if "exposure" not in data: - data["exposure"] = EXPOSURE["default"] - - if data["exposure"] not in EXPOSURE["valid"]: - raise ValueError( - "Invalid exposure value. Accepted values are {}".format( - sorted(EXPOSURE["valid"]) - ) - ) - - ghpython = data.get("ghpython") - sdk_mode = ghpython and ghpython.get("isAdvancedMode", False) - - if r'"""' not in python_code and sdk_mode is False: - python_code = r'"""{}"""{}{}'.format( - data.get("description", "Generated by Componentizer"), - os.linesep, - python_code, - ) - - return icon, python_code, data - - -def parse_param_access(access): - try: - access = int(access) - except ValueError: - # Maybe string? - access = ACCESS["map"].get(access) - - if access not in ACCESS["valid"]: - raise ValueError( - "Invalid param access value. Valid values are {}".format( - sorted(ACCESS["valid"]) - ) - ) - - return access - - -def parse_wire_display(wire_display): - try: - wire_display = int(wire_display) - except ValueError: - wire_display = WIRE_DISPLAY["map"].get(wire_display) - - if wire_display not in WIRE_DISPLAY["valid"]: - raise ValueError( - "Invalid wire display value. Valid values are {}".format( - sorted(WIRE_DISPLAY["valid"]) - ) - ) - - return wire_display - - -def parse_param_type_hint(type_hint_id): - type_hint_id = type_hint_id or PARAM_TYPE["default"] - - if type_hint_id in TYPES_MAP: - type_hint_id = TYPES_MAP[type_hint_id] - - if type_hint_id not in PARAM_TYPE["valid"]: - raise ValueError( - 'Invalid param type hint ID ("{}"). Valid values are {}'.format( - type_hint_id, sorted(PARAM_TYPE["valid"]) - ) - ) - - try: - type_hint_id = System.Guid.Parse(type_hint_id) - except SystemError: - raise ValueError("Unable to parse type hint ID: {}".format(type_hint_id)) - - return type_hint_id - - -def replace_templates(code, version, name, ghuser_name): - if version: - code = TEMPLATE_VER.sub(version, code) - - code = TEMPLATE_NAME.sub(name, code) - code = TEMPLATE_GHUSER_NAME.sub(ghuser_name, code) - - return code - - -def create_ghuser_component(source, target, version=None, prefix=None): - from GH_IO.Serialization import GH_LooseChunk - - icon, code, data = validate_source_bundle(source) - - code = replace_templates(code, version, data["name"], os.path.basename(target)) - - instance_guid = data.get("instanceGuid") - if not instance_guid: - instance_guid = System.Guid.NewGuid() - else: - instance_guid = System.Guid.Parse(instance_guid) - - prefix = prefix or "" - - root = GH_LooseChunk("UserObject") - - root.SetGuid("BaseID", GHPYTHON_SCRIPT_GUID) - root.SetString("Name", prefix + data["name"]) - root.SetString("NickName", data["nickname"]) - root.SetString("Description", data.get("description", "")) - root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"])) - root.SetString("Category", data["category"]) - root.SetString("SubCategory", data["subcategory"]) - root.SetGuid("InstanceGuid", instance_guid) - root.SetByteArray("Icon", icon) - - ghpython_data = data["ghpython"] - ghpython_root = GH_LooseChunk("UserObject") - ghpython_root.SetString("Description", data.get("description", "")) - ghpython_root.SetBoolean("HideOutput", ghpython_data.get("hideOutput", True)) - ghpython_root.SetBoolean("HideInput", ghpython_data.get("hideInput", True)) - ghpython_root.SetBoolean( - "IsAdvancedMode", ghpython_data.get("isAdvancedMode", False) - ) - ghpython_root.SetInt32("IconDisplay", ghpython_data.get("iconDisplay", 0)) - ghpython_root.SetString("Name", data["name"]) - ghpython_root.SetString("NickName", data["nickname"]) - ghpython_root.SetBoolean( - "MarshalOutGuids", ghpython_data.get("marshalOutGuids", True) - ) - ghpython_root.SetString("CodeInput", code) - - # ghpython_root.CreateChunk('Attributes') - # for mf in ('Bounds', 'Pivot', 'Selected'): - params = ghpython_root.CreateChunk("ParameterData") - inputParam = ghpython_data.get("inputParameters", []) - outputParam = ghpython_data.get("outputParameters", []) - - params.SetInt32("InputCount", len(inputParam)) - for i, _pi in enumerate(inputParam): - params.SetGuid( - "InputId", i, System.Guid.Parse("84fa917c-1ed8-4db3-8be1-7bdc4a6495a2") - ) - params.SetInt32("OutputCount", len(outputParam)) - for i, _po in enumerate(outputParam): - params.SetGuid( - "OutputId", i, System.Guid.Parse("8ec86459-bf01-4409-baee-174d0d2b13d0") - ) - - for i, pi in enumerate(inputParam): - input_instance_guid = System.Guid.NewGuid() - pi_chunk = params.CreateChunk("InputParam", i) - pi_chunk.SetString("Name", pi["name"]) - pi_chunk.SetString("NickName", pi.get("nickname") or pi["name"]) - pi_chunk.SetString("Description", pi.get("description")) - pi_chunk.SetBoolean("Optional", pi.get("optional", True)) - pi_chunk.SetBoolean("AllowTreeAccess", pi.get("allowTreeAccess", True)) - pi_chunk.SetBoolean("ShowTypeHints", pi.get("showTypeHints", True)) - pi_chunk.SetInt32( - "ScriptParamAccess", - parse_param_access(pi.get("scriptParamAccess", ACCESS["default"])), - ) - pi_chunk.SetInt32("SourceCount", 0) - pi_chunk.SetGuid("InstanceGuid", input_instance_guid) - pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID"))) - pi_chunk.SetInt32( - "WireDisplay", - parse_wire_display(pi.get("wireDisplay", WIRE_DISPLAY["default"])), - ) - pi_chunk.SetBoolean("ReverseData", pi.get("reverse", False)) - pi_chunk.SetBoolean("SimplifyData", pi.get("simplify", False)) - # Mutually exclusive options - if pi.get("flatten", False): - pi_chunk.SetInt32("Mapping", 1) - elif pi.get("graft", False): - pi_chunk.SetInt32("Mapping", 2) - - for i, po in enumerate(outputParam): - output_instance_guid = System.Guid.NewGuid() - po_chunk = params.CreateChunk("OutputParam", i) - po_chunk.SetString("Name", po["name"]) - po_chunk.SetString("NickName", po.get("nickname") or po["name"]) - po_chunk.SetString("Description", po.get("description")) - po_chunk.SetBoolean("Optional", po.get("optional", False)) - po_chunk.SetInt32("SourceCount", 0) - po_chunk.SetGuid("InstanceGuid", output_instance_guid) - po_chunk.SetBoolean("ReverseData", po.get("reverse", False)) - po_chunk.SetBoolean("SimplifyData", po.get("simplify", False)) - # Mutually exclusive options - if po.get("flatten", False): - po_chunk.SetInt32("Mapping", 1) - elif po.get("graft", False): - po_chunk.SetInt32("Mapping", 2) - - # print(ghpython_root.Serialize_Xml()) - - root.SetByteArray("Object", ghpython_root.Serialize_Binary()) - - System.IO.File.WriteAllBytes(target, root.Serialize_Binary()) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="Create GHUser components out of python code." - ) - parser.add_argument( - "source", - type=str, - help="Source directory where code for all components is stored", - ) - parser.add_argument("target", type=str, help="Target directory for ghuser files") - parser.add_argument( - "--ghio", - type=str, - required=False, - help="Folder where the GH_IO.dll assembly is located. Defaults to ./lib", - ) - parser.add_argument( - "--version", type=str, required=False, help="Version to tag components" - ) - parser.add_argument( - "--prefix", - type=str, - required=False, - help="Add this prefix to the name of each generated component", - ) - args = parser.parse_args() - - sourcedir = args.source - if not os.path.isabs(sourcedir): - sourcedir = os.path.abspath(sourcedir) - - targetdir = args.target - if not os.path.isabs(targetdir): - targetdir = os.path.abspath(targetdir) - - if args.ghio is None: - libdir = tempfile.mkdtemp("ghio") - fetch_ghio_lib(libdir) - else: - libdir = os.path.abspath(args.ghio) - gh_io = find_ghio_assembly(libdir) - source_bundles = [ - d - for d in os.listdir(sourcedir) - if os.path.isdir(os.path.join(sourcedir, d)) - and d not in ("__pycache__", ".git") - ] - - print("GHPython componentizer") - print("======================") - - print("[x] Source: {} ({} components)".format(sourcedir, len(source_bundles))) - print("[ ] Target: {}\r".format(targetdir), end="") - if not os.path.exists(targetdir): - os.mkdir(targetdir) - print("[x]") - - # print("[ ] GH_IO assembly: {}\r".format(gh_io or args.ghio), end="") - if not gh_io: - print("[-] Cannot find GH_IO Assembly! Aborting.") - sys.exit(-1) - - gh_io = os.path.abspath(gh_io) - gh_io = gh_io[:-4] - clr.AddReference(gh_io) - - print("[x] GH_IO assembly: {}".format(gh_io)) - - print("Processing component bundles:") - for d in source_bundles: - source = os.path.join(sourcedir, d) - target = os.path.join(targetdir, d + ".ghuser") - print(" [ ] {}\r".format(d), end="") - create_ghuser_component(source, target, args.version, args.prefix) - print(" [x] {} => {}".format(d, target)) \ No newline at end of file diff --git a/assets/cpythondoc.ghx b/assets/cpythondoc.ghx deleted file mode 100644 index d1bb42f..0000000 --- a/assets/cpythondoc.ghx +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - 0 - 2 - 2 - - - - - - - 1 - 0 - 7 - - - - - - 270470a3-090e-4199-8a96-d6d60083f906 - Shaded - 1 - - 100;255;0;0 - - - 100;0;150;0 - - - - - - 638412573507187527 - - false - cpythondoc.ghx - - - - - 0 - - - - - - 201 - 292 - - 1.0837505 - - - - - 0 - - - - - - - 0 - - - - - 0 - - - - - - - - iVBORw0KGgoAAAANSUhEUgAAAOEAAACWCAIAAACn9nhUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAGXSURBVHhe7dJBDQAhEACx9W8TIceHhJyDIWk1dOABH1Tdowt6HKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXOUeocpc5R6hylzlHqHKXudxSazlHomtmpFvoOOsRmzAAAAABJRU5ErkJggg== - - - - - \ No newline at end of file diff --git a/assets/deserialized_exo/TestUserObjectCpy.ghuser b/assets/deserialized_exo/TestUserObjectCpy.ghuser deleted file mode 100644 index 676ace230aa947c5bdefa08860e6fc85228c4340..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4412 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 COVMZm diff --git a/assets/deserialized_exo/Test_KitchenSink.ghuser b/assets/deserialized_exo/Test_KitchenSink.ghuser deleted file mode 100644 index c747b6320654a5b163a8f09b84e492aa82c3946e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3142 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 diff --git a/assets/deserialized_exo/deserialized_TestUserObjectCpy.xml b/assets/deserialized_exo/deserialized_TestUserObjectCpy.xml deleted file mode 100644 index 1eb6a1c..0000000 --- a/assets/deserialized_exo/deserialized_TestUserObjectCpy.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - c9b2d725-6f87-4b07-af90-bd9aefef68eb - Componentizer - Scripting component test for deserialization - 2 - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAJmSURBVEhL3ZW/ixNBFMe/m2Szu9Gzsctp4h+hiL0oaGEhihx4KhzcH2CloGBnpaCdjYKdxjIgcj/wONFT2/RiTOPFzU04TEQz63u7M7mZya6VjT54kMx+9/OdffPeLv6rGFIKlUWhrxdp0mtexpoJMXyGBNUwweKt3kxeu9NFqSTFc0wKNX4gd/g6sJsh7RDwqwnKFYm3chtrky7W5ec0N+Qn3HgSI4gSRPtlrmaTNH5AG4wSz8NYMZ3gXbR3tnHsdHcK0HBO/s1rrobhV27HePgmRqs3nK/ivCI6wQYmYEt+teB6t6bmI2k0fJ00rd5u3cclRXSCDTTg5fc+DtY7uP7Ihpsmr0Z9VIIO7q1kcF4ng0M+FhTRCW2QluVxjJtPBzhxdq8UpoEuy932AMfP7GnYIMCSIjrBBm7N3Xqb8LQsE1tDBvMhFhXRCW5Ft+YMNQEWPEfTFrLoCQT3edqKbs01gNuzSq0Y7kumcFPDLVwqS2KNMqQdIh2iaE5OS2Em77ziS8HDWCvQ0Lp4gR/EyjdIB6VMO1j9ZR+qLktY+wuDxvCjp7pTE7fmvOYevKmhQasHuKqITuhB0yabsj9zoJymSc6gFXeROWiv6cay38GDjYEFN00KBo0MLiuiE9pAP/L9tdgql2mgNTmD9mcDt+bumZjwVJMzaAGWFdEK7iKZdoJZc4ZqE+4gbtE8jZ6TaK6wi9Qc0BB9oJveyy9WvpPfGJDOQZ5mi7J2IBEt/CRWwRx43pg+d+MjEZYbES4cDnGxGWKB/p9rZm9IvnHEmkYNS40AJ5vUkqzh5HWlyf2i/YsB/AY4TfDJsUowIAAAAABJRU5ErkJggg== - - befa656d-a0b2-4a86-ac96-df3b07485a12 - TestUserObjectCpy - CTS - - 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 - - ALL - - \ No newline at end of file diff --git a/assets/deserialized_exo/deserialized_Test_KitchenSinkghuser_ipy.xml b/assets/deserialized_exo/deserialized_Test_KitchenSinkghuser_ipy.xml deleted file mode 100644 index f4d6f30..0000000 --- a/assets/deserialized_exo/deserialized_Test_KitchenSinkghuser_ipy.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - c9b2d725-6f87-4b07-af90-bd9aefef68eb - Componentizer - This is an example with the everything and the kitchen sink in it, just to show all available options. - 4 - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAC4jAAAuIwF4pT92AAAGtmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDYwLCAyMDIwLzA1LzEyLTE2OjA0OjE3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDEtMjBUMTI6NTM6MzIrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTAxLTA4VDE0OjQ3KzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIxLTAxLTA4VDE0OjQ3KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc5NWY1YjQ4LTM1ZTktMTI0My05NGNiLTFjNmRkYWViYzQ4YyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjUwYmMyZmNiLTkwM2YtMzY0ZC04MWQxLWJiMWE5NzFmOGU5NiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjEzNmZlZjU3LTNhY2QtNDM0Ny1hY2FkLWUzYmFlZWViMGE4ZiI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MTM2ZmVmNTctM2FjZC00MzQ3LWFjYWQtZTNiYWVlZWIwYThmIiBzdEV2dDp3aGVuPSIyMDIwLTAxLTIwVDEyOjUzOjMyKzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTVhZGJhYzItMjYyNS1hZTQ4LWI0NmQtZjhmYWUxNTZmYjY5IiBzdEV2dDp3aGVuPSIyMDIxLTAxLTA4VDE0OjQ3KzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc5NWY1YjQ4LTM1ZTktMTI0My05NGNiLTFjNmRkYWViYzQ4YyIgc3RFdnQ6d2hlbj0iMjAyMS0wMS0wOFQxNDo0NyswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjIgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgWtIBMAAAO3SURBVEjHtVZpT5NZFDZRY2QSAddR1PhBx4xxjWtcEsdx++AfYDIzhriOEuNMolETo9EoZZ/ACBU3VDLfjKMF1EkG6MLSFhB1pLTE0qKAIIotBbrRx+e+SuUtraIJJznNfe899zz3nvOcczsKwKiRVOlnZoYuon6bph0Xq1Bvjlaoj01O0VwTKsYxCvXWaWnaqEj7hgVA51HRSer4KamaO8svGqzbCh66hS7PM1inpmpV0Ullv9Jm/FcB8JS/LMypakwtt6O61QmPvx8D4vUHUNvmRGZlMxbl6ht5m93DBojL0I3mhqwDRQ1od3mCTnu8fhy+b4GYd3n8wfnOXi9+5zz3KOOGAzAxWZ11VtOEUHna4ULUuTKMP1eKJ+2uIespvClzpfwkQGyyJn6fqgHhRP/CgblZFfguuxKGFkdYG7E3NlmdEAkgaka6zjb/r0qc19rg8vplm7fdfIiCxy9RZOnEVo4DgY9rbuYnrcKOedkVmJ6ubaWvaBmAYAJjGC8SevNRG/iNBReqoDK/gvBz29SBjfk1QYcbrtbgel2rNBaAS5UGkLLI55zwQV+JMgDGbhOpeLeurTuYuD8eWLAizwiHx4dldCBCNCA1ZNUSpR6ve31YkqtHYrGZhPBKa01dfZiVqSuWAZDrx8ntJo8/IAtLn6+fybNh110TLJ09eO5wo63bA9vbPh6gESf+e4ZujzyU/XSx9kq1WQYgqnN7QZ07NGktTjfmMbEvSde9KhPm/FkuJXoPAV/1eDGfCReAocJitMsAJqVo8gkwxHLn7XqcLHkmjUXSd/z9CD9erw3WgUjsT7f+HwKwPRSAITqxIs9g8w4KUWnTG6y/Wg3/ILqkVzRDQYYNllWXjChkogckEC5ETPIW9pbix+3vk5xEJwwbTpVaIeZE8oWKAhM68C3WTpdZMemDrRA78zM7s/xeKE2/mZBUtjNL/1wyWkxmjDlTQhYZ8EN+bVAZW3F92dxK3mDs2RKwb0l7c40vQF+HhxSaqIVFOVV2h9sHY4sTCp0Nb/p8snA0kEn1HfI24aS9aBMae5fEutWXjR2siZiwrYIFkiAaVyTZdceEn289jbh+9N9GsAv/9slmR5CL4kThZH9hAxL+qQ+7lsPQ0HnBcNq1YJXy0D0znCFFFA5A0PfI+5PfiPvCB2fP6kvG5gw+KpbXvazQAN8CsxQmMbZ29SKbpFhz2dhC24Nf9WROS9VOICMS2VtU665Um9gAbd9fqLSJMalYKNhCm5jPPpkj/q9iJPUdVMp7CLMr2e0AAAAASUVORK5CYII= - - cdd47086-f902-4b77-825b-6b79c3aaecc1 - Kitchen sink component example - Everything - - vVVRaBxFGN5NSprbSyxiQUQtPxFMSo+g4IsHgkcumrPuXcmd2MSnye5cdpK5mWVn9nJ7sS/imxC10AdRDArFBykIPgiC9aEoPvooIkjfRcGXgi3Umd3bvb27SI1WhxvY++bfmf/7vv+ftV4ROGhs7WBH3lWjYBiGqWZhhbu4xvwwRi2F/Di9sLBgVTkI3sHSI2wbBKE0WraslkcEOLzjc4aZBJdjAYwnMaHA7ZCWgMhFAZzRCBDsEul4mKn32S7gHur4FIPw+J5+ocOFBNRFhKItBXNfEs6EOgXUqATbohw/6dErw0XoIhriDIrKsDEG9cuwmYPWsQwDltslwCKksgwtTyURdoC3AVEK0gswTt5Tp2vu7YB3YNvzI+kpImRrOaO8hQQGov4EUvHBTigVk6EgKKeOZVkORULA+USEptJgJV1cysLOJvm5uA3rIWs6AfHlksC0XYJeCaIS9M8OGWh82cZCoG0Mz8HiSsO+0Kiv1lvQ3d/v4kAoBS9dWswx1hJAD85BpGbfKlaxiI9Qganf7dhV9UMs82iPSE8JgwGrXaPEYMTcGBoxlTBleAl2QuWl5LG3saiTvhbWSK7QdOmZloYaocxjxZrDWZUIn6JIg9MKnFLzgZqouF3EHOzaqmKz+FM2CoSHqNrmxZC4Ils4UUcdnHI8cz6f9NCwAd/ZOnF28/HWasZ7/gIK1IrEQRVJpANmVMAJHRSzWeEhk2mmep6M4Zpr6O5S8/V3/3jzhzOf22/d3P/pJffKx+m6eY/1qb9YLyaKjZyr95pN8OHBG+53B+bXheqXvz5sz5976Psk35iODpk3knGqQinfa6kmqDiOqq2hFUcUy+O6eQa9qBtIF0Qm5/JcjQmpPdJWpLfM4vPGlfefOKxca33SPLw8Uxsxxrw4ob3Zm23EZyI6TGVdF6LAqQUx+GDSLTGhYerTA1rzTVWLrcjHa4TJIam5pmpfStpRfiuj2ORh4OARTfWw0g1q1ZTOk9/eftbsf/rCRwe/PDZX8V4rvkoCPFawZlYdcXLmv1J741hqV05/8dWdJfvl99DsZ+/Ur98ZVXtjUu3o76lt3D+1zfustjGqdnxb/GO1N4+l9je1m298eGN17frVp8hB/dEPTtrI99WlkS+EUQc2Jx3o/+8O/Bf1PriWsuulMNjyKKUfWY8/xXmRQ4l0xJEq3zq89cxvP+/Yb994+nL12tXfx1WeGld5JvnUT0id4uN6G0fqfTzp/gQ= - - ALL - - \ No newline at end of file diff --git a/assets/deserializer.py b/assets/deserializer.py deleted file mode 100644 index 3a4c36a..0000000 --- a/assets/deserializer.py +++ /dev/null @@ -1,55 +0,0 @@ -import argparse -import base64 -import json -import os -import re -import sys -import tempfile -import urllib.request, urllib.parse, urllib.error -import zipfile -from io import StringIO - -import clr -import System -import System.IO - - - - -def main(): - from GH_IO.Serialization import GH_LooseChunk - - # ghuser_path : str = r"F:\compas-actions.ghpython_components\assets\TestUserObjectCpy.ghuser" # cpy - ghuser_path : str = r"F:\compas-actions.ghpython_components\build\Test_KitchenSink.ghuser" # ipy - - deserialized_data = GH_LooseChunk("UserObject") - - data_bytes = System.IO.File.ReadAllBytes(ghuser_path) - - # get if the data_bytes is empty - if data_bytes: - deserialized_data.Deserialize_Binary(data_bytes) - else: - deserialized_data = None - print("No data found in file") - - deserialized_data.Deserialize_Binary(data_bytes) - - # convert to xml - xml = deserialized_data.Serialize_Xml() - - - print(xml) - - - - -if "__main__" == __name__: - - gh_io : str = r"C:\Users\andre\.nuget\packages\grasshopper\8.0.23164.14305-wip\lib\net48\GH_IO.dll" - gh_io = os.path.abspath(gh_io) - gh_io = gh_io[:-4] - clr.AddReference(gh_io) - - - main() \ No newline at end of file diff --git a/assets/print_hints.py b/assets/print_hints.py deleted file mode 100644 index cec893f..0000000 --- a/assets/print_hints.py +++ /dev/null @@ -1,37 +0,0 @@ -import argparse -import base64 -import json -import os -import re -import sys -import tempfile -import urllib.request, urllib.parse, urllib.error -import zipfile -from io import StringIO - -import clr -import System -import System.IO - - - - -def main(): - from GH_IO.Serialization import GH_LooseChunk - - # get all the types and corresponding guids - # rewrite this: 08908df5-fa14-4982-9ab2-1aa0927566aa in majuscule - # i ncomment the line below - print(GH_LooseChunk.GetKnownTypes()) - - - -if "__main__" == __name__: - - gh_io : str = r"C:\Users\andre\.nuget\packages\grasshopper\8.0.23164.14305-wip\lib\net48\GH_IO.dll" - gh_io = os.path.abspath(gh_io) - gh_io = gh_io[:-4] - clr.AddReference(gh_io) - - - main() \ No newline at end of file diff --git a/assets/testTypeHint.ghx b/assets/testTypeHint.ghx deleted file mode 100644 index c774767..0000000 --- a/assets/testTypeHint.ghx +++ /dev/null @@ -1,1555 +0,0 @@ - - - - - - - - 0 - 2 - 2 - - - - - - - 1 - 0 - 7 - - - - - - f8be2b46-c707-45df-94e6-6ce5d1c1ffdf - Shaded - 1 - - 100;255;0;0 - - - 100;0;150;0 - - - - - - 638413868051787861 - - false - testTypeHint.ghx - - - - - 0 - - - - - - 341 - 292 - - 0.92118764 - - - - - 0 - - - - - - - 0 - - - - - 1 - - - - - RhinoCodePluginGH, Version=8.2.23346.13001, Culture=neutral, PublicKeyToken=552281e97c755530 - 8.2.23346.13001 - - 066d0a87-236f-4eae-a0f4-9e42f5327962 - RhinoCodePluginGH - - - - - - - - 4 - - - - - c9b2d725-6f87-4b07-af90-bd9aefef68eb - 066d0a87-236f-4eae-a0f4-9e42f5327962 - Script - - - - - - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAWJQAAFiUBSVIk8AAABB1JREFUSEvdlFtMm2UcxvHCZMbEKNEw42RuTHRjQ/q1/doOGAKTDJdtxOit0QuXqBwLg3EaK2C8WIzRm4UeKIdyPksLCBRa65A53IERV3WuMHenceAhxGj+j//3+z4gXNaYmPgk/7RN3vf3Pnne523Mfyrp3eZDugKHU5fvCOsKnD+nFLr+0hW6f5SsnrDe2mGXS3v2aEujl5RvT2fw/ZR8ZxODV6XiFkjFrWAw9KVdMJT3wVDW84dUNfCktiU6pRQ4GoR78V0qbHHprR6Ge2A406vCeYyVwzCcHa5TNkQrXYHLzs7XdUWtXsnaub7h2lgxAOPZIZ5ByFWjkGu8Hm1LdJIKWsqk4vaAVNrJ0xXQl/UGGB4wlA/8KZzL1QyvHecDxqM7QG9tetxgbX7aYO3aPtVD6lQO/yTX+GBiuKluEiab30MreQk8Tlo+UU5LObEaarv4Ql/hhlyWStqgL+vi6ea8e2Co6FcjqRxht2MKWK7lT4abbTMw1c966F6eBXdOAN/mAktHV7GY9piGVSUcS4XNv0kl7WpDBFi5SAEXWX+iwSdU5+enGT6rHGBuCLro++PpCB8DbmYDVzNA84erNLQqrp9TdbzREAaLyxSuRdabkUypzusDsDQEYWkMwdQYyqVwztu4kQUsHAG+sICChjkNrUpf2nl907XSkkEYheuNOIRzhpvP+xk+q4DNjaF1S0PIcXfu1Vi6lnkHX6YBc2YgYABNJt8HYh7Q8BzRmd7fVTBnXSWy9sFYO7Zsqvv09OsfeTLdI42vub1i3leHfy9deiOLbh79AFePrOJyKhCSgRkJmEwGvAcA9+4dGp4PqOj/QXGsxWGs9q1nvTcSx824wPML7uZBmZVTwO3jUPJe5Ly/UiPBZ0bArwMmDgGjz4MG9n2noVXxa5yWq71q1qJ65yZdWMlL2wSLWT7JLXkZ+DoHuJ4JXElXIwkyfOoFYPwgMPIc0J8AdMW3aGhVphpf0cYlmrkhJtt0Ljv/eBMe4Qp+o1QQuPYilLwvMXxWr0YylgQMJwJ9e4HOeFBb3EENrcpc0vOQfG7innKAzQ+LbSabVk7ZFfhGJFxBWsggmk8lCspEfoloIplo9ADRYCJR9zNE7btukSvuTQ27XXLd2CMm28w75vpgW2p9KIkifICAi0i4gnQl/Vdt6b8jCh+zY+klNRKRN0dCAX2EppIj5EuK0EhihPoSItQR/6G2JTrRYrZdvEqlgp+btvIe3Q8aSlyjnr0O6ti1Ri07/9m/Kef9FuYPcwW5337u97io4H5g8FlQ9267ssa900FNsUXKhmiF2Ywd/ORvYTplq4ID+0QFQa1PrZEzzkEXY2/QhbiHtS3RCwv6B/lVnqbhRB/17bnNkaxzJGGyP+Gli4/mwx2z9Vr/p4qJ+RvVAxIyWGyAUAAAAABJRU5ErkJggg== - - e98563e8-3930-435f-b288-b340ed9a8197 - true - Script - S - - false - false - true - - - - - - 55 - 43 - 184 - 604 - - - 159 - 345 - - - - - - 30 - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 2 - 3ede854e-c753-40eb-84cb-b48008f14fd4 - 08908df5-fa14-4982-9ab2-1aa0927566aa - - - - - true - No conversion - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== - - 58f70747-b4db-4eea-9609-7c7f35c7d972 - - nohintIN - true - 0 - true - 0 - 6a184b65-baa3-42d1-a548-3915b401de53 - - - - - - 57 - 45 - 87 - 20 - - - 102 - 55 - - - - - - - - true - Contains a collection of floating point numbers - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVbKLVpFN7ITnI+s5HDdj6fz5QoUeSQiUgOF27dqb+GXIyo/0a4kUMhKfqLnENEOYWEFLlkxAwKGzN65n1ee+9+Y/7/N1fTrFrtr/1977PWetaz1qv4r0xtYGDwKH7xL/wn4R8zExOT7a6uLqyurmJ5eRnz8/OYmprC6Ogo+vr60NLSgpqaGuTk5CApKQk+Pj4QCZ2Lo8pXhO+YkZFRnjj4R29vL+Li4qTHxsYiOjoakZGRCAsLQ3BwMPz9/SWwp6cnAgMDYW5ufmdoaPhJC/NNU1paWv42NDSEwsJCmR09MTFRBmKQiIgIhISESFBfX194e3tL9/LygghwLzBUr1D/YMbGxr9UVlb+2djYiJSUFKSlpUnnM4OwkqioKFlFUFAQ/Pz8kJ6ejoaGBlmJSO5JUPVFC/fO1E5OTo9tbW3Izs5Ge3s7BgcHMTIyguHhYfkfq2CA8PBw5Obmor+/H6enp1hbW4ObmxtcXV3ZC1YR9Qr5lQnulwsKClBaWoqBgQFsbm4iIyMDWVlZuLy8xP7+PpKTk2WAmJgYVFdXo6enB+fn59jb25Pgzs7OsLa2fhFBtrWwesuxs7PTFBcXQ1AkM1pcXNRTdHBwAI1Gg9bW1jcUVVVV4erqCkdHRzKAYADu7u4QKrwTmKWv0KKxIvtf4+PjQW9ubsb29rYMoGsyAzw9PWFjY+NNkxng+voaJycnUKlUcHR0lEE8PDxI1e8C20whOv+zra2thuDMjLzu7u5iZmZGL1PS8/z8jIuLizcyJU03NzcygIuLCxwcHGBjYyNVJZ4fRIDPChHpJiAgQB6is6k7OzuYnp6WdNB1AR4fH+U3/J4SJZ26AOTf3t6ePZCBQkNDOd03DPBZyOueZfNgd3e3bPDExIRUC51NJDgr4DeUp1qtRkVFhaTo+PhY0iOYgJWVlfxGqIoVtApXmJEv6phl19fXY2VlBWNjY/qqWNHDwwOWlpZk5gTn92VlZVJhh4eHMnvSw0o4L6Kvrz3QWqlSqbzjYeqd4OPj4zIgfWtrC7e3t3KgyC/BqZaSkhKcnZ3JBHTZs2eCIs6CXkXSqF3x4oXZNTU1yeVGcMqRHDMIn7n8FhYWpGrYA75bX1+X4DwrZuRFwL2bA1osdwklxkrq6urQ0dEhe9LZ2SnlyWmdnZ3F5OQkamtr5XalpOfm5lBeXo78/HxYWFiQ+/eTTBNVfBE8PpEGDs7XzowpRXLMhpJzHS0CVG5aoZxnAfPNXURTsQpWwGw5NDonKOWnA2ZDhfq4puV73g2ij9/fplr7JLR8T77F+tC7DpQ612VtZmYGU1NTuVFF1QT/4X1AUwqqLrgKEhISkJqaKgEyMzPl4mOmeXl54GIsKioC9xeXojjzsRtNa7xf/37n/sg/fif/j0yh+AuVqtAmN2lbmQAAAABJRU5ErkJggg== - - f50101bf-590f-4d1b-9ad0-aa939bf64d7c - - floatIN - true - 0 - true - 0 - 9d51e32e-c038-4352-9554-f4137ca91b9a - - - - - - 57 - 65 - 87 - 20 - - - 102 - 75 - - - - - - - - true - rhinoscriptsyntax geometry - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== - - f9878e13-3729-4963-adf4-425c01da1947 - - ghdocIN - true - 0 - true - 0 - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 57 - 85 - 87 - 20 - - - 102 - 95 - - - - - - - - true - Contains a collection of boolean values - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC - - 34d04512-af02-4f48-8ead-6cb031558fd1 - - boolIN - true - 0 - true - 0 - d60527f5-b5af-4ef6-8970-5f96fe412559 - - - - - - 57 - 105 - 87 - 20 - - - 102 - 115 - - - - - - - - true - Contains a collection of integer numbers - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOdSURBVEhL1VU5SGNRFI2KQSTuu3E37rvRuOGCCwhRAioOphPsbKxEUIIgDFiksbXQRsRCgjbaaBGwESdgZWWlMDPIDCl0Js5MOHPPS/7H0bhMNcyFS15+fs4995z73jP8q7BERUV9k0/8Rb6TfFvExcV9WF9fx8nJCbxeL46OjnBwcIDd3V1sbm5idXUVMzMzsNvt6OrqQllZGYTQR/mrMYTwQsTExDjkjz83NjbQ1tam0mazoaWlBc3NzWhoaEBtbS0qKysVcHFxMaqrq2EymW6jo6MXwzDPhjEpKenL9vY2xsfHFTtmZ2enKsQiTU1NqKurU6Dl5eUoLS1VWVJSAilwJxjmEFSEiI2NfT89Pf1reXkZ3d3d2Nrawktxfn6uwIuKilQnQu5epPKE4Z6EJTs7O7C2toaBgQH09vbi4uIiDBU5VlZWYLFYVIH8/Hzk5eXRC3ZhDUE+CNHeOzY2hqmpKSXL6OgogsEgfD4f9vf3sbe3B4/Ho4y+vr5Wv1E2rQDBc3JykJKSEpQivjCsHvb09PTvk5OT6k/UfH5+HktLS6oTysVnNLu1tRU3Nzc4Pj5GRUWFLhELiAIoKCiATOGtYDpD0GKssP/U3t4OJo3UikQyeXZ2VskzNzenm1xYWAiz2YysrCxVhAWli6+CbTKI8660tLTvBOcIchQJRLYEZT4c08PDQ/j9fjQ2NupjSv1zc3ORmZmJ1NRUVVTW3Khug1TyV1VVqdlmsghH0Wq1/pF8xm4CgQB2dnZ09g/1z8jIoAeqUH19PXe3nwXcMl53nG2tENcsRJZMrvnM5XIpeZxOpzL3IXvKI0ogOTlZ4cjzUAfUiXrxZe5OJjdRTU2N3hXXfHZ6eoqrqysdnIZSe+pO9pSHnVBS8TXkQTicRqPxlm1TV35yQrSCXPf19Sn23CcauCYNJdHY0zP5zr2gT5EKzi5f5JantkwyZXLtdrtVAY4tZSHzx+B8V8Y4KHBP9gHDxrOEpkXKy8tLnJ2dKdbUnLJo4DSW8gwNDSExMZHaP93JDOnCIy/ekzGBtBwZGVHsFxYWFGsaSs015gKqRlgm54fAPHsWMczsgh5QBrLUkqBkrAGTsUwfEhIS1O+8G8THl0/TcCxKy3ecHDk+9NRAKYfGWu4AxMfHo7+/nz4R/NX7gGEUqT5zLDs6OtDT06MAqO/w8LBi6nA4wINxYmICPL8GBwfffqOFg/fr4zv3tXz7nfwfhcHwG4jlh0fOcQdLAAAAAElFTkSuQmCC - - c9441893-a6a4-4129-8bcf-916e2d02a6c0 - - intIN - true - 0 - true - 0 - 48d01794-d3d8-4aef-990e-127168822244 - - - - - - 57 - 125 - 87 - 20 - - - 102 - 135 - - - - - - - - true - Contains a collection of complex numbers - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAARUSURBVEhL1VVXSGZnELVgRRFBUFx774i9d+y9V+xdUBELliiCYosgPogF1AcRVFTcBxVRwQcLykYM+OTzriy6SSSrf9TN5Dvz/xGX3Yh5Chm43J/73+/MzDln5sr9V2EhLy9/K+70L64Mcb0uVFVV3+Xm5tLx8TEdHBzQ3t4ebW1t0erqKs3MzNDg4CBVVVVRSkoKBQYGkqmpKYmC3oujylKEF0JRUTFBS0vrYWpqiry8vMjX15f8/PwoICCAgoODKTQ0lJ/b29uTjY0N2dnZkYuLC6mpqX1WUFBok8H8YyirqKh86unpocbGRiosLKScnBxKT0+n6OhoTuTq6kqenp7k7+/Pv62srDiRra0tugCtb6RQ3wklJaVeCwuLL11dXQyAiiMiIhg8MTGRsrKyKC0tjYKCgsjJyYkrRzJra2sS50hbW/teJFmRwX0TFoJ7yfj4OLW1tVFLSws1NzdTbW0tlZaWUnJyMifFFRcXxwnd3d25enSCDgwMDNDFZ4HlKoV8FoL7PfANWnCHeOHh4QyGqvEcybKzs/l/6ID/kNDc3JwcHR25E6HfF5HknQxWGgI8Vl1dXdLe3s6V9/f3s1N6e3upo6ODqqurKSkpiTWIj4+n8vJyvjs4OLDooNLY2Ji7gOgC73cBmy1FF8IK7j9mZmZSXl4ehYWFkbe3N/n4+PBh8J+fn08NDQ2cDNZ0c3PjrmAAAOJddKKvr89JZbb9JLA15IS1ftDU1LyLiYnhyrq7u2lsbIwmJiZoZGSE4Ch4HmKHhIRwN/X19Sxua2srra+v09HRERcF0XV1dfk/wQgcNYAEv6HCgYEB5jkyMpI8PDxYOOgQGxtLlZWVNDw8TH19fZz05OSE7u/v6e/Y2NggQ0ND7sLIyIjMzMzI2dkZ0/2rnGjlR6G+BKBIAP7n5+dpaWmJZmdnWYuysjJOury8LIP8Ojo7O3kQTUxMmC7QJCx7xx2AJyHKL2gXHEM8tIpJhVvAOQCmp6cpNTWVkz8PdIJhgyaoHlSBoicNZJGNUY+KiuKK19bWaGdnh3fP0NAQQR8M19zcHF1fX8ugpXF6evo04XAT3tPQ0AD/Ty7iEEP2c0VFBRUUFPDL8DZoKS4upoWFBRodHaWrqysGPTw85GcITD1MoKOjQ0VFRWRpafmnqP4nGexX4SGouq2rq6Pt7W06Ozuj3d1ddkpGRgbd3d0x4ObmJmHaYUV0CVPArlgdJSUlJCwP7r+dZITo4q2Yg0fMAsYegq2srNDDwwODX1xcMA1YhAkJCTx8uINzGEGcuReuXJXBfTfeiBduJycn6fLykvb390kikTA4vgmoFILDjjAE3FJTU8NrArMhqHl5m8qiTXha0tTURI+PjwwOSuB17BoIjbWAedDT0+PVgiEUmv2Bs1KIl0NZdPFxcXGRwW9ubhjg/Pyc3YQvHDYpEsKaEBtbVZz7gLOM8IrA9/X59/Y11+u/yf+jkJP7C1KGDFdrAynWAAAAAElFTkSuQmCC - - 20191268-d2a6-48bd-9e65-c88245cb497e - - complexIN - true - 0 - true - 0 - 309690df-6229-4774-91bb-b1c9c0bfa54d - - - - - - 57 - 145 - 87 - 20 - - - 102 - 155 - - - - - - - - true - Contains a collection of text fragments - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAO8SURBVEhL1VVLLJxhFB3ERMT7zXgb71e8X/GId2IhQZTuJGwktjaNxqpYNAQbsWBHiDRsbNgIC4lWYiUs7LSVtLqY6UNNTu+58/9Caaurpie5md/85px7z733+yz/CnYPD4/P8om/iCcSj4OPj8/r+fl57O3tYWdnB9vb29jc3MTa2hoWFxcxMTGB/v5+tLW1oaqqCqmpqZCE3spPrW6G38DLy6tdfvh9YWEBZWVlGqWlpSguLkZhYSHy8/ORk5ODjIwMJU5KSkJWVhb8/Pwcnp6ezwyaX8IaGBj4YWlpCZ2dnZodo7KyEu3t7TBxcnKipGlpaUhJSdFITk6GCDiFw+amegDe3t4v+vr6rkdHR1FdXY3a2loNPs/NzcHlchkSQHNzM9LT05U8MTFRK5HkvolVrwy6e7BHRUV9nZ6eRkNDgxLX19dr8Pns7AwrKysGPTA5Oak22e12FYiLi0NsbCx7wSqK3JS3IN7vdHR0oLe3V225LTAwMIDj4+M7Nh0dHd0RIHl0dDSCg4NdIvLGoL1BW1hY2Jfu7m5tKj2/bdHy8jKmpqa02aenp4YEUFdXd2MRBcQBxMfHQ6bQIZxP3dTSWMn+XXl5ORicFlOElVDo4uICLS0t+m52dtagB8bGxlQgISEBNpsNkZGRKkJBqeKjcPtZpPPPQ0NDv5CcI8hRJBGzpdDQ0JDugjmmXV1dBj1wcHCgzaX/MTExiIiIQEhIiIrKMxf1pUWUPmVmZupsMyhSUFCAoqIijY2NDQwPD+t35g6cn58bEtBKTf/Dw8PZAxXKy8vjdn+iwEsZL2dubi5MIT6TjBU4HA6D6mGMjIxo9rRHnEBQUJDySFXuCugT/WKpnAoGlyg7O1szX11d1Wd+x3dcrp6eHoMe2N/fV9+ZPe1hJbRX+urugYGnVqvVwR9z/fnJJTo8PMTg4KA+m+/oL0fz8vJSBa6vr7VaM3tWLRZxF26mSMHZpXdceZKMj48rAQX4N4NVmku1u7ur74mZmRklp3BJSYlL6O7tAVHKs4QEXCITTqdTjwmOIonZo/X1dVxdXRn/4cbW1haampoQEBBA7+9vMiFVvBIfvzFbTsbt4JyzmfSYDaXnpi1CqiMsk3MlNL88iwgbq6DfzJbNM4OktNAkZkNl+uDv76/veTdIH39/mhp4JrPs5OTI8XETJinn3Mxa7gD4+vrqeSVVk/yP9wFhFavecywrKipQU1OjBPS3tbVVM+Whx4ORW83zq7Gx8fE3mgHerz/fuX+Kx9/J/xEslh9QdsIn89F0TQAAAABJRU5ErkJggg== - - 54638b6b-4503-4b8e-9f7c-405ac455fddf - - strIN - true - 0 - true - 0 - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 - - - - - - 57 - 165 - 87 - 20 - - - 102 - 175 - - - - - - - - true - Contains a collection of date time format strings - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAP7SURBVEhL1VVZKOVxFL7ITbr2PUv27GK4tpCtlAeFTOZNefEuybVvMbaskcKDeNIoyQtlSd5GQjx5xKSZLu6dO2OGM+c7d2lmjGWepvnqdOX//33nd77znfNX/CsEWVlZfeFf+ot4zfEy2NnZvZ+amqKdnR3a2tqi9fV1Wl1dpcXFRZqdnaWenh6qqqqioqIiysjIoLCwMOILnfNRpZHhCdjY2BTzwW8zMzOUkpIioVarKSkpiRITEyk+Pp5iYmIoIiJCiIOCgigqKoocHBx01tbWGhPNo1A6OTl9XFhYoNLSUrkdIj09XRIhSUJCAsXGxgppeHg4hYSESAQHBxMn0DOHr5HqD7C1te2qrKz83tLSQpmZmZSdnU35+fk0OjpKR0dHZMbJyQlNTk5SWlqakAcGBkolfLmvLNU7E90DhHp7e38ZHh6mvLw8IS8rK6PT01MT7UPo9XqqqamRBP7+/uTn54deoAq1kfInsPZbJSUlVFFRIbLk5OTQ5eWlEGm1WlpaWqLe3l7q7u6m+fl5Oj4+lmdAQ0ODkPv4+JCLi8sdJ3lvorWgyN3d3VBeXi5aQ/OOjg45fH9/TzqdjiYmJqirq4s6Ozupra2NIOPKyoq8c3t7KxWzAhQQEEDsQh1zvjFSc2P59hepqamEQCORZHd3Vw5vbm7Szc0NXV9f09jYGLW3t1Nrays1NzdTY2Oj2BhAVV5eXpIEknEVn5hbpeDON7m5uRlADgvCikhydXUlB0E6Pj4uCZBobW1N5DEYDPL/gYEBee/8/Jw8PT3J1dVVGs9/f+YE/QrOpI2MjBRvI5AEVjQDmkOWkZERkQK4uLigjY0NSyUAnnl4eKAHkiguLg7TrUWCfraXHt42J8LfaCwwNDQkmoNscHBQLAtp0Nj6+nrq6+uT987OzoiVIGdnZ+FhV6GCtxwKFfSCjzGdCAzR9va2HFxeXpaG4qZNTU2/kNfV1UklwNzcnMgDJ2Hyua/GHpjwRqlU6jCZGH/81tbWykH0AjKZiTUajYUc1gUgD4yB2+OXJcIsWFwkgHf5wR1GHk1Ckv39fSHAPMAlqAJJpqen6fDwUJ4BGDaQh4aGUnJy8h3TPZgDQI1dAouZg1+WtfAYMB/V1dXSWMhTUFBAjo6O0P6VkfI3cBXv+MWvqACTiUBv0OC9vT0TLdHBwYHYE1Xi5kwq9mbn3DLNo7sI8EUVOIjdgqExB4YI9oMV4RbcmN2HNS3P8W3gPj69TU3QcMn66Oho4vVhCTMp5DDfWqVSkb29PeXm5qJvIH/2ewAoWaoPsCrWcVZWlhBA38LCQrlpcXExYTFi22J/YaXzmTOcNVI8D3xff//mPhcv/yb/R1AofgDDYCWfApckvgAAAABJRU5ErkJggg== - - a92dc761-ffa4-4aba-a5f3-3bdc91cd9691 - - datetimeIN - true - 0 - true - 0 - 09bcf900-fe83-4efa-8d32-33d89f7a3e66 - - - - - - 57 - 185 - 87 - 20 - - - 102 - 195 - - - - - - - - true - Contains a collection of Globally Unique Identifiers - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAANySURBVEhL1VXJSmNREI2KQSRxinGKUzTOExqNEyo4gJBFcMDWZCGCfyE0WTUYEMGtC925EjeCuHATcBvMNwR7ALtxoa2mI9V1Kq80xnboVdMHitx338upW6fOvdf0r+DMyMi45V/6i/jA8T7k5OREtre36fT0lMLhMJ2cnNDR0RHt7+/T7u4ura+v0+rqKnm9XhoeHqaGhgbiBX3hv5qTDK8gKyvLx3/8tbOzQ/39/RIej4d6e3upp6eHurq6qL29nZqbm4XY6XRSa2srWSyWq8zMzDWD5kWY8/Pzv+/t7dHc3JysDjE0NCSJkKS7u5s6OjqEtLGxkerr6yXq6uqIE1wzhyNJ9QdkZ2d/WllZSQSDQRoZGaGxsTEJjJEElbjdbqmira2NmpqahLy2tlYq4cXdsVQHBt0zOMvKym63trZoYmKC0oFK0pFIJOj4+FiSV1VVUWVlJXqBKtxJyhSw9uHZ2VlaWloSssXFRYOGyO/3y9zMzIwx8xTn5+fSl/LyciosLLznJBGD9gHe4uLim4WFBdEaK4IsilSJFJBocHCQzs7O5Hlzc5NYAaquriZ24RVz+pPU3Fhe/deBgQFCoJGaRIGxNlmhTV5eXpbnaDRKpaWlkgQ94Sp+MLfFxJ3/aLPZbkCO5sGKIEpdbapNFWpT/e7i4oJKSkqoqKhIGs/jn5xgw8SZLltaWkRDBJLAinCLAmPM4Z1CLYokQDweJ7vdjh5Ios7OTuzuSyTYYHtdw9uaCONUMowxh3cKl8sl1tSqUAErQQUFBcLDrkIFIQ6TBXrhY5SNgL5oogJjzOGdAt+joYFAQJ7RbMgDJ0E27muyBwb8ZrP5CmWjZPxiEykw1ncKkKOySCQiz6FQSFYPM7BE2AsPLhLAu9AOWx7aYgcrxsfHZW50dNSYeYpYLCYVQba+vr57pnu2DwAPzhJYDJGOmpoaY/QI7OTDw0PpD+SZmpqivLw8aP98JwNcxQF/eIfVYtunhsPhoIqKCtEYfodjtKlMKs1m58SZ5sWzCHCgCuiNswWbRgOkkFCJsWJ2H1mtVnmPu4H7+PppamCNvXwN5/Dx8RBKCp/rqvkOoNzcXO0RyN+8DwAzS/UNtsRZg8aCAPpOT0/LSn0+H+FgnJ+fJ5xfk5OTOBo+479JireB+zX9zn0r3n8n/0cwmX4DjLDvWeS4uIwAAAAASUVORK5CYII= - - 7a50333d-270f-435c-8b34-272d4cff535e - - guidIN - true - 0 - true - 0 - 5325b8e1-51d7-4d36-837a-d98394626c35 - - - - - - 57 - 205 - 87 - 20 - - - 102 - 215 - - - - - - - - true - Contains a collection of RGB colours - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVHSKxnFB0VjMqz99577w17xYJYg7NREBVcKS4UhKCrB5EsRdCFG1FcyODKhRWjiChPREQXloWQPJGE2Dsn37njyHuaV7IKuXD5Z+af/5x7zz33+zX/VQQYGRndqiv+Rf6o8vvCzMzsw/DwMFZWVrC0tIS5uTlMT09jcnISExMTmJ+fR3t7O0pLS5Geno7AwECogn5Xj5rqEb4SJiYmFerBh5GRESQnJ0smJSUhISEBcXFx6Ovrw9raGnJycgTY19dX/hMUFHRlbGzc8wzzzxEQEPCDtbX1H+Pj46iurpbqmpqaUFdXJyAkmZqawubmJsLCwggKf39/NDY2Ii0tDYrgSsG469FeBQAjc3Pz921tbY+9vb3IyMhAfn4+9vf3sbq6KgDsZGNjAx0dHQgPD0dwcLAQ+Pj4SCequDslle4Z8k0EuLi43I2OjkrVWVlZKCwsxOHhIU5PT5GdnS1dbG1tITExEREREQgJCYHqWgg8PT3h4eHBWbCLJD3kJ6G0/7Wqqgr19fUiDQlyc3PR39+P8/NzaLVapKam4vj4GCUlJW8ICO7q6gpbW1uSfHiGfYlSBweHG4PWlIMSkYRJNy0vL8twHx4ecH9/j7Gxsc8kIoFSAF5eXlAuvFSYWj20spaq/mNKSgry8vJQW1uLzMzMFxIOkDYl6NPT00seHR1hcHAQra2t8Pb2hru7O5ydnYWEhKqLPxX2O42a/E/29vY3bL+mpgb0P72v0+mwt7eHi4sL3N7eSuUEZvDK7+vr62Jd6u/m5gYnJyfY2dlJV4rsWhH8olFMf4WGhoqmzOjoaMTGxiI+Pl4ISXRzc/NZB4+Pj/Kd7uIuGPR3dHSUGZAoKiqK231Ogp+Vva4iIyNhIOJnEsXExGBgYACXl5fSBUENMyApf+/u7pbqKY9SAjY2NoKjJGMH71Vq3lEv+piuYHKJ6HOS7e7uYnFxETs7O2LXk5MTXF9fY2ZmBgsLC2LjsrIyNDQ0SOXshPuipNfP4Dm0pqaml9xMtswrh93c3CyEdEtRUZG0XVFRgbOzM1RWVoo0HDJ3g0bgsOlCRcRdeHGRBL2rbjz5+flJ5eXl5ejp6RGfc2hMdkmHsIuhoSGpllXTgXQd90eZ5UnBvdkDRjzPEgKwCi4ZPxuS4IZtPTg4wPb2thRC3TlYuoebb2VlRe3j9ZCvQnWhUw/csWoCGZKycbF42LFqLt3s7CxaWlpkqApU7KokvFcwXzyLGO7sgjNgtVwaJheus7NTZKIVu7q65H3AuVhaWsp/+G5Qc/zyafpJ9KiWr+gidXxIkozglIFyUDLDfQsLC5FT3Sf4198Hz2GqpPpIq3K7eWwQoKCgAMXFxVIpncSDkYvI84vHunrmNz6rh/h28P36+p37rfz+d/L/KDSavwHpj9jOYnz2uwAAAABJRU5ErkJggg== - - 71d7f714-14ff-49c9-8cd5-da817b22bee0 - - colorIN - true - 0 - true - 0 - 24b1d1a3-ab79-498c-9e44-c5b14607c4d3 - - - - - - 57 - 225 - 87 - 20 - - - 102 - 235 - - - - - - - - true - Contains a collection of three-dimensional points - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOVSURBVEhL1VVJS5tRFI2KQSTOs3E2zrNxnnEAIYuAisXsBP+FUFwVLLhx60IXiisJuFCcRXBZ/4UmFVpcaFtb4+k9N3kfonXoqvTC5XvfdM695977nu1fmSsqKuqbXPEX/k78bRYXF/dpaWkJp6enODk5wcHBAba3t7GxsYGVlRXMz89jZmYGHo8H3d3dKCsrgwQUkF/tYYQXLCYmxis//lpeXkZ7e7t6W1sbWlpa0NzcjIaGBtTW1qKyslKBi4uLUV1dDYfDcR0dHT0bgXnW7ElJSV/W19cxPj6u0dG7urqUiCRNTU2oq6tT0PLycpSWlqqXlJRACG4EwxmG+oPFxsZ+mJ6evpubm0Nvby/6+/vVuSYJM3G73ZpFTU0NKioqFLyoqEgzkeBuRSp/BO6JubKzs38sLi5iaGhIgQcHB9W5ZibMggSNjY2WTC6XSwny8/ORl5fHWjALdxjygYn2J2NjY5iamlIwQ+Dz+eD3+zEwMGARtLa2Ym1tDcPDwxYBwXNycpCSkhISkrMIrGWe9PT075OTkwpCOSgL6xAMBnF/f4/j42Ml7ujowO7urj4LBAL6rSEQBVBQUADpwmvB9IWhpbASfZA/0llIQ8KoDw8PFYx+dHSE/f19635nZ0dlKiwshNPpRFZWlpKQULL4KtgOm1T+PaMnOIvHViQJC0qinp4eC9QY18yCncTiUv/c3FxkZmYiNTVVC5+RkcFBXbAJ01VVVZUWjU4StiK1Nk65KFUoFMLd3R0uLy+10KaDjP4CyhooUX19Paf7igQLycnJN+xtQ8Q1iQjCghrNjXG9t7enc2CipzxpaWkQLMURyZjBR3Gbg3oxVepJZ+rsc2ZCnQloQLe2tqx7vmMG1J3RUx5mQnmtGkTMZ7fbrxkRx59XDhH1Pz8/t8DM9G5ubuqzi4sLDYKSmOhZN7nnLFhdpCaMZ/yQI2/Gnz3e19eH1dVVzYxZMmI6N8MImAXO70XSkMA9mQNaG/cSA/DY2YpmWqk5ZTHgLCzlGRkZQWJiIrV/Osk0ycIvH94yegI9dPY5gakxC0rNTeQCqu0tnfNTYJ7di2hOZmG6g1EaJygjNsCMWDY3JCQk6HueDVLHl3fTiM1KyjfsIhlAyw0o5TBRyxmA+Ph43bMka4K/eh7Q7CLVZ3ZMZ2enFpkA1Hd0dFQj9Xq94MY4MTEB7l/c9OSft51oEeP5+vjMfc3ffib/R2az/QbZBI6jxUGJaAAAAABJRU5ErkJggg== - - f0ee7fe5-3f0a-4c1a-8d4b-6d8de84318d2 - - pointIN - true - 0 - true - 0 - e1937b56-b1da-4c12-8bd8-e34ee81746ef - - - - - - 57 - 245 - 87 - 20 - - - 102 - 255 - - - - - - - - true - Contains a collection of three-dimensional vectors - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOTSURBVEhL1ZXJS5thEMajYhCJe1zjFo0x7ks0iiLihkIOwYUUvSl6EFFB1ItSPBUsCiLeBBU8eBKPIqiHgMf232h7aPGgTWKr03nm+95gTFx6Kh0YvojJb2aeZ973M/yrsMXExPzkJ/1FvuN8WyQkJHza3d2lq6sr8vl8dHFxQaenp3R8fEwHBwe0vr5Ok5OT5Ha7qb29ncrKyogb+sI/NWqEFyIuLs7DP/y1v79PLS0tki6Xi5qamqixsZHq6uqourqaHA6HgK1WK1VWVpLJZLqJjY1d0THPhjElJeX70dERDQ8PS3fItrY2KYQiDQ0NVFNTI1C73U6lpaWSJSUlxAVumWHRUFEiPj7+w/j4+O+1tTXq6Oigzs5OSXxGEUzidDpliqqqKiovLxd4cXGxTMLNBVmqEx0XEdacnJzA9vY29fT0CLi7u1sSnzEJpkCB+vp6mWRqaorgFTwqKCig/Px8eIEpnBryUbD2PpblfnR0VGDRCgwODtLGxoYYHwgESMXh4aHAc3NzKS0t7Z6LfNaxoXCbzWa/1+uVLiFHNIn29vZ0ZHhMTExIAVaACgsLibfwhpljGpqN5e6/tra2EhJGqiLRTD4/P9exWvj9fvHCYrFQdna2FIEnPMUPZpsM7Pz7jIwMP+AwD6sIEAwFFKnWdHl5mYLBoI7W4vLyUvTPy8ujrKwsSk9PF+MzMzNxUD8auNJ1RUWF7DYSRWAgzHycS0tLAn94eJDn2dmZFFhdXQ3pz1B4IIVqa2txuq9RYJPX6xa7rQrhMwphW5CLi4th8Lm5ObLZbLSzsyOyonvIw0pQamqqcNgLTLDJaTBBL+wxTicShwh7jmILCwth8NnZWYHj+zAU2kN3dA95MAkkZV81D/QYMxqNNziZOP54wrj5+fkIOPRVcCUNJFHdwzP+G2chtEUS2F18EUcekP7+/jD4zMyMgLEhMBWdP4Vjsubm5nvGRZwDhAt3CQAqt7a2BD49PU1FRUWh0wrNIYuCw1jI09fXR8nJydA+8iQjeIoT/mIQEwCE7Orqkic6Bhhdw1BorjpnqKw3b84dY569ixAWTAEP0C26VAkoOlZgdMzbR0lJSfJ/vBvYx5dvUz1WeORbbBFfH6FUUMihuuZ3ACUmJsp9xVMD/ur7AGFkqb5hVXFFqEsP+g4MDEinHo+HhoaGaGRkhHB/9fb2vv2Npgfer0/fua/l29/J/1EYDH8AZ/CWe/XcHf0AAAAASUVORK5CYII= - - 3e2592d7-f6ba-4bb9-be76-dc519e8d544c - - vectorIN - true - 0 - true - 0 - 15a50725-e3d3-4075-9f7c-142ba5f40747 - - - - - - 57 - 265 - 87 - 20 - - - 102 - 275 - - - - - - - - true - Contains a collection of three-dimensional axis-systems - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQeSURBVEhL1VVZKC1qFN7ITjLPbPOUeTqmDClDSFHIzXlTHrxI5mEbSydOzgMPHsjwYBbHg6IQER64hDyQvCiXMuwH+x7HsfvOv9Yecq97znGfbver1d67/f/fWv+3vvX/kv8K3np6en+KT/yL+E3E22BkZPR7f38/Njc3sb6+jpWVFSwsLGBmZgbDw8Po7OxEcXExsrKyEB8fDx8fH4iC/hBbpWqGn8DAwCBHbPw2NDSEmJgYjujoaERGRiIiIgKhoaEICgqCn58fE3t4eCAgIAAmJiYP+vr6cg3NDyE1Nze/HR8fR15eHldHERcXx4koSXh4OIqKirCxsYGTkxPExsbCy8sLnp6eEAmUgkOmpvoHGBoafhCbn1tbW5GYmIikpCQO+k5JSkpKsL+/j5fY29vTnUQU91VI9VlD9woeDg4Ojz09PUhJSWHi5ORkjurqahwdHWkogbu7O+7H5eUl/56YmICLiwucnZ2pF3SKd2rKFxDarwtZVIWFhSwLJWhubmYZtLi9vWViuVyOhoYGTE5O4unpif9rbGyEo6MjLC0tVSLJnoZWhywbG5svBQUFrHVpaSlOT095I+Hm5gZzc3NoaWlBW1sbRkZGcHBwwPIsLi5CpVJxouzsbLi6ukK48EFwvldTi8aK6q+oWRTUyPv7eya+vr7miqkndJrp6WkcHx9jZ2cHAwMDLF15eTmvIVAhYWFhcHd3J6nuBLeJRHS+2dra+guRkwXJiufn57yhq6uLiZuamliCpaUlrK6uoqamBlVVVaioqEBZWRnHxcUF79ne3mZX2dra0qB+lIhMCn9/f/Y2BSVZW1vjxX19fay3VvPe3l5udn19PSorK1FXV4fZ2VndiQlUgJ2dHUJCQmi6FZTgk7CXMjg4GNpEY2NjvHhqaorJiKi2tpbj8PAQg4ODWF5ehlKp5HWEra0tUA8tLCyYR/RCfQLSifQiH9N0UrS3t/MmkoTkoCC9Ozo6WL7n52f+nzA/P4/MzEySBFZWVuwkmnzRV3UPNHgvlUoffH19eWhooAi7u7usdXd3918G7PHxEaOjo0hISGBCkkT0kasnF4rfNAs6FzHIu7SQRj49PZ2JyEVnZ2f8naBQKLgP5BSZTPaK3NvbG1FRUSpB92oOCNF0l5DF6PJ6iaurK/Y/yUfT6uTkBDH1OnIxXCxPWloazMzMSPvXk0wQp/gsFn4lm1ETqaHkczc3N66YiKlqe3t71lxbuSBlewvnPAmaH95FBBmdgnpBdwtVqQ0ipYq1xFSxcB9MTU35f3obRB9/fptqIBdHVgYGBkJcH7rQkpIc2qrFGwBjY2O+EMWpifyX7wFBKqS6pj7QFa29VUnfjIwMrjQnJwe5ubnIz89n76empr79RdOA3te/v7m/ire/yf8jSCTfAVRIIgekIvzJAAAAAElFTkSuQmCC - - 4eea64b8-b512-4309-b10c-919320df4e6d - - planeIN - true - 0 - true - 0 - 3897522d-58e9-4d60-b38c-978ddacfedd8 - - - - - - 57 - 285 - 87 - 20 - - - 102 - 295 - - - - - - - - true - Contains a collection of numeric domains - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOYSURBVEhL1VVJS1thFI2KQcR51jgb53meUMEJIYuAitWAC8Gl+geC1VXBQje6VNSdIKi4UhAHBLf+AkXBRdtFSxStta2e3nOTF2xtNF2VXvj4XvLeO+fcc+/9nulfhTUgIOCL7PiL9UqWfxESEnI8Pz+Po6MjHB4eYnd3F1tbW1hbW8Py8jJmZmYwOjoKm82G5uZm5ObmQgS9l1fNboRnIigoyC4vfl9aWkJ9fT2amppQV1eHmpoaVFVVoby8HCUlJSgoKNCVlZWFoqIihIWFXQcGBjo9MD7DHBkZ+WllZQV9fX2qrrOzU0lIRpLKykqUlpYqaEVFBXJycnRlZ2dDCG4Ew+KG+kMEBwe/GRkZ+TE9PY2Wlha0tbUpEa+NTKqrqzWL4uJi/Z/gmZmZmomIuxOrNjxwT8KalJT0dXZ2Fh0dHQre3t6OiYkJvWY2zIIEVE6bHA4HrFarEqSlpSE1NZW1YBbVbshHId4f9vb2YmhoSMEMgp2dHZ8Em5ubXgKCJycnIzo6+l5Ijj2w3rDFxcXdDgwMeAtrWHRxceHTovPzc69FJBAHkJ6eDunCa8F0uKGlsKL+Q0NDA7hYSIOEqq+urnwW+fLyUgkyMjJgsViQmJioJCSULD4LdphJKv86Njb2tqurC8PDw5iamgJb9ODgQBU+PDzAV/DeyckJtre3MTc3p/Xq7u7Wdk5ISOCgvjUJk6uwsFBVsmiTk5NYXFzE/v4+zs7OPFC+4zHB+Pg4KDQvLw9lZWWcbhcJ3kl73dCOwcFBOJ1OLCwsYG9vTwn8yYBTzu4bGxvTuaGd0lXuDOgT/WIfG9NJf1lEdgp95jX/4z2qY+fweZfLpd7T9/j4eMTExGgnsRmkru4aeMJhNpuv+TLPFe75+fkKyCx4bdxjUQnObjk9PVVA8RtSR0RFRal6+c1Z8HaRBnuXD3LkCcJFpevr697fBDaGispXV1d/AefztbW19wL3ZA4YdTxLCPB48ajgzlY0pjUlJUVt4WlKcBkutYcFjoiIoPdPJ5khWWzIg3dUSyAuDhZ3KiYwLWG/03PWhsoFVFtTOuebwPg8ixgWZkG/qZYqScadoLSDwFRNxSQMDw/3ZiN1fP409YRTUr6hOjk+FJi7AUo7DNXS3ggNDdUzS4QQ/MXvAcMsVn1kWzY2NqK1tVUB6G9PT48qtdvt4MHY398Pnl/sfXnHvy+aJ/h9/f2b+9Ly/5v8H4XJ9BNGgKhjNsiLlAAAAABJRU5ErkJggg== - - 12a5ecab-2cd3-41b9-b37a-e584cc175d39 - - intervalIN - true - 0 - true - 0 - 589748aa-e558-4dd9-976f-78e3ab91fc77 - - - - - - 57 - 305 - 87 - 20 - - - 102 - 315 - - - - - - - - true - Contains a collection of 2D number domains - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAN0SURBVEhL1ZXbK6VhFMY3spOcz2xn2/l8PoVyKHGhkIlSlJI/wJWaXE1RQ5ErhTtXcqmUSHE382/MkJlcMObYmvVbe38ybIe5muaplW337edZ61nP+36ufwVvUFDQF/0rf1GvtF6GsLCwd+vr63JyciLHx8dycHAge3t7srOzI1tbW7KwsCBTU1PS398vra2tkp+fL9rQB/2p28fwBEJCQgb0hz82NzelsbHRqq+vT+rq6qSmpkYqKyulrKxM2trajDgnJ0dKSkokIiLiKjg4eM5P8yjc0dHRn7a3t2VoaMi6o2ZnZ00IkerqaikvL5eZmRkpKCiQvLw8q9zcXFGBa+Xw+KgCIDQ09M3k5OTP+fl567Cjo8NqY2NDWlpapKGhQWpra22KtbU1KSwsNPLs7GybRJv7plbt+ukewJuSkvJ1ZWVFurq6jLizs9Pq9PTUJmEKBKqqquTo6EiKiorE6/WaQEZGhqSnp7MLpqj1Ud6Ben88ODgoo6OjRnZX4OLi4oHA+fn5HwKQp6amSmxs7C8Vee+nvUV/QkLCzcjIiCUDz7GFziF/DIiQsOXlZZmYmDDrMjMzRVN4pZxjPmpdrHb/sampSSgWSad47iwZ7O/v/1HAWXJWVpZ4PB5JTk4Wtdkm0ik+K3eESzf/Oj4+/gZyOiCKiLBQhCgQSMCJKf6npaVJUlKSxMXFmah+5qAuulTpsri42LJNIUIU8dopEEjASZDjf2JiIjswoYqKCk73JQJvNV7XZNsR4jNCLJMCgQTudo896oTExMQYj37vmwCf8IuHSQXFySwtLb2dCgQSYKF4j+90jz1Mgr26V98O/Bhzu91XLI3lTk9Py+rqqhweHlpSHsPZ2ZmJLS4uWrw5eOxMLeIs3KbIQHbxjiOPtxQZpyDif6Z0DhXf0S2/cazh2fr6+l9K9+AcgAbuEgjuF1knis5pxXM6d8hZLPb09PRIVFQU3j88yUCn2NUHv9EtRE4tLS2Z1xDTNQvFFqdzJbV4a3K+K82jdxHwMAW7oFuWR42PjxspHbNMiPFc0yeRkZH2DDeA7vHp29SPOR35mhTp9WHFZ0ixATvomib0HSDh4eF2X+nUkD/7PgButeqMqDY3N0t7e7sR4G9vb691OjAwIFyMw8PDwv3V3d398jeaH7xf779zn6uXv5P/I7hcvwHdIrFxM9F9sQAAAABJRU5ErkJggg== - - 6d2404a6-b402-4db3-8382-68ab0a4e2105 - - UVIntervalIN - true - 0 - true - 0 - 74c906f3-db02-4cea-bd58-de375cb5ae73 - - - - - - 57 - 325 - 87 - 20 - - - 102 - 335 - - - - - - - - true - Contains a collection of boxes - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQpSURBVEhL1VVHSKRpFGwVGxFzllYxYxYcI6KCAXPOAQMYEMWAx5HFg6wB1otHBQXFHBBELyYUxVPjSb0YQWdEXUW7d2Z0hjdfve6W3pmdcfa0bEHhwf7qfd97Ve+X/Fdw19HR+Sj+0r9goeCvwcDAQD4wMEDb29u0ublJq6urtLy8TLOzszQ8PEw9PT1UXV1NqampFBkZSR4eHiQu9E4claoUfgI9Pb1McfB5aGiIwsLCmKGhoRQcHExBQUEUGBhIfn5+5OXlxcIuLi7k4+NDxsbGCl1d3bdqmR9Campqejs+Pk65ubl8OzAlJYUaGxupoaGB8vPzKTo6mkU9PT3Jzc2N6erqSqKAUmjIVFL/AH19/d+rqqo+d3R0UFRUFMXExFBJSQm1t7fTyckJ3d/f08rKCvX29lJNTQ1lZGTw6/AKUFzuk2jVvFruO7jb2dl97O/vp7i4OIqNjaX6+nrq6uqi6+trFr+4uKDb21tSKBT08PBAa2trPI+KigoKDw8nBwcHzAKvCFVJakH0fisnJ4eKi4u5QHNzM/X19ZFSqaS7uzs6PT3lVxwfHzPPz8+52OPjIxcrKysje3t7Mjc3RxG5WvYFqVZWVh8KCgp4qOj34OAgPT090c3NzYu4doGjoyPa39+nzs5OAiorK0l0gJycnEi4UCE0S1TSYrDi9u/xRBBuaWtro+fnZ9rd3aWNjQ06PDz8WwGI7+zsUG1tLWVmZnIBtMnW1paLODs74xV/Cm0jiZj8b5aWlh8gDgvCiq2trXxofn6eOTc3x1xaWqK9vT2ampqioqIiys7OpvT0dP5teXk52djYkIWFBbtKFPtLFPhDIirde3t7s7dBFGlqauJDCJaGMzMzTIjn5eWxOG6vXcDa2ppngEIBAQFI9wMK9Ap7Kf39/UlTCDMANKLg9PQ0i09OThLMkJWVxeLICIAhi06QmZkZ68hkMrygS1BihH7Bx0gnCHsCENQmxCcmJl7EsSqSk5P5t6WlpdweOAnZEHNVzUCNEqlUqkAyEf+6ujo+BEGNqIZIuba45rWFhYV8e7hQtAhZeHERA94V//iCyCOlwMLCAgtqODY2xkRbII6cIIDd3d2cfHd3dwoJCfki5L7LAfAGuwQWw3PX19c5RJeXl+wcFBsdHWWmpaXR4uIinZ2dUUtLC98a/U9ISCATExP0/o1K8huIV8yLPn6CAxITE7kQVgHsiTRfXV2RXC6ng4MD2traYuegrUKU7S3OPQmZH+4iQIZX4JCjoyMPzNfXl/cSeowliDyMjIzwohNOwZrmcGEmYo4/36ZqvBVeVkJYrI8XogUwANoh+syOMTIyIkNDQ76ACBfEX/0eAFLRqvfY9xEREbz7IYD+JiUl8U0RMGQBgcP+io+Px2q4xFmVxOvA9/Xbb+5r/PVv8v8IEslXpPMnRAO0o3EAAAAASUVORK5CYII= - - 71b75a87-0ee7-4c6d-b270-4ee307b88bac - - boxIN - true - 0 - true - 0 - f29cb021-de79-4e63-9f04-fc8e0df5f8b6 - - - - - - 57 - 345 - 87 - 20 - - - 102 - 355 - - - - - - - - true - Contains a collection of three-dimensional transformations - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL3VVZKK1rGF4IK5nHZVrmmczLTKYy22ZbLkjJpcSNcuRilxtXrijihi0pRbniwlBqk9IJV4jk1Gpf2G1rWYb1nvd515DOZu99t+s89bVaf9//PO/7vM/3/Yo/BbWNjc0D/9JvLiOvRl6/B0dHxy/T09O0t7dH29vbtLm5SRsbG7SyskJzc3M0Pj5OPT09VF1dTXl5eRQVFUVckJZfVZoYfgI7O7sPVVVVT7Ozs5SVlSVLo9FQRkYGpaWlUXJyMiUmJlJsbKwQh4WFUXx8PLm4uNzb2tr+ZaZ5F0re+HVxcZEaGhqkOqzc3FwRgkhqaiolJSUJaXR0NEVERFB4eLgIscB35lCZqN6Avb39eFdX1/PY2BgVFBRQUVERlZWVEXdENTU1VFFRQSUlJZSdnS1d5OTkiEBoaKgIuLm5GdiqJTPdD1D7+PgYJicnqbS0VMhBPDAwQIeHh/T09ETPz890dnZGExMTVFtbSzc3N1RcXCwCwcHBFBQUhFnomEtjonwF9n67vr7e2NHRIbZApL+/n/R6Pb0FrVYrvwgCBEDu7+9PHh4eRhb520xrRZWXl5e+paVFvIbnSMj+/r6QHBwcUGdnJ9XV1dHo6ChdXl7KcwuGhoZEQKVSkVqtJqVSiVl8NFHzYLn6f+ArFgYJEXj+8PAgBIgkusrMzJTZXF1dyXML7u7uKCUlhfz8/EQE8+AuvjK3kwLR8vb21oMcEUQUIQL/LWhra5P/GHB3dzctLCzQ+vo67e7u0unpKd3e3tLy8jL5+vqSp6enDJ7nqWeBTwpW+oZMIxVYEElPT6fKykrS6XRmCRNgDQ4gBhsXF2dNkMV/JsUMpBPwsMA3WPSJ46VDtvGSJX7z8/NWga2tLRocHKTV1VV6eXmhnZ0dOXywAukJCAgQUp4jubu7yxlhUVMHDCX8wmZ0gpWfn0/X19fU19dHRqORDAaDDBn+I8ZAb2+vHLDAwEDxHdXDHnQCcbYeM7BeHR8dHBy+42Ti+CNFJycnQri0tCSE5+fnkn10AoyMjIhFIIT3luoxSxa7B6eJ2gxklzcaURUqOD4+ls0QOTo6EtLHx0fpBjY1NTWJPa/JURwHBDfrD+cA0HBbupCQELlr1tbWqLGxUeaCmczMzIhtFxcXNDw8TDExMVZyDBb24FpxdnZ++yQD3MVn3miAVUgRYoj8R0ZGymwQgISEBPH+deWurq4Sby7skWnevYsAFW5ECGC1t7fT1NSUkCMlIMUwQYyKOX24puU5Tj7mCA4T1TvAweOW71EpEgJfEUMLKeywVM12kJOTkxxAHjis+eX3AEBstcgyvC8sLBSC8vJyua5RKV+KMp/m5mZqbW0V7/EO3jVR/BofeCEN//32vrewF+/876BQ/AtJDtfQgQWgYgAAAABJRU5ErkJggg== - - af953a17-ced4-476a-950d-640d7cfb03cd - - transformIN - true - 0 - true - 0 - c4b38e4c-21ff-415f-a0d1-406d282428dd - - - - - - 57 - 365 - 87 - 20 - - - 102 - 375 - - - - - - - - true - Contains a collection of line segments - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAANVSURBVEhL1ZU5S2RREIVbxUak3Xfb3Xbft3ZDBRcQDAQVWzsQFf+FMBgNOGBiaqCZkRgamQim/o0ZgxkM1NaZ0Zr6qr1NuzvRMAeK9/r1u6eqzql7n+dfIZCQkHCjV/mLCGl8DCkpKWc7OztyenoqJycncnx8LEdHR3JwcCB7e3uyubkpa2trMjU1JYODg1JTUyNa0Lku9UYZ3kBSUtK0Lvy1u7srvb29FsFgULq7u6Wzs1Pa2tqkublZ6uvrjbiyslIaGxslLS3tMjExcf2B5lV4MzIyvu/v78vs7KxVRwwMDFgiknR0dEhLS4uR1tbWSnV1tUVVVZVogivl8EepXkBycvLnlZWV3xsbGzI0NCQjIyMW3JOETrq6uqyLpqYmqaurM/KKigrrRIu7VakOH+ieIVBYWHizvb0tY2NjRjw6OmrBPZ3QBQna29vlKUpLS6WkpAQv6CIYpYyDan8yMzMji4uLRvaRBLrMAkBeVFQkWVlZd5rkzEjjMJWbmxuZn583EuR4S6Ll5WUj1XWPEqgCUlZWJjqFl/o8DDHwavXf+vr6hMBIl+Qlk9UjiUQiRhoPv98vBQUFlgRPtIsfyu3zqPOfcnJyIpBjHqMIEdVCSrgxXV1dNfL7+3u7LiwsmLnoX1xcLPn5+ZKdnW3G6/21JtjyaKaLhoYGm22CJIwiUsSHq9yR45WbIKd/Xl4eHlii1tZW5LsgwZaO1xWz7RJxTyLMJNA8njwcDksgEHhUPfKoEpKZmWk8+pwOvmh4fOjFy+xOgk3EnJNsaWnpWeWOHEPRHt2pHnnoBEnV16gHDwh7vd5Ldibbn+tTXF9fm+bI4sidNEjiqscz/c1eiE2RgdnVP+7Y8pAAfRwbw1AoZMRojixU/pScznp6eu50zbN9AIKcJRAQQJ/FEpSXl8d2K5ojiyPHWOSZmJiQ9PR0tO+C8Bm0i0N98dZ1EA8qhpiqMRTNXeVKauOtk/NTaV49i4CfLvCAaqnSBaRU7IipWKePY9r+59ugPr59mj5gXVu+Yor0+IiFI0UOV7XP55PU1FQ7r7RryN/9HgCvSnXOqPb398vw8LARoO/k5KRVOj09LRyMc3Nzwvk1Pj7O0fCVtVGK98H3NWbyB+Pj3+T/CB7PH/DZitGURVqaAAAAAElFTkSuQmCC - - 7cbd2a83-2d7a-4d0b-86c3-6dd69b9017dc - - lineIN - true - 0 - true - 0 - f802a8cd-e699-4a94-97ea-83b5406271de - - - - - - 57 - 385 - 87 - 20 - - - 102 - 395 - - - - - - - - true - Contains a collection of circles - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPGSURBVEhL1VVbKO15FN7ITnK/s5H7/X6/ptxSHuSSk02KPHjiQZ5OTfIwZTIvHnnAg5TSyZMiilJKJqXkQV6UcdJMB5s9ew6+Wd/a+y+NcZmnaVat9q7/+n1rre9bv/Uz/VeW5Obmdie/+Bf+Sfxj5uXltT8zM4OdnR1sb29jY2MDq6urWF5extzcHCYmJjAwMIDm5mZUVlYiOTkZUtCvctTsRHjDPDw8WuTg99nZWZSWlqqXlJSgqKgIBQUFyM3NRVZWFtLS0hQ4Pj4eGRkZ8PHxsbm7u392wbxqZn9//98WFxfR3t6u1dErKio0EZPk5+cjOztbQVNSUpCYmKiekJAASXArGBYn1D+Yp6fnj319ffdjY2Oorq5GTU2NOv8zCTspLCzULjIzM5GamqrgcXFx2okU5xCqvrjgXlh8RETEH1NTU6irq1Pg2tpaMNnW1hZOT0/x+PiofnJygvX1dQwPDyMpKUkTxMTEIDo6mlqwi0In5DMT7reFloeuri6lhRQdHR3h/v4eKysr6O/vV5rYAWOWlpb028HBAcrKyhQ8MjISgYGBD5LkFxfskzWHhITYOzs7FYQdnJ2d4ebmBkNDQ69S1NPTg6urK+2IdAkDiI2NhUyhTTCtTmgRVqq/YBV0Cjk9Pa1UjI+PvyvyyMiIxk5OTiI8PFyTkDLp4nfB9jGJ8j8EBwfbCc7KOIrHx8ew2+0oLy9/d0ypwd3dHQ4PDxEWFoagoCAVPjQ0lBf1J5Nk+paenq6H6AS4vLzE9fW10mE4KzfAGW+MKKsllRcXFwSlBpooJyeHt/sbE/ws43XLto1E+/v72vbg4CDy8vIUmN8NcPLNyjmaVqtVY3d3dyFMICAgQGNEC2cH5Il8MZht08k9D7Gq1tZWFZSc8xsrN8AbGxtxfn6usaOjo0oPJ4mUiq5ODVxmNZvNNh4mr6xgb29PDzocDiwsLKC3txdVVVUqOKuen5/Xb4zhziItrJ6ayX/ehacpUuPsMohXntySks3NTQV4y9fW1nQ0Cc7OiouLHwTuxT2glXCXULTnzgtGEJvN9gRKUbldu7u7lXcKS3oaGhrg5+dH7l/eZJp08UUCHeyAN/O5WywWREVFKcecd06MIaqA6gjL5PwpMK/uIpqFXVAL7hZeGsMJSgoNYFYs0wdfX1/9zrdBdHx7m7rss7R8y8mR9fHkBijpMKqWNwDe3t66FKVrgr/7HtDMQtVXjiUnxtiq5LepqUkrbWlpQVtbGzo6OsD9VV9f//EXzWV8X//+5r7nH3+T/0dmMv0FMAW6A1HabBsAAAAASUVORK5CYII= - - 52490cf3-cbed-42c2-8d9e-f0a2b381dcf7 - - circleIN - true - 0 - true - 0 - 3c5409a1-3293-4181-a6fa-c24c37fc0c32 - - - - - - 57 - 405 - 87 - 20 - - - 102 - 415 - - - - - - - - true - Contains a collection of circular arcs - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOuSURBVEhL1VU5SFxRFB23QWTcd8d937fRcUMEFxAGGVAxKAgKio2VdgpBm4CBWNiJiBaCNmIpaGXUMgraiKVNTGFIMRNjXE7uuTNfBvdUIRcus7z/z7n3nPveM/2ryPbz8/spn/iLfCf5tggODv6ysLCA/f197O7uYmdnB5ubm1hfX8fy8jJmZmYwNDQEh8OBhoYG5OTkQAr6Kq+aPQgvREBAgFNevF5aWkJNTQ26u7vhdDpRVVWFyspKlJWVobi4GPn5+QqckZGBwsJCWCwWl7+//6QX5tkwh4eHX6yurqKrqwvNzc1YXFxET0+PkpGkoqICJSUlCpqbm4usrCzNzMxMCIFbMKweqCciKCjow+Dg4M3U1BQaGxsxPT2Ng4MDJaqvr4fdbofNZtMuioqKkJeXp+Dp6enaiRR3JVJteOEeRUZCQsKvubk5tLS0oKmpCUdHRzg+PkZHR4dqzS5IUF5efi9Tdna2EqSkpCA5OZlesAubB9InRPvPIsttb2+vgg0MDOD6+hp3d3dwu91q7EsEBE9MTERkZOStkBx4Ye/DERMTc2loTTnYyenpKQ4PD5WEubW1hdra2iclIoEogNTUVMgUugSzzwMtxkr153yRSSPr6uqwsrKCiYkJ7YaesAuS7O3tKYGvyWlpabBarYiPj1cSEkoX3wXbYhLn30dHR18alXEUqf/o6KgazY5obn9/Py4uLpSEk+U7ptQ/KSkJcXFxiIqKUtLY2Fhu1I8mYfpRUFCgmjJJwqppNPU2kuM5PDyMm5sbTe4NX3mov4DSAyUqLS3l7v5Bgk8yXm7OtkHERQLSTCZJuc61+fl57YK73Ld6yiNKICIiQnHEC08H1Il68WG2zaSBTKMrfqfmXCOhy+VSEnZJ7ak7q6c87ISSiq8eD7zRZzabXTSNyelgGoT8zv+pOWVZW1tTgtnZWQWkJEb19Ex+cy/cT5EGZ5cPEsBIzjjT+M0uqfnIyIgS8CD0Beez1dXVtwL3aB8w7NKW2wB5mBxFY7dy4khwfn6u4DSW8rS1tSEsLIzaP97JjMDAwA154YqVEMxImka9x8fHsb29jbOzMxhxcnICHo5jY2Mc798C8+xZxLDyRKTeBKZ5RnJKKAfNZNWsWKYPoaGhus67QXx8+TT1xqS07ObkyPFxnwYo5aDeIgXvAISEhOhpKx4R/NX7gGEWw79xLHkmcVcTgPq2t7drpdxknZ2dehnx/GptbX37jeYN3q8P79zX8u138n8UJtMfvcmFuevNx+AAAAAASUVORK5CYII= - - eac72910-a336-4f72-b2b9-4850dec2ce1e - - arcIN - true - 0 - true - 0 - 9c80ec18-b48c-41b0-bc6e-cd93d9c916aa - - - - - - 57 - 425 - 87 - 20 - - - 102 - 435 - - - - - - - - true - Contains a collection of line segments - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAANVSURBVEhL1ZU5S2RREIVbxUak3Xfb3Xbft3ZDBRcQDAQVWzsQFf+FMBgNOGBiaqCZkRgamQim/o0ZgxkM1NaZ0Zr6qr1NuzvRMAeK9/r1u6eqzql7n+dfIZCQkHCjV/mLCGl8DCkpKWc7OztyenoqJycncnx8LEdHR3JwcCB7e3uyubkpa2trMjU1JYODg1JTUyNa0Lku9UYZ3kBSUtK0Lvy1u7srvb29FsFgULq7u6Wzs1Pa2tqkublZ6uvrjbiyslIaGxslLS3tMjExcf2B5lV4MzIyvu/v78vs7KxVRwwMDFgiknR0dEhLS4uR1tbWSnV1tUVVVZVogivl8EepXkBycvLnlZWV3xsbGzI0NCQjIyMW3JOETrq6uqyLpqYmqaurM/KKigrrRIu7VakOH+ieIVBYWHizvb0tY2NjRjw6OmrBPZ3QBQna29vlKUpLS6WkpAQv6CIYpYyDan8yMzMji4uLRvaRBLrMAkBeVFQkWVlZd5rkzEjjMJWbmxuZn583EuR4S6Ll5WUj1XWPEqgCUlZWJjqFl/o8DDHwavXf+vr6hMBIl+Qlk9UjiUQiRhoPv98vBQUFlgRPtIsfyu3zqPOfcnJyIpBjHqMIEdVCSrgxXV1dNfL7+3u7LiwsmLnoX1xcLPn5+ZKdnW3G6/21JtjyaKaLhoYGm22CJIwiUsSHq9yR45WbIKd/Xl4eHlii1tZW5LsgwZaO1xWz7RJxTyLMJNA8njwcDksgEHhUPfKoEpKZmWk8+pwOvmh4fOjFy+xOgk3EnJNsaWnpWeWOHEPRHt2pHnnoBEnV16gHDwh7vd5Ldibbn+tTXF9fm+bI4sidNEjiqscz/c1eiE2RgdnVP+7Y8pAAfRwbw1AoZMRojixU/pScznp6eu50zbN9AIKcJRAQQJ/FEpSXl8d2K5ojiyPHWOSZmJiQ9PR0tO+C8Bm0i0N98dZ1EA8qhpiqMRTNXeVKauOtk/NTaV49i4CfLvCAaqnSBaRU7IipWKePY9r+59ugPr59mj5gXVu+Yor0+IiFI0UOV7XP55PU1FQ7r7RryN/9HgCvSnXOqPb398vw8LARoO/k5KRVOj09LRyMc3Nzwvk1Pj7O0fCVtVGK98H3NWbyB+Pj3+T/CB7PH/DZitGURVqaAAAAAElFTkSuQmCC - - c07c558f-360c-4f24-ad05-462d9371baba - - polylineIN - true - 0 - true - 0 - 66fa617b-e3e8-4480-9f1e-2c0688c1d21b - - - - - - 57 - 445 - 87 - 20 - - - 102 - 455 - - - - - - - - true - Contains a collection of rectangles - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQkSURBVEhL1VVHS2RpFC0VC5EyZ8tsmbNlFnNEMaBiaMyoYAQFF9o4CIZBYVauVAzgQhCkUREFEUFxYWr8AS5009ObGXrRTlc5NnfuuWVJzfS07W6YCx/vvar3nXvvOee7T/FfhcbMzEzHV3ppmZubmz7X8XpdWFlZvV9cXKTT01M6OTmho6Mj2tvbo83NTVpdXaWZmRnq7++npqYmysjIoKCgIOKCfuWtSgPCC2FhYVFRWlr658rKCiUnJ1Nubi41NzdTXl4excfHU0xMDOXn51NLSwslJCSQv78/hYeHk0ql+swdvX2C+W4o7ezsfltfX6fq6mpKT0+XVVdXR1NTU1RWVia/T05OUmFhIQUHB1NgYKCsgIAAUHbPGGoD1L+EpaXldFtb2+P4+Li0npWVJQv3PT09dH19TWdnZ1RfX08REREUEhIi4H5+ftIJF6dnqt49wX0TGnd3d93c3JzQAWDQg4X7hYUFMsbExARFRkZSaGgoaTQaSYDl5eUFLdBFkgHSJJj7k6qqKmpoaBBaTBMsLy8L8MbGBu3u7so9ujQmgAbZ2dly7+DggCTvn2Cfo9TZ2flLY2MjpaamUlpa2jNFcA1ie3ubSkpKKDMzk3Z2duS3sbEx0mq11NvbK4V4eHiQj48PsQs/M+YbAzQLy9V/TElJoYqKCmINBBxJjJUfHBxQa2urCFxQUEB4d2tr6/k/7AE9bm5uxDQLXdzF74ytUrDyPzk5OX3Bpri4OBFzenqa1tbWBOD4+JiGh4epu7ub0CGKyMnJkWfE7e2t0OPp6Umurq7k6OgownOyPzjBLwrO9CksLExEw4LXl5aWZPPd3Z0cKlAxNDREnZ2dYtmRkRHS6XR0cXFB7e3tUhCKc3FxEQ2QKDo6Gqf7ExLMsr3uo6KiCIngb1BzeHgoSfb39wVgdHSUBgYGJKFer6fLy0uxqre3NxUVFVFHR4eIbG9vLzhqtRod/MxLoQJf8HFSUhINDg5SbW2tbAb44+OjCAxrzs/P/w0cgjKQ8I7OQZURh3U1aPAUb6A8RgBcghOKQ4Suzs/P6eHhQeYRrqbgEBbOASWsI/n6+oqb+Bln4dlFEvAuv/wVR954/NEyuL25uRG6rq6uxPOgBZWbgoMavJ+YmPiV4b45BwgtZonxVBpXbGwsYbKik9nZWZmccAxoMYJDWLgHFra1tQX3WgPkP4K7eMcv6lE92gdNfX19MjnBLSzc1dUlHcAxxsoZVDRg5zwwzHdnEUKNLqABqII7oAuowCFC5eXl5fIbqmf3kY2NjXTDI56USuXL0/Qp3nLL9/gWYNagUh4jUi1owBW0gW+AW1tbi7DcNcB/+D1AKJmqjxATcwmuAgD4LS4ulkorKyvFyjU1NXJFR7znA/YaIH4c+L6afm9fs17/Tf4fhULxF9PjvLlVdlKCAAAAAElFTkSuQmCC - - b8fbe768-e625-4ea7-8f19-b1ce169c37a9 - - rectangleIN - true - 0 - true - 0 - 83da014b-a550-4bf5-89ff-16e54225bd5d - - - - - - 57 - 465 - 87 - 20 - - - 102 - 475 - - - - - - - - true - Contains a collection of generic curves - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5Hz+Xw+5HwsF3LIZIuIG0lusUuulMmWHC6c4sYhkVxIkkJcaQ8p4VYxeyvTKmuN2cbume95raVpm723uZrmrTe/9f//877v8zzv92v+qwgyMzP7Xf3Fv8ifVL4urKysPkxOTuLg4AB7e3vY3t7GxsYGVlZWMDs7i/7+frS0tKCsrAyZmZkIDg6GauhX9ar2CeE7YWFhUa5e/HNmZgapqamSKSkpSEpKQkJCAmJjYxEVFYWwsDAB9vf3R15eHtzd3Q3m5ubvjDDfDK29vf3twsICqqqqpDtmRkaGFGKR+Ph4REdHIyIiAiEhIQgMDERlZSWmpqagChgUxpsnqH8IS0vLvqampsfe3l5kZWUhJydHktcsUlJSgpGRESwvL2NgYAChoaFSwM/PD+fn51DNfVZUrRrhXkSQh4fHH8PDwygoKBDg/Px8SV4PDQ2JBh0dHaitrcXp6alcBwUFIS4uDgxvb29qwSkSnyD/For7PY7Kl0mLqQCF5Pj8nTQlJiYK4ObmJnp6eqRAV1cX9Ho9PD094ejo+EUV+cUI+xxlLi4u9zU1NQJCOkhLRUUFxsbGpFB7ezsWFxfl9+zsbBgMBikeGRmJq6srHB0dQTEAX19fKBfqFebbJ2glrOr+Y1paGpgUkkWKi4sxMTEh4Kurq2hra0Nubq48Q6p2dnZE5OnpaaFncHCQTpIi1ERN8ZvCttEo5XucnZ3v+SItSCuyyNzcnABubW0JPSab0gA6nU6s2djYiMfHRzw8PCA5ORlubm5wcnIS4dU1F/W9RlXShYeHi7eZLNLd3S0CEowdknfac3x8HPf396irq5PJbm9vpfvR0VHh39XVlRpIoZiYGG63jgXeK3sZ6G0W4o39/X0pxA1uaGgQe66vr+P6+hqtra1IT0/HxcWFgJ+dnSEgIEDoUUzAwcFBcHx8fDjBzyo1NuSLG8ntrK+vl+OA4nECBinhJKSItNExDBbkdOSd3ZMeTsLNV7o+aWCMt1qtVk/R+vr6npeIBZm85r3m5mbc3NwI+N3dnbiJgKTE1D0Nov7nLjy7SILe5YOdnZ3Y3d0VoehxZlFREdbW1gSYwYOPBb8G57NK7C8K7sUeMFJ4lnCJKN7h4SHm5+dxfHxshAUuLy9FAy8vL6HFBE5hSQ8bsbOzI/cvN5mhplhVD36mQ5aWlnByciLJa3VGUTjpmoKSc1PnClT0UQZ5UDDfPIsYbzgFxycYuzQlQdmxCZgdK/fB1tZW7nOrlY7fP02N8U6NbKCL1PHxnCZQ0mHq2sbGBtbW1rITSjOC//B7wNAqqj7xvKff6RQCkN/S0lLptLy8XL4B1dXV4PlVWFj4+i+aMfh9/fqb+6N8/Tf5fxQazV+PmcVeVawFwQAAAABJRU5ErkJggg== - - 383f0529-5c2b-4feb-81bc-569ceeabcc1c - - curveIN - true - 0 - true - 0 - 9ba89ec2-5315-435f-a621-b66c5fa2f301 - - - - - - 57 - 485 - 87 - 20 - - - 102 - 495 - - - - - - - - true - Contains a collection of polygon meshes - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAARYSURBVEhL1VVHSJ1pFLUQUZTYu7H3Hk2xGyuIvVfsILpIdBeMjAoyKhhQcaUSdaWIEhQUFHVhLAjRENzoSlCQWajIYJnMGM585+rIkEwSZzXMhY/H/7/3zr3nnHvvp/FfhZOmpuaF+sS/ODnq3C10dXW3BgYGsLq6iuXlZSwtLWFhYQEzMzMYHh5GZ2cnampqkJWVhYiICLi5uUEVdKj+qnON8J3Q1tZOT05O/mNoaAhPnz4VAAJFRUWhvLwcAQEBCAkJQXp6Ovz9/REaGgpvb28YGBicaWlpvbqB+WboGBoaHo+OjqKkpAQxMTGoqKhAUlKSJGttbUVCQgJevnyJyMhIuLu7Izs7Gz4+PggMDIRKcK4wbK+h/iHu3bv3swK8amlpQUFBAerq6pCRkSFgYWFhGBsbw8jICNLS0gTUw8MD9fX1yMnJERaquE9Kqrc3cF+Fk5WV1W99fX0oLCwU8La2NgwODmJqakp8WFlZwdraGt69e4e5uTmMj4+jp6cHDQ0NwoRyKYnJIvAa8m+hvljmjyhNcXExGhsbERsbK4faE3hnZwfBwcEiR25uLmZnZzExMQFHR0fY2dnB1dUVDg4OnxWLrRvY20g2MzO7zMvLgzIYiYmJaG9vR3R0NMrKyrCxsYHq6mocHh5KAhbx8eNHqXpxcVESBAUFITU1VTpKT0/vTGEWXUMrY1X1v7Az2DHh4eFiKKlTKrYpwfnu9PRUTN/f3xeWNJnJybKpqQmenp5QMos3isWJwjbQUM7/ZGpqekn9Hj58KJU8evQI9GJychKlpaV48uSJvLu4uMDx8bFIRjBWu7m5KeazQAsLC5iYmMDPzw/m5uYc1HYNlelXdgBfkj475Pnz5+jt7ZXB2trawt7eHo6OjiTB1dUVLi8v5Znv379/j+npaXR1dYmcLNTJyUnmRSU4ZYLXRkZG50zg5eUlSSorK2VaaSYPpdrd3cXJyYn8hhKwNVk9zbexsYGlpaUwogJU4sGDB2TwWh0NA+rFrKRNH6g3NfX19ZU5YFtyLg4ODm6Hi8xSUlIwPz8vuvO3HEgaTrmUr9ce3ESRjo7OGStjEoLU1tbi2bNn4MqgbHy3vb0tK2J9fV26ja3JqWfFRUVF8szilBechdsuklAsPpCms7MzXFxcRAIOG1uVzzx/LTy2sa2tLaytrdHR0YGqqir2v8zB48ePPyu4r+aAEcFdQqloOpcbk5BJc3Mzuru7ZarfvHmD/v5+eaaMbGGyUcDC7v79+9Q++Bryi1As3qo2+8RKKBUp83DvsP9fvHghVZMpv8/MzERcXBxBxVy1XX9XMN/cRQxbsqDe9vb2Yp7qBtGV0tFE1d9iJBcgv2fn8JMslI/f36Y38crY2PicXaHWhwBygNQwSnuyejLks7oDoK+vL5OsPCL4D+8Dho6S6oiycG3QZALwHiADtia15iVEj/Lz8xEfH3/3G+0m8tX58s790bn7nfw/Cg2NPwGZ3c2r5lT8fwAAAABJRU5ErkJggg== - - 28ef77e3-0a4a-4267-a585-4b017e2dc7fb - - meshIN - true - 0 - true - 0 - 794a1f9d-21d5-4379-b987-9e8bbf433912 - - - - - - 57 - 505 - 87 - 20 - - - 102 - 515 - - - - - - - - true - Contains a collection of generic surfaces - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQqSURBVEhL1VVpKK5pGLZ0viTZ933ProxdKFvkByEnR7YSUhJ/bCWJkXKQUOfYI2tyHFkKnQhlm39+KfyQmfkxyDLmzMzpmud6Pr7OHOMc82uau+6e7+V9r+u+r3t51P4rc1ZXV/9VnPgX/lL480xLS2u/p6cHm5ubWF9fx+rqKhYXFzE9PY3BwUE0NzcjPz8fiYmJCAsLg4uLC0RAP4pPFUqEr5impmaS+PCPgYEBBAUFSQ8MDIS/vz/8/Pzg6+sLLy8vuLm5SWAHBwd4eHhAR0fnRkNDo+Ye5klT6Onp/TI2NobU1FQZHf3m5gZP2eXlJZycnODo6AhBcCswrJRQ/2AvXrz4Pi8v78+6ujqEh4cjMjIScXFxuLu7Q2ZmpnTKxDMrKws5OTmSxN7eXmYigvsopJq5h3tkzubm5r91dHQgOjpagkdFRaGgoAAnJyfIzs5Gbm4u3r17J/Xn34uKilQENjY2sLa2Zi2YxXdKyM9MaL+ekpKCjIwMKcsDAeVaXl5GYWEhSkpK8P79e3mWlpaivLxcRUBwCwsLGBgYfBIkP9zDqizR2Nj4Lj09XRY1NDRUSlRcXIyLiwvU1tairKwMlZWVmJ+fR0VFBaqqqlBTU/M3AqEAbG1tIbrwRmC+UkKLworofwoODgad3UISRnl9fY2VlRU0NjaiuroaTU1NkoA1qq+vR0NDgySws7ODlZUVzMzMJAkJRRbnAltHTVS+1sjI6I7gbEG2YkJCgoz87du36OrqkhKNjo5iZGREEnAOWlpa0NraKgmov6WlJUxNTWFoaCi7SvzmoL5WE0yX7u7usrfpJBkfH8fGxoaMmGDt7e2YmprC7u4uDg4OsL29jZ2dHflMe9DfxMSENZBEPj4+nO5LErwW7XXr7e2NB6Lj42MMDw9LYHZVZ2cnuru78eHDB0xMTKC3txf9/f0YGhqSBIye8ggloK+vL3FEVsoMqBP1Yh9zOunse66KN2/eyLOvr09mtbe3J2WiXHyenJyUBNSd0VMeZsLJF3VV1uDeXikUihtXV1c5/ldXV/LD09NTKQn3EGVhwTloMzMzmJ2dxdzcnHyPkjxEzwYRz5wFVRdJY+/yRY48i0RPTk5GW1ubJKRsLPDCwgKWlpZk4bkEaQ/gzs7OCAgI+CTgHs0BLZC7hC32pbM+W1tbODs7k8VfW1tTOY2FpTyxsbHQ1dWl9o8nmSaymBEvfmT07IzPnQPEenDxHR0dYX9/X0UgQGV7i875XcA8uYtoVsyCtWBvs3gPzi6hhBEREbJ7Dg8PJfj5+bn8P+8GUcevb9N7qxEp33p6ekKsD5VTZ8pAOag3oxZ3ALS1teXOElkT/Jv3AU0hpPqZl0hISIiMmADUNz4+XkaalJQELsa0tDRwf8XExDz/Rrs33q9f3rnf8uffyf8jU1P7C+pJDEYi1scaAAAAAElFTkSuQmCC - - ae5c95e9-46cb-4f13-9680-9888e11bd7ff - - surfaceIN - true - 0 - true - 0 - f4070a37-c822-410f-9057-100d2e22a22d - - - - - - 57 - 525 - 87 - 20 - - - 102 - 535 - - - - - - - - true - Contains a collection of SubDs - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPGSURBVEhL1VVJS6RJFCy3QqUR963c932nRBRFURBFXBBm0IugF/UnNMxJRhHEgwfB/SqiDoonDy6jBw+OuIMevIgWqG07WG05Wka/yPqq6Na2dU7DBDyqvi/zReaLF5mf7r9CtJOTk0V+8S/iF4n3wcPDY+vs7AzE09MTrFYrHh4ecH9/D7PZjKurK5hMJpyenuLo6Ajd3d2QDZ1Lqt7G8BO4uLjUDgwMWG9vb3FwcPBd7O/vq9jb28Pu7q6KnZ0d9dzc3Hzn7Oz8UaN5FXqDwfDp5uYGm5ubWF1ddcTKygqWl5extLSkftfX17G2tqb+Ly4uYmpqClK5WTgMNqofwM3N7ffJyckn7nZmZgazs7MqFhYWcHh4iMvLSzw+PirpnoPVtLS0PIhUsxrdC8Tl5ORYqOn4+DiGh4cxOjqK7e1tpf9b4Jz+/n6kpqbeCZfRRvkNRPs/Ozs7Ifqjq6sLPT09atevwWKx4OLiAtfX19oboK+vD+3t7Wz4XxqtA9WhoaGWtrY2FBQUoKmpCUNDQ1qaDayMVU1PTys3EVtbW8jLy0NUVBTCwsIQHByMiIgIuLu73wpnk41aGuvq6moqLS1FYWGhSsjPz8fGxoYiIebn51FTU4OSkhKIjGhsbFQWJQYHBxEZGQkxB4KCgtQiXFCq+CTcH3Rird8CAwPvioqKkJmZqQjq6upUMkHfk5gLc4xz0tLSHHNOTk4QHh4OUQDCA19fX8TGxnKxL7JAn05W+iyNUUkMEoyNjalkYm5uDrm5ucjOznaQJycnIysrS42zF5QnJCQEAQEB8PHxUQtlZGTwdP/NBXq9vb3NTGYiCehtOzo6OhRxenq6gzwxMRFxcXHaDKjdUx4/Pz8Il5ojkrGCbgndB+oVExODpKQkFfS0HRMTE7QeUlJS1FhCQoIij46O1mZA6c7dUx5WYjQaIdLbeqChSa/X3zI5Pj4e5+fnWiqUY2praxUxx6gvyekWOyiJffc0iDzzRDtcpEDvyi6srOQ5eC/19vaiqqpKOYRNpWvssJNTOnGiVehenAPCKGWZucNvQYneCxpCFqL2uTbKZ5AqZkVH2ynSQIe0trZC7igcHx9rb1+CV3hxcfE/cqb+0Oh+CAOroLftYAMZdAm1ZjMpCRtqB8erq6shffz5barhozT0i5YLf39/FXZS+px6e3l5aTOAsrIyNp/kb34PCL1IZaqvr8fIyAjLVgQVFRWorKxUO6WrGhoa1JXOKC8v59VwxlwbxRuQ78KvEmqn8vhqeHp6qtCe3/9N/h9Bp/sKcJmebux1WzIAAAAASUVORK5CYII= - - 1f58aa18-d0d6-46c5-a795-93de1832297d - - subdIN - true - 0 - true - 0 - 20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08 - - - - - - 57 - 545 - 87 - 20 - - - 102 - 555 - - - - - - - - true - Contains a collection of Breps (Boundary REPresentations) - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPkSURBVEhL1VVbKOV7FN7ITnK/RYNcNrkrx11SbokHuWQyb0ryRN5ocuLBKadELsktHuTywKBcXgiRUiYvJOVSknNw5LK3OWbO9J31/famOWfPGPN0OqtW+7/r9/vWWt/61vpp/ivTWVhY3MsvfsBfi7/MbGxstvr6+rC+vo7V1VUsLi5ifn4eExMTGBoaQnNzM8rLy5GXl4eUlBQEBQVBEjqTq1ojwjNmZWWVLxc/DQ4OIiEhQXl8fDxiY2MRExOD6OhoREREICQkRAH7+/sjLCwMdnZ2ektLy7cmmG+a1tHR8Y/R0VEUFRWp7OjJyclISkrC8PAwHh4ecHNzg4WFBeTm5iIwMFB5QEAAJIBBMF4Zob5i1tbWv5SVlf3V0NCA1NRUpKWlPTmpOjw8RHd3N3p7e7G0tITb21v138/PT1UiyT0IVe9McGam8/T0/LO9vR0ZGRkKND09HZmZmVhbW4Ner0dnZycmJydRUVGBqqoq1NfX4+joSPWHQby9vdkLVvGTEfILE+5XSUtpaamihQEIzkYT/PLyEgy+ubmJ2tpa1eiBgQG0trbi4OAAXV1d8PLygrOz82cJ8t4E+2R5bm5uH0pKSlRTyTkDPGZO8OPjY4yPj2Nubg4rKysKfHp6Wp3hN+li5b6+vhAV6gXzjRFaGivZ/5aYmAg61cKGkvMvwXd2dlT2LS0tODs7U98E39vbw/7+vurJ7OwshGZFl1RxJdh2Gun8z66urh8ITglSiiMjIzAYDGbgBBkbG0NHRwfOz89xcXGhztB6enpwfX0NFxcXpSp3d3cO6q8aiXQdGhqqtE1nEIJfXV2Zgc/MzIASZrMbGxsVVScnJ9jY2FDKYsXSA3h4eCAqKorTfc0ALSIvQ2RkJB4D3d/fq4tfA+/v70dbWxuamppQWVmJ6upq9X93d1cFcXJyUjjSC2MF5Il8UcecTjozOz09fRa8rq5OSZWS3draUvwLLUpJnHzpq7EHJnuj1Wr1wcHBavwLCgpwd3eH5eXlF4OTFmZPFco3Z+FJRcqkivc8xJFnk3iJFfwIuE6nQ1xc3GeBM5sDWjx3CSVGp6qoEMqVqnkOnI2lerKysuDg4EDuzSeZJlW8k4MPrIBjz3K5BqioqakpNcE1NTXY3t7+R+YCquQtyvkoMN/cRbRXrIK98PHxUUNDz87OVhNM+bI3XBlsqKgP9vb26gzfBunj89vUZG+lZEN4eDhkfTy5DKOigXQ8Zi1vAGxtbdVSlKoJ/t33gKYVqn7nI/K4kwhAfnNyclSm+fn5KCwsRHFxMbi/uBTlzsteNJPxff33m/s9f/mb/D8yjeZvU880QlAx2/0AAAAASUVORK5CYII= - - e2677740-8f51-406f-9f0b-cb1c051ccf27 - - brepIN - true - 0 - true - 0 - 2ceb0405-fdfe-403d-a4d6-8786da45fb9d - - - - - - 57 - 565 - 87 - 20 - - - 102 - 575 - - - - - - - - true - Contains a collection of Extrusions - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQJSURBVEhL3VVJSGRXFC1HFMV5nudZnEecRRQ3xoUKFqIuBBeCC8GFaHqjLQqKC3HnsFHEEQRBHEAEERQUut0IojhbGimhraY7JJ68c6vLNEl3WrIJ5MDlL97/59x7z73va/4r/KTidxV4ZfBdfvMq2FpYWNytr6/j/v4ep6enODg4wMbGBiYnJzE4OIj29nbU1dUhLy8PkZGRcHV1pYhOhY0w/ABv6uvrP+3u7qKgoEBIsrOzkZmZidTUVCQlJSE2NhYREREIDQ1FYGAgfH19YW1tbVDf/myk+D587OzsDHt7e9BqtcjKypLIyMhAWloakpOTkZCQIALMPCwsDEFBQfDz84OHhweroIiPMH0LZmZmM6r83wYGBpCTk4Pc3FyJlpYWzM7O4vr6WmJqagoNDQ0IDw9HcHAwAgIC4O3tDVtb28+KZsbI9ndkqJc+jo2NoaSkBPn5+SgsLATFbm9vsbi4iImJCSwsLGBrawt3d3fo6upCSEiICPj4+MDd3R0qyY+KK91I+SfMzM3N3zc3Nz/X1tZK30lOIZ1Oh+7ubjG2p6cHw8PDUgGNZzUUoA8U8PT0hGrxs+J7R05h/gKtevGpsbFRDGVbaDBFiKWlJfT29qKzsxNDQ0NYW1vD1dWVnH1dAX1gq6ysrD4ozlojtUZjp7J/YLacFBpKEZMHxObmJk5OTnBzcwODwYCzszP09/fLGU3+WoBtoojifSA3jX2r5tjA6eCUcBQpwumhEMGRfXx8xMXFBVZXV6WKpqYmOaPJnCKSktzZ2VkEHR0d6cVbCuiZRVxcnIygSYRjmZ6eLiQU0Ov1OD8/x/LyMvr6+sB2EqY9YP+5cE5OTiLEPVECeqnA3t7eEBMT8yKSmJgoQgxiZ2dH2nN0dIT5+XkxnXtCmLJneyigMpcdUSKsoEeFxk6JPLCs6OhoEWHEx8dLEPTg+PgY+/v7cl1wPKurq+XMlL2pPRRjgor3F3JTgNDSeZYVFRUlQgxWRaysrODw8BDb29vgnnBkq6qq5MzLy0uyd3FxEQH6p9r0pDhfpohQRZi9U1k8837hhlKMwXGcm5sTH3gBjoyMoLW1Vbb78vJSyN3c3KT3/E5V/c09INLVuBrYKk4G55vR0dEh/ef9xBt1fHwc09PTQt7W1ibkzJxP7o26Ltj7NCPlX6CqmFGGf/b39weDYnzW1NQIMceUkzQ6OorKykoxleQODg4yeaq9vyqa795FBG9CA02jeVweBo1jsN80k2HqOcl5VlpaCktLy3++Tb/gjY2NzROzJyHFGOy1aVOZuUmAvS8uLuY+sDU//B8Qtip0zIrzzEnibqSkpLxcIUVFRSgrK0N5eTkqKirk3uI3Kl71RyP+zT+5QsX/DhrNH+hKzrIgQx7oAAAAAElFTkSuQmCC - - 167ec099-c721-4c47-9375-8f0af153c701 - - extrusionIN - true - 0 - true - 0 - 55816132-8684-4462-9786-df5a0e165430 - - - - - - 57 - 585 - 87 - 20 - - - 102 - 595 - - - - - - - - true - Contains a collection of point clouds - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAI/SURBVDhPrVNNSGJRGH0pZESgi8DxDzMwdCEEJiK2EDchMga6sr0hIQqCCKbLIHAhtFERCVczbtwE5UIsiAghxYVBgksxdZGgk2MOdube68DQ0MxiZg58vL97zvvO+e7l/jc+kpqRwm+KfqNr3sUSn8/vFgoF3Nzc4Pz8HPl8HplMBolEAkdHR3C73VSkS0rAGL8g6nQ6vxaLRdTrdUwmEzw9PSGXyyEUCiEQCMDr9UKlUj2TtZE55Scki4uLz8lkErVaDQ8PD0ilUuw6m82YWKVSgcfjwc7ODhYWFqjIhzmVgLz4vLu7++34+JgR0uk0YrEYIpEIWq0Wa//+/h6Xl5dMQCKRvBDapzmb47ZWVlbGtM1yuYzpdIpSqYRqtQoqSDOhNprNJuuk3W5DLpfTLMak9ByPx7vb2Nh4pR77/T4jnZ2dIR6PYzQa4fHxEQ6HA0ajEXq9nlnc29vD8vLyKxG4YwJE8ZW2eXV1xVqkdXp6il6vh8FgwLwbDAZsbm4yG36/H0KhcC5AsEVExtvb2xgOhzg8PITL5UI2mwXJBcFgENFoFOFwmFmhk9FqtSAjn1ugoCESxRefz8dGSEFtmEwm9ueLiws0Gg2cnJzAYrFALBa/CZFCQkcjk8mwtrYGnU6HTqeD6+tr3N7esnulUgmpVMqyIB2/HeMPRAUCwReFQsEWqtVqHBwcYH9/nz2LRCJYrVYq9O5Golgi1V1dXcX6+jo0Gg0LzWw2w2azseTtdvsftzLFPx2mvwDHfQd5R26d9WPu3AAAAABJRU5ErkJggg== - - a9a4f07d-33be-4958-8e39-d2e8dd99df23 - - pointcloudIN - true - 0 - true - 0 - d73c9fb0-365d-458f-9fb5-f4141399311f - - - - - - 57 - 605 - 87 - 20 - - - 102 - 615 - - - - - - - - true - Contains a collection of generic geometry - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAShSURBVEhL3VVbSFZpFFUTNVBMyEuWqKmZqWmalqkkaWZe0PCaZl4QJdPSLAWvYF6nvGaiqEgQPaSgEnhBFBTM8IZTgS8+CjkPEz3410wzseZb+/+bpmaagnmbDZtz/v+cb+1vr7X2d/T+awDQZ+p+fnc46+vrv1VXMI2NjWFqagpzc3OYmZnBwMBA/uf1L5nChd8VJiYmq319fVhaWsLKyook7xcWFjAzM4Ph4WHU1NTgwoULCAsLg7+/P3bt2vXK2dnZWAfx9VAvxkZHR//2+PFjZGdno6CgQK7M3NxcFBUVob6+XgqUlJQgODgYx44dg6urq8bIyKjyW3QZWVhY/Dw2NoZbt24hJiYGZ86cQWpqKrKyspCZmYnIyEj4+fkhPz8fd+/eRVVVFc6dOwcPDw84ODi8VevtdFh/j927dzdev379966uLgG+du0aBgYGMDQ0hCdPnmB8fBwTExPo7++XQrGxsWhvb5duAgICcPjw4feqyLjqwkAH+SlUey62tra/PHjwABEREaisrATvR0ZG0N3dLbS0tLRgampKtJienhYNLl26JEVIpQKHm5vbO7VRPx3sp1AF5i9fvoycnBzJ3t5eDA4OIikpCRkZGVKwuLgYp0+fRnNzM9bW1jA5OQlfX180NDSgsbFRxFZ6fLC2tv7xSy2irKys3uXl5SEwMBBNTU0Czh1y8fPnz7G5uYmtrS2sr6+Lcx4+fIjV1VXcuHEDKSkp6OjoQEJCAry9vXHo0CGNsm2aDlvPyNDQcPvUqVPC6/nz50U8UsKFz549kwK07eLiInZ2doS2xMREvHz5UgqdOHFCaLx69arQFBISQtu+VtimeqpS9d69e9+xAB9w1yygxEZpaan4v7OzE8ePHxfhGdvb22LNjY0N0USJi56eHty8eROKHoSHh8PGxoaD+oOemtg3R44cwdGjR8XT7IIck29a8enTp+IkAnp5eeHevXtCG9978eIFRkdH4e7ujvv376OwsBD79u3DyZMnhSpV4A0LtOzZs0fDxewiKCgItbW1uH37NkJDQzE7O4vl5WWhhF5XLpHNPHr0SCaccxAVFYXW1lZcvHhRKGKn9vb22g7Ikyry2snJSVzA3XBC29ra/rTr/Py8gNH/tCSPC/7mQLJ7vsMNcQCZNIHSVauBLlLV+bNDLn18fHD27FkZHgrNBWVlZQLKQpyBubk5EZdU0Ah37tzBlStXYGlpKZ0q/jXE1ELrQom9ph5IAXWuID09XahiUnz6nUcGkyK6uLjI2URwbkBZUyyunn0glg72s/BXbWkOHjwoRQiQlpaGiooKEb26uhqcEyaPEP5XV1cnhx81cXR0lPeVnuTeVwv5RSgtRpRlfyU4RadgFJ3tc5fkmqKWl5eLJXkWHThwgILK/CjnvCeGDu4fY79qT0MtuIiOYevqjBKv06pMT09P8iyW5Dt0lzri+WEi9/u1UF+PCnXkagiijg9J9SGRQkzqww55tbOzky8d7azeIXiFFuLfw0i1+RPt93G6CUBhSQN3GhcXh/j4eHFMcnKy2FKtecW1WohvR7JK+e5+TAXwWX75XCXX/O9CT+8PGjgO9AIw770AAAAASUVORK5CYII= - - 6723a5fe-2e96-42c5-8793-97a79d1364e2 - - geometrybaseIN - true - 0 - true - 0 - c37956f4-d39c-49c7-af71-1e87f8031b26 - - - - - - 57 - 625 - 87 - 20 - - - 102 - 635 - - - - - - - - The execution information, as output and error streams - 7a28daf9-b80f-43d1-b104-277848a24ec3 - out - out - false - 0 - - - - - - 174 - 45 - 63 - 300 - - - 205.5 - 195 - - - - - - - - false - No conversion - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== - - 89210f0e-52b1-422f-9902-7951d4400654 - - nohintOUT - false - 0 - true - 0 - 6a184b65-baa3-42d1-a548-3915b401de53 - - - - - - 174 - 345 - 63 - 300 - - - 205.5 - 495 - - - - - - - - - - IiIiR3Jhc3Nob3BwZXIgU2NyaXB0IiIiDQphID0gIkhlbGxvIFB5dGhvbiAzIGluIEdyYXNzaG9wcGVyISINCnByaW50KGEpDQo= - S - - - - - *.*.python - 3.-1 - - - - - - - - - - - c9b2d725-6f87-4b07-af90-bd9aefef68eb - 066d0a87-236f-4eae-a0f4-9e42f5327962 - Kitchen sink component example - - - - - This is an example with the everything and the kitchen sink in it, just to show all available options. - 2 - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAALiIAAC4iAari3ZIAAAPpSURBVEhLtVVpT5RnFDWxppEmAl202iX9UGtq6hZtbdqaVFuXD/0DNG0NsVarxGgTm9bE1NRYht1AhRGXYiX9ZqwOYmsiMAvLzADixjBDHGZQQBClMwwwGxzPfZlhVoof9CQX7vs8997zvs8995lZAJ6pKX9eLzRMa6/m659PV2k/T1Vpf3o5V/eHmPhpKu2mBfn6lGQ5Yk9EwOIpqdnajFfydBdWHzfZN1de84qtLjfZ5+fpNanZdd8wZm6y3BkJ+JZfv1fa1JlX70Rzrxu+4DhDJ+EPTqC1z42ixm4sKzN28mu+jc9nWHKC1woNs5lQvOtSB/o9PqmnYMQfxN5/bJB1jy8YWgUGR/3Yx3XmqJk7M8GLOdriw7ouyY3B7QEPUo7UYe6RWtzs94RWI8jll7JX6v8lSM/RZezQdEh8Aoz3XHi7uAHvlDTC1OMKrcZCctNztJnTEaQsKjA4lvzeiN/0Dnh4JNHYfPYaKm/cxyXbIDbRn5gIbRBe9ie/wYnFJQ1YWKDvZa1ULkcIRAk8wwxp6NnrfeAzlh5rgsb6AFLnvGUAn1a00JvEutMtONPWq/hCuFJtAiWLCq5JDdbK4laEgGe3gVK82NY3LDlK437414Y15Wa4fAGsYgE5ojBaqKoVaiMejgawosyIrGorBeFX9rqGxvBGkaGaboSAWv+Z2u7yUX7RGAuMs3kObLtogW1wBHddXvQN++D4b4wv0IkDV+9gOEpRgnGW+OhUs5VuhECmc0tlm1cCotHj9mIxG3ufcv1OY8FbR+uVRm8n4YMRP5aw4UIYDw6jk/8iBC/l6ipIkBC59Xw7DtbcUXxp+hd/XcdnZ1qn5kAa++W5W4ofjS3xBDyiA2vKTQ6Z0DBqux7hk9PNCEbJpaChGyoqLBofnDCjio0OQ8ITjohN3si7pfpG/2STs1mEx4Zfau2QNWm+mAyYWPhZ9g7V2cETUGIFTvbnzaL6y3QjBJTlC/Oy67YWG+9KDJZTGc/9WkMVmbC+onXKeLby+TFr7/ML5hyuAe8tJbfMfA+stZduhEAGTWZhWWmT0+UNwNzjhsrgwKOxgORMoYNKaueVEQ034+Wa0DmHFNWtPWke4EykcSuWQIwDkikX13TYdsGCr87dDj0l4scrneAt/L3U4mMiQYjkuLxRMuys6kDm3+2hp1iU8mhYvDJch0vJCeTKparUey5b4Y4bomQEIt/9k2/+5xNd12Fjwva1J8zdhfxRsT0c5YRO8LfAqhyT+PahUZRQFB+eNPcwdnd8/owEYgvy9POoiCzeLZqPTzVbeAE63j3W6BCfUqwStTAmLVluDMGztKSLT88w6zFUynsImAaGxQAAAABJRU5ErkJggg== - - e8b72c60-dc20-4902-b89f-e4df7c57d541 - true - Kitchen sink component example - Everything - - false - false - false - - - - - - 622 - 96 - 115 - 64 - - - 667 - 128 - - - - - - 3 - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 1 - 08908df5-fa14-4982-9ab2-1aa0927566aa - - - - - true - Contains a collection of floating point numbers - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVbKLVpFN7ITnI+s5HDdj6fz5QoUeSQiUgOF27dqb+GXIyo/0a4kUMhKfqLnENEOYWEFLlkxAwKGzN65n1ee+9+Y/7/N1fTrFrtr/1977PWetaz1qv4r0xtYGDwKH7xL/wn4R8zExOT7a6uLqyurmJ5eRnz8/OYmprC6Ogo+vr60NLSgpqaGuTk5CApKQk+Pj4QCZ2Lo8pXhO+YkZFRnjj4R29vL+Li4qTHxsYiOjoakZGRCAsLQ3BwMPz9/SWwp6cnAgMDYW5ufmdoaPhJC/NNU1paWv42NDSEwsJCmR09MTFRBmKQiIgIhISESFBfX194e3tL9/LygghwLzBUr1D/YMbGxr9UVlb+2djYiJSUFKSlpUnnM4OwkqioKFlFUFAQ/Pz8kJ6ejoaGBlmJSO5JUPVFC/fO1E5OTo9tbW3Izs5Ge3s7BgcHMTIyguHhYfkfq2CA8PBw5Obmor+/H6enp1hbW4ObmxtcXV3ZC1YR9Qr5lQnulwsKClBaWoqBgQFsbm4iIyMDWVlZuLy8xP7+PpKTk2WAmJgYVFdXo6enB+fn59jb25Pgzs7OsLa2fhFBtrWwesuxs7PTFBcXQ1AkM1pcXNRTdHBwAI1Gg9bW1jcUVVVV4erqCkdHRzKAYADu7u4QKrwTmKWv0KKxIvtf4+PjQW9ubsb29rYMoGsyAzw9PWFjY+NNkxng+voaJycnUKlUcHR0lEE8PDxI1e8C20whOv+zra2thuDMjLzu7u5iZmZGL1PS8/z8jIuLizcyJU03NzcygIuLCxwcHGBjYyNVJZ4fRIDPChHpJiAgQB6is6k7OzuYnp6WdNB1AR4fH+U3/J4SJZ26AOTf3t6ePZCBQkNDOd03DPBZyOueZfNgd3e3bPDExIRUC51NJDgr4DeUp1qtRkVFhaTo+PhY0iOYgJWVlfxGqIoVtApXmJEv6phl19fXY2VlBWNjY/qqWNHDwwOWlpZk5gTn92VlZVJhh4eHMnvSw0o4L6Kvrz3QWqlSqbzjYeqd4OPj4zIgfWtrC7e3t3KgyC/BqZaSkhKcnZ3JBHTZs2eCIs6CXkXSqF3x4oXZNTU1yeVGcMqRHDMIn7n8FhYWpGrYA75bX1+X4DwrZuRFwL2bA1osdwklxkrq6urQ0dEhe9LZ2SnlyWmdnZ3F5OQkamtr5XalpOfm5lBeXo78/HxYWFiQ+/eTTBNVfBE8PpEGDs7XzowpRXLMhpJzHS0CVG5aoZxnAfPNXURTsQpWwGw5NDonKOWnA2ZDhfq4puV73g2ij9/fplr7JLR8T77F+tC7DpQ612VtZmYGU1NTuVFF1QT/4X1AUwqqLrgKEhISkJqaKgEyMzPl4mOmeXl54GIsKioC9xeXojjzsRtNa7xf/37n/sg/fif/j0yh+AuVqtAmN2lbmQAAAABJRU5ErkJggg== - - 69cdabc9-5ea5-40d6-bbed-b3bfe862dde7 - X - x - true - true - 0 - true - f34a32b3-2d81-48e5-9626-3c2dd60edbf1 - 1 - 9d51e32e-c038-4352-9554-f4137ca91b9a - 1 - - - - - - 624 - 98 - 28 - 20 - - - 647.5 - 108 - - - - - - - - true - Contains a collection of floating point numbers - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVbKLVpFN7ITnI+s5HDdj6fz5QoUeSQiUgOF27dqb+GXIyo/0a4kUMhKfqLnENEOYWEFLlkxAwKGzN65n1ee+9+Y/7/N1fTrFrtr/1977PWetaz1qv4r0xtYGDwKH7xL/wn4R8zExOT7a6uLqyurmJ5eRnz8/OYmprC6Ogo+vr60NLSgpqaGuTk5CApKQk+Pj4QCZ2Lo8pXhO+YkZFRnjj4R29vL+Li4qTHxsYiOjoakZGRCAsLQ3BwMPz9/SWwp6cnAgMDYW5ufmdoaPhJC/NNU1paWv42NDSEwsJCmR09MTFRBmKQiIgIhISESFBfX194e3tL9/LygghwLzBUr1D/YMbGxr9UVlb+2djYiJSUFKSlpUnnM4OwkqioKFlFUFAQ/Pz8kJ6ejoaGBlmJSO5JUPVFC/fO1E5OTo9tbW3Izs5Ge3s7BgcHMTIyguHhYfkfq2CA8PBw5Obmor+/H6enp1hbW4ObmxtcXV3ZC1YR9Qr5lQnulwsKClBaWoqBgQFsbm4iIyMDWVlZuLy8xP7+PpKTk2WAmJgYVFdXo6enB+fn59jb25Pgzs7OsLa2fhFBtrWwesuxs7PTFBcXQ1AkM1pcXNRTdHBwAI1Gg9bW1jcUVVVV4erqCkdHRzKAYADu7u4QKrwTmKWv0KKxIvtf4+PjQW9ubsb29rYMoGsyAzw9PWFjY+NNkxng+voaJycnUKlUcHR0lEE8PDxI1e8C20whOv+zra2thuDMjLzu7u5iZmZGL1PS8/z8jIuLizcyJU03NzcygIuLCxwcHGBjYyNVJZ4fRIDPChHpJiAgQB6is6k7OzuYnp6WdNB1AR4fH+U3/J4SJZ26AOTf3t6ePZCBQkNDOd03DPBZyOueZfNgd3e3bPDExIRUC51NJDgr4DeUp1qtRkVFhaTo+PhY0iOYgJWVlfxGqIoVtApXmJEv6phl19fXY2VlBWNjY/qqWNHDwwOWlpZk5gTn92VlZVJhh4eHMnvSw0o4L6Kvrz3QWqlSqbzjYeqd4OPj4zIgfWtrC7e3t3KgyC/BqZaSkhKcnZ3JBHTZs2eCIs6CXkXSqF3x4oXZNTU1yeVGcMqRHDMIn7n8FhYWpGrYA75bX1+X4DwrZuRFwL2bA1osdwklxkrq6urQ0dEhe9LZ2SnlyWmdnZ3F5OQkamtr5XalpOfm5lBeXo78/HxYWFiQ+/eTTBNVfBE8PpEGDs7XzowpRXLMhpJzHS0CVG5aoZxnAfPNXURTsQpWwGw5NDonKOWnA2ZDhfq4puV73g2ij9/fplr7JLR8T77F+tC7DpQ612VtZmYGU1NTuVFF1QT/4X1AUwqqLrgKEhISkJqaKgEyMzPl4mOmeXl54GIsKioC9xeXojjzsRtNa7xf/37n/sg/fif/j0yh+AuVqtAmN2lbmQAAAABJRU5ErkJggg== - - 54277e48-30d4-4a6f-ab8b-900d88ea0d1d - Y - y - true - 0 - true - true - f34a32b3-2d81-48e5-9626-3c2dd60edbf1 - 1 - 9d51e32e-c038-4352-9554-f4137ca91b9a - - - - - - 624 - 118 - 28 - 20 - - - 647.5 - 128 - - - - - - - - true - Contains a collection of floating point numbers - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQiSURBVEhL1VVbKLVpFN7ITnI+s5HDdj6fz5QoUeSQiUgOF27dqb+GXIyo/0a4kUMhKfqLnENEOYWEFLlkxAwKGzN65n1ee+9+Y/7/N1fTrFrtr/1977PWetaz1qv4r0xtYGDwKH7xL/wn4R8zExOT7a6uLqyurmJ5eRnz8/OYmprC6Ogo+vr60NLSgpqaGuTk5CApKQk+Pj4QCZ2Lo8pXhO+YkZFRnjj4R29vL+Li4qTHxsYiOjoakZGRCAsLQ3BwMPz9/SWwp6cnAgMDYW5ufmdoaPhJC/NNU1paWv42NDSEwsJCmR09MTFRBmKQiIgIhISESFBfX194e3tL9/LygghwLzBUr1D/YMbGxr9UVlb+2djYiJSUFKSlpUnnM4OwkqioKFlFUFAQ/Pz8kJ6ejoaGBlmJSO5JUPVFC/fO1E5OTo9tbW3Izs5Ge3s7BgcHMTIyguHhYfkfq2CA8PBw5Obmor+/H6enp1hbW4ObmxtcXV3ZC1YR9Qr5lQnulwsKClBaWoqBgQFsbm4iIyMDWVlZuLy8xP7+PpKTk2WAmJgYVFdXo6enB+fn59jb25Pgzs7OsLa2fhFBtrWwesuxs7PTFBcXQ1AkM1pcXNRTdHBwAI1Gg9bW1jcUVVVV4erqCkdHRzKAYADu7u4QKrwTmKWv0KKxIvtf4+PjQW9ubsb29rYMoGsyAzw9PWFjY+NNkxng+voaJycnUKlUcHR0lEE8PDxI1e8C20whOv+zra2thuDMjLzu7u5iZmZGL1PS8/z8jIuLizcyJU03NzcygIuLCxwcHGBjYyNVJZ4fRIDPChHpJiAgQB6is6k7OzuYnp6WdNB1AR4fH+U3/J4SJZ26AOTf3t6ePZCBQkNDOd03DPBZyOueZfNgd3e3bPDExIRUC51NJDgr4DeUp1qtRkVFhaTo+PhY0iOYgJWVlfxGqIoVtApXmJEv6phl19fXY2VlBWNjY/qqWNHDwwOWlpZk5gTn92VlZVJhh4eHMnvSw0o4L6Kvrz3QWqlSqbzjYeqd4OPj4zIgfWtrC7e3t3KgyC/BqZaSkhKcnZ3JBHTZs2eCIs6CXkXSqF3x4oXZNTU1yeVGcMqRHDMIn7n8FhYWpGrYA75bX1+X4DwrZuRFwL2bA1osdwklxkrq6urQ0dEhe9LZ2SnlyWmdnZ3F5OQkamtr5XalpOfm5lBeXo78/HxYWFiQ+/eTTBNVfBE8PpEGDs7XzowpRXLMhpJzHS0CVG5aoZxnAfPNXURTsQpWwGw5NDonKOWnA2ZDhfq4puV73g2ij9/fplr7JLR8T77F+tC7DpQ612VtZmYGU1NTuVFF1QT/4X1AUwqqLrgKEhISkJqaKgEyMzPl4mOmeXl54GIsKioC9xeXojjzsRtNa7xf/37n/sg/fif/j0yh+AuVqtAmN2lbmQAAAABJRU5ErkJggg== - - 984bff6c-4c46-4295-b02b-482539db4206 - 1 - Z - z - true - 0 - true - f34a32b3-2d81-48e5-9626-3c2dd60edbf1 - 1 - 9d51e32e-c038-4352-9554-f4137ca91b9a - 1 - - - - - - 624 - 138 - 28 - 20 - - - 647.5 - 148 - - - - - - - - false - No conversion - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== - - 84441956-499f-4390-b645-c0399472f8d6 - 2 - result - result - false - 0 - true - 0 - 6a184b65-baa3-42d1-a548-3915b401de53 - - - - - - 682 - 98 - 53 - 60 - - - 700.5 - 128 - - - - - - - - - - IiIiCkRvIHNvbWV0aGluZyBzaWxseSBpbiBjcHkuCgpUaGlzIGNvbXBvbmVudCBkb2VzIG5vdGhpbmcgdXNlZnVsLCBpdCdzIG9ubHkgYSBraXRjaGVuIHNpbmsgKGJ1dCBpbiBjcHkpIGV4YW1wbGUgc2hvd2luZyBtb3N0IGF2YWlsYWJsZSBvcHRpb25zLgoKICAgIEFyZ3M6CiAgICAgICAgeDogWCB2YWx1ZQogICAgICAgIHk6IFkgdmFsdWUKICAgICAgICB6OiBaIHZhbHVlCiAgICBSZXR1cm5zOgogICAgICAgIHJlc3VsdDogVGhlIHN1bSBvZiBhbGwgdGhyZWUgdmFsdWVzLgoiIiIKZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CmltcG9ydCBTeXN0ZW0KaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBSaGlubwppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IHJoaW5vc2NyaXB0c3ludGF4IGFzIHJzCgoKY2xhc3MgTXlDb21wb25lbnQoY29tcG9uZW50KToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgeDogZmxvYXQsIHk6IGZsb2F0LCB6OiBmbG9hdCk6CiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk1lc3NhZ2UgPSBmIkNweSBWZXJzaW9uOiB7cGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKX0iCiAgICAgICAgcmVzdWx0ID0geCArIHkgKyB6CiAgICAgICAgcmV0dXJuIHJlc3VsdAo= - S - - - - - *.*.python - 3.-1 - - - - - - - - - - - 57da07bd-ecab-415d-9d86-af36d7073abc - Number Slider - - - - - Numeric slider for single values - f34a32b3-2d81-48e5-9626-3c2dd60edbf1 - Number Slider - - false - 0 - - - - - - 428 - 119 - 160 - 20 - - - 428.71396 - 119.202194 - - - - - - 3 - 1 - 1 - 100 - 0 - 0 - 0 - - - - - - - - - 59e0b89a-e487-49f8-bab8-b5bab16be14c - Panel - - - - - A panel for custom notes and text values - e8d2fbec-ef21-4d83-b1f0-b75714e3a9e1 - Panel - - false - 0 - 84441956-499f-4390-b645-c0399472f8d6 - 1 - Double click to edit panel content… - - - - - - 758 - 105 - 80 - 46 - - 0 - 0 - 0 - - 758.1729 - 105.996445 - - - - - - - 255;255;255;255 - - true - true - true - false - false - true - - - - - - - - - - - - - - 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 - - - - - \ No newline at end of file diff --git a/assets/unnamed_cpy.ghx b/assets/unnamed_cpy.ghx deleted file mode 100644 index 2672b85..0000000 --- a/assets/unnamed_cpy.ghx +++ /dev/null @@ -1,192 +0,0 @@ - - - c9b2d725-6f87-4b07-af90-bd9aefef68eb - 066d0a87-236f-4eae-a0f4-9e42f5327962 - Script - - - - - Scripting component - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQdSURBVEhL3ZRbTJtlHMbxwmTGxCjRMONkbkx0Y0P6tf3aDhgCkwyXbcTordELl6gcC4NxGitgvFiM0ZuFHiiHcj5LCwgUWuuQOdyBEVd1rjB3p3HgIcRo/o//9/s+IFzWmJj4JP+0Td739z553udtzH8q6d3mQ7oCh1OX7wjrCpw/pxS6/tIVun+UrJ6w3tphl0t79mhLo5eUb09n8P2UfGcTg1el4hZIxa1gMPSlXTCU98FQ1vOHVDXwpLYlOqUUOBqEe/FdKmxx6a0ehntgONOrwnmMlcMwnB2uUzZEK12By87O13VFrV7J2rm+4dpYMQDj2SGeQchVo5BrvB5tS3SSClrKpOL2gFTaydMV0Jf1BhgeMJQP/Cmcy9UMrx3nA8ajO0BvbXrcYG1+2mDt2j7VQ+pUDv8k1/hgYripbhImm99DK3kJPE5aPlFOSzmxGmq7+EJf4YZclkraoC/r4unmvHtgqOhXI6kcYbdjCliu5U+Gm20zMNXPeuhengV3TgDf5gJLR1exmPaYhlUlHEuFzb9JJe1qQwRYuUgBF1l/osEnVOfnpxk+qxxgbgi66Pvj6QgfA25mA1czQPOHqzS0Kq6fU3W80RAGi8sUrkXWm5FMqc7rA7A0BGFpDMHUGMqlcM7buJEFLBwBvrCAgoY5Da1KX9p5fdO10pJBGIXrjTiEc4abz/sZPquAzY2hdUtDyHF37tVYupZ5B1+mAXNmIGAATSbfB2Ie0PAc0Zne31UwZ10lsvbBWDu2bKr79PTrH3ky3SONr7m9Yt5Xh38vXXoji24e/QBXj6zicioQkoEZCZhMBrwHAPfuHRqeD6jo/0FxrMVhrPatZ703EsfNuMDzC+7mQZmVU8Dt41DyXuS8v1IjwWdGwK8DJg4Bo8+DBvZ9p6FV8Wuclqu9ataieucmXVjJS9sEi1k+yS15Gfg6B7ieCVxJVyMJMnzqBWD8IDDyHNCfAHTFt2hoVaYaX9HGJZq5ISbbdC47/3gTHuEKfqNUELj2IpS8LzF8Vq9GMpYEDCcCfXuBznhQW9xBDa3KXNLzkHxu4p5ygM0Pi20mm1ZO2RX4RiRcQVrIIJpPJQrKRH6JaCKZaPQA0WAiUfczRO27bpEr7k0Nu11y3dgjJtvMO+b6YFtqfSiJInyAgItIuIJ0Jf1Xbem/Iwofs2PpJTUSkTdHQgF9hKaSI+RLitBIYoT6EiLUEf+htiU60WK2XbxKpYKfm7byHt0PGkpco569DurYtUYtO//Zvynn/RbmD3MFud9+7ve4qOB+YPBZUPduu7LGvdNBTbFFyoZohdmMHfzkb2E6ZauCA/tEBUGtT62RM85BF2Nv0IW4h7Ut0QsL+gf5VZ6m4UQf9e25zZGscyRhsj/hpYuP5sMds/Va/6eKifkb1QMSMlhsgFAAAAAASUVORK5CYII= - - 1d7e8eb9-8214-4016-8b53-2821a2ad5c7e - true - Script - S - - false - false - true - - - - - - 33 - 83 - 134 - 44 - - - 124 - 105 - - - - - - 2 - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 2 - 3ede854e-c753-40eb-84cb-b48008f14fd4 - 08908df5-fa14-4982-9ab2-1aa0927566aa - - - - - true - No conversion - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== - - eb160794-2ba0-4d2c-80fc-6e99cc683047 - - compasnew_x - true - 0 - true - 0 - 6a184b65-baa3-42d1-a548-3915b401de53 - - - - - - 35 - 85 - 74 - 20 - - - 73.5 - 95 - - - - - - - - true - No conversion - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== - - 75bfb3d0-3f57-4470-965d-079319d0ff9f - y - y - true - 0 - true - 0 - 6a184b65-baa3-42d1-a548-3915b401de53 - - - - - - 35 - 105 - 74 - 20 - - - 73.5 - 115 - - - - - - - - The execution information, as output and error streams - 19be98d8-069e-4240-b172-af9cb83b8dc0 - out - out - false - 0 - - - - - - 139 - 85 - 26 - 20 - - - 152 - 95 - - - - - - - - false - No conversion - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== - - 0d6f139a-f87b-46ce-b5ea-9b0b0c8e5c61 - a - a - false - 0 - true - 0 - 6a184b65-baa3-42d1-a548-3915b401de53 - - - - - - 139 - 105 - 26 - 20 - - - 152 - 115 - - - - - - - - - - IiIiVGhpcyBpcyBhIG5ldyBzY3JpcHQgaW5zdGFuY2UiIiINCmltcG9ydCBTeXN0ZW0NCmltcG9ydCBSaGlubw0KaW1wb3J0IEdyYXNzaG9wcGVyDQoNCmltcG9ydCByaGlub3NjcmlwdHN5bnRheCBhcyBycw0KDQoNCmNsYXNzIE15Q29tcG9uZW50KEdyYXNzaG9wcGVyLktlcm5lbC5HSF9TY3JpcHRJbnN0YW5jZSk6DQogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBjb21wYXNuZXdfeCwgeSk6DQogICAgICAgICIiIkdyYXNzaG9wcGVyIFNjcmlwdCBjb21wYXMgYWN0aW9uIiIiDQogICAgICAgIGEgPSAiSGVsbG8gUHl0aG9uIDMgaW4gR3Jhc3Nob3BwZXIhIg0KICAgICAgICBwcmludChhKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuDQo= - S - - - - - mcneel.pythonnet.python - 3.9.10 - - - - - - - - \ No newline at end of file diff --git a/assets/unnamed_fullfile.ghx b/assets/unnamed_fullfile.ghx deleted file mode 100644 index 5f1beaf..0000000 --- a/assets/unnamed_fullfile.ghx +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - - 0 - 2 - 2 - - - - - - - 1 - 0 - 7 - - - - - - cfdd9c76-c721-4e43-b0f7-236cc4a885cb - Shaded - 1 - - 100;255;0;0 - - - 100;0;150;0 - - - - - - 638411238108069159 - - false - unnamed.ghx - - - - - 0 - - - - - - 87 - 224 - - 1.5 - - - - - 0 - - - - - - - 0 - - - - - 2 - - - - - RhinoCodePluginGH, Version=8.2.23346.13001, Culture=neutral, PublicKeyToken=552281e97c755530 - 8.2.23346.13001 - - 066d0a87-236f-4eae-a0f4-9e42f5327962 - RhinoCodePluginGH - - - - - - GhPython, Version=8.2.23346.13001, Culture=neutral, PublicKeyToken=null - 8.2.23346.13001 - - 00000000-0000-0000-0000-000000000000 - - - - - - - - - 2 - - - - - c9b2d725-6f87-4b07-af90-bd9aefef68eb - 066d0a87-236f-4eae-a0f4-9e42f5327962 - Script - - - - - Scripting component - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQdSURBVEhL3ZRbTJtlHMbxwmTGxCjRMONkbkx0Y0P6tf3aDhgCkwyXbcTordELl6gcC4NxGitgvFiM0ZuFHiiHcj5LCwgUWuuQOdyBEVd1rjB3p3HgIcRo/o//9/s+IFzWmJj4JP+0Td739z553udtzH8q6d3mQ7oCh1OX7wjrCpw/pxS6/tIVun+UrJ6w3tphl0t79mhLo5eUb09n8P2UfGcTg1el4hZIxa1gMPSlXTCU98FQ1vOHVDXwpLYlOqUUOBqEe/FdKmxx6a0ehntgONOrwnmMlcMwnB2uUzZEK12By87O13VFrV7J2rm+4dpYMQDj2SGeQchVo5BrvB5tS3SSClrKpOL2gFTaydMV0Jf1BhgeMJQP/Cmcy9UMrx3nA8ajO0BvbXrcYG1+2mDt2j7VQ+pUDv8k1/hgYripbhImm99DK3kJPE5aPlFOSzmxGmq7+EJf4YZclkraoC/r4unmvHtgqOhXI6kcYbdjCliu5U+Gm20zMNXPeuhengV3TgDf5gJLR1exmPaYhlUlHEuFzb9JJe1qQwRYuUgBF1l/osEnVOfnpxk+qxxgbgi66Pvj6QgfA25mA1czQPOHqzS0Kq6fU3W80RAGi8sUrkXWm5FMqc7rA7A0BGFpDMHUGMqlcM7buJEFLBwBvrCAgoY5Da1KX9p5fdO10pJBGIXrjTiEc4abz/sZPquAzY2hdUtDyHF37tVYupZ5B1+mAXNmIGAATSbfB2Ie0PAc0Zne31UwZ10lsvbBWDu2bKr79PTrH3ky3SONr7m9Yt5Xh38vXXoji24e/QBXj6zicioQkoEZCZhMBrwHAPfuHRqeD6jo/0FxrMVhrPatZ703EsfNuMDzC+7mQZmVU8Dt41DyXuS8v1IjwWdGwK8DJg4Bo8+DBvZ9p6FV8Wuclqu9ataieucmXVjJS9sEi1k+yS15Gfg6B7ieCVxJVyMJMnzqBWD8IDDyHNCfAHTFt2hoVaYaX9HGJZq5ISbbdC47/3gTHuEKfqNUELj2IpS8LzF8Vq9GMpYEDCcCfXuBznhQW9xBDa3KXNLzkHxu4p5ygM0Pi20mm1ZO2RX4RiRcQVrIIJpPJQrKRH6JaCKZaPQA0WAiUfczRO27bpEr7k0Nu11y3dgjJtvMO+b6YFtqfSiJInyAgItIuIJ0Jf1Xbem/Iwofs2PpJTUSkTdHQgF9hKaSI+RLitBIYoT6EiLUEf+htiU60WK2XbxKpYKfm7byHt0PGkpco569DurYtUYtO//Zvynn/RbmD3MFud9+7ve4qOB+YPBZUPduu7LGvdNBTbFFyoZohdmMHfzkb2E6ZauCA/tEBUGtT62RM85BF2Nv0IW4h7Ut0QsL+gf5VZ6m4UQf9e25zZGscyRhsj/hpYuP5sMds/Va/6eKifkb1QMSMlhsgFAAAAAASUVORK5CYII= - - 1d7e8eb9-8214-4016-8b53-2821a2ad5c7e - true - Script - S - - false - false - true - - - - - - 33 - 83 - 134 - 44 - - - 124 - 105 - - - - - - 2 - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 2 - 3ede854e-c753-40eb-84cb-b48008f14fd4 - 08908df5-fa14-4982-9ab2-1aa0927566aa - - - - - true - No conversion - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== - - eb160794-2ba0-4d2c-80fc-6e99cc683047 - - compasnew_x - true - 0 - true - 0 - 6a184b65-baa3-42d1-a548-3915b401de53 - - - - - - 35 - 85 - 74 - 20 - - - 73.5 - 95 - - - - - - - - true - No conversion - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== - - 75bfb3d0-3f57-4470-965d-079319d0ff9f - y - y - true - 0 - true - 0 - 6a184b65-baa3-42d1-a548-3915b401de53 - - - - - - 35 - 105 - 74 - 20 - - - 73.5 - 115 - - - - - - - - The execution information, as output and error streams - 19be98d8-069e-4240-b172-af9cb83b8dc0 - out - out - false - 0 - - - - - - 139 - 85 - 26 - 20 - - - 152 - 95 - - - - - - - - false - No conversion - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== - - 0d6f139a-f87b-46ce-b5ea-9b0b0c8e5c61 - a - a - false - 0 - true - 0 - 6a184b65-baa3-42d1-a548-3915b401de53 - - - - - - 139 - 105 - 26 - 20 - - - 152 - 115 - - - - - - - - - - IiIiVGhpcyBpcyBhIG5ldyBzY3JpcHQgaW5zdGFuY2UiIiINCmltcG9ydCBTeXN0ZW0NCmltcG9ydCBSaGlubw0KaW1wb3J0IEdyYXNzaG9wcGVyDQoNCmltcG9ydCByaGlub3NjcmlwdHN5bnRheCBhcyBycw0KDQoNCmNsYXNzIE15Q29tcG9uZW50KEdyYXNzaG9wcGVyLktlcm5lbC5HSF9TY3JpcHRJbnN0YW5jZSk6DQogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBjb21wYXNuZXdfeCwgeSk6DQogICAgICAgICIiIkdyYXNzaG9wcGVyIFNjcmlwdCBjb21wYXMgYWN0aW9uIiIiDQogICAgICAgIGEgPSAiSGVsbG8gUHl0aG9uIDMgaW4gR3Jhc3Nob3BwZXIhIg0KICAgICAgICBwcmludChhKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuDQo= - S - - - - - mcneel.pythonnet.python - 3.9.10 - - - - - - - - - - - 410755b1-224a-4c1e-a407-bf32fb45ea7e - 00000000-0000-0000-0000-000000000000 - Kitchen sink component example - - - - - """ -Do something silly. - -This component does nothing useful, it's only a kitchen sink example showing most available options. - - Args: - x: X value - y: Y value - z: Z value - Returns: - result: The sum of all three values. -""" -from ghpythonlib.componentbase import executingcomponent as component - - -class KitchenSinkComponent(component): - def RunScript(self, x, y, z): - self.Message = 'COMPONENT v{{version}}' - return x + y + z - - Do something silly. -This component does nothing useful, it's only a kitchen sink example showing most available options. - - 342 - 342 - - - 925 - 1079 - - true - true - 2 - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAALiIAAC4iAari3ZIAAAPpSURBVEhLtVVpT5RnFDWxppEmAl202iX9UGtq6hZtbdqaVFuXD/0DNG0NsVarxGgTm9bE1NRYht1AhRGXYiX9ZqwOYmsiMAvLzADixjBDHGZQQBClMwwwGxzPfZlhVoof9CQX7vs8997zvs8995lZAJ6pKX9eLzRMa6/m659PV2k/T1Vpf3o5V/eHmPhpKu2mBfn6lGQ5Yk9EwOIpqdnajFfydBdWHzfZN1de84qtLjfZ5+fpNanZdd8wZm6y3BkJ+JZfv1fa1JlX70Rzrxu+4DhDJ+EPTqC1z42ixm4sKzN28mu+jc9nWHKC1woNs5lQvOtSB/o9PqmnYMQfxN5/bJB1jy8YWgUGR/3Yx3XmqJk7M8GLOdriw7ouyY3B7QEPUo7UYe6RWtzs94RWI8jll7JX6v8lSM/RZezQdEh8Aoz3XHi7uAHvlDTC1OMKrcZCctNztJnTEaQsKjA4lvzeiN/0Dnh4JNHYfPYaKm/cxyXbIDbRn5gIbRBe9ie/wYnFJQ1YWKDvZa1ULkcIRAk8wwxp6NnrfeAzlh5rgsb6AFLnvGUAn1a00JvEutMtONPWq/hCuFJtAiWLCq5JDdbK4laEgGe3gVK82NY3LDlK437414Y15Wa4fAGsYgE5ojBaqKoVaiMejgawosyIrGorBeFX9rqGxvBGkaGaboSAWv+Z2u7yUX7RGAuMs3kObLtogW1wBHddXvQN++D4b4wv0IkDV+9gOEpRgnGW+OhUs5VuhECmc0tlm1cCotHj9mIxG3ufcv1OY8FbR+uVRm8n4YMRP5aw4UIYDw6jk/8iBC/l6ipIkBC59Xw7DtbcUXxp+hd/XcdnZ1qn5kAa++W5W4ofjS3xBDyiA2vKTQ6Z0DBqux7hk9PNCEbJpaChGyoqLBofnDCjio0OQ8ITjohN3si7pfpG/2STs1mEx4Zfau2QNWm+mAyYWPhZ9g7V2cETUGIFTvbnzaL6y3QjBJTlC/Oy67YWG+9KDJZTGc/9WkMVmbC+onXKeLby+TFr7/ML5hyuAe8tJbfMfA+stZduhEAGTWZhWWmT0+UNwNzjhsrgwKOxgORMoYNKaueVEQ034+Wa0DmHFNWtPWke4EykcSuWQIwDkikX13TYdsGCr87dDj0l4scrneAt/L3U4mMiQYjkuLxRMuys6kDm3+2hp1iU8mhYvDJch0vJCeTKparUey5b4Y4bomQEIt/9k2/+5xNd12Fjwva1J8zdhfxRsT0c5YRO8LfAqhyT+PahUZRQFB+eNPcwdnd8/owEYgvy9POoiCzeLZqPTzVbeAE63j3W6BCfUqwStTAmLVluDMGztKSLT88w6zFUynsImAaGxQAAAABJRU5ErkJggg== - - false - 012ecff8-abad-4d60-a6e1-4ffa79e66b93 - true - true - Kitchen sink component example - Everything - - - - - - 53 - 182 - 173 - 64 - - - 156 - 214 - - true - - - - - 3 - 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 - 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 - 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 - 1 - 8ec86459-bf01-4409-baee-174d0d2b13d0 - - - - - true - X value - 9ee5242a-881b-4d88-bf62-0ec3cb2650d1 - x - compasold_x - true - true - 0 - true - 0 - 39fbc626-7a01-46ab-a18e-ec1c0c41685b - 1 - - - - - - 55 - 184 - 86 - 20 - - - 107.5 - 194 - - true - - - - - - - true - Y value - abb8246c-4353-4d67-ab37-944eb9d708a5 - y - y - true - 0 - true - true - 0 - 39fbc626-7a01-46ab-a18e-ec1c0c41685b - - - - - - 55 - 204 - 86 - 20 - - - 107.5 - 214 - - true - - - - - - - true - Z value - 23bdcf15-b128-43b9-83b9-b88b280a0594 - 1 - z - z - true - 0 - true - 0 - 39fbc626-7a01-46ab-a18e-ec1c0c41685b - 1 - - - - - - 55 - 224 - 86 - 20 - - - 107.5 - 234 - - true - - - - - - - The sum of all three values. - 99dd5a96-0a5c-4eab-b6e3-307974766460 - 2 - result - result - false - 0 - - - - - - 171 - 184 - 53 - 60 - - - 189.5 - 214 - - true - - - - - - - - - - - - - - - - - - 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 - - - - - \ No newline at end of file diff --git a/assets/unnamed_ipy.ghx b/assets/unnamed_ipy.ghx deleted file mode 100644 index b0c1067..0000000 --- a/assets/unnamed_ipy.ghx +++ /dev/null @@ -1,210 +0,0 @@ - - - 410755b1-224a-4c1e-a407-bf32fb45ea7e - 00000000-0000-0000-0000-000000000000 - Kitchen sink component example - - - - - """ -Do something silly. - -This component does nothing useful, it's only a kitchen sink example showing most available options. - -Args: -x: X value -y: Y value -z: Z value -Returns: -result: The sum of all three values. -""" -from ghpythonlib.componentbase import executingcomponent as component - - -class KitchenSinkComponent(component): -def RunScript(self, x, y, z): -self.Message = 'COMPONENT v{{version}}' -return x + y + z - - Do something silly. -This component does nothing useful, it's only a kitchen sink example showing most available options. - - 342 - 342 - - - 925 - 1079 - - true - true - 2 - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAALiIAAC4iAari3ZIAAAPpSURBVEhLtVVpT5RnFDWxppEmAl202iX9UGtq6hZtbdqaVFuXD/0DNG0NsVarxGgTm9bE1NRYht1AhRGXYiX9ZqwOYmsiMAvLzADixjBDHGZQQBClMwwwGxzPfZlhVoof9CQX7vs8997zvs8995lZAJ6pKX9eLzRMa6/m659PV2k/T1Vpf3o5V/eHmPhpKu2mBfn6lGQ5Yk9EwOIpqdnajFfydBdWHzfZN1de84qtLjfZ5+fpNanZdd8wZm6y3BkJ+JZfv1fa1JlX70Rzrxu+4DhDJ+EPTqC1z42ixm4sKzN28mu+jc9nWHKC1woNs5lQvOtSB/o9PqmnYMQfxN5/bJB1jy8YWgUGR/3Yx3XmqJk7M8GLOdriw7ouyY3B7QEPUo7UYe6RWtzs94RWI8jll7JX6v8lSM/RZezQdEh8Aoz3XHi7uAHvlDTC1OMKrcZCctNztJnTEaQsKjA4lvzeiN/0Dnh4JNHYfPYaKm/cxyXbIDbRn5gIbRBe9ie/wYnFJQ1YWKDvZa1ULkcIRAk8wwxp6NnrfeAzlh5rgsb6AFLnvGUAn1a00JvEutMtONPWq/hCuFJtAiWLCq5JDdbK4laEgGe3gVK82NY3LDlK437414Y15Wa4fAGsYgE5ojBaqKoVaiMejgawosyIrGorBeFX9rqGxvBGkaGaboSAWv+Z2u7yUX7RGAuMs3kObLtogW1wBHddXvQN++D4b4wv0IkDV+9gOEpRgnGW+OhUs5VuhECmc0tlm1cCotHj9mIxG3ufcv1OY8FbR+uVRm8n4YMRP5aw4UIYDw6jk/8iBC/l6ipIkBC59Xw7DtbcUXxp+hd/XcdnZ1qn5kAa++W5W4ofjS3xBDyiA2vKTQ6Z0DBqux7hk9PNCEbJpaChGyoqLBofnDCjio0OQ8ITjohN3si7pfpG/2STs1mEx4Zfau2QNWm+mAyYWPhZ9g7V2cETUGIFTvbnzaL6y3QjBJTlC/Oy67YWG+9KDJZTGc/9WkMVmbC+onXKeLby+TFr7/ML5hyuAe8tJbfMfA+stZduhEAGTWZhWWmT0+UNwNzjhsrgwKOxgORMoYNKaueVEQ034+Wa0DmHFNWtPWke4EykcSuWQIwDkikX13TYdsGCr87dDj0l4scrneAt/L3U4mMiQYjkuLxRMuys6kDm3+2hp1iU8mhYvDJch0vJCeTKparUey5b4Y4bomQEIt/9k2/+5xNd12Fjwva1J8zdhfxRsT0c5YRO8LfAqhyT+PahUZRQFB+eNPcwdnd8/owEYgvy9POoiCzeLZqPTzVbeAE63j3W6BCfUqwStTAmLVluDMGztKSLT88w6zFUynsImAaGxQAAAABJRU5ErkJggg== - - false - 012ecff8-abad-4d60-a6e1-4ffa79e66b93 - true - true - Kitchen sink component example - Everything - - - - - - 53 - 182 - 173 - 64 - - - 156 - 214 - - true - - - - - 3 - 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 - 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 - 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 - 1 - 8ec86459-bf01-4409-baee-174d0d2b13d0 - - - - - true - X value - 9ee5242a-881b-4d88-bf62-0ec3cb2650d1 - x - compasold_x - true - true - 0 - true - 0 - 39fbc626-7a01-46ab-a18e-ec1c0c41685b - 1 - - - - - - 55 - 184 - 86 - 20 - - - 107.5 - 194 - - true - - - - - - - true - Y value - abb8246c-4353-4d67-ab37-944eb9d708a5 - y - y - true - 0 - true - true - 0 - 39fbc626-7a01-46ab-a18e-ec1c0c41685b - - - - - - 55 - 204 - 86 - 20 - - - 107.5 - 214 - - true - - - - - - - true - Z value - 23bdcf15-b128-43b9-83b9-b88b280a0594 - 1 - z - z - true - 0 - true - 0 - 39fbc626-7a01-46ab-a18e-ec1c0c41685b - 1 - - - - - - 55 - 224 - 86 - 20 - - - 107.5 - 234 - - true - - - - - - - The sum of all three values. - 99dd5a96-0a5c-4eab-b6e3-307974766460 - 2 - result - result - false - 0 - - - - - - 171 - 184 - 53 - 60 - - - 189.5 - 214 - - true - - - - - - - - - - \ No newline at end of file diff --git a/.github/actions/ghpython-components/componentize.py b/componentize.py similarity index 100% rename from .github/actions/ghpython-components/componentize.py rename to componentize.py From 24b1bac02fab83a8f1c441a87fbfa7e98d4bb26a Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Sun, 21 Jan 2024 22:19:19 +0100 Subject: [PATCH 16/35] FIX: wrong action path from build solved --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 60c3177..ca5f95e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,8 +18,8 @@ jobs: run: | pip install pythonnet - - name: Run the action in root - uses: ./action + - name: Run + uses: ./ with: source: examples target: build From 47d191672bf5cc4c1af6994252d0a1cc2abda4aa Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 16:40:50 +0100 Subject: [PATCH 17/35] WIP:integrated minor modifications from ccde review --- action.yml | 2 -- componentize.py | 8 +++----- examples/TestCpy_KitchenSink/code.py | 1 + examples/Test_KitchenSink/code.py | 4 +--- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/action.yml b/action.yml index 01284ef..b2ce685 100644 --- a/action.yml +++ b/action.yml @@ -1,5 +1,3 @@ -# This action was implemented from the [compass componentizer](https://github.com/compas-dev/compas-actions.ghpython_components/tree/main). We retain no credit for the code, and only modified it to work with our own repository. - name: 'Grasshopper componentizer' description: 'Create GHUser components from Python source code' inputs: diff --git a/componentize.py b/componentize.py index d857b0c..01e7ea7 100644 --- a/componentize.py +++ b/componentize.py @@ -14,7 +14,7 @@ import System.IO -GHPYTHON_SCRIPT_GUID = System.Guid("c9b2d725-6f87-4b07-af90-bd9aefef68eb") +SCRIPT_COMPONENT_GUID = System.Guid("c9b2d725-6f87-4b07-af90-bd9aefef68eb") CPY_VER = "3.-1" TEMPLATE_VER = re.compile("{{version}}") TEMPLATE_NAME = re.compile("{{name}}") @@ -232,7 +232,7 @@ def create_ghuser_component(source, target, version=None, prefix=None): prefix = prefix or "" root = GH_LooseChunk("UserObject") - root.SetGuid("BaseID", GHPYTHON_SCRIPT_GUID) + root.SetGuid("BaseID", SCRIPT_COMPONENT_GUID) root.SetString("Name", prefix + data["name"]) root.SetString("NickName", data["nickname"]) root.SetString("Description", data.get("description", "")) @@ -393,9 +393,7 @@ def create_ghuser_component(source, target, version=None, prefix=None): print("[-] Cannot find GH_IO Assembly! Aborting.") sys.exit(-1) - gh_io = os.path.abspath(gh_io) - gh_io = gh_io[:-4] - clr.AddReference(gh_io) + clr.AddReference(os.path.splitext(gh_io)[0]) print("[x] GH_IO assembly: {}".format(gh_io)) diff --git a/examples/TestCpy_KitchenSink/code.py b/examples/TestCpy_KitchenSink/code.py index 5efb3c3..ce003e8 100644 --- a/examples/TestCpy_KitchenSink/code.py +++ b/examples/TestCpy_KitchenSink/code.py @@ -11,6 +11,7 @@ result: The sum of all three values. """ from ghpythonlib.componentbase import executingcomponent as component + import System import platform import Rhino diff --git a/examples/Test_KitchenSink/code.py b/examples/Test_KitchenSink/code.py index 6961b81..96a41ea 100644 --- a/examples/Test_KitchenSink/code.py +++ b/examples/Test_KitchenSink/code.py @@ -16,6 +16,4 @@ class KitchenSinkComponent(component): def RunScript(self, x, y, z): self.Message = 'COMPONENT v{{version}}' - return x + y + z - - \ No newline at end of file + return x + y + z \ No newline at end of file From 214fa46034bed2b5945a1f9b7b5c3e4ac0edaea0 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 16:47:40 +0100 Subject: [PATCH 18/35] WIP: testing reformat CI --- .github/workflows/build.yml | 10 +++------- action.yml | 35 +++++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ca5f95e..8ca0dcc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,13 +10,9 @@ jobs: - uses: actions/checkout@v2 - uses: NuGet/setup-nuget@v1.0.5 - - name: Install Python3 - uses: actions/setup-python@v2 - with: - python-version: '3.9.10' - - name: Install pythonnet - run: | - pip install pythonnet + # - name: Install IronPython + # run: | + # choco install ironpython --version=2.7.8.1 - name: Run uses: ./ diff --git a/action.yml b/action.yml index b2ce685..35fbcfd 100644 --- a/action.yml +++ b/action.yml @@ -13,18 +13,29 @@ inputs: runs: using: 'composite' steps: - - run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json - shell: pwsh - - run: | - $command="python" - $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib" - $prefix="${{ inputs.prefix }}" - if( $prefix ) - { - $params=$params + "--prefix", "$prefix" - } - & $command $params - shell: pwsh + - name: Install Python3 + uses: actions/setup-python@v2 + with: + python-version: '3.9.10' + - name: Install pythonnet + run: | + pip install pythonnet + + - name: Install Grasshopper + run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json + shell: pwsh + + - name: Call componentizer + run: | + $command="python" + $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib" + $prefix="${{ inputs.prefix }}" + if( $prefix ) + { + $params=$params + "--prefix", "$prefix" + } + & $command $params + shell: pwsh branding: icon: 'box' color: 'orange' From 02a4a40041c36ff5814ffe9dd45deb298d23dcaf Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 16:49:15 +0100 Subject: [PATCH 19/35] WIP: testing reformat CI x2 --- .github/workflows/build.yml | 14 +++++++++++--- action.yml | 35 ++++++++++++----------------------- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8ca0dcc..b697931 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,9 +10,17 @@ jobs: - uses: actions/checkout@v2 - uses: NuGet/setup-nuget@v1.0.5 - # - name: Install IronPython - # run: | - # choco install ironpython --version=2.7.8.1 + - name: Install IronPython + run: | + choco install ironpython --version=2.7.8.1 + + - name: Install Python3 + uses: actions/setup-python@v2 + with: + python-version: '3.9.10' + - name: Install pythonnet + run: | + pip install pythonnet - name: Run uses: ./ diff --git a/action.yml b/action.yml index 35fbcfd..b2ce685 100644 --- a/action.yml +++ b/action.yml @@ -13,29 +13,18 @@ inputs: runs: using: 'composite' steps: - - name: Install Python3 - uses: actions/setup-python@v2 - with: - python-version: '3.9.10' - - name: Install pythonnet - run: | - pip install pythonnet - - - name: Install Grasshopper - run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json - shell: pwsh - - - name: Call componentizer - run: | - $command="python" - $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib" - $prefix="${{ inputs.prefix }}" - if( $prefix ) - { - $params=$params + "--prefix", "$prefix" - } - & $command $params - shell: pwsh + - run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json + shell: pwsh + - run: | + $command="python" + $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib" + $prefix="${{ inputs.prefix }}" + if( $prefix ) + { + $params=$params + "--prefix", "$prefix" + } + & $command $params + shell: pwsh branding: icon: 'box' color: 'orange' From 69e3cadd469903dcf8e0c02f1ec6b8703d21fe61 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 20:53:13 +0100 Subject: [PATCH 20/35] WIP: testing out dual branch --- .github/workflows/build.yml | 26 +++++++++++++------------- action.yml | 14 +++++++++++++- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b697931..782b546 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,24 +3,24 @@ name: build on: [push] jobs: - build_ghuser_components: - name: windows-cpython + build_ghuser_components: # TODO: change this for windows-ironpython (it can be another workflow) + name: windows-cpython # TODO: change this for windows-ironpython runs-on: windows-latest steps: - uses: actions/checkout@v2 - uses: NuGet/setup-nuget@v1.0.5 - - name: Install IronPython - run: | - choco install ironpython --version=2.7.8.1 + # - name: Install IronPython + # run: | + # choco install ironpython --version=2.7.8.1 - - name: Install Python3 - uses: actions/setup-python@v2 - with: - python-version: '3.9.10' - - name: Install pythonnet - run: | - pip install pythonnet + # - name: Install Python3 + # uses: actions/setup-python@v2 + # with: + # python-version: '3.9.10' + # - name: Install pythonnet + # run: | + # pip install pythonnet - name: Run uses: ./ @@ -30,5 +30,5 @@ jobs: - uses: actions/upload-artifact@v2 with: - name: ghuser-components + name: ghuser-components # TODO: add other folder path: build \ No newline at end of file diff --git a/action.yml b/action.yml index b2ce685..f71c3d4 100644 --- a/action.yml +++ b/action.yml @@ -10,11 +10,23 @@ inputs: prefix: description: 'Add this prefix to the name of each generated component' required: false + # TODO: add a input and a if switch statement + # interpreter: + # description: 'Python interpreter to use' + # required: false + # default: 'ironpython' runs: using: 'composite' steps: - - run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json + - name: Install Python3 + uses: actions/setup-python@v2 + with: + python-version: '3.9.10' + - name: Install pythonnet + run: pip install pythonnet shell: pwsh + - run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json + shell: pwsh # TODO: this one should be for both - run: | $command="python" $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib" From c99d12054ecf12b0957a7cc7e27c582d24a1f40e Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 21:15:13 +0100 Subject: [PATCH 21/35] WIP: testing out dual branch x2 --- .github/workflows/build.yml | 14 +------------ action.yml | 42 ++++++++++++++++++++++++------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 782b546..13587be 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,18 +10,6 @@ jobs: - uses: actions/checkout@v2 - uses: NuGet/setup-nuget@v1.0.5 - # - name: Install IronPython - # run: | - # choco install ironpython --version=2.7.8.1 - - # - name: Install Python3 - # uses: actions/setup-python@v2 - # with: - # python-version: '3.9.10' - # - name: Install pythonnet - # run: | - # pip install pythonnet - - name: Run uses: ./ with: @@ -30,5 +18,5 @@ jobs: - uses: actions/upload-artifact@v2 with: - name: ghuser-components # TODO: add other folder + name: ghuser-components path: build \ No newline at end of file diff --git a/action.yml b/action.yml index f71c3d4..0be3b72 100644 --- a/action.yml +++ b/action.yml @@ -10,25 +10,37 @@ inputs: prefix: description: 'Add this prefix to the name of each generated component' required: false - # TODO: add a input and a if switch statement - # interpreter: - # description: 'Python interpreter to use' - # required: false - # default: 'ironpython' + interpreter: + description: 'Python interpreter to use: ironpython, or cpython' + required: false + default: 'ironpython' + runs: using: 'composite' steps: - - name: Install Python3 - uses: actions/setup-python@v2 - with: - python-version: '3.9.10' - - name: Install pythonnet - run: pip install pythonnet + - name: Install pythonnet or IronPython + run: | + if ("${{ inputs.interpreter }}" -eq "cpython") { + echo "Installing Python3" + # Install Python3 + # pip install pythonnet + } else { + echo "Installing IronPython" + # choco install ironpython --version=2.7.8.1 + } shell: pwsh - - run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json - shell: pwsh # TODO: this one should be for both - - run: | - $command="python" + + - name: Install Grasshopper + run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json + shell: pwsh + + - name: Launch componentizer + run: | + if ("${{ inputs.interpreter }}" -eq "cpython") { + $command="python" + } else { + $command="ipy" + } $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib" $prefix="${{ inputs.prefix }}" if( $prefix ) From 685c86806579f4516870c1da32e04fa0f3716614 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 21:22:44 +0100 Subject: [PATCH 22/35] WIP: testing out dual branch x2 --- action.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/action.yml b/action.yml index 0be3b72..25e5bc0 100644 --- a/action.yml +++ b/action.yml @@ -22,11 +22,12 @@ runs: run: | if ("${{ inputs.interpreter }}" -eq "cpython") { echo "Installing Python3" - # Install Python3 - # pip install pythonnet + choco install python --version=3.9.10 + echo "Installing pythonnet" + pip install pythonnet==3.0.3 } else { echo "Installing IronPython" - # choco install ironpython --version=2.7.8.1 + choco install ironpython --version=2.7.8.1 } shell: pwsh From bdcb24ff4691818883d8125e497b61eac6e8cee8 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 21:27:14 +0100 Subject: [PATCH 23/35] WIP: testing out dual branc, two componentize --- action.yml | 4 +- componentize.py => componentize_cpy.py | 0 componentize_ipy.py | 396 +++++++++++++++++++++++++ 3 files changed, 399 insertions(+), 1 deletion(-) rename componentize.py => componentize_cpy.py (100%) create mode 100644 componentize_ipy.py diff --git a/action.yml b/action.yml index 25e5bc0..959448c 100644 --- a/action.yml +++ b/action.yml @@ -39,10 +39,12 @@ runs: run: | if ("${{ inputs.interpreter }}" -eq "cpython") { $command="python" + $componentizer="${{ github.action_path }}/componentize_cpy.py" } else { $command="ipy" + $componentizer="${{ github.action_path }}/componentize_ipy.py" } - $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib" + $params=$componentizer, "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib" $prefix="${{ inputs.prefix }}" if( $prefix ) { diff --git a/componentize.py b/componentize_cpy.py similarity index 100% rename from componentize.py rename to componentize_cpy.py diff --git a/componentize_ipy.py b/componentize_ipy.py new file mode 100644 index 0000000..d737904 --- /dev/null +++ b/componentize_ipy.py @@ -0,0 +1,396 @@ +from __future__ import print_function + +import argparse +import base64 +import json +import os +import re +import sys +import tempfile +import urllib +import zipfile +import StringIO + +import clr +import System +import System.IO + +GHPYTHON_SCRIPT_GUID = System.Guid("410755b1-224a-4c1e-a407-bf32fb45ea7e") +TEMPLATE_VER = re.compile("{{version}}") +TEMPLATE_NAME = re.compile("{{name}}") +TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}") + +TYPES_MAP = dict( + none="35915213-5534-4277-81b8-1bdc9e7383d2", + ghdoc="87f87f55-5b71-41f4-8aea-21d494016f81", + float="39fbc626-7a01-46ab-a18e-ec1c0c41685b", + bool="d60527f5-b5af-4ef6-8970-5f96fe412559", + int="48d01794-d3d8-4aef-990e-127168822244", + complex="309690df-6229-4774-91bb-b1c9c0bfa54d", + str="37261734-eec7-4f50-b6a8-b8d1f3c4396b", + datetime="09bcf900-fe83-4efa-8d32-33d89f7a3e66", + guid="5325b8e1-51d7-4d36-837a-d98394626c35", + color="24b1d1a3-ab79-498c-9e44-c5b14607c4d3", + point="e1937b56-b1da-4c12-8bd8-e34ee81746ef", + vector="15a50725-e3d3-4075-9f7c-142ba5f40747", + plane="3897522d-58e9-4d60-b38c-978ddacfedd8", + interval="589748aa-e558-4dd9-976f-78e3ab91fc77", + uvinterval="74c906f3-db02-4cea-bd58-de375cb5ae73", + box="f29cb021-de79-4e63-9f04-fc8e0df5f8b6", + transform="c4b38e4c-21ff-415f-a0d1-406d282428dd", + line="f802a8cd-e699-4a94-97ea-83b5406271de", + circle="3c5409a1-3293-4181-a6fa-c24c37fc0c32", + arc="9c80ec18-b48c-41b0-bc6e-cd93d9c916aa", + polyline="66fa617b-e3e8-4480-9f1e-2c0688c1d21b", + rectangle="83da014b-a550-4bf5-89ff-16e54225bd5d", + curve="9ba89ec2-5315-435f-a621-b66c5fa2f301", + mesh="794a1f9d-21d5-4379-b987-9e8bbf433912", + surface="f4070a37-c822-410f-9057-100d2e22a22d", + subd="20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08", + brep="2ceb0405-fdfe-403d-a4d6-8786da45fb9d", + geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26", +) + +EXPOSURE = dict(valid=set([-1, 2, 4, 8, 16, 32, 64, 128]), default=2) +ACCESS = dict(valid=set([0, 1, 2]), map=dict(item=0, list=1, tree=2), default=0) +PARAM_TYPE = dict( + valid=set(TYPES_MAP.values()), map=TYPES_MAP, default=TYPES_MAP["ghdoc"] +) +WIRE_DISPLAY = dict( + valid=set([0, 1, 2]), map=dict(default=0, faint=1, hidden=2), default=0 +) + + +def fetch_ghio_lib(target_folder="temp"): + """Fetch the GH_IO.dll library from the NuGet packaging system.""" + ghio_dll = "GH_IO.dll" + filename = "lib/net48/" + ghio_dll + + response = urllib.urlopen("https://www.nuget.org/api/v2/package/Grasshopper/") + dst_file = os.path.join(target_folder, ghio_dll) + zip_file = zipfile.ZipFile(StringIO.StringIO(response.read())) + + with zip_file.open(filename, "r") as zipped_dll: + with open(dst_file, "wb") as fp: + fp.write(zipped_dll.read()) + + return dst_file + + +def find_ghio_assembly(libdir): + for root, _dirs, files in os.walk(libdir): + for basename in files: + if basename.upper() == "GH_IO.DLL": + filename = os.path.join(root, basename) + return filename + + +def bitmap_from_image_path(image_path): + with open(image_path, "rb") as imageFile: + img_string = base64.b64encode(imageFile.read()) + return System.Convert.FromBase64String(img_string) + + +def validate_source_bundle(source): + icon = os.path.join(source, "icon.png") + code = os.path.join(source, "code.py") + data = os.path.join(source, "metadata.json") + + if not os.path.exists(icon): + raise ValueError( + "icon missing, make sure icon.png is present in the source bundle: {}".format( + source + ) + ) + if not os.path.exists(code): + raise ValueError( + "code missing, make sure code.py is present in the source bundle: {}".format( + source + ) + ) + if not os.path.exists(data): + raise ValueError( + "metadata missing, make sure metadata.json is present in the source bundle: {}".format( + source + ) + ) + + icon = bitmap_from_image_path(icon) + + with open(code, "r") as f: + python_code = f.read() + + with open(data, "r") as f: + data = json.load(f) + + if "exposure" not in data: + data["exposure"] = EXPOSURE["default"] + + if data["exposure"] not in EXPOSURE["valid"]: + raise ValueError( + "Invalid exposure value. Accepted values are {}".format( + sorted(EXPOSURE["valid"]) + ) + ) + + ghpython = data.get("ghpython") + sdk_mode = ghpython and ghpython.get("isAdvancedMode", False) + + if r'"""' not in python_code and sdk_mode is False: + python_code = r'"""{}"""{}{}'.format( + data.get("description", "Generated by Componentizer"), + os.linesep, + python_code, + ) + + return icon, python_code, data + + +def parse_param_access(access): + try: + access = int(access) + except ValueError: + # Maybe string? + access = ACCESS["map"].get(access) + + if access not in ACCESS["valid"]: + raise ValueError( + "Invalid param access value. Valid values are {}".format( + sorted(ACCESS["valid"]) + ) + ) + + return access + + +def parse_wire_display(wire_display): + try: + wire_display = int(wire_display) + except ValueError: + wire_display = WIRE_DISPLAY["map"].get(wire_display) + + if wire_display not in WIRE_DISPLAY["valid"]: + raise ValueError( + "Invalid wire display value. Valid values are {}".format( + sorted(WIRE_DISPLAY["valid"]) + ) + ) + + return wire_display + + +def parse_param_type_hint(type_hint_id): + type_hint_id = type_hint_id or PARAM_TYPE["default"] + + if type_hint_id in TYPES_MAP: + type_hint_id = TYPES_MAP[type_hint_id] + + if type_hint_id not in PARAM_TYPE["valid"]: + raise ValueError( + 'Invalid param type hint ID ("{}"). Valid values are {}'.format( + type_hint_id, sorted(PARAM_TYPE["valid"]) + ) + ) + + try: + type_hint_id = System.Guid.Parse(type_hint_id) + except SystemError: + raise ValueError("Unable to parse type hint ID: {}".format(type_hint_id)) + + return type_hint_id + + +def replace_templates(code, version, name, ghuser_name): + if version: + code = TEMPLATE_VER.sub(version, code) + + code = TEMPLATE_NAME.sub(name, code) + code = TEMPLATE_GHUSER_NAME.sub(ghuser_name, code) + + return code + + +def create_ghuser_component(source, target, version=None, prefix=None): + from GH_IO.Serialization import GH_LooseChunk + + icon, code, data = validate_source_bundle(source) + + code = replace_templates(code, version, data["name"], os.path.basename(target)) + + instance_guid = data.get("instanceGuid") + if not instance_guid: + instance_guid = System.Guid.NewGuid() + else: + instance_guid = System.Guid.Parse(instance_guid) + + prefix = prefix or "" + + root = GH_LooseChunk("UserObject") + + root.SetGuid("BaseID", GHPYTHON_SCRIPT_GUID) + root.SetString("Name", prefix + data["name"]) + root.SetString("NickName", data["nickname"]) + root.SetString("Description", data.get("description", "")) + root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"])) + root.SetString("Category", data["category"]) + root.SetString("SubCategory", data["subcategory"]) + root.SetGuid("InstanceGuid", instance_guid) + root.SetByteArray("Icon", icon) + + ghpython_data = data["ghpython"] + ghpython_root = GH_LooseChunk("UserObject") + ghpython_root.SetString("Description", data.get("description", "")) + ghpython_root.SetBoolean("HideOutput", ghpython_data.get("hideOutput", True)) + ghpython_root.SetBoolean("HideInput", ghpython_data.get("hideInput", True)) + ghpython_root.SetBoolean( + "IsAdvancedMode", ghpython_data.get("isAdvancedMode", False) + ) + ghpython_root.SetInt32("IconDisplay", ghpython_data.get("iconDisplay", 0)) + ghpython_root.SetString("Name", data["name"]) + ghpython_root.SetString("NickName", data["nickname"]) + ghpython_root.SetBoolean( + "MarshalOutGuids", ghpython_data.get("marshalOutGuids", True) + ) + ghpython_root.SetString("CodeInput", code) + + # ghpython_root.CreateChunk('Attributes') + # for mf in ('Bounds', 'Pivot', 'Selected'): + params = ghpython_root.CreateChunk("ParameterData") + inputParam = ghpython_data.get("inputParameters", []) + outputParam = ghpython_data.get("outputParameters", []) + + params.SetInt32("InputCount", len(inputParam)) + for i, _pi in enumerate(inputParam): + params.SetGuid( + "InputId", i, System.Guid.Parse("84fa917c-1ed8-4db3-8be1-7bdc4a6495a2") + ) + params.SetInt32("OutputCount", len(outputParam)) + for i, _po in enumerate(outputParam): + params.SetGuid( + "OutputId", i, System.Guid.Parse("8ec86459-bf01-4409-baee-174d0d2b13d0") + ) + + for i, pi in enumerate(inputParam): + input_instance_guid = System.Guid.NewGuid() + pi_chunk = params.CreateChunk("InputParam", i) + pi_chunk.SetString("Name", pi["name"]) + pi_chunk.SetString("NickName", pi.get("nickname") or pi["name"]) + pi_chunk.SetString("Description", pi.get("description")) + pi_chunk.SetBoolean("Optional", pi.get("optional", True)) + pi_chunk.SetBoolean("AllowTreeAccess", pi.get("allowTreeAccess", True)) + pi_chunk.SetBoolean("ShowTypeHints", pi.get("showTypeHints", True)) + pi_chunk.SetInt32( + "ScriptParamAccess", + parse_param_access(pi.get("scriptParamAccess", ACCESS["default"])), + ) + pi_chunk.SetInt32("SourceCount", 0) + pi_chunk.SetGuid("InstanceGuid", input_instance_guid) + pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID"))) + pi_chunk.SetInt32( + "WireDisplay", + parse_wire_display(pi.get("wireDisplay", WIRE_DISPLAY["default"])), + ) + pi_chunk.SetBoolean("ReverseData", pi.get("reverse", False)) + pi_chunk.SetBoolean("SimplifyData", pi.get("simplify", False)) + # Mutually exclusive options + if pi.get("flatten", False): + pi_chunk.SetInt32("Mapping", 1) + elif pi.get("graft", False): + pi_chunk.SetInt32("Mapping", 2) + + for i, po in enumerate(outputParam): + output_instance_guid = System.Guid.NewGuid() + po_chunk = params.CreateChunk("OutputParam", i) + po_chunk.SetString("Name", po["name"]) + po_chunk.SetString("NickName", po.get("nickname") or po["name"]) + po_chunk.SetString("Description", po.get("description")) + po_chunk.SetBoolean("Optional", po.get("optional", False)) + po_chunk.SetInt32("SourceCount", 0) + po_chunk.SetGuid("InstanceGuid", output_instance_guid) + po_chunk.SetBoolean("ReverseData", po.get("reverse", False)) + po_chunk.SetBoolean("SimplifyData", po.get("simplify", False)) + # Mutually exclusive options + if po.get("flatten", False): + po_chunk.SetInt32("Mapping", 1) + elif po.get("graft", False): + po_chunk.SetInt32("Mapping", 2) + + # print(ghpython_root.Serialize_Xml()) + root.SetByteArray("Object", ghpython_root.Serialize_Binary()) + + System.IO.File.WriteAllBytes(target, root.Serialize_Binary()) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Create GHUser components out of python code." + ) + parser.add_argument( + "source", + type=str, + help="Source directory where code for all components is stored", + ) + parser.add_argument("target", type=str, help="Target directory for ghuser files") + parser.add_argument( + "--ghio", + type=str, + required=False, + help="Folder where the GH_IO.dll assembly is located. Defaults to ./lib", + ) + parser.add_argument( + "--version", type=str, required=False, help="Version to tag components" + ) + parser.add_argument( + "--prefix", + type=str, + required=False, + help="Add this prefix to the name of each generated component", + ) + args = parser.parse_args() + + sourcedir = args.source + if not os.path.isabs(sourcedir): + sourcedir = os.path.abspath(sourcedir) + + targetdir = args.target + if not os.path.isabs(targetdir): + targetdir = os.path.abspath(targetdir) + + if args.ghio is None: + libdir = tempfile.mkdtemp("ghio") + fetch_ghio_lib(libdir) + else: + libdir = os.path.abspath(args.ghio) + gh_io = find_ghio_assembly(libdir) + source_bundles = [ + d + for d in os.listdir(sourcedir) + if os.path.isdir(os.path.join(sourcedir, d)) + and d not in ("__pycache__", ".git") + ] + + print("GHPython componentizer") + print("======================") + + print("[x] Source: {} ({} components)".format(sourcedir, len(source_bundles))) + print("[ ] Target: {}\r".format(targetdir), end="") + if not os.path.exists(targetdir): + os.mkdir(targetdir) + print("[x]") + + print("[ ] GH_IO assembly: {}\r".format(gh_io or args.ghio), end="") + if not gh_io: + print("[-]") + print(" Cannot find GH_IO Assembly! Aborting.") + sys.exit(-1) + clr.AddReferenceToFileAndPath(gh_io) + print("[x]") + print() + + print("Processing component bundles:") + for d in source_bundles: + source = os.path.join(sourcedir, d) + target = os.path.join(targetdir, d + ".ghuser") + print(" [ ] {}\r".format(d), end="") + create_ghuser_component(source, target, args.version, args.prefix) + print(" [x] {} => {}".format(d, target)) \ No newline at end of file From 4b17c47cb84dd3ce754aedaad4fda8b49e74a0bd Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 21:37:41 +0100 Subject: [PATCH 24/35] ADD: seperate examples folder --- .github/workflows/build.yml | 2 +- .../Test_KitchenSink}/code.py | 4 +-- .../Test_KitchenSink}/icon.png | Bin .../Test_KitchenSink}/metadata.json | 0 examples/cpy/Test_Minimal/code.py | 17 +++++++++++ .../Test_Minimal}/icon.png | Bin examples/{ => cpy}/Test_Minimal/metadata.json | 0 examples/cpy/Test_MinimalSDK/code.py | 21 ++++++++++++++ .../Test_MinimalSDK}/icon.png | Bin .../{ => cpy}/Test_MinimalSDK/metadata.json | 0 examples/{ => ipy}/Test_KitchenSink/code.py | 2 +- .../Test_KitchenSink}/icon.png | Bin .../{ => ipy}/Test_KitchenSink/metadata.json | 5 +++- examples/{ => ipy}/Test_Minimal/code.py | 0 examples/ipy/Test_Minimal/icon.png | Bin 0 -> 2759 bytes examples/ipy/Test_Minimal/metadata.json | 26 +++++++++++++++++ examples/{ => ipy}/Test_MinimalSDK/code.py | 0 examples/ipy/Test_MinimalSDK/icon.png | Bin 0 -> 2759 bytes examples/ipy/Test_MinimalSDK/metadata.json | 27 ++++++++++++++++++ 19 files changed, 99 insertions(+), 5 deletions(-) rename examples/{TestCpy_KitchenSink => cpy/Test_KitchenSink}/code.py (87%) rename examples/{TestCpy_KitchenSink => cpy/Test_KitchenSink}/icon.png (100%) rename examples/{TestCpy_KitchenSink => cpy/Test_KitchenSink}/metadata.json (100%) create mode 100644 examples/cpy/Test_Minimal/code.py rename examples/{Test_KitchenSink => cpy/Test_Minimal}/icon.png (100%) rename examples/{ => cpy}/Test_Minimal/metadata.json (100%) create mode 100644 examples/cpy/Test_MinimalSDK/code.py rename examples/{Test_Minimal => cpy/Test_MinimalSDK}/icon.png (100%) rename examples/{ => cpy}/Test_MinimalSDK/metadata.json (100%) rename examples/{ => ipy}/Test_KitchenSink/code.py (94%) rename examples/{Test_MinimalSDK => ipy/Test_KitchenSink}/icon.png (100%) rename examples/{ => ipy}/Test_KitchenSink/metadata.json (94%) rename examples/{ => ipy}/Test_Minimal/code.py (100%) create mode 100644 examples/ipy/Test_Minimal/icon.png create mode 100644 examples/ipy/Test_Minimal/metadata.json rename examples/{ => ipy}/Test_MinimalSDK/code.py (100%) create mode 100644 examples/ipy/Test_MinimalSDK/icon.png create mode 100644 examples/ipy/Test_MinimalSDK/metadata.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 13587be..faa9ba9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,7 +13,7 @@ jobs: - name: Run uses: ./ with: - source: examples + source: examples/ipy target: build - uses: actions/upload-artifact@v2 diff --git a/examples/TestCpy_KitchenSink/code.py b/examples/cpy/Test_KitchenSink/code.py similarity index 87% rename from examples/TestCpy_KitchenSink/code.py rename to examples/cpy/Test_KitchenSink/code.py index ce003e8..fca9dad 100644 --- a/examples/TestCpy_KitchenSink/code.py +++ b/examples/cpy/Test_KitchenSink/code.py @@ -1,7 +1,7 @@ """ -Do something silly in cpy. +Do something silly in python3. -This component does nothing useful, it's only a kitchen sink (but in cpy) example showing most available options. +This component does nothing useful, it's only a kitchen sink (but in python3) example showing most available options. Args: x: X value diff --git a/examples/TestCpy_KitchenSink/icon.png b/examples/cpy/Test_KitchenSink/icon.png similarity index 100% rename from examples/TestCpy_KitchenSink/icon.png rename to examples/cpy/Test_KitchenSink/icon.png diff --git a/examples/TestCpy_KitchenSink/metadata.json b/examples/cpy/Test_KitchenSink/metadata.json similarity index 100% rename from examples/TestCpy_KitchenSink/metadata.json rename to examples/cpy/Test_KitchenSink/metadata.json diff --git a/examples/cpy/Test_Minimal/code.py b/examples/cpy/Test_Minimal/code.py new file mode 100644 index 0000000..6c8bfa3 --- /dev/null +++ b/examples/cpy/Test_Minimal/code.py @@ -0,0 +1,17 @@ +""" +Do something silly in python3. + +This component does nothing useful, it's only a minimal example of python3 in grasshopper. + + Args: + x: X value + y: Y value + z: Z value + Returns: + a: The sum of all three values. +""" +import platform + +ghenv.Component.Message = f"Cpy Version: {platform.python_version()}" + +a = x + y + z diff --git a/examples/Test_KitchenSink/icon.png b/examples/cpy/Test_Minimal/icon.png similarity index 100% rename from examples/Test_KitchenSink/icon.png rename to examples/cpy/Test_Minimal/icon.png diff --git a/examples/Test_Minimal/metadata.json b/examples/cpy/Test_Minimal/metadata.json similarity index 100% rename from examples/Test_Minimal/metadata.json rename to examples/cpy/Test_Minimal/metadata.json diff --git a/examples/cpy/Test_MinimalSDK/code.py b/examples/cpy/Test_MinimalSDK/code.py new file mode 100644 index 0000000..0f941e4 --- /dev/null +++ b/examples/cpy/Test_MinimalSDK/code.py @@ -0,0 +1,21 @@ +""" +Do something silly in Python3. + +This component does nothing useful, it's only a minimal example in Python3. + + Args: + x: X value + y: Y value + z: Z value + Returns: + a: The sum of all three values. +""" + +from ghpythonlib.componentbase import executingcomponent as component + +import platform + +class MinimalSdkComponent(component): + def RunScript(self, x, y, z): + self.Message = f"Cpy Version: {platform.python_version()}" + return (x + y + z) diff --git a/examples/Test_Minimal/icon.png b/examples/cpy/Test_MinimalSDK/icon.png similarity index 100% rename from examples/Test_Minimal/icon.png rename to examples/cpy/Test_MinimalSDK/icon.png diff --git a/examples/Test_MinimalSDK/metadata.json b/examples/cpy/Test_MinimalSDK/metadata.json similarity index 100% rename from examples/Test_MinimalSDK/metadata.json rename to examples/cpy/Test_MinimalSDK/metadata.json diff --git a/examples/Test_KitchenSink/code.py b/examples/ipy/Test_KitchenSink/code.py similarity index 94% rename from examples/Test_KitchenSink/code.py rename to examples/ipy/Test_KitchenSink/code.py index 96a41ea..b0acc64 100644 --- a/examples/Test_KitchenSink/code.py +++ b/examples/ipy/Test_KitchenSink/code.py @@ -16,4 +16,4 @@ class KitchenSinkComponent(component): def RunScript(self, x, y, z): self.Message = 'COMPONENT v{{version}}' - return x + y + z \ No newline at end of file + return x + y + z diff --git a/examples/Test_MinimalSDK/icon.png b/examples/ipy/Test_KitchenSink/icon.png similarity index 100% rename from examples/Test_MinimalSDK/icon.png rename to examples/ipy/Test_KitchenSink/icon.png diff --git a/examples/Test_KitchenSink/metadata.json b/examples/ipy/Test_KitchenSink/metadata.json similarity index 94% rename from examples/Test_KitchenSink/metadata.json rename to examples/ipy/Test_KitchenSink/metadata.json index 86fde85..0974e77 100644 --- a/examples/Test_KitchenSink/metadata.json +++ b/examples/ipy/Test_KitchenSink/metadata.json @@ -7,7 +7,10 @@ "exposure": 4, "instanceGuid": "cdd47086-f902-4b77-825b-6b79c3aaecc1", "ghpython": { - "marshalGuids": true, + "hideOutput": true, + "hideInput": true, + "isAdvancedMode": true, + "marshalOutGuids": true, "iconDisplay": 2, "inputParameters": [ { diff --git a/examples/Test_Minimal/code.py b/examples/ipy/Test_Minimal/code.py similarity index 100% rename from examples/Test_Minimal/code.py rename to examples/ipy/Test_Minimal/code.py diff --git a/examples/ipy/Test_Minimal/icon.png b/examples/ipy/Test_Minimal/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c8df236e3a30d99b26c306af3495da68e531e6e3 GIT binary patch literal 2759 zcmcgudsGu=77ubjprv&IvC67ruz-)rJo11HL4;BCF^%yq$8 zJf7omT9s%_RK{QgqZQyJqoxFAt)4^kctOEtJx-)kMnFxa(mEOc{>e^0K$9|lf>;SF z^21wMkA)d1+{hSI43ja{sJJQ00Lo)HS^o$85$BmSXZ|xfhBOnT^ z5EK&&F(JAHMlcwjfGQc1)>v#%#0rH2REP)@`Tq*XDTc(2_=}MwfoT|n7Uz2;}mz*a&mjLBdOTu6?W@Y#7qSXi8a(a;&(0=p_A6i|eRNf4<-0-^$BoTyTXDRit6 z*AbLLF5`2B5zsV=`Afwbv04-W3dNKZL{O0sl!^#7h!7Hz#3?l)3LvKJRvKt-GvXP~dbP45 zIgf}?qMN`72LSR~DI{k2SPqSe&q$x#Lk zj0*?D3G0TC@d>LED3U)pO+Tj|FBN&x-jqghPG6vpiRdh&F`94#6_U!;?j;lm{T6)| z&w4R=T#S=yoIpWTf{H<$;@YYfNk~u=pus6bEYYYX(y8QajYAXQ&g0p)E94=n$nIln>6N>aJS6c1>1Nj(e`z$NyLfX+`g*tS&5y6o zPeFx+Cw94gA5$CezW;(BRr7_@On((RP`uyalEU#HT^BuPWF9zr`eJP!uoHCXxX^v; z^Qa%drdnrT>0h_pmpux4^x=alHqhmZ`ah~}r)mlXwYim_%$;>8j@h-gzEl}|VZHm} zGlhu}yGZnE0npHm$j!pgJ#V#uDs? z-tS!cmxfI-VEg`#%g&{p^X+erOpogylxrxV=MQ(hES2AV<+%M^Psw0mqkXt*n#ocS zoAX)j?>}eqD@>NLFMs-GBb0k9=#k&|h4wI#RGqo@+pTeyYd1nKeTo(bC+zgS*Sz5F zqR$qwbz=*cXB_s)tvP6SL;kcY|I?(Iqk@xeg`N?KUTyx8r0N;Yz@`-)-$9xD;^GnlpgT75&yDWV(D?V)2*0rR~&P$m_yaBmoKZy4l zEpeE2@FTRdV2JI%lwb0bIHbs{`O5X|4TnUYdC_|u%MO2it7<4Dc?ZfnqjPUCw>LKh zR-6c)m)Ocb?^M)X#C>FhiU2Wr*{yC~OU{85 z_k2o&fmfnyT58T7!FxBjFRhlD|Eb^K)NkM4zii$|zw>>PQ>ZHqdjA(=+ry}1Nshol zHYcPyP(*{V{)0#xr06}h*nMy;N$_U&>vqW_W~9b>R^G>5>Z9j)K6Pos&hTl&t$W#3 zOD#Sn;TKI~zc>YNY;nDkANk|T_9yeFwaPs57GQ1s^C=HrbBU+F^=j-~=lT@rIFKL; z3n_FhU$eK^kF1@(aE3r0Gwk`W{ATyP`@5^;zOQ=4?pe2BP(HkE=QMY02)q)zHwn4@ zPScFQ2g1N3V;lXHo%_mE$A!^P*Q4uVG{w@@p`Npc!g957v)|ghrSET1e^2?b&#jeF z6Su%lRQGkMqiEvyxscVQr&GqR-9k9&-+P> cdf~`i)t_^mjx6cBXZ_SvgvZL8LsJU=4QD(61^@s6 literal 0 HcmV?d00001 diff --git a/examples/ipy/Test_Minimal/metadata.json b/examples/ipy/Test_Minimal/metadata.json new file mode 100644 index 0000000..d4c5a89 --- /dev/null +++ b/examples/ipy/Test_Minimal/metadata.json @@ -0,0 +1,26 @@ +{ + "name": "Minimal component example", + "nickname": "Minimal", + "description": "This is an example with the minimum of options set, relying on defaults for everything else", + "category": "Componentizer", + "subcategory": "MAIN", + + "ghpython": { + "inputParameters": [ + { + "name": "x" + }, + { + "name": "y" + }, + { + "name": "z" + } + ], + "outputParameters": [ + { + "name": "a" + } + ] + } +} \ No newline at end of file diff --git a/examples/Test_MinimalSDK/code.py b/examples/ipy/Test_MinimalSDK/code.py similarity index 100% rename from examples/Test_MinimalSDK/code.py rename to examples/ipy/Test_MinimalSDK/code.py diff --git a/examples/ipy/Test_MinimalSDK/icon.png b/examples/ipy/Test_MinimalSDK/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c8df236e3a30d99b26c306af3495da68e531e6e3 GIT binary patch literal 2759 zcmcgudsGu=77ubjprv&IvC67ruz-)rJo11HL4;BCF^%yq$8 zJf7omT9s%_RK{QgqZQyJqoxFAt)4^kctOEtJx-)kMnFxa(mEOc{>e^0K$9|lf>;SF z^21wMkA)d1+{hSI43ja{sJJQ00Lo)HS^o$85$BmSXZ|xfhBOnT^ z5EK&&F(JAHMlcwjfGQc1)>v#%#0rH2REP)@`Tq*XDTc(2_=}MwfoT|n7Uz2;}mz*a&mjLBdOTu6?W@Y#7qSXi8a(a;&(0=p_A6i|eRNf4<-0-^$BoTyTXDRit6 z*AbLLF5`2B5zsV=`Afwbv04-W3dNKZL{O0sl!^#7h!7Hz#3?l)3LvKJRvKt-GvXP~dbP45 zIgf}?qMN`72LSR~DI{k2SPqSe&q$x#Lk zj0*?D3G0TC@d>LED3U)pO+Tj|FBN&x-jqghPG6vpiRdh&F`94#6_U!;?j;lm{T6)| z&w4R=T#S=yoIpWTf{H<$;@YYfNk~u=pus6bEYYYX(y8QajYAXQ&g0p)E94=n$nIln>6N>aJS6c1>1Nj(e`z$NyLfX+`g*tS&5y6o zPeFx+Cw94gA5$CezW;(BRr7_@On((RP`uyalEU#HT^BuPWF9zr`eJP!uoHCXxX^v; z^Qa%drdnrT>0h_pmpux4^x=alHqhmZ`ah~}r)mlXwYim_%$;>8j@h-gzEl}|VZHm} zGlhu}yGZnE0npHm$j!pgJ#V#uDs? z-tS!cmxfI-VEg`#%g&{p^X+erOpogylxrxV=MQ(hES2AV<+%M^Psw0mqkXt*n#ocS zoAX)j?>}eqD@>NLFMs-GBb0k9=#k&|h4wI#RGqo@+pTeyYd1nKeTo(bC+zgS*Sz5F zqR$qwbz=*cXB_s)tvP6SL;kcY|I?(Iqk@xeg`N?KUTyx8r0N;Yz@`-)-$9xD;^GnlpgT75&yDWV(D?V)2*0rR~&P$m_yaBmoKZy4l zEpeE2@FTRdV2JI%lwb0bIHbs{`O5X|4TnUYdC_|u%MO2it7<4Dc?ZfnqjPUCw>LKh zR-6c)m)Ocb?^M)X#C>FhiU2Wr*{yC~OU{85 z_k2o&fmfnyT58T7!FxBjFRhlD|Eb^K)NkM4zii$|zw>>PQ>ZHqdjA(=+ry}1Nshol zHYcPyP(*{V{)0#xr06}h*nMy;N$_U&>vqW_W~9b>R^G>5>Z9j)K6Pos&hTl&t$W#3 zOD#Sn;TKI~zc>YNY;nDkANk|T_9yeFwaPs57GQ1s^C=HrbBU+F^=j-~=lT@rIFKL; z3n_FhU$eK^kF1@(aE3r0Gwk`W{ATyP`@5^;zOQ=4?pe2BP(HkE=QMY02)q)zHwn4@ zPScFQ2g1N3V;lXHo%_mE$A!^P*Q4uVG{w@@p`Npc!g957v)|ghrSET1e^2?b&#jeF z6Su%lRQGkMqiEvyxscVQr&GqR-9k9&-+P> cdf~`i)t_^mjx6cBXZ_SvgvZL8LsJU=4QD(61^@s6 literal 0 HcmV?d00001 diff --git a/examples/ipy/Test_MinimalSDK/metadata.json b/examples/ipy/Test_MinimalSDK/metadata.json new file mode 100644 index 0000000..d2e3a8c --- /dev/null +++ b/examples/ipy/Test_MinimalSDK/metadata.json @@ -0,0 +1,27 @@ +{ + "name": "Minimal SDK component example", + "nickname": "MinSDK", + "description": "This is an example with the minimum of options set using SDK mode and relying on defaults for everything else", + "category": "Componentizer", + "subcategory": "MAIN", + + "ghpython": { + "isAdvancedMode": true, + "inputParameters": [ + { + "name": "x" + }, + { + "name": "y" + }, + { + "name": "z" + } + ], + "outputParameters": [ + { + "name": "a" + } + ] + } +} \ No newline at end of file From 4086218ae308dae36bb0abdd55385ac6c7898d82 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 21:39:33 +0100 Subject: [PATCH 25/35] ADD: new main build --- .github/workflows/build.yml | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index faa9ba9..3b4e7da 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,8 +3,8 @@ name: build on: [push] jobs: - build_ghuser_components: # TODO: change this for windows-ironpython (it can be another workflow) - name: windows-cpython # TODO: change this for windows-ironpython + build_ipy_ghuser_components: + name: windows-cpython runs-on: windows-latest steps: - uses: actions/checkout@v2 @@ -18,5 +18,23 @@ jobs: - uses: actions/upload-artifact@v2 with: - name: ghuser-components + name: ipy_ghuser-components + path: build + + build_cpy_ghuser_components: + name: windows-cpython + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - uses: NuGet/setup-nuget@v1.0.5 + + - name: Run + uses: ./ + with: + source: examples/cpy + target: build + + - uses: actions/upload-artifact@v2 + with: + name: cpy_ghuser-components path: build \ No newline at end of file From 2c171c64fcedabd77db3c34ba6c01a187910ac52 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 21:40:14 +0100 Subject: [PATCH 26/35] FIX: add parameter to action --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3b4e7da..be3d095 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,6 +33,7 @@ jobs: with: source: examples/cpy target: build + interpreter: cpython - uses: actions/upload-artifact@v2 with: From a53037eb8a48daac199390855e5ba7e07e14a9d8 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 21:41:04 +0100 Subject: [PATCH 27/35] FIX: specified different build out directories for artifacts --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index be3d095..e3838b0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,12 +14,12 @@ jobs: uses: ./ with: source: examples/ipy - target: build + target: build/ipy - uses: actions/upload-artifact@v2 with: name: ipy_ghuser-components - path: build + path: build/ipy build_cpy_ghuser_components: name: windows-cpython @@ -32,10 +32,10 @@ jobs: uses: ./ with: source: examples/cpy - target: build + target: build/cpy interpreter: cpython - uses: actions/upload-artifact@v2 with: name: cpy_ghuser-components - path: build \ No newline at end of file + path: build/cpy \ No newline at end of file From d8c959ac07a445ddf411c4947354d8ee054538cb Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 21:46:42 +0100 Subject: [PATCH 28/35] FIX-WIP: testing nuget in action --- .github/workflows/build.yml | 14 ++++++-------- action.yml | 1 + 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e3838b0..0885d38 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,38 +4,36 @@ on: [push] jobs: build_ipy_ghuser_components: - name: windows-cpython runs-on: windows-latest steps: - uses: actions/checkout@v2 - - uses: NuGet/setup-nuget@v1.0.5 + # - uses: NuGet/setup-nuget@v1.0.5 - name: Run uses: ./ with: source: examples/ipy - target: build/ipy + target: build - uses: actions/upload-artifact@v2 with: name: ipy_ghuser-components - path: build/ipy + path: build build_cpy_ghuser_components: - name: windows-cpython runs-on: windows-latest steps: - uses: actions/checkout@v2 - - uses: NuGet/setup-nuget@v1.0.5 + # - uses: NuGet/setup-nuget@v1.0.5 - name: Run uses: ./ with: source: examples/cpy - target: build/cpy + target: build interpreter: cpython - uses: actions/upload-artifact@v2 with: name: cpy_ghuser-components - path: build/cpy \ No newline at end of file + path: build \ No newline at end of file diff --git a/action.yml b/action.yml index 959448c..bd87c53 100644 --- a/action.yml +++ b/action.yml @@ -32,6 +32,7 @@ runs: shell: pwsh - name: Install Grasshopper + uses: NuGet/setup-nuget@v1.0.5 run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json shell: pwsh From a9665af65bedbf611906668763f2df7aa04f8efc Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 21:51:57 +0100 Subject: [PATCH 29/35] FIX: reversed to compas format for build workflow and action isntalls --- .github/workflows/build.yml | 15 +++++++++++++-- action.yml | 14 -------------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0885d38..eb75990 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,10 +4,15 @@ on: [push] jobs: build_ipy_ghuser_components: + name: windows-ironpython runs-on: windows-latest steps: - uses: actions/checkout@v2 - # - uses: NuGet/setup-nuget@v1.0.5 + - uses: NuGet/setup-nuget@v1.0.5 + + - name: Install IronPython + run: | + choco install ironpython --version=2.7.8.1 - name: Run uses: ./ @@ -21,10 +26,16 @@ jobs: path: build build_cpy_ghuser_components: + name: windows-cpython runs-on: windows-latest steps: - uses: actions/checkout@v2 - # - uses: NuGet/setup-nuget@v1.0.5 + - uses: NuGet/setup-nuget@v1.0.5 + + - name: Install CPython and pythonnet package + run: | + choco install python --version=3.9.10 + python -m pip install pythonnet==3.0.3 - name: Run uses: ./ diff --git a/action.yml b/action.yml index bd87c53..2628e73 100644 --- a/action.yml +++ b/action.yml @@ -18,21 +18,7 @@ inputs: runs: using: 'composite' steps: - - name: Install pythonnet or IronPython - run: | - if ("${{ inputs.interpreter }}" -eq "cpython") { - echo "Installing Python3" - choco install python --version=3.9.10 - echo "Installing pythonnet" - pip install pythonnet==3.0.3 - } else { - echo "Installing IronPython" - choco install ironpython --version=2.7.8.1 - } - shell: pwsh - - name: Install Grasshopper - uses: NuGet/setup-nuget@v1.0.5 run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json shell: pwsh From c76d1e586d177ba2ae4b43584210fe736bf2e584 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 22:17:46 +0100 Subject: [PATCH 30/35] WIP-CAP: final testing before refactoring readme instructions --- .../{build.yml => build-cpython.yml} | 24 +--------------- .github/workflows/build-ironpython.yml | 26 +++++++++++++++++ README.md | 3 +- componentize_cpy.py | 3 +- examples/cpy/Test_KitchenSink/code.py | 2 +- examples/cpy/Test_KitchenSink/metadata.json | 1 + examples/cpy/Test_Minimal/code.py | 2 +- examples/cpy/Test_MinimalSDK/code.py | 21 -------------- examples/cpy/Test_MinimalSDK/icon.png | Bin 2759 -> 0 bytes examples/cpy/Test_MinimalSDK/metadata.json | 27 ------------------ 10 files changed, 32 insertions(+), 77 deletions(-) rename .github/workflows/{build.yml => build-cpython.yml} (54%) create mode 100644 .github/workflows/build-ironpython.yml delete mode 100644 examples/cpy/Test_MinimalSDK/code.py delete mode 100644 examples/cpy/Test_MinimalSDK/icon.png delete mode 100644 examples/cpy/Test_MinimalSDK/metadata.json diff --git a/.github/workflows/build.yml b/.github/workflows/build-cpython.yml similarity index 54% rename from .github/workflows/build.yml rename to .github/workflows/build-cpython.yml index eb75990..d2470c3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build-cpython.yml @@ -1,30 +1,8 @@ -name: build +name: build-cpython on: [push] jobs: - build_ipy_ghuser_components: - name: windows-ironpython - runs-on: windows-latest - steps: - - uses: actions/checkout@v2 - - uses: NuGet/setup-nuget@v1.0.5 - - - name: Install IronPython - run: | - choco install ironpython --version=2.7.8.1 - - - name: Run - uses: ./ - with: - source: examples/ipy - target: build - - - uses: actions/upload-artifact@v2 - with: - name: ipy_ghuser-components - path: build - build_cpy_ghuser_components: name: windows-cpython runs-on: windows-latest diff --git a/.github/workflows/build-ironpython.yml b/.github/workflows/build-ironpython.yml new file mode 100644 index 0000000..3683bcb --- /dev/null +++ b/.github/workflows/build-ironpython.yml @@ -0,0 +1,26 @@ +name: build-ironpython + +on: [push] + +jobs: + build_ipy_ghuser_components: + name: windows-ironpython + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - uses: NuGet/setup-nuget@v1.0.5 + + - name: Install IronPython + run: | + choco install ironpython --version=2.7.8.1 + + - name: Run + uses: ./ + with: + source: examples/ipy + target: build + + - uses: actions/upload-artifact@v2 + with: + name: ipy_ghuser-components + path: build \ No newline at end of file diff --git a/README.md b/README.md index 151fa1f..0c9dbbf 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # GHPython Componentizer -> A github action to make Grasshopper development 164% [1] version-control friendlier and 82% more pleasant. +> A github action to make Grasshopper development 165% [1] version-control friendlier and 83% more pleasant. Imagine if you could write your grasshopper components in Python code in an actual text file with a powerful editor? Git wouldn't hate you and life would be so much beautiful. 🐵 @@ -45,7 +45,6 @@ jobs: with: name: ghuser-components path: build - ``` Commit, push and enjoy! 🍿 diff --git a/componentize_cpy.py b/componentize_cpy.py index 01e7ea7..834851c 100644 --- a/componentize_cpy.py +++ b/componentize_cpy.py @@ -140,9 +140,8 @@ def validate_source_bundle(source): ) ghpython = data.get("ghpython") - sdk_mode = ghpython and ghpython.get("isAdvancedMode", False) - if r'"""' not in python_code and sdk_mode is False: + if r'"""' not in python_code: python_code = r'"""{}"""{}{}'.format( data.get("description", "Generated by Componentizer"), os.linesep, diff --git a/examples/cpy/Test_KitchenSink/code.py b/examples/cpy/Test_KitchenSink/code.py index fca9dad..14465a4 100644 --- a/examples/cpy/Test_KitchenSink/code.py +++ b/examples/cpy/Test_KitchenSink/code.py @@ -21,6 +21,6 @@ class MyComponent(component): def RunScript(self, x: float, y: float, z: float): - ghenv.Component.Message = f"Cpy Version: {platform.python_version()}" + ghenv.Component.Message = 'COMPONENT v{{version}}' result = x + y + z return result diff --git a/examples/cpy/Test_KitchenSink/metadata.json b/examples/cpy/Test_KitchenSink/metadata.json index 86fde85..3d60c7b 100644 --- a/examples/cpy/Test_KitchenSink/metadata.json +++ b/examples/cpy/Test_KitchenSink/metadata.json @@ -9,6 +9,7 @@ "ghpython": { "marshalGuids": true, "iconDisplay": 2, + "isAdvancedMode": true, "inputParameters": [ { "name": "X", diff --git a/examples/cpy/Test_Minimal/code.py b/examples/cpy/Test_Minimal/code.py index 6c8bfa3..098c18d 100644 --- a/examples/cpy/Test_Minimal/code.py +++ b/examples/cpy/Test_Minimal/code.py @@ -12,6 +12,6 @@ """ import platform -ghenv.Component.Message = f"Cpy Version: {platform.python_version()}" +ghenv.Component.Message = 'COMPONENT v{{version}}' a = x + y + z diff --git a/examples/cpy/Test_MinimalSDK/code.py b/examples/cpy/Test_MinimalSDK/code.py deleted file mode 100644 index 0f941e4..0000000 --- a/examples/cpy/Test_MinimalSDK/code.py +++ /dev/null @@ -1,21 +0,0 @@ -""" -Do something silly in Python3. - -This component does nothing useful, it's only a minimal example in Python3. - - Args: - x: X value - y: Y value - z: Z value - Returns: - a: The sum of all three values. -""" - -from ghpythonlib.componentbase import executingcomponent as component - -import platform - -class MinimalSdkComponent(component): - def RunScript(self, x, y, z): - self.Message = f"Cpy Version: {platform.python_version()}" - return (x + y + z) diff --git a/examples/cpy/Test_MinimalSDK/icon.png b/examples/cpy/Test_MinimalSDK/icon.png deleted file mode 100644 index c8df236e3a30d99b26c306af3495da68e531e6e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2759 zcmcgudsGu=77ubjprv&IvC67ruz-)rJo11HL4;BCF^%yq$8 zJf7omT9s%_RK{QgqZQyJqoxFAt)4^kctOEtJx-)kMnFxa(mEOc{>e^0K$9|lf>;SF z^21wMkA)d1+{hSI43ja{sJJQ00Lo)HS^o$85$BmSXZ|xfhBOnT^ z5EK&&F(JAHMlcwjfGQc1)>v#%#0rH2REP)@`Tq*XDTc(2_=}MwfoT|n7Uz2;}mz*a&mjLBdOTu6?W@Y#7qSXi8a(a;&(0=p_A6i|eRNf4<-0-^$BoTyTXDRit6 z*AbLLF5`2B5zsV=`Afwbv04-W3dNKZL{O0sl!^#7h!7Hz#3?l)3LvKJRvKt-GvXP~dbP45 zIgf}?qMN`72LSR~DI{k2SPqSe&q$x#Lk zj0*?D3G0TC@d>LED3U)pO+Tj|FBN&x-jqghPG6vpiRdh&F`94#6_U!;?j;lm{T6)| z&w4R=T#S=yoIpWTf{H<$;@YYfNk~u=pus6bEYYYX(y8QajYAXQ&g0p)E94=n$nIln>6N>aJS6c1>1Nj(e`z$NyLfX+`g*tS&5y6o zPeFx+Cw94gA5$CezW;(BRr7_@On((RP`uyalEU#HT^BuPWF9zr`eJP!uoHCXxX^v; z^Qa%drdnrT>0h_pmpux4^x=alHqhmZ`ah~}r)mlXwYim_%$;>8j@h-gzEl}|VZHm} zGlhu}yGZnE0npHm$j!pgJ#V#uDs? z-tS!cmxfI-VEg`#%g&{p^X+erOpogylxrxV=MQ(hES2AV<+%M^Psw0mqkXt*n#ocS zoAX)j?>}eqD@>NLFMs-GBb0k9=#k&|h4wI#RGqo@+pTeyYd1nKeTo(bC+zgS*Sz5F zqR$qwbz=*cXB_s)tvP6SL;kcY|I?(Iqk@xeg`N?KUTyx8r0N;Yz@`-)-$9xD;^GnlpgT75&yDWV(D?V)2*0rR~&P$m_yaBmoKZy4l zEpeE2@FTRdV2JI%lwb0bIHbs{`O5X|4TnUYdC_|u%MO2it7<4Dc?ZfnqjPUCw>LKh zR-6c)m)Ocb?^M)X#C>FhiU2Wr*{yC~OU{85 z_k2o&fmfnyT58T7!FxBjFRhlD|Eb^K)NkM4zii$|zw>>PQ>ZHqdjA(=+ry}1Nshol zHYcPyP(*{V{)0#xr06}h*nMy;N$_U&>vqW_W~9b>R^G>5>Z9j)K6Pos&hTl&t$W#3 zOD#Sn;TKI~zc>YNY;nDkANk|T_9yeFwaPs57GQ1s^C=HrbBU+F^=j-~=lT@rIFKL; z3n_FhU$eK^kF1@(aE3r0Gwk`W{ATyP`@5^;zOQ=4?pe2BP(HkE=QMY02)q)zHwn4@ zPScFQ2g1N3V;lXHo%_mE$A!^P*Q4uVG{w@@p`Npc!g957v)|ghrSET1e^2?b&#jeF z6Su%lRQGkMqiEvyxscVQr&GqR-9k9&-+P> cdf~`i)t_^mjx6cBXZ_SvgvZL8LsJU=4QD(61^@s6 diff --git a/examples/cpy/Test_MinimalSDK/metadata.json b/examples/cpy/Test_MinimalSDK/metadata.json deleted file mode 100644 index d2e3a8c..0000000 --- a/examples/cpy/Test_MinimalSDK/metadata.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "Minimal SDK component example", - "nickname": "MinSDK", - "description": "This is an example with the minimum of options set using SDK mode and relying on defaults for everything else", - "category": "Componentizer", - "subcategory": "MAIN", - - "ghpython": { - "isAdvancedMode": true, - "inputParameters": [ - { - "name": "x" - }, - { - "name": "y" - }, - { - "name": "z" - } - ], - "outputParameters": [ - { - "name": "a" - } - ] - } -} \ No newline at end of file From 6295a85f6f228fac9419fdd160fa7e089889613a Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 22:22:33 +0100 Subject: [PATCH 31/35] WIP: retesting only one main workflow --- .github/workflows/build-ironpython.yml | 26 ------------------- .../{build-cpython.yml => build.yml} | 24 ++++++++++++++++- 2 files changed, 23 insertions(+), 27 deletions(-) delete mode 100644 .github/workflows/build-ironpython.yml rename .github/workflows/{build-cpython.yml => build.yml} (54%) diff --git a/.github/workflows/build-ironpython.yml b/.github/workflows/build-ironpython.yml deleted file mode 100644 index 3683bcb..0000000 --- a/.github/workflows/build-ironpython.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: build-ironpython - -on: [push] - -jobs: - build_ipy_ghuser_components: - name: windows-ironpython - runs-on: windows-latest - steps: - - uses: actions/checkout@v2 - - uses: NuGet/setup-nuget@v1.0.5 - - - name: Install IronPython - run: | - choco install ironpython --version=2.7.8.1 - - - name: Run - uses: ./ - with: - source: examples/ipy - target: build - - - uses: actions/upload-artifact@v2 - with: - name: ipy_ghuser-components - path: build \ No newline at end of file diff --git a/.github/workflows/build-cpython.yml b/.github/workflows/build.yml similarity index 54% rename from .github/workflows/build-cpython.yml rename to .github/workflows/build.yml index d2470c3..3fd3c85 100644 --- a/.github/workflows/build-cpython.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: build-cpython +name: build on: [push] @@ -25,4 +25,26 @@ jobs: - uses: actions/upload-artifact@v2 with: name: cpy_ghuser-components + path: build + + build_ipy_ghuser_components: + name: windows-ironpython + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - uses: NuGet/setup-nuget@v1.0.5 + + - name: Install IronPython + run: | + choco install ironpython --version=2.7.8.1 + + - name: Run + uses: ./ + with: + source: examples/ipy + target: build + + - uses: actions/upload-artifact@v2 + with: + name: ipy_ghuser-components path: build \ No newline at end of file From d16dab887e775db8d809639f70e4c853e9a539c8 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 22:41:45 +0100 Subject: [PATCH 32/35] CAP: final modifications and readme updated --- .github/workflows/build.yml | 2 - README.md | 76 +++++++++++++++------ examples/cpy/Test_KitchenSink/metadata.json | 1 - 3 files changed, 56 insertions(+), 23 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3fd3c85..0ee9f05 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,7 +4,6 @@ on: [push] jobs: build_cpy_ghuser_components: - name: windows-cpython runs-on: windows-latest steps: - uses: actions/checkout@v2 @@ -28,7 +27,6 @@ jobs: path: build build_ipy_ghuser_components: - name: windows-ironpython runs-on: windows-latest steps: - uses: actions/checkout@v2 diff --git a/README.md b/README.md index 0c9dbbf..06cf9ad 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ > A github action to make Grasshopper development 165% [1] version-control friendlier and 83% more pleasant. -Imagine if you could write your grasshopper components in Python code in an actual text file with a powerful editor? +Imagine if you could write your grasshopper components in Python code (both IronPython for RhinoV7 and less, or CPython for RhinoV8) in an actual text file with a powerful editor? Git wouldn't hate you and life would be so much beautiful. 🐵 Well, here's an action for you then! 🦸‍♀️ @@ -14,56 +14,92 @@ Well, here's an action for you then! 🦸‍♀️ ### Usage from Github Actions The recommended way to use this tool is as a Github Action. -It needs to be run on a windows runner and IronPython/NuGet need to be pre-installed. +It needs to be run on a windows runner and IronPython/NuGet or Python3/pythonnet/Nuget depending of which component you want to build, needs to be pre-installed. Copy the following workflow code into a `.github/workflows/main.yml` file in your repository. Make sure you have the components definition (see below for details) stored in a source folder. Replace the `source` and `target` to match your folder structure. +To specify the interpreter to use, you can define the action parameter `interpreter` to either `ironpython` or `python3` (by default it is `ironpython`). + +For IronPython (RhinoV7 and less): ```yaml on: [push] jobs: - build_ghuser_components: + build_ipy_ghuser_components: runs-on: windows-latest - name: Build components steps: - uses: actions/checkout@v2 - uses: NuGet/setup-nuget@v1.0.5 + - name: Install IronPython run: | choco install ironpython --version=2.7.8.1 - - uses: compas-dev/compas-actions.ghpython_components@v2 + + - name: Run + uses: ./ + with: + source: examples/ipy + target: build + + - uses: actions/upload-artifact@v2 + with: + name: ipy_ghuser-components + path: build +``` + +For Python3 (RhinoV8): + +```yaml +on: [push] + +jobs: + build_cpy_ghuser_components: + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - uses: NuGet/setup-nuget@v1.0.5 + + - name: Install CPython and pythonnet package + run: | + choco install python --version=3.9.10 + python -m pip install pythonnet==3.0.3 + + - name: Run + uses: ./ with: - source: components + source: examples/cpy target: build + interpreter: cpython - # The components have been built at this step. - # Now you can choose what to do with them, e.g.: - # upload them as artifacts: - uses: actions/upload-artifact@v2 with: - name: ghuser-components + name: cpy_ghuser-components path: build ``` + Commit, push and enjoy! 🍿 ### Usage on the command line Alternatively, you can also use this tool directly from the command line. -Make sure to have IronPython installed and the `GH_IO.dll` assembly available. +Make sure to have IronPython or Python3/pythonnet installed and the `GH_IO.dll` assembly available. Then start the script pointing it to a source and target folder, e.g.: - ipy componentize.py examples build + ipy componentize_ipy.py examples build + python componentize_cpy.py examples build Optionally, tag it with a version: - ipy componentize.py examples build --version 0.1.2 + ipy componentize_ipy.py examples build --version 0.1.2 + python componentize_cpy.py examples build --version 0.1.2 An optional name prefix can help tell components apart from other similarly named ones: - ipy componentize.py examples build --prefix "(PACKAGE-NAME)" + ipy componentize_ipy.py examples build --prefix "(PACKAGE-NAME)" + python componentize_cpy.py examples build --prefix "(PACKAGE-NAME)" ## How to create components @@ -95,8 +131,7 @@ An alternative is to include them in your packaging steps, e.g. calling `python ## Python code -* Supports both procedural and GH_Component SDK modes (see `isAdvancedMode` in metadata) -* Supports a small set of templated variables that can be used in code: +Supports a small set of templated variables that can be used in code: * `{{version}}`: Gets replaced with the version, if specified in the command-line. * `{{name}}`: Gets replaced with the name of the component as defined in the metadata file. * `{{ghuser_name}}`: Gets replaced with the name of the `.ghuser` file being generated. @@ -119,10 +154,11 @@ An alternative is to include them in your packaging steps, e.g. calling `python * `128`: Expose the object in the seventh section on the toolbar. * `instanceGuid`: **(optional)** Statically define a GUID for this instance. Defaults to a new Guid. * `ghpython` - * `hideOutput`: **(optional)** Defines whether to hide or not `out` output parameter. Defaults to `True`. - * `hideInput`: **(optional)** Defines whether to hide or not the `code` input parameter. Defaults to `True`. - * `isAdvancedMode`: **(optional)** Defines whether the script is in advanced mode (aka GH_Component SDK mode) or procedural mode. Defaults to `False`. - * `marshalOutGuids`: **(optional)** Defines whether output Guids will be looked up or not. Defaults to `True`. Change to `False` to preserve output Guids. + * `hideOutput`: **(optional ⚠️ only IronPython)** Defines whether to hide or not `out` output parameter. Defaults to `True`. + * `hideInput`: **(optional ⚠️ only IronPython)** Defines whether to hide or not the `code` input parameter. Defaults to `True`. + * `isAdvancedMode`: **(optional ⚠️ only IronPython)** Defines whether the script is in advanced mode (aka GH_Component SDK mode) or procedural mode. Defaults to `False`. + * `marshalOutGuids`: **(optional ⚠️ only IronPython)** Defines whether output Guids will be looked up or not. Defaults to `True`. Change to `False` to preserve output Guids. + * `marshalGuids`: **(optional ⚠️ only CPython)** Defines whether input Guids will be looked up or not. Defaults to `True`. Change to `False` to preserve input Guids. * `iconDisplay`: **(optional)** Defines whether to display the icon or not. Defaults to `0`. * `0` : Application setting * `1` : Text display diff --git a/examples/cpy/Test_KitchenSink/metadata.json b/examples/cpy/Test_KitchenSink/metadata.json index 3d60c7b..86fde85 100644 --- a/examples/cpy/Test_KitchenSink/metadata.json +++ b/examples/cpy/Test_KitchenSink/metadata.json @@ -9,7 +9,6 @@ "ghpython": { "marshalGuids": true, "iconDisplay": 2, - "isAdvancedMode": true, "inputParameters": [ { "name": "X", From 27b3bf2fa86394c61d1488a91da6de31e863b342 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 23 Jan 2024 22:50:30 +0100 Subject: [PATCH 33/35] FIX: forgot to set the example action to market ref --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 06cf9ad..62b3dc2 100644 --- a/README.md +++ b/README.md @@ -37,12 +37,14 @@ jobs: run: | choco install ironpython --version=2.7.8.1 - - name: Run - uses: ./ + - uses: compas-dev/compas-actions.ghpython_components@v2 with: - source: examples/ipy + source: components target: build + # The components have been built at this step. + # Now you can choose what to do with them, e.g.: + # upload them as artifacts: - uses: actions/upload-artifact@v2 with: name: ipy_ghuser-components @@ -66,12 +68,11 @@ jobs: choco install python --version=3.9.10 python -m pip install pythonnet==3.0.3 - - name: Run - uses: ./ + - uses: compas-dev/compas-actions.ghpython_components@v2 with: - source: examples/cpy + source: components target: build - interpreter: cpython + interpreter: cpython # optional, defaults to ironpython - uses: actions/upload-artifact@v2 with: From ac078550f41984e30dc3a8fc68908e13e9f6b103 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Tue, 6 Feb 2024 16:10:32 +0100 Subject: [PATCH 34/35] REVIEW: final modifications integrated --- README.md | 12 ++++++------ componentize_cpy.py | 6 +++--- examples/cpy/Test_KitchenSink/metadata.json | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 62b3dc2..06db679 100644 --- a/README.md +++ b/README.md @@ -89,18 +89,18 @@ Alternatively, you can also use this tool directly from the command line. Make sure to have IronPython or Python3/pythonnet installed and the `GH_IO.dll` assembly available. Then start the script pointing it to a source and target folder, e.g.: - ipy componentize_ipy.py examples build - python componentize_cpy.py examples build + ipy componentize_ipy.py examples/ipy build + python componentize_cpy.py examples/cpy build Optionally, tag it with a version: - ipy componentize_ipy.py examples build --version 0.1.2 - python componentize_cpy.py examples build --version 0.1.2 + ipy componentize_ipy.py examples/ipy build --version 0.1.2 + python componentize_cpy.py examples/cpy build --version 0.1.2 An optional name prefix can help tell components apart from other similarly named ones: - ipy componentize_ipy.py examples build --prefix "(PACKAGE-NAME)" - python componentize_cpy.py examples build --prefix "(PACKAGE-NAME)" + ipy componentize_ipy.py examples/ipy build --prefix "(PACKAGE-NAME)" + python componentize_cpy.py examples/cpy build --prefix "(PACKAGE-NAME)" ## How to create components diff --git a/componentize_cpy.py b/componentize_cpy.py index 834851c..1428869 100644 --- a/componentize_cpy.py +++ b/componentize_cpy.py @@ -7,7 +7,7 @@ import tempfile import urllib.request, urllib.parse, urllib.error import zipfile -from io import StringIO +from io import BytesIO import clr import System @@ -66,9 +66,9 @@ def fetch_ghio_lib(target_folder="temp"): ghio_dll = "GH_IO.dll" filename = "lib/net48/" + ghio_dll - response = urllib.urlopen("https://www.nuget.org/api/v2/package/Grasshopper/") + response = urllib.request.urlopen("https://www.nuget.org/api/v2/package/Grasshopper/") dst_file = os.path.join(target_folder, ghio_dll) - zip_file = zipfile.ZipFile(StringIO.StringIO(response.read())) + zip_file = zipfile.ZipFile(BytesIO(response.read())) with zip_file.open(filename, "r") as zipped_dll: with open(dst_file, "wb") as fp: diff --git a/examples/cpy/Test_KitchenSink/metadata.json b/examples/cpy/Test_KitchenSink/metadata.json index 86fde85..3cfdda9 100644 --- a/examples/cpy/Test_KitchenSink/metadata.json +++ b/examples/cpy/Test_KitchenSink/metadata.json @@ -11,7 +11,7 @@ "iconDisplay": 2, "inputParameters": [ { - "name": "X", + "name": "x", "nickname": "x", "description": "The X value of the component.", "optional": true, @@ -25,7 +25,7 @@ "simplify": false }, { - "name": "Y", + "name": "x", "nickname": "y", "description": "The Y value of the component.", "optional": true, @@ -38,7 +38,7 @@ "simplify": true }, { - "name": "Z", + "name": "z", "nickname": "z", "description": "The Z value of the component.", "optional": true, From fc885953135d57da972ad187ba254c51a53ff92c Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Wed, 7 Feb 2024 22:26:05 +0100 Subject: [PATCH 35/35] ADD-MINOR: description is used for tooltipping the component --- componentize_cpy.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/componentize_cpy.py b/componentize_cpy.py index 1428869..cdffe82 100644 --- a/componentize_cpy.py +++ b/componentize_cpy.py @@ -235,6 +235,7 @@ def create_ghuser_component(source, target, version=None, prefix=None): root.SetString("Name", prefix + data["name"]) root.SetString("NickName", data["nickname"]) root.SetString("Description", data.get("description", "")) + root.SetString("ToolTip", data.get("description", "")) root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"])) root.SetString("Category", data["category"]) root.SetString("SubCategory", data["subcategory"]) @@ -280,6 +281,7 @@ def create_ghuser_component(source, target, version=None, prefix=None): pi_chunk.SetString("NickName", pi.get("nickname") or pi["name"]) pi_chunk.SetString("Description", pi.get("description")) pi_chunk.SetBoolean("Optional", pi.get("optional", True)) + pi_chunk.SetString("ToolTip", pi.get("description", "")) pi_chunk.SetBoolean("AllowTreeAccess", pi.get("allowTreeAccess", True)) pi_chunk.SetBoolean("ShowTypeHints", pi.get("showTypeHints", True)) pi_chunk.SetInt32( @@ -307,6 +309,7 @@ def create_ghuser_component(source, target, version=None, prefix=None): po_chunk.SetString("NickName", po.get("nickname") or po["name"]) po_chunk.SetString("Description", po.get("description")) po_chunk.SetBoolean("Optional", po.get("optional", False)) + po_chunk.SetString("ToolTip", po.get("description", "")) po_chunk.SetInt32("SourceCount", po.get("sourceCount", 0)) po_chunk.SetGuid("InstanceGuid", output_instance_guid) po_chunk.SetBoolean("ReverseData", po.get("reverse", False))