From 5f8aa6b5548c3d9f2c491edc26d1212c06f73843 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 17 Mar 2026 14:00:12 +0100 Subject: [PATCH 1/3] fix(edge_attribute): Adds missing RPC & shema for mesh edges attribute. Tests added with new data --- opengeodeweb_viewer_schemas.json | 32 +++ .../edge/edges_attribute_edge_protocols.py | 13 + .../edges/attribute/edge/schemas/__init__.py | 1 + .../attribute/edge/schemas/color_map.json | 26 ++ .../edges/attribute/edge/schemas/color_map.py | 15 ++ tests/data/123456789/edged_curve3D.vtp | 21 ++ tests/data/edged_curve3D.vtp | 21 ++ .../images/mesh/edges/edge_color_map.jpeg | Bin 0 -> 14835 bytes .../mesh/edges/edge_color_map_rainbow.jpeg | Bin 0 -> 17012 bytes .../edges/edge_color_map_rainbow_initial.jpeg | Bin 0 -> 16668 bytes .../edges/edge_color_map_range_update.jpeg | Bin 0 -> 15120 bytes .../test_edges_attribute_edge_protocols.py | 229 +++++++++++++++++- 12 files changed, 357 insertions(+), 1 deletion(-) create mode 100644 src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/schemas/color_map.json create mode 100644 src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/schemas/color_map.py create mode 100644 tests/data/123456789/edged_curve3D.vtp create mode 100644 tests/data/edged_curve3D.vtp create mode 100644 tests/data/images/mesh/edges/edge_color_map.jpeg create mode 100644 tests/data/images/mesh/edges/edge_color_map_rainbow.jpeg create mode 100644 tests/data/images/mesh/edges/edge_color_map_rainbow_initial.jpeg create mode 100644 tests/data/images/mesh/edges/edge_color_map_range_update.jpeg diff --git a/opengeodeweb_viewer_schemas.json b/opengeodeweb_viewer_schemas.json index 0c3aa9b3..47ffb9db 100644 --- a/opengeodeweb_viewer_schemas.json +++ b/opengeodeweb_viewer_schemas.json @@ -234,6 +234,38 @@ "name" ], "additionalProperties": false + }, + "color_map": { + "$id": "opengeodeweb_viewer.mesh.edges.attribute.edge.color_map", + "rpc": "color_map", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "points": { + "type": "array", + "description": "Flat array of [value, r, g, b, ...]", + "items": { + "type": "number" + }, + "minItems": 8 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": [ + "id", + "points", + "minimum", + "maximum" + ], + "additionalProperties": false } }, "vertex": { diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/edges_attribute_edge_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/edges_attribute_edge_protocols.py index 30c3ccfc..f95eb994 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/edges_attribute_edge_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/edges_attribute_edge_protocols.py @@ -35,3 +35,16 @@ def setMeshEdgesEdgeName(self, rpc_params: RpcParams) -> None: ) params = schemas.Name.from_dict(rpc_params) self.displayAttributeOnCells(params.id, params.name) + + @exportRpc( + mesh_edges_attribute_edge_prefix + + mesh_edges_attribute_edge_schemas_dict["color_map"]["rpc"] + ) + def setMeshEdgesEdgeColorMap(self, rpc_params: RpcParams) -> None: + validate_schema( + rpc_params, + self.mesh_edges_attribute_edge_schemas_dict["color_map"], + self.mesh_edges_attribute_edge_prefix, + ) + params = schemas.ColorMap.from_dict(rpc_params) + self.setupColorMap(params.id, params.points, params.minimum, params.maximum) diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/schemas/__init__.py index 1faac9b8..ef745855 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/schemas/__init__.py @@ -1 +1,2 @@ from .name import * +from .color_map import * diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/schemas/color_map.json b/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/schemas/color_map.json new file mode 100644 index 00000000..95737cc6 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/schemas/color_map.json @@ -0,0 +1,26 @@ +{ + "rpc": "color_map", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "points": { + "type": "array", + "description": "Flat array of [value, r, g, b, ...]", + "items": { + "type": "number" + }, + "minItems": 8 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + } + }, + "required": ["id", "points", "minimum", "maximum"], + "additionalProperties": false +} diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/schemas/color_map.py b/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/schemas/color_map.py new file mode 100644 index 00000000..7fbb9d2a --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/attribute/edge/schemas/color_map.py @@ -0,0 +1,15 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass +from typing import List + + +@dataclass +class ColorMap(DataClassJsonMixin): + def __post_init__(self) -> None: + print(self, flush=True) + + id: str + maximum: float + minimum: float + points: List[float] + """Flat array of [value, r, g, b, ...]""" diff --git a/tests/data/123456789/edged_curve3D.vtp b/tests/data/123456789/edged_curve3D.vtp new file mode 100644 index 00000000..d3f78ce0 --- /dev/null +++ b/tests/data/123456789/edged_curve3D.vtp @@ -0,0 +1,21 @@ + + + + + + 0.10942 0.532085 1 0.0989554 0.440531 1 0.127689 0.326914 1 -0.0570336 0.453631 1 -0.0440269 0.283532 1 0.0785397 0.338299 1 -0.014577 0.077456 1 0.155983 0.163299 1 0.0333169 0.16082 1 0.321452 0.0802363 1 0.355327 0.212219 1 0.252025 0.158717 1 0.428656 0.359 1 0.299515 0.365925 1 0.316268 0.303525 1 0.318692 0.624577 1 0.210924 0.577468 1 0.314173 0.57517 1 -0.0731802 0.632736 1 -0.0996019 0.598172 1 -0.162041 0.600724 1 -0.147729 0.444528 1 -0.0853436 0.517832 1 -0.0996019 0.598172 1 0.0963617 0.532762 1 0.10407 0.544358 1 -0.195351 0.421707 1 -0.105346 0.266847 1 -0.0987086 0.302912 1 -0.105346 0.266847 1 -0.115428 0.266928 1 -0.118175 0.257315 1 -0.0859438 0.0429719 1 -0.0351803 0.0175902 1 -0.0351803 0.0175902 1 -0.106668 0.248327 1 -0.118175 0.257315 1 + + + 0.109419576823711 0.53208464384079 1 0.0989554226398468 0.440531343221664 1 0.127689048647881 0.326913595199585 1 -0.0570335872471333 0.453630566596985 1 -0.0440268628299236 0.283532381057739 1 0.0785397067666054 0.338299185037613 1 -0.0145769733935595 0.0774560123682022 1 0.155983060598373 0.163299322128296 1 0.0333169139921665 0.160820126533508 1 0.32145157456398 0.0802362933754921 1 0.35532745718956 0.212218835949898 1 0.252025336027145 0.158717021346092 1 0.428656339645386 0.358999729156494 1 0.29951485991478 0.365925401449203 1 0.316268235445023 0.303525328636169 1 0.31869176030159 0.624576926231384 1 0.210924133658409 0.577467858791351 1 0.314173072576523 0.57517009973526 1 -0.0731801614165306 0.632735967636108 1 -0.0996019020676613 0.598172128200531 1 -0.162041246891022 0.600724041461945 1 -0.147729307413101 0.444528311491013 1 -0.0853436291217804 0.517831742763519 1 -0.0996019020676613 0.598172128200531 1 0.0963616594672203 0.532761991024017 1 0.104069948196411 0.544358432292938 1 -0.195351168513298 0.42170724272728 1 -0.105345673859119 0.266847312450409 1 -0.0987086147069931 0.302912443876266 1 -0.105345673859119 0.266847312450409 1 -0.115427635610104 0.266927510499954 1 -0.118174657225609 0.257315069437027 1 -0.0859437808394432 0.0429718904197216 1 -0.0351803153753281 0.017590157687664 1 -0.0351803153753281 0.017590157687664 1 -0.106668494641781 0.248327031731606 1 -0.118174657225609 0.257315069437027 1 + + + 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 6 6 6 6 6 7 7 7 8 8 8 8 8 8 8 8 + 0 1 1 2 0 2 3 4 4 5 3 5 6 7 7 8 6 8 9 10 10 11 9 11 12 13 13 14 12 14 15 16 16 17 15 17 18 19 19 20 20 21 21 22 22 23 23 24 24 25 18 25 26 27 27 28 26 28 29 30 30 31 31 32 32 33 33 34 34 35 35 36 29 36 + + + 0 1 1 2 0 2 3 4 4 5 3 5 6 7 7 8 6 8 9 10 10 11 9 11 12 13 13 14 12 14 15 16 16 17 15 17 18 19 19 20 20 21 21 22 22 23 23 24 24 25 18 25 26 27 27 28 26 28 29 30 30 31 31 32 32 33 33 34 34 35 35 36 29 36 + 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 + + + + diff --git a/tests/data/edged_curve3D.vtp b/tests/data/edged_curve3D.vtp new file mode 100644 index 00000000..d3f78ce0 --- /dev/null +++ b/tests/data/edged_curve3D.vtp @@ -0,0 +1,21 @@ + + + + + + 0.10942 0.532085 1 0.0989554 0.440531 1 0.127689 0.326914 1 -0.0570336 0.453631 1 -0.0440269 0.283532 1 0.0785397 0.338299 1 -0.014577 0.077456 1 0.155983 0.163299 1 0.0333169 0.16082 1 0.321452 0.0802363 1 0.355327 0.212219 1 0.252025 0.158717 1 0.428656 0.359 1 0.299515 0.365925 1 0.316268 0.303525 1 0.318692 0.624577 1 0.210924 0.577468 1 0.314173 0.57517 1 -0.0731802 0.632736 1 -0.0996019 0.598172 1 -0.162041 0.600724 1 -0.147729 0.444528 1 -0.0853436 0.517832 1 -0.0996019 0.598172 1 0.0963617 0.532762 1 0.10407 0.544358 1 -0.195351 0.421707 1 -0.105346 0.266847 1 -0.0987086 0.302912 1 -0.105346 0.266847 1 -0.115428 0.266928 1 -0.118175 0.257315 1 -0.0859438 0.0429719 1 -0.0351803 0.0175902 1 -0.0351803 0.0175902 1 -0.106668 0.248327 1 -0.118175 0.257315 1 + + + 0.109419576823711 0.53208464384079 1 0.0989554226398468 0.440531343221664 1 0.127689048647881 0.326913595199585 1 -0.0570335872471333 0.453630566596985 1 -0.0440268628299236 0.283532381057739 1 0.0785397067666054 0.338299185037613 1 -0.0145769733935595 0.0774560123682022 1 0.155983060598373 0.163299322128296 1 0.0333169139921665 0.160820126533508 1 0.32145157456398 0.0802362933754921 1 0.35532745718956 0.212218835949898 1 0.252025336027145 0.158717021346092 1 0.428656339645386 0.358999729156494 1 0.29951485991478 0.365925401449203 1 0.316268235445023 0.303525328636169 1 0.31869176030159 0.624576926231384 1 0.210924133658409 0.577467858791351 1 0.314173072576523 0.57517009973526 1 -0.0731801614165306 0.632735967636108 1 -0.0996019020676613 0.598172128200531 1 -0.162041246891022 0.600724041461945 1 -0.147729307413101 0.444528311491013 1 -0.0853436291217804 0.517831742763519 1 -0.0996019020676613 0.598172128200531 1 0.0963616594672203 0.532761991024017 1 0.104069948196411 0.544358432292938 1 -0.195351168513298 0.42170724272728 1 -0.105345673859119 0.266847312450409 1 -0.0987086147069931 0.302912443876266 1 -0.105345673859119 0.266847312450409 1 -0.115427635610104 0.266927510499954 1 -0.118174657225609 0.257315069437027 1 -0.0859437808394432 0.0429718904197216 1 -0.0351803153753281 0.017590157687664 1 -0.0351803153753281 0.017590157687664 1 -0.106668494641781 0.248327031731606 1 -0.118174657225609 0.257315069437027 1 + + + 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 6 6 6 6 6 7 7 7 8 8 8 8 8 8 8 8 + 0 1 1 2 0 2 3 4 4 5 3 5 6 7 7 8 6 8 9 10 10 11 9 11 12 13 13 14 12 14 15 16 16 17 15 17 18 19 19 20 20 21 21 22 22 23 23 24 24 25 18 25 26 27 27 28 26 28 29 30 30 31 31 32 32 33 33 34 34 35 35 36 29 36 + + + 0 1 1 2 0 2 3 4 4 5 3 5 6 7 7 8 6 8 9 10 10 11 9 11 12 13 13 14 12 14 15 16 16 17 15 17 18 19 19 20 20 21 21 22 22 23 23 24 24 25 18 25 26 27 27 28 26 28 29 30 30 31 31 32 32 33 33 34 34 35 35 36 29 36 + 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 + + + + diff --git a/tests/data/images/mesh/edges/edge_color_map.jpeg b/tests/data/images/mesh/edges/edge_color_map.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..96d4388f595a9944ef7193b80fa023ca5efa0aaf GIT binary patch literal 14835 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 SmHHApeu#8He##4;T=^eEEepp0 literal 0 HcmV?d00001 diff --git a/tests/data/images/mesh/edges/edge_color_map_rainbow.jpeg b/tests/data/images/mesh/edges/edge_color_map_rainbow.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5c3ad58eae2e7c827301a81e7453a15c1b68ae5d GIT binary patch literal 17012 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 literal 0 HcmV?d00001 diff --git a/tests/data/images/mesh/edges/edge_color_map_rainbow_initial.jpeg b/tests/data/images/mesh/edges/edge_color_map_rainbow_initial.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..3d4e5cf4721b09686ba4ff4ef8545764a2b83f9c GIT binary patch literal 16668 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 literal 0 HcmV?d00001 diff --git a/tests/data/images/mesh/edges/edge_color_map_range_update.jpeg b/tests/data/images/mesh/edges/edge_color_map_range_update.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..13bbff62e2bd0a1f68bd809056ce4a4bb032c60e GIT binary patch literal 15120 zcmbt*WmH^Uvu1Zg13|m7;O_43?(P!Y-ICz0!QI_0xFxu|yMzP@4k18rhP?0nX6E0W zyQX@rKBxAss#T{~?OnC&JpHorvJHU9Ny$n9fIt8M`1%37tOLYfx&J@H@`ygCWBmn@V z`3EWQ3w!o@?LL3o7-W&ZwqTqv95*-Qudt2{{{gP zM>wU$l5HACZ0^A5g@miV_!{*K80@2;Jv9WB2?c0sxwJFZugChu`hkqVPQ-Js}I3 z1T9xqX?mc84O;6yICllB2zlH8D+>S|*k5*L)$HKiq1yO`o`uCgrxgVjiZ=)G#f4h* znx4j&m#2t@S^#i^?doL z_8nE*cPfHv+UYdM_GD7nP$U8r8Rhv`s@_G}wapMzZ~vo&=11f`r?@jz)xCe?T67}h z=~Zq06-6Te0Knd#a{7S+oBxj(!2NEOkCTtk(X8;N4!9HH-@*UMH~eb|Ge7_!5D*9t z3wjOYf0SRZumE&01Ot6%#v6(>?fI_CLG?sHLQ+{%C<;tf$(izF1-NY zraSE`x4>D5+d7I>2(hM(ZYlCCX|@@^W$VLbuC5B|k}PK3e^vd&u4NjuVDGc)n%->U zuXg%Z))}2IOXwzHTzD+bH>YFyGfV|n^>RPjr#fO+_p_Tn9o%`?PIF}AUQrJh4T29}2TdCMit|u97QT{`=Yj1x8bcs4gH|1ua{l7a za^~Ih{JVLFp1JRswf7irkyIN|q!X7(w9QQi@=B4zdm5O6`x_Y}finHRQr9y51 zFUVNJ@$<no*i_bOKM&KTh|t@gD0Q48cVctv%x;M><4AtbNKgGdI;P z(fh~c3M**b9Qh9irOQ=zg2PClU$nm7;)jJsb*@(5&vV+Xrqvr?u@hbZzONA|3k86H zAQ&(VJRAZl%-;}vu2PP zvCyJS{)>+}@t49Zv}P8td6ui1J`Qe2C0VEb2!EoVXB#b8H%Q*y!bCb?Zk_lZ_w}y` zOj6I78f_q?uTJ~G+EKs?UU;?|4a0mEDBDx(=zP}&-0 z+cuOXkI~BzKgKqS9EbVI!%o0nbI5{HZvvqsu`GhZ=M#P9F7~+hN+IWTD_c%$%$)F5 z;R|5i^1U&zIdlZ5>A}?iPO0-#imPvX6d=Z6Frjn$~2VKhi zfezx`?#2hmXc7V~xg@mSYjV04&!@$4iNp_tp5`p&;%uYyz=nECcn_&erli+?XfeB# zYivgdzUXL#R1HRe9+b%>a^;m)6So(XgmIFcktWn7oI3Du^?r{4S*2k*hT1c4 zI%0rkTgFAAZUZraupk7IBZLL$0&!}RBzbx03&0j(_?+BxqBOEtxJP8#xb&F|MPlv=p&KBdsp?5P|~q?v&=L_<81V~6By z`binWcq!KW!S}LAKG+)6XZTp=yhU$eH;az_7}919evwPM4b!7P(8Iq~cli@M0Udz$ z1eXi=$@$`@EyVIXm3^Q%KpPZm9aiQKSs08kNit4ZU8N0KY+|FCWTXR_S6jnX_a(#C zCZ@O!s!F*S4Nnnr3TiSmxpfNkz$+B9)qUKJSrAYcC;MX&WW8z;ra?&&xww#G()0ol z=l&jq;QQni~7nVazjgH8QE|>>H$dXZDOWLwh>v==!B#(YbOFSSd<^z$49- z=K;+tQC>wMTQn&cU# zk|+7L!z(~)`#IrIG3L+IpT0xtpIW2{W=`ruc_Xd7_4x@MW&oh_nU5MqIa7l`kEA(G zcVf*k?1vqrjQ6q>K-|_00wNgB2F{fWpc?yR%#@}bVXOTMKyJ-Xk?HMq*1!wkRDF^Q zK=Zn{Z3F6vzVGuh%H<7CE$wi!HTDNlBC5=ZBPnaJMq45)C8j~NCeV}6iehuM2B?!d zerGd+M)~Fg8zc$*z%8lml$rej69diRq~54T6W+Mm%9uJ|IcvV;tA{O_q66HRhy{MX zSBFCPcw39mPCX1}b?{|DM7nwnsa}X3m3S$m>e8x$jA8}^N%JE!W36}uwb4u*0$=;t z@+Ssp2uABxDRhDKzWB_Zaz_9GlsF+{&)g|LbRV^tuBg_=+wEizp7+FDyo%?~hM{U% z-W=!pj z5KCf0Ywhz7n3#O?-PXPDdHs#!9@j0iNxn#v>=7Z0aMK}dMH?&xwSn7XT4NdnR zCO^4jZ%ozc!Bx`wu#F}XuWhg>NVjKUrdU5`N^pV zQmtO>^pCtg{ptck8y8XekRPAf^-kMr3wubT1eV1$`RU>fle3U=01G)O0bl0`zKp}d zM<|Pm{LpQ7ZJB&OTC3W;>yNPcxq7F|uhL8C&jJx^PAaE*mX@F6T5HF1#LpDhnp?D# zh2XD>`oYY#oqX^_fx;Rq_|?%wOy_UphEE$?wC5u%3749{IjS|n)HIXBwA4+D zZ4t;-L>Hj_R&<-~g9l$KB-d;w#3Gr~Ty{GP{b_n_cL~3@7gdz^{n96;z|&x@C&3V4 zv%`2tr9Dp9@L@>&TXdB^?F2(_;5=JH)=7P3*3sl~OU=za`EL#IfzbN{Czv3~NYk&M z_Gq)dr9=pNw_e=UN6wfcfy^MvSQ405O?5js4l#1QlCT<0k=o&t4DQW^xv9B`)_R#f zbk0?s6}k02>T90mM=oPW9dvESg*7bNimI5JECY7OHYSyW4&@ zZAUIib@3mNUbDZ?9Ow zrtsJj>MjYCT(6m5!`Rh5C^$5wps=W^ck!R(|60ci1785BlmrJR@>&HN$O-IOtcRG$ z5@N}7zw=fj?k_4u_G?JJinDZ(h?dFc*aBnsRLrJ)e-rSW6uayFQF#{(Ej-cU&Ew)( zP|(n|`WhO)8y%Hu3Lkg{nVztyjh@z-Q*Yd@)~H%Ses2>QcA}e?YY`Iq!B6&Nq!`EP}>q!m=LMB z+!QQbMfm=SlVxFKX34xU#<+mF1L6!2*pg zjFSWMedc6R!W@@l#_Gl4@Heg(K*pedPo4kc8Kb#_fu7n~wnngwkx8iLs%*?dBo zA;jFwki3dpK|}&IbE>N_&&~QFs;1L_p?WCp$&LuK(B+hnjEo|BTn8NRAms*SZ}Ll^ zP|puYh>u=1Zk`jZ9l>HS?<~YD$ADAC8^9ppjz7{jFaCg?Rd%9}Qy8p{Vnrm?Ktl5z zgd4dtjA=X9`2Dc5Ktcb)Kb%1qh(ml5ba;h}&Jz)%Gv1Utgn2JvMd3zGDby0@EstW# z`(?I50by9BQK~^QKiZGll{SKyH$C=|qt|S{^aE-=lfA#6xp(-t5rb!g_o+&?JTY2` zgQlnZjxmTV84cF$#wIsVRf7)9YNPs&!BkqL^v}8t1VhNUrwBQN1iVbOOUreoqz5Jy zqt57=rPakcE!96z>_L$jpa@c$^z_KMI#W4gDJq##GBSaEt0oCw%a6|xM8bIaAP+Uh zk8wEcL`D_2MXc7aeqx-ioDybxMBRN)mvh~;jgh~wSbjgQcM*+gD7-)CYwpGKe(Zdt zx;CgxljfLG3}t}EP03{8gqDLn4)-KY9ou7M5K5SJ*q%8dB!TT}9jyIcG1VSHRSpKF z(Qk%A7}Pa-gB7FB3=-|Ny!LV5jiE$%Md%c<(BzU?Qc+QvntDXW&SMa%WBlG3^5TlY z?}wHe@n%kW@x?RzPFIFE|7K{>c5SGi%BX=$mb7UYG`jzZOz=ZUcgts#q0HW&E_AF< z%`KPMJ$VIz5al_)F_zc46q=3Lxp{juH5Oo`EKk-ax7Nq zG)sTfV!6;JTLUfIRCRhVD-6$?;(+zlwCAx!ZyYWNP9M%5<{HP_7f%1Jck7WZp4P*i z-)9S@^Q$W!N4N(!TmcKb2^X{4b@AyLJ-XV?B#Dl_(s<1>19M+~?CfIrp^;cV0U|!m zku6KDmFbe$eh66P4@7sW4X=VTtv|XTvC3GOo+=}qr#sVk?3XBK#g2=aDI*+T&=kgk z2;TRzMw^y~w|FE&h-0VY1c7#M-=P<-_FZbFd}@zCCyKg$bd>8Exp%X}GNRSXc=Jd` zH?b8=OrG>6_d9U`Vo_qBsjd~R(kB;%k)3MB>>=H3PhL+sc)iS!44WIqT{pSSN?Ynu z5yNIRf?#`#Lo;6jEJi}YuG=w?{VwOTYmV^1@Q>>mMOSiva?Sd7TWO zx*w^$=O*owyuZ0P6QwMKF3B?T^2$BBG&?*zy*tY53`Ti?24rumrRv#+2wJ!p+;a;1 zGa}wRux*h}SdLjyx^KYV=p80EsTX1AeCC^(DXzQ%N>4_& z+qT#p-7NhjlZ<=u^L&;FoL{H_!(bI$$PqG-B`-Z&6!`_9aUZ4OXl@Ud!?HJQ+T7^4 zR&#O@LC%<9G?i=u$V@b?0Vph3SlNg4(VURiM%y%HQ*D_J+*6M?4QOLr!`@sgmM1Mz z7=<@NSm1 z*}G90SRV=A$f(Y|j->a8~0UL zWyUSzUCfjsS?86eO}43yK;@|X+8pm{sJ3aV1d4aGyl#G4jFqcjaKKCB*)XmnJ3Nn- z*{bVzILQ$AS)1de5mylM>3PFB;cGl#DfCsLXIpn(9M=y`SHT`Z5ApA|ZB|?9{F^u$T9b!4A79UPz1t z((AG9y4TM?$B3D-a1=|tEq@Pe@&xXu4%VLxt;|T1>#{OLU~Sg6>eS4w_suna`i1%+ zzt;+=(k;9SjYu`KC44jyU#2RZA2Gl~{A@vG(@+&@;bzQh{;q7g>COf3Y1J@iFFCbT zIrsFM+#+T8oCSPv{^0hRhbtf*cl@rwb6B*=`P{U})XOW}`HB2G; zVklT_AWt8Aobf3Q3(FrdS3n7wwMo3Jn2N85^;2Z3ejN-y+1}0CSJC{2(E-22M^R(v zn|cPZcgnSubYDk#oAvQ{5m&|YyX8&DoaSq<&IqrYTM%&p?o=Ou+J3~>(N)+R)M~ej!HP(Zsm4>uX-TkCB!F_Lr@RN0>WO!m zUyDk`*QO>A1OkH*5y42{zeVLgEv0`tN~$JgY@)7#Uj6C z?*fX(Ds!MgRJ_nb*5Tun%VLe{qek4_A-WGywOdSXB`!3Io<~bn7HGUD7Eh?;Nl2tq zMV=^&Q!f`!v-ebLE5e7RReEQlfr|pjq$TgNi;+R*u2|`JQ4^gJa2z?#>|oVW|H@KN znCbJL$mm$3*DPzD!62QE=W$}f&1Ncwk-x@(K8u5UNs4re9=Aezo$KzzcLBo1_Vt!heG_7^uHsgaz{^06^T zMklSgQ%&S0)6bS8PqPQk6tr78cq^}5Cru7DVpAUK_0-w<;*0wV^SBdUqj52^loV74 z+&!_Uk4Biv=LPe_b6_WZnYCcwQ;atxf;x$LHD!a9I}Wo8Yl%iRs};V%-+AJS3L6;~ z&ZlDTRCAjg8C}}r*JJYt!_)2;S#M>9TXe6py5mPoEO;kIFY8SI1^gSLn}tabLPOE?2pG zbL`(YAZD!b@>LUqa%LS{!>uh7IjQ!<31DMF%2*O+WZDj9sd&Fkzm{#g(e!o?y>U%> z^fiXlvdpVCug8wfEly3)MU_b`|H^`VD}Z0ZCLv>}M=XeNSt?chgF`2bGr(R`6R0UA zmk*4;gH@JRdjU99p8vso0fdh|wF$DSuYX@hlL`mb<19vDqfDciq4L` zZy<+y!%E_iMS9jtanXH?WSDH;Xw04-naU02qt)u)oqN0NWIH)hO2U3LKWSNNJxUv_xZsV|*yK^a0C(ySdZia^~PfOb@y| zEfMSL35kDO3&NU9nf11$1Rp3At>S}($1jt^SfgZd$QT!0*v$)1MA~_gvZwSQqOkZ7 zSCW|g*dPJCge!8VN)4my1M<{c$qSyJ!~Q?yPsIlc)V)9LBXrd5w{4Z336kuJ@P4H1 zpbnEh&CK~_(I?j5I3@}=V2QAX`m6AR6jrlsG}cAoj1o`!s!?3wjsUY`Y)+-jbWf3!l!Lgl zmht$rd7gHPi52T07uE-S6AzyJ3ZoKb$~A4uv=UBGlRIVs4oCf^(m?SwvGM^evSQNLe2!sqTI4P;?_C&6PFX? z(&cl$dn(%D7HYur>Bfx>-C4r$!thwATxg;#&r)Us_JqbC-WmdhZTtjaufhq#Y_Qbf zxY&29fW|pxU-g8{x|W9AcQNkVz?!5A*<|Ac?*l>l&uePkd4Z9N5s#PT5#(g366WrV zkiG{!=zM447WeR!VO6A4ute7oU(3-Lvcm&|d**{nqVJjZ&+o%k?-kJ5xX?v-?yQxG zvx$26dH>v05)Ue6L@2l9=KWgyrtl-+1rSnn>rhIrtWK zE8j&=&C)El@C-26qlfT^amZuUxGg^i6XH(R4(<2#3;l}s?Bl<_wk5s^y!aXC<286J z;o_fCb8gBdarKSzI~RMG-xnbN{vtYiY1NR)$jF=SQzTe+OaOu%cRBPIeyOpJqwHeg?HVX?!BV zdYd^7S=^Y!L5J;8^T>4;GY@NXV{_RGhFMw^wY!SqWFZ>5ae zKO0Q-Xf~s}f1FV!`ju37V{K98m^G!ue+g2{kl!=XdlYjKe~}RElHSzm1Q*q`JSi&o z`h9=ry6HAs;>)!ZuDyxy;kKx}Li1RhZDRSijVsCS798$71y56iD6ynm{Iqu}E34+N zU0GHStS^AChfl(1FMx+KF8@}X*JVAAE2}1~OEFUE)kV^ni+~@SORgKVZr<ld~JCVyW$KF>t3+r%^4ZxH(@E@h``HXQZI1RWH3wnwd zGo?SN3FK7r61QlN(jb|KRpRVEA8AA7A6gypdvR?j9HwGc@z+8s9)^-rithL5aD^{z zKFg~5PLqb(Mr^8m0oKjX?dt@~@Q4D@cvxX6<&J%l}^vwqu*M zh;53NQkxEYKJuXS8{dHt2Jy`gzdGS(_$(dp_mTvmQrOS_iH-ljc49K~5uy-tOh`sF z_$%(u(Q`Kia_K}d3xC7}A$`Gl%>Io7FOqp+NQomg%SZ;~Rd@Z+}l2gkN zppeXaZq{&jFmI@iwIgL_hxBonkij_{5fi)JlsEJ522mYvaWr`AO&|l+pF?#&k+w0C``4R|Td#-+$%_kZ`n%CI?#L5g zdOjSC2+I&=am2#kbH;KN^BeE8Il{z z^`adY)#CafMN#_#z_ypy;MuO03+bMnfQf%X@LqK}8H;1`WbY#WOQkRnF|pbG70Mb(=7 zOmP_q5?BXL@u(ghne zEv0B0{e`^U`2s`0TP376_sF0X3fJwMfDOI{_w;bq5D{;#-0cPLlVfK`!5g167h<2S zCq96L*pZ}hF(Yzl2vx64rzOfWc4UH-tV~gYBAF~nx+#f#{<>aIl%vK@It^>3!I?w4 zN}t6SW9nHB4E`TTbf4qb3KCH3iVfC%Wh|&M*J9}8MrT8jypkTp_Iudk)6K?})^0e8LhfGqX(-PD^7z1K$h?>}}v@Kjevog-f; z1{nX6NEBrm5J?klX%58Ps2FBZG1F*I%cm5XZjrZm3!W*WCP)Y=Pj1Zv%2+bW%c|Ei zp(=A;i_ev9#!`+Gfiag3_J5R~%x2t%h@qVPOgT+y;x4cXUtuMuPjnFHB(f_g5VWdR zh;3{QRt<=6NGyQXgmY!l0RY0l5Cmgl@>zn4E0YIeu7*?h&cPK+j-sYM^TGV_e6Y1B zvQs&*+2U;^Yi6H*J6j=ao4$D2 zl#wa{XeM7m`uiIgI{4anA!6eu_%fB>l&5^@`B|z!5=ImrE282MQc;9Njz{io(VOmX zhwP?6tY$NxAC&O2u#BBq7$8xI$Y}D%C^D8*N-{^AVBBO0WhJiNP0O!iBqBk;1SDuZ zgF9=Y8BAEZO4r-@)7As#m5Z;`bVFG0nM6q{kI+>_LP7>iR&CJ&EGVkZQ#ev^j5*m0Xe%YloQ049-G45A9n2x9nQ9qR;loBqxUZ@rhH9|B!6af(6VQ0T z7$SYeNm<>ceO}I_Iz~cHZwQ0T+N(l`ieZWJIS?+oY0tZtGjHG2x>Ey1MuI>gP(=!e zyfs1d2VC=b=>X98(SGH^B0oi1*AK@+cTRcHKG2Uq9G2p`?8+G4;g(jx_tmye9n@<- z-~D(2NUN>f8QBlCMJ~9HLTgFo9rL&HGOPCVl(CHOnww*4#6-fz{P5lln)QH0P!-S+ z04`!%1Kke(X~9I)#TqEH{b>rFsS%^U*y`L&aisZRaXc|ojfEGRHGPnGv)@6olcb8< zgoI__-F@Hgkq8l<3V+q)-qw5Ip8t>#6Z&Dc!5AypxW^u_a*100-GS0+RK1N4RD53i z80=wFvHb$red@EppuWi*@ zb_XV}XlyPm1!?pcv)}{piDXM+>hx;>S#G5wy9o>|r&PP)#Bc7VLR@@y?NmN=WgGq@!Q@dXMeNA6GPL>r97HrT{zw@zZk+`mZL8(`^W3=5)K z9Kf!mm2=aAO73&(d--<}?j;L~;^rfYHGS1oXw2~#YVbC74;HZ?#!OeHfVEvAF zVmMGzcm*o>UT}Z3=9iyR6ZnoGM7pR>5bSkC!>sj!^Q5?mC?Uwei-CM-!Ybg?j0l5hNW>&0F#zQt2tbVD_7L;%>39#@Q{Mxp z&rmnR5n(65JcLHEy5>WxxygYy`i#g$u#D6uiBLy+F9mA-7V-wc#3cQP8eCZ63=w7> zLXN>NNud;;9^7yxI$Q+!&;XcSr67v($OKaMLdPUIr6BjB2zlD>Hl>;cqW~@I(*w6X zk`>C7fXre-RObKHS-+A3)L*shn( zn6-`okdKy15s&~6fwwJ12QCNVIfA_-S;a;|F58i48E9fx!!c|uNS(yz`bxe>!>uIb zXmr9u2uWs!fRfiNMs)dA>{|Js1< zK?Z=3|F;<&SOmbQ|8QUmfE6uLz<*c@pfe?TJ^=7z;_nD74pEQst70Tez+V=z=bzEP zxBrmHKi{JNGU#<6l5Kz(;=der8}}qE0P?Q{0Pu+P*AudT=Kv_;|8?^}xxl>E3slg* z*xpwH!u-=fd~G5AQ!lWnLQF_p0xv{Vj0^rP75+lbAkTO3vv3Hj%T#0AFa_reIjR3Ps2N9(N{X%?K%pw((gk`1vgF~f)=#8vb zxGhNG)?b{NeZ!^c29!>K+|xreSla&r;Q#F^1kjctr-a!HF@fs|P+$Qn@cfW1E<~c$ zMwr$aPWcp1iz-4*de8)0OcJ^27~%(j-NDPgG+6dRrY{Oe4}nDlMPxuFMlb5LrQU%R z_ukJMH6x$;#1y2T%5&X_&F}Bf%2dsW9Hzn-5%-6DtlX`JO(_>utE^yM2NRIs)GwD zaGiJIl~jzPBr*Rghhq8T^*kYMuJo<%O+Er8K1gk48zqWq<;nOQDjiFWn=irv0C>IG z*5x(w4-E((cHIxi_wHpVM(qg@E-#=*eZ6@0ahf<5YdX9NKA4S$H2~05wJ9iwM3EN-{1@u=mWm*Un1!*;%H6$50 z9RjMmEk5#uSZ5G)SOyL35i-_60W`)yO#^_1ApuE99r}`^40xXUjJl2Jn8v!GpzR() zcE&2!SBkSM%u)?X$2ToWiEw>%ugs^3N9=_fi;8?ye-wGo{EFcKkvU5wn(JAL3Bd(N zcbu+5&C(qa^X<_k9od3{Na#-8{cBxSp65k z>oTPLcNqd0K+3`@3L!CZQGH#6fe8iw8~Xuyx>WEu_yQ@>pf(W&$k-SP z1#tp2Mbz+Ts*H^v%tJ;_-|W%%EUJ{_=`5;}%Ph4+VL5aAv~FdN)bmxun5dNcgryqD zIFsTEcm!l4%FEnB8eLP`eA)6u8BB~4B<`3nirrC@&H;I??S=tlEV07^38EyqMMf=; z;>aE)tnnl>t0UQ?Nvr@N;0lOr1`a*AdLV!%q%y!jCBm>K`ieXVy;FJ_$Eu zAMgGO!&y4C;dMKH(wE={K6y$?K$ctarq50U@uJIBI(zyj3ohwzz*256t!UO{FDL)e`l%+z*hmh zZ$ywMSmF$7qC@{PjcH3v8_$P}{X{W3R>Vh$f2TReNe#a_fXbpUfQg9^2rD5``b+iG z9A?_jQejzd(pgxPk@*Qt%bz73ZB*fvG8<>P(>*>Y7*b;j!nW(`8C;MUp68){s-urz z?F1m>KF;;>@}_X0O?#LWya1~N#0JmL2;g{za(Jw5`!19plVU}NM?XDpba_zT2C0Nq zJRn3-wgA8Bl~J;Rbhh1I@UZTYeRXqSx@gYZNoO9$<;ew~)& z&FQ%cXPIZU^>Xa7!#Ru}GqP5)N`fb7#eH?Qr#txXJ1|Pf>)%#hkG%f}*#DZq0Dl*b zh$@STN`kXXLEwMA+j`AkF92>jvD1$vfsD1}Il1U&M&0UxCDwE9HpZ!-4m6__1XDaf zIjjq=Owff6aO0@5a+-PzQqi_;^{xUyg3$OKQ%Z~6su?K?te+j4ZcJr-KoJ$(i#{aH zogULLh^!(={*eM%4wK>&P=&yUD$w|%gkk{}oSv_uc8+T?`qp-Y2 z(&}4Z;-d3@hMoq1gCm@|BvkH4QaSZzW@w zdjp&MP_f|Z;R{1yOV{$XlzzfD=oD~%>yF1T3B{=#F*MZA?u!z2eqd??$dR$3Tcr!_ zY7gwL!eOB@;FBH7^IT%0rCsUYPjf$9s+ahR;M;trf|RrR4R;wlG9%U-TkWneAaLkP z(Iuf~`7^B77>WgbB|)eO!TBX>^Zga_?%_c;G6KH|@bz8pq|lowWHKL;me5nZ%uk$} zfh5KT<4Qr9;I0#cB$I=A**HBNm&U>UT(1YTeq)WOlM(>Df(|Y9UZXYvoW5Oo9R!0i zR3roxaG!Vq`PiJEB0ZAb_VFEK1&`R9C< z=<9w|2I7fg2}Z<$MZ!TF0eoXckLM8qLml;a}C&sHs=Pd3P^IW-FM|J`jyJrEEXB=J_U6(9*bGS8hHVT-wPqTIAV-C zX6>eRP-N>H&$)O3=p>6@D5B}yS_JePV6?KiZ%7+jKOp`_$b^jb)6itGBLS)z14KF@ zSlfBmNc(b8RLOMtQaiyaI)$HB9scC%ni`9&(Z2}}WyvEwzemDdzbEk58MK5&oH&Db zXl`l7j#auqZXLPh13+)1$V7?tYv7}b;N$58)3K%3@+QdRi`asoVHQ7tt0UqgiZS6l zDv%>ns;BQii#rgmG*m@MS7vf01%5$JCkZ`@iM}A*&!R&UXNC)}b;8k~INqn!HCV)B zQksP=3}|XX_H9~(`zPE)9=5|$>Z#W;g? zS3L2UZ(uV6fMo$t_mw*)`z0V9sEH&S>E#JlguGAlRax5~C{u-(;vm?0u6_$D+{R*n z8NT3vO;!Qh1_Tv?2i^;PFyMaVUMC^JV3C&ywkrIh|Hz^1t61v%D}klffXR5YQ)V|_ zY&wW#PuRG~FWFrMVFKr^(`=t4Zd{n-nl+hpPiPQ*!1iGu!U7KoW*Gd>^or}{1n7r> zP`9v9RyGb>7et*zB?^_#!2rzoPb3ahcmsmYh7slR@G-=13OuTlGsvNotK(U)5bBRI z5$7=XUEjU2`jhrdyX?KCWAzn&Qe8mQn=j+t9rNuApnml} zVY3~hVnPIV&5hKU14*q1tpg$hh1_^^yuOTDk#L?<_p1rJ)Qo2-cz2I*kiLkEyns3- zzxvUv_ec4IUX4*m*NVHTiW*8Wsxvx-s^Pi{KvJOl)t$qf41M$nJH>=n;u@N1-ImqI z$!n!S*HL*-V5#;C5mILz2P%d}#2#V+vG0M=L+vC$wNX<{28Em4s;Hri5&WT`5rg~y z5{NdJ_|;l&qybFSE#J6`;%%<;x&Rv@OeGtq dataset_factory( id=mesh_id, - viewable_file="attributed_edged_curve.vtp", + viewable_file="edged_curve3D.vtp", viewer_elements_type="edges", ) @@ -26,3 +26,230 @@ def test_register(server: ServerMonitor, dataset_factory: Callable[..., str]) -> VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": mesh_id}], ) + + +def test_edges_edge_color_map( + server: ServerMonitor, dataset_factory: Callable[..., str] +) -> None: + + test_register(server, dataset_factory) + + # Set active attribute (cycle_id) + server.call( + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_prefix + + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict["name"]["rpc"], + [{"id": mesh_id, "name": "cycle_id"}], + ) + + # Set color map: Blue to Red + server.call( + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_prefix + + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict[ + "color_map" + ]["rpc"], + [ + { + "id": mesh_id, + "points": [ + 0.0, + 0, + 0, + 1.0, + 8.0, + 1.0, + 0, + 0, + ], + "minimum": 0.0, + "maximum": 8.0, + } + ], + ) + + assert server.compare_image("mesh/edges/edge_color_map.jpeg") == True + + +def test_edges_edge_color_map_range_update( + server: ServerMonitor, dataset_factory: Callable[..., str] +) -> None: + + test_register(server, dataset_factory) + + # Set active attribute + server.call( + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_prefix + + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict["name"]["rpc"], + [{"id": mesh_id, "name": "cycle_id"}], + ) + + # Set Blue to Red Map + server.call( + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_prefix + + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict[ + "color_map" + ]["rpc"], + [ + { + "id": mesh_id, + "points": [ + 0.0, + 0, + 0, + 1.0, + 8.0, + 1.0, + 0, + 0, + ], + "minimum": 0.0, + "maximum": 8.0, + } + ], + ) + + assert server.compare_image("mesh/edges/edge_color_map.jpeg") == True + + # Update range via color map + server.call( + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_prefix + + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict[ + "color_map" + ]["rpc"], + [ + { + "id": mesh_id, + "points": [ + 4.0, + 0, + 0, + 1.0, + 8.0, + 1.0, + 0, + 0, + ], + "minimum": 4.0, + "maximum": 8.0, + } + ], + ) + + assert server.compare_image("mesh/edges/edge_color_map_range_update.jpeg") == True + + +def test_edges_edge_color_map_rainbow( + server: ServerMonitor, dataset_factory: Callable[..., str] +) -> None: + + test_register(server, dataset_factory) + + # Set active attribute + server.call( + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_prefix + + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict["name"]["rpc"], + [{"id": mesh_id, "name": "cycle_id"}], + ) + + # Rainbow Desaturated Map + server.call( + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_prefix + + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict[ + "color_map" + ]["rpc"], + [ + { + "id": mesh_id, + "points": [ + 0.0, + 71 / 255, + 71 / 255, + 219 / 255, + 0.143 * 8, + 0, + 0, + 92 / 255, + 0.285 * 8, + 0, + 255 / 255, + 255 / 255, + 0.429 * 8, + 0, + 128 / 255, + 0, + 0.571 * 8, + 255 / 255, + 255 / 255, + 0, + 0.714 * 8, + 255 / 255, + 97 / 255, + 0, + 0.857 * 8, + 107 / 255, + 0, + 0, + 8.0, + 224 / 255, + 77 / 255, + 77 / 255, + ], + "minimum": 0.0, + "maximum": 8.0, + } + ], + ) + + assert ( + server.compare_image("mesh/edges/edge_color_map_rainbow_initial.jpeg") == True + ) + + # Update rainbow range via color map + server.call( + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_prefix + + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict[ + "color_map" + ]["rpc"], + [ + { + "id": mesh_id, + "points": [ + 2.0, + 71 / 255, + 71 / 255, + 219 / 255, + 2.0 + 0.143 * 4, + 0, + 0, + 92 / 255, + 2.0 + 0.285 * 4, + 0, + 255 / 255, + 255 / 255, + 2.0 + 0.429 * 4, + 0, + 128 / 255, + 0, + 2.0 + 0.571 * 4, + 255 / 255, + 255 / 255, + 0, + 2.0 + 0.714 * 4, + 255 / 255, + 97 / 255, + 0, + 2.0 + 0.857 * 4, + 107 / 255, + 0, + 0, + 6.0, + 224 / 255, + 77 / 255, + 77 / 255, + ], + "minimum": 2.0, + "maximum": 6.0, + } + ], + ) + + assert server.compare_image("mesh/edges/edge_color_map_rainbow.jpeg") == True From 8caccd4d89acfa3d99d32a403dc4ba5ed45e45df Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Tue, 17 Mar 2026 13:02:29 +0000 Subject: [PATCH 2/3] Apply prepare changes --- requirements.txt | 1 - .../edge/test_edges_attribute_edge_protocols.py | 12 +++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 3a8f3511..e7f9f284 100644 --- a/requirements.txt +++ b/requirements.txt @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.0.16 diff --git a/tests/mesh/edges/attribute/edge/test_edges_attribute_edge_protocols.py b/tests/mesh/edges/attribute/edge/test_edges_attribute_edge_protocols.py index 95a1e9e7..54bf313d 100644 --- a/tests/mesh/edges/attribute/edge/test_edges_attribute_edge_protocols.py +++ b/tests/mesh/edges/attribute/edge/test_edges_attribute_edge_protocols.py @@ -37,7 +37,9 @@ def test_edges_edge_color_map( # Set active attribute (cycle_id) server.call( VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_prefix - + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict["name"]["rpc"], + + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict["name"][ + "rpc" + ], [{"id": mesh_id, "name": "cycle_id"}], ) @@ -78,7 +80,9 @@ def test_edges_edge_color_map_range_update( # Set active attribute server.call( VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_prefix - + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict["name"]["rpc"], + + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict["name"][ + "rpc" + ], [{"id": mesh_id, "name": "cycle_id"}], ) @@ -146,7 +150,9 @@ def test_edges_edge_color_map_rainbow( # Set active attribute server.call( VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_prefix - + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict["name"]["rpc"], + + VtkMeshEdgesAttributeEdgeView.mesh_edges_attribute_edge_schemas_dict["name"][ + "rpc" + ], [{"id": mesh_id, "name": "cycle_id"}], ) From 28977d35bb2837c91f0b0179e97f5e71602b770a Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Fri, 20 Mar 2026 14:41:59 +0000 Subject: [PATCH 3/3] Apply prepare changes --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5750c624..13efd779 100644 --- a/requirements.txt +++ b/requirements.txt @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.1.1