From dff75e87a363b19b99f44396d8ed0ad7827fd768 Mon Sep 17 00:00:00 2001 From: Jay Long Date: Fri, 6 Oct 2023 18:31:21 -0500 Subject: [PATCH] Contribution to Noda API (#1) * Adding Local Documentation * Contrib tweak for listNodes/listLinks for dynamic update --- APIDocumentaion.md | 226 +++++++++++++++++++++++++++++++++++ docs/Architechual.drawio | 87 ++++++++++++++ docs/nodavr-architectual.png | Bin 0 -> 59778 bytes simple.html | 71 ++++++++++- 4 files changed, 379 insertions(+), 5 deletions(-) create mode 100644 APIDocumentaion.md create mode 100644 docs/Architechual.drawio create mode 100644 docs/nodavr-architectual.png diff --git a/APIDocumentaion.md b/APIDocumentaion.md new file mode 100644 index 0000000..7af7488 --- /dev/null +++ b/APIDocumentaion.md @@ -0,0 +1,226 @@ +# Using the Noda Integration API +Noda provides an integration api for displaying and interacting with content outside of VR. + +You can create a web-technology (HTML/CSS/JS) based mod for Noda to display your own UI and graph data for yourself or others. + +The mod will run inside of Noda's Chromium-based web browser as a normal web page. You can include our noda.js javascript file that provides methods for create, update, delete and select operations on nodes and links. + +The mod is viewable and interactable using the same input methods available in the Noda UI that includes dual Virtual Pointers via Hand Controllers, Virtual Keyboard, Physical Keyboard, and Voice Support for Speech-to-Text. + +You can also subscribe to events from the VR environment including changes to the graph when the user adds, selects, updates or deletes a node or link. + +# Table of Contents +1. [Using the Node Integration](#using-the-noda-integration-api) + 1. [Workflow Summary](#workflow-summary) + 1. [Architecture](#Architecture) +1. [API Specifications](#api-specifications) + 1. [Node Management Methods](#node-management-methods) + 1. [createNode](#createnode) + 1. [updateNode](#updatenode) + 1. [deleteNode](#deletenode) + 1. [listNodes](#listnodes) + 1. [Link Management Methods](#link-management-methods) + 1. [createLink](#createlink) + 1. [updateLink](#updatelink) + 1. [deleteLink](#deletelink) + 1. [listLinks](#listlinks) + 1. [User Management Methods](#user-management-methods) + 1. [getUser](#getuser) + 1. [Object Properties](#object-properties) + 1. [Node Properties](#node-properties) + 1. [Link Properties](#link-properties) + 1. [User Properties](#user-properties) +## Workflow Summary +Clone the web app starter from GitHub. +Host on an accessible web location. (On a cloud hosting platform or GitHub Pages, etc.) +Enable Noda WebAPI for your web location +Access your web location from inside Noda +Workflow Details + +1. Clone the web app starter from GitHub +This is optional but the starter kit will show a working example of calling the Noda javascript methods and event handlers and populating the necessary parameters. + + The starter kit can be found here on GitHub including a simple form exercising all of the apis. + +2. Host on an accessible web location +You'll need to place your web app on a server that you can reach from inside the VR headset. Unless you can access a localhost using an internal network this usually means having a publicly available domain/host name. There are many ways and places to host static web pages but it would be best to use something that allow you to quickly make changes to the file so can iterate your app during development. + +3. Enable Noda WebAPI for your web location +Currently this happens by default, as all URLs are permitted to run Noda js commands. You can choose to disallow all locations and enable only the ones that you choose using the Noda Console available in the VR app from the Settings tab on the Application Menu. + +4. Access your web location from inside Noda +Using the Browser from the Application Menu to load your web page and execute the js methods to visualize 3d data. + +You can bring up the Noda Console from the Settings tab of the Application Menu to view log messages of the running web application. + +## Architecture + +The Noda API interacts with exposed interfaces and objects inside the embeded Noda Browser. Your integration web page & scripts need only to be reachable by your headset and the network it's connected to. If your headset and the integration page & sub-assets you have created are not reachable, then they may not load properly in the Noda Application. + + +![NodaVR Logical Component Flow](docs/nodavr-architectual.png "NodaVR Logical Component Flow") + + + +# API Specifications + +Below is a list of available methods along with a description and example code. + +### Node Management Methods + +#### createNode +```Javascript +const node = await window.noda.createNode(properties); +``` +The createNode method is used to create a new node in the VR space. Properties (listed below) can be supplied for visual characteristics like color, shape and size as well as additional data fields for Notes and Page url link. A unique identifier can be supplied or one will be generated and returned in an asynchronous response. + +#### updateNode +```Javascript +const node = await window.noda.updateNode(properties); +``` +Update an existing node in the VR space identified by uuid property. Properties can be supplied for visual characteristics like color, shape and size as well as additional data fields for Notes and Page url link. Fields that are supplied will be updated. + +##### deleteNode +```Javascript +const node = await window.noda.deleteNode(properties); +``` +Delete an existing node in the VR space identified by uuid property. + +#### listNodes +```Javascript +const node = await window.noda.listNodes(properties); +``` +Return a list of nodes in the VR space that match the given properties. Sending a null properties object will return all available nodes. + +### Link Management Methods + +#### createLink +```Javascript +const link = await window.noda.createLink(properties); +``` +The createLink method is used to create a new link between two nodes in the VR space. Properties (listed below) can be supplied for visual characteristics like color, pattern and thickness. A unique identifier can be supplied or one will be generated and returned in an asynchronous response. + +#### updateLink +```Javascript +const link = await window.noda.updateLink(properties); +``` +Update an existing link in the VR space identified by uuid property. Properties can be supplied for visual characteristics like color, pattern and thickness. Fields that are supplied will be updated. + +#### deleteLink +```JavaScript +const link = await window.noda.deleteLink(properties); +``` +Delete an existing link in the VR space identified by uuid property. + +#### listLinks +```Javascript +const links = await window.noda.listLinks(properties); +``` +Return a list of links in the VR space that match the given properties. Sending a null properties object will return all available links. + +### User Management Methods + +#### getUser +```Javascript +const user = await window.noda.getUser(); +``` +Returns an object that can be used to associate a returning visitor. Currently the property userId represents a single installation, meaning the same headset over successive starts of the app will return the same id. If the app is reinstalled or the headset is factory reset or the same person is using a different headset a different id will be returned. + +### Event Management Methods + +#### onNodeCreated +```Javascript +window.noda.onNodeCreated = function (node) { console.log("Node created: " + node.uuid); } +``` +This event will fire when a node has been created in the VR scene. This will happen both from a node created by this API (createNode method call above) or by the user interactive directly with the VR scene. + +#### onNodeUpdated +```Javascript +window.noda.onNodeUpdated = function (node) { console.log("Node updated: " + node.uuid); } +``` +This event will fire when a node has been updated in the VR scene. This will happen both from this API (updateNode method call above) or by the user interactive directly with the VR scene. + +#### onNodeDeleted +```Javascript +window.noda.onNodeDeleted = function (node) { console.log("Node deleted: " + node.uuid); } +``` +This event will fire when a node has been deleted in the VR scene. This will happen both from a node created by this API (deleteNode method call above) or by the user interactive directly with the VR scene. + +#### onLinkCreated +```Javascript +window.noda.onLinkCreated = function (link) { console.log("Link created: " + link.uuid); } +``` +This event will fire when a link has been created in the VR scene. This will happen both from a link created by this API (createLink method call above) or by the user interactive directly with the VR scene. + +#### onLinkUpdated +```Javascript +window.noda.onLinkUpdated = function (link) { console.log("Link updated: " + link.uuid); } +``` +This event will fire when a link has been updated in the VR scene. This will happen both from this API (updateLink method call above) or by the user interactive directly with the VR scene. + +#### onLinkDeleted +```Javascript +window.noda.onLinkDeleted = function (link) { console.log("Link deleted: " + link.uuid); } +``` +This event will fire when a link has been deleted in the VR scene. This will happen both from a link created by this API (deleteLink method call above) or by the user interactive directly with the VR scene. + +### Object Properties + +#### Node Properties +``` uuid ``` - A universal unique identifier for the node. This could be a numeric or string value such as ```"1234"``` or ```"PRODUCT-SKU-452"``` + +``` title ``` - The main text appears above the node. It should be a short name or phrase. + +``` color ``` - A RGB hex value that represents the color of the shape. Ex. ```000000``` (black) ```111111``` (white) ```110000``` (red) + +``` opacity ``` - A numerical value that represents how opaque or transparent the shape will appear. 0 is completely transparent and 1 is completely opaque. + +``` shape ``` - The name of the shape model. Values can be any of the following: +``` Ball, Box, Tetra, Cylinder, Diamond, Hourglass, Plus, Star, Flat ``` + +``` imageUrl ``` - A public URL that points to an image for display. Should include the protocol i.e. "https://images.cdn.com/test.png". Can be .png or jpg format. + +``` notes ``` - A free form text field for additional information related to a node. + +``` pageUrl ``` - A public URL that is accessible when examining the node. + +``` size ``` - The relative size of the node. Default value is ```5```, can range from ```1``` to ```45```. + +``` location ``` - A sub object that defines how the node should be positioned. It has the following properties: + +> ``` x ``` - Position in X axis measured in meters. (Left/Right) +> +> ``` y ``` - Position in Y axis measured in meters. (Up/Down) +> +> ``` z ``` - Position in Z axis measured in meters. (Forward/Back) +> +> ``` relativeTo ``` - Specifies the frame of reference for the location. Can be one of: ``` Origin, User or Window```. + +``` selected ``` - Indicates if the node is selected, shown by a flashing color. + +``` collapsed ``` - Indicates if the node is in expanded or collapsed state. Collapsed nodes will hide all of the outgoing connected nodes. + +#### Link Properties +``` uuid ``` - A universal unique identifier for the link. This could be a numeric or string value such as ```"1234"``` or ```"PRODUCT-SKU-452"``` + +``` fromUuid ``` - Corresponds to the uuid of the starting node for this link. + +``` toUuid ``` - Corresponds to the uuid of the ending node for this link. + +``` title ``` - The main text appears above the node. It should be a short name or phrase. + +``` color ``` - A hex value that represents the color of the link. Ex. ```000000``` (black) ```111111``` (white) ```110000``` (red) + +``` shape ``` - The pattern used to paint the link. Can be one of: ```Solid, Dash, Arrows```. ```Solid``` is the default. + +``` size ``` - The thickness of the line from ```1 - 10```. The default is ```1```. + +``` curve ``` - The Line Curve Style for the link. Can be one of: ```None, CDown, CUp, SDown, SUp```. ```None``` is the default. + +``` trail ``` - The animated trail from/to for the link. Can be one of: ```None, Ball, Cone, Ring```. ```None``` is the default. + + +``` selected ``` - Indicates if the link is selected, shown by a flashing color + +## User Properties +``` userId ``` - represents a single installation, meaning the same headset over successive starts of the app will return the same id. If the app is reinstalled or the headset is factory reset or the same person is using a different headset a different id will be returned. \ No newline at end of file diff --git a/docs/Architechual.drawio b/docs/Architechual.drawio new file mode 100644 index 0000000..3e9b054 --- /dev/null +++ b/docs/Architechual.drawio @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/nodavr-architectual.png b/docs/nodavr-architectual.png new file mode 100644 index 0000000000000000000000000000000000000000..bfdbfcd5d5c3ac16271ed40c35771df3975c4fcd GIT binary patch literal 59778 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 { + eventMessage("ListNodes - uuid: " + n.uuid + ""); + }); + + } + statusSuccess("List Nodes returned " + count + " nodes"); } catch (error) { @@ -146,6 +152,28 @@ } } + async function getNode( nodeUuid ) { + try { + console.log("Calling getNode()" + nodeUuid); + var linkProps = { + uuid: nodeUuid + }; + console.log("Built Prop" + linkProps); + + const result = await window.noda.listNodes(linkProps); + + if (result != null && result.nodes != null) { + statusSuccess("Found Node : " + nodeUuid); + result.nodes.forEach(n => { + showNodeProps(n); + }); + } + + } catch (error) { + statusError("Get Node error: " + error); + } + } + function obtainNodeProps() { var nodeProps = {}; @@ -248,22 +276,51 @@ async function listLinks() { try { - var linkProps = obtainLinkProps(); + var linkProps = {}; const result = await window.noda.listLinks(linkProps); let count = 0; - if (result != null && result.links != null) + if (result != null && result.links != null) { count = result.links.length; + result.links.forEach(l => { + eventMessage("ListLinks - uuid: " + l.uuid + ""); + }); + + } statusSuccess("List Links returned " + count + " links"); + } catch (error) { statusError("List Links error: " + error); } } + async function getLink( linkUuid ) { + try { + console.log("Calling getLink()" + linkUuid); + var linkProps = { + uuid: linkUuid + }; + console.log("Built Prop" + linkProps); + + const result = await window.noda.listLinks(linkProps); + + if (result != null && result.links != null) { + statusSuccess("Found Link : " + linkUuid); + result.links.forEach(l => { + showLinkProps(l); + }); + } + + } catch (error) { + statusError("Get Link error: " + error); + } + } + + var savedMapJsonText = null; async function saveMap() { @@ -349,7 +406,7 @@ .status {margin: 15px 0; padding: 10px; background-color: bisque; height: 75px; overflow-y:auto;} .status p {margin-bottom: 0;} .status span {font-size: 80%; font-weight: bold;} - .events {margin: 15px 0; padding: 10px; background-color: blanchedalmond; height: 127px; overflow-y:auto;} + .events {margin: 15px 0; padding: 10px; background-color: blanchedalmond; height: 327px; overflow-y:auto;} .events #eventsMessage {font-family: monospace; font-size: 85%;} .crud-form { padding: 15px; background-color:aliceblue} .crud-form input[type='button'] {margin-right: 10} @@ -410,6 +467,7 @@

Node

+

@@ -494,6 +552,9 @@

Link