From 749d62730e07cc737679ba3cb493cf3ffa24fcb5 Mon Sep 17 00:00:00 2001 From: Gonzalo Casas Date: Wed, 27 Sep 2023 10:48:33 +0200 Subject: [PATCH] update read/write config example --- scripts/test_read_config.ghx | 1550 ++++++++++------------------------ 1 file changed, 455 insertions(+), 1095 deletions(-) diff --git a/scripts/test_read_config.ghx b/scripts/test_read_config.ghx index f7177074..487b9c82 100644 --- a/scripts/test_read_config.ghx +++ b/scripts/test_read_config.ghx @@ -48,10 +48,10 @@ - 1086 - 137 + -85 + -133 - 3.119375 + 1.38408434 @@ -85,347 +85,129 @@ - 17 + 5 - + - - c552a431-af5b-46a9-a8a4-0fcbc27ef596 - Group + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script - - 1 - - 150;255;255;255 + + import os +import json + +if not filename: + canvas = ghenv.Component.OnPingDocument() + folder = os.path.dirname(canvas.FilePath) + filename = os.path.join(folder, "firebase_config.json") + +if not os.path.exists(filename): + raise Exception("Configuration file not found: {}".format(filename)) + +with open(filename, "r") as f: + config = json.load(f) + + GhPython provides a Python script component + + 52 + 52 - A group of Grasshopper objects - 92aa4c20-fe4a-4518-87bf-85ed10212763 - 61242362-2e84-4feb-b528-a5fdb381fddd - 9a2828f1-72ca-4e3a-b62c-7eb106e0893a - c7864181-48ab-4dc5-ab0e-b7f9b98fec94 - 3a2124a1-71f3-451d-8bd9-6e650882258f - 25a26215-86e8-4e1b-a78f-d16070777ca3 - 57cf2400-a8fb-47ac-8078-83f10c473291 - bd870064-a85f-402f-ac76-14b283c53ef3 - 30876ca9-d681-48e3-b856-84445d4b1685 - dbb7a07d-d81b-47f2-ba5e-36a29b9e92bd - dc4b32d4-e03c-4485-aca8-2866817e362e - 373a098c-a798-4bb4-a829-112fd540e9c5 - 3898a3f5-eefa-4050-a1c4-0c72c4e3d90d - 13 - d3154b83-55df-4f65-979a-47d8f9fab289 - Group - - - - - - - - - - - c552a431-af5b-46a9-a8a4-0fcbc27ef596 - Group - - - - - 1 - - 150;204;238;255 + + 558 + 571 - A group of Grasshopper objects - 61242362-2e84-4feb-b528-a5fdb381fddd - 9a2828f1-72ca-4e3a-b62c-7eb106e0893a - c7864181-48ab-4dc5-ab0e-b7f9b98fec94 - 3a2124a1-71f3-451d-8bd9-6e650882258f - 25a26215-86e8-4e1b-a78f-d16070777ca3 - 57cf2400-a8fb-47ac-8078-83f10c473291 - bd870064-a85f-402f-ac76-14b283c53ef3 - 30876ca9-d681-48e3-b856-84445d4b1685 - dbb7a07d-d81b-47f2-ba5e-36a29b9e92bd - dc4b32d4-e03c-4485-aca8-2866817e362e - 373a098c-a798-4bb4-a829-112fd540e9c5 - 11 - 92aa4c20-fe4a-4518-87bf-85ed10212763 - Group - - - - - - - - - - - 57da07bd-ecab-415d-9d86-af36d7073abc - Number Slider - - - - - Numeric slider for single values - 61242362-2e84-4feb-b528-a5fdb381fddd - Number Slider - Density - false - 0 - - - - - - 56 - 204 - 203 - 20 - - - 56.80993 - 204.2451 - - - - - - 3 - 1 - 1 - 30 - 1 - 0 - 11 - - - - - - - - - 57da07bd-ecab-415d-9d86-af36d7073abc - Number Slider - - - - - Numeric slider for single values - 9a2828f1-72ca-4e3a-b62c-7eb106e0893a - Number Slider - Height - false - 0 - - - - - - 51 - 243 - 208 - 20 - - - 51.25937 - 243.2211 - - - - - - 2 - 1 - 0 - 5 - 0.1 - 0 - 0.8 - - - - - - - - - 57da07bd-ecab-415d-9d86-af36d7073abc - Number Slider - - - - - Numeric slider for single values - c7864181-48ab-4dc5-ab0e-b7f9b98fec94 - Number Slider - Length - false - 0 + true + true + 1 + false + 4d06b21e-5f8a-4459-947f-43f9033dd89d + false + true + GhPython Script + Config Firebase - 51 - 283 - 208 - 20 - - - 51.02408 - 283.8091 - - - - - - 2 - 1 - 0 - 12 - 0.1 - 0 - 11.67 - - - - - - - - - a7a41d0a-2188-4f7a-82cc-1a2c4e4ec850 - Loft - - - - - Create a lofted surface through a set of section curves. - 3a2124a1-71f3-451d-8bd9-6e650882258f - Loft - Loft - - - - - - 2452 - 195 - 108 - 44 + 373 + 191 + 123 + 114 - 2514 - 217 + 439 + 248 - - - 1 - Section curves - c83d00d0-4bf1-4542-b60e-20b8c419096c - Curves - Curves - false - fe9ee2b5-1cec-41a9-b4f3-ced4a004e068 - 1 - - - - - - 2454 - 197 - 45 - 20 - - - 2478 - 207 - - - - - - - - Loft options - 059adbd0-6b7a-4401-87fb-9483422d7837 - Options - Options - false - 0 + + + 1 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 - - - - 2454 - 217 - 45 - 20 - - - 2478 - 227 - - - - - - 1 + + + true + Script variable Python + ed4dca4a-eed2-46de-abc8-9dc1a11bf6b1 + config_file + filename + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 - + - 1 - {0} + + 375 + 193 + 49 + 110 + + + 401 + 248 + - - - - false - false - 0 - 0 - 0 - 10 - 0.01 - - - - - - - - Resulting Loft surfaces - eb807ff7-00f8-44c0-980d-9bc70e6d45a6 - Loft - Loft - false - 0 - - - - - - 2529 - 197 - 29 - 40 - - - 2543.5 - 217 - + + + Script output config. + f2e797e8-eee0-433d-9a12-82a0a4f7b16f + a + config + false + 0 + + + + + 454 + 193 + 40 + 110 + + + 474 + 248 + + + + @@ -433,184 +215,164 @@ - - - c552a431-af5b-46a9-a8a4-0fcbc27ef596 - Group - - - - - 1 - - 150;240;218;146 - - A group of Grasshopper objects - 3a2124a1-71f3-451d-8bd9-6e650882258f - 1 - 25a26215-86e8-4e1b-a78f-d16070777ca3 - Group - Loft the two curves to create a surface - - - - - - - - - - 4c4e56eb-2f04-43f9-95a3-cc46a14f495a - Line + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script - - Create a line between two points. - 57cf2400-a8fb-47ac-8078-83f10c473291 - Line - Line + + + GhPython provides a Python script component + true + false + 1 + false + f63d8cd4-2998-447a-a1ee-aa6d37b50246 + false + true + GhPython Script + Init to firebase - + - 137 - 138 - 122 - 44 + 682 + 220 + 72 + 109 - 212 - 160 + 711 + 275 - + - Line start point - bb107902-8eb8-4215-907c-a0d23eadddfa - Start Point - Start Point - false - 0 + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 2 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 - - - - - 139 - 140 - 58 - 20 - - - 169.5 - 150 - - - - - - 1 + + + + true + Script variable Python + 61e47b22-8335-4a68-8bde-9ab8d8452560 + x + x + true + 0 + true + f2e797e8-eee0-433d-9a12-82a0a4f7b16f + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 - + - 1 - {0} + + 684 + 222 + 12 + 52 + + + 691.5 + 248.25 + - - - - - - 13.9137459 - 0.405946109437339 - 0 - - - - - - - - - Line end point - 7f57958d-76a1-491b-9971-bba90166f1b3 - End Point - End Point - false - 0 - - - - - - 139 - 160 - 58 - 20 - - - 169.5 - 170 - + + + true + Script variable Python + c03664e1-b205-44b6-81d3-49c3d8f59c41 + y + y + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + 684 + 274 + 12 + 53 + + + 691.5 + 300.75 + + + + - - - 1 + + + The execution information, as output and error streams + 3ac5feae-897f-436f-afae-4b269f27bec4 + out + out + false + 0 - + - 1 - {0} + + 726 + 222 + 26 + 52 + + + 739 + 248.25 + - - - - - - 13.9137459 - 22.3850283204019 - 0 - - - - - - - - - Line segment - a8e9c393-e0f6-46c7-88b8-139688209808 - Line - Line - false - 0 - - - - - - 227 - 140 - 30 - 40 - - - 242 - 160 - + + + Script variable Python + 9ee76e88-be9e-4a4e-80ff-2a1427233d61 + a + a + false + 0 + + + + + 726 + 274 + 26 + 53 + + + 739 + 300.75 + + + + @@ -618,35 +380,7 @@ - - - c552a431-af5b-46a9-a8a4-0fcbc27ef596 - Group - - - - - 1 - - 150;240;218;146 - - A group of Grasshopper objects - 61242362-2e84-4feb-b528-a5fdb381fddd - 9a2828f1-72ca-4e3a-b62c-7eb106e0893a - c7864181-48ab-4dc5-ab0e-b7f9b98fec94 - 57cf2400-a8fb-47ac-8078-83f10c473291 - 4 - bd870064-a85f-402f-ac76-14b283c53ef3 - Group - Inputs - - - - - - - - + 410755b1-224a-4c1e-a407-bf32fb45ea7e 00000000-0000-0000-0000-000000000000 @@ -655,169 +389,152 @@ - from compas.geometry import Translation, Point, NurbsCurve -from compas_rhino.conversions import RhinoPolyline -import Rhino.Geometry as rg - - -# Divide curve -c = RhinoPolyline.from_geometry(curve).to_compas() -divisions = c.divide(count) + config = { + "apiKey": api_key, + "authDomain": auth_domain, + "databaseURL": database_url, + "projectId": project_id, + "storageBucket": storage_bucket, + "messagingSenderId": messaging_sender_id, + "appId": app_id, + "measurementId": measurement_id +} -# Move every second point up and build a new list with all points -points = [] - -for i, point in enumerate(divisions): - if i % 2 == 1: - points.append(point) - else: - moved_point = Point(point.x, point.y, point.z + height) - points.append(moved_point) - - -# Create interpolated curves -curve = NurbsCurve.from_interpolation(points) - -# Move second curve -translation = Translation.from_vector([length, 0, 0]) -moved_curve = curve.transformed(translation) - -curves = [curve, moved_curve] - +config = config.items() GhPython provides a Python script component - 486 - 537 + 52 + 52 - 770 - 734 + 558 + 571 true true 1 false - 30876ca9-d681-48e3-b856-84445d4b1685 + aff994bb-5aca-4fe1-8757-96acf36c7ddb false true GhPython Script - Loft 1 curve + Config Firebase from Options - 506 - 184 - 113 - 91 + 364 + 376 + 184 + 204 - 561 - 230 + 491 + 478 - - 4 + + 8 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 - 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 8ec86459-bf01-4409-baee-174d0d2b13d0 - 8ec86459-bf01-4409-baee-174d0d2b13d0 - + - + true Script variable Python - 390aa59c-b562-4cd2-b308-711b2cb23226 - curve - curve + aa299fe3-b3d3-48f7-80a7-950532116768 + api_key + api_key true 0 true - a8e9c393-e0f6-46c7-88b8-139688209808 - 1 - f802a8cd-e699-4a94-97ea-83b5406271de + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 - 508 - 186 - 38 - 21 + 366 + 378 + 110 + 25 - 528.5 - 196.875 + 422.5 + 390.5 - + true - Script input count. - a0f1af91-d9ca-46db-9662-9bb72bc51838 - count - count + Script input auth_domain. + bda9b637-f08f-44f8-b5bd-82846f188df7 + auth_domain + auth_domain true 0 true - 61242362-2e84-4feb-b528-a5fdb381fddd - 1 + 0 87f87f55-5b71-41f4-8aea-21d494016f81 - 508 - 207 - 38 - 22 + 366 + 403 + 110 + 25 - 528.5 - 218.625 + 422.5 + 415.5 - + true - Script input height. - baf05c5e-e27e-48f8-8442-9a3607f76ee9 - height - height + Script input database_url. + 80ada835-a61a-4c4f-b82a-b65c3259c766 + database_url + database_url true 0 true - 9a2828f1-72ca-4e3a-b62c-7eb106e0893a - 1 + 0 87f87f55-5b71-41f4-8aea-21d494016f81 - 508 - 229 - 38 - 22 + 366 + 428 + 110 + 25 - 528.5 - 240.375 + 422.5 + 440.5 @@ -826,14 +543,14 @@ curves = [curve, moved_curve] true - Script input length. - b087ecaa-e53f-423a-bb0d-1edefb93c6d3 - length - length + Script input project_id. + b3433dd3-3068-4471-8708-b021dce374b9 + project_id + project_id true 0 true - c7864181-48ab-4dc5-ab0e-b7f9b98fec94 + cd5468d8-fb3d-49c5-a75d-18156c5c910e 1 87f87f55-5b71-41f4-8aea-21d494016f81 @@ -841,296 +558,134 @@ curves = [curve, moved_curve] - 508 - 251 - 38 - 22 + 366 + 453 + 110 + 25 - 528.5 - 262.125 + 422.5 + 465.5 - - - Script output curves. - 171a4df8-564a-4127-839a-c17afc6d079e - curves - curves - false - 0 - - - - - - 576 - 186 - 41 - 43 - - - 596.5 - 207.75 - - - - - - - - Script output points. - 97d43e97-a9ba-45f5-b3ad-3e3a178d5118 - points - points - false + + + true + Script input storage_bucket. + 9c96e9e1-4230-4a26-8b88-73a08e83baa6 + storage_bucket + storage_bucket + true + 0 + true 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 - 576 - 229 - 41 - 44 + 366 + 478 + 110 + 25 - 596.5 - 251.25 + 422.5 + 490.5 - - - - - - - - - 410755b1-224a-4c1e-a407-bf32fb45ea7e - 00000000-0000-0000-0000-000000000000 - Draw - - - - - """ -Draws COMPAS geometry in Grasshopper. -""" -from ghpythonlib.componentbase import executingcomponent as component - -from compas.artists import Artist - - -class CompasToRhinoGeometry(component): - def RunScript(self, cg): - if not cg: - return None - - return Artist(cg).draw() - - Draws COMPAS geometry in Grasshopper. - true - true - 2 - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDwAACw8BkvkDpQAABA5JREFUSEu1lW9MlWUYxt8B4iHBAwF2OAgJdILIIdQaTZJVo1VSiw/R9ANGRhuVqy3SsRabK8fMWGy2ViwHDZMPZRMK1sx0q9WYnejPWrZ5yvknYxEsOwjhwby6ruec5+2oB+tLz/Y7z/u+z3nv6/7zPPfrcCTFSCVXkQySSbLJMnINySG5sWdaW0rSyGKyiCQBcBKhkUI8ZAm5mvjIclJCric3kFISiD0rJPlEohKT0IIiGvLCS+ThtaSM3OvNzA5zRu6y/Igvr3Cc1/3kMVJJyonE/ETvykbyQgIKV2m4jlSQ/tRUD2pq78eewRBe2LEX6zZsRlHJSv0b6RmZF7JzfGfTM7xjvJeI0qjUKorLRDQU6gpST6+nPWlLsP7hLXjl9QOG57ftQc/uIA4ejhi6ew6huLTGiJGVROlMJ6phQgHlsywpOQWB0kq8+faYMTT08YQRGGAUVqy5dTtyC25F2R29VqCKqCaqhQQuq4OGPFBq0LgpiLsbu7DmrhZU3HQnNrR0GMMSu2VNE3yBdSiu3o6KtSNWQPVQ3WwdEgoUkFUEj26NuKxtPoCm9gk0PLIX/qLVFwK3vWoMXyJgI7iigCJIKGCviyqajVErIPT/2HtyUBvl31PU0BpMKKC1heAJPctZh3NBARVZu8GkRIZF9T1dbpq01huj3+NgIMvBE5muyDMki+ig6sAqVQYrkEd0uFyP4yNQVFqLN/5Onmt8H1GK7KlWLZQuzV4roIOiNpBQQGgt3vh7xQ6e8rsibURO6rCqzQjd+62A+o+2GgKVTaht2GW8vlQg3vhQuYORmx20BVyRZ4eHhxt/n54NhefOz9OwHVyKFkiKLy5Oy/h2aVbBbHKKB8mL0uBbUYuq2zuMEZtzeS7j+2scHKxz0L4q+ryvrw+z839h9NQM3vhyEt2jE66AuqFyptAUiTqnir6RDHmzlv/C2Rgh72uW5zL+yX0OPn/QQX1JdH3TyClsHDyBLR+dxtGpOVdATUoiKo5t19pZ6k9qgAFuxRnO7UTNbTMxnst4x+qo8eond2D9u8cM/d9MyrgGl7h3ib4J2lrqitpuikhbTy3cFs8UjujcGBHreVXrS3hgIOSya+y3mP1/BEQykZAisl83iWkWEtUXza+CKue8xkPPdaPurR8uYv+PZ/Dp8XBUQD8xJSsUjxXULDFF5Z8Mz4Smz51H24fHMT4dwdHJP/H4B8dQ3fOdmbVW13fkYoFEcFghRacodJjyp2Yi84NHplC+82vDa4fHEaZRzV/8PG1mPTc24g1eiZiAUlTIe7TsC6Hg5aDLjTu/Qu/YrzgdPoeth06ae/Oefv4LHEpRTmdnZw3vUb/7e3i3jboUdgVx8swcnh75CZ+d+MMImff08/8B529CuaEdFQ0o4QAAAABJRU5ErkJggg== - - false - dbb7a07d-d81b-47f2-ba5e-36a29b9e92bd - true - true - Draw - Draw - - - - - - 669 - 237 - 73 - 28 - - - 705 - 251 - - - - - - 1 - 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 - 1 - 8ec86459-bf01-4409-baee-174d0d2b13d0 - - - - + + true - The COMPAS geometry or datastructure to be drawn. - a301bc82-391d-41a2-9224-b8eb357313d9 - cg - cg + Script input messaging_sender_id. + 4b5b12e2-4320-4b1e-bc1c-cee3910e07c5 + messaging_sender_id + messaging_sender_id true 0 true - 97d43e97-a9ba-45f5-b3ad-3e3a178d5118 - 1 + 0 87f87f55-5b71-41f4-8aea-21d494016f81 - 671 - 239 - 19 - 24 + 366 + 503 + 110 + 25 - 682 - 251 + 422.5 + 515.5 - - - The Rhino geometry object. - 6c807a6e-933e-4cfc-a7e7-166bf1043a11 - rg - rg - false + + + true + Script input app_id. + 3efd2c32-8f3d-4eaa-8e7a-b797de952f22 + x + app_id + true + 0 + true 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 - 720 - 239 - 20 - 24 + 366 + 528 + 110 + 25 - 730 - 251 + 422.5 + 540.5 - - - - - - - - - 410755b1-224a-4c1e-a407-bf32fb45ea7e - 00000000-0000-0000-0000-000000000000 - Draw - - - - - """ -Draws COMPAS geometry in Grasshopper. -""" -from ghpythonlib.componentbase import executingcomponent as component - -from compas.artists import Artist - - -class CompasToRhinoGeometry(component): - def RunScript(self, cg): - if not cg: - return None - - return Artist(cg).draw() - - Draws COMPAS geometry in Grasshopper. - - 156 - 156 - - - 558 - 571 - - true - true - 2 - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAABA5JREFUSEu1lW9MlWUYxt8B4iHBAwF2OAgJdILIIdQaTZJVo1VSiw/R9ANGRhuVqy3SsRabK8fMWGy2ViwHDZMPZRMK1sx0q9WYnejPWrZ5yvknYxEsOwjhwby6ruec5+2oB+tLz/Y7z/u+z3nv6/7zPPfrcCTFSCVXkQySSbLJMnINySG5sWdaW0rSyGKyiCQBcBKhkUI8ZAm5mvjIclJCric3kFISiD0rJPlEohKT0IIiGvLCS+ThtaSM3OvNzA5zRu6y/Igvr3Cc1/3kMVJJyonE/ETvykbyQgIKV2m4jlSQ/tRUD2pq78eewRBe2LEX6zZsRlHJSv0b6RmZF7JzfGfTM7xjvJeI0qjUKorLRDQU6gpST6+nPWlLsP7hLXjl9QOG57ftQc/uIA4ejhi6ew6huLTGiJGVROlMJ6phQgHlsywpOQWB0kq8+faYMTT08YQRGGAUVqy5dTtyC25F2R29VqCKqCaqhQQuq4OGPFBq0LgpiLsbu7DmrhZU3HQnNrR0GMMSu2VNE3yBdSiu3o6KtSNWQPVQ3WwdEgoUkFUEj26NuKxtPoCm9gk0PLIX/qLVFwK3vWoMXyJgI7iigCJIKGCviyqajVErIPT/2HtyUBvl31PU0BpMKKC1heAJPctZh3NBARVZu8GkRIZF9T1dbpq01huj3+NgIMvBE5muyDMki+ig6sAqVQYrkEd0uFyP4yNQVFqLN/5Onmt8H1GK7KlWLZQuzV4roIOiNpBQQGgt3vh7xQ6e8rsibURO6rCqzQjd+62A+o+2GgKVTaht2GW8vlQg3vhQuYORmx20BVyRZ4eHhxt/n54NhefOz9OwHVyKFkiKLy5Oy/h2aVbBbHKKB8mL0uBbUYuq2zuMEZtzeS7j+2scHKxz0L4q+ryvrw+z839h9NQM3vhyEt2jE66AuqFyptAUiTqnir6RDHmzlv/C2Rgh72uW5zL+yX0OPn/QQX1JdH3TyClsHDyBLR+dxtGpOVdATUoiKo5t19pZ6k9qgAFuxRnO7UTNbTMxnst4x+qo8eond2D9u8cM/d9MyrgGl7h3ib4J2lrqitpuikhbTy3cFs8UjujcGBHreVXrS3hgIOSya+y3mP1/BEQykZAisl83iWkWEtUXza+CKue8xkPPdaPurR8uYv+PZ/Dp8XBUQD8xJSsUjxXULDFF5Z8Mz4Smz51H24fHMT4dwdHJP/H4B8dQ3fOdmbVW13fkYoFEcFghRacodJjyp2Yi84NHplC+82vDa4fHEaZRzV/8PG1mPTc24g1eiZiAUlTIe7TsC6Hg5aDLjTu/Qu/YrzgdPoeth06ae/Oefv4LHEpRTmdnZw3vUb/7e3i3jboUdgVx8swcnh75CZ+d+MMImff08/8B529CuaEdFQ0o4QAAAABJRU5ErkJggg== - - false - dc4b32d4-e03c-4485-aca8-2866817e362e - true - true - Draw - Draw - - - - - - 669 - 193 - 73 - 28 - - - 705 - 207 - - - - - - 1 - 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 - 1 - 8ec86459-bf01-4409-baee-174d0d2b13d0 - - - - + + true - The COMPAS geometry or datastructure to be drawn. - 0e39fea7-3633-405f-b087-0e6e81a3b143 - cg - cg + Script input measurement_id. + a364d962-31fe-4617-a5df-30eb11ef538d + y + measurement_id true 0 true - 171a4df8-564a-4127-839a-c17afc6d079e - 1 + 0 87f87f55-5b71-41f4-8aea-21d494016f81 - 671 - 195 - 19 - 24 + 366 + 553 + 110 + 25 - 682 - 207 + 422.5 + 565.5 @@ -1138,10 +693,10 @@ class CompasToRhinoGeometry(component): - The Rhino geometry object. - fe9ee2b5-1cec-41a9-b4f3-ced4a004e068 - rg - rg + Script output config. + 8bc2b949-56cf-4a0c-b43f-f39e5e69cdcf + config + config false 0 @@ -1149,14 +704,14 @@ class CompasToRhinoGeometry(component): - 720 - 195 - 20 - 24 + 506 + 378 + 40 + 200 - 730 - 207 + 526 + 478 @@ -1168,121 +723,59 @@ class CompasToRhinoGeometry(component): - + - c552a431-af5b-46a9-a8a4-0fcbc27ef596 - Group + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel - 1 - - 150;240;218;146 - - A group of Grasshopper objects - 30876ca9-d681-48e3-b856-84445d4b1685 - 1 - 373a098c-a798-4bb4-a829-112fd540e9c5 - Group - Loft a surface from a single curve + parameters - - - - - - - - - - 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe - Scribble - - - - - false - - 37.94836 - 66.97205 - - - 354.1105 - 66.97205 - - - 354.1105 - 90.11658 - - - 37.94836 - 90.11658 - - A quick note - Microsoft Sans Serif - 3898a3f5-eefa-4050-a1c4-0c72c4e3d90d - false - Scribble - Scribble - 25 - Python, single script version + A panel for custom notes and text values + cd5468d8-fb3d-49c5-a75d-18156c5c910e + Panel + Panel + false + 0 + 0 + asd - + - + - 32.94836 - 61.97205 - 326.1621 - 33.14453 + 155 + 409 + 160 + 100 + 0 + 0 + 0 - 37.94836 - 66.97205 + 155.3412 + 409.5542 - - - - - - - 8ec86459-bf01-4409-baee-174d0d2b13d0 - Data - - - - - Contains a collection of generic data - 1 - e9595aaa-65e3-480b-bb8d-36ffec8c9e25 - Data - Surface - false - eb807ff7-00f8-44c0-980d-9bc70e6d45a6 - 1 - - - - - - 303 - 519 - 50 - 20 - - - 328.7722 - 529.084 + + + + 255;255;250;90 + true + true + true + false + false + true - + 410755b1-224a-4c1e-a407-bf32fb45ea7e 00000000-0000-0000-0000-000000000000 @@ -1299,12 +792,11 @@ if not filename: folder = os.path.dirname(canvas.FilePath) filename = os.path.join(folder, "firebase_config.json") -if not os.path.exists(filename): - raise Exception("Configuration file not found: {}".format(filename)) - - -with open(filename, "r") as f: - config = json.load(f) +config = dict(config) +with open(filename, "w") as f: + json.dump(config, f) + print(filename) + print(config) GhPython provides a Python script component @@ -1319,7 +811,7 @@ with open(filename, "r") as f: true 1 false - 4d06b21e-5f8a-4459-947f-43f9033dd89d + c3536039-5ed1-40dd-b1db-31e965a91309 false true GhPython Script @@ -1329,144 +821,38 @@ with open(filename, "r") as f: - -298 - -10 + 655 + 449 123 114 - -232 - 47 + 721 + 506 - - 1 + + 2 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 1 8ec86459-bf01-4409-baee-174d0d2b13d0 - + - + + 1 true Script variable Python - ed4dca4a-eed2-46de-abc8-9dc1a11bf6b1 - config_file - filename - true - 0 - true - 0 - 87f87f55-5b71-41f4-8aea-21d494016f81 - - - - - - -296 - -8 - 49 - 110 - - - -270 - 47 - - - - - - - - Script output config. - f2e797e8-eee0-433d-9a12-82a0a4f7b16f - a + f7693f90-4d85-4982-8300-2833ca9f490b + config config - false - 0 - - - - - - -217 - -8 - 40 - 110 - - - -197 - 47 - - - - - - - - - - - - - - 410755b1-224a-4c1e-a407-bf32fb45ea7e - 00000000-0000-0000-0000-000000000000 - GhPython Script - - - - - - GhPython provides a Python script component - true - false - 1 - false - f63d8cd4-2998-447a-a1ee-aa6d37b50246 - false - true - GhPython Script - Init to firebase - - - - - - -114 - 19 - 72 - 109 - - - -85 - 74 - - - - - - 2 - 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 - 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 - 2 - 3ede854e-c753-40eb-84cb-b48008f14fd4 - 8ec86459-bf01-4409-baee-174d0d2b13d0 - - - - - true - Script variable Python - 61e47b22-8335-4a68-8bde-9ab8d8452560 - x - x true - 0 + 1 true - f2e797e8-eee0-433d-9a12-82a0a4f7b16f + 8bc2b949-56cf-4a0c-b43f-f39e5e69cdcf 1 87f87f55-5b71-41f4-8aea-21d494016f81 @@ -1474,14 +860,14 @@ with open(filename, "r") as f: - -112 - 21 - 12 - 52 + 657 + 451 + 49 + 55 - -104.5 - 47.25 + 683 + 478.5 @@ -1490,10 +876,10 @@ with open(filename, "r") as f: true - Script variable Python - c03664e1-b205-44b6-81d3-49c3d8f59c41 - y - y + Script input filename. + 215727e6-80d6-424c-89b1-b1068577c7a7 + x + filename true 0 true @@ -1504,14 +890,14 @@ with open(filename, "r") as f: - -112 - 73 - 12 - 53 + 657 + 506 + 49 + 55 - -104.5 - 99.75 + 683 + 533.5 @@ -1519,36 +905,10 @@ with open(filename, "r") as f: - The execution information, as output and error streams - 3ac5feae-897f-436f-afae-4b269f27bec4 - out - out - false - 0 - - - - - - -70 - 21 - 26 - 52 - - - -57 - 47.25 - - - - - - - - Script variable Python - 9ee76e88-be9e-4a4e-80ff-2a1427233d61 - a - a + Script output config. + ef882f1c-6572-42f2-87c1-3eedde3cfbd2 + config + config false 0 @@ -1556,14 +916,14 @@ with open(filename, "r") as f: - -70 - 73 - 26 - 53 + 736 + 451 + 40 + 110 - -57 - 99.75 + 756 + 506 @@ -1582,7 +942,7 @@ with open(filename, "r") as f: - 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