From 11be4ddf097238232e569513fb17d319daccacc4 Mon Sep 17 00:00:00 2001 From: Sylvain Renault Date: Thu, 17 Feb 2022 19:34:00 +0100 Subject: [PATCH 1/8] Different wrapper scripts for trackables, anchors and admin. No links for the moment (todo). --- Editor/CreateARTrackable.cs | 108 -------- Plugins.meta | 2 +- Plugins/JsonSubTypes.dll.meta | 4 +- Plugins/Newtonsoft.Json.dll.meta | 4 +- Plugins/Org.OpenAPITools.dll | Bin 63488 -> 71168 bytes Plugins/Org.OpenAPITools.dll.meta | 4 +- Plugins/Org.OpenAPITools.xml | 261 +++++++++++++++++- Plugins/Org.OpenAPITools.xml.meta | 2 +- Plugins/RestSharp.dll.meta | 4 +- Editor.meta => Scriptables.meta | 2 +- Scriptables/WorldStorageSettings.cs | 17 ++ .../WorldStorageSettings.cs.meta | 2 +- Scripts.meta | 2 +- Scripts/RESTRequest.cs | 73 ----- Scripts/RESTfulAdminRequest.cs | 62 +++++ .../RESTfulAdminRequest.cs.meta | 2 +- Scripts/RESTfulTrackableRequest.cs | 123 +++++++++ Scripts/RESTfulTrackableRequest.cs.meta | 11 + Scripts/RESTfulWorldAnchorRequest.cs | 65 +++++ Scripts/RESTfulWorldAnchorRequest.cs.meta | 11 + de.thn.uec.isg.arf.worldstoragemanager.asmdef | 3 - etsi.isg.arf.worldstorage.asmdef | 3 + ...a => etsi.isg.arf.worldstorage.asmdef.meta | 2 +- package.json | 16 +- 24 files changed, 573 insertions(+), 210 deletions(-) delete mode 100644 Editor/CreateARTrackable.cs rename Editor.meta => Scriptables.meta (77%) create mode 100644 Scriptables/WorldStorageSettings.cs rename Scripts/RESTRequest.cs.meta => Scriptables/WorldStorageSettings.cs.meta (83%) delete mode 100644 Scripts/RESTRequest.cs create mode 100644 Scripts/RESTfulAdminRequest.cs rename Editor/CreateARTrackable.cs.meta => Scripts/RESTfulAdminRequest.cs.meta (83%) create mode 100644 Scripts/RESTfulTrackableRequest.cs create mode 100644 Scripts/RESTfulTrackableRequest.cs.meta create mode 100644 Scripts/RESTfulWorldAnchorRequest.cs create mode 100644 Scripts/RESTfulWorldAnchorRequest.cs.meta delete mode 100644 de.thn.uec.isg.arf.worldstoragemanager.asmdef create mode 100644 etsi.isg.arf.worldstorage.asmdef rename de.thn.uec.isg.arf.worldstoragemanager.asmdef.meta => etsi.isg.arf.worldstorage.asmdef.meta (76%) diff --git a/Editor/CreateARTrackable.cs b/Editor/CreateARTrackable.cs deleted file mode 100644 index 59ccab2..0000000 --- a/Editor/CreateARTrackable.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEditor; -using UnityEngine.UIElements; - -public class CreateARTrackable : EditorWindow -{ - bool groupEnabled; - - string uid = "0"; - string basePath = "http://localhost:8080"; - string type = "?"; - string unit = "?"; - Vector2Int dim; - - [MenuItem("ISG-ARF/AR Trackables and Anchors Editor")] - public static void ShowWindow() - { - EditorWindow wnd = GetWindow(); - wnd.titleContent = new GUIContent("ETSI ARF - Authoring Editor"); - } - - /*public void CreateGUI() - { - rootVisualElement.Add(new Label("Hello")); - }*/ - - void OnGUI() - { - Color ori = GUI.backgroundColor; - Color button = new Color(0.5f, 1, 0); - GUILayoutOption[] opt = new GUILayoutOption[] { null }; - - // Title - GUILayout.Label("Augmented Reality Framework", EditorStyles.boldLabel); - GUILayout.Label("BSD 3-Clause License"); - GUILayout.Label("Copyright(c) 2022, ETSI"); - - EditorGUILayout.Space(); - basePath = EditorGUILayout.TextField("Base Path", basePath); - - EditorGUILayout.Space(); - GUILayout.Label("AR Trackable:", EditorStyles.boldLabel); - GUILayout.BeginVertical("", "window"); - { - uid = EditorGUILayout.TextField("Creator UID", uid); - GUILayout.Button("Generate UID"); - - EditorGUILayout.Space(); - GUILayout.Label("Metadata:", EditorStyles.boldLabel); - type = EditorGUILayout.TextField("Trackable Type", type); - unit = EditorGUILayout.TextField("Unit System", unit); - - EditorGUILayout.Space(); - dim = EditorGUILayout.Vector2IntField("Dimension", dim); - - EditorGUILayout.Space(); - GUILayout.Button("Payload from File.."); - - EditorGUILayout.Space(); - GUILayout.Label("Optional Parameters:", EditorStyles.boldLabel); - //GUILayout.BeginVertical("Optional Parameters", "window"); - { - groupEnabled = EditorGUILayout.BeginToggleGroup("Key Values", groupEnabled); - EditorGUILayout.IntField("Number of KeyValues", 0); - EditorGUILayout.Space(); - EditorGUILayout.TextField("Key", ""); - EditorGUILayout.TextField("Value", ""); - EditorGUILayout.EndToggleGroup(); - } - //GUILayout.EndVertical(); - } - GUILayout.EndVertical(); - - GUI.backgroundColor = button; - if (GUILayout.Button("Create Trackable")) - { - RESTRequest.PostAddTrackable(basePath); - Debug.Log("PostAddTrackable"); - } - GUI.backgroundColor = ori; - - EditorGUILayout.Space(); - GUILayout.Label("AR World Anchor:", EditorStyles.boldLabel); - GUILayout.BeginVertical("", "window"); - { - uid = EditorGUILayout.TextField("Creator UID", uid); - GUILayout.Button("Generate UID"); - - EditorGUILayout.Space(); - GUILayout.Label("Metadata:", EditorStyles.boldLabel); - type = EditorGUILayout.TextField("Anchor Type", type); - unit = EditorGUILayout.TextField("Unit System", unit); - } - GUILayout.EndVertical(); - - GUI.backgroundColor = button; - if (GUILayout.Button("Create Anchor")) - { - RESTRequest.PostAddWorldAnchor(basePath); - Debug.Log("PostAddWorldAnchor"); - } - GUI.backgroundColor = ori; - } - - -} diff --git a/Plugins.meta b/Plugins.meta index 41ca702..6300d40 100644 --- a/Plugins.meta +++ b/Plugins.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: dd7d9751c977f5c46b3f59d2e8d10197 +guid: 9b41a6c85d75773499fee865a0a245e6 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Plugins/JsonSubTypes.dll.meta b/Plugins/JsonSubTypes.dll.meta index 64dc94c..3025c8d 100644 --- a/Plugins/JsonSubTypes.dll.meta +++ b/Plugins/JsonSubTypes.dll.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7661796a672c33d4da3af558bf4290f8 +guid: 5d8884e5b43d30c44a0dd7f6d04e4930 PluginImporter: externalObjects: {} serializedVersion: 2 @@ -7,7 +7,7 @@ PluginImporter: executionOrder: {} defineConstraints: [] isPreloaded: 0 - isOverridable: 1 + isOverridable: 0 isExplicitlyReferenced: 0 validateReferences: 1 platformData: diff --git a/Plugins/Newtonsoft.Json.dll.meta b/Plugins/Newtonsoft.Json.dll.meta index d77fb2a..b98603e 100644 --- a/Plugins/Newtonsoft.Json.dll.meta +++ b/Plugins/Newtonsoft.Json.dll.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a1b6adabb31d3bd41bb648467a7fef8e +guid: 8e129f0a00a01af4e9687332997ac12e PluginImporter: externalObjects: {} serializedVersion: 2 @@ -7,7 +7,7 @@ PluginImporter: executionOrder: {} defineConstraints: [] isPreloaded: 0 - isOverridable: 1 + isOverridable: 0 isExplicitlyReferenced: 0 validateReferences: 1 platformData: diff --git a/Plugins/Org.OpenAPITools.dll b/Plugins/Org.OpenAPITools.dll index c7d871049a4b55c26cec01772ae43771a72c3f71..60d56af20fe5d587dcdf173203f70d602d66cf7f 100644 GIT binary patch literal 71168 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⁢3RTQtUTUIg}*iP+ry{W(*rH=44=!z~;r-@b)$^weRz-05zN%Ec2~^G(G)R zfP26DBg8mA*lr}xZD{q3cLJEVu;7F|BjP^u zH}KQgI!J}TMS@_TX1*i2Z#|xo_5M+AWp?FgyA$_N@nmb8L@Gq4Uj19RT}lzGH!97T;;a@|50p5=rslLf{|h<`cp9(R_jz z5Sfv&PxHpGeuqMm7mUCOaTHQJ1dARVE|l#rw89%uz~ww#$|L6kjsh2h#y0}t{4c&f z083*jQq{l+dKZ#c@rs2nsc7(C6!FWNnR;I8M~^Rp`N2ca+QE2I`E3+?_lI8$gc^Ss z$-#7oYW#ajM`U!zzt8Smta@C->aRO_fyj5*PN234N#ha}bHrb0hc}_b*P=qn^7mZj zOI_v5D0n%*D1n0Sqo5|d3w;jkDa9Q_%7l5TWg$=ed0BbhN@IEP=hjMAjfD`fvCBSi z8egAa`DAJMR;7tG6| zrTrm0j48t7WcBX5=;BwPzc~4Gk$*<=m1(j+@&h2*ft*?i!pE}ZF!)$K+TdQU0ikR5 za=uCTqiy&ek}Dh;DRr#EaSF#PoS^U^g%cGXtZID|E@RS!k32GG;LYf#YBKlYUS#i_imJrI!l#UZ++gkF!>aWb6!;sKa6oc^h3 zNrE-u@jrql?ia~4r+-tZDo&W~9Qy0jR z<}A>Wqzc5_JqITo#d|y^H4gQ7!*D^rw~OS+kD)GnBf(7oq1s}H9j)`rYKNxZxgQ97 zV2P12+E({bDV@1l^;Mo5h;#ZKPrm~#gl~q%oJoI2M?Bqgd&v_o@)i2r^0%n`FI0Y> zTYjMD2IBRB=<(=PtuNY&i{wl~?tto}-J)kn>{bp$JYA$mZUchM*HGY(`~<~pv&LYV z;CIo{^&G!`**k&`her7Wkvn-6NdFWC@Sk{nV1d6I#>BU^3j)|=f)>Obv6G|y`X%|C z+AL2P!5z|wg={`^$xmhKdwkps@5Oh^_rP{z)pq*T>5$j;A~`~g3s+HAK~{a9cp`TL zFA7e28ddbck@-$^*d=zz0PxKHC@LL78zZM^yrScNT?*@SU6fj1_#SAL>}V%!7yCIo z3tQaFmO_)TND00@ejl)031;b_BFHX?=mKx#0ThzmJ4phdV2(m%kp}@IzXXW>9y)dJ z%%>)y=&KoM7}?Ap{uLNZ(`Izxtw5!~R}p)d^x$iM;t0?Mnw@qyWYrg6eDQj*`Hnm7 z5(G23Fd7}PM<|P3_~Y7gfB4QI|;vruKHY0bSsDVG!XtA1IMQ+g>{#p zF7ACX)Qj6;LHwT+tPkp&)Y-LD#gki#jZHOvQs4(z#r%4$!QJ@KM#%_d4bh`n-(e>6O=O{Gm&ksI~-}WeokrhQ`n&R`78#` zD9Bb^bSlh;-+LH3tT_BT5UvfBl_pE&Wyw-_JC(l(&_hMIgWx6p5(rv)ej&7|LfaF0 z8C0jE%mK%u4+pakRnjPO(dm#3#eNT&Y^lwW03IMlUIB(4`Ahv5w@3Z}WMmF<6^&W{ zdLZ&g5OQBHWFAsdAeD%+U|J{d6iP#*6arOSBlu(z+q7NB1^D%iydXRSn@ntw`6~~h zsy$y9K}+0>X2T?}gNB)2YPjVm#t@;QP-%AU1Tmz*30ft*1N0m_5RB|ZA=jU!HBCMZ zWU1=ovn62a?D4ApUz)TD^>7vS37c~xleM4GN^~v!2AlIIa}S)T1nH_*-pR&yYi#x0 zA?6On@h^m!90FZ-ya{t-#~T4X+-dq_Z&EFPMTWok0SbS!q@Xw_hAoyqH_Mw~g)BS4 z8lsQPLcZ|Ts92ZpiB4d@-hu*nCF4fNGDdve3+OohKzJBDHdsF(YmXm3;g7uyQLYH# z;h>wdOsO3x{w&iiU%E$;ze1EL#aM(sJrI5Ks6BLntIxK(JJAf*aW-w7DtZ4hMaMb@ zL7;U0CJT|&{mWG4k9G5j)YRDFceG)tIokGy|E6WUF#bby1skT$J~Z1G-fVcf_sB*c zP1}D*)l}O=Qf)&K=3$qcPb9@ZO!@D+`9x~ImAdEjgx>=}(3$u3>I;9sD>ih=@gwgc zuHofo{8(>o?%U*W(n~|@5Ody<+1O@%s1@xVipuNxPSOel!XJ_GD))$H?e<8;AoD9v zNzdY(42I4|=rmglf3y(};p`lA$y8T_3}uUOMV>40bVI4F&+C}XQolhH1b-U%r6Io( z>5nTwo6bIa^q?f<*RRcK3LS>Sso7`_Nrh`!_#XhK7`qNLl3hE7gTeoZ6qoGBX;~H> zS#Pm6`Cbfe?(d;>*3AUaBWk1==Rp@qNN>FKATkjTJHRuxs}T>zxB>m;9}fNyZan`( zGZ<8;YWpZUjv;x zUe6Cg6-r2$7m)WVtkJhJ7McC5?CV<@E8l)rroUsuVapn+zQ*{wEkBp)KP1clkm@o< zgvdw#`$?9X|5IfXPw1w=6|s)R=|`#g$g%D4%NVfnF6BA--Tcm)*VLiYIdq%*8z;AV zj5j7#;>WXwI1Mb9B^fNEQ3m!t(R8?dT>T3@c zy2&1M9+1vu>@U_Ww_YNtb`2kyBc1Ds^x`9nr1?a^H}{0I*e~6yW1~bj^At+t3-oQ2 z60_|H-N#dCDG@%88=e7y=t4NXKP(oV-0OGlbCUVj^l65>O(NQ-9N2<jdObB7u;?Yzi zwdE)(Z(|od9B+e|B;>3au0AnKrTn6LFMUcUwAujLV4c+1=m!`Z6JJVCRZ5R>Q*;hH zt|iPHWw11kBsEd?*1;UQ4;?qTbx^(r-}Kg0gQwJZ1BbuVX5xkWhayy(p=+}$q6-xd z2Z8pHUE;`Q^(Py>1YErf4Edwar_0(C4nln~IS3Ne50eBe!_4V5C)(ie(H)*0|iZOHdJG2$U zaZw0AY~&69MFrC5$MkPI4r`~|B!c<16c}YT)@F8%ALOEa6Mto492z8VM|6*Z=8}1^y8umxv2!yg zNT%-B!9S9HPcN0;(opRx(_2r3eQu~W*eKT!49AQnA8po6w8QMVCqk%O==!0CR9EC? zIk%*xxFt2Wr5X;}*Q3xEe9+CIqj9Rrrbm@w&T{-i4~0{t&4&lOq2nRJrVxJE4;2^@ zwVmOn{NI*^&^s4;!*~jfUi8$EV{ubdRPM_61t9@e4kr+M(K_(%4bhIU$_l zGeJoZpnL?&vsiW}AnB9ypx+KdwPRfR#W1vcH0jzDZaei??Cjc*U82qKO*1q4v~SN> z`DtiDIh8RyUk{y=jCu1c14$M-Q!=L-|3(yO-*uD;4iX`wb{&N40@NA0CpjiF98ZG7 zF(dg8Vh1~Hf3Mg%GuItE*tkL<9Xnhn?Koy29XmucH)cc7#1<@=<`dD_>HxnH^;5C+ z9-2xwCzcRX-UI<+X&%dS zS?)KM!09)Zs5CQ{NZETV%?5X0v6PZY$CCEl#1aSTj-|yIKVr!llNpXD!Qq&ZBy+;C zkh9~+0BOG_lJff{%16Yf`9%7xV{gIcds)Y@c|xeA7B+7fTP8Qb7ydUU5|2Tg-LzTi z9vP4hSKL5h??e&j2FQr4%6EzQxHoXC%?pIFS7s&N>Tp@r?awz0T$O@cxG9q578z3L z63GhZs)(KE4`*p9Wt-#FHVfRgA<~PFC`;RpNQ!^F)`z#I`9xCu6O<26PV}E%B z_teiO=;^c+Hh}%8`7AAv)2~3k>0H;q{mtja%;(5^?tK0Z=Ia#BS2~{uN<)*jgKQ?r z6X8^a@t#JgzRHl0*Gbd7u1q{w3r)USt8m6V5yDgzBB;WPR#B!_Y1b;8J`YbC{0#@# zVO}Afnp49u)631+WIU)u*EpM=2w}r8gH6WjlEH{@J2)8$094Mchj$n%&g*j{5(MsK9{MLzfj*#}^wQis%qE{@SX>NEVD)8Y*=5Exi zbz@bUPd29yK=%2;c?iG?ipyH{AuD*D6mnfq=k&D<-HviH5h(ctcD zuaJ^CHMQ^7zMH)Q2kG7`EW`M*S8&E;hT}k8{p3CEl_lvl%5_g$44oUxktO;r z8?Jj=yrj0jn{TxHpX|SJ*kUt_y7Tqk?`hdvPlS+}hgW2t)DR5Ej7BpL?rGU`PlPbF z4JX2Fc$(G!HeAQi>z-Ddbj4n(?NsbhYesaDkQrUH4`XY2I<}U;p%`1o;@UU1NHww5 z0%eS?<3LFepnL+$$FtmTY@N(1{lpfPX2upNdylQf;O;B7QZnh-(!QJ6;vn6z)na1H z8Iu`~C&A&EkxW~3&kH` zFY1c6cdm$0B6ueLT?_1)MjVT+;YRasfQ&fe*f}%6%Lo3~A>d8xh+rP{&&E1%+|X;Y zv+{ucYvg!7v}Wr)_%z^yo(VcD=oFug%TQdgj}(krFcvN}au_}ce7#ZzEd4h@Dx5Ob zEBu9=QTgRn>qW~iZz_BrFeG($f$f(j`$a2Hy6mG-{wB(PIn-0_@yjC5G{8+-{LNeBG;kV>h`CI&ja=F550sV5be+SNx@6)ms_ypXV0O^wg)cjO{8h(+( z@{@phazyUYcAgv$=$FUyUc~zPdEsk?e))CreZ_v+sc?_N!6l?jR5)MZX$sF%_{)+X zmiXlbE&om7u+l)OUk)jywi6XT2v{jo%h>ung-aElqwr^CmzEXElV$Afhe|oK{6(u$ zHkF@W?w8HwJ3OUwclk{yKLfg7JQW|HJh6i1#tOD_mcoY=Hdc~*d?o2e4}PsMBy++R z#&~Y{MeAU>EG&2^|45kDdk)Yqe*=BI(*067nmTVC{R!wlSNMcdo>%xMh5s7;m(hO7 zsgWAU*RVWF;fxyg`I4G5K)<|Zho@4mN4ZjNQTU+39m@TrhWbObghdLgYH8tVwQPMw z?ZVoStgU6AA5hAlYB_hiYo(@CX4Y|B3+gyu$Duq#uBuyGH$-k%xDBvWo>ls*DC6l| zJ#|(pY*P6BdiMFcdiq#y!~6AqIk+V(D#aw zz<}pV8!#VAc`CVDd3lg0@9WCT!mfsJs!wRCblYz0lAFJd_hi7!2 zCRLUP4+5)@YTm(E4K@T18Qzg@8LqrT1{1qLsulAg|Ggs@%P7Tm4JEck!ivqSB6c&L z*HY(wiv3dR6ssOa-ec0B*jtMIUdAZ)^l_A-*+JMwRtsMs$K zAeLuMQfxS4?;R<(4pHo+(Zm|8Db~4YeH5m_Cx=^yDQ|H-u|{Bg5#Z;FO|u%6cglgM zALv7Vp5ek~Tllx8AZd6)TV(Vns^Fa@1KkU5+vvyhOHGpp_EG=XC)3Wh_0+~`y zcxxr$KNUVVh~>h;gqJCN4e+bghVz(V)c>Hug~M6CPT>XBEWej1~f<)N4D z0=Y4Ck4%&YL$v3v5G6lWXlD;cxlrNgY_>AZlyfLEJBQpBg$ae<2Q+hG$vwHRfcrx3 zaF5^rMecTcNlzf}6||eLuoTdeBl6hKQ}U>1`+&=EtM!ioR{{>mzXq^cVPpOllsofp z0K6psX24tW?*#l!{=MF$<}(T|^DgP>QMggzC4fopE!+`Ns;k4jc^19|lsxM*~NpTsVmGV+XOk zP|MLlHLNv=R=s{u1J3p`TO1T}w`fV*;9khp<xZyc4-H|jUK+xl{8QyihO#_yDC;g6%3gI2Wv?z6+P7E6Vz*{vTm^Rk?w{Ry%m4qf z9^2hrz;UskUuMHh$^Rdgd?}an+q+$B_@8jzTQU4EfSGfBV_tvq9}nl~f+INN!$)w& zr)v2Gg|QKw@ry=q#%~zGS$=#3<=@h>ubSnN)tvFE)tvF;s{79PqXUxdnz=3-`TPJ& zYDc~bnAyX}^D`wsA4&ZMqu96FQS93+EiYHNb`<+|`6%}7_EGHHZ$?r6T`lJwz;eR@ z?AxpZ*tcZ|^zEDR#_t!v0)><>QaGgWDp2;%Grz3vf8R^D;}_AdsrV`OdIxFG4=H>V zl%_)3YF;5Nv!syLYf;!)NQe$=C?N6qna^Et{2K&1?iuxOTkeDQ5iaZndu|%@y$wlEQquRKeX^jePuuE>OB7T1PZ#-M@3kbhYVXe3aZNxs! z@TLO0NwK#rjv-678=h=Oy)5~?;bn2`A$i}yIQEcy>R=pgwj7S#p2*u-9BsDDRqTAp z^8Q$Iq|?F5ymtWWF_IQ7ktc6C7%hSOOuZ?7+u~^RWEXaV&}nhB1LQF51c}i~`LfZ$ zXeI1QYYmT<$d}>+4Ms~8$bu?jo8-dM`+bG-n1j6xtXS%F44d%%i2Hq|vRV7GNq$>a z7bute9BgQLU7$j4)1E;~WnG|B9&@nY0UIc@wJ)3G?m=~dL9)!jJ^?mZa(Lr_*1HGS z1%^nqgZ&a1Hre{O&3AY?a{8zm77ktXZ=3H%-xAy{uhn@lJ~%->NMWtGlR93jk~bCD zR>h1DPLy4Sr#?7QJ}^A>!Gk3*mQB2!MISs^@*RvmI7yCkF#6ymX;sYl;AA=9!RUjN z{~r^v?>v;~V+nko|}8;n*uTrPGn&PtQ)a4^owG&!CJy6{h0aJmd? zG#D*7Q_glU&e#$1s)KRHX3G^guVOt~caB_wcaezEx<|<_2jgtclLfO4kFz;X9y`)t zwER3d9?zp$kCs1LR;sOy&(D`v9gIGIjLcAb8lPVz_vzR-$rVHE0>{ep4t6iFC9;6W zR`6YKRbAjXS?OS5V8_eVI`&Nx1$Khm?O>MyJ5ladOKg(uz)q599BenRljVv=qjT=C zy1*%Nr-NMq>}&F|T4Ixo9$pt%DmgQZy07X3VQ zWL=;|#yHr8z*@<`-!|XxeC<}7L4dvC>$X;=u+M$xS*NG40{{1|h-_7R8sCk{g!yC> zYn3j!I)zOI=3PLZ@!f72quBZCyWKLu@YHwDl%pJszI&!Db};(xS#p(w(Ra_1n-nv? zd$#=A!RWhZ%d1Ax;)u?X8ONB`IiiGIf+yST3rEx=vrjM>N3=n1(-9e;xIn6O44Z^L z@h!Q)!I%d(>MJj_=jsFM0vAiUwy;Sy0sD^Z))qF&i@+|C;$zvuCiyoot&n& zY3p*?b+YP|7yX}FKawZEX0X@%)%H!&fyY&7PyXg#V&5ej94r_($^M!A-oeTPE%rT9 z+-xML23FcXmnkgXN{4t6^vAC?KHvc1dYK46c?O^Tf_F9$BRAC(y^$lD|z z1b%35lMcns4^{;4v7eB09qfSM{lGRl*g?UE>?h?q#nuOB1s}1WlG_YVefQULZwh4D5#)l6PkC z9?iPPPPgz}2Jf{D>~C(&_es_g)a%e*Umn~Z8t-{YHaOUh&?I2DwzK1#%7L(@diMRmCOH_#{x_NLU}r(+-{g1)qb2?> z5eGXDyuZuY4o17|lJ7X!cfs2wS19(jMJv54yBr>8^F8r&n!fx9lJ7~5gK<{gmud&Q z1HAWTvx9LqKal$z>=E!jkiR+@z2HO97tb-i7ctror7mJxpuc=1GaT$~@IJy5P4dnc z=E#4@1_%2P*8Ly3O|i?x$~hOtmBMM)N2*5wKM}e+hD<6IY0Gyt?xM4 zzjJ;L>o^Ddd0qh6GR4gJimeXA!}xN&#n#Du?GrkGoj2Ay*oryWZ}TPsTkBwd0B?x(JqLRS zydl=r4)$r@6z@>$XAV{|pb6N64tB_ZBfM4C?;LFYfVse4b+Fa}3%$dve>m6~15O0C z+riciXz>oWiq@E(T{hr!V1pd&wgFw<5!QGI+d5!9uqlceTUT3mp2K?E)YjG3GX@jd zy4u>M7;XI>??~&dwJNDTG0Lj`Ix%DGQPy0=&WG;~^BrKdIM}~)Mgi+k%-Az*oo#rq zXPqx>ZFMB+yEWF!4o2Utv34kC`dMo&>(SP=pS9LngK0l&t*aGdKgav(tnhl3)PB}m zJ>MW^`dM$CTy3yL6|H!3FngrIPOkVQ&|rPwVB{TWy&6vQ4zzx+H$FQp^2S&<)uwr4 ztOa#xontNUfoa}Y>*Mih-Z<;632ELq>(YbLyzy4`3RoQS4>OSn`m92yJk~wqBUtons>0(b40q{!Pb*=(!5F5-Fp9E>P@mv z)?Kq1`($hO(dl}VtqqIP^$xLm7N>cKSdGV~d52n)PDt|(wHDx2JI)HnFvYr0_h+WP zDb|^0r=z)Us@3D{dsfu9mQJ;v*Y%d!rWL=Y@_WUMha6^kHA8PxpE%5_b}(kJ!>!vi zpY616IPj|S!>t_6Sv#%5F_#w~ZdE(jqKd}g;nreDD2V;BFtWO<`?M<`7CjPX&Y1ZLRG_t*E)+`5Od(*7B zjwIWgX0<40#y8F4)81bd7?_XOb{;S23(0+1={r>NWk)_;_dQT-=;>S6P$+q6A!V)y z+enPkt?GMT;l za+%&e{BKx$|L4U>26e`Z3iI5;SGTQKWl}Y8M#E;H5Ry1 z%bOK4qHXz!i*lEi?^XDi!e;=@AKo7+qI?CQCBqdqD4d{hDjPACGP`APnSJ195P;^B%agDp^$54%D|c6;<=#8m|1Z5GgFdvlU&w1S!)F~ zGb}^dE1iHo`8J?mt_BR?i5;za1Ik%W_DE`QYwN$nVGKmNU3JikQz2l3w^g}E{Y&sXs5R4SwhPlSqaEyi=3VqDAc{#+TZ z74k0r1+I7T3n}lS*1LG)>0KFu&rp1-@EL~BaC}DKQ;p9^d`97O06w+yTYQ?VT6qcA znYdQqX~b{wzEu;hFX1{9*9xm1w0h9$L8}L?9<&C~8bE6RtpT(K(8kJbxVL>rxUc*W zaEpAV(6U(0Qdpp{Lg6rlqZN(?yxTWf%S{UBC_D!6e)|N#R%uq4rTW)MQ`vLAEWIZ` zLnYT(E6e8i*K4^BGI#nX2v5v5SuN$$Ws}uW{*b-JN|YZKn4%hHC}jCg|6Hg1jqen>_bhzbd~V@Kbrc{O-U6P(HDr(w@AcJMUNYj^bo_x1u)KDxYG% z)*->lqfj1Nxy$a5(UonWOsxFS{!nXm2=72XLwO_UvC3xwPFu&45^V3+Dyt9mx5 zp0%oHgX-C!dN!zr4O(}D*4?0WH)`K5RSj3G2Fqqou2v0}&7N5H#L8B&Z1%yjW0g0A zESs%cc2DJ$R=xwXN&5t?RX|>$R=xwXH09Y3Q(8jR$F%ilROd6Q^BL9ojOu(wbv~myx2ybimE5k9+f{PAN^V!l?JD`Iw)m>HxJz67 zSX=%Zui!wrbT@r+Tgw z`ty}CVsyOdN@*C)@}Yq1<*3o;6;*59HNrE>HNw-#HL_^*V>sCO!RU93CRp^+DHgqS zhK_xTMK7J97MP(Hn4uP!p%$2-7MP(Hm}9fuW9(myj@wtllHV*o!LH6-VmB*X0}Eh8 z_U7>A#TVMQhaa-n*yC#M0i0TMbur;}pmSWCAb(5oPi1b+%Iurv_?jcU$JlK(=X$PG z8_u;hho324tk$^FzP{#9#Xq(0tZ5A1Y(G=;cJcl8%Qd@-AGSNtlP%U?YyMHZ#rmM; zv*M@h-8Ekn&w&Pi$t!?!y*stHTddmJ)%MLYv39zgV4qo=SMr&CLG8ej0^#}DXZ8=Am zB~709>K-jQ8MgWW@ZWVgo>rV+=9IDzt$4#TP(Q46i{#di2Bon62ye5;_zW%6ZjGsr z!#>P!?VefnQ%kp4N7hd-<){~z79&5j1-4joYtAaY-}-iaqO=1P=AujLuPU7(-zfhO zZvnCu!Y$He@vXrwi*F5fS$u1-%i@!TE{o3)x-32|SmU|1es}2_&rj<;Wm~M5>xY%y zEU(v3m$jOgwpi5-#*^=m4LS=ObrvqQ*cNkaq^uo~9yPO}qI`|;RQzh|n1%z&ISXUT zH+fb-!zRz#hQmPF*f6vF82j>uBb7U^{A%m224q*y%MB+gWm);no%H0Y#@KtycWSM76n+S}G5DF5 z>3dRXc_-us0C|$J6TbIA0u16i8c}Gt z%ySmXC0=T%01QgKmd7eQM&YqaKS9fcwrKe}m48^vk7{`bv@P-PRLYwwDV|&9alhqZyB-hq57Y7pg-r^l zD_rK84$oQUxyt%(uvsZB3VW2^1Nzxn>y>h@!YvA~Q~0pLM-}dXWJhR+*4n9*Hx-JP z`o(*dwI^hGwLc206b@53LSduACWX@#E>qZ|ut(u~h36{VtZ<9M>lAKP_^`r974A^D zQ{kHm#m7Ea3Ox$5e7^|(xx7lt!xWBCI2!c)ibgFrDV(lw4(JD0F4JtHx@H(a349d)b4{P~Rg-?O9df-kizk~9n11&%MmgWCN@K*ze`RPT& zlrkEW-2~w%_v)g zd$hb+;TBMe2XEE#!zfn|-l654C{Mu4ZK^rv>EMjPRazc~@}j|wT5dwQb?`DRH>2D& zxJS$DQQk0kvzE7@eEHz5T7DSin+EUD@=lZ=7%aJ}UtyKPVG5gbY5(ZPDeK0 zs^uLDw+<#nhES$TVWYxjraV;ZD(q3XS>e{9TB}NHDQr}@Okt10%?h_F+@Vm0sl38Q zh07H7DBNty!zr^_;nv~W$_TAxVD-0Q|78j{E8L;5YNXN?ZdSNMVbv(5E8MJbhr+4@ zl&)~ILJ5;nrLa-qGKD<~H!IwsP)1X-QQ_Pyv^;D69RA}}-XVBqxNyTKE(9?yC+>zL3zp`D@G z*{kud6AaJ!UXCX>lKY+9ALLf&U7Ghy-t+6p@19$SIToL3o8d#)>dw)ys+}(%I{TPQF%?} z4V6Ese6R97iUoUfCI7j4daBV z2B%API9WPKYVrPOolM4w&!ITsnTiA1zv*|WKb7P5yL_vSS7`iq0$vjQ1K>8I*|eoZVH4&Q-}zEF1M_NQ$C?XD7vAu;u}dZF##~!?Lz3_UXtL#-3NM5XOTGnY z<6D|#DE|=9mLK7i(UQ%8IBABbSaO5H8*$ob%a0Y_gcC;#-(nmJ%B?tcwB2y)IG`m@V%)Yoq3|jER;nex2DIfFIRfQp z6+S0(K>3Zr=jABSUr_ivy!~tAd~+TsFUowBw<~-@jsfLOg@3_sd)e}~!VmCU<`zyo zj|Jr;L;!)_cnnCv}^jj^U2LNrn zbJT`%7N9L5YX!>LfVSjV?I`CeEU``prC4FPwF>kKKwFN$ySBC*X`KN$---b)w7LP0 zv(5rM(OLtz)QSTx$NQ}X@(0TUU-$^HSVq|%%>QA471C%g0-Rqg*9lLwT4iLwT4i zM|rrkqC8wqMR|m*L>b>MM!8x#P_C9vlt<#XpBDi}Q67cw?k@s76XgTsY?Kd>b5O38 zZ{ggyRxYqd+O@LLZbA8C`v8*R-!tdq@< ztdlFCp-!%cWWC%DdcE8N$$GgBlJ#;Exb<=;B=a&HfxNx1*cF6Gmp^dG+Ur~)}@64nU|&YCG#iCHF% z{+Ir1@w1$%?*)Atm`O9=Mt9ThEID1@|8dh0Q4Q3`Q<)NYV<|r6@W%?YP>Ih#dX!shmp=t#a&*?$Woy=jGA(qO+#0%4UJ6|&)3Z;KpJgM~@cK(x&e!GQoD1dF zoXccS&Xtmzd!4lB{!EJUekB*@Jt|xCo|UNsUXk+rKg;#`@5tNv|B%*#ljORB)8&(b znB*0HT~05YY84dEu~rvfW34H9+WJ=MbJpFZhug1I9&W#e&(2Ei+?08d*6xnB!(@JR zMZ^5nZJkXE<}8jxI${m29UU^KX?1&3OG{fU7K!$inBLLe*4ZU5R248!K}bwl%l1h3S#bQ`=W`N1IhB6H8T|)!fn*iLQ|&IwH%PJ2HhFbIfS&qOLRB zqFrrKnc3MAX~oZz%;`Ke5?!Ub@p~oREnVHww!XuMb=x`w8k%RR^vurgRWdUgg*j7W zPnQ<2S>2`*$9A@NEm{-nYFnjfO7u$`UlnVC{o0p{sVVc9pVrpWC8?pxVws0&YHw+d zbTti3Sz|l8#c1F6?SkSYixud<+R7&=dW?9kJwKQ`AVtpt_v~^8ujC?WqNaGOIt^W4t8Lk{O^ko*|3LNC{3`GpChC%OGS(&ux!&VJ_S< zu}myO+}&McOE<+WYPh{R-Y>ClEq8A?1XHay^~>wU`c{hdt&uU47>X-zayDG3yKXO* zX=(4`hR-Ci2>yc*KBp}TSL=ck#3a_2eZbW{26z)2!y#vK)^C~!0R2D?rRyRl6l2xWRcXVJ)KqTtb zbbMy4rFnIm`DrO}!eY*R0imsVm85hnj!?B5cdB4nVW-S8Bh1wB-_)=XbdF7sCTXL2 z$dVv3>P!eBfVz+pwW6EO<#lzJFsn_Rp!vN`oTRI=T+Nzd)7Esg#pKv%ha<7587l;4 zfSv7x6=V(TY3uS+dk?Dx(GU;4=l&FO%=~{i7p5mzJ%V5<$ z)U+l^wyjODQL|+-$zSo+?U)7~1^g04IP9tIXDcCNIfDjWU(IGg`I&i`+7`F1T0JY$ zfjpgB2Dv6jy1TT(v2e`J;DsV=0NPcFuD7R{eDam?7IGny99Ts&vq%%!vDFPzu3IAb%mh%4sO75!|_ z9Lw}s?K#q9@}WB<%S)ThG&omh*h^b8ZN3znF1L9bT69rmC0Fi(WgKkjazw691lvj( z$4O3F1>7T`+_2neT*_Y!QbRXuN&NH#C!o3MMQ%GUh z(~6dv@0Vj+BGcMdw0AmUGdo+IlKKTg*$FPka7mQhrAfymFNG|QI7`6dh;EU&9R-R@(YDamg4;iM}` zQbx|?lDc%M%$`4Y{@j^IFOsH(N6lFbIDP)YnVLUR`Bn=w(mdP^Hm@*iLb8nQVQWA0 z>#+NDMRg_XQfF#sr%N8KpGl!i`kqKb$%P)#-QH@F9ex**mHGRStfI~yi4rB*g=RF` z&s~*?*5ppLKYygjPa+*ltyUk zoGor%!9B04>rI=IVY@!YpOUs*KfF0J`V!N2>&r{E)sKz7MB1@UUx}n``f^e&r7Y4{ zrk5%D2&8nVpQQ~UbdmHh(|6?kj4I7cPH?i%X-=w(+_z>-*sM7-j-5WIY3@8k+RTMA zXI|40GoA9hrUf#8@oZ4%&6DZ#WX3!k6whdyC$s0tQS)TZ(bH$ktoid7%Lz>jXUM!c zb7z|Pm6kqtoT)XbCF2a_bR_n!q*JF$xVviMvS1>mJ9YLTkk9D6(I%^T_l=!5_vP56 zN7v|fGlsA7#=53OTGz-*y^D0HJSIsNle>1vLWe_z*3`~8))f`A44Qp;Wcg_lO>Vlo zxanTSjkT*vOqz8EjrU~Q+-Vl4G0rZ3VRvU2D(SHVI)Iy&=$Y*}(~=o$&{TU%Qx|@3 zc6m1rLr#rGRyijUT@k0y-nqKF%ehO?vYeXSbGM|n($137#)BPAZmXOm=}??)a(V}A zEEE%LKAHtv3%JRgR_xi@Pi@EjOshFib2bi!?MOMxF=)>IqdU35Tb zUackCuIGh)ndo-;l$1LH;`t5g1qy~L9CSUb+%(p8eKZZQMDyI?attyE)}r*w)c}wmIBOx93D1#lTwL-qGIWvS9DiW|^XASBEWMx^%2e zUsOHiu*pl8PH%2m*@pArNavbWk?xo|2}qt?j>BCtd(alu11&gqYr65Yw(#iMSna*KGzj{kS#9fom+n6RvbWlAYyQ6nCL5Y9(E{fii4x#%vC#Q@1h6w3WV5 zk2RQFWDb*gATYnPV@<}PkET*R3z>qZocVJf_Rz8i<40&_b$7Pl{A9mOJXyX(*`)o` z(X1BIOv3%k5^gwo=tAE*GSZI2`_|Uvh>ykrEKg)zx7Kr zC3T1?j>j?6%x>;%#VHOxPRl<*>0!m&Qmj zw<|pAH9kG9yPdc5IKiB97;Ze48x+WdrAxb3w#Q_O=E5b-QQThWbB@CfTDr6a!5KTf z>8$2w}Hv%&GjZK^_ZxF1^0ld>^1ha;_%!n2@NtLd;fz-6stJ7dkKw#`Qt zPm)o?xuIFq*5&fh6gg?U+3l@ZzS4G6W4TA4X6ZJIKG2LCPWpr%dAkhlc3Wd~`0lCu z=Wb(RLUg*H07z*XJ7zysjr(#{@Px7B(=)>(0M5!-q>|)pk!ChI$~h>_IVQbrQr5&Y z%dGmYY6quzTzFlaNiGgDp^JmiO?ATAm1#T8X*wfK*K2bq8B_l9z4DdalF2q*<-Pjq zE>jxmAez7S;xPW zJt?{FNo4iXIh}Zpf{jMknoON3w?*4~Yb)iGnC^YbAg%60$Vr&J9;Wpk9HJO!jTsLL z`-ouXdx@lmgDC9Hb5~Cd31PN>aq;&n?J#8;>VD`?Iy308{Q$ z*M2UD6U>5`(XW)TCb+`R?Wz+n2X2R)0E2&7hf-FZFmXReh#1;Gg$M7aLbF%R7^d6& z=^?wKFqzIKxK_Q)bT+}Y;Ppyp6WmLk>%4<0V1g@WW~MXzYG69iWu&u%T$yu$E1ezW zPMewOO4HFnt~u>z}o+k5_Bdsh=1 z$B~_@duBMpzZRz{t|hxEw{0nsEQ+LTik4(iTAHLS#u|yTNLh-drAFjPns_ur4N3jj zUStOGCN|UN#QistEPP9f_^lKex8yw$^f@4jsi&cbCgMXnSj2eAkvm%Td zonDI~j2iu2Yrj5fXj`))j2b%E+^>%sI%g`vsHt! zKt*`QP()KSo-q`#SrMLTF{96b&FDwh3CC#k?DxoUi1X!_@@2e#X#o|9u

;ff0$O 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 CeW*kL diff --git a/Plugins/Org.OpenAPITools.dll.meta b/Plugins/Org.OpenAPITools.dll.meta index fe8fbf0..5fdc847 100644 --- a/Plugins/Org.OpenAPITools.dll.meta +++ b/Plugins/Org.OpenAPITools.dll.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 3f13c3a93a457ec449aade03f44b9ebe +guid: 6a54ead1df0e6334aa8d4520cae26cab PluginImporter: externalObjects: {} serializedVersion: 2 @@ -7,7 +7,7 @@ PluginImporter: executionOrder: {} defineConstraints: [] isPreloaded: 0 - isOverridable: 1 + isOverridable: 0 isExplicitlyReferenced: 0 validateReferences: 1 platformData: diff --git a/Plugins/Org.OpenAPITools.xml b/Plugins/Org.OpenAPITools.xml index 83cd914..6ee339d 100644 --- a/Plugins/Org.OpenAPITools.xml +++ b/Plugins/Org.OpenAPITools.xml @@ -616,6 +616,169 @@ Provides a factory method hook for the creation of exceptions. + +

+ Represents a collection of functions to interact with the API endpoints + + + + + Create a world anchor + + + + + Thrown when fails to make API call + A Universally Unique IDentifier identifying the creator of the world anchor + Unit of length + List of additional parameters to be stored with the world anchor. (optional) + string + + + + Create a world anchor + + + + + Thrown when fails to make API call + A Universally Unique IDentifier identifying the creator of the world anchor + Unit of length + List of additional parameters to be stored with the world anchor. (optional) + ApiResponse of string + + + + Create a world anchor + + + + + Thrown when fails to make API call + A Universally Unique IDentifier identifying the creator of the world anchor + Unit of length + List of additional parameters to be stored with the world anchor. (optional) + Cancellation Token to cancel request (optional) + Task of string + + + + Create a world anchor + + + + + Thrown when fails to make API call + A Universally Unique IDentifier identifying the creator of the world anchor + Unit of length + List of additional parameters to be stored with the world anchor. (optional) + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + + + + Represents a collection of functions to interact with the API endpoints + + + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + + + + + + Initializes a new instance of the class + using Configuration object + + An instance of Configuration + + + + + Gets the base path of the API client. + + The base path + + + + Sets the base path of the API client. + + The base path + + + + Gets the default header. + + Dictionary of HTTP header + + + + Add default header. + + Header field name. + Header field value. + + + + + Create a world anchor + + Thrown when fails to make API call + A Universally Unique IDentifier identifying the creator of the world anchor + Unit of length + List of additional parameters to be stored with the world anchor. (optional) + string + + + + Create a world anchor + + Thrown when fails to make API call + A Universally Unique IDentifier identifying the creator of the world anchor + Unit of length + List of additional parameters to be stored with the world anchor. (optional) + ApiResponse of string + + + + Create a world anchor + + Thrown when fails to make API call + A Universally Unique IDentifier identifying the creator of the world anchor + Unit of length + List of additional parameters to be stored with the world anchor. (optional) + Cancellation Token to cancel request (optional) + Task of string + + + + Create a world anchor + + Thrown when fails to make API call + A Universally Unique IDentifier identifying the creator of the world anchor + Unit of length + List of additional parameters to be stored with the world anchor. (optional) + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + + + + Gets or sets the configuration object + + An instance of the Configuration + + + + Provides a factory method hook for the creation of exceptions. + + API client is mainly responsible for making the HTTP call to the API backend. @@ -1343,10 +1506,11 @@ Initializes a new instance of the class. - + Initializes a new instance of the class. + A Universally Unique IDentifier identifying the trackable (required). A Universally Unique IDentifier identifying the creator of the trackable (required). Extensible list of trackable types possibly handled by complient World Storage implementation (required). trackableEncodingInformation (required). @@ -1407,6 +1571,12 @@ Unit of length + + + A Universally Unique IDentifier identifying the trackable + + A Universally Unique IDentifier identifying the trackable + A Universally Unique IDentifier identifying the creator of the trackable @@ -1529,5 +1699,94 @@ Enum MILE for value: MILE + + + TrackableEncodingInformationStructure + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Identifier of the target framework (required). + The version of the format (required). + + + + Returns the string presentation of the object + + String presentation of the object + + + + Returns the JSON string presentation of the object + + JSON string presentation of the object + + + + Returns true if objects are equal + + Object to be compared + Boolean + + + + Returns true if TrackableEncodingInformationStructure instances are equal + + Instance of TrackableEncodingInformationStructure to be compared + Boolean + + + + Gets the hash code + + Hash code + + + + To validate all properties of the instance + + Validation context + Validation Result + + + + Identifier of the target framework + + Identifier of the target framework + + + + The version of the format + + The version of the format + + + + Identifier of the target framework + + Identifier of the target framework + + + + Enum HOLOLENS for value: HOLOLENS + + + + + Enum ARKIT for value: ARKIT + + + + + Enum ARCORE for value: ARCORE + + diff --git a/Plugins/Org.OpenAPITools.xml.meta b/Plugins/Org.OpenAPITools.xml.meta index 4566743..257c25d 100644 --- a/Plugins/Org.OpenAPITools.xml.meta +++ b/Plugins/Org.OpenAPITools.xml.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a6fd1a744414f5345bb987d7d94b52cf +guid: b91ec31882c185d4e9da9441ebe609e2 TextScriptImporter: externalObjects: {} userData: diff --git a/Plugins/RestSharp.dll.meta b/Plugins/RestSharp.dll.meta index 3840a62..ad5dfc8 100644 --- a/Plugins/RestSharp.dll.meta +++ b/Plugins/RestSharp.dll.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0f636a05597f4ac46aea146c3646740f +guid: 434491b56b23fa2449fb310cafa1ddef PluginImporter: externalObjects: {} serializedVersion: 2 @@ -7,7 +7,7 @@ PluginImporter: executionOrder: {} defineConstraints: [] isPreloaded: 0 - isOverridable: 1 + isOverridable: 0 isExplicitlyReferenced: 0 validateReferences: 1 platformData: diff --git a/Editor.meta b/Scriptables.meta similarity index 77% rename from Editor.meta rename to Scriptables.meta index 6994f74..ea6eb7d 100644 --- a/Editor.meta +++ b/Scriptables.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5fec767e3d1954e4e8af5dc2b3d4dd5d +guid: 9f7902ce03cc2b2458df8c561ff1f55e folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Scriptables/WorldStorageSettings.cs b/Scriptables/WorldStorageSettings.cs new file mode 100644 index 0000000..792635e --- /dev/null +++ b/Scriptables/WorldStorageSettings.cs @@ -0,0 +1,17 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace ETSI.ARF.WorldStorage +{ + [System.Serializable] + [CreateAssetMenu(fileName = "ARFWorldStorageSettings", menuName = "ARF World Storage/Server Settings", order = 1)] + public class WorldStorageSettings : ScriptableObject + { + [SerializeField] public string serverName = "myServer"; + [SerializeField] public string creatorUID = System.Guid.Empty.ToString(); + [SerializeField] public string basePath = "https:\\"; + [SerializeField] public int port = 8080; + } +} \ No newline at end of file diff --git a/Scripts/RESTRequest.cs.meta b/Scriptables/WorldStorageSettings.cs.meta similarity index 83% rename from Scripts/RESTRequest.cs.meta rename to Scriptables/WorldStorageSettings.cs.meta index 4a12551..6e5eff8 100644 --- a/Scripts/RESTRequest.cs.meta +++ b/Scriptables/WorldStorageSettings.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d6c7598eb0c8e2948826a04685e1e3c3 +guid: e4b7be4c33f68d0418c3b4e1a7053d91 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Scripts.meta b/Scripts.meta index f83558e..4a46a31 100644 --- a/Scripts.meta +++ b/Scripts.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: be2764d34364d6e4e8b4811c9fe72a5b +guid: 9f9d2ca3af2d00643b6a16d11277df9a folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Scripts/RESTRequest.cs b/Scripts/RESTRequest.cs deleted file mode 100644 index d538dff..0000000 --- a/Scripts/RESTRequest.cs +++ /dev/null @@ -1,73 +0,0 @@ -// -// ESTI - ARF -// -// First Version 2020 Patrick Harms -// Modified: -// - 2021, Sylvain Renault, Fraunhofer HHI -// -// -#define USING_OPENAPI_GENERATOR // alt. is Swagger - -using System.IO; -using System.Collections.Generic; -using UnityEngine; - -#if USING_OPENAPI_GENERATOR -using Org.OpenAPITools.Api; -using Org.OpenAPITools.Model; -#else -using IO.Swagger.Api; -using IO.Swagger.Model; -#endif - -#if UNITY_EDITOR -public class RESTRequest -{ - static public void PostAddTrackable(string basePath) - { - Debug.Log("Posting Add Trackable to Server"); - TrackablesApi api = new TrackablesApi(basePath); - Debug.Log("created Trackables API"); - - EncodingInformationStructure trackableEncodingInformation = - new EncodingInformationStructure(EncodingInformationStructure.DataFormatEnum.ARCORE, "1.0"); - - List trackableDimension = new List { 5, 5, 5 }; - - byte[] bytes = new byte[100]; - - for (int i = 0; i < bytes.Length; i++) - { - bytes[i] = (byte)i; - } - - Dictionary> keyvalueTagList = new Dictionary>(); - - keyvalueTagList.Add("key", new List { "value" }); - - Trackable trackable = new Trackable(new System.Guid("67584958-3456-2342-4564-456723332345"), - Trackable.TrackableTypeEnum.FIDUCIALMARKER, - trackableEncodingInformation, - bytes, - new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, - Trackable.UnitSystemEnum.M, - trackableDimension, - keyvalueTagList); - - string result = api.AddTrackable(trackable); - - Debug.Log(result); - } - - static public void PostAddWorldAnchor(string basePath) - { - Debug.Log("Posting Add World Anchor to Server"); - //WorldAnchorsApi api = new WorldAnchorsApi(basePath); - Debug.Log("created World Anchors API"); - - //string result = api.AddWorldAnchor("testCreatorUID", "METERS"); - - //Debug.Log(result); - } -} -#endif \ No newline at end of file diff --git a/Scripts/RESTfulAdminRequest.cs b/Scripts/RESTfulAdminRequest.cs new file mode 100644 index 0000000..5e22e13 --- /dev/null +++ b/Scripts/RESTfulAdminRequest.cs @@ -0,0 +1,62 @@ +// +// ETSI (European Telecommunications Standards Institute, referred to as ETSI) +// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) +// (C) 2022 +// +// Development "World Storage", data management, authoring tools +// +// Authors: +// - Sylvain Renault (Fraunhofer HHI) +// +// Date: Feb. 2022 +// + +#define USING_OPENAPI_GENERATOR // alt. is Swagger + +using System.IO; +using System.Collections.Generic; +using UnityEngine; + +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif + +#if UNITY_EDITOR +namespace ETSI.ARF.WorldStorage.RESTful +{ + public class RESTfulAdminRequest + { + #region ##### World Storage Requests ##### + static public string GetAdminInfo(WorldStorageSettings ws) + { + string uri = ws.basePath + ":" + ws.port.ToString(); + + Debug.Log("Get Server Info"); + DefaultApi api = new DefaultApi(uri); + Debug.Log("Created Default API"); + + string vers = api.GetVersion(); + Debug.Log("Using API Version " + vers); + + return vers; + } + + static public string Ping (WorldStorageSettings ws) + { + string uri = ws.basePath + ":" + ws.port.ToString(); + + Debug.Log("Get Server Info"); + DefaultApi api = new DefaultApi(uri); + Debug.Log("Created Default API"); + + api.PingGet(); + return "Pong"; // ? + } + #endregion + } +} +#endif \ No newline at end of file diff --git a/Editor/CreateARTrackable.cs.meta b/Scripts/RESTfulAdminRequest.cs.meta similarity index 83% rename from Editor/CreateARTrackable.cs.meta rename to Scripts/RESTfulAdminRequest.cs.meta index c8d7fb0..27fcc8f 100644 --- a/Editor/CreateARTrackable.cs.meta +++ b/Scripts/RESTfulAdminRequest.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a1647df9b48bf4f49a664a929fff57ff +guid: 0fa015c6a7b3a8e4884833d8f672c20c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Scripts/RESTfulTrackableRequest.cs b/Scripts/RESTfulTrackableRequest.cs new file mode 100644 index 0000000..35d267f --- /dev/null +++ b/Scripts/RESTfulTrackableRequest.cs @@ -0,0 +1,123 @@ +// +// ETSI (European Telecommunications Standards Institute, referred to as ETSI) +// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) +// (C) 2022 +// +// Development "World Storage", data management, authoring tools +// +// Authors: +// - Sylvain Renault (Fraunhofer HHI) +// +// Date: Feb. 2022 +// + +#define USING_OPENAPI_GENERATOR // alt. is Swagger + +using System.IO; +using System.Collections.Generic; +using UnityEngine; + +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif + +#if UNITY_EDITOR +namespace ETSI.ARF.WorldStorage.RESTful +{ + public class RESTfulTrackableRequest + { + #region ##### Trackable Requests ##### + static public List GetAllTrackables(WorldStorageSettings ws) + { + string uri = ws.basePath + ":" + ws.port.ToString(); + TrackablesApi api = new TrackablesApi(uri); + + List result = api.GetTrackables(); + return result; + } + + static public Trackable GetTrackable(WorldStorageSettings ws, string uuid) + { + string uri = ws.basePath + ":" + ws.port.ToString(); + TrackablesApi api = new TrackablesApi(uri); + + Trackable result = api.GetTrackableById(uuid); + return result; + } + + static public void DeleteTrackable(WorldStorageSettings ws, string uuid) + { + string uri = ws.basePath + ":" + ws.port.ToString(); + TrackablesApi api = new TrackablesApi(uri); + api.DeleteTrackable(uuid); + } + + static public Trackable TrackableFromStrings(string guid, string creatorUID) + { + EncodingInformationStructure trackableEncodingInformation = + new EncodingInformationStructure(EncodingInformationStructure.DataFormatEnum.ARCORE, "1.0"); + Debug.Log("Created encoding information"); + +#if USING_OPENAPI_GENERATOR + List trackableDimension = new List(); +#else + List trackableDimension = new List(); +#endif + trackableDimension.Add(5); + trackableDimension.Add(5); + Debug.Log("created dimension"); + + byte[] bytes = new byte[100]; + + for (int i = 0; i < bytes.Length; i++) + { + bytes[i] = (byte)i; + } + + List crs = new List + { + -2, 1, -3, 4, + 4, 4, 4, 2, + 1, 0, -2, 1, + -1, -2, 0, 0 + }; + + Dictionary> kv = new Dictionary>(); + kv.Add("Scenario", new List { "DTwin" }); + + System.Guid _guid = System.Guid.Parse(guid); + Trackable t = new Trackable( + _guid, + System.Guid.Parse(creatorUID), + Trackable.TrackableTypeEnum.IMAGEMARKER, + trackableEncodingInformation, + bytes, + crs, + Trackable.UnitSystemEnum.M, + trackableDimension, + kv); + t.UID = _guid; + return t; + } + + static public void PostAddTrackable(WorldStorageSettings ws, Trackable trackable) + { + string uri = ws.basePath + ":" + ws.port.ToString(); + + Debug.Log("Posting Add Trackable to Server"); + TrackablesApi api = new TrackablesApi(uri); + Debug.Log("Created Trackables API"); + + + string result = api.AddTrackable(trackable); + + Debug.Log(result); + } + #endregion + } +} +#endif \ No newline at end of file diff --git a/Scripts/RESTfulTrackableRequest.cs.meta b/Scripts/RESTfulTrackableRequest.cs.meta new file mode 100644 index 0000000..63e45e3 --- /dev/null +++ b/Scripts/RESTfulTrackableRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f492e20bc218f884b907369b8eca15a3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/RESTfulWorldAnchorRequest.cs b/Scripts/RESTfulWorldAnchorRequest.cs new file mode 100644 index 0000000..bd4297e --- /dev/null +++ b/Scripts/RESTfulWorldAnchorRequest.cs @@ -0,0 +1,65 @@ +// +// ETSI (European Telecommunications Standards Institute, referred to as ETSI) +// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) +// (C) 2022 +// +// Development "World Storage", data management, authoring tools +// +// Authors: +// - Sylvain Renault (Fraunhofer HHI) +// +// Date: Feb. 2022 +// + +#define USING_OPENAPI_GENERATOR // alt. is Swagger + +using System.IO; +using System.Collections.Generic; +using UnityEngine; + +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif + +#if UNITY_EDITOR +namespace ETSI.ARF.WorldStorage.RESTful +{ + public class RESTfulWorldAnchorRequest + { + #region ##### World Anchor Requests ##### + static public void PostAddWorldAnchor(WorldStorageSettings ws) + { + string uri = ws.basePath + ":" + ws.port.ToString(); + + Debug.Log("Posting Add World Anchor to Server"); + WorldAnchorsApi api = new WorldAnchorsApi(uri); + Debug.Log("Created World Anchors API"); + + TrackableEncodingInformationStructure trackableEncodingInformation = + new TrackableEncodingInformationStructure(TrackableEncodingInformationStructure.DataFormatEnum.ARCORE, "1.0"); + Debug.Log("Created encoding information"); + + List trackableDimension = new List(); + trackableDimension.Add(5); + trackableDimension.Add(5); + Debug.Log("Created dimension"); + + byte[] bytes = new byte[100]; + + for (int i = 0; i < bytes.Length; i++) + { + bytes[i] = (byte)i; + } + + string result = api.AddWorldAnchor("testCreatorUID", "METERS"); + + Debug.Log(result); + } + #endregion + } +} +#endif \ No newline at end of file diff --git a/Scripts/RESTfulWorldAnchorRequest.cs.meta b/Scripts/RESTfulWorldAnchorRequest.cs.meta new file mode 100644 index 0000000..77f7b39 --- /dev/null +++ b/Scripts/RESTfulWorldAnchorRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb674a7de52fc6d4a822e7d07c1dd294 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/de.thn.uec.isg.arf.worldstoragemanager.asmdef b/de.thn.uec.isg.arf.worldstoragemanager.asmdef deleted file mode 100644 index 6c59b35..0000000 --- a/de.thn.uec.isg.arf.worldstoragemanager.asmdef +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "World Storage Manager" -} diff --git a/etsi.isg.arf.worldstorage.asmdef b/etsi.isg.arf.worldstorage.asmdef new file mode 100644 index 0000000..523f736 --- /dev/null +++ b/etsi.isg.arf.worldstorage.asmdef @@ -0,0 +1,3 @@ +{ + "name": "World Storage Package" +} diff --git a/de.thn.uec.isg.arf.worldstoragemanager.asmdef.meta b/etsi.isg.arf.worldstorage.asmdef.meta similarity index 76% rename from de.thn.uec.isg.arf.worldstoragemanager.asmdef.meta rename to etsi.isg.arf.worldstorage.asmdef.meta index e87cb67..b212089 100644 --- a/de.thn.uec.isg.arf.worldstoragemanager.asmdef.meta +++ b/etsi.isg.arf.worldstorage.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5a0858869b34217438dedd4c292a5a0b +guid: 99fdaa6f193b69346bfc8863615f98f0 AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/package.json b/package.json index b9ec71a..9952b13 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,10 @@ { - "name": "de.thn.uec.isg.arf.worldstoragemanager", - "version": "0.0.1", - "displayName": "ISG-ARF World Storage Manager", - "description": "Management UI for the World Storage of the Augmented Reality Framework", + "author": "ETSI-ISG-ARF", + "name": "etsi.isg.arf.worldstorage", + "version": "0.0.2", + "displayName": "ISG-ARF World Storage Package", + "description": "RESTful Wrapper for the World Storage of the Augmented Reality Framework", "unity": "2020.3", "dependencies": { }, - "keywords": [ ], - "author": { - "name": "Patrick Harms", - "email": "patrick.harms@th-nuernberg.de", - "url": "www.th-nuernberg.de/uec" - } + "keywords": [ ] } \ No newline at end of file -- GitLab From 0fe54fb13060f8856ee7545408ef6c6329c832df Mon Sep 17 00:00:00 2001 From: Sylvain Renault Date: Fri, 29 Apr 2022 10:23:52 +0200 Subject: [PATCH 2/8] New structure. New assets and editor folder. --- Assets.meta | 8 ++++ Assets/Editor.meta | 8 ++++ Assets/Editor/WorldStorageServerEditor.cs | 18 ++++++++ .../Editor/WorldStorageServerEditor.cs.meta | 11 +++++ Scriptables.meta => Assets/Scriptables.meta | 0 .../Scriptables}/WorldStorageSettings.cs | 0 .../Scriptables}/WorldStorageSettings.cs.meta | 0 Scripts.meta => Assets/Scripts.meta | 0 Assets/Scripts/REST.meta | 8 ++++ .../Scripts/REST}/RESTfulAdminRequest.cs | 0 .../Scripts/REST}/RESTfulAdminRequest.cs.meta | 0 .../Scripts/REST}/RESTfulTrackableRequest.cs | 0 .../REST}/RESTfulTrackableRequest.cs.meta | 0 .../REST}/RESTfulWorldAnchorRequest.cs | 0 .../REST}/RESTfulWorldAnchorRequest.cs.meta | 0 Assets/Scripts/WorldStorageServer.cs | 41 +++++++++++++++++++ Assets/Scripts/WorldStorageServer.cs.meta | 11 +++++ etsi.isg.arf.worldstorage.asmdef | 17 ++++++-- 18 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 Assets.meta create mode 100644 Assets/Editor.meta create mode 100644 Assets/Editor/WorldStorageServerEditor.cs create mode 100644 Assets/Editor/WorldStorageServerEditor.cs.meta rename Scriptables.meta => Assets/Scriptables.meta (100%) rename {Scriptables => Assets/Scriptables}/WorldStorageSettings.cs (100%) rename {Scriptables => Assets/Scriptables}/WorldStorageSettings.cs.meta (100%) rename Scripts.meta => Assets/Scripts.meta (100%) create mode 100644 Assets/Scripts/REST.meta rename {Scripts => Assets/Scripts/REST}/RESTfulAdminRequest.cs (100%) rename {Scripts => Assets/Scripts/REST}/RESTfulAdminRequest.cs.meta (100%) rename {Scripts => Assets/Scripts/REST}/RESTfulTrackableRequest.cs (100%) rename {Scripts => Assets/Scripts/REST}/RESTfulTrackableRequest.cs.meta (100%) rename {Scripts => Assets/Scripts/REST}/RESTfulWorldAnchorRequest.cs (100%) rename {Scripts => Assets/Scripts/REST}/RESTfulWorldAnchorRequest.cs.meta (100%) create mode 100644 Assets/Scripts/WorldStorageServer.cs create mode 100644 Assets/Scripts/WorldStorageServer.cs.meta diff --git a/Assets.meta b/Assets.meta new file mode 100644 index 0000000..6b2059d --- /dev/null +++ b/Assets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 78306bf200d797d43b085b7da02b346e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor.meta b/Assets/Editor.meta new file mode 100644 index 0000000..d7d338a --- /dev/null +++ b/Assets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 653e904517771514ab9628529a0317d7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/WorldStorageServerEditor.cs b/Assets/Editor/WorldStorageServerEditor.cs new file mode 100644 index 0000000..0f0a18e --- /dev/null +++ b/Assets/Editor/WorldStorageServerEditor.cs @@ -0,0 +1,18 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +[CustomEditor(typeof(WorldStorageServer))] +public class WorldStorageServerEditor : Editor +{ + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + EditorGUILayout.Space(); + WorldStorageServer srv = (WorldStorageServer)target; + string api = srv.GetAPIVersion(); + EditorGUILayout.LabelField("Server State", api); + } +} diff --git a/Assets/Editor/WorldStorageServerEditor.cs.meta b/Assets/Editor/WorldStorageServerEditor.cs.meta new file mode 100644 index 0000000..56276dc --- /dev/null +++ b/Assets/Editor/WorldStorageServerEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f32282169eeffb6418d67e0303320c45 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scriptables.meta b/Assets/Scriptables.meta similarity index 100% rename from Scriptables.meta rename to Assets/Scriptables.meta diff --git a/Scriptables/WorldStorageSettings.cs b/Assets/Scriptables/WorldStorageSettings.cs similarity index 100% rename from Scriptables/WorldStorageSettings.cs rename to Assets/Scriptables/WorldStorageSettings.cs diff --git a/Scriptables/WorldStorageSettings.cs.meta b/Assets/Scriptables/WorldStorageSettings.cs.meta similarity index 100% rename from Scriptables/WorldStorageSettings.cs.meta rename to Assets/Scriptables/WorldStorageSettings.cs.meta diff --git a/Scripts.meta b/Assets/Scripts.meta similarity index 100% rename from Scripts.meta rename to Assets/Scripts.meta diff --git a/Assets/Scripts/REST.meta b/Assets/Scripts/REST.meta new file mode 100644 index 0000000..4452abe --- /dev/null +++ b/Assets/Scripts/REST.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2d42c05c2b33530478b6ec053f84a09d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/RESTfulAdminRequest.cs b/Assets/Scripts/REST/RESTfulAdminRequest.cs similarity index 100% rename from Scripts/RESTfulAdminRequest.cs rename to Assets/Scripts/REST/RESTfulAdminRequest.cs diff --git a/Scripts/RESTfulAdminRequest.cs.meta b/Assets/Scripts/REST/RESTfulAdminRequest.cs.meta similarity index 100% rename from Scripts/RESTfulAdminRequest.cs.meta rename to Assets/Scripts/REST/RESTfulAdminRequest.cs.meta diff --git a/Scripts/RESTfulTrackableRequest.cs b/Assets/Scripts/REST/RESTfulTrackableRequest.cs similarity index 100% rename from Scripts/RESTfulTrackableRequest.cs rename to Assets/Scripts/REST/RESTfulTrackableRequest.cs diff --git a/Scripts/RESTfulTrackableRequest.cs.meta b/Assets/Scripts/REST/RESTfulTrackableRequest.cs.meta similarity index 100% rename from Scripts/RESTfulTrackableRequest.cs.meta rename to Assets/Scripts/REST/RESTfulTrackableRequest.cs.meta diff --git a/Scripts/RESTfulWorldAnchorRequest.cs b/Assets/Scripts/REST/RESTfulWorldAnchorRequest.cs similarity index 100% rename from Scripts/RESTfulWorldAnchorRequest.cs rename to Assets/Scripts/REST/RESTfulWorldAnchorRequest.cs diff --git a/Scripts/RESTfulWorldAnchorRequest.cs.meta b/Assets/Scripts/REST/RESTfulWorldAnchorRequest.cs.meta similarity index 100% rename from Scripts/RESTfulWorldAnchorRequest.cs.meta rename to Assets/Scripts/REST/RESTfulWorldAnchorRequest.cs.meta diff --git a/Assets/Scripts/WorldStorageServer.cs b/Assets/Scripts/WorldStorageServer.cs new file mode 100644 index 0000000..a4398d6 --- /dev/null +++ b/Assets/Scripts/WorldStorageServer.cs @@ -0,0 +1,41 @@ +// +// ETSI (European Telecommunications Standards Institute, referred to as ETSI) +// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) +// (C) 2022 +// +// Development "World Storage", data management, authoring tools +// +// Authors: +// - Sylvain Renault (Fraunhofer HHI) +// +// Date: April 2022 +// + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using ETSI.ARF.WorldStorage; + +public class WorldStorageServer : MonoBehaviour +{ + public WorldStorageSettings worldStorageServer; + + // Start is called before the first frame update + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } + + public string GetAPIVersion() + { + if (worldStorageServer == null) return "No Server Defined!"; + + return ETSI.ARF.WorldStorage.RESTful.RESTfulAdminRequest.GetAdminInfo(worldStorageServer); + } +} diff --git a/Assets/Scripts/WorldStorageServer.cs.meta b/Assets/Scripts/WorldStorageServer.cs.meta new file mode 100644 index 0000000..925ddd3 --- /dev/null +++ b/Assets/Scripts/WorldStorageServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 02da7adcc65f4694684d71e61d88070b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/etsi.isg.arf.worldstorage.asmdef b/etsi.isg.arf.worldstorage.asmdef index 523f736..1558c6c 100644 --- a/etsi.isg.arf.worldstorage.asmdef +++ b/etsi.isg.arf.worldstorage.asmdef @@ -1,3 +1,14 @@ -{ - "name": "World Storage Package" -} +{ + "name": "World Storage Package", + "rootNamespace": "", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file -- GitLab From 8a3fc6a294f022a0c733c65af2b6cf564a3666b9 Mon Sep 17 00:00:00 2001 From: Sylvain Renault Date: Tue, 24 May 2022 16:08:37 +0200 Subject: [PATCH 3/8] New API version. --- Assets/Scriptables.meta | 8 - Assets/Scriptables/WorldStorageSettings.cs | 17 - .../Scriptables/WorldStorageSettings.cs.meta | 11 - Assets/Scripts.meta | 8 - Assets/Scripts/REST.meta | 8 - Assets/Scripts/REST/RESTfulAdminRequest.cs | 62 - .../Scripts/REST/RESTfulAdminRequest.cs.meta | 11 - .../Scripts/REST/RESTfulTrackableRequest.cs | 123 -- .../REST/RESTfulTrackableRequest.cs.meta | 11 - .../Scripts/REST/RESTfulWorldAnchorRequest.cs | 65 - .../REST/RESTfulWorldAnchorRequest.cs.meta | 11 - Assets/Scripts/WorldStorageServer.cs | 41 - Assets/Scripts/WorldStorageServer.cs.meta | 11 - Plugins/Org.OpenAPITools.dll | Bin 71168 -> 111104 bytes Plugins/Org.OpenAPITools.xml | 1409 ++++++++++++++--- 15 files changed, 1172 insertions(+), 624 deletions(-) delete mode 100644 Assets/Scriptables.meta delete mode 100644 Assets/Scriptables/WorldStorageSettings.cs delete mode 100644 Assets/Scriptables/WorldStorageSettings.cs.meta delete mode 100644 Assets/Scripts.meta delete mode 100644 Assets/Scripts/REST.meta delete mode 100644 Assets/Scripts/REST/RESTfulAdminRequest.cs delete mode 100644 Assets/Scripts/REST/RESTfulAdminRequest.cs.meta delete mode 100644 Assets/Scripts/REST/RESTfulTrackableRequest.cs delete mode 100644 Assets/Scripts/REST/RESTfulTrackableRequest.cs.meta delete mode 100644 Assets/Scripts/REST/RESTfulWorldAnchorRequest.cs delete mode 100644 Assets/Scripts/REST/RESTfulWorldAnchorRequest.cs.meta delete mode 100644 Assets/Scripts/WorldStorageServer.cs delete mode 100644 Assets/Scripts/WorldStorageServer.cs.meta diff --git a/Assets/Scriptables.meta b/Assets/Scriptables.meta deleted file mode 100644 index ea6eb7d..0000000 --- a/Assets/Scriptables.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 9f7902ce03cc2b2458df8c561ff1f55e -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scriptables/WorldStorageSettings.cs b/Assets/Scriptables/WorldStorageSettings.cs deleted file mode 100644 index 792635e..0000000 --- a/Assets/Scriptables/WorldStorageSettings.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEditor; - -namespace ETSI.ARF.WorldStorage -{ - [System.Serializable] - [CreateAssetMenu(fileName = "ARFWorldStorageSettings", menuName = "ARF World Storage/Server Settings", order = 1)] - public class WorldStorageSettings : ScriptableObject - { - [SerializeField] public string serverName = "myServer"; - [SerializeField] public string creatorUID = System.Guid.Empty.ToString(); - [SerializeField] public string basePath = "https:\\"; - [SerializeField] public int port = 8080; - } -} \ No newline at end of file diff --git a/Assets/Scriptables/WorldStorageSettings.cs.meta b/Assets/Scriptables/WorldStorageSettings.cs.meta deleted file mode 100644 index 6e5eff8..0000000 --- a/Assets/Scriptables/WorldStorageSettings.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e4b7be4c33f68d0418c3b4e1a7053d91 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts.meta b/Assets/Scripts.meta deleted file mode 100644 index 4a46a31..0000000 --- a/Assets/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 9f9d2ca3af2d00643b6a16d11277df9a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/REST.meta b/Assets/Scripts/REST.meta deleted file mode 100644 index 4452abe..0000000 --- a/Assets/Scripts/REST.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2d42c05c2b33530478b6ec053f84a09d -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/REST/RESTfulAdminRequest.cs b/Assets/Scripts/REST/RESTfulAdminRequest.cs deleted file mode 100644 index 5e22e13..0000000 --- a/Assets/Scripts/REST/RESTfulAdminRequest.cs +++ /dev/null @@ -1,62 +0,0 @@ -// -// ETSI (European Telecommunications Standards Institute, referred to as ETSI) -// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) -// (C) 2022 -// -// Development "World Storage", data management, authoring tools -// -// Authors: -// - Sylvain Renault (Fraunhofer HHI) -// -// Date: Feb. 2022 -// - -#define USING_OPENAPI_GENERATOR // alt. is Swagger - -using System.IO; -using System.Collections.Generic; -using UnityEngine; - -#if USING_OPENAPI_GENERATOR -using Org.OpenAPITools.Api; -using Org.OpenAPITools.Model; -#else -using IO.Swagger.Api; -using IO.Swagger.Model; -#endif - -#if UNITY_EDITOR -namespace ETSI.ARF.WorldStorage.RESTful -{ - public class RESTfulAdminRequest - { - #region ##### World Storage Requests ##### - static public string GetAdminInfo(WorldStorageSettings ws) - { - string uri = ws.basePath + ":" + ws.port.ToString(); - - Debug.Log("Get Server Info"); - DefaultApi api = new DefaultApi(uri); - Debug.Log("Created Default API"); - - string vers = api.GetVersion(); - Debug.Log("Using API Version " + vers); - - return vers; - } - - static public string Ping (WorldStorageSettings ws) - { - string uri = ws.basePath + ":" + ws.port.ToString(); - - Debug.Log("Get Server Info"); - DefaultApi api = new DefaultApi(uri); - Debug.Log("Created Default API"); - - api.PingGet(); - return "Pong"; // ? - } - #endregion - } -} -#endif \ No newline at end of file diff --git a/Assets/Scripts/REST/RESTfulAdminRequest.cs.meta b/Assets/Scripts/REST/RESTfulAdminRequest.cs.meta deleted file mode 100644 index 27fcc8f..0000000 --- a/Assets/Scripts/REST/RESTfulAdminRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0fa015c6a7b3a8e4884833d8f672c20c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/REST/RESTfulTrackableRequest.cs b/Assets/Scripts/REST/RESTfulTrackableRequest.cs deleted file mode 100644 index 35d267f..0000000 --- a/Assets/Scripts/REST/RESTfulTrackableRequest.cs +++ /dev/null @@ -1,123 +0,0 @@ -// -// ETSI (European Telecommunications Standards Institute, referred to as ETSI) -// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) -// (C) 2022 -// -// Development "World Storage", data management, authoring tools -// -// Authors: -// - Sylvain Renault (Fraunhofer HHI) -// -// Date: Feb. 2022 -// - -#define USING_OPENAPI_GENERATOR // alt. is Swagger - -using System.IO; -using System.Collections.Generic; -using UnityEngine; - -#if USING_OPENAPI_GENERATOR -using Org.OpenAPITools.Api; -using Org.OpenAPITools.Model; -#else -using IO.Swagger.Api; -using IO.Swagger.Model; -#endif - -#if UNITY_EDITOR -namespace ETSI.ARF.WorldStorage.RESTful -{ - public class RESTfulTrackableRequest - { - #region ##### Trackable Requests ##### - static public List GetAllTrackables(WorldStorageSettings ws) - { - string uri = ws.basePath + ":" + ws.port.ToString(); - TrackablesApi api = new TrackablesApi(uri); - - List result = api.GetTrackables(); - return result; - } - - static public Trackable GetTrackable(WorldStorageSettings ws, string uuid) - { - string uri = ws.basePath + ":" + ws.port.ToString(); - TrackablesApi api = new TrackablesApi(uri); - - Trackable result = api.GetTrackableById(uuid); - return result; - } - - static public void DeleteTrackable(WorldStorageSettings ws, string uuid) - { - string uri = ws.basePath + ":" + ws.port.ToString(); - TrackablesApi api = new TrackablesApi(uri); - api.DeleteTrackable(uuid); - } - - static public Trackable TrackableFromStrings(string guid, string creatorUID) - { - EncodingInformationStructure trackableEncodingInformation = - new EncodingInformationStructure(EncodingInformationStructure.DataFormatEnum.ARCORE, "1.0"); - Debug.Log("Created encoding information"); - -#if USING_OPENAPI_GENERATOR - List trackableDimension = new List(); -#else - List trackableDimension = new List(); -#endif - trackableDimension.Add(5); - trackableDimension.Add(5); - Debug.Log("created dimension"); - - byte[] bytes = new byte[100]; - - for (int i = 0; i < bytes.Length; i++) - { - bytes[i] = (byte)i; - } - - List crs = new List - { - -2, 1, -3, 4, - 4, 4, 4, 2, - 1, 0, -2, 1, - -1, -2, 0, 0 - }; - - Dictionary> kv = new Dictionary>(); - kv.Add("Scenario", new List { "DTwin" }); - - System.Guid _guid = System.Guid.Parse(guid); - Trackable t = new Trackable( - _guid, - System.Guid.Parse(creatorUID), - Trackable.TrackableTypeEnum.IMAGEMARKER, - trackableEncodingInformation, - bytes, - crs, - Trackable.UnitSystemEnum.M, - trackableDimension, - kv); - t.UID = _guid; - return t; - } - - static public void PostAddTrackable(WorldStorageSettings ws, Trackable trackable) - { - string uri = ws.basePath + ":" + ws.port.ToString(); - - Debug.Log("Posting Add Trackable to Server"); - TrackablesApi api = new TrackablesApi(uri); - Debug.Log("Created Trackables API"); - - - string result = api.AddTrackable(trackable); - - Debug.Log(result); - } - #endregion - } -} -#endif \ No newline at end of file diff --git a/Assets/Scripts/REST/RESTfulTrackableRequest.cs.meta b/Assets/Scripts/REST/RESTfulTrackableRequest.cs.meta deleted file mode 100644 index 63e45e3..0000000 --- a/Assets/Scripts/REST/RESTfulTrackableRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f492e20bc218f884b907369b8eca15a3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/REST/RESTfulWorldAnchorRequest.cs b/Assets/Scripts/REST/RESTfulWorldAnchorRequest.cs deleted file mode 100644 index bd4297e..0000000 --- a/Assets/Scripts/REST/RESTfulWorldAnchorRequest.cs +++ /dev/null @@ -1,65 +0,0 @@ -// -// ETSI (European Telecommunications Standards Institute, referred to as ETSI) -// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) -// (C) 2022 -// -// Development "World Storage", data management, authoring tools -// -// Authors: -// - Sylvain Renault (Fraunhofer HHI) -// -// Date: Feb. 2022 -// - -#define USING_OPENAPI_GENERATOR // alt. is Swagger - -using System.IO; -using System.Collections.Generic; -using UnityEngine; - -#if USING_OPENAPI_GENERATOR -using Org.OpenAPITools.Api; -using Org.OpenAPITools.Model; -#else -using IO.Swagger.Api; -using IO.Swagger.Model; -#endif - -#if UNITY_EDITOR -namespace ETSI.ARF.WorldStorage.RESTful -{ - public class RESTfulWorldAnchorRequest - { - #region ##### World Anchor Requests ##### - static public void PostAddWorldAnchor(WorldStorageSettings ws) - { - string uri = ws.basePath + ":" + ws.port.ToString(); - - Debug.Log("Posting Add World Anchor to Server"); - WorldAnchorsApi api = new WorldAnchorsApi(uri); - Debug.Log("Created World Anchors API"); - - TrackableEncodingInformationStructure trackableEncodingInformation = - new TrackableEncodingInformationStructure(TrackableEncodingInformationStructure.DataFormatEnum.ARCORE, "1.0"); - Debug.Log("Created encoding information"); - - List trackableDimension = new List(); - trackableDimension.Add(5); - trackableDimension.Add(5); - Debug.Log("Created dimension"); - - byte[] bytes = new byte[100]; - - for (int i = 0; i < bytes.Length; i++) - { - bytes[i] = (byte)i; - } - - string result = api.AddWorldAnchor("testCreatorUID", "METERS"); - - Debug.Log(result); - } - #endregion - } -} -#endif \ No newline at end of file diff --git a/Assets/Scripts/REST/RESTfulWorldAnchorRequest.cs.meta b/Assets/Scripts/REST/RESTfulWorldAnchorRequest.cs.meta deleted file mode 100644 index 77f7b39..0000000 --- a/Assets/Scripts/REST/RESTfulWorldAnchorRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: eb674a7de52fc6d4a822e7d07c1dd294 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/WorldStorageServer.cs b/Assets/Scripts/WorldStorageServer.cs deleted file mode 100644 index a4398d6..0000000 --- a/Assets/Scripts/WorldStorageServer.cs +++ /dev/null @@ -1,41 +0,0 @@ -// -// ETSI (European Telecommunications Standards Institute, referred to as ETSI) -// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) -// (C) 2022 -// -// Development "World Storage", data management, authoring tools -// -// Authors: -// - Sylvain Renault (Fraunhofer HHI) -// -// Date: April 2022 -// - -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using ETSI.ARF.WorldStorage; - -public class WorldStorageServer : MonoBehaviour -{ - public WorldStorageSettings worldStorageServer; - - // Start is called before the first frame update - void Start() - { - - } - - // Update is called once per frame - void Update() - { - - } - - public string GetAPIVersion() - { - if (worldStorageServer == null) return "No Server Defined!"; - - return ETSI.ARF.WorldStorage.RESTful.RESTfulAdminRequest.GetAdminInfo(worldStorageServer); - } -} diff --git a/Assets/Scripts/WorldStorageServer.cs.meta b/Assets/Scripts/WorldStorageServer.cs.meta deleted file mode 100644 index 925ddd3..0000000 --- a/Assets/Scripts/WorldStorageServer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 02da7adcc65f4694684d71e61d88070b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Plugins/Org.OpenAPITools.dll b/Plugins/Org.OpenAPITools.dll index 60d56af20fe5d587dcdf173203f70d602d66cf7f..2d8e9a48156b8af39c42ce96591c388fa84686d6 100644 GIT binary patch literal 111104 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 QXY&o@@jprbztzD11B(=lu>b%7 literal 71168 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⁢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

    ;ff0$O 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 g4L~c29Iao5iw(ZQpAU - +

    - Get the version of the API + Get the state of the server. @@ -41,9 +41,9 @@ Thrown when fails to make API call string - + - Get the version of the API + Get the state of the server. @@ -51,7 +51,7 @@ Thrown when fails to make API call ApiResponse of string - + Test the server availability @@ -61,7 +61,7 @@ Thrown when fails to make API call - + Test the server availability @@ -71,9 +71,29 @@ Thrown when fails to make API call ApiResponse of Object(void) - + + + Get the version of the ARF API. + + + + + Thrown when fails to make API call + string + + + + Get the version of the ARF API. + + + + + Thrown when fails to make API call + ApiResponse of string + + - Get the version of the API + Get the state of the server. @@ -82,9 +102,9 @@ Cancellation Token to cancel request (optional) Task of string - + - Get the version of the API + Get the state of the server. @@ -93,7 +113,7 @@ Cancellation Token to cancel request (optional) Task of ApiResponse (string) - + Test the server availability @@ -104,7 +124,7 @@ Cancellation Token to cancel request (optional) Task of void - + Test the server availability @@ -115,6 +135,28 @@ Cancellation Token to cancel request (optional) Task of ApiResponse + + + Get the version of the ARF API. + + + + + Thrown when fails to make API call + Cancellation Token to cancel request (optional) + Task of string + + + + Get the version of the ARF API. + + + + + Thrown when fails to make API call + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + Represents a collection of functions to interact with the API endpoints @@ -166,51 +208,51 @@ Header field value. - + - Get the version of the API + Get the state of the server. Thrown when fails to make API call string - + - Get the version of the API + Get the state of the server. Thrown when fails to make API call ApiResponse of string - + - Get the version of the API + Get the state of the server. Thrown when fails to make API call Cancellation Token to cancel request (optional) Task of string - + - Get the version of the API + Get the state of the server. Thrown when fails to make API call Cancellation Token to cancel request (optional) Task of ApiResponse (string) - + Test the server availability Thrown when fails to make API call - + Test the server availability Thrown when fails to make API call ApiResponse of Object(void) - + Test the server availability @@ -218,7 +260,7 @@ Cancellation Token to cancel request (optional) Task of void - + Test the server availability @@ -226,6 +268,36 @@ Cancellation Token to cancel request (optional) Task of ApiResponse + + + Get the version of the ARF API. + + Thrown when fails to make API call + string + + + + Get the version of the ARF API. + + Thrown when fails to make API call + ApiResponse of string + + + + Get the version of the ARF API. + + Thrown when fails to make API call + Cancellation Token to cancel request (optional) + Task of string + + + + Get the version of the ARF API. + + Thrown when fails to make API call + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + Gets or sets the configuration object @@ -244,73 +316,73 @@ - Create a trackable + Create a trackable. Thrown when fails to make API call - the trackable to be added to the world storage + The trackable to be added to the world storage. string - Create a trackable + Create a trackable. Thrown when fails to make API call - the trackable to be added to the world storage + The trackable to be added to the world storage. ApiResponse of string - + - Deletes a trackable + Deletes a trackable. Thrown when fails to make API call - trackable id to delete + Trackable UUID to delete. - + - Deletes a trackable + Deletes a trackable. Thrown when fails to make API call - trackable id to delete + Trackable UUID to delete. ApiResponse of Object(void) - + - Find a trackable by his ID + Find a trackable by its UUID. Thrown when fails to make API call - ID of the trackable to retrieve + UUID of the trackable to retrieve. Trackable - + - Find a trackable by his ID + Find a trackable by its UUID. Thrown when fails to make API call - ID of the trackable to retrieve + UUID of the trackable to retrieve. ApiResponse of Trackable - returns the list of all trackables defined by the world storage. + Returns the list of all trackables defined by the world storage. @@ -320,7 +392,7 @@ - returns the list of all trackables defined by the world storage. + Returns the list of all trackables defined by the world storage. @@ -330,79 +402,79 @@ - Create a trackable + Create a trackable. Thrown when fails to make API call - the trackable to be added to the world storage + The trackable to be added to the world storage. Cancellation Token to cancel request (optional) Task of string - Create a trackable + Create a trackable. Thrown when fails to make API call - the trackable to be added to the world storage + The trackable to be added to the world storage. Cancellation Token to cancel request (optional) Task of ApiResponse (string) - + - Deletes a trackable + Deletes a trackable. Thrown when fails to make API call - trackable id to delete + Trackable UUID to delete. Cancellation Token to cancel request (optional) Task of void - + - Deletes a trackable + Deletes a trackable. Thrown when fails to make API call - trackable id to delete + Trackable UUID to delete. Cancellation Token to cancel request (optional) Task of ApiResponse - + - Find a trackable by his ID + Find a trackable by its UUID. Thrown when fails to make API call - ID of the trackable to retrieve + UUID of the trackable to retrieve. Cancellation Token to cancel request (optional) Task of Trackable - + - Find a trackable by his ID + Find a trackable by its UUID. Thrown when fails to make API call - ID of the trackable to retrieve + UUID of the trackable to retrieve. Cancellation Token to cancel request (optional) Task of ApiResponse (Trackable) - returns the list of all trackables defined by the world storage. + Returns the list of all trackables defined by the world storage. @@ -413,7 +485,7 @@ - returns the list of all trackables defined by the world storage. + Returns the list of all trackables defined by the world storage. @@ -475,123 +547,123 @@ - Create a trackable + Create a trackable. Thrown when fails to make API call - the trackable to be added to the world storage + The trackable to be added to the world storage. string - Create a trackable + Create a trackable. Thrown when fails to make API call - the trackable to be added to the world storage + The trackable to be added to the world storage. ApiResponse of string - Create a trackable + Create a trackable. Thrown when fails to make API call - the trackable to be added to the world storage + The trackable to be added to the world storage. Cancellation Token to cancel request (optional) Task of string - Create a trackable + Create a trackable. Thrown when fails to make API call - the trackable to be added to the world storage + The trackable to be added to the world storage. Cancellation Token to cancel request (optional) Task of ApiResponse (string) - + - Deletes a trackable + Deletes a trackable. Thrown when fails to make API call - trackable id to delete + Trackable UUID to delete. - + - Deletes a trackable + Deletes a trackable. Thrown when fails to make API call - trackable id to delete + Trackable UUID to delete. ApiResponse of Object(void) - + - Deletes a trackable + Deletes a trackable. Thrown when fails to make API call - trackable id to delete + Trackable UUID to delete. Cancellation Token to cancel request (optional) Task of void - + - Deletes a trackable + Deletes a trackable. Thrown when fails to make API call - trackable id to delete + Trackable UUID to delete. Cancellation Token to cancel request (optional) Task of ApiResponse - + - Find a trackable by his ID + Find a trackable by its UUID. Thrown when fails to make API call - ID of the trackable to retrieve + UUID of the trackable to retrieve. Trackable - + - Find a trackable by his ID + Find a trackable by its UUID. Thrown when fails to make API call - ID of the trackable to retrieve + UUID of the trackable to retrieve. ApiResponse of Trackable - + - Find a trackable by his ID + Find a trackable by its UUID. Thrown when fails to make API call - ID of the trackable to retrieve + UUID of the trackable to retrieve. Cancellation Token to cancel request (optional) Task of Trackable - + - Find a trackable by his ID + Find a trackable by its UUID. Thrown when fails to make API call - ID of the trackable to retrieve + UUID of the trackable to retrieve. Cancellation Token to cancel request (optional) Task of ApiResponse (Trackable) - returns the list of all trackables defined by the world storage. + Returns the list of all trackables defined by the world storage. Thrown when fails to make API call List<Trackable> - returns the list of all trackables defined by the world storage. + Returns the list of all trackables defined by the world storage. Thrown when fails to make API call ApiResponse of List<Trackable> - returns the list of all trackables defined by the world storage. + Returns the list of all trackables defined by the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) @@ -599,7 +671,7 @@ - returns the list of all trackables defined by the world storage. + Returns the list of all trackables defined by the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) @@ -611,114 +683,619 @@ An instance of the Configuration - + + + Provides a factory method hook for the creation of exceptions. + + + + + Represents a collection of functions to interact with the API endpoints + + + + + Create a world anchor. + + + + + Thrown when fails to make API call + The world anchor to be added to the world storage. + string + + + + Create a world anchor. + + + + + Thrown when fails to make API call + The world anchor to be added to the world storage. + ApiResponse of string + + + + Deletes a world anchor. + + + + + Thrown when fails to make API call + World anchor UUID to delete. + + + + + Deletes a world anchor. + + + + + Thrown when fails to make API call + World anchor UUID to delete. + ApiResponse of Object(void) + + + + Find a world anchor by its UUID. + + + + + Thrown when fails to make API call + UUID of the world anchor to retrieve. + WorldAnchor + + + + Find a world anchor by its UUID. + + + + + Thrown when fails to make API call + UUID of the world anchor to retrieve. + ApiResponse of WorldAnchor + + + + Returns the list of all world anchors defined by the world storage. + + + + + Thrown when fails to make API call + List<WorldAnchor> + + + + Returns the list of all world anchors defined by the world storage. + + + + + Thrown when fails to make API call + ApiResponse of List<WorldAnchor> + + + + Create a world anchor. + + + + + Thrown when fails to make API call + The world anchor to be added to the world storage. + Cancellation Token to cancel request (optional) + Task of string + + + + Create a world anchor. + + + + + Thrown when fails to make API call + The world anchor to be added to the world storage. + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + + + + Deletes a world anchor. + + + + + Thrown when fails to make API call + World anchor UUID to delete. + Cancellation Token to cancel request (optional) + Task of void + + + + Deletes a world anchor. + + + + + Thrown when fails to make API call + World anchor UUID to delete. + Cancellation Token to cancel request (optional) + Task of ApiResponse + + + + Find a world anchor by its UUID. + + + + + Thrown when fails to make API call + UUID of the world anchor to retrieve. + Cancellation Token to cancel request (optional) + Task of WorldAnchor + + + + Find a world anchor by its UUID. + + + + + Thrown when fails to make API call + UUID of the world anchor to retrieve. + Cancellation Token to cancel request (optional) + Task of ApiResponse (WorldAnchor) + + + + Returns the list of all world anchors defined by the world storage. + + + + + Thrown when fails to make API call + Cancellation Token to cancel request (optional) + Task of List<WorldAnchor> + + + + Returns the list of all world anchors defined by the world storage. + + + + + Thrown when fails to make API call + Cancellation Token to cancel request (optional) + Task of ApiResponse (List<WorldAnchor>) + + + + Represents a collection of functions to interact with the API endpoints + + + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + + + + + + Initializes a new instance of the class + using Configuration object + + An instance of Configuration + + + + + Gets the base path of the API client. + + The base path + + + + Sets the base path of the API client. + + The base path + + + + Gets the default header. + + Dictionary of HTTP header + + + + Add default header. + + Header field name. + Header field value. + + + + + Create a world anchor. + + Thrown when fails to make API call + The world anchor to be added to the world storage. + string + + + + Create a world anchor. + + Thrown when fails to make API call + The world anchor to be added to the world storage. + ApiResponse of string + + + + Create a world anchor. + + Thrown when fails to make API call + The world anchor to be added to the world storage. + Cancellation Token to cancel request (optional) + Task of string + + + + Create a world anchor. + + Thrown when fails to make API call + The world anchor to be added to the world storage. + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + + + + Deletes a world anchor. + + Thrown when fails to make API call + World anchor UUID to delete. + + + + + Deletes a world anchor. + + Thrown when fails to make API call + World anchor UUID to delete. + ApiResponse of Object(void) + + + + Deletes a world anchor. + + Thrown when fails to make API call + World anchor UUID to delete. + Cancellation Token to cancel request (optional) + Task of void + + + + Deletes a world anchor. + + Thrown when fails to make API call + World anchor UUID to delete. + Cancellation Token to cancel request (optional) + Task of ApiResponse + + + + Find a world anchor by its UUID. + + Thrown when fails to make API call + UUID of the world anchor to retrieve. + WorldAnchor + + + + Find a world anchor by its UUID. + + Thrown when fails to make API call + UUID of the world anchor to retrieve. + ApiResponse of WorldAnchor + + + + Find a world anchor by its UUID. + + Thrown when fails to make API call + UUID of the world anchor to retrieve. + Cancellation Token to cancel request (optional) + Task of WorldAnchor + + + + Find a world anchor by its UUID. + + Thrown when fails to make API call + UUID of the world anchor to retrieve. + Cancellation Token to cancel request (optional) + Task of ApiResponse (WorldAnchor) + + + + Returns the list of all world anchors defined by the world storage. + + Thrown when fails to make API call + List<WorldAnchor> + + + + Returns the list of all world anchors defined by the world storage. + + Thrown when fails to make API call + ApiResponse of List<WorldAnchor> + + + + Returns the list of all world anchors defined by the world storage. + + Thrown when fails to make API call + Cancellation Token to cancel request (optional) + Task of List<WorldAnchor> + + + + Returns the list of all world anchors defined by the world storage. + + Thrown when fails to make API call + Cancellation Token to cancel request (optional) + Task of ApiResponse (List<WorldAnchor>) + + + + Gets or sets the configuration object + + An instance of the Configuration + + + + Provides a factory method hook for the creation of exceptions. + + + + + Represents a collection of functions to interact with the API endpoints + + + + + Create a link between world anchors and trackables. + + + + + Thrown when fails to make API call + The link to be added to the world storage. + string + + + + Create a link between world anchors and trackables. + + + + + Thrown when fails to make API call + The link to be added to the world storage. + ApiResponse of string + + + + Deletes a worldLink. + + + + + Thrown when fails to make API call + link id to delete + + + + + Deletes a worldLink. + + + + + Thrown when fails to make API call + link id to delete + ApiResponse of Object(void) + + + + Find a link by its UUID. + + + + + Thrown when fails to make API call + UUID of the link to retrieve. + WorldLink + + + + Find a link by its UUID. + + + + + Thrown when fails to make API call + UUID of the link to retrieve. + ApiResponse of WorldLink + + + + Returns the list of all links defined by the world storage. + + + + + Thrown when fails to make API call + List<WorldLink> + + + + Returns the list of all links defined by the world storage. + + + + + Thrown when fails to make API call + ApiResponse of List<WorldLink> + + + + Create a link between world anchors and trackables. + + + + + Thrown when fails to make API call + The link to be added to the world storage. + Cancellation Token to cancel request (optional) + Task of string + + + + Create a link between world anchors and trackables. + + + + + Thrown when fails to make API call + The link to be added to the world storage. + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + + - Provides a factory method hook for the creation of exceptions. + Deletes a worldLink. + + + + Thrown when fails to make API call + link id to delete + Cancellation Token to cancel request (optional) + Task of void - + - Represents a collection of functions to interact with the API endpoints + Deletes a worldLink. + + + + Thrown when fails to make API call + link id to delete + Cancellation Token to cancel request (optional) + Task of ApiResponse - + - Create a world anchor + Find a link by its UUID. Thrown when fails to make API call - A Universally Unique IDentifier identifying the creator of the world anchor - Unit of length - List of additional parameters to be stored with the world anchor. (optional) - string + UUID of the link to retrieve. + Cancellation Token to cancel request (optional) + Task of WorldLink - + - Create a world anchor + Find a link by its UUID. Thrown when fails to make API call - A Universally Unique IDentifier identifying the creator of the world anchor - Unit of length - List of additional parameters to be stored with the world anchor. (optional) - ApiResponse of string + UUID of the link to retrieve. + Cancellation Token to cancel request (optional) + Task of ApiResponse (WorldLink) - + - Create a world anchor + Returns the list of all links defined by the world storage. Thrown when fails to make API call - A Universally Unique IDentifier identifying the creator of the world anchor - Unit of length - List of additional parameters to be stored with the world anchor. (optional) Cancellation Token to cancel request (optional) - Task of string + Task of List<WorldLink> - + - Create a world anchor + Returns the list of all links defined by the world storage. Thrown when fails to make API call - A Universally Unique IDentifier identifying the creator of the world anchor - Unit of length - List of additional parameters to be stored with the world anchor. (optional) Cancellation Token to cancel request (optional) - Task of ApiResponse (string) + Task of ApiResponse (List<WorldLink>) - + Represents a collection of functions to interact with the API endpoints - + - Initializes a new instance of the class. + Initializes a new instance of the class. - + - Initializes a new instance of the class + Initializes a new instance of the class - + - Initializes a new instance of the class + Initializes a new instance of the class using Configuration object An instance of Configuration - + Gets the base path of the API client. The base path - + Sets the base path of the API client. The base path - + Gets the default header. Dictionary of HTTP header - + Add default header. @@ -726,55 +1303,145 @@ Header field value. - + - Create a world anchor + Create a link between world anchors and trackables. Thrown when fails to make API call - A Universally Unique IDentifier identifying the creator of the world anchor - Unit of length - List of additional parameters to be stored with the world anchor. (optional) + The link to be added to the world storage. string - + - Create a world anchor + Create a link between world anchors and trackables. Thrown when fails to make API call - A Universally Unique IDentifier identifying the creator of the world anchor - Unit of length - List of additional parameters to be stored with the world anchor. (optional) + The link to be added to the world storage. ApiResponse of string - + - Create a world anchor + Create a link between world anchors and trackables. Thrown when fails to make API call - A Universally Unique IDentifier identifying the creator of the world anchor - Unit of length - List of additional parameters to be stored with the world anchor. (optional) + The link to be added to the world storage. Cancellation Token to cancel request (optional) Task of string - + - Create a world anchor + Create a link between world anchors and trackables. Thrown when fails to make API call - A Universally Unique IDentifier identifying the creator of the world anchor - Unit of length - List of additional parameters to be stored with the world anchor. (optional) + The link to be added to the world storage. Cancellation Token to cancel request (optional) Task of ApiResponse (string) - + + + Deletes a worldLink. + + Thrown when fails to make API call + link id to delete + + + + + Deletes a worldLink. + + Thrown when fails to make API call + link id to delete + ApiResponse of Object(void) + + + + Deletes a worldLink. + + Thrown when fails to make API call + link id to delete + Cancellation Token to cancel request (optional) + Task of void + + + + Deletes a worldLink. + + Thrown when fails to make API call + link id to delete + Cancellation Token to cancel request (optional) + Task of ApiResponse + + + + Find a link by its UUID. + + Thrown when fails to make API call + UUID of the link to retrieve. + WorldLink + + + + Find a link by its UUID. + + Thrown when fails to make API call + UUID of the link to retrieve. + ApiResponse of WorldLink + + + + Find a link by its UUID. + + Thrown when fails to make API call + UUID of the link to retrieve. + Cancellation Token to cancel request (optional) + Task of WorldLink + + + + Find a link by its UUID. + + Thrown when fails to make API call + UUID of the link to retrieve. + Cancellation Token to cancel request (optional) + Task of ApiResponse (WorldLink) + + + + Returns the list of all links defined by the world storage. + + Thrown when fails to make API call + List<WorldLink> + + + + Returns the list of all links defined by the world storage. + + Thrown when fails to make API call + ApiResponse of List<WorldLink> + + + + Returns the list of all links defined by the world storage. + + Thrown when fails to make API call + Cancellation Token to cancel request (optional) + Task of List<WorldLink> + + + + Returns the list of all links defined by the world storage. + + Thrown when fails to make API call + Cancellation Token to cancel request (optional) + Task of ApiResponse (List<WorldLink>) + + Gets or sets the configuration object An instance of the Configuration - + Provides a factory method hook for the creation of exceptions. @@ -1341,6 +2008,93 @@ Initializes a new instance of the class. + + + AttachedObjects + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + A Universally Unique IDentifier identifying the link. (required). + A Universally Unique IDentifier identifying a world anchor or trackable. (required). + A Universally Unique IDentifier identifying a world anchor or trackable. (required). + typeFrom (required). + typeTo (required). + + + + Returns the string presentation of the object + + String presentation of the object + + + + Returns the JSON string presentation of the object + + JSON string presentation of the object + + + + Returns true if objects are equal + + Object to be compared + Boolean + + + + Returns true if AttachedObjects instances are equal + + Instance of AttachedObjects to be compared + Boolean + + + + Gets the hash code + + Hash code + + + + To validate all properties of the instance + + Validation context + Validation Result + + + + Gets or Sets TypeFrom + + + + + Gets or Sets TypeTo + + + + + A Universally Unique IDentifier identifying the link. + + A Universally Unique IDentifier identifying the link. + + + + A Universally Unique IDentifier identifying a world anchor or trackable. + + A Universally Unique IDentifier identifying a world anchor or trackable. + + + + A Universally Unique IDentifier identifying a world anchor or trackable. + + A Universally Unique IDentifier identifying a world anchor or trackable. + EncodingInformationStructure @@ -1355,7 +2109,7 @@ Initializes a new instance of the class. - Identifier of the target framework (required). + Identifier of the target framework. (required). The version of the format (required). @@ -1399,9 +2153,9 @@ - Identifier of the target framework + Identifier of the target framework. - Identifier of the target framework + Identifier of the target framework. @@ -1411,9 +2165,9 @@ - Identifier of the target framework + Identifier of the target framework. - Identifier of the target framework + Identifier of the target framework. @@ -1430,6 +2184,21 @@ Enum ARCORE for value: ARCORE + + + Enum VUFORIA for value: VUFORIA + + + + + Enum ARUCO for value: ARUCO + + + + + Enum OTHER for value: OTHER + + Error @@ -1496,9 +2265,30 @@ Gets or Sets Message + + + Type of a world representaion object. + + Type of a world representaion object. + + + + Enum Trackable for value: Trackable + + + + + Enum WorldAnchor for value: WorldAnchor + + + + + Enum NotIdentified for value: NotIdentified + + - Trackable + An element representing a trackable object in the real world. @@ -1506,19 +2296,20 @@ Initializes a new instance of the class. - + Initializes a new instance of the class. - A Universally Unique IDentifier identifying the trackable (required). - A Universally Unique IDentifier identifying the creator of the trackable (required). - Extensible list of trackable types possibly handled by complient World Storage implementation (required). + An Universally Unique IDentifier identifying the trackable (RFC 4122).. + A human readable name for the trackable. (required). + An Universally Unique IDentifier identifying the creator of the trackable (a person, a team or a company). (required). + Extensible list of trackable types possibly handled by complient World Storage implementation. (required). trackableEncodingInformation (required). The data provided to create the trackable in a specific format handled by the World Storage service. (required). - Coordinate reference system of the trackable, a 4*4 matrix (rowmajor) represented by a float vector. - Unit of length (required). - Bounding box of the Trackable, {width, length, 0} for 2D trackables, {width, length, depth} for 3D trackables (required). - List of additional parameters to be stored with the trackable. (required). + Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. (required). + unit (required). + Size {width, length, depth}. (required). + List of additional parameters to be stored with the object. (required). @@ -1561,27 +2352,32 @@ - Extensible list of trackable types possibly handled by complient World Storage implementation + Extensible list of trackable types possibly handled by complient World Storage implementation. + + Extensible list of trackable types possibly handled by complient World Storage implementation. + + + + Gets or Sets Unit - Extensible list of trackable types possibly handled by complient World Storage implementation - + - Unit of length + An Universally Unique IDentifier identifying the trackable (RFC 4122). - Unit of length + An Universally Unique IDentifier identifying the trackable (RFC 4122). - + - A Universally Unique IDentifier identifying the trackable + A human readable name for the trackable. - A Universally Unique IDentifier identifying the trackable + A human readable name for the trackable. - + - A Universally Unique IDentifier identifying the creator of the trackable + An Universally Unique IDentifier identifying the creator of the trackable (a person, a team or a company). - A Universally Unique IDentifier identifying the creator of the trackable + An Universally Unique IDentifier identifying the creator of the trackable (a person, a team or a company). @@ -1596,27 +2392,27 @@ - Coordinate reference system of the trackable, a 4*4 matrix (rowmajor) represented by a float vector + Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. - Coordinate reference system of the trackable, a 4*4 matrix (rowmajor) represented by a float vector + Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. - + - Bounding box of the Trackable, {width, length, 0} for 2D trackables, {width, length, depth} for 3D trackables + Size {width, length, depth}. - Bounding box of the Trackable, {width, length, 0} for 2D trackables, {width, length, depth} for 3D trackables + Size {width, length, depth}. - + - List of additional parameters to be stored with the trackable. + List of additional parameters to be stored with the object. - List of additional parameters to be stored with the trackable. + List of additional parameters to be stored with the object. - Extensible list of trackable types possibly handled by complient World Storage implementation + Extensible list of trackable types possibly handled by complient World Storage implementation. - Extensible list of trackable types possibly handled by complient World Storage implementation + Extensible list of trackable types possibly handled by complient World Storage implementation. @@ -1633,160 +2429,299 @@ Enum MAP for value: MAP + + + Enum GEOPOSE for value: GEOPOSE + + Enum OTHER for value: OTHER - + - Unit of length + Unit of length. - Unit of length + Unit of length. - + Enum MM for value: MM - + Enum CM for value: CM - + Enum DM for value: DM - + Enum M for value: M - + Enum DAM for value: DAM - + Enum HM for value: HM - + Enum KM for value: KM - + Enum INCH for value: INCH - + Enum FOOT for value: FOOT - + Enum YARD for value: YARD - + Enum MILE for value: MILE - + - TrackableEncodingInformationStructure + An element describing a pose in the world graph. - + - Initializes a new instance of the class. + Initializes a new instance of the class. - + - Initializes a new instance of the class. + Initializes a new instance of the class. - Identifier of the target framework (required). - The version of the format (required). + An Universally Unique IDentifier identifying the world anchor (RFC 4122).. + A human readable name for the world anchor. (required). + An Universally Unique IDentifier identifying the creator of the world anchor. (required). + Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. (required). + unit (required). + Size {width, length, depth}. (required). + List of additional parameters to be stored with the object. (required). - + Returns the string presentation of the object String presentation of the object - + Returns the JSON string presentation of the object JSON string presentation of the object - + Returns true if objects are equal Object to be compared Boolean - + - Returns true if TrackableEncodingInformationStructure instances are equal + Returns true if WorldAnchor instances are equal - Instance of TrackableEncodingInformationStructure to be compared + Instance of WorldAnchor to be compared Boolean - + Gets the hash code Hash code - + To validate all properties of the instance Validation context Validation Result - + - Identifier of the target framework + Gets or Sets Unit - Identifier of the target framework - + - The version of the format + An Universally Unique IDentifier identifying the world anchor (RFC 4122). - The version of the format + An Universally Unique IDentifier identifying the world anchor (RFC 4122). - + - Identifier of the target framework + A human readable name for the world anchor. - Identifier of the target framework + A human readable name for the world anchor. - + - Enum HOLOLENS for value: HOLOLENS + An Universally Unique IDentifier identifying the creator of the world anchor. + An Universally Unique IDentifier identifying the creator of the world anchor. - + - Enum ARKIT for value: ARKIT + Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. + Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. - + - Enum ARCORE for value: ARCORE + Size {width, length, depth}. + + Size {width, length, depth}. + + + + List of additional parameters to be stored with the object. + + List of additional parameters to be stored with the object. + + + + An object holding the info of a transform between two elements. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + An Universally Unique IDentifier identifying the link (RFC 4122).. + An Universally Unique IDentifier identifying the creator of the link. (required). + An Universally Unique IDentifier identifying a world anchor or trackable. (required). + An Universally Unique IDentifier identifying a world anchor or trackable. (required). + typeFrom. + typeTo. + Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. (required). + unit (required). + Size {width, length, depth}. (required). + List of additional parameters to be stored with the object. (required). + + + + Returns the string presentation of the object + + String presentation of the object + + + + Returns the JSON string presentation of the object + + JSON string presentation of the object + + + + Returns true if objects are equal + + Object to be compared + Boolean + + + + Returns true if WorldLink instances are equal + + Instance of WorldLink to be compared + Boolean + + + + Gets the hash code + + Hash code + + + + To validate all properties of the instance + + Validation context + Validation Result + + + + Gets or Sets TypeFrom + + + + + Gets or Sets TypeTo + + + + + Gets or Sets Unit + + + + + An Universally Unique IDentifier identifying the link (RFC 4122). + + An Universally Unique IDentifier identifying the link (RFC 4122). + + + + An Universally Unique IDentifier identifying the creator of the link. + + An Universally Unique IDentifier identifying the creator of the link. + + + + An Universally Unique IDentifier identifying a world anchor or trackable. + + An Universally Unique IDentifier identifying a world anchor or trackable. + + + + An Universally Unique IDentifier identifying a world anchor or trackable. + + An Universally Unique IDentifier identifying a world anchor or trackable. + + + + Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. + + Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. + + + + Size {width, length, depth}. + + Size {width, length, depth}. + + + + List of additional parameters to be stored with the object. + List of additional parameters to be stored with the object. -- GitLab From 14e1e679ed253a6760c78f05fe1250d1a6b86f06 Mon Sep 17 00:00:00 2001 From: Sylvain Renault Date: Tue, 31 May 2022 18:15:12 +0200 Subject: [PATCH 4/8] Refacturing server, user. Changed some folder, script names, namespace... --- Assets/Editor/WorldStorageInfoEditor.cs | 22 +++++++ ...cs.meta => WorldStorageInfoEditor.cs.meta} | 0 Assets/Editor/WorldStorageServerEditor.cs | 18 ------ Assets/Runtime.meta | 8 +++ Assets/Runtime/REST.meta | 8 +++ Assets/Runtime/REST/AdminRequest.cs | 57 +++++++++++++++++ Assets/Runtime/REST/AdminRequest.cs.meta | 11 ++++ Assets/Runtime/REST/TrackableRequest.cs | 64 +++++++++++++++++++ Assets/Runtime/REST/TrackableRequest.cs.meta | 11 ++++ Assets/Runtime/REST/WorldAnchorRequest.cs | 64 +++++++++++++++++++ .../Runtime/REST/WorldAnchorRequest.cs.meta | 11 ++++ Assets/Runtime/WorldStorageInfo.cs | 40 ++++++++++++ Assets/Runtime/WorldStorageInfo.cs.meta | 11 ++++ Assets/Scriptables.meta | 8 +++ Assets/Scriptables/WorldStorageServer.cs | 21 ++++++ Assets/Scriptables/WorldStorageServer.cs.meta | 11 ++++ Assets/Scriptables/WorldStorageUser.cs | 15 +++++ Assets/Scriptables/WorldStorageUser.cs.meta | 11 ++++ package.json | 5 +- 19 files changed, 375 insertions(+), 21 deletions(-) create mode 100644 Assets/Editor/WorldStorageInfoEditor.cs rename Assets/Editor/{WorldStorageServerEditor.cs.meta => WorldStorageInfoEditor.cs.meta} (100%) delete mode 100644 Assets/Editor/WorldStorageServerEditor.cs create mode 100644 Assets/Runtime.meta create mode 100644 Assets/Runtime/REST.meta create mode 100644 Assets/Runtime/REST/AdminRequest.cs create mode 100644 Assets/Runtime/REST/AdminRequest.cs.meta create mode 100644 Assets/Runtime/REST/TrackableRequest.cs create mode 100644 Assets/Runtime/REST/TrackableRequest.cs.meta create mode 100644 Assets/Runtime/REST/WorldAnchorRequest.cs create mode 100644 Assets/Runtime/REST/WorldAnchorRequest.cs.meta create mode 100644 Assets/Runtime/WorldStorageInfo.cs create mode 100644 Assets/Runtime/WorldStorageInfo.cs.meta create mode 100644 Assets/Scriptables.meta create mode 100644 Assets/Scriptables/WorldStorageServer.cs create mode 100644 Assets/Scriptables/WorldStorageServer.cs.meta create mode 100644 Assets/Scriptables/WorldStorageUser.cs create mode 100644 Assets/Scriptables/WorldStorageUser.cs.meta diff --git a/Assets/Editor/WorldStorageInfoEditor.cs b/Assets/Editor/WorldStorageInfoEditor.cs new file mode 100644 index 0000000..b211fd3 --- /dev/null +++ b/Assets/Editor/WorldStorageInfoEditor.cs @@ -0,0 +1,22 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +[CustomEditor(typeof(WorldStorageInfo))] +public class WorldStorageInfoEditor : Editor +{ + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + EditorGUILayout.Space(); + WorldStorageInfo srv = (WorldStorageInfo)target; + + string state = srv.GetServerState(); + EditorGUILayout.LabelField("Server State", state); + + string api = srv.GetAPIVersion(); + EditorGUILayout.LabelField("OpenAPI Version", api); + } +} diff --git a/Assets/Editor/WorldStorageServerEditor.cs.meta b/Assets/Editor/WorldStorageInfoEditor.cs.meta similarity index 100% rename from Assets/Editor/WorldStorageServerEditor.cs.meta rename to Assets/Editor/WorldStorageInfoEditor.cs.meta diff --git a/Assets/Editor/WorldStorageServerEditor.cs b/Assets/Editor/WorldStorageServerEditor.cs deleted file mode 100644 index 0f0a18e..0000000 --- a/Assets/Editor/WorldStorageServerEditor.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEditor; - -[CustomEditor(typeof(WorldStorageServer))] -public class WorldStorageServerEditor : Editor -{ - public override void OnInspectorGUI() - { - base.OnInspectorGUI(); - - EditorGUILayout.Space(); - WorldStorageServer srv = (WorldStorageServer)target; - string api = srv.GetAPIVersion(); - EditorGUILayout.LabelField("Server State", api); - } -} diff --git a/Assets/Runtime.meta b/Assets/Runtime.meta new file mode 100644 index 0000000..4a46a31 --- /dev/null +++ b/Assets/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9f9d2ca3af2d00643b6a16d11277df9a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Runtime/REST.meta b/Assets/Runtime/REST.meta new file mode 100644 index 0000000..4452abe --- /dev/null +++ b/Assets/Runtime/REST.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2d42c05c2b33530478b6ec053f84a09d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Runtime/REST/AdminRequest.cs b/Assets/Runtime/REST/AdminRequest.cs new file mode 100644 index 0000000..8e0e12a --- /dev/null +++ b/Assets/Runtime/REST/AdminRequest.cs @@ -0,0 +1,57 @@ +// +// ETSI (European Telecommunications Standards Institute, referred to as ETSI) +// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) +// (C) 2022 +// +// Development "World Storage", data management, authoring tools +// +// Authors: +// - Sylvain Renault (Fraunhofer HHI) +// +// Date: May 2022 +// + +#define USING_OPENAPI_GENERATOR // alt. is Swagger + +using System.IO; +using System.Collections.Generic; +using UnityEngine; + +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif + +#if UNITY_EDITOR +namespace ETSI.ARF.WorldStorage.REST +{ + public class AdminRequest + { + static public string GetAdminInfo(WorldStorageServer ws) + { + DefaultApi api = new DefaultApi(ws.URI); + string state = api.GetAdmin(); + Debug.Log("Server State: " + state); + return state; + } + + static public string GetVersion(WorldStorageServer ws) + { + DefaultApi api = new DefaultApi(ws.URI); + string vers = api.GetVersion(); + Debug.Log("Using API Version: " + vers); + return vers; + } + + static public string Ping (WorldStorageServer ws) + { + DefaultApi api = new DefaultApi(ws.URI); + api.GetPing(); + return "IsAlive"; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Runtime/REST/AdminRequest.cs.meta b/Assets/Runtime/REST/AdminRequest.cs.meta new file mode 100644 index 0000000..27fcc8f --- /dev/null +++ b/Assets/Runtime/REST/AdminRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0fa015c6a7b3a8e4884833d8f672c20c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Runtime/REST/TrackableRequest.cs b/Assets/Runtime/REST/TrackableRequest.cs new file mode 100644 index 0000000..5af7563 --- /dev/null +++ b/Assets/Runtime/REST/TrackableRequest.cs @@ -0,0 +1,64 @@ +// +// ETSI (European Telecommunications Standards Institute, referred to as ETSI) +// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) +// (C) 2022 +// +// Development "World Storage", data management, authoring tools +// +// Authors: +// - Sylvain Renault (Fraunhofer HHI) +// +// Date: Feb. 2022 +// + +#define USING_OPENAPI_GENERATOR // alt. is Swagger + +using System.IO; +using System.Collections.Generic; +using UnityEngine; + +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif + +#if UNITY_EDITOR +namespace ETSI.ARF.WorldStorage.REST +{ + public class TrackableRequest + { + static public void AddTrackable(WorldStorageServer ws, Trackable trackable) + { + Debug.Log("Posting Add Trackable to Server"); + TrackablesApi api = new TrackablesApi(ws.URI); + string result = api.AddTrackable(trackable); + Debug.Log(result); + } + + static public List GetAllTrackables(WorldStorageServer ws) + { + TrackablesApi api = new TrackablesApi(ws.URI); + List result = api.GetTrackables(); + return result; + } + + static public Trackable GetTrackable(WorldStorageServer ws, string uuid) + { + System.Guid _uuid = System.Guid.Parse(uuid); + TrackablesApi api = new TrackablesApi(ws.URI); + Trackable result = api.GetTrackableById(_uuid); + return result; + } + + static public void DeleteTrackable(WorldStorageServer ws, string uuid) + { + System.Guid _uuid = System.Guid.Parse(uuid); + TrackablesApi api = new TrackablesApi(ws.URI); + api.DeleteTrackable(_uuid); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Runtime/REST/TrackableRequest.cs.meta b/Assets/Runtime/REST/TrackableRequest.cs.meta new file mode 100644 index 0000000..63e45e3 --- /dev/null +++ b/Assets/Runtime/REST/TrackableRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f492e20bc218f884b907369b8eca15a3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Runtime/REST/WorldAnchorRequest.cs b/Assets/Runtime/REST/WorldAnchorRequest.cs new file mode 100644 index 0000000..64dbff8 --- /dev/null +++ b/Assets/Runtime/REST/WorldAnchorRequest.cs @@ -0,0 +1,64 @@ +// +// ETSI (European Telecommunications Standards Institute, referred to as ETSI) +// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) +// (C) 2022 +// +// Development "World Storage", data management, authoring tools +// +// Authors: +// - Sylvain Renault (Fraunhofer HHI) +// +// Date: Feb. 2022 +// + +#define USING_OPENAPI_GENERATOR // alt. is Swagger + +using System.IO; +using System.Collections.Generic; +using UnityEngine; + +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif + +#if UNITY_EDITOR +namespace ETSI.ARF.WorldStorage.REST +{ + public class WorldAnchorRequest + { + static public void AddWorldAnchor(WorldStorageServer ws, WorldAnchor anchor) + { + Debug.Log("Posting Add World Anchor to Server"); + WorldAnchorsApi api = new WorldAnchorsApi(ws.URI); + string result = api.AddWorldAnchor(anchor); + Debug.Log(result); + } + + static public List GetAllWorldAnchors(WorldStorageServer ws) + { + WorldAnchorsApi api = new WorldAnchorsApi(ws.URI); + List result = api.GetWorldAnchors(); + return result; + } + + static public WorldAnchor GetWorldAnchor(WorldStorageServer ws, string uuid) + { + System.Guid _uuid = System.Guid.Parse(uuid); + WorldAnchorsApi api = new WorldAnchorsApi(ws.URI); + WorldAnchor result = api.GetWorldAnchorById(_uuid); + return result; + } + + static public void DeleteWorldAnchor(WorldStorageServer ws, string uuid) + { + System.Guid _uuid = System.Guid.Parse(uuid); + WorldAnchorsApi api = new WorldAnchorsApi(ws.URI); + api.DeleteWorldAnchor(_uuid); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Runtime/REST/WorldAnchorRequest.cs.meta b/Assets/Runtime/REST/WorldAnchorRequest.cs.meta new file mode 100644 index 0000000..77f7b39 --- /dev/null +++ b/Assets/Runtime/REST/WorldAnchorRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb674a7de52fc6d4a822e7d07c1dd294 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Runtime/WorldStorageInfo.cs b/Assets/Runtime/WorldStorageInfo.cs new file mode 100644 index 0000000..533799f --- /dev/null +++ b/Assets/Runtime/WorldStorageInfo.cs @@ -0,0 +1,40 @@ +// +// ETSI (European Telecommunications Standards Institute, referred to as ETSI) +// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) +// (C) 2022 +// +// Development "World Storage", data management, authoring tools +// +// Authors: +// - Sylvain Renault (Fraunhofer HHI) +// +// Date: April 2022 +// + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using ETSI.ARF.WorldStorage; + +public class WorldStorageInfo : MonoBehaviour +{ + public WorldStorageServer worldStorageServer; + + public bool isServerAlive() + { + if (worldStorageServer == null) return false; + return !string.IsNullOrEmpty(ETSI.ARF.WorldStorage.REST.AdminRequest.Ping(worldStorageServer)); + } + + public string GetServerState() + { + if (worldStorageServer == null) return "No Server Defined!"; + return ETSI.ARF.WorldStorage.REST.AdminRequest.GetAdminInfo(worldStorageServer); + } + + public string GetAPIVersion() + { + if (worldStorageServer == null) return "Unknown Version!"; + return ETSI.ARF.WorldStorage.REST.AdminRequest.GetVersion(worldStorageServer); + } +} diff --git a/Assets/Runtime/WorldStorageInfo.cs.meta b/Assets/Runtime/WorldStorageInfo.cs.meta new file mode 100644 index 0000000..925ddd3 --- /dev/null +++ b/Assets/Runtime/WorldStorageInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 02da7adcc65f4694684d71e61d88070b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scriptables.meta b/Assets/Scriptables.meta new file mode 100644 index 0000000..ea6eb7d --- /dev/null +++ b/Assets/Scriptables.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9f7902ce03cc2b2458df8c561ff1f55e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scriptables/WorldStorageServer.cs b/Assets/Scriptables/WorldStorageServer.cs new file mode 100644 index 0000000..ff4e11f --- /dev/null +++ b/Assets/Scriptables/WorldStorageServer.cs @@ -0,0 +1,21 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace ETSI.ARF.WorldStorage +{ + [System.Serializable] + [CreateAssetMenu(fileName = "ARFWorldStorageServer", menuName = "ARF World Storage/Create Server", order = 1)] + public class WorldStorageServer : ScriptableObject + { + [SerializeField] public string serverName = "myServerName"; + [SerializeField] public string basePath = "https://"; + [SerializeField] public int port = 8080; + + [Space(8)] + [SerializeField] public WorldStorageUser user = null; + + public string URI => basePath + ":" + port.ToString(); + } +} \ No newline at end of file diff --git a/Assets/Scriptables/WorldStorageServer.cs.meta b/Assets/Scriptables/WorldStorageServer.cs.meta new file mode 100644 index 0000000..6e5eff8 --- /dev/null +++ b/Assets/Scriptables/WorldStorageServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e4b7be4c33f68d0418c3b4e1a7053d91 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scriptables/WorldStorageUser.cs b/Assets/Scriptables/WorldStorageUser.cs new file mode 100644 index 0000000..fb1dc76 --- /dev/null +++ b/Assets/Scriptables/WorldStorageUser.cs @@ -0,0 +1,15 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace ETSI.ARF.WorldStorage +{ + [System.Serializable] + [CreateAssetMenu(fileName = "ARFWorldStorageUser", menuName = "ARF World Storage/Create User", order = 1)] + public class WorldStorageUser : ScriptableObject + { + [SerializeField] public string userName = "myName"; + [SerializeField] public string UUID = System.Guid.Empty.ToString(); + } +} \ No newline at end of file diff --git a/Assets/Scriptables/WorldStorageUser.cs.meta b/Assets/Scriptables/WorldStorageUser.cs.meta new file mode 100644 index 0000000..149c496 --- /dev/null +++ b/Assets/Scriptables/WorldStorageUser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8a1e3e7961eae84468e6ee20d5b09ffd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json index 9952b13..e3173ed 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,7 @@ "name": "etsi.isg.arf.worldstorage", "version": "0.0.2", "displayName": "ISG-ARF World Storage Package", - "description": "RESTful Wrapper for the World Storage of the Augmented Reality Framework", + "description": "REST Wrapper for the World Storage of the Augmented Reality Framework", "unity": "2020.3", - "dependencies": { }, - "keywords": [ ] + "keywords": [] } \ No newline at end of file -- GitLab From 5af39ec035e505ec7c3729410ff5029c16dfd769 Mon Sep 17 00:00:00 2001 From: Sylvain Renault Date: Wed, 1 Jun 2022 10:56:23 +0200 Subject: [PATCH 5/8] Added licence file. --- LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..369a251 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 ETSI + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -- GitLab From 9b779721e18adf1dab65f07ec4f5a80d7aeac2ad Mon Sep 17 00:00:00 2001 From: Sylvain Renault Date: Wed, 1 Jun 2022 11:11:05 +0200 Subject: [PATCH 6/8] Added licence headers and file. --- Assets/Editor/WorldStorageInfoEditor.cs | 20 +++ Assets/Runtime/REST/AdminRequest.cs | 23 ++- Assets/Runtime/REST/TrackableRequest.cs | 23 ++- Assets/Runtime/REST/WorldAnchorRequest.cs | 23 ++- Assets/Runtime/WorldStorageInfo.cs | 23 ++- Assets/Scriptables/WorldStorageServer.cs | 20 +++ Assets/Scriptables/WorldStorageUser.cs | 20 +++ LICENSE | 201 ++++++++++++++++++++++ LICENSE.meta | 7 + 9 files changed, 328 insertions(+), 32 deletions(-) create mode 100644 LICENSE create mode 100644 LICENSE.meta diff --git a/Assets/Editor/WorldStorageInfoEditor.cs b/Assets/Editor/WorldStorageInfoEditor.cs index b211fd3..834c764 100644 --- a/Assets/Editor/WorldStorageInfoEditor.cs +++ b/Assets/Editor/WorldStorageInfoEditor.cs @@ -1,3 +1,23 @@ +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 +// + using System.Collections; using System.Collections.Generic; using UnityEngine; diff --git a/Assets/Runtime/REST/AdminRequest.cs b/Assets/Runtime/REST/AdminRequest.cs index 8e0e12a..461adca 100644 --- a/Assets/Runtime/REST/AdminRequest.cs +++ b/Assets/Runtime/REST/AdminRequest.cs @@ -1,14 +1,21 @@ // -// ETSI (European Telecommunications Standards Institute, referred to as ETSI) -// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) -// (C) 2022 +// ARF - Augmented Reality Framework (ETSI ISG ARF) // -// Development "World Storage", data management, authoring tools +// Copyright 2022 ETSI // -// Authors: -// - Sylvain Renault (Fraunhofer HHI) -// -// Date: May 2022 +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 // #define USING_OPENAPI_GENERATOR // alt. is Swagger diff --git a/Assets/Runtime/REST/TrackableRequest.cs b/Assets/Runtime/REST/TrackableRequest.cs index 5af7563..f04eacf 100644 --- a/Assets/Runtime/REST/TrackableRequest.cs +++ b/Assets/Runtime/REST/TrackableRequest.cs @@ -1,14 +1,21 @@ // -// ETSI (European Telecommunications Standards Institute, referred to as ETSI) -// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) -// (C) 2022 +// ARF - Augmented Reality Framework (ETSI ISG ARF) // -// Development "World Storage", data management, authoring tools +// Copyright 2022 ETSI // -// Authors: -// - Sylvain Renault (Fraunhofer HHI) -// -// Date: Feb. 2022 +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 // #define USING_OPENAPI_GENERATOR // alt. is Swagger diff --git a/Assets/Runtime/REST/WorldAnchorRequest.cs b/Assets/Runtime/REST/WorldAnchorRequest.cs index 64dbff8..1266383 100644 --- a/Assets/Runtime/REST/WorldAnchorRequest.cs +++ b/Assets/Runtime/REST/WorldAnchorRequest.cs @@ -1,14 +1,21 @@ // -// ETSI (European Telecommunications Standards Institute, referred to as ETSI) -// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) -// (C) 2022 +// ARF - Augmented Reality Framework (ETSI ISG ARF) // -// Development "World Storage", data management, authoring tools +// Copyright 2022 ETSI // -// Authors: -// - Sylvain Renault (Fraunhofer HHI) -// -// Date: Feb. 2022 +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 // #define USING_OPENAPI_GENERATOR // alt. is Swagger diff --git a/Assets/Runtime/WorldStorageInfo.cs b/Assets/Runtime/WorldStorageInfo.cs index 533799f..ff48e80 100644 --- a/Assets/Runtime/WorldStorageInfo.cs +++ b/Assets/Runtime/WorldStorageInfo.cs @@ -1,14 +1,21 @@ // -// ETSI (European Telecommunications Standards Institute, referred to as ETSI) -// ARF - ETSI ISG Augmented Reality Framework (ISG ARF) -// (C) 2022 +// ARF - Augmented Reality Framework (ETSI ISG ARF) // -// Development "World Storage", data management, authoring tools +// Copyright 2022 ETSI // -// Authors: -// - Sylvain Renault (Fraunhofer HHI) -// -// Date: April 2022 +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 // using System.Collections; diff --git a/Assets/Scriptables/WorldStorageServer.cs b/Assets/Scriptables/WorldStorageServer.cs index ff4e11f..125d2e4 100644 --- a/Assets/Scriptables/WorldStorageServer.cs +++ b/Assets/Scriptables/WorldStorageServer.cs @@ -1,3 +1,23 @@ +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 +// + using System.Collections; using System.Collections.Generic; using UnityEngine; diff --git a/Assets/Scriptables/WorldStorageUser.cs b/Assets/Scriptables/WorldStorageUser.cs index fb1dc76..63eb5d0 100644 --- a/Assets/Scriptables/WorldStorageUser.cs +++ b/Assets/Scriptables/WorldStorageUser.cs @@ -1,3 +1,23 @@ +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 +// + using System.Collections; using System.Collections.Generic; using UnityEngine; diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..369a251 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 ETSI + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/LICENSE.meta b/LICENSE.meta new file mode 100644 index 0000000..5709793 --- /dev/null +++ b/LICENSE.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 99185a33197b0004aa5b140e1fdc108f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: -- GitLab From c8406f18a9f789d4cc0eb2ef995d274797ea4051 Mon Sep 17 00:00:00 2001 From: Sylvain Renault Date: Fri, 3 Jun 2022 09:49:44 +0200 Subject: [PATCH 7/8] Use now API v1.0.0 Changes in element interface. Added world link functions. --- Assets/Runtime/REST/TrackableRequest.cs | 12 +- Assets/Runtime/REST/WorldAnchorRequest.cs | 12 +- Assets/Runtime/REST/WorldLinkRequest.cs | 81 ++ Assets/Runtime/REST/WorldLinkRequest.cs.meta | 11 + Assets/Scriptables/WorldStorageServer.cs | 3 +- Assets/Scriptables/WorldStorageUser.cs | 1 + Plugins/Org.OpenAPITools.dll | Bin 111104 -> 121856 bytes Plugins/Org.OpenAPITools.xml | 825 ++++++++++++------- 8 files changed, 646 insertions(+), 299 deletions(-) create mode 100644 Assets/Runtime/REST/WorldLinkRequest.cs create mode 100644 Assets/Runtime/REST/WorldLinkRequest.cs.meta diff --git a/Assets/Runtime/REST/TrackableRequest.cs b/Assets/Runtime/REST/TrackableRequest.cs index f04eacf..df1c382 100644 --- a/Assets/Runtime/REST/TrackableRequest.cs +++ b/Assets/Runtime/REST/TrackableRequest.cs @@ -37,12 +37,22 @@ namespace ETSI.ARF.WorldStorage.REST { public class TrackableRequest { - static public void AddTrackable(WorldStorageServer ws, Trackable trackable) + static public string AddTrackable(WorldStorageServer ws, Trackable trackable) { Debug.Log("Posting Add Trackable to Server"); TrackablesApi api = new TrackablesApi(ws.URI); string result = api.AddTrackable(trackable); Debug.Log(result); + return result; + } + + static public string UpdateTrackable(WorldStorageServer ws, Trackable trackable) + { + Debug.Log("Posting Add Trackable to Server"); + TrackablesApi api = new TrackablesApi(ws.URI); + string result = api.ModifyTrackable(trackable); + Debug.Log(result); + return result; } static public List GetAllTrackables(WorldStorageServer ws) diff --git a/Assets/Runtime/REST/WorldAnchorRequest.cs b/Assets/Runtime/REST/WorldAnchorRequest.cs index 1266383..23377aa 100644 --- a/Assets/Runtime/REST/WorldAnchorRequest.cs +++ b/Assets/Runtime/REST/WorldAnchorRequest.cs @@ -37,12 +37,22 @@ namespace ETSI.ARF.WorldStorage.REST { public class WorldAnchorRequest { - static public void AddWorldAnchor(WorldStorageServer ws, WorldAnchor anchor) + static public string AddWorldAnchor(WorldStorageServer ws, WorldAnchor anchor) { Debug.Log("Posting Add World Anchor to Server"); WorldAnchorsApi api = new WorldAnchorsApi(ws.URI); string result = api.AddWorldAnchor(anchor); Debug.Log(result); + return result; + } + + static public string UpdateWorldAnchor(WorldStorageServer ws, WorldAnchor anchor) + { + Debug.Log("Posting Add World Anchor to Server"); + WorldAnchorsApi api = new WorldAnchorsApi(ws.URI); + string result = api.ModifyWorldAnchor(anchor); + Debug.Log(result); + return result; } static public List GetAllWorldAnchors(WorldStorageServer ws) diff --git a/Assets/Runtime/REST/WorldLinkRequest.cs b/Assets/Runtime/REST/WorldLinkRequest.cs new file mode 100644 index 0000000..3dd1c67 --- /dev/null +++ b/Assets/Runtime/REST/WorldLinkRequest.cs @@ -0,0 +1,81 @@ +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 +// + +#define USING_OPENAPI_GENERATOR // alt. is Swagger + +using System.IO; +using System.Collections.Generic; +using UnityEngine; + +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif + +#if UNITY_EDITOR +namespace ETSI.ARF.WorldStorage.REST +{ + public class WorldLinkRequest + { + static public string AddWorldLink(WorldStorageServer ws, WorldLink link) + { + Debug.Log("Posting Add Trackable to Server"); + WorldLinksApi api = new WorldLinksApi(ws.URI); + string result = api.AddWorldLink(link); + Debug.Log(result); + return result; + } + + static public string UpdateWorldLink(WorldStorageServer ws, WorldLink link) + { + Debug.Log("Posting Add Trackable to Server"); + WorldLinksApi api = new WorldLinksApi(ws.URI); + string result = api.ModifyWorldLink(link); + Debug.Log(result); + return result; + } + + static public List GetAllWorldLinks(WorldStorageServer ws) + { + WorldLinksApi api = new WorldLinksApi(ws.URI); + List result = api.GetWorldLinks(); + return result; + } + + static public WorldLink GetWorldLink(WorldStorageServer ws, string uuid) + { + System.Guid _uuid = System.Guid.Parse(uuid); + WorldLinksApi api = new WorldLinksApi(ws.URI); + WorldLink result = api.GetWorldLinkById(_uuid); + return result; + } + + static public void DeleteWorldLink(WorldStorageServer ws, string uuid) + { + System.Guid _uuid = System.Guid.Parse(uuid); + WorldLinksApi api = new WorldLinksApi(ws.URI); + api.DeleteWorldLink(_uuid); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Runtime/REST/WorldLinkRequest.cs.meta b/Assets/Runtime/REST/WorldLinkRequest.cs.meta new file mode 100644 index 0000000..a4f3a5c --- /dev/null +++ b/Assets/Runtime/REST/WorldLinkRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d17b7a1eac66b74ea32aac83c01aa2f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scriptables/WorldStorageServer.cs b/Assets/Scriptables/WorldStorageServer.cs index 125d2e4..db34de9 100644 --- a/Assets/Scriptables/WorldStorageServer.cs +++ b/Assets/Scriptables/WorldStorageServer.cs @@ -30,11 +30,12 @@ namespace ETSI.ARF.WorldStorage public class WorldStorageServer : ScriptableObject { [SerializeField] public string serverName = "myServerName"; + [SerializeField] public string company = ""; [SerializeField] public string basePath = "https://"; [SerializeField] public int port = 8080; [Space(8)] - [SerializeField] public WorldStorageUser user = null; + [SerializeField] public WorldStorageUser currentUser = null; public string URI => basePath + ":" + port.ToString(); } diff --git a/Assets/Scriptables/WorldStorageUser.cs b/Assets/Scriptables/WorldStorageUser.cs index 63eb5d0..4222734 100644 --- a/Assets/Scriptables/WorldStorageUser.cs +++ b/Assets/Scriptables/WorldStorageUser.cs @@ -30,6 +30,7 @@ namespace ETSI.ARF.WorldStorage public class WorldStorageUser : ScriptableObject { [SerializeField] public string userName = "myName"; + [SerializeField] public string company = ""; [SerializeField] public string UUID = System.Guid.Empty.ToString(); } } \ No newline at end of file diff --git a/Plugins/Org.OpenAPITools.dll b/Plugins/Org.OpenAPITools.dll index 2d8e9a48156b8af39c42ce96591c388fa84686d6..9e73e0e532bec5b9563dc4dd0168f8a7df8fcc22 100644 GIT binary patch literal 121856 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 QXY&o@@jprbztzD11B(=lu>b%7 diff --git a/Plugins/Org.OpenAPITools.xml b/Plugins/Org.OpenAPITools.xml index 548779e..748dfe1 100644 --- a/Plugins/Org.OpenAPITools.xml +++ b/Plugins/Org.OpenAPITools.xml @@ -53,23 +53,23 @@

      - Test the server availability + Test the server availability. Thrown when fails to make API call - + string - Test the server availability + Test the server availability. Thrown when fails to make API call - ApiResponse of Object(void) + ApiResponse of string @@ -115,25 +115,25 @@ - Test the server availability + Test the server availability. Thrown when fails to make API call Cancellation Token to cancel request (optional) - Task of void + Task of string - Test the server availability + Test the server availability. Thrown when fails to make API call Cancellation Token to cancel request (optional) - Task of ApiResponse + Task of ApiResponse (string) @@ -240,33 +240,33 @@ - Test the server availability + Test the server availability. Thrown when fails to make API call - + string - Test the server availability + Test the server availability. Thrown when fails to make API call - ApiResponse of Object(void) + ApiResponse of string - Test the server availability + Test the server availability. Thrown when fails to make API call Cancellation Token to cancel request (optional) - Task of void + Task of string - Test the server availability + Test the server availability. Thrown when fails to make API call Cancellation Token to cancel request (optional) - Task of ApiResponse + Task of ApiResponse (string) @@ -316,168 +316,190 @@ - Create a trackable. + Create a Trackable. - + Create a new Trackable from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created Trackable. Thrown when fails to make API call - The trackable to be added to the world storage. + The Trackable to be added to the world storage. string - Create a trackable. + Create a Trackable. - + Create a new Trackable from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created Trackable. Thrown when fails to make API call - The trackable to be added to the world storage. + The Trackable to be added to the world storage. ApiResponse of string - Deletes a trackable. + Delete a Trackable. - + Delete a single Trackable stored in the world storage from its ID. Thrown when fails to make API call Trackable UUID to delete. - + string - Deletes a trackable. + Delete a Trackable. - + Delete a single Trackable stored in the world storage from its ID. Thrown when fails to make API call Trackable UUID to delete. - ApiResponse of Object(void) + ApiResponse of string - Find a trackable by its UUID. + Find a Trackable by its UUID. - + Get a single Trackable stored in the world storage from its ID. Thrown when fails to make API call - UUID of the trackable to retrieve. + UUID of the Trackable to retrieve. Trackable - Find a trackable by its UUID. + Find a Trackable by its UUID. - + Get a single Trackable stored in the world storage from its ID. Thrown when fails to make API call - UUID of the trackable to retrieve. + UUID of the Trackable to retrieve. ApiResponse of Trackable - Returns the list of all trackables defined by the world storage. + Return all the Trackables. - + Get all the Trackables currently being stored in the world storage. Thrown when fails to make API call List<Trackable> - Returns the list of all trackables defined by the world storage. + Return all the Trackables. - + Get all the Trackables currently being stored in the world storage. Thrown when fails to make API call ApiResponse of List<Trackable> + + + Modify a Trackable. + + + Modify an existing Trackable given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The Trackable to be modified in the world storage. + string + + + + Modify a Trackable. + + + Modify an existing Trackable given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The Trackable to be modified in the world storage. + ApiResponse of string + - Create a trackable. + Create a Trackable. - + Create a new Trackable from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created Trackable. Thrown when fails to make API call - The trackable to be added to the world storage. + The Trackable to be added to the world storage. Cancellation Token to cancel request (optional) Task of string - Create a trackable. + Create a Trackable. - + Create a new Trackable from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created Trackable. Thrown when fails to make API call - The trackable to be added to the world storage. + The Trackable to be added to the world storage. Cancellation Token to cancel request (optional) Task of ApiResponse (string) - Deletes a trackable. + Delete a Trackable. - + Delete a single Trackable stored in the world storage from its ID. Thrown when fails to make API call Trackable UUID to delete. Cancellation Token to cancel request (optional) - Task of void + Task of string - Deletes a trackable. + Delete a Trackable. - + Delete a single Trackable stored in the world storage from its ID. Thrown when fails to make API call Trackable UUID to delete. Cancellation Token to cancel request (optional) - Task of ApiResponse + Task of ApiResponse (string) - Find a trackable by its UUID. + Find a Trackable by its UUID. - + Get a single Trackable stored in the world storage from its ID. Thrown when fails to make API call - UUID of the trackable to retrieve. + UUID of the Trackable to retrieve. Cancellation Token to cancel request (optional) Task of Trackable - Find a trackable by its UUID. + Find a Trackable by its UUID. - + Get a single Trackable stored in the world storage from its ID. Thrown when fails to make API call - UUID of the trackable to retrieve. + UUID of the Trackable to retrieve. Cancellation Token to cancel request (optional) Task of ApiResponse (Trackable) - Returns the list of all trackables defined by the world storage. + Return all the Trackables. - + Get all the Trackables currently being stored in the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) @@ -485,15 +507,39 @@ - Returns the list of all trackables defined by the world storage. + Return all the Trackables. - + Get all the Trackables currently being stored in the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) Task of ApiResponse (List<Trackable>) + + + Modify a Trackable. + + + Modify an existing Trackable given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The Trackable to be modified in the world storage. + Cancellation Token to cancel request (optional) + Task of string + + + + Modify a Trackable. + + + Modify an existing Trackable given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The Trackable to be modified in the world storage. + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + Represents a collection of functions to interact with the API endpoints @@ -547,123 +593,123 @@ - Create a trackable. + Create a Trackable. Create a new Trackable from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created Trackable. Thrown when fails to make API call - The trackable to be added to the world storage. + The Trackable to be added to the world storage. string - Create a trackable. + Create a Trackable. Create a new Trackable from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created Trackable. Thrown when fails to make API call - The trackable to be added to the world storage. + The Trackable to be added to the world storage. ApiResponse of string - Create a trackable. + Create a Trackable. Create a new Trackable from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created Trackable. Thrown when fails to make API call - The trackable to be added to the world storage. + The Trackable to be added to the world storage. Cancellation Token to cancel request (optional) Task of string - Create a trackable. + Create a Trackable. Create a new Trackable from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created Trackable. Thrown when fails to make API call - The trackable to be added to the world storage. + The Trackable to be added to the world storage. Cancellation Token to cancel request (optional) Task of ApiResponse (string) - Deletes a trackable. + Delete a Trackable. Delete a single Trackable stored in the world storage from its ID. Thrown when fails to make API call Trackable UUID to delete. - + string - Deletes a trackable. + Delete a Trackable. Delete a single Trackable stored in the world storage from its ID. Thrown when fails to make API call Trackable UUID to delete. - ApiResponse of Object(void) + ApiResponse of string - Deletes a trackable. + Delete a Trackable. Delete a single Trackable stored in the world storage from its ID. Thrown when fails to make API call Trackable UUID to delete. Cancellation Token to cancel request (optional) - Task of void + Task of string - Deletes a trackable. + Delete a Trackable. Delete a single Trackable stored in the world storage from its ID. Thrown when fails to make API call Trackable UUID to delete. Cancellation Token to cancel request (optional) - Task of ApiResponse + Task of ApiResponse (string) - Find a trackable by its UUID. + Find a Trackable by its UUID. Get a single Trackable stored in the world storage from its ID. Thrown when fails to make API call - UUID of the trackable to retrieve. + UUID of the Trackable to retrieve. Trackable - Find a trackable by its UUID. + Find a Trackable by its UUID. Get a single Trackable stored in the world storage from its ID. Thrown when fails to make API call - UUID of the trackable to retrieve. + UUID of the Trackable to retrieve. ApiResponse of Trackable - Find a trackable by its UUID. + Find a Trackable by its UUID. Get a single Trackable stored in the world storage from its ID. Thrown when fails to make API call - UUID of the trackable to retrieve. + UUID of the Trackable to retrieve. Cancellation Token to cancel request (optional) Task of Trackable - Find a trackable by its UUID. + Find a Trackable by its UUID. Get a single Trackable stored in the world storage from its ID. Thrown when fails to make API call - UUID of the trackable to retrieve. + UUID of the Trackable to retrieve. Cancellation Token to cancel request (optional) Task of ApiResponse (Trackable) - Returns the list of all trackables defined by the world storage. + Return all the Trackables. Get all the Trackables currently being stored in the world storage. Thrown when fails to make API call List<Trackable> - Returns the list of all trackables defined by the world storage. + Return all the Trackables. Get all the Trackables currently being stored in the world storage. Thrown when fails to make API call ApiResponse of List<Trackable> - Returns the list of all trackables defined by the world storage. + Return all the Trackables. Get all the Trackables currently being stored in the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) @@ -671,12 +717,46 @@ - Returns the list of all trackables defined by the world storage. + Return all the Trackables. Get all the Trackables currently being stored in the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) Task of ApiResponse (List<Trackable>) + + + Modify a Trackable. Modify an existing Trackable given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The Trackable to be modified in the world storage. + string + + + + Modify a Trackable. Modify an existing Trackable given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The Trackable to be modified in the world storage. + ApiResponse of string + + + + Modify a Trackable. Modify an existing Trackable given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The Trackable to be modified in the world storage. + Cancellation Token to cancel request (optional) + Task of string + + + + Modify a Trackable. Modify an existing Trackable given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The Trackable to be modified in the world storage. + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + Gets or sets the configuration object @@ -695,168 +775,190 @@ - Create a world anchor. + Create a World Anchor. - + Create a new World Anchor from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Anchor. Thrown when fails to make API call - The world anchor to be added to the world storage. + The World Anchor to be added to the world storage. string - Create a world anchor. + Create a World Anchor. - + Create a new World Anchor from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Anchor. Thrown when fails to make API call - The world anchor to be added to the world storage. + The World Anchor to be added to the world storage. ApiResponse of string - Deletes a world anchor. + Delete a World Anchor. - + Delete a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - World anchor UUID to delete. - + World Anchor UUID to delete. + string - Deletes a world anchor. + Delete a World Anchor. - + Delete a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - World anchor UUID to delete. - ApiResponse of Object(void) + World Anchor UUID to delete. + ApiResponse of string - Find a world anchor by its UUID. + Find a World Anchor by its UUID. - + Get a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - UUID of the world anchor to retrieve. + UUID of the World Anchor to retrieve. WorldAnchor - Find a world anchor by its UUID. + Find a World Anchor by its UUID. - + Get a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - UUID of the world anchor to retrieve. + UUID of the World Anchor to retrieve. ApiResponse of WorldAnchor - Returns the list of all world anchors defined by the world storage. + Return all the World Anchors. - + Get all the World Anchors currently being stored in the world storage. Thrown when fails to make API call List<WorldAnchor> - Returns the list of all world anchors defined by the world storage. + Return all the World Anchors. - + Get all the World Anchors currently being stored in the world storage. Thrown when fails to make API call ApiResponse of List<WorldAnchor> + + + Modify a World Anchor. + + + Modify an existing World Anchor given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Anchor to be modified in the world storage. + string + + + + Modify a World Anchor. + + + Modify an existing World Anchor given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Anchor to be modified in the world storage. + ApiResponse of string + - Create a world anchor. + Create a World Anchor. - + Create a new World Anchor from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Anchor. Thrown when fails to make API call - The world anchor to be added to the world storage. + The World Anchor to be added to the world storage. Cancellation Token to cancel request (optional) Task of string - Create a world anchor. + Create a World Anchor. - + Create a new World Anchor from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Anchor. Thrown when fails to make API call - The world anchor to be added to the world storage. + The World Anchor to be added to the world storage. Cancellation Token to cancel request (optional) Task of ApiResponse (string) - Deletes a world anchor. + Delete a World Anchor. - + Delete a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - World anchor UUID to delete. + World Anchor UUID to delete. Cancellation Token to cancel request (optional) - Task of void + Task of string - Deletes a world anchor. + Delete a World Anchor. - + Delete a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - World anchor UUID to delete. + World Anchor UUID to delete. Cancellation Token to cancel request (optional) - Task of ApiResponse + Task of ApiResponse (string) - Find a world anchor by its UUID. + Find a World Anchor by its UUID. - + Get a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - UUID of the world anchor to retrieve. + UUID of the World Anchor to retrieve. Cancellation Token to cancel request (optional) Task of WorldAnchor - Find a world anchor by its UUID. + Find a World Anchor by its UUID. - + Get a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - UUID of the world anchor to retrieve. + UUID of the World Anchor to retrieve. Cancellation Token to cancel request (optional) Task of ApiResponse (WorldAnchor) - Returns the list of all world anchors defined by the world storage. + Return all the World Anchors. - + Get all the World Anchors currently being stored in the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) @@ -864,15 +966,39 @@ - Returns the list of all world anchors defined by the world storage. + Return all the World Anchors. - + Get all the World Anchors currently being stored in the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) Task of ApiResponse (List<WorldAnchor>) + + + Modify a World Anchor. + + + Modify an existing World Anchor given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Anchor to be modified in the world storage. + Cancellation Token to cancel request (optional) + Task of string + + + + Modify a World Anchor. + + + Modify an existing World Anchor given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Anchor to be modified in the world storage. + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + Represents a collection of functions to interact with the API endpoints @@ -926,123 +1052,123 @@ - Create a world anchor. + Create a World Anchor. Create a new World Anchor from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Anchor. Thrown when fails to make API call - The world anchor to be added to the world storage. + The World Anchor to be added to the world storage. string - Create a world anchor. + Create a World Anchor. Create a new World Anchor from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Anchor. Thrown when fails to make API call - The world anchor to be added to the world storage. + The World Anchor to be added to the world storage. ApiResponse of string - Create a world anchor. + Create a World Anchor. Create a new World Anchor from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Anchor. Thrown when fails to make API call - The world anchor to be added to the world storage. + The World Anchor to be added to the world storage. Cancellation Token to cancel request (optional) Task of string - Create a world anchor. + Create a World Anchor. Create a new World Anchor from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Anchor. Thrown when fails to make API call - The world anchor to be added to the world storage. + The World Anchor to be added to the world storage. Cancellation Token to cancel request (optional) Task of ApiResponse (string) - Deletes a world anchor. + Delete a World Anchor. Delete a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - World anchor UUID to delete. - + World Anchor UUID to delete. + string - Deletes a world anchor. + Delete a World Anchor. Delete a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - World anchor UUID to delete. - ApiResponse of Object(void) + World Anchor UUID to delete. + ApiResponse of string - Deletes a world anchor. + Delete a World Anchor. Delete a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - World anchor UUID to delete. + World Anchor UUID to delete. Cancellation Token to cancel request (optional) - Task of void + Task of string - Deletes a world anchor. + Delete a World Anchor. Delete a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - World anchor UUID to delete. + World Anchor UUID to delete. Cancellation Token to cancel request (optional) - Task of ApiResponse + Task of ApiResponse (string) - Find a world anchor by its UUID. + Find a World Anchor by its UUID. Get a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - UUID of the world anchor to retrieve. + UUID of the World Anchor to retrieve. WorldAnchor - Find a world anchor by its UUID. + Find a World Anchor by its UUID. Get a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - UUID of the world anchor to retrieve. + UUID of the World Anchor to retrieve. ApiResponse of WorldAnchor - Find a world anchor by its UUID. + Find a World Anchor by its UUID. Get a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - UUID of the world anchor to retrieve. + UUID of the World Anchor to retrieve. Cancellation Token to cancel request (optional) Task of WorldAnchor - Find a world anchor by its UUID. + Find a World Anchor by its UUID. Get a single World Anchor stored in the world storage from its ID. Thrown when fails to make API call - UUID of the world anchor to retrieve. + UUID of the World Anchor to retrieve. Cancellation Token to cancel request (optional) Task of ApiResponse (WorldAnchor) - Returns the list of all world anchors defined by the world storage. + Return all the World Anchors. Get all the World Anchors currently being stored in the world storage. Thrown when fails to make API call List<WorldAnchor> - Returns the list of all world anchors defined by the world storage. + Return all the World Anchors. Get all the World Anchors currently being stored in the world storage. Thrown when fails to make API call ApiResponse of List<WorldAnchor> - Returns the list of all world anchors defined by the world storage. + Return all the World Anchors. Get all the World Anchors currently being stored in the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) @@ -1050,12 +1176,46 @@ - Returns the list of all world anchors defined by the world storage. + Return all the World Anchors. Get all the World Anchors currently being stored in the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) Task of ApiResponse (List<WorldAnchor>) + + + Modify a World Anchor. Modify an existing World Anchor given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Anchor to be modified in the world storage. + string + + + + Modify a World Anchor. Modify an existing World Anchor given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Anchor to be modified in the world storage. + ApiResponse of string + + + + Modify a World Anchor. Modify an existing World Anchor given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Anchor to be modified in the world storage. + Cancellation Token to cancel request (optional) + Task of string + + + + Modify a World Anchor. Modify an existing World Anchor given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Anchor to be modified in the world storage. + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + Gets or sets the configuration object @@ -1074,10 +1234,10 @@ - Create a link between world anchors and trackables. + Create a World Link between elements (world anchors and/or trackables). - + Create a new World Link from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Link. Thrown when fails to make API call The link to be added to the world storage. @@ -1085,10 +1245,10 @@ - Create a link between world anchors and trackables. + Create a World Link between elements (world anchors and/or trackables). - + Create a new World Link from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Link. Thrown when fails to make API call The link to be added to the world storage. @@ -1096,74 +1256,96 @@ - Deletes a worldLink. + Delete a World Link. - + Delete a single World Link stored in the world storage from its ID. Thrown when fails to make API call - link id to delete - + World Link id to delete. + string - Deletes a worldLink. + Delete a World Link. - + Delete a single World Link stored in the world storage from its ID. Thrown when fails to make API call - link id to delete - ApiResponse of Object(void) + World Link id to delete. + ApiResponse of string - Find a link by its UUID. + Find a World Link by its UUID. - + Get a single World Link stored in the world storage from its ID. Thrown when fails to make API call - UUID of the link to retrieve. + UUID of the World Link to retrieve. WorldLink - Find a link by its UUID. + Find a World Link by its UUID. - + Get a single World Link stored in the world storage from its ID. Thrown when fails to make API call - UUID of the link to retrieve. + UUID of the World Link to retrieve. ApiResponse of WorldLink - Returns the list of all links defined by the world storage. + Return all World Links. - + Get all the World Links currently being stored in the world storage. Thrown when fails to make API call List<WorldLink> - Returns the list of all links defined by the world storage. + Return all World Links. - + Get all the World Links currently being stored in the world storage. Thrown when fails to make API call ApiResponse of List<WorldLink> + + + Modify a World Link. + + + Modify an existing World Link given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Link to be modified in the world storage. + string + + + + Modify a World Link. + + + Modify an existing World Link given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Link to be modified in the world storage. + ApiResponse of string + - Create a link between world anchors and trackables. + Create a World Link between elements (world anchors and/or trackables). - + Create a new World Link from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Link. Thrown when fails to make API call The link to be added to the world storage. @@ -1172,10 +1354,10 @@ - Create a link between world anchors and trackables. + Create a World Link between elements (world anchors and/or trackables). - + Create a new World Link from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Link. Thrown when fails to make API call The link to be added to the world storage. @@ -1184,58 +1366,58 @@ - Deletes a worldLink. + Delete a World Link. - + Delete a single World Link stored in the world storage from its ID. Thrown when fails to make API call - link id to delete + World Link id to delete. Cancellation Token to cancel request (optional) - Task of void + Task of string - Deletes a worldLink. + Delete a World Link. - + Delete a single World Link stored in the world storage from its ID. Thrown when fails to make API call - link id to delete + World Link id to delete. Cancellation Token to cancel request (optional) - Task of ApiResponse + Task of ApiResponse (string) - Find a link by its UUID. + Find a World Link by its UUID. - + Get a single World Link stored in the world storage from its ID. Thrown when fails to make API call - UUID of the link to retrieve. + UUID of the World Link to retrieve. Cancellation Token to cancel request (optional) Task of WorldLink - Find a link by its UUID. + Find a World Link by its UUID. - + Get a single World Link stored in the world storage from its ID. Thrown when fails to make API call - UUID of the link to retrieve. + UUID of the World Link to retrieve. Cancellation Token to cancel request (optional) Task of ApiResponse (WorldLink) - Returns the list of all links defined by the world storage. + Return all World Links. - + Get all the World Links currently being stored in the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) @@ -1243,15 +1425,39 @@ - Returns the list of all links defined by the world storage. + Return all World Links. - + Get all the World Links currently being stored in the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) Task of ApiResponse (List<WorldLink>) + + + Modify a World Link. + + + Modify an existing World Link given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Link to be modified in the world storage. + Cancellation Token to cancel request (optional) + Task of string + + + + Modify a World Link. + + + Modify an existing World Link given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Link to be modified in the world storage. + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + Represents a collection of functions to interact with the API endpoints @@ -1305,7 +1511,7 @@ - Create a link between world anchors and trackables. + Create a World Link between elements (world anchors and/or trackables). Create a new World Link from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Link. Thrown when fails to make API call The link to be added to the world storage. @@ -1313,7 +1519,7 @@ - Create a link between world anchors and trackables. + Create a World Link between elements (world anchors and/or trackables). Create a new World Link from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Link. Thrown when fails to make API call The link to be added to the world storage. @@ -1321,7 +1527,7 @@ - Create a link between world anchors and trackables. + Create a World Link between elements (world anchors and/or trackables). Create a new World Link from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Link. Thrown when fails to make API call The link to be added to the world storage. @@ -1330,7 +1536,7 @@ - Create a link between world anchors and trackables. + Create a World Link between elements (world anchors and/or trackables). Create a new World Link from a json object containing all the required informations and add it to the world storage. <br>As a result you will get the ID of the newly created World Link. Thrown when fails to make API call The link to be added to the world storage. @@ -1339,89 +1545,89 @@ - Deletes a worldLink. + Delete a World Link. Delete a single World Link stored in the world storage from its ID. Thrown when fails to make API call - link id to delete - + World Link id to delete. + string - Deletes a worldLink. + Delete a World Link. Delete a single World Link stored in the world storage from its ID. Thrown when fails to make API call - link id to delete - ApiResponse of Object(void) + World Link id to delete. + ApiResponse of string - Deletes a worldLink. + Delete a World Link. Delete a single World Link stored in the world storage from its ID. Thrown when fails to make API call - link id to delete + World Link id to delete. Cancellation Token to cancel request (optional) - Task of void + Task of string - Deletes a worldLink. + Delete a World Link. Delete a single World Link stored in the world storage from its ID. Thrown when fails to make API call - link id to delete + World Link id to delete. Cancellation Token to cancel request (optional) - Task of ApiResponse + Task of ApiResponse (string) - Find a link by its UUID. + Find a World Link by its UUID. Get a single World Link stored in the world storage from its ID. Thrown when fails to make API call - UUID of the link to retrieve. + UUID of the World Link to retrieve. WorldLink - Find a link by its UUID. + Find a World Link by its UUID. Get a single World Link stored in the world storage from its ID. Thrown when fails to make API call - UUID of the link to retrieve. + UUID of the World Link to retrieve. ApiResponse of WorldLink - Find a link by its UUID. + Find a World Link by its UUID. Get a single World Link stored in the world storage from its ID. Thrown when fails to make API call - UUID of the link to retrieve. + UUID of the World Link to retrieve. Cancellation Token to cancel request (optional) Task of WorldLink - Find a link by its UUID. + Find a World Link by its UUID. Get a single World Link stored in the world storage from its ID. Thrown when fails to make API call - UUID of the link to retrieve. + UUID of the World Link to retrieve. Cancellation Token to cancel request (optional) Task of ApiResponse (WorldLink) - Returns the list of all links defined by the world storage. + Return all World Links. Get all the World Links currently being stored in the world storage. Thrown when fails to make API call List<WorldLink> - Returns the list of all links defined by the world storage. + Return all World Links. Get all the World Links currently being stored in the world storage. Thrown when fails to make API call ApiResponse of List<WorldLink> - Returns the list of all links defined by the world storage. + Return all World Links. Get all the World Links currently being stored in the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) @@ -1429,12 +1635,46 @@ - Returns the list of all links defined by the world storage. + Return all World Links. Get all the World Links currently being stored in the world storage. Thrown when fails to make API call Cancellation Token to cancel request (optional) Task of ApiResponse (List<WorldLink>) + + + Modify a World Link. Modify an existing World Link given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Link to be modified in the world storage. + string + + + + Modify a World Link. Modify an existing World Link given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Link to be modified in the world storage. + ApiResponse of string + + + + Modify a World Link. Modify an existing World Link given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Link to be modified in the world storage. + Cancellation Token to cancel request (optional) + Task of string + + + + Modify a World Link. Modify an existing World Link given a json object containing all the required informations. <br> **Please note that ID of the object is required in the JSON** + + Thrown when fails to make API call + The World Link to be modified in the world storage. + Cancellation Token to cancel request (optional) + Task of ApiResponse (string) + Gets or sets the configuration object @@ -2097,7 +2337,7 @@ - EncodingInformationStructure + An object holding the info of a Trackable`'`s encoding informations `:` the data format and the version. @@ -2288,7 +2528,7 @@ - An element representing a trackable object in the real world. + An element representing a Trackable object in the real world. @@ -2300,15 +2540,15 @@ Initializes a new instance of the class. - An Universally Unique IDentifier identifying the trackable (RFC 4122).. - A human readable name for the trackable. (required). - An Universally Unique IDentifier identifying the creator of the trackable (a person, a team or a company). (required). - Extensible list of trackable types possibly handled by complient World Storage implementation. (required). + An Universally Unique IDentifier identifying the Trackable (RFC 4122).. + A human readable name for the Trackable. (required). + An Universally Unique IDentifier identifying the creator of the Trackable (a person, a team or a company). (required). + Extensible list of Trackable types, possibly handled by complient world storage implementation. (required). trackableEncodingInformation (required). - The data provided to create the trackable in a specific format handled by the World Storage service. (required). + The data provided to create the Trackable in a specific format handled by the world storage service. (required). Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. (required). unit (required). - Size {width, length, depth}. (required). + Size object in format {width, length, depth}. (required). List of additional parameters to be stored with the object. (required). @@ -2352,9 +2592,9 @@ - Extensible list of trackable types possibly handled by complient World Storage implementation. + Extensible list of Trackable types, possibly handled by complient world storage implementation. - Extensible list of trackable types possibly handled by complient World Storage implementation. + Extensible list of Trackable types, possibly handled by complient world storage implementation. @@ -2363,21 +2603,21 @@ - An Universally Unique IDentifier identifying the trackable (RFC 4122). + An Universally Unique IDentifier identifying the Trackable (RFC 4122). - An Universally Unique IDentifier identifying the trackable (RFC 4122). + An Universally Unique IDentifier identifying the Trackable (RFC 4122). - A human readable name for the trackable. + A human readable name for the Trackable. - A human readable name for the trackable. + A human readable name for the Trackable. - An Universally Unique IDentifier identifying the creator of the trackable (a person, a team or a company). + An Universally Unique IDentifier identifying the creator of the Trackable (a person, a team or a company). - An Universally Unique IDentifier identifying the creator of the trackable (a person, a team or a company). + An Universally Unique IDentifier identifying the creator of the Trackable (a person, a team or a company). @@ -2386,9 +2626,9 @@ - The data provided to create the trackable in a specific format handled by the World Storage service. + The data provided to create the Trackable in a specific format handled by the world storage service. - The data provided to create the trackable in a specific format handled by the World Storage service. + The data provided to create the Trackable in a specific format handled by the world storage service. @@ -2398,9 +2638,9 @@ - Size {width, length, depth}. + Size object in format {width, length, depth}. - Size {width, length, depth}. + Size object in format {width, length, depth}. @@ -2410,9 +2650,9 @@ - Extensible list of trackable types possibly handled by complient World Storage implementation. + Extensible list of Trackable types, possibly handled by complient world storage implementation. - Extensible list of trackable types possibly handled by complient World Storage implementation. + Extensible list of Trackable types, possibly handled by complient world storage implementation. @@ -2514,12 +2754,12 @@ Initializes a new instance of the class. - An Universally Unique IDentifier identifying the world anchor (RFC 4122).. - A human readable name for the world anchor. (required). - An Universally Unique IDentifier identifying the creator of the world anchor. (required). + An Universally Unique IDentifier identifying the World Anchor (RFC 4122).. + A human readable name for the World Anchor. (required). + An Universally Unique IDentifier identifying the creator of the World Anchor. (required). Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. (required). unit (required). - Size {width, length, depth}. (required). + Size object in format {width, length, depth}. (required). List of additional parameters to be stored with the object. (required). @@ -2568,21 +2808,21 @@ - An Universally Unique IDentifier identifying the world anchor (RFC 4122). + An Universally Unique IDentifier identifying the World Anchor (RFC 4122). - An Universally Unique IDentifier identifying the world anchor (RFC 4122). + An Universally Unique IDentifier identifying the World Anchor (RFC 4122). - A human readable name for the world anchor. + A human readable name for the World Anchor. - A human readable name for the world anchor. + A human readable name for the World Anchor. - An Universally Unique IDentifier identifying the creator of the world anchor. + An Universally Unique IDentifier identifying the creator of the World Anchor. - An Universally Unique IDentifier identifying the creator of the world anchor. + An Universally Unique IDentifier identifying the creator of the World Anchor. @@ -2592,9 +2832,9 @@ - Size {width, length, depth}. + Size object in format {width, length, depth}. - Size {width, length, depth}. + Size object in format {width, length, depth}. @@ -2612,19 +2852,18 @@ Initializes a new instance of the class. - + Initializes a new instance of the class. - An Universally Unique IDentifier identifying the link (RFC 4122).. - An Universally Unique IDentifier identifying the creator of the link. (required). - An Universally Unique IDentifier identifying a world anchor or trackable. (required). - An Universally Unique IDentifier identifying a world anchor or trackable. (required). - typeFrom. - typeTo. + An Universally Unique IDentifier identifying the World Link (RFC 4122).. + An Universally Unique IDentifier identifying the creator of the World Link. (required). + An Universally Unique IDentifier identifying a World Anchor or Trackable. (required). + An Universally Unique IDentifier identifying a World Anchor or Trackable. (required). + typeFrom (required). + typeTo (required). Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. (required). unit (required). - Size {width, length, depth}. (required). List of additional parameters to be stored with the object. (required). @@ -2683,27 +2922,27 @@ - An Universally Unique IDentifier identifying the link (RFC 4122). + An Universally Unique IDentifier identifying the World Link (RFC 4122). - An Universally Unique IDentifier identifying the link (RFC 4122). + An Universally Unique IDentifier identifying the World Link (RFC 4122). - An Universally Unique IDentifier identifying the creator of the link. + An Universally Unique IDentifier identifying the creator of the World Link. - An Universally Unique IDentifier identifying the creator of the link. + An Universally Unique IDentifier identifying the creator of the World Link. - An Universally Unique IDentifier identifying a world anchor or trackable. + An Universally Unique IDentifier identifying a World Anchor or Trackable. - An Universally Unique IDentifier identifying a world anchor or trackable. + An Universally Unique IDentifier identifying a World Anchor or Trackable. - An Universally Unique IDentifier identifying a world anchor or trackable. + An Universally Unique IDentifier identifying a World Anchor or Trackable. - An Universally Unique IDentifier identifying a world anchor or trackable. + An Universally Unique IDentifier identifying a World Anchor or Trackable. @@ -2711,12 +2950,6 @@ Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. - - - Size {width, length, depth}. - - Size {width, length, depth}. - List of additional parameters to be stored with the object. -- GitLab From d0d381581305e6a964180e369cf44d103e2bc025 Mon Sep 17 00:00:00 2001 From: Sylvain Renault Date: Mon, 13 Jun 2022 17:32:10 +0200 Subject: [PATCH 8/8] Use API v1.0.0 --- Plugins/Org.OpenAPITools.dll | Bin 121856 -> 121856 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Plugins/Org.OpenAPITools.dll b/Plugins/Org.OpenAPITools.dll index 9e73e0e532bec5b9563dc4dd0168f8a7df8fcc22..08853b7fcc62536f192d6716bbed7dfc3fe82bc3 100644 GIT binary patch delta 42 zcmV+_0M-A1xCel^2at#ZvsR~pi?xdZDWnh`$I>9xiR(v}Fu<$8c$j>*#H0Z{H=*GZ A>Hq)$ delta 42 zcmV+_0M-A1xCel^2at#ZMcSBwi?xdZDWnj%DB8gl=66b(UouHlauesb#H0Z{Hn+a -- GitLab