From 72763bf1e3a03bd4bde4569095f8a1e935ef73c8 Mon Sep 17 00:00:00 2001 From: SpliiT Date: Mon, 26 May 2025 10:58:23 +0200 Subject: [PATCH 01/11] feat(New RPCs): Added update_camera & render_now --- .../rpc/viewer/schemas/render_now.json | 11 +++ .../rpc/viewer/schemas/update_camera.json | 58 ++++++++++++++ .../rpc/viewer/viewer_protocols.py | 52 +++++++++++++ src/tests/data/images/viewer/render_now.jpeg | Bin 0 -> 15681 bytes .../data/images/viewer/update_camera.jpeg | Bin 0 -> 15681 bytes src/tests/test_viewer_protocols.py | 72 ++++++++++++++++++ 6 files changed, 193 insertions(+) create mode 100644 src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json create mode 100644 src/opengeodeweb_viewer/rpc/viewer/schemas/update_camera.json create mode 100644 src/tests/data/images/viewer/render_now.jpeg create mode 100644 src/tests/data/images/viewer/update_camera.jpeg diff --git a/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json new file mode 100644 index 0000000..b9e995b --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json @@ -0,0 +1,11 @@ +{ + "rpc": "render_now", + "type": "object", + "properties": { + "view": { + "type": "integer", + "default": -1 + } + }, + "required": [] +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/viewer/schemas/update_camera.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/update_camera.json new file mode 100644 index 0000000..df7f259 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/update_camera.json @@ -0,0 +1,58 @@ +{ + "rpc": "update_camera", + "type": "object", + "properties": { + "camera_options": { + "focal_point": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 3, + "maxItems": 3 + }, + "view_up": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 3, + "maxItems": 3 + }, + "position": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 3, + "maxItems": 3 + }, + "view_angle": { + "type": "number" + }, + "clipping_range": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 2, + "maxItems": 2 + }, + "required": [ + "focal_point", + "view_up", + "position", + "view_angle", + "clipping_range" + ] + }, + "bool_render": { + "type": "boolean", + "default": true + } + }, + "required": [ + "camera_options", + "bool_render" + ] +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index add3d8c..26d3cf3 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -224,3 +224,55 @@ def updateData(self, params): actor = self.get_object(id)["actor"] actor.SetVisibility(visibility) self.render() + + @exportRpc(viewer_prefix + viewer_schemas_dict["update_camera"]["rpc"]) + def updateCamera(self, params): + validate_schema( + params, self.viewer_schemas_dict["update_camera"], self.viewer_prefix + ) + + print(f"params: {params}", flush=True) + + camera_options = params["camera_options"] + focal_point = camera_options["focal_point"] + view_up = camera_options["view_up"] + position = camera_options["position"] + view_angle = camera_options["view_angle"] + clipping_range = camera_options["clipping_range"] + bool_render = params["bool_render"] + + renderWindow = self.getView("-1") + camera = renderWindow.GetRenderers().GetFirstRenderer().GetActiveCamera() + + camera.SetFocalPoint(*focal_point) + camera.SetViewUp(*view_up) + camera.SetPosition(*position) + camera.SetViewAngle(view_angle) + camera.SetClippingRange(*clipping_range) + + print(f"bool_render: {bool_render}", flush=True) + if bool_render == True: + print("render", flush=True) + renderWindow.Render() + self.render() + return + + @exportRpc(viewer_prefix + viewer_schemas_dict["render_now"]["rpc"]) + def renderNow(self, params): + validate_schema( + params, self.viewer_schemas_dict["render_now"], self.viewer_prefix + ) + + view = params.get("view", -1) + + if "grid_scale" in self.get_data_base(): + renderer = self.get_renderer() + renderer_bounds = renderer.ComputeVisiblePropBounds() + grid_scale = self.get_object("grid_scale")["actor"] + grid_scale.SetBounds(renderer_bounds) + + self.get_protocol("vtkWebPublishImageDelivery").imagePush({"view": view}) + + return {"status": "success"} + + diff --git a/src/tests/data/images/viewer/render_now.jpeg b/src/tests/data/images/viewer/render_now.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..94bf982ccb3f939eb27dfc5e4c6465ec8510b1a9 GIT binary patch literal 15681 zcmbulWmp?b*DV|%xVyV+ai?er?ykkH6nB^6?(XjH?pBJsyStadq0fCk=X>A3-DGmSw0|3B29)R~%far(y|JMG3{J$Z5c)#}nP+`Cr zz!)IF$N=D|U=XNa?*jm$zchgmfBF8mK|?~pz=A^n!Qei|aX&`>*XYOh0*8bGzOMif zAix0NC=e(gJ+JQo-~YP*|9XX=rIg{cM*G5kwt-zRo$rcOTNE_Aoe!zRZ~I?7B=w7> z2+SqN`%{6}7rq{DyZv2mN4M8tGY!vyi3Z~ARgiUC+`p4`IUA+&*`zvKB|VAp$a&EK*t~t&ky``YTz-{`ExcKi;)GFxN|33$pF- zQU%W+>+ETxBka0~bn&W4QVrk}FKiEPH3=I4)kn%*z|00E3+nO4u}}Tu{!OEyDLoly zMVl*;SNrp$#GFX=^686u`9k5IyOs0(nX}L`JRm8MI9{PN{e!m zBs(6?dZLf_Yf#D)a^`5e*wo$7%zyTj3zIj&h(2zpP^3cm6v3z@H*h?LLFayZ=i2ih z2mp_sv%<(k#zM;ml*F4=@F|+itCueIX;btwXJvN5DYl53Unfqugtw@vMtkJeUms{s zbrQQx3X0Sw^nW1!c?M$=v;S=R1B$vq2iK(mEb>hx`)T{F4ibDtXT^Ol`ku;DkcMd6YK2b$eSl**Hs)% z#hyFAV(e%oCezxwKw|8BPszm+_^Vw@^pchjt6Q~#buDaH`EK#blpnJ%IYsqX6-Lf_ z_hJtyQ?@I$?N1q9X4`beNJX4~Tp%++%eq_{x9^oYjGlrzZvKEV;@E&+*sY^BJ5c0V zF`-q1x;%c~WxZ0^hYR2gQ-W$l59gA;ZsAb)fUgPtqBy7LMW*HG!n!8GAn91Kk(z2o_j6(@NQqU6}8pPb^#* zJ={A!?j{E;;}amzo(w=XD(y~RZ|0O^ej%O`Y1@gQf*7_rt3ibSPf*S*y{5XDviZhA zoh5%h{epSB>2SYL5lI1g-wuP`os9qf5P7e{<5!O#7{kd$MFQVHe}hv3-snVI15a5i zxY@{JwrsthsbD0iIC18u73nzTC?WNI#^w8X@oO zkPyl#9nSVD+oP#|Rvl)bwG$W0bSzA~_weqfl5Dj-UJ?F{uSG%5q|e*1ZLTJ3vfSEB zps2)aCkjE*5B~sjJ@O9Ng`$4kdg2xAQvB@PA2)hWK0#&gQU6soj)`~rM$#kvD&Dq9 zT%7!1pz*fO+*3}OKxR@|`1d0CjX?j9BwL2*DPT=9c5}GrB|4Z0VB~-+0v?!@VT2we z_ubQEi5&0YXfvy0&;@Y?cc)19EPpt)CgJApQ#!`$v^^r_8fXOgD53GQNj2b@^LwO* z-2o{siy7JPyS;cYhW#dPqX!i};RS@Q~%3iH?CQ7T9okv`6#d5aq zA~~sUjviHG;hTtUNhuawaagM`dwi;#@WZ<6GP&o8%>5T&s+xI|Bc9c`3jAQxHiefpaEnMIG8z!b>CGq*FeB25)rk;Iz}#QkOue zxUC8QxDxb<>Qh<}!-93CLw$0GWZx0&H-`a0qlR>--ucLmw({59=!=JC22H0m{My8Y z_?QVn*cs)*Zyi{@dduz)rJ`m}oJ<%>$!KR&GjQw0oNVivh>F$PK9Ks3qwKnwv$X}< z#*JrZb74w1K7l*@f;;*j3o-@j$BE|eDF*VtYxRE?WK=W&6grC{2C0z3KP&LZu}2W> zjfkOqw#9GmA*ukW!prxWdUx~cIYYMnGmo5uJ2lV#X}(HX0T%xy(c_f)rg?>Zcqg5N zN=&Xjdi&7hPP`E)Vrk`;ZV>AMmb!C+hC@jaLD!)x)^wy1KF5UhB~bb$Owjs+5;ZCS z91H>+0`|X*KIlOJQPCiwNQHy}=wu(egQCGdtib=WdgYhEY6U;&J6NR7c^1^kDwk$7 z#+VkCxmT{L%o|5g95P8sX>_M{fTLkBMhX3f9SW?D6^L3{$GEFgT|8emjKfha%rcv$ zPfCMv03*^0_7wxDhw!I9ii=;dsA=CwU8H_JYpp^K$NUKk%-5c4R^`sZ2HX*ieo)m! z`Jnni4hRDc3l9VTLHIvZ0g$91kU@C-=+G4`A+> zls@aE43F<^#$6Uqo{TgtJTzr-7;^9`Pm7G?|}HW?BDAAMBAwv2F)sock26ltr6$-cb?5-e+abo*6ptNA32NP z0fQir`b~FURQTTUT}!L&&a;}GaH>PwTtAaGwZ0HkRb+LsoW{L?|K6X4Q7a20f)g&o zy!fUKO&Qa|?w!jj-r*sU63S2jfJu_ym(chg0mR`cN;1A`5;1?`Svz&Rwm&Ae`qj#^ zUZS`(ngJvj>$OlV^cgozD~I0m$bxY%7XKu&%`N|#?JJ#cSq=bD126|b#1M);{(0jg z6h2_SPnGJAH^ZW~q0#}=gd%xxlN?Bs)|^ri3b^*I~0r;ZOZf8$74PGQ}g3^dXMjdF_W23CYA2z zG1Z~~Wq26NmK3@#n6iFu(1RANZAzhx$~7Aj)&v%K>~$j#3)2HptK^|0FdZ^1gpkmx zX?eMCe^j}2>axEN82M9f>(#lMF5d~%7Rn#9Ha}EHYGL2K1D?MMEbTe%s|mTfa>>A*-)?I{s?$ z(wM||6-#uin;LYOm>U|UzUTX;+eM!=%J+>H)2^IIc&{K8>n(j%m*dY{+HTXNLRt?n{B)Z@Y^6k1nI%;(`&gmKKa@OS(^U%b{Rj#!Z}mNeo&yRLEKyz>hbS_BnG<)t)BJ8!W>Mq8f4BUue} z_(CY!VB6&5SwzZTJ}7D~y(U6N*I4;oiAob?+1F2K5Opr&@2>XaK5lDuRcR%?Vh}@z z{rPb*({c%g9+u{=F`zIo66SxHj|Vj$YD!u4eIR}{q6_{VKvjIVAM*~l{PtX{GE-?en1oiH)!}`NtxiZ%mpSk`+125FO9* zEjo`zk##3NV{`33cEC;j3M(7Ibj9Ik9MkOC*&FYR@keb1D>kjs-=*6@$-jTmzXOu> zHL%9ja)-yulPoUBGrs+fs_u2l_%^GgtSruJm<6*9^xWhupWNtO56wQ5Cil?D(8v7w z)~tA@sR^26k-RkwOGS3zN*aN#U=iGv59`Ip2WcVloFUId{1%SzR$c(lO89JZ>kVoT zzO|hqQes>@E?#N=gSr#ijW;~CM!jaU+iaQLJb1rl*pK8skGu5vqq}W`r{I;MYGZ-= zVaF@ih)_+>=>W3?U;bNiv&~>$7MlfWEM>$4|2IPUQr`h4?$UB2k?46B-92sH$Wp~Q z=gv^FTX6&dP;$>ONIG}&(%d29yrmlC)bm#6M@l12G{OZnS&(PfsA+fwo`RScu z#XCTl>@Du>ZA~8?Lut@3_73|f_wxjlm;PG!_2q-})*dcd&vT&{gA;qKic}4VO=0$z zB8B$BRusrTPIpyGiH&NEFRy9oTXP>lQ9Df~gt@3T#9)W?+2z-m=du(@Aj91y1>=p* zt2Rl>b#`k5pYhVUq&ysmlyg>-+?ux)1u11EN_1CwjZT3vLo z7^Sfl?3*1eQH(f|V48DqZdaec8~uZkRrx>|@8t=e&KBJbo}qE1?54AT_5ii=8jD-H z)iru@Wox!-CpWWrS^AW4%}Hb9dAE;Gc+X3Jjsqkq+2&!q>eSjAA#_q?{;hB=P#-zT zRX9=M;O>(Ti>_Qe(7w>6rXF#h{{(iaq}cp0I>VlJ5tFCb7dLCyz&NuG;XuvRSp}PA z%Cw2KFyY%El41OLQ{91Lgo?sK&)vLZJU=Fi6vMSN{3RjE?*OyV^zxWHvm7qjDvkT}b`otqML3~c zzT&iiYjIiB@3s`OlBm}Qsz_t)$K@crAgbGW`eB<`#HXgV*GrLgbDam>SBg>E;b-Bb z;j0((9^`aIvZEgDNwrzB=Sb&+5DqSUH$3Wr+@EYx!J{2Gm|&j8j(Y7J8XNO0`*vBV zc=)26MkKDZd)_c*S-5#J%`{ivW0XwJlPS&*i%Q(XI`5``Dl^QElJnOU*q*N%vRHu# zEQ}FWDU)cWbgZm=Use?-ZfCnuiH9NXT6}CmwGV1O_wSlKS6&ESLl3an*yJN*^GN;v zQv1DWc7E}}{rc;tu)05tuMyBn=S@rZrzZoTDq011h=R617Owlf27N>V$Jia%-+7K1}g2Uf(8&C?gTxRC$ii*>(e2c*Zp4 zlIkR$C;l9&Hx|aW*^WC3!fU_y3YJ$NU6ZT2Odb-Dm6L<=V>lDps8?eg=M^muf`vDJAbYXU{A|Z99|@MMy`xjSj7E-XorwmNhu3EvqM>` z9)^y?%d}%eP-2tMw6U;>MOB>YOy#dhnuyFEM@4hu9S$xStTWcd%GzdjYq@#Y2qz4? zDT^&-bTc_Y?^Oy1LL@)y!|)_*3~snOu94RU)vZ4t}IYv zHaah{eaoZaYEIV(>Ktp=s3tzm-vswcX;yf-5`Y*aK70qbZctJ{{5s*@6UgHHoO{fz zDF~DHSZD5|ZZrto42a3SllXMO^43Ie^vd7_Tb0RS@T)wV-z4GGhl@^bz`{XJSg?>h z>7rSWb6BCf9F6@j&sh;#7=7<7>bjJFw1?1CK!7^b>tWDwy6Wd=+gLMZbDjl=ed(e! zwPD4gKw7;6o9((X4zM_02}m*O*x08cnuRSYkv-Ja0epyP$HP78{xfgCi#e9(F1m>} zUCM}xn(R#cvKoV8?&U}8m5%BGalYw}U`{EmLXJ7DGd(+qJ3>~iVH zp=A7YXi-N7f6i5Y0l9oo^(i(L^p>3Qd0+5$=o~qnkn{W2yOH!8h^(eOS{&o?b`DEKi_$XU(c7eH5n~vkGW)R9sYMgpaXDpw- z#A(l{>Pr@f`kS%?1LAm~8wmL(=?yC=xlAi1;7x{eE^DNpzzdVOtm$om@oYdzS?Wa0 z%Js4#(gb`P@3hfi`Dif%vxAo190L;wuFx!j<}US{fgRGZnIEJmSt}qQV<$Jg@`&W; z*Rs>1{8cf8e~bX=us3VJlyDWlRA-LVrs>b}+#+qitY1FxIo&n5z;#qWYpdC!KX>m$ z4wW{=NF{AUH!Dw4f8_ejZySVO9iBRtuGO7pQsgM^ffV&doHpg2a3 z&g!3nK}A(6nl22zJKvT18Eg=)kA(3@C}JVN;m~mKBS0u6m?|9CuyrS8zS?dG9g6FI z;+mKV{p{9{rAfx{2cci-EOZ46ehh?pf%$7sX+12?VqAliS!tHM<}44m^sLB&S41GA zQEHWN(2Ab$3$nOYb~fmM0yZ`le5Jlf3MzcxBdcfD1JL2)zgoyv$ua6CeMu8T-n0NitC_NB zS*bbQDNruuTE>GZKXTC03`Y~+p(O`Auw>EVcTYrlx$aaaAsv^Le{L~I@Q~PnQbz(>7SwEk%Oi`?+;~qi~2-|w|iz*{N;1e&?)_ReZ`m?(pUk8 zQMmpX+o?79z|s?Rz+9?|{*Rx0GVC ztQW8ZzMmlCc-2pBC?zRlgEkXXThj8Q3y15%n7&J@0N2jZBdZEuuBF}qKZ;ca_9;Ey z%8^a!@-lrj73czPGMF6|pqks>%y;-ncC%Y{Bq?mry%pVMWzs#g#lM#XJ6RZ3o46P)m%B z4AST}PWY64t3v0m?91}OxVpN|dd8Y{Z7;BeVfEA{*44BmAO?>Ui`TUv*7_f5C@yF= zu(I7yo=j>KpL!iIL-(KI-p2RG@?Jx0-Lgn%cA6&P(x-6jD?!I)@MhhlS{q*)&k)Y^49jEvlsrJvz6U zqTK5Cr3MsSipI+U6_QhfplHehRO%O1b7a~}DM#xS7hH;@t&=d@d$%UzO9FKxN||1g zXjx6QQv~{A3RR*t?OxBkyu9q>^@^W`<8>K?*egFY zQMt3`)i@ZgN5c&zy$jQ_vNWx*v`{^Z!_*bckA3qKMcv3={m7X#8w+J<>r-JbNtBqm zZF|H*1LRRbJo|OH)A!;H(D(Cn13lgbD+l_HB5(KQQVKs|@?ec6?X>tGXq^@i1^i`n zElaQG^D=PbZ)@kC`Ac2;vgk;ie+X*uwVT4EY8_TdG5hBRK;#O0`BxQoB@YrNzMbFBM^7pMQ^A{el?nU|-(Wg>nu2l*0$_Y?ae&hto+N zTB)x&cuaM0oj?FJr6$BrC1wt5~u3XjlgG^U$i^FFFqYr!kh{2~LkeXi*siBU^#{0*FUE;2u;Vw6>9x9@cceec&c zp=gt`6i8gdJS#1dH13ZTh-%)~%F3lUn}x?&XRyhBt-uYFIihRhJi^TV*h@>G7S^h1 z-{yL?m%k=!slfGDBTNr`y1Isar)cv-=um2<{P#lGhXn3h&2vL{E&-kHxZ(7xat^)i z&tutAC5npy`&}re_5mKzH0GDy>kGXCX`4b&oQG+en}@RGBO8kpuhOhP%dJ?Q#>`o> zq1d!MN6jj3bdH{MK}ZG(`>9Ox;IgV|aN^}@O}M#5{*m?_J>$wIMI3??>E}Uf=NHXM zeE2^zD|RnN`;8z9svPcR-J&Bm&Clmn~~+3MZ=WzC8Q8&4c)P{#I2= zB>g?Q=w#IcRmRq&xG4DpK^PitIORhgBvUYnrbHr!8UKPH8k5~PnHJl+K)AjwnNuds z4CzEg)0kP6N);8J0Zi6?o&aURjk5frlKi-$OcMw%xVbz@>$%@{Y(pD}#-Fif=AUFn zw<$gEW=$9xHZbSj0SS#52j2pi$}%l)TFhnL8J4Zt_HM#p&9b;*3hm??-H81fc?wOS z)FB0^j6PfFi>7XVj^J81r?IksZKm@t{*;#yhEv8L>se%JabjdzoCfd1V%EU(L%6v3 zCu_N{Z|z5S2O^IN(x~4DEfXBd{KmQYkQ}!NSL=3uK&MFOu>)T z_c@OKB_I$UVGm=%Fh08@ii{uH$~;yn119btpSUQz&VwF}0X-}c7_o$F9Nb-18upYjh{88BBtlG?hGpT&Vy?iZDtl zG8my)N<$xlv_8DLDkrGjNo?&^uMS;EyjcH+B&jTWc=tKG`zFUgHI#1=z4{GHG>H&X7C{QErX3Wb1r>AFJjOn&yc!vvJ{M~Jw@Tc9c7 z4{;M1`gfiPz52S>)#x4c2PE=p=?8;DZ_sjZ=(D~l=3?P*=B7W$J*>-QNpKLn8At5Z ziL4HJ_18ifM<6qxFfKm21 zpE6i>FIhp*xBD#GUfo|_&2ET?q+QCUPSU*A!S@d&g&1qTz>*oH#NHI~c#@>rLsRn( z(z2BjP|SpuCgW9bxgZBt#H^dPCf~aMK1BI^+5I}a`dLS>pZJ=*3jQ;q-clZc>F8F1 z!S}FZ8YR^PH)p_!KRu?KHd-syx3#h6Ob_O`!>zSa&4R+{and$=?Tl*x7GeeL3=)AK z`8G3$Up5GMu0|P2u_N48#%>W{s!dlDn3kI3r-XP%ug(aO%3rP%VLfs+A9hNxjbdiTByW{we`UNs!RATVpx~ew0XP&<=k+~)VBzNgk*pUJ3vDC4>X}D)t~IL5a+l*UMw{DB5t3c@Wtd# z&1T;4)s@`Q?vR~pvi!jQj5qF^p^_GUg_RbPkXNf>cb77( zvX@flBDr@Kzz*%tYCWXlr42@XYCh0-Vt4)!S?jI;a#OwqHG#K;kQX-0qd=j$#E9ec}gE+|EEuAGsZ z;;GH!OBV|9+LrQM1ryq#2Ckt_?UY16TWuI$oJV#?@OC%!rCw`Ze!c$G{GF$9ZrL9> zeH&+@gf`&5gsLWRS^;)jJpi6=B{(XB9Zfbe%oQiU+L}IEn2A-|-_dePwy+=Xn6cNHOav5l!3hW!0|`=|bghWrCjTP2uM_=j6VV;LO}ra z!8Vp7A#3<>5o)o*JHjX|yL3;L`nSwTV$$ z*cBvlarzkM@oD4D8)*iN$oUIF$0&C8+{M6yHpWM0TG(P z00zG=Y`d9+#E#%4%yf*Iv+oabxFI1qJXn9-5gDIKr+mf7PJBEkE4PhmH3CgBW z>Gq+%s^$gCkBa{kT$d3U63fk^xR7IU{R1R+;PIK1|J7yHt^*VF70Db83Q-C6N0O6> zZQzdgSrNMJK&h_~%Rp+;G;NuJ&;p#L39=^FRjspk5fEp)jd~G-7)Aw9TqD1WTUo!G zd!*(88N%KXPwnZxaNH0#YC<7os7Owa!3Lm4*hkj~zlDv__T^`oKH$5$0dZ-i+a`-8 zUGLzk7CPuZ&%vTu+jDA=}80U1Nk<-SH zrSh^v%@LrPbTMQ5YGW-{2g>O)Gd$(OKo3Gh++-*l_=W>zd?86#n&f5@*<)qW#EqDj zyCtNEE?Kw-L`u?#C(+n5Rde=|9!UXPqn;MUNEIn;F~QmuHeWjHNmw&CVxRK7oT0}kF$hX*S6l4K;jGT)1J)MxSd7QuE#q1C(2fxC5fbw7q)s19FwM(#X*YY@CJwg4qgmjU{l)aSzJPISEmd@6uR#&S2@{4b0=&aQ5Uxrvh!QJPF>15d3Oywx7@yb}vplv#octu$;?yysQbkbY zaCg?5=M&>a(0~?cNL}Iiu=KttLL->M_4yt@KSTp?5JCjFwhcCZ4HAe3-$IAyJS#tn;J?MfP+!cHcqVC?Se7F2$jLB_#~8}CO$e+|f-P@=!_|HO*o z9twM$c5nq1h;QLiA*N|6opYVdCXB_H5D?*SPQfTv%S&qN@P(zV1V)}C5Z{DiZV_CV zhO0&b4SZbtW-_aHSOmp@iFPHI5Fy(2r#2E$sjfr|ZIT^fn&J`z5gdZqzz!>xngD{N z3PYF-sb3o%*r!sG<6jVmhr?_l0Z=88h1_lsiV5GEQlg6&dh*ZP)h5U$d`)Px7YHy26`ygZpb%%CFU~gg7Z~LLMLX^@VlbyUlhj}hNh&wg7u?)2L%5B zp(ucw=ZShztBU%nr{Ph!h39gwNSDW#3<5DLxhM%@RD5>E=G)@XTV~$@1Mh(U3WNa= zAII$v3FQAv1CsQ>{9k`oDL`G%e*wX`0f_9j;WYn@flNd7Mi>_1cfSJ!_Hh>ui?5cRLb6ZrSn`M3Qil@d}^ z_*dxjSAK-@{4{*Fw<9t)3;}Zh4ND<|2e19%X5a@T z{$EJ&4{g)`Z6ALD>r~uM`(!Iag9tm^oN5ZGD{Xf$^ly|^^$f~yR zINwYSDjeeJHWfk)Ts8{0bAX-zCSw2=Ye__Vd5=UM))Ed%+5#12%QrfGNR&G8I(i32 z++M)fTny1J3K4*Qg$YHU(O8~_CAGp9N0-2Ha_(ZGpCNlBhO~5@5ae@=ay@ExSR6AQ z4iBGxRg7LOf(oQ%={)=Z0stGVD12q$ha@)uxp#u!$9oAO2GdU0uIJ48{-pC&29GI{ z#mj@J-3a;8wf8&1h3gMvMc9 zoWK+67}RPjK)?4-Zg&r;b8%TCAV7E&R8&2C2heOacROO6^?4(C2jBX}AeMeDrhDM# zzid)FTKQC6{L5|_T1Qn?RjXX}qH6JK({R#O47+hNF#!Eg>MXk+;g^LxIA>|bSXjRqmLR;Y;gxzlrd zQzl{YxlISn-Q|^stPih{ok||6A-5B^5pR{wMrj_K&42I?Gj>45z&OfqfuOXl6WC`J z(Vn{D3da~0UjV>2Cl5nROq}XhpQm&g^huEpcA4^6R0r}VPCI85Ub2D92qHl;mP#1| z6j~sTc|Iau4`3IiwO!@ryx9$gbat*4Rri`_;Z_#Z@33gTn?IMi-FT|6lvPxJ8Wx5$ zR(0Plkk(~OMD$3US6$4_k&aDjKLxq9i~_}bQ04_MI;KYUnlqz!l3-DD1UH)&@uO#K zI&VwGdB|Mx)S59}xL9ET&ey&Ky6luLbOobJ=Mg!d4vettDE$h(i>zj2S|89Y3JPF? z&Y!>cG1BYU2{?Z8G<|tJWkF<;d*Ujv3|49s9tpIg&_Tl!alH)cD0=o_nf|*8VvaPaiAhTNyKDqXGjYqd`k2h(4v~M$cxmub{%N&j*+8g%rP*W)>j_ z{Dc=Zn7~maM~yWQ-v+YNI@YN%mH^AKxnah!V!;N;f;t!zHtyJ3`q-eLWD)FJFXLx6 zzr*29(dkMM8i;5Bu^ao-#h6t_i{Jh%*Q>*h+(A3&(JIRnGD2^1%a zRcZwl>@6dlGUfxLSl^R#l5Due(g$@;C*e$Cy=*9$9eLcdi2wzG72@D|4^*UN; zw+sa$QNyql%92rGo&0JpZWudJ0I51h^~wOf2jcnO>R&9}>U|2Gj1?-Vbg72;6~d z#Pn=>V{`F)fwLf^io2m6$bpg3g+fmNM>SrU7842-|5mA3Vm_lr>-eePFc_AG;HK&d!dxS$9?X^nsue|4oHUv8uX^%FCgOy*!zdzAW(QrxIZX_7- zGqn4>FC&yJ(0m3!kPo}%Ml4S#tI%RCgGEI~6B0%yCQHVLx;Mt`4N2sdpb9^ajzd_6 zvAZN>wY8n0Jr^PuD%D)B#7bD5u*UsWmLVr|cQuK?GI6G?oZ?(sw$ct|@Y}RWWNn&I z?2-Zuua;uxKwk}w+MuKig}IRg5BOUG#4(F8&DF2Dj)NAkM0HF^iSl0@s3Q9>-CxZZ z5g@~J%}cqR@yw>DenZs07}EB;=45an4z_(A1XBT&9YG|zL$QP%E&L!I%0#*lmE?v& z>2a0?Tkh}R60xJ5`Zz@e$z3r7ifqNE;K5J~o;V-&k&4-Vkqj@yBmCsHCIsu5MjP$G zfW!Jx5G1ILjB;4rk#h1wek+%ulnD$9`&5cf0c$COspFfI^A&F{32QuB*cbssh5-o& zlV3Oh1i*2UDe{HPlDN6OF{2j4?XTRG962nscE}wj=l<^EnEORoyq0a&L@wU`n^f+e zG#zit_I{*ExPH25g<2h_TD5=`p2RT1pn*fm3p2w-1j7GmymDU5si7WX;TR$%vB)yBak=Kp^+yEit%H*xihW5un^Yemf^)- zsX;Dv-HX9UQ8BH?uV0iZ@+=uZ##D$d>e?+#xY$BiV4E`qJEW!p#myl`i`rfONEkUJ z%dSCzHoa(AFhFg@D-w}gkI(#s@rfby9y6~>XSXsRz%OlHj_%5? zoHtX5zrAFprBKQl_zgu&m>gVL9vUw9^*&KBQzGt56^St^JdxADRu2if!ZfL9D?8A$ zUH2)_^U7m%uBq{ax4d3 zSw0NihF83=`Jgq+k;4EUyF zE`=$!fF@_53gL?e0IwKqyQEnAW|O!6dUnMV16?m$fbNt;QusSQzU6w{dUb4l<P&J5MdyH7)!5wfiPS&WeUV?5IEdKCIM1VA_lSFVI9lF zs_0Ha30|J>mnqV8N1OrQoEia5ziFW~M!+?Mp<G9XexmUP#Vz5Xa~)_b^Iv~DRvRhfwUaHJsJJ#bNl1i&M7Rug%B#<>XUgT zQ+V4iscqN$J#e9Q^h^7z0P>a;%?TeZ-6CN&B17)m^JmDd%Q8fABuPm`TaJcXNPW<&cwm5U>XCji9 zKM9X=kFSq)n#gF}diF`4qA2y~_WBJQk+x=e9FYJaD3D)-2ysXOnB$TwVkAHO{3k7C z7-daE5fm*I)F9c?vLNB9c!TE~z=8nnUkWd(kr(jwOS@^}@H`s-2jX8QddgeH!pbu6O zV}5skvT_eBFqy9uy8UI}W|0P$xkkw-wlkjHAD}};umxRPJ!CayCjAc3DgDAz z>mqE+&6FBKRzt?FOCB&HbUQ4)>Rml2rCRR)qJFn|p1^>LTylKtu)fto3ZrDrkXd7p z8&$j3P(-7O2PNdofM!lpeN{V>8@eXFrojU@;Buj(OOPO=e6i@b+VtpNtbjIHj3AG$Fh)po4 z6{9CXlbFA3-DGmSw0|3B29)R~%far(y|JMG3{J$Z5c)#}nP+`Cr zz!)IF$N=D|U=XNa?*jm$zchgmfBF8mK|?~pz=A^n!Qei|aX&`>*XYOh0*8bGzOMif zAix0NC=e(gJ+JQo-~YP*|9XX=rIg{cM*G5kwt-zRo$rcOTNE_Aoe!zRZ~I?7B=w7> z2+SqN`%{6}7rq{DyZv2mN4M8tGY!vyi3Z~ARgiUC+`p4`IUA+&*`zvKB|VAp$a&EK*t~t&ky``YTz-{`ExcKi;)GFxN|33$pF- zQU%W+>+ETxBka0~bn&W4QVrk}FKiEPH3=I4)kn%*z|00E3+nO4u}}Tu{!OEyDLoly zMVl*;SNrp$#GFX=^686u`9k5IyOs0(nX}L`JRm8MI9{PN{e!m zBs(6?dZLf_Yf#D)a^`5e*wo$7%zyTj3zIj&h(2zpP^3cm6v3z@H*h?LLFayZ=i2ih z2mp_sv%<(k#zM;ml*F4=@F|+itCueIX;btwXJvN5DYl53Unfqugtw@vMtkJeUms{s zbrQQx3X0Sw^nW1!c?M$=v;S=R1B$vq2iK(mEb>hx`)T{F4ibDtXT^Ol`ku;DkcMd6YK2b$eSl**Hs)% z#hyFAV(e%oCezxwKw|8BPszm+_^Vw@^pchjt6Q~#buDaH`EK#blpnJ%IYsqX6-Lf_ z_hJtyQ?@I$?N1q9X4`beNJX4~Tp%++%eq_{x9^oYjGlrzZvKEV;@E&+*sY^BJ5c0V zF`-q1x;%c~WxZ0^hYR2gQ-W$l59gA;ZsAb)fUgPtqBy7LMW*HG!n!8GAn91Kk(z2o_j6(@NQqU6}8pPb^#* zJ={A!?j{E;;}amzo(w=XD(y~RZ|0O^ej%O`Y1@gQf*7_rt3ibSPf*S*y{5XDviZhA zoh5%h{epSB>2SYL5lI1g-wuP`os9qf5P7e{<5!O#7{kd$MFQVHe}hv3-snVI15a5i zxY@{JwrsthsbD0iIC18u73nzTC?WNI#^w8X@oO zkPyl#9nSVD+oP#|Rvl)bwG$W0bSzA~_weqfl5Dj-UJ?F{uSG%5q|e*1ZLTJ3vfSEB zps2)aCkjE*5B~sjJ@O9Ng`$4kdg2xAQvB@PA2)hWK0#&gQU6soj)`~rM$#kvD&Dq9 zT%7!1pz*fO+*3}OKxR@|`1d0CjX?j9BwL2*DPT=9c5}GrB|4Z0VB~-+0v?!@VT2we z_ubQEi5&0YXfvy0&;@Y?cc)19EPpt)CgJApQ#!`$v^^r_8fXOgD53GQNj2b@^LwO* z-2o{siy7JPyS;cYhW#dPqX!i};RS@Q~%3iH?CQ7T9okv`6#d5aq zA~~sUjviHG;hTtUNhuawaagM`dwi;#@WZ<6GP&o8%>5T&s+xI|Bc9c`3jAQxHiefpaEnMIG8z!b>CGq*FeB25)rk;Iz}#QkOue zxUC8QxDxb<>Qh<}!-93CLw$0GWZx0&H-`a0qlR>--ucLmw({59=!=JC22H0m{My8Y z_?QVn*cs)*Zyi{@dduz)rJ`m}oJ<%>$!KR&GjQw0oNVivh>F$PK9Ks3qwKnwv$X}< z#*JrZb74w1K7l*@f;;*j3o-@j$BE|eDF*VtYxRE?WK=W&6grC{2C0z3KP&LZu}2W> zjfkOqw#9GmA*ukW!prxWdUx~cIYYMnGmo5uJ2lV#X}(HX0T%xy(c_f)rg?>Zcqg5N zN=&Xjdi&7hPP`E)Vrk`;ZV>AMmb!C+hC@jaLD!)x)^wy1KF5UhB~bb$Owjs+5;ZCS z91H>+0`|X*KIlOJQPCiwNQHy}=wu(egQCGdtib=WdgYhEY6U;&J6NR7c^1^kDwk$7 z#+VkCxmT{L%o|5g95P8sX>_M{fTLkBMhX3f9SW?D6^L3{$GEFgT|8emjKfha%rcv$ zPfCMv03*^0_7wxDhw!I9ii=;dsA=CwU8H_JYpp^K$NUKk%-5c4R^`sZ2HX*ieo)m! z`Jnni4hRDc3l9VTLHIvZ0g$91kU@C-=+G4`A+> zls@aE43F<^#$6Uqo{TgtJTzr-7;^9`Pm7G?|}HW?BDAAMBAwv2F)sock26ltr6$-cb?5-e+abo*6ptNA32NP z0fQir`b~FURQTTUT}!L&&a;}GaH>PwTtAaGwZ0HkRb+LsoW{L?|K6X4Q7a20f)g&o zy!fUKO&Qa|?w!jj-r*sU63S2jfJu_ym(chg0mR`cN;1A`5;1?`Svz&Rwm&Ae`qj#^ zUZS`(ngJvj>$OlV^cgozD~I0m$bxY%7XKu&%`N|#?JJ#cSq=bD126|b#1M);{(0jg z6h2_SPnGJAH^ZW~q0#}=gd%xxlN?Bs)|^ri3b^*I~0r;ZOZf8$74PGQ}g3^dXMjdF_W23CYA2z zG1Z~~Wq26NmK3@#n6iFu(1RANZAzhx$~7Aj)&v%K>~$j#3)2HptK^|0FdZ^1gpkmx zX?eMCe^j}2>axEN82M9f>(#lMF5d~%7Rn#9Ha}EHYGL2K1D?MMEbTe%s|mTfa>>A*-)?I{s?$ z(wM||6-#uin;LYOm>U|UzUTX;+eM!=%J+>H)2^IIc&{K8>n(j%m*dY{+HTXNLRt?n{B)Z@Y^6k1nI%;(`&gmKKa@OS(^U%b{Rj#!Z}mNeo&yRLEKyz>hbS_BnG<)t)BJ8!W>Mq8f4BUue} z_(CY!VB6&5SwzZTJ}7D~y(U6N*I4;oiAob?+1F2K5Opr&@2>XaK5lDuRcR%?Vh}@z z{rPb*({c%g9+u{=F`zIo66SxHj|Vj$YD!u4eIR}{q6_{VKvjIVAM*~l{PtX{GE-?en1oiH)!}`NtxiZ%mpSk`+125FO9* zEjo`zk##3NV{`33cEC;j3M(7Ibj9Ik9MkOC*&FYR@keb1D>kjs-=*6@$-jTmzXOu> zHL%9ja)-yulPoUBGrs+fs_u2l_%^GgtSruJm<6*9^xWhupWNtO56wQ5Cil?D(8v7w z)~tA@sR^26k-RkwOGS3zN*aN#U=iGv59`Ip2WcVloFUId{1%SzR$c(lO89JZ>kVoT zzO|hqQes>@E?#N=gSr#ijW;~CM!jaU+iaQLJb1rl*pK8skGu5vqq}W`r{I;MYGZ-= zVaF@ih)_+>=>W3?U;bNiv&~>$7MlfWEM>$4|2IPUQr`h4?$UB2k?46B-92sH$Wp~Q z=gv^FTX6&dP;$>ONIG}&(%d29yrmlC)bm#6M@l12G{OZnS&(PfsA+fwo`RScu z#XCTl>@Du>ZA~8?Lut@3_73|f_wxjlm;PG!_2q-})*dcd&vT&{gA;qKic}4VO=0$z zB8B$BRusrTPIpyGiH&NEFRy9oTXP>lQ9Df~gt@3T#9)W?+2z-m=du(@Aj91y1>=p* zt2Rl>b#`k5pYhVUq&ysmlyg>-+?ux)1u11EN_1CwjZT3vLo z7^Sfl?3*1eQH(f|V48DqZdaec8~uZkRrx>|@8t=e&KBJbo}qE1?54AT_5ii=8jD-H z)iru@Wox!-CpWWrS^AW4%}Hb9dAE;Gc+X3Jjsqkq+2&!q>eSjAA#_q?{;hB=P#-zT zRX9=M;O>(Ti>_Qe(7w>6rXF#h{{(iaq}cp0I>VlJ5tFCb7dLCyz&NuG;XuvRSp}PA z%Cw2KFyY%El41OLQ{91Lgo?sK&)vLZJU=Fi6vMSN{3RjE?*OyV^zxWHvm7qjDvkT}b`otqML3~c zzT&iiYjIiB@3s`OlBm}Qsz_t)$K@crAgbGW`eB<`#HXgV*GrLgbDam>SBg>E;b-Bb z;j0((9^`aIvZEgDNwrzB=Sb&+5DqSUH$3Wr+@EYx!J{2Gm|&j8j(Y7J8XNO0`*vBV zc=)26MkKDZd)_c*S-5#J%`{ivW0XwJlPS&*i%Q(XI`5``Dl^QElJnOU*q*N%vRHu# zEQ}FWDU)cWbgZm=Use?-ZfCnuiH9NXT6}CmwGV1O_wSlKS6&ESLl3an*yJN*^GN;v zQv1DWc7E}}{rc;tu)05tuMyBn=S@rZrzZoTDq011h=R617Owlf27N>V$Jia%-+7K1}g2Uf(8&C?gTxRC$ii*>(e2c*Zp4 zlIkR$C;l9&Hx|aW*^WC3!fU_y3YJ$NU6ZT2Odb-Dm6L<=V>lDps8?eg=M^muf`vDJAbYXU{A|Z99|@MMy`xjSj7E-XorwmNhu3EvqM>` z9)^y?%d}%eP-2tMw6U;>MOB>YOy#dhnuyFEM@4hu9S$xStTWcd%GzdjYq@#Y2qz4? zDT^&-bTc_Y?^Oy1LL@)y!|)_*3~snOu94RU)vZ4t}IYv zHaah{eaoZaYEIV(>Ktp=s3tzm-vswcX;yf-5`Y*aK70qbZctJ{{5s*@6UgHHoO{fz zDF~DHSZD5|ZZrto42a3SllXMO^43Ie^vd7_Tb0RS@T)wV-z4GGhl@^bz`{XJSg?>h z>7rSWb6BCf9F6@j&sh;#7=7<7>bjJFw1?1CK!7^b>tWDwy6Wd=+gLMZbDjl=ed(e! zwPD4gKw7;6o9((X4zM_02}m*O*x08cnuRSYkv-Ja0epyP$HP78{xfgCi#e9(F1m>} zUCM}xn(R#cvKoV8?&U}8m5%BGalYw}U`{EmLXJ7DGd(+qJ3>~iVH zp=A7YXi-N7f6i5Y0l9oo^(i(L^p>3Qd0+5$=o~qnkn{W2yOH!8h^(eOS{&o?b`DEKi_$XU(c7eH5n~vkGW)R9sYMgpaXDpw- z#A(l{>Pr@f`kS%?1LAm~8wmL(=?yC=xlAi1;7x{eE^DNpzzdVOtm$om@oYdzS?Wa0 z%Js4#(gb`P@3hfi`Dif%vxAo190L;wuFx!j<}US{fgRGZnIEJmSt}qQV<$Jg@`&W; z*Rs>1{8cf8e~bX=us3VJlyDWlRA-LVrs>b}+#+qitY1FxIo&n5z;#qWYpdC!KX>m$ z4wW{=NF{AUH!Dw4f8_ejZySVO9iBRtuGO7pQsgM^ffV&doHpg2a3 z&g!3nK}A(6nl22zJKvT18Eg=)kA(3@C}JVN;m~mKBS0u6m?|9CuyrS8zS?dG9g6FI z;+mKV{p{9{rAfx{2cci-EOZ46ehh?pf%$7sX+12?VqAliS!tHM<}44m^sLB&S41GA zQEHWN(2Ab$3$nOYb~fmM0yZ`le5Jlf3MzcxBdcfD1JL2)zgoyv$ua6CeMu8T-n0NitC_NB zS*bbQDNruuTE>GZKXTC03`Y~+p(O`Auw>EVcTYrlx$aaaAsv^Le{L~I@Q~PnQbz(>7SwEk%Oi`?+;~qi~2-|w|iz*{N;1e&?)_ReZ`m?(pUk8 zQMmpX+o?79z|s?Rz+9?|{*Rx0GVC ztQW8ZzMmlCc-2pBC?zRlgEkXXThj8Q3y15%n7&J@0N2jZBdZEuuBF}qKZ;ca_9;Ey z%8^a!@-lrj73czPGMF6|pqks>%y;-ncC%Y{Bq?mry%pVMWzs#g#lM#XJ6RZ3o46P)m%B z4AST}PWY64t3v0m?91}OxVpN|dd8Y{Z7;BeVfEA{*44BmAO?>Ui`TUv*7_f5C@yF= zu(I7yo=j>KpL!iIL-(KI-p2RG@?Jx0-Lgn%cA6&P(x-6jD?!I)@MhhlS{q*)&k)Y^49jEvlsrJvz6U zqTK5Cr3MsSipI+U6_QhfplHehRO%O1b7a~}DM#xS7hH;@t&=d@d$%UzO9FKxN||1g zXjx6QQv~{A3RR*t?OxBkyu9q>^@^W`<8>K?*egFY zQMt3`)i@ZgN5c&zy$jQ_vNWx*v`{^Z!_*bckA3qKMcv3={m7X#8w+J<>r-JbNtBqm zZF|H*1LRRbJo|OH)A!;H(D(Cn13lgbD+l_HB5(KQQVKs|@?ec6?X>tGXq^@i1^i`n zElaQG^D=PbZ)@kC`Ac2;vgk;ie+X*uwVT4EY8_TdG5hBRK;#O0`BxQoB@YrNzMbFBM^7pMQ^A{el?nU|-(Wg>nu2l*0$_Y?ae&hto+N zTB)x&cuaM0oj?FJr6$BrC1wt5~u3XjlgG^U$i^FFFqYr!kh{2~LkeXi*siBU^#{0*FUE;2u;Vw6>9x9@cceec&c zp=gt`6i8gdJS#1dH13ZTh-%)~%F3lUn}x?&XRyhBt-uYFIihRhJi^TV*h@>G7S^h1 z-{yL?m%k=!slfGDBTNr`y1Isar)cv-=um2<{P#lGhXn3h&2vL{E&-kHxZ(7xat^)i z&tutAC5npy`&}re_5mKzH0GDy>kGXCX`4b&oQG+en}@RGBO8kpuhOhP%dJ?Q#>`o> zq1d!MN6jj3bdH{MK}ZG(`>9Ox;IgV|aN^}@O}M#5{*m?_J>$wIMI3??>E}Uf=NHXM zeE2^zD|RnN`;8z9svPcR-J&Bm&Clmn~~+3MZ=WzC8Q8&4c)P{#I2= zB>g?Q=w#IcRmRq&xG4DpK^PitIORhgBvUYnrbHr!8UKPH8k5~PnHJl+K)AjwnNuds z4CzEg)0kP6N);8J0Zi6?o&aURjk5frlKi-$OcMw%xVbz@>$%@{Y(pD}#-Fif=AUFn zw<$gEW=$9xHZbSj0SS#52j2pi$}%l)TFhnL8J4Zt_HM#p&9b;*3hm??-H81fc?wOS z)FB0^j6PfFi>7XVj^J81r?IksZKm@t{*;#yhEv8L>se%JabjdzoCfd1V%EU(L%6v3 zCu_N{Z|z5S2O^IN(x~4DEfXBd{KmQYkQ}!NSL=3uK&MFOu>)T z_c@OKB_I$UVGm=%Fh08@ii{uH$~;yn119btpSUQz&VwF}0X-}c7_o$F9Nb-18upYjh{88BBtlG?hGpT&Vy?iZDtl zG8my)N<$xlv_8DLDkrGjNo?&^uMS;EyjcH+B&jTWc=tKG`zFUgHI#1=z4{GHG>H&X7C{QErX3Wb1r>AFJjOn&yc!vvJ{M~Jw@Tc9c7 z4{;M1`gfiPz52S>)#x4c2PE=p=?8;DZ_sjZ=(D~l=3?P*=B7W$J*>-QNpKLn8At5Z ziL4HJ_18ifM<6qxFfKm21 zpE6i>FIhp*xBD#GUfo|_&2ET?q+QCUPSU*A!S@d&g&1qTz>*oH#NHI~c#@>rLsRn( z(z2BjP|SpuCgW9bxgZBt#H^dPCf~aMK1BI^+5I}a`dLS>pZJ=*3jQ;q-clZc>F8F1 z!S}FZ8YR^PH)p_!KRu?KHd-syx3#h6Ob_O`!>zSa&4R+{and$=?Tl*x7GeeL3=)AK z`8G3$Up5GMu0|P2u_N48#%>W{s!dlDn3kI3r-XP%ug(aO%3rP%VLfs+A9hNxjbdiTByW{we`UNs!RATVpx~ew0XP&<=k+~)VBzNgk*pUJ3vDC4>X}D)t~IL5a+l*UMw{DB5t3c@Wtd# z&1T;4)s@`Q?vR~pvi!jQj5qF^p^_GUg_RbPkXNf>cb77( zvX@flBDr@Kzz*%tYCWXlr42@XYCh0-Vt4)!S?jI;a#OwqHG#K;kQX-0qd=j$#E9ec}gE+|EEuAGsZ z;;GH!OBV|9+LrQM1ryq#2Ckt_?UY16TWuI$oJV#?@OC%!rCw`Ze!c$G{GF$9ZrL9> zeH&+@gf`&5gsLWRS^;)jJpi6=B{(XB9Zfbe%oQiU+L}IEn2A-|-_dePwy+=Xn6cNHOav5l!3hW!0|`=|bghWrCjTP2uM_=j6VV;LO}ra z!8Vp7A#3<>5o)o*JHjX|yL3;L`nSwTV$$ z*cBvlarzkM@oD4D8)*iN$oUIF$0&C8+{M6yHpWM0TG(P z00zG=Y`d9+#E#%4%yf*Iv+oabxFI1qJXn9-5gDIKr+mf7PJBEkE4PhmH3CgBW z>Gq+%s^$gCkBa{kT$d3U63fk^xR7IU{R1R+;PIK1|J7yHt^*VF70Db83Q-C6N0O6> zZQzdgSrNMJK&h_~%Rp+;G;NuJ&;p#L39=^FRjspk5fEp)jd~G-7)Aw9TqD1WTUo!G zd!*(88N%KXPwnZxaNH0#YC<7os7Owa!3Lm4*hkj~zlDv__T^`oKH$5$0dZ-i+a`-8 zUGLzk7CPuZ&%vTu+jDA=}80U1Nk<-SH zrSh^v%@LrPbTMQ5YGW-{2g>O)Gd$(OKo3Gh++-*l_=W>zd?86#n&f5@*<)qW#EqDj zyCtNEE?Kw-L`u?#C(+n5Rde=|9!UXPqn;MUNEIn;F~QmuHeWjHNmw&CVxRK7oT0}kF$hX*S6l4K;jGT)1J)MxSd7QuE#q1C(2fxC5fbw7q)s19FwM(#X*YY@CJwg4qgmjU{l)aSzJPISEmd@6uR#&S2@{4b0=&aQ5Uxrvh!QJPF>15d3Oywx7@yb}vplv#octu$;?yysQbkbY zaCg?5=M&>a(0~?cNL}Iiu=KttLL->M_4yt@KSTp?5JCjFwhcCZ4HAe3-$IAyJS#tn;J?MfP+!cHcqVC?Se7F2$jLB_#~8}CO$e+|f-P@=!_|HO*o z9twM$c5nq1h;QLiA*N|6opYVdCXB_H5D?*SPQfTv%S&qN@P(zV1V)}C5Z{DiZV_CV zhO0&b4SZbtW-_aHSOmp@iFPHI5Fy(2r#2E$sjfr|ZIT^fn&J`z5gdZqzz!>xngD{N z3PYF-sb3o%*r!sG<6jVmhr?_l0Z=88h1_lsiV5GEQlg6&dh*ZP)h5U$d`)Px7YHy26`ygZpb%%CFU~gg7Z~LLMLX^@VlbyUlhj}hNh&wg7u?)2L%5B zp(ucw=ZShztBU%nr{Ph!h39gwNSDW#3<5DLxhM%@RD5>E=G)@XTV~$@1Mh(U3WNa= zAII$v3FQAv1CsQ>{9k`oDL`G%e*wX`0f_9j;WYn@flNd7Mi>_1cfSJ!_Hh>ui?5cRLb6ZrSn`M3Qil@d}^ z_*dxjSAK-@{4{*Fw<9t)3;}Zh4ND<|2e19%X5a@T z{$EJ&4{g)`Z6ALD>r~uM`(!Iag9tm^oN5ZGD{Xf$^ly|^^$f~yR zINwYSDjeeJHWfk)Ts8{0bAX-zCSw2=Ye__Vd5=UM))Ed%+5#12%QrfGNR&G8I(i32 z++M)fTny1J3K4*Qg$YHU(O8~_CAGp9N0-2Ha_(ZGpCNlBhO~5@5ae@=ay@ExSR6AQ z4iBGxRg7LOf(oQ%={)=Z0stGVD12q$ha@)uxp#u!$9oAO2GdU0uIJ48{-pC&29GI{ z#mj@J-3a;8wf8&1h3gMvMc9 zoWK+67}RPjK)?4-Zg&r;b8%TCAV7E&R8&2C2heOacROO6^?4(C2jBX}AeMeDrhDM# zzid)FTKQC6{L5|_T1Qn?RjXX}qH6JK({R#O47+hNF#!Eg>MXk+;g^LxIA>|bSXjRqmLR;Y;gxzlrd zQzl{YxlISn-Q|^stPih{ok||6A-5B^5pR{wMrj_K&42I?Gj>45z&OfqfuOXl6WC`J z(Vn{D3da~0UjV>2Cl5nROq}XhpQm&g^huEpcA4^6R0r}VPCI85Ub2D92qHl;mP#1| z6j~sTc|Iau4`3IiwO!@ryx9$gbat*4Rri`_;Z_#Z@33gTn?IMi-FT|6lvPxJ8Wx5$ zR(0Plkk(~OMD$3US6$4_k&aDjKLxq9i~_}bQ04_MI;KYUnlqz!l3-DD1UH)&@uO#K zI&VwGdB|Mx)S59}xL9ET&ey&Ky6luLbOobJ=Mg!d4vettDE$h(i>zj2S|89Y3JPF? z&Y!>cG1BYU2{?Z8G<|tJWkF<;d*Ujv3|49s9tpIg&_Tl!alH)cD0=o_nf|*8VvaPaiAhTNyKDqXGjYqd`k2h(4v~M$cxmub{%N&j*+8g%rP*W)>j_ z{Dc=Zn7~maM~yWQ-v+YNI@YN%mH^AKxnah!V!;N;f;t!zHtyJ3`q-eLWD)FJFXLx6 zzr*29(dkMM8i;5Bu^ao-#h6t_i{Jh%*Q>*h+(A3&(JIRnGD2^1%a zRcZwl>@6dlGUfxLSl^R#l5Due(g$@;C*e$Cy=*9$9eLcdi2wzG72@D|4^*UN; zw+sa$QNyql%92rGo&0JpZWudJ0I51h^~wOf2jcnO>R&9}>U|2Gj1?-Vbg72;6~d z#Pn=>V{`F)fwLf^io2m6$bpg3g+fmNM>SrU7842-|5mA3Vm_lr>-eePFc_AG;HK&d!dxS$9?X^nsue|4oHUv8uX^%FCgOy*!zdzAW(QrxIZX_7- zGqn4>FC&yJ(0m3!kPo}%Ml4S#tI%RCgGEI~6B0%yCQHVLx;Mt`4N2sdpb9^ajzd_6 zvAZN>wY8n0Jr^PuD%D)B#7bD5u*UsWmLVr|cQuK?GI6G?oZ?(sw$ct|@Y}RWWNn&I z?2-Zuua;uxKwk}w+MuKig}IRg5BOUG#4(F8&DF2Dj)NAkM0HF^iSl0@s3Q9>-CxZZ z5g@~J%}cqR@yw>DenZs07}EB;=45an4z_(A1XBT&9YG|zL$QP%E&L!I%0#*lmE?v& z>2a0?Tkh}R60xJ5`Zz@e$z3r7ifqNE;K5J~o;V-&k&4-Vkqj@yBmCsHCIsu5MjP$G zfW!Jx5G1ILjB;4rk#h1wek+%ulnD$9`&5cf0c$COspFfI^A&F{32QuB*cbssh5-o& zlV3Oh1i*2UDe{HPlDN6OF{2j4?XTRG962nscE}wj=l<^EnEORoyq0a&L@wU`n^f+e zG#zit_I{*ExPH25g<2h_TD5=`p2RT1pn*fm3p2w-1j7GmymDU5si7WX;TR$%vB)yBak=Kp^+yEit%H*xihW5un^Yemf^)- zsX;Dv-HX9UQ8BH?uV0iZ@+=uZ##D$d>e?+#xY$BiV4E`qJEW!p#myl`i`rfONEkUJ z%dSCzHoa(AFhFg@D-w}gkI(#s@rfby9y6~>XSXsRz%OlHj_%5? zoHtX5zrAFprBKQl_zgu&m>gVL9vUw9^*&KBQzGt56^St^JdxADRu2if!ZfL9D?8A$ zUH2)_^U7m%uBq{ax4d3 zSw0NihF83=`Jgq+k;4EUyF zE`=$!fF@_53gL?e0IwKqyQEnAW|O!6dUnMV16?m$fbNt;QusSQzU6w{dUb4l<P&J5MdyH7)!5wfiPS&WeUV?5IEdKCIM1VA_lSFVI9lF zs_0Ha30|J>mnqV8N1OrQoEia5ziFW~M!+?Mp<G9XexmUP#Vz5Xa~)_b^Iv~DRvRhfwUaHJsJJ#bNl1i&M7Rug%B#<>XUgT zQ+V4iscqN$J#e9Q^h^7z0P>a;%?TeZ-6CN&B17)m^JmDd%Q8fABuPm`TaJcXNPW<&cwm5U>XCji9 zKM9X=kFSq)n#gF}diF`4qA2y~_WBJQk+x=e9FYJaD3D)-2ysXOnB$TwVkAHO{3k7C z7-daE5fm*I)F9c?vLNB9c!TE~z=8nnUkWd(kr(jwOS@^}@H`s-2jX8QddgeH!pbu6O zV}5skvT_eBFqy9uy8UI}W|0P$xkkw-wlkjHAD}};umxRPJ!CayCjAc3DgDAz z>mqE+&6FBKRzt?FOCB&HbUQ4)>Rml2rCRR)qJFn|p1^>LTylKtu)fto3ZrDrkXd7p z8&$j3P(-7O2PNdofM!lpeN{V>8@eXFrojU@;Buj(OOPO=e6i@b+VtpNtbjIHj3AG$Fh)po4 z6{9CXlbF Date: Mon, 26 May 2025 13:30:06 +0200 Subject: [PATCH 02/11] rm assert false --- src/tests/test_viewer_protocols.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tests/test_viewer_protocols.py b/src/tests/test_viewer_protocols.py index 20a7ef7..5083383 100644 --- a/src/tests/test_viewer_protocols.py +++ b/src/tests/test_viewer_protocols.py @@ -230,7 +230,6 @@ def test_update_camera(server): ], ) assert server.compare_image(3, "viewer/update_camera.jpeg") == True - assert False def test_render_now(server): From d685b6ced754d517dcbbac412640ac435bc1d8ee Mon Sep 17 00:00:00 2001 From: SpliiT <106495600+SpliiT@users.noreply.github.com> Date: Mon, 26 May 2025 11:40:52 +0000 Subject: [PATCH 03/11] Apply prepare changes --- .../rpc/viewer/viewer_protocols.py | 6 ++-- src/tests/test_viewer_protocols.py | 33 +++++-------------- 2 files changed, 11 insertions(+), 28 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index ceb59c0..b7bb8a1 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -280,7 +280,7 @@ def updateCamera(self, params): renderWindow.Render() self.render() return - + @exportRpc(viewer_prefix + viewer_schemas_dict["render_now"]["rpc"]) def renderNow(self, params): validate_schema( @@ -288,7 +288,7 @@ def renderNow(self, params): ) view = params.get("view", -1) - + if "grid_scale" in self.get_data_base(): renderer = self.get_renderer() renderer_bounds = renderer.ComputeVisiblePropBounds() @@ -298,5 +298,3 @@ def renderNow(self, params): self.get_protocol("vtkWebPublishImageDelivery").imagePush({"view": view}) return {"status": "success"} - - diff --git a/src/tests/test_viewer_protocols.py b/src/tests/test_viewer_protocols.py index 545c216..574e4da 100644 --- a/src/tests/test_viewer_protocols.py +++ b/src/tests/test_viewer_protocols.py @@ -193,6 +193,7 @@ def test_grid_scale(server): assert server.compare_image(3, "viewer/grid_scale_on.jpeg") == True + def test_axes(server): test_reset_visualization(server) @@ -203,11 +204,12 @@ def test_axes(server): ) assert server.compare_image(3, "viewer/axes_off.jpeg") == True + + def test_update_camera(server): test_register_mesh(server) - - camera_options = { + camera_options = { "focal_point": [-0.034399999999999986, 2.4513515, -0.10266900000000012], "view_up": [0.48981180389508683, 0.8647097694977263, -0.11118188386706776], "position": [-17.277630202755162, 13.419047188880267, 9.232808007244259], @@ -218,25 +220,14 @@ def test_update_camera(server): server.call( VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["update_camera"]["rpc"], - [ - { - "camera_options": camera_options, - "bool_render": False - } - ], + [{"camera_options": camera_options, "bool_render": False}], ) server.compare_image(1, "mesh/register.jpeg") - server.call( VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["update_camera"]["rpc"], - [ - { - "camera_options": camera_options, - "bool_render": True - } - ], + [{"camera_options": camera_options, "bool_render": True}], ) assert server.compare_image(3, "viewer/update_camera.jpeg") == True @@ -244,8 +235,7 @@ def test_update_camera(server): def test_render_now(server): test_register_mesh(server) - - camera_options = { + camera_options = { "focal_point": [-0.034399999999999986, 2.4513515, -0.10266900000000012], "view_up": [0.48981180389508683, 0.8647097694977263, -0.11118188386706776], "position": [-17.277630202755162, 13.419047188880267, 9.232808007244259], @@ -256,19 +246,14 @@ def test_render_now(server): server.call( VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["update_camera"]["rpc"], - [ - { - "camera_options": camera_options, - "bool_render": False - } - ], + [{"camera_options": camera_options, "bool_render": False}], ) server.compare_image(1, "mesh/register.jpeg") server.call( VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["render_now"]["rpc"], - [{"view": -1}] + [{"view": -1}], ) assert server.compare_image(3, "viewer/render_now.jpeg") == True From b6847ab982a90f22f5c567a16e974fdf1e807081 Mon Sep 17 00:00:00 2001 From: SpliiT Date: Mon, 26 May 2025 14:33:24 +0200 Subject: [PATCH 04/11] rm bool_render --- .../rpc/viewer/schemas/update_camera.json | 7 +------ .../rpc/viewer/viewer_protocols.py | 11 ++--------- src/tests/data/images/viewer/render_now.jpeg | Bin 15681 -> 14435 bytes .../data/images/viewer/update_camera.jpeg | Bin 15681 -> 14435 bytes src/tests/test_viewer_protocols.py | 15 --------------- 5 files changed, 3 insertions(+), 30 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/viewer/schemas/update_camera.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/update_camera.json index df7f259..b58f3a5 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/schemas/update_camera.json +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/update_camera.json @@ -45,14 +45,9 @@ "view_angle", "clipping_range" ] - }, - "bool_render": { - "type": "boolean", - "default": true } }, "required": [ - "camera_options", - "bool_render" + "camera_options" ] } \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index ceb59c0..ebf50df 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -263,7 +263,6 @@ def updateCamera(self, params): position = camera_options["position"] view_angle = camera_options["view_angle"] clipping_range = camera_options["clipping_range"] - bool_render = params["bool_render"] renderWindow = self.getView("-1") camera = renderWindow.GetRenderers().GetFirstRenderer().GetActiveCamera() @@ -273,17 +272,11 @@ def updateCamera(self, params): camera.SetPosition(*position) camera.SetViewAngle(view_angle) camera.SetClippingRange(*clipping_range) - - print(f"bool_render: {bool_render}", flush=True) - if bool_render == True: - print("render", flush=True) - renderWindow.Render() - self.render() - return + self.render() @exportRpc(viewer_prefix + viewer_schemas_dict["render_now"]["rpc"]) def renderNow(self, params): - validate_schema( + params = validate_schema( params, self.viewer_schemas_dict["render_now"], self.viewer_prefix ) diff --git a/src/tests/data/images/viewer/render_now.jpeg b/src/tests/data/images/viewer/render_now.jpeg index 94bf982ccb3f939eb27dfc5e4c6465ec8510b1a9..2791521717e6b13d9c6916fb624b7eb7cf3690fa 100644 GIT binary patch delta 13258 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 R5A|w(^mZ+LdH%ch{{bj!aY6t9 delta 14558 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 R5A|w(^mZ+LdH%ch{{bj!aY6t9 delta 14558 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 Date: Mon, 26 May 2025 12:34:32 +0000 Subject: [PATCH 05/11] Apply prepare changes --- src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index 35b09d9..b5ebeb7 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -273,7 +273,7 @@ def updateCamera(self, params): camera.SetViewAngle(view_angle) camera.SetClippingRange(*clipping_range) self.render() - + @exportRpc(viewer_prefix + viewer_schemas_dict["render_now"]["rpc"]) def renderNow(self, params): params = validate_schema( From 1d46ddf139d725b827483bd251a4ded993d9c1c9 Mon Sep 17 00:00:00 2001 From: SpliiT Date: Mon, 26 May 2025 15:27:48 +0200 Subject: [PATCH 06/11] view -1 --- src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json | 7 +------ src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json index b9e995b..f7a31f2 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json @@ -1,11 +1,6 @@ { "rpc": "render_now", "type": "object", - "properties": { - "view": { - "type": "integer", - "default": -1 - } - }, + "properties": {}, "required": [] } \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index 35b09d9..361a9dd 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -280,7 +280,7 @@ def renderNow(self, params): params, self.viewer_schemas_dict["render_now"], self.viewer_prefix ) - view = params.get("view", -1) + view = self.getView("-1") if "grid_scale" in self.get_data_base(): renderer = self.get_renderer() From 0d6e0305fe89b9fb056b4ffba219d018a5a4d8c5 Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Mon, 2 Jun 2025 11:08:20 +0200 Subject: [PATCH 07/11] publisher & schemas --- .../rpc/viewer/schemas/render_now.json | 3 +- .../rpc/viewer/schemas/update_camera.json | 61 ++++++++++--------- src/opengeodeweb_viewer/vtk_protocol.py | 2 +- src/opengeodeweb_viewer/vtkw_server.py | 7 ++- 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json index f7a31f2..ed6023d 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/render_now.json @@ -2,5 +2,6 @@ "rpc": "render_now", "type": "object", "properties": {}, - "required": [] + "required": [], + "additionalProperties": false } \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/viewer/schemas/update_camera.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/update_camera.json index b58f3a5..041b5f4 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/schemas/update_camera.json +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/update_camera.json @@ -3,40 +3,43 @@ "type": "object", "properties": { "camera_options": { - "focal_point": { - "type": "array", - "items": { - "type": "number" + "type": "object", + "properties": { + "focal_point": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 3, + "maxItems": 3 }, - "minItems": 3, - "maxItems": 3 - }, - "view_up": { - "type": "array", - "items": { - "type": "number" + "view_up": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 3, + "maxItems": 3 }, - "minItems": 3, - "maxItems": 3 - }, - "position": { - "type": "array", - "items": { - "type": "number" + "position": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 3, + "maxItems": 3 }, - "minItems": 3, - "maxItems": 3 - }, - "view_angle": { - "type": "number" - }, - "clipping_range": { - "type": "array", - "items": { + "view_angle": { "type": "number" }, - "minItems": 2, - "maxItems": 2 + "clipping_range": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 2, + "maxItems": 2 + } }, "required": [ "focal_point", diff --git a/src/opengeodeweb_viewer/vtk_protocol.py b/src/opengeodeweb_viewer/vtk_protocol.py index d57715e..44dd12a 100644 --- a/src/opengeodeweb_viewer/vtk_protocol.py +++ b/src/opengeodeweb_viewer/vtk_protocol.py @@ -35,7 +35,7 @@ def render(self, view=-1): renderer_bounds = renderer.ComputeVisiblePropBounds() grid_scale = self.get_object("grid_scale")["actor"] grid_scale.SetBounds(renderer_bounds) - self.get_protocol("vtkWebPublishImageDelivery").imagePush({"view": view}) + self.getSharedObject("publisher").imagePush({"view": view}) def register_object(self, id, reader, filter, actor, mapper, textures): self.get_data_base()[id] = { diff --git a/src/opengeodeweb_viewer/vtkw_server.py b/src/opengeodeweb_viewer/vtkw_server.py index 7c44e7a..6805d0f 100644 --- a/src/opengeodeweb_viewer/vtkw_server.py +++ b/src/opengeodeweb_viewer/vtkw_server.py @@ -61,10 +61,11 @@ def initialize(self): # Bring used components self.registerVtkWebProtocol(vtk_protocols.vtkWebMouseHandler()) self.registerVtkWebProtocol(vtk_protocols.vtkWebViewPort()) - self.registerVtkWebProtocol( - vtk_protocols.vtkWebPublishImageDelivery(decode=False) - ) + publisher = vtk_protocols.vtkWebPublishImageDelivery(decode=False) + publisher.deltaStaleTimeBeforeRender = 0.1 + self.registerVtkWebProtocol(publisher) self.setSharedObject("db", dict()) + self.setSharedObject("publisher", publisher) # Custom API mesh_protocols = VtkMeshView() From b0c0577deb8a4101935ed032d47ccae717cbe550 Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Mon, 2 Jun 2025 11:18:58 +0200 Subject: [PATCH 08/11] cleanup & refactor --- .../rpc/viewer/viewer_protocols.py | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index 7bcfbbf..4f5eacd 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -251,12 +251,7 @@ def toggleAxes(self, params): @exportRpc(viewer_prefix + viewer_schemas_dict["update_camera"]["rpc"]) def updateCamera(self, params): - validate_schema( - params, self.viewer_schemas_dict["update_camera"], self.viewer_prefix - ) - - print(f"params: {params}", flush=True) - + validate_schema(params, self.viewer_schemas_dict["update_camera"], self.viewer_prefix) camera_options = params["camera_options"] focal_point = camera_options["focal_point"] view_up = camera_options["view_up"] @@ -276,18 +271,5 @@ def updateCamera(self, params): @exportRpc(viewer_prefix + viewer_schemas_dict["render_now"]["rpc"]) def renderNow(self, params): - params = validate_schema( - params, self.viewer_schemas_dict["render_now"], self.viewer_prefix - ) - - view = self.getView("-1") - - if "grid_scale" in self.get_data_base(): - renderer = self.get_renderer() - renderer_bounds = renderer.ComputeVisiblePropBounds() - grid_scale = self.get_object("grid_scale")["actor"] - grid_scale.SetBounds(renderer_bounds) - - self.get_protocol("vtkWebPublishImageDelivery").imagePush({"view": view}) - - return {"status": "success"} + validate_schema(params, self.viewer_schemas_dict["render_now"], self.viewer_prefix) + self.render() From 46aa3139f272ae3c2ef2b461da77a8f40278b11e Mon Sep 17 00:00:00 2001 From: JulienChampagnol <91873154+JulienChampagnol@users.noreply.github.com> Date: Mon, 2 Jun 2025 09:19:20 +0000 Subject: [PATCH 09/11] Apply prepare changes --- src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index 4f5eacd..f78483e 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -251,7 +251,9 @@ def toggleAxes(self, params): @exportRpc(viewer_prefix + viewer_schemas_dict["update_camera"]["rpc"]) def updateCamera(self, params): - validate_schema(params, self.viewer_schemas_dict["update_camera"], self.viewer_prefix) + validate_schema( + params, self.viewer_schemas_dict["update_camera"], self.viewer_prefix + ) camera_options = params["camera_options"] focal_point = camera_options["focal_point"] view_up = camera_options["view_up"] @@ -271,5 +273,7 @@ def updateCamera(self, params): @exportRpc(viewer_prefix + viewer_schemas_dict["render_now"]["rpc"]) def renderNow(self, params): - validate_schema(params, self.viewer_schemas_dict["render_now"], self.viewer_prefix) + validate_schema( + params, self.viewer_schemas_dict["render_now"], self.viewer_prefix + ) self.render() From 8df62e7a9ca99c4752199ca136519bffbcde6ced Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Mon, 2 Jun 2025 11:28:18 +0200 Subject: [PATCH 10/11] cleanup --- src/tests/test_viewer_protocols.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tests/test_viewer_protocols.py b/src/tests/test_viewer_protocols.py index 7744bb9..b1ff472 100644 --- a/src/tests/test_viewer_protocols.py +++ b/src/tests/test_viewer_protocols.py @@ -254,7 +254,6 @@ def test_render_now(server): server.call( VtkViewerView.viewer_prefix + VtkViewerView.viewer_schemas_dict["render_now"]["rpc"], - [{"view": -1}], ) assert server.compare_image(3, "viewer/render_now.jpeg") == True From 41536e4c03ac7d704d5f0ac8eccedd9269e3991c Mon Sep 17 00:00:00 2001 From: semantic-release Date: Mon, 2 Jun 2025 09:39:08 +0000 Subject: [PATCH 11/11] 1.8.0-rc.1 Automatically generated by python-semantic-release --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9ad3d4b..8dfcb18 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta" [project] name = "OpenGeodeWeb-Viewer" -version = "1.7.1" +version = "1.8.0-rc.1" dynamic = ["dependencies"] authors = [ { name="Geode-solutions", email="team-web@geode-solutions.com" },