From 11be4ddf097238232e569513fb17d319daccacc4 Mon Sep 17 00:00:00 2001 From: Sylvain Renault Date: Thu, 17 Feb 2022 19:34:00 +0100 Subject: [PATCH] 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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 literal 63488 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 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