diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/AC_CURRENT_USB4065.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/AC_CURRENT_USB4065.md
new file mode 100644
index 0000000000..d5691a0693
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/AC_CURRENT_USB4065.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/a1-[autogen]/docstring.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..6e4a8b0dfd
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/a1-[autogen]/docstring.txt
@@ -0,0 +1,28 @@
+The AC_CURRENT_USB4065 node reads the AC current from a USB-4065.
+
+ The USB-4065 is a NI (National Instruments) multimeter. It is possible that
+ the node will work with other NI DMMs (digital multimeters) such as the
+ 4070 and 4080 series.
+
+ This instrument will likely only be compatible with Windows systems due to
+ NI driver availablity. To use the instrument you must install the runtime:
+
+ https://www.ni.com/en/support/downloads/drivers/download.ni-dmm.html
+
+ You must also find the address/resource name for the instrument. You can
+ find this using the NI MAX programming which can be downloaded when
+ installing the drivers.
+
+ Parameters
+ ----------
+ NI_address: str
+ The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').
+ digits: str
+ The accuracy of the reading in digits. Lower values are faster.
+ current_limit: str
+ The maximum current to allow, in Amps.
+
+ Returns
+ -------
+ DataContainer
+ Scalar: The AC current reading.
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/a1-[autogen]/python_code.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..a1a49734fd
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/a1-[autogen]/python_code.txt
@@ -0,0 +1,27 @@
+from flojoy import flojoy, DataContainer, Scalar
+from flojoy.connection_manager import DeviceConnectionManager
+from typing import Optional, Literal
+import nidmm
+
+
+@flojoy(deps={"nidmm": "1.4.6"})
+def AC_CURRENT_USB4065(
+ NI_address: str = "Dev1",
+ digits: Literal["4.5", "5.5", "6.5"] = "5.5",
+ current_limit: Literal["0.01", "0.1", "0.5", "3"] = "3",
+ default: Optional[DataContainer] = None,
+) -> Scalar:
+
+
+ connection = DeviceConnectionManager.get_connection(NI_address)
+ session = connection.get_handle()
+
+ session.configure_measurement_digits(
+ nidmm.Function.AC_CURRENT,
+ range=float(current_limit),
+ resolution_digits=float(digits),
+ )
+
+ reading = session.read()
+
+ return Scalar(c=reading)
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/appendix/hardware.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/appendix/media.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/appendix/notes.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/examples/EX1/app.json b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/examples/EX1/app.json
new file mode 100644
index 0000000000..ede8f608e3
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/examples/EX1/app.json
@@ -0,0 +1,454 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "type": "IO",
+ "data": {
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "label": "CONNECTION USB4065",
+ "func": "CONNECTION_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "CONNECTION_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "desc": "Optional: None"
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/CONNECTION_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 4.704499736461486,
+ "y": -114.58793327290465
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 4.704499736461486,
+ "y": -114.58793327290465
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "label": "BIG NUMBER",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default = \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether or not to show the relative delta from the last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": true
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing the Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 789.5089067672151,
+ "y": -337.92011150709266
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 789.5089067672151,
+ "y": -337.92011150709266
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "label": "BIG NUMBER 1",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default = \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether or not to show the relative delta from the last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": true
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing the Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 788.5306367510525,
+ "y": -17.717544827417925
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 788.5306367510525,
+ "y": -17.717544827417925
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "AC_CURRENT_USB4065-01f8cd65-f159-48d8-941a-f78f4cf89895",
+ "type": "IO",
+ "data": {
+ "id": "AC_CURRENT_USB4065-01f8cd65-f159-48d8-941a-f78f4cf89895",
+ "label": "AC CURRENT USB4065",
+ "func": "AC_CURRENT_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "AC_CURRENT_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ },
+ "digits": {
+ "type": "select",
+ "options": [
+ "4.5",
+ "5.5",
+ "6.5"
+ ],
+ "default": "5.5",
+ "desc": "The accuracy of the reading in digits. Lower values are faster.",
+ "overload": null,
+ "functionName": "AC_CURRENT_USB4065",
+ "param": "digits",
+ "value": "5.5"
+ },
+ "current_limit": {
+ "type": "select",
+ "options": [
+ "0.01",
+ "0.1",
+ "0.5",
+ "3"
+ ],
+ "default": "3",
+ "desc": "The maximum current to allow, in Amps.",
+ "overload": null,
+ "functionName": "AC_CURRENT_USB4065",
+ "param": "current_limit",
+ "value": "3"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "Scalar: The AC current reading."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/AC_CURRENT_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 409.98201629627056,
+ "y": 4.911279697871066
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 409.98201629627056,
+ "y": 4.911279697871066
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "AC_VOLTAGE_USB4065-75a4399f-a1b3-4cfe-b110-3cea79bce7eb",
+ "type": "IO",
+ "data": {
+ "id": "AC_VOLTAGE_USB4065-75a4399f-a1b3-4cfe-b110-3cea79bce7eb",
+ "label": "AC VOLTAGE USB4065",
+ "func": "AC_VOLTAGE_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "AC_VOLTAGE_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ },
+ "digits": {
+ "type": "select",
+ "options": [
+ "4.5",
+ "5.5",
+ "6.5"
+ ],
+ "default": "5.5",
+ "desc": "The accuracy of the reading in digits. Lower values are faster.",
+ "overload": null,
+ "functionName": "AC_VOLTAGE_USB4065",
+ "param": "digits",
+ "value": "5.5"
+ },
+ "voltage_limit": {
+ "type": "select",
+ "options": [
+ "0.2",
+ "2",
+ "20",
+ "300"
+ ],
+ "default": "20",
+ "desc": "The maximum voltage to allow, in Volts.",
+ "overload": null,
+ "functionName": "AC_VOLTAGE_USB4065",
+ "param": "voltage_limit",
+ "value": "20"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "Scalar: The AC voltage reading."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/AC_VOLTAGE_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 411.59905358626946,
+ "y": -327.4361310374542
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 411.59905358626946,
+ "y": -327.4361310374542
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "sourceHandle": "default",
+ "target": "AC_VOLTAGE_USB4065-75a4399f-a1b3-4cfe-b110-3cea79bce7eb",
+ "targetHandle": "default",
+ "id": "reactflow__edge-CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1default-AC_VOLTAGE_USB4065-75a4399f-a1b3-4cfe-b110-3cea79bce7ebdefault"
+ },
+ {
+ "source": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "sourceHandle": "default",
+ "target": "AC_CURRENT_USB4065-01f8cd65-f159-48d8-941a-f78f4cf89895",
+ "targetHandle": "default",
+ "id": "reactflow__edge-CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1default-AC_CURRENT_USB4065-01f8cd65-f159-48d8-941a-f78f4cf89895default"
+ },
+ {
+ "source": "AC_CURRENT_USB4065-01f8cd65-f159-48d8-941a-f78f4cf89895",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "targetHandle": "default",
+ "id": "reactflow__edge-AC_CURRENT_USB4065-01f8cd65-f159-48d8-941a-f78f4cf89895default-BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085decdefault"
+ },
+ {
+ "source": "AC_VOLTAGE_USB4065-75a4399f-a1b3-4cfe-b110-3cea79bce7eb",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "targetHandle": "default",
+ "id": "reactflow__edge-AC_VOLTAGE_USB4065-75a4399f-a1b3-4cfe-b110-3cea79bce7ebdefault-BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06bdefault"
+ }
+ ],
+ "viewport": {
+ "x": 1139.470292881633,
+ "y": 572.2854272048312,
+ "zoom": 1.2136444284334926
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/examples/EX1/example.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/examples/EX1/example.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/AC_VOLTAGE_USB4065.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/AC_VOLTAGE_USB4065.md
new file mode 100644
index 0000000000..83b8367608
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/AC_VOLTAGE_USB4065.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/a1-[autogen]/docstring.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..2ff2bb5615
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/a1-[autogen]/docstring.txt
@@ -0,0 +1,28 @@
+The AC_VOLTAGE_USB4065 node reads the AC voltage from a USB-4065.
+
+ The USB-4065 is a NI (National Instruments) multimeter. It is possible that
+ the node will work with other NI DMMs (digital multimeters) such as the
+ 4070 and 4080 series.
+
+ This instrument will likely only be compatible with Windows systems due to
+ NI driver availablity. To use the instrument you must install the runtime:
+
+ https://www.ni.com/en/support/downloads/drivers/download.ni-dmm.html
+
+ You must also find the address/resource name for the instrument. You can
+ find this using the NI MAX programming which can be downloaded when
+ installing the drivers.
+
+ Parameters
+ ----------
+ NI_address: str
+ The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').
+ digits: str
+ The accuracy of the reading in digits. Lower values are faster.
+ voltage_limit: str
+ The maximum voltage to allow, in Volts.
+
+ Returns
+ -------
+ DataContainer
+ Scalar: The AC voltage reading.
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/a1-[autogen]/python_code.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..8768ea1972
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/a1-[autogen]/python_code.txt
@@ -0,0 +1,27 @@
+from flojoy import flojoy, DataContainer, Scalar
+from flojoy.connection_manager import DeviceConnectionManager
+from typing import Optional, Literal
+import nidmm
+
+
+@flojoy(deps={"nidmm": "1.4.6"})
+def AC_VOLTAGE_USB4065(
+ NI_address: str = "Dev1",
+ digits: Literal["4.5", "5.5", "6.5"] = "5.5",
+ voltage_limit: Literal["0.2", "2", "20", "300"] = "20",
+ default: Optional[DataContainer] = None,
+) -> Scalar:
+
+
+ connection = DeviceConnectionManager.get_connection(NI_address)
+ session = connection.get_handle()
+
+ session.configure_measurement_digits(
+ nidmm.Function.AC_VOLTS,
+ range=float(voltage_limit),
+ resolution_digits=float(digits),
+ )
+
+ reading = session.read()
+
+ return Scalar(c=reading)
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/appendix/hardware.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/appendix/media.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/appendix/notes.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/examples/EX1/app.json b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/examples/EX1/app.json
new file mode 100644
index 0000000000..ede8f608e3
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/examples/EX1/app.json
@@ -0,0 +1,454 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "type": "IO",
+ "data": {
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "label": "CONNECTION USB4065",
+ "func": "CONNECTION_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "CONNECTION_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "desc": "Optional: None"
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/CONNECTION_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 4.704499736461486,
+ "y": -114.58793327290465
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 4.704499736461486,
+ "y": -114.58793327290465
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "label": "BIG NUMBER",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default = \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether or not to show the relative delta from the last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": true
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing the Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 789.5089067672151,
+ "y": -337.92011150709266
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 789.5089067672151,
+ "y": -337.92011150709266
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "label": "BIG NUMBER 1",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default = \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether or not to show the relative delta from the last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": true
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing the Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 788.5306367510525,
+ "y": -17.717544827417925
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 788.5306367510525,
+ "y": -17.717544827417925
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "AC_CURRENT_USB4065-01f8cd65-f159-48d8-941a-f78f4cf89895",
+ "type": "IO",
+ "data": {
+ "id": "AC_CURRENT_USB4065-01f8cd65-f159-48d8-941a-f78f4cf89895",
+ "label": "AC CURRENT USB4065",
+ "func": "AC_CURRENT_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "AC_CURRENT_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ },
+ "digits": {
+ "type": "select",
+ "options": [
+ "4.5",
+ "5.5",
+ "6.5"
+ ],
+ "default": "5.5",
+ "desc": "The accuracy of the reading in digits. Lower values are faster.",
+ "overload": null,
+ "functionName": "AC_CURRENT_USB4065",
+ "param": "digits",
+ "value": "5.5"
+ },
+ "current_limit": {
+ "type": "select",
+ "options": [
+ "0.01",
+ "0.1",
+ "0.5",
+ "3"
+ ],
+ "default": "3",
+ "desc": "The maximum current to allow, in Amps.",
+ "overload": null,
+ "functionName": "AC_CURRENT_USB4065",
+ "param": "current_limit",
+ "value": "3"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "Scalar: The AC current reading."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_CURRENT_USB4065/AC_CURRENT_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 409.98201629627056,
+ "y": 4.911279697871066
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 409.98201629627056,
+ "y": 4.911279697871066
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "AC_VOLTAGE_USB4065-75a4399f-a1b3-4cfe-b110-3cea79bce7eb",
+ "type": "IO",
+ "data": {
+ "id": "AC_VOLTAGE_USB4065-75a4399f-a1b3-4cfe-b110-3cea79bce7eb",
+ "label": "AC VOLTAGE USB4065",
+ "func": "AC_VOLTAGE_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "AC_VOLTAGE_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ },
+ "digits": {
+ "type": "select",
+ "options": [
+ "4.5",
+ "5.5",
+ "6.5"
+ ],
+ "default": "5.5",
+ "desc": "The accuracy of the reading in digits. Lower values are faster.",
+ "overload": null,
+ "functionName": "AC_VOLTAGE_USB4065",
+ "param": "digits",
+ "value": "5.5"
+ },
+ "voltage_limit": {
+ "type": "select",
+ "options": [
+ "0.2",
+ "2",
+ "20",
+ "300"
+ ],
+ "default": "20",
+ "desc": "The maximum voltage to allow, in Volts.",
+ "overload": null,
+ "functionName": "AC_VOLTAGE_USB4065",
+ "param": "voltage_limit",
+ "value": "20"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "Scalar: The AC voltage reading."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/AC_VOLTAGE_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 411.59905358626946,
+ "y": -327.4361310374542
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 411.59905358626946,
+ "y": -327.4361310374542
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "sourceHandle": "default",
+ "target": "AC_VOLTAGE_USB4065-75a4399f-a1b3-4cfe-b110-3cea79bce7eb",
+ "targetHandle": "default",
+ "id": "reactflow__edge-CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1default-AC_VOLTAGE_USB4065-75a4399f-a1b3-4cfe-b110-3cea79bce7ebdefault"
+ },
+ {
+ "source": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "sourceHandle": "default",
+ "target": "AC_CURRENT_USB4065-01f8cd65-f159-48d8-941a-f78f4cf89895",
+ "targetHandle": "default",
+ "id": "reactflow__edge-CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1default-AC_CURRENT_USB4065-01f8cd65-f159-48d8-941a-f78f4cf89895default"
+ },
+ {
+ "source": "AC_CURRENT_USB4065-01f8cd65-f159-48d8-941a-f78f4cf89895",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "targetHandle": "default",
+ "id": "reactflow__edge-AC_CURRENT_USB4065-01f8cd65-f159-48d8-941a-f78f4cf89895default-BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085decdefault"
+ },
+ {
+ "source": "AC_VOLTAGE_USB4065-75a4399f-a1b3-4cfe-b110-3cea79bce7eb",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "targetHandle": "default",
+ "id": "reactflow__edge-AC_VOLTAGE_USB4065-75a4399f-a1b3-4cfe-b110-3cea79bce7ebdefault-BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06bdefault"
+ }
+ ],
+ "viewport": {
+ "x": 1139.470292881633,
+ "y": 572.2854272048312,
+ "zoom": 1.2136444284334926
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/examples/EX1/example.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/AC_VOLTAGE_USB4065/examples/EX1/example.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/CONNECTION_USB4065.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/CONNECTION_USB4065.md
new file mode 100644
index 0000000000..3ebadba6e8
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/CONNECTION_USB4065.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/a1-[autogen]/docstring.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..f03c50bd32
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/a1-[autogen]/docstring.txt
@@ -0,0 +1,11 @@
+The CONNECTION_MDO3XXX node connects Flojoy to a
+
+ Parameters
+ ----------
+ NI_address: str
+ The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').
+
+ Returns
+ -------
+ DataContainer
+ Optional: None
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/a1-[autogen]/python_code.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..1d210debfd
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/a1-[autogen]/python_code.txt
@@ -0,0 +1,17 @@
+from flojoy import flojoy, DataContainer, NIDevice
+from flojoy.connection_manager import DeviceConnectionManager
+from typing import Optional
+import nidmm
+
+
+@flojoy(deps={"nidmm": "1.4.6"})
+def CONNECTION_USB4065(
+ NI_address: str = "Dev1",
+ default: Optional[DataContainer] = None,
+) -> Optional[DataContainer]:
+
+
+ session = nidmm.Session(NI_address)
+ DeviceConnectionManager.register_connection(NIDevice(NI_address), session)
+
+ return None
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/appendix/hardware.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/appendix/media.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/appendix/notes.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/examples/EX1/app.json b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/examples/EX1/app.json
new file mode 100644
index 0000000000..7ee5bc2698
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/examples/EX1/app.json
@@ -0,0 +1,266 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "type": "IO",
+ "data": {
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "label": "CONNECTION USB4065",
+ "func": "CONNECTION_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "CONNECTION_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "desc": "Optional: None"
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/CONNECTION_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 4.704499736461486,
+ "y": -114.58793327290465
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 4.704499736461486,
+ "y": -114.58793327290465
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "label": "BIG NUMBER 1",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default = \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether or not to show the relative delta from the last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": true
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing the Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 779.8328146881206,
+ "y": -134.05091491913146
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 779.8328146881206,
+ "y": -134.05091491913146
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "RESISTANCE_USB4065-be7ec375-8dda-4e2a-b1e9-4b25945441d3",
+ "type": "IO",
+ "data": {
+ "id": "RESISTANCE_USB4065-be7ec375-8dda-4e2a-b1e9-4b25945441d3",
+ "label": "RESISTANCE USB4065",
+ "func": "RESISTANCE_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "RESISTANCE_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ },
+ "digits": {
+ "type": "select",
+ "options": [
+ "4.5",
+ "5.5",
+ "6.5"
+ ],
+ "default": "5.5",
+ "desc": "The accuracy of the reading in digits. Lower values are faster.",
+ "overload": null,
+ "functionName": "RESISTANCE_USB4065",
+ "param": "digits",
+ "value": "4.5"
+ },
+ "resist_limit": {
+ "type": "select",
+ "options": [
+ "100",
+ "1000",
+ "1e4",
+ "1e5",
+ "1e6",
+ "1e7",
+ "1e8"
+ ],
+ "default": "1e8",
+ "desc": "The maximum resistance to allow, in Volts.",
+ "overload": null,
+ "functionName": "RESISTANCE_USB4065",
+ "param": "resist_limit",
+ "value": "100"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "Scalar: The DC voltage reading."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/RESISTANCE_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 383.1035717255011,
+ "y": -122.14124419049455
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 383.1035717255011,
+ "y": -122.14124419049455
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "sourceHandle": "default",
+ "target": "RESISTANCE_USB4065-be7ec375-8dda-4e2a-b1e9-4b25945441d3",
+ "targetHandle": "default",
+ "id": "reactflow__edge-CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1default-RESISTANCE_USB4065-be7ec375-8dda-4e2a-b1e9-4b25945441d3default"
+ },
+ {
+ "source": "RESISTANCE_USB4065-be7ec375-8dda-4e2a-b1e9-4b25945441d3",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "targetHandle": "default",
+ "id": "reactflow__edge-RESISTANCE_USB4065-be7ec375-8dda-4e2a-b1e9-4b25945441d3default-BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085decdefault"
+ }
+ ],
+ "viewport": {
+ "x": 1139.470292881633,
+ "y": 572.2854272048312,
+ "zoom": 1.2136444284334926
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/examples/EX1/example.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/examples/EX1/example.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/DC_CURRENT_USB4065.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/DC_CURRENT_USB4065.md
new file mode 100644
index 0000000000..8dbe2a1ac8
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/DC_CURRENT_USB4065.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/a1-[autogen]/docstring.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..22e1235007
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/a1-[autogen]/docstring.txt
@@ -0,0 +1,28 @@
+The DC_CURRENT_USB4065 node reads the DC current from a USB-4065.
+
+ The USB-4065 is a NI (National Instruments) multimeter. It is possible that
+ the node will work with other NI DMMs (digital multimeters) such as the
+ 4070 and 4080 series.
+
+ This instrument will likely only be compatible with Windows systems due to
+ NI driver availablity. To use the instrument you must install the runtime:
+
+ https://www.ni.com/en/support/downloads/drivers/download.ni-dmm.html
+
+ You must also find the address/resource name for the instrument. You can
+ find this using the NI MAX programming which can be downloaded when
+ installing the drivers.
+
+ Parameters
+ ----------
+ NI_address: str
+ The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').
+ digits: str
+ The accuracy of the reading in digits. Lower values are faster.
+ current_limit: str
+ The maximum current to allow, in Amps.
+
+ Returns
+ -------
+ DataContainer
+ Scalar: The DC current reading.
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/a1-[autogen]/python_code.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..aa895ded68
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/a1-[autogen]/python_code.txt
@@ -0,0 +1,27 @@
+from flojoy import flojoy, DataContainer, Scalar
+from flojoy.connection_manager import DeviceConnectionManager
+from typing import Optional, Literal
+import nidmm
+
+
+@flojoy(deps={"nidmm": "1.4.6"})
+def DC_CURRENT_USB4065(
+ NI_address: str = "Dev1",
+ digits: Literal["4.5", "5.5", "6.5"] = "5.5",
+ current_limit: Literal["0.01", "0.1", "1", "3"] = "3",
+ default: Optional[DataContainer] = None,
+) -> Scalar:
+
+
+ connection = DeviceConnectionManager.get_connection(NI_address)
+ session = connection.get_handle()
+
+ session.configure_measurement_digits(
+ nidmm.Function.DC_CURRENT,
+ range=float(current_limit),
+ resolution_digits=float(digits),
+ )
+
+ reading = session.read()
+
+ return Scalar(c=reading)
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/appendix/hardware.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/appendix/media.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/appendix/notes.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/examples/EX1/app.json b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/examples/EX1/app.json
new file mode 100644
index 0000000000..269fc5f34e
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/examples/EX1/app.json
@@ -0,0 +1,456 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "type": "IO",
+ "data": {
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "label": "CONNECTION USB4065",
+ "func": "CONNECTION_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "CONNECTION_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "desc": "Optional: None"
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/CONNECTION_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 4.704499736461486,
+ "y": -114.58793327290465
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 4.704499736461486,
+ "y": -114.58793327290465
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "label": "BIG NUMBER",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default = \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether or not to show the relative delta from the last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": true
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing the Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 789.5089067672151,
+ "y": -337.92011150709266
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 789.5089067672151,
+ "y": -337.92011150709266
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DC_VOLTAGE_USB4065-faabd48b-f783-4ebe-90ec-6a060dad2fbb",
+ "type": "IO",
+ "data": {
+ "id": "DC_VOLTAGE_USB4065-faabd48b-f783-4ebe-90ec-6a060dad2fbb",
+ "label": "DC VOLTAGE USB4065",
+ "func": "DC_VOLTAGE_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "DC_VOLTAGE_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ },
+ "digits": {
+ "type": "select",
+ "options": [
+ "4.5",
+ "5.5",
+ "6.5"
+ ],
+ "default": "5.5",
+ "desc": "The accuracy of the reading in digits. Lower values are faster.",
+ "overload": null,
+ "functionName": "DC_VOLTAGE_USB4065",
+ "param": "digits",
+ "value": "5.5"
+ },
+ "voltage_limit": {
+ "type": "select",
+ "options": [
+ "0.1",
+ "1",
+ "10",
+ "100",
+ "300"
+ ],
+ "default": "10",
+ "desc": "The maximum voltage to allow, in Volts.",
+ "overload": null,
+ "functionName": "DC_VOLTAGE_USB4065",
+ "param": "voltage_limit",
+ "value": "10"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "Scalar: The DC voltage reading."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/DC_VOLTAGE_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 387.584587312525,
+ "y": -281.5498028061119
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 387.584587312525,
+ "y": -281.5498028061119
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "label": "BIG NUMBER 1",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default = \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether or not to show the relative delta from the last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": true
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing the Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": true
+ },
+ "position": {
+ "x": 788.5306367510525,
+ "y": -17.717544827417925
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 788.5306367510525,
+ "y": -17.717544827417925
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DC_CURRENT_USB4065-ec7b293a-827e-4d89-86bf-5db062fda09e",
+ "type": "IO",
+ "data": {
+ "id": "DC_CURRENT_USB4065-ec7b293a-827e-4d89-86bf-5db062fda09e",
+ "label": "DC CURRENT USB4065",
+ "func": "DC_CURRENT_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "DC_CURRENT_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ },
+ "digits": {
+ "type": "select",
+ "options": [
+ "4.5",
+ "5.5",
+ "6.5"
+ ],
+ "default": "5.5",
+ "desc": "The accuracy of the reading in digits. Lower values are faster.",
+ "overload": null,
+ "functionName": "DC_CURRENT_USB4065",
+ "param": "digits",
+ "value": "4.5"
+ },
+ "current_limit": {
+ "type": "select",
+ "options": [
+ "0.01",
+ "0.1",
+ "1",
+ "3"
+ ],
+ "default": "3",
+ "desc": "The maximum current to allow, in Amps.",
+ "overload": null,
+ "functionName": "DC_CURRENT_USB4065",
+ "param": "current_limit",
+ "value": "3"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "Scalar: The DC current reading."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/DC_CURRENT_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 383.63040645462985,
+ "y": 31.065737308753683
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 383.63040645462985,
+ "y": 31.065737308753683
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "sourceHandle": "default",
+ "target": "DC_VOLTAGE_USB4065-faabd48b-f783-4ebe-90ec-6a060dad2fbb",
+ "targetHandle": "default",
+ "id": "reactflow__edge-CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1default-DC_VOLTAGE_USB4065-faabd48b-f783-4ebe-90ec-6a060dad2fbbdefault",
+ "selected": false
+ },
+ {
+ "source": "DC_VOLTAGE_USB4065-faabd48b-f783-4ebe-90ec-6a060dad2fbb",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "targetHandle": "default",
+ "id": "reactflow__edge-DC_VOLTAGE_USB4065-faabd48b-f783-4ebe-90ec-6a060dad2fbbdefault-BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06bdefault"
+ },
+ {
+ "source": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "sourceHandle": "default",
+ "target": "DC_CURRENT_USB4065-ec7b293a-827e-4d89-86bf-5db062fda09e",
+ "targetHandle": "default",
+ "id": "reactflow__edge-CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1default-DC_CURRENT_USB4065-ec7b293a-827e-4d89-86bf-5db062fda09edefault"
+ },
+ {
+ "source": "DC_CURRENT_USB4065-ec7b293a-827e-4d89-86bf-5db062fda09e",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "targetHandle": "default",
+ "id": "reactflow__edge-DC_CURRENT_USB4065-ec7b293a-827e-4d89-86bf-5db062fda09edefault-BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085decdefault"
+ }
+ ],
+ "viewport": {
+ "x": 1139.470292881633,
+ "y": 572.2854272048312,
+ "zoom": 1.2136444284334926
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/examples/EX1/example.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/examples/EX1/example.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/DC_VOLTAGE_USB4065.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/DC_VOLTAGE_USB4065.md
new file mode 100644
index 0000000000..6cada942e4
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/DC_VOLTAGE_USB4065.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/a1-[autogen]/docstring.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..d448a9fc7c
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/a1-[autogen]/docstring.txt
@@ -0,0 +1,28 @@
+The DC_VOLTAGE_USB4065 node reads the DC voltage from a USB-4065.
+
+ The USB-4065 is a NI (National Instruments) multimeter. It is possible that
+ the node will work with other NI DMMs (digital multimeters) such as the
+ 4070 and 4080 series.
+
+ This instrument will likely only be compatible with Windows systems due to
+ NI driver availablity. To use the instrument you must install the runtime:
+
+ https://www.ni.com/en/support/downloads/drivers/download.ni-dmm.html
+
+ You must also find the address/resource name for the instrument. You can
+ find this using the NI MAX programming which can be downloaded when
+ installing the drivers.
+
+ Parameters
+ ----------
+ NI_address: str
+ The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').
+ digits: str
+ The accuracy of the reading in digits. Lower values are faster.
+ voltage_limit: str
+ The maximum voltage to allow, in Volts.
+
+ Returns
+ -------
+ DataContainer
+ Scalar: The DC voltage reading.
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/a1-[autogen]/python_code.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..c4e8508e73
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/a1-[autogen]/python_code.txt
@@ -0,0 +1,27 @@
+from flojoy import flojoy, DataContainer, Scalar
+from flojoy.connection_manager import DeviceConnectionManager
+from typing import Optional, Literal
+import nidmm
+
+
+@flojoy(deps={"nidmm": "1.4.6"})
+def DC_VOLTAGE_USB4065(
+ NI_address: str = "Dev1",
+ digits: Literal["4.5", "5.5", "6.5"] = "5.5",
+ voltage_limit: Literal["0.1", "1", "10", "100", "300"] = "10",
+ default: Optional[DataContainer] = None,
+) -> Scalar:
+
+
+ connection = DeviceConnectionManager.get_connection(NI_address)
+ session = connection.get_handle()
+
+ session.configure_measurement_digits(
+ nidmm.Function.DC_VOLTS,
+ range=float(voltage_limit),
+ resolution_digits=float(digits),
+ )
+
+ reading = session.read()
+
+ return Scalar(c=reading)
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/appendix/hardware.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/appendix/media.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/appendix/notes.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/examples/EX1/app.json b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/examples/EX1/app.json
new file mode 100644
index 0000000000..269fc5f34e
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/examples/EX1/app.json
@@ -0,0 +1,456 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "type": "IO",
+ "data": {
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "label": "CONNECTION USB4065",
+ "func": "CONNECTION_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "CONNECTION_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "desc": "Optional: None"
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/CONNECTION_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 4.704499736461486,
+ "y": -114.58793327290465
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 4.704499736461486,
+ "y": -114.58793327290465
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "label": "BIG NUMBER",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default = \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether or not to show the relative delta from the last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": true
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing the Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 789.5089067672151,
+ "y": -337.92011150709266
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 789.5089067672151,
+ "y": -337.92011150709266
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DC_VOLTAGE_USB4065-faabd48b-f783-4ebe-90ec-6a060dad2fbb",
+ "type": "IO",
+ "data": {
+ "id": "DC_VOLTAGE_USB4065-faabd48b-f783-4ebe-90ec-6a060dad2fbb",
+ "label": "DC VOLTAGE USB4065",
+ "func": "DC_VOLTAGE_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "DC_VOLTAGE_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ },
+ "digits": {
+ "type": "select",
+ "options": [
+ "4.5",
+ "5.5",
+ "6.5"
+ ],
+ "default": "5.5",
+ "desc": "The accuracy of the reading in digits. Lower values are faster.",
+ "overload": null,
+ "functionName": "DC_VOLTAGE_USB4065",
+ "param": "digits",
+ "value": "5.5"
+ },
+ "voltage_limit": {
+ "type": "select",
+ "options": [
+ "0.1",
+ "1",
+ "10",
+ "100",
+ "300"
+ ],
+ "default": "10",
+ "desc": "The maximum voltage to allow, in Volts.",
+ "overload": null,
+ "functionName": "DC_VOLTAGE_USB4065",
+ "param": "voltage_limit",
+ "value": "10"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "Scalar: The DC voltage reading."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/DC_VOLTAGE_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 387.584587312525,
+ "y": -281.5498028061119
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 387.584587312525,
+ "y": -281.5498028061119
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "label": "BIG NUMBER 1",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default = \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether or not to show the relative delta from the last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": true
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing the Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": true
+ },
+ "position": {
+ "x": 788.5306367510525,
+ "y": -17.717544827417925
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 788.5306367510525,
+ "y": -17.717544827417925
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DC_CURRENT_USB4065-ec7b293a-827e-4d89-86bf-5db062fda09e",
+ "type": "IO",
+ "data": {
+ "id": "DC_CURRENT_USB4065-ec7b293a-827e-4d89-86bf-5db062fda09e",
+ "label": "DC CURRENT USB4065",
+ "func": "DC_CURRENT_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "DC_CURRENT_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ },
+ "digits": {
+ "type": "select",
+ "options": [
+ "4.5",
+ "5.5",
+ "6.5"
+ ],
+ "default": "5.5",
+ "desc": "The accuracy of the reading in digits. Lower values are faster.",
+ "overload": null,
+ "functionName": "DC_CURRENT_USB4065",
+ "param": "digits",
+ "value": "4.5"
+ },
+ "current_limit": {
+ "type": "select",
+ "options": [
+ "0.01",
+ "0.1",
+ "1",
+ "3"
+ ],
+ "default": "3",
+ "desc": "The maximum current to allow, in Amps.",
+ "overload": null,
+ "functionName": "DC_CURRENT_USB4065",
+ "param": "current_limit",
+ "value": "3"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "Scalar: The DC current reading."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_CURRENT_USB4065/DC_CURRENT_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 383.63040645462985,
+ "y": 31.065737308753683
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 383.63040645462985,
+ "y": 31.065737308753683
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "sourceHandle": "default",
+ "target": "DC_VOLTAGE_USB4065-faabd48b-f783-4ebe-90ec-6a060dad2fbb",
+ "targetHandle": "default",
+ "id": "reactflow__edge-CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1default-DC_VOLTAGE_USB4065-faabd48b-f783-4ebe-90ec-6a060dad2fbbdefault",
+ "selected": false
+ },
+ {
+ "source": "DC_VOLTAGE_USB4065-faabd48b-f783-4ebe-90ec-6a060dad2fbb",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "targetHandle": "default",
+ "id": "reactflow__edge-DC_VOLTAGE_USB4065-faabd48b-f783-4ebe-90ec-6a060dad2fbbdefault-BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06bdefault"
+ },
+ {
+ "source": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "sourceHandle": "default",
+ "target": "DC_CURRENT_USB4065-ec7b293a-827e-4d89-86bf-5db062fda09e",
+ "targetHandle": "default",
+ "id": "reactflow__edge-CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1default-DC_CURRENT_USB4065-ec7b293a-827e-4d89-86bf-5db062fda09edefault"
+ },
+ {
+ "source": "DC_CURRENT_USB4065-ec7b293a-827e-4d89-86bf-5db062fda09e",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "targetHandle": "default",
+ "id": "reactflow__edge-DC_CURRENT_USB4065-ec7b293a-827e-4d89-86bf-5db062fda09edefault-BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085decdefault"
+ }
+ ],
+ "viewport": {
+ "x": 1139.470292881633,
+ "y": 572.2854272048312,
+ "zoom": 1.2136444284334926
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/examples/EX1/example.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DC_VOLTAGE_USB4065/examples/EX1/example.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/DIODE_USB4065.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/DIODE_USB4065.md
new file mode 100644
index 0000000000..95453f3866
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/DIODE_USB4065.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/a1-[autogen]/docstring.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..940460f3e6
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/a1-[autogen]/docstring.txt
@@ -0,0 +1,28 @@
+The DIODE_USB4065 node reads the voltage drop across a diode.
+
+ The USB-4065 is a NI (National Instruments) multimeter. It is possible that
+ the node will work with other NI DMMs (digital multimeters) such as the
+ 4070 and 4080 series.
+
+ This instrument will likely only be compatible with Windows systems due to
+ NI driver availablity. To use the instrument you must install the runtime:
+
+ https://www.ni.com/en/support/downloads/drivers/download.ni-dmm.html
+
+ You must also find the address/resource name for the instrument. You can
+ find this using the NI MAX programming which can be downloaded when
+ installing the drivers.
+
+ Parameters
+ ----------
+ NI_address: str
+ The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').
+ digits: str
+ The accuracy of the reading in digits. Lower values are faster.
+ voltage_limit: str
+ The maximum voltage to allow, in Volts.
+
+ Returns
+ -------
+ DataContainer
+ Scalar: The DC voltage reading.
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/a1-[autogen]/python_code.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..e1295085aa
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/a1-[autogen]/python_code.txt
@@ -0,0 +1,27 @@
+from flojoy import flojoy, DataContainer, Scalar
+from flojoy.connection_manager import DeviceConnectionManager
+from typing import Optional, Literal
+import nidmm
+
+
+@flojoy(deps={"nidmm": "1.4.6"})
+def DIODE_USB4065(
+ NI_address: str = "Dev1",
+ digits: Literal["4.5", "5.5", "6.5"] = "5.5",
+ voltage_limit: Literal["3.5", "10"] = "10",
+ default: Optional[DataContainer] = None,
+) -> Scalar:
+
+
+ connection = DeviceConnectionManager.get_connection(NI_address)
+ session = connection.get_handle()
+
+ session.configure_measurement_digits(
+ nidmm.Function.DIODE,
+ range=float(voltage_limit),
+ resolution_digits=float(digits),
+ )
+
+ reading = session.read()
+
+ return Scalar(c=reading)
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/appendix/hardware.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/appendix/media.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/appendix/notes.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/examples/EX1/app.json b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/examples/EX1/app.json
new file mode 100644
index 0000000000..39063c25f1
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/examples/EX1/app.json
@@ -0,0 +1,594 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "type": "IO",
+ "data": {
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "label": "CONNECTION USB4065",
+ "func": "CONNECTION_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "CONNECTION_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "desc": "Optional: None"
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/CONNECTION_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": -407.4314234630916,
+ "y": -63.38316705720263
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": -407.4314234630916,
+ "y": -63.38316705720263
+ },
+ "dragging": true
+ },
+ {
+ "width": 96,
+ "height": 96,
+ "id": "LOOP-fdac3e37-4b37-49f0-976b-38ac4759268f",
+ "type": "LOGIC_GATES",
+ "data": {
+ "id": "LOOP-fdac3e37-4b37-49f0-976b-38ac4759268f",
+ "label": "LOOP",
+ "func": "LOOP",
+ "type": "LOGIC_GATES",
+ "ctrls": {
+ "num_loops": {
+ "type": "int",
+ "default": -1,
+ "desc": "number of times to iterate through body nodes, default is \"-1\" meaning infinity.",
+ "overload": null,
+ "functionName": "LOOP",
+ "param": "num_loops",
+ "value": 25
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "body",
+ "id": "body",
+ "type": "Any",
+ "desc": null
+ },
+ {
+ "name": "end",
+ "id": "end",
+ "type": "Any",
+ "desc": null
+ }
+ ],
+ "path": "LOGIC_GATES/LOOPS/LOOP/LOOP.py",
+ "selected": true
+ },
+ "position": {
+ "x": 227.6964774956631,
+ "y": -20.121881497152287
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 227.6964774956631,
+ "y": -20.121881497152287
+ },
+ "dragging": true
+ },
+ {
+ "width": 96,
+ "height": 96,
+ "id": "APPEND-adc5b868-3b2c-41f1-9ec8-ae0a411b1a22",
+ "type": "LOGIC_GATES",
+ "data": {
+ "id": "APPEND-adc5b868-3b2c-41f1-9ec8-ae0a411b1a22",
+ "label": "APPEND",
+ "func": "APPEND",
+ "type": "LOGIC_GATES",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "primary_dp",
+ "id": "primary_dp",
+ "type": "OrderedPair|Matrix|DataFrame|Scalar|Vector",
+ "multiple": false,
+ "desc": "Input that ends up \"on top\" of the resulting DataContainer."
+ },
+ {
+ "name": "secondary_dp",
+ "id": "secondary_dp",
+ "type": "OrderedPair|Matrix|DataFrame|Scalar|Vector",
+ "multiple": false,
+ "desc": "Input that ends up \"on the bottom\" of the resulting DataContainer."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Matrix|DataFrame|Vector",
+ "desc": null
+ }
+ ],
+ "path": "LOGIC_GATES/LOOPS/APPEND/APPEND.py",
+ "selected": false
+ },
+ "position": {
+ "x": 735.3226087858226,
+ "y": -250.41039060991284
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 735.3226087858226,
+ "y": -250.41039060991284
+ },
+ "dragging": true
+ },
+ {
+ "width": 208,
+ "height": 96,
+ "id": "FEEDBACK-dd1c23ff-8f91-4892-9f1c-8d4b91c50aa2",
+ "type": "GENERATORS",
+ "data": {
+ "id": "FEEDBACK-dd1c23ff-8f91-4892-9f1c-8d4b91c50aa2",
+ "label": "FEEDBACK",
+ "func": "FEEDBACK",
+ "type": "GENERATORS",
+ "ctrls": {
+ "referred_node": {
+ "type": "NodeReference",
+ "default": null,
+ "desc": "The node ID to capture the result from.",
+ "overload": null,
+ "functionName": "FEEDBACK",
+ "param": "referred_node",
+ "value": "APPEND-adc5b868-3b2c-41f1-9ec8-ae0a411b1a22"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "desc": null
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/FEEDBACK/FEEDBACK.py",
+ "selected": false
+ },
+ "position": {
+ "x": 438.29263845094783,
+ "y": -163.366406533838
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 438.29263845094783,
+ "y": -163.366406533838
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "LINE-6977d433-f342-4c5a-9035-43961641c18c",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "LINE-6977d433-f342-4c5a-9035-43961641c18c",
+ "label": "LINE",
+ "func": "LINE",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|DataFrame|Matrix|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing the Plotly Line visualization of the input data"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/LINE/LINE.py",
+ "selected": false
+ },
+ "position": {
+ "x": 973.9903536635177,
+ "y": -319.7488298823558
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 973.9903536635177,
+ "y": -319.7488298823558
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DIODE_USB4065-83689859-e7b8-42d1-ab55-b5c7130633c9",
+ "type": "IO",
+ "data": {
+ "id": "DIODE_USB4065-83689859-e7b8-42d1-ab55-b5c7130633c9",
+ "label": "DIODE USB4065",
+ "func": "DIODE_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "DIODE_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ },
+ "digits": {
+ "type": "select",
+ "options": [
+ "4.5",
+ "5.5",
+ "6.5"
+ ],
+ "default": "5.5",
+ "desc": "The accuracy of the reading in digits. Lower values are faster.",
+ "overload": null,
+ "functionName": "DIODE_USB4065",
+ "param": "digits",
+ "value": "4.5"
+ },
+ "voltage_limit": {
+ "type": "select",
+ "options": [
+ "3.5",
+ "10"
+ ],
+ "default": "10",
+ "desc": "The maximum voltage to allow, in Volts.",
+ "overload": null,
+ "functionName": "DIODE_USB4065",
+ "param": "voltage_limit",
+ "value": "3.5"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "Scalar: The DC voltage reading."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/DIODE_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": -116.51249844926463,
+ "y": -66.10396672338652
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": -116.51249844926463,
+ "y": -66.10396672338652
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DIODE_USB4065-f3d001ec-a80f-4216-886b-a260672a36e3",
+ "type": "IO",
+ "data": {
+ "id": "DIODE_USB4065-f3d001ec-a80f-4216-886b-a260672a36e3",
+ "label": "DIODE USB4065 1",
+ "func": "DIODE_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "DIODE_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ },
+ "digits": {
+ "type": "select",
+ "options": [
+ "4.5",
+ "5.5",
+ "6.5"
+ ],
+ "default": "5.5",
+ "desc": "The accuracy of the reading in digits. Lower values are faster.",
+ "overload": null,
+ "functionName": "DIODE_USB4065",
+ "param": "digits",
+ "value": "4.5"
+ },
+ "voltage_limit": {
+ "type": "select",
+ "options": [
+ "3.5",
+ "10"
+ ],
+ "default": "10",
+ "desc": "The maximum voltage to allow, in Volts.",
+ "overload": null,
+ "functionName": "DIODE_USB4065",
+ "param": "voltage_limit",
+ "value": "3.5"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "Scalar: The DC voltage reading."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/DIODE_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 451.32763370126673,
+ "y": -431.75316643155406
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 451.32763370126673,
+ "y": -431.75316643155406
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "label": "BIG NUMBER",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default = \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether or not to show the relative delta from the last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": true
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing the Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 942.0359776564547,
+ "y": -618.7319046543057
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 942.0359776564547,
+ "y": -618.7319046543057
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "LOOP-fdac3e37-4b37-49f0-976b-38ac4759268f",
+ "sourceHandle": "body",
+ "target": "FEEDBACK-dd1c23ff-8f91-4892-9f1c-8d4b91c50aa2",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LOOP-fdac3e37-4b37-49f0-976b-38ac4759268fbody-FEEDBACK-dd1c23ff-8f91-4892-9f1c-8d4b91c50aa2default"
+ },
+ {
+ "source": "FEEDBACK-dd1c23ff-8f91-4892-9f1c-8d4b91c50aa2",
+ "sourceHandle": "default",
+ "target": "APPEND-adc5b868-3b2c-41f1-9ec8-ae0a411b1a22",
+ "targetHandle": "primary_dp",
+ "id": "reactflow__edge-FEEDBACK-dd1c23ff-8f91-4892-9f1c-8d4b91c50aa2default-APPEND-adc5b868-3b2c-41f1-9ec8-ae0a411b1a22primary_dp"
+ },
+ {
+ "source": "APPEND-adc5b868-3b2c-41f1-9ec8-ae0a411b1a22",
+ "sourceHandle": "default",
+ "target": "LINE-6977d433-f342-4c5a-9035-43961641c18c",
+ "targetHandle": "default",
+ "id": "reactflow__edge-APPEND-adc5b868-3b2c-41f1-9ec8-ae0a411b1a22default-LINE-6977d433-f342-4c5a-9035-43961641c18cdefault"
+ },
+ {
+ "source": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "sourceHandle": "default",
+ "target": "DIODE_USB4065-83689859-e7b8-42d1-ab55-b5c7130633c9",
+ "targetHandle": "default",
+ "id": "reactflow__edge-CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1default-DIODE_USB4065-83689859-e7b8-42d1-ab55-b5c7130633c9default"
+ },
+ {
+ "source": "DIODE_USB4065-83689859-e7b8-42d1-ab55-b5c7130633c9",
+ "sourceHandle": "default",
+ "target": "LOOP-fdac3e37-4b37-49f0-976b-38ac4759268f",
+ "targetHandle": "default",
+ "id": "reactflow__edge-DIODE_USB4065-83689859-e7b8-42d1-ab55-b5c7130633c9default-LOOP-fdac3e37-4b37-49f0-976b-38ac4759268fdefault"
+ },
+ {
+ "source": "LOOP-fdac3e37-4b37-49f0-976b-38ac4759268f",
+ "sourceHandle": "body",
+ "target": "DIODE_USB4065-f3d001ec-a80f-4216-886b-a260672a36e3",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LOOP-fdac3e37-4b37-49f0-976b-38ac4759268fbody-DIODE_USB4065-f3d001ec-a80f-4216-886b-a260672a36e3default"
+ },
+ {
+ "source": "DIODE_USB4065-f3d001ec-a80f-4216-886b-a260672a36e3",
+ "sourceHandle": "default",
+ "target": "APPEND-adc5b868-3b2c-41f1-9ec8-ae0a411b1a22",
+ "targetHandle": "secondary_dp",
+ "id": "reactflow__edge-DIODE_USB4065-f3d001ec-a80f-4216-886b-a260672a36e3default-APPEND-adc5b868-3b2c-41f1-9ec8-ae0a411b1a22secondary_dp"
+ },
+ {
+ "source": "DIODE_USB4065-f3d001ec-a80f-4216-886b-a260672a36e3",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06b",
+ "targetHandle": "default",
+ "id": "reactflow__edge-DIODE_USB4065-f3d001ec-a80f-4216-886b-a260672a36e3default-BIG_NUMBER-4f55667b-079e-4735-aa52-3bb18be8e06bdefault"
+ }
+ ],
+ "viewport": {
+ "x": 1139.470292881633,
+ "y": 572.2854272048312,
+ "zoom": 1.2136444284334926
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/examples/EX1/example.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/DIODE_USB4065/examples/EX1/example.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/RESISTANCE_USB4065.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/RESISTANCE_USB4065.md
new file mode 100644
index 0000000000..ecb35fce7d
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/RESISTANCE_USB4065.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/a1-[autogen]/docstring.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..703559d466
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/a1-[autogen]/docstring.txt
@@ -0,0 +1,31 @@
+The RESISTANCE_USB4065 node reads the two-wire resistance from a USB-4065.
+
+ The four-wire resistance is more accurate than two-wire and can be measured
+ with the FOUR_WIRE_RESIST_USB4065 node.
+
+ The USB-4065 is a NI (National Instruments) multimeter. It is possible that
+ the node will work with other NI DMMs (digital multimeters) such as the
+ 4070 and 4080 series.
+
+ This instrument will likely only be compatible with Windows systems due to
+ NI driver availablity. To use the instrument you must install the runtime:
+
+ https://www.ni.com/en/support/downloads/drivers/download.ni-dmm.html
+
+ You must also find the address/resource name for the instrument. You can
+ find this using the NI MAX programming which can be downloaded when
+ installing the drivers.
+
+ Parameters
+ ----------
+ NI_address: str
+ The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').
+ digits: str
+ The accuracy of the reading in digits. Lower values are faster.
+ resist_limit: str
+ The maximum resistance to allow, in Volts.
+
+ Returns
+ -------
+ DataContainer
+ Scalar: The DC voltage reading.
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/a1-[autogen]/python_code.txt b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..6d6bbb1e3a
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/a1-[autogen]/python_code.txt
@@ -0,0 +1,27 @@
+from flojoy import flojoy, DataContainer, Scalar
+from flojoy.connection_manager import DeviceConnectionManager
+from typing import Optional, Literal
+import nidmm
+
+
+@flojoy(deps={"nidmm": "1.4.6"})
+def RESISTANCE_USB4065(
+ NI_address: str = "Dev1",
+ digits: Literal["4.5", "5.5", "6.5"] = "5.5",
+ resist_limit: Literal["100", "1000", "1e4", "1e5", "1e6", "1e7", "1e8"] = "1e8",
+ default: Optional[DataContainer] = None,
+) -> Scalar:
+
+
+ connection = DeviceConnectionManager.get_connection(NI_address)
+ session = connection.get_handle()
+
+ session.configure_measurement_digits(
+ nidmm.Function.TWO_WIRE_RES,
+ range=float(resist_limit),
+ resolution_digits=float(digits),
+ )
+
+ reading = session.read()
+
+ return Scalar(c=reading)
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/appendix/hardware.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/appendix/media.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/appendix/notes.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/examples/EX1/app.json b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/examples/EX1/app.json
new file mode 100644
index 0000000000..7ee5bc2698
--- /dev/null
+++ b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/examples/EX1/app.json
@@ -0,0 +1,266 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "type": "IO",
+ "data": {
+ "id": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "label": "CONNECTION USB4065",
+ "func": "CONNECTION_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "CONNECTION_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "desc": "Optional: None"
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/CONNECTION_USB4065/CONNECTION_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 4.704499736461486,
+ "y": -114.58793327290465
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 4.704499736461486,
+ "y": -114.58793327290465
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "label": "BIG NUMBER 1",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default = \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether or not to show the relative delta from the last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": true
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing the Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 779.8328146881206,
+ "y": -134.05091491913146
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 779.8328146881206,
+ "y": -134.05091491913146
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "RESISTANCE_USB4065-be7ec375-8dda-4e2a-b1e9-4b25945441d3",
+ "type": "IO",
+ "data": {
+ "id": "RESISTANCE_USB4065-be7ec375-8dda-4e2a-b1e9-4b25945441d3",
+ "label": "RESISTANCE USB4065",
+ "func": "RESISTANCE_USB4065",
+ "type": "IO",
+ "ctrls": {
+ "NI_address": {
+ "type": "str",
+ "default": "Dev1",
+ "desc": "The NI instrument address for the instrument (e.g. 'Dev0', 'Dev1').",
+ "overload": null,
+ "functionName": "RESISTANCE_USB4065",
+ "param": "NI_address",
+ "value": "Dev1"
+ },
+ "digits": {
+ "type": "select",
+ "options": [
+ "4.5",
+ "5.5",
+ "6.5"
+ ],
+ "default": "5.5",
+ "desc": "The accuracy of the reading in digits. Lower values are faster.",
+ "overload": null,
+ "functionName": "RESISTANCE_USB4065",
+ "param": "digits",
+ "value": "4.5"
+ },
+ "resist_limit": {
+ "type": "select",
+ "options": [
+ "100",
+ "1000",
+ "1e4",
+ "1e5",
+ "1e6",
+ "1e7",
+ "1e8"
+ ],
+ "default": "1e8",
+ "desc": "The maximum resistance to allow, in Volts.",
+ "overload": null,
+ "functionName": "RESISTANCE_USB4065",
+ "param": "resist_limit",
+ "value": "100"
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "Scalar: The DC voltage reading."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "nidmm",
+ "v": "1.4.6"
+ }
+ ],
+ "path": "IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/RESISTANCE_USB4065.py",
+ "selected": false
+ },
+ "position": {
+ "x": 383.1035717255011,
+ "y": -122.14124419049455
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 383.1035717255011,
+ "y": -122.14124419049455
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1",
+ "sourceHandle": "default",
+ "target": "RESISTANCE_USB4065-be7ec375-8dda-4e2a-b1e9-4b25945441d3",
+ "targetHandle": "default",
+ "id": "reactflow__edge-CONNECTION_USB4065-33140410-b4f4-4e67-8613-7559b997c8e1default-RESISTANCE_USB4065-be7ec375-8dda-4e2a-b1e9-4b25945441d3default"
+ },
+ {
+ "source": "RESISTANCE_USB4065-be7ec375-8dda-4e2a-b1e9-4b25945441d3",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085dec",
+ "targetHandle": "default",
+ "id": "reactflow__edge-RESISTANCE_USB4065-be7ec375-8dda-4e2a-b1e9-4b25945441d3default-BIG_NUMBER-58ecefea-6da3-4e07-b581-b9796f085decdefault"
+ }
+ ],
+ "viewport": {
+ "x": 1139.470292881633,
+ "y": 572.2854272048312,
+ "zoom": 1.2136444284334926
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/examples/EX1/example.md b/docs/nodes/IO/INSTRUMENTS/MULTIMETERS/NI/USB_4065/BASIC/RESISTANCE_USB4065/examples/EX1/example.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/ACTIVATE.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/ACTIVATE.md
new file mode 100644
index 0000000000..243769fd76
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/ACTIVATE.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/a1-[autogen]/docstring.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..7bb3db1abd
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/a1-[autogen]/docstring.txt
@@ -0,0 +1,18 @@
+
+The ACTIVATE node activates the robot arm.
+
+Inputs
+------
+ip_address: TextBlob
+ The IP address of the robot arm.
+
+Parameters
+------
+simulator
+ Whether to activate the simulator or not. Defaults to False.
+
+Returns
+-------
+ip
+ The IP address of the robot arm.
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/a1-[autogen]/python_code.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..d733a5b264
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/a1-[autogen]/python_code.txt
@@ -0,0 +1,14 @@
+from flojoy import flojoy, TextBlob
+from PYTHON.utils.mecademic_state.mecademic_state import query_for_handle
+
+
+@flojoy(deps={"mecademicpy": "1.4.0"})
+def ACTIVATE(ip_address: TextBlob, simulator: bool = False) -> TextBlob:
+
+ handle = query_for_handle(ip_address)
+ if simulator:
+ handle.ActivateSim()
+ else:
+ handle.ActivateRobot()
+ handle.WaitActivated()
+ return ip_address
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/appendix/hardware.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/appendix/media.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/appendix/notes.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/examples/EX1/app.json b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/examples/EX1/app.json
new file mode 100644
index 0000000000..b9409d198e
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/examples/EX1/app.json
@@ -0,0 +1,177 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "label": "CONNECT",
+ "func": "CONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "ip_address": {
+ "type": "str",
+ "default": null,
+ "desc": null,
+ "overload": null,
+ "functionName": "CONNECT",
+ "param": "ip_address",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/CONNECT/CONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "label": "ACTIVATE",
+ "func": "ACTIVATE",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "simulator": {
+ "type": "bool",
+ "default": false,
+ "desc": "Whether to activate the simulator or not. Defaults to False.",
+ "overload": null,
+ "functionName": "ACTIVATE",
+ "param": "simulator",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/ACTIVATE/ACTIVATE.py",
+ "selected": false
+ },
+ "position": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "label": "DISCONNECT",
+ "func": "DISCONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/DISCONNECT/DISCONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 877.4514022741033,
+ "y": -212.57592377531705
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 877.4514022741033,
+ "y": -212.57592377531705
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "sourceHandle": "default",
+ "target": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7default-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bip_address"
+ },
+ {
+ "source": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "sourceHandle": "default",
+ "target": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bdefault-DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0dip_address"
+ }
+ ],
+ "viewport": {
+ "x": 669.537650867023,
+ "y": 398.1114317341454,
+ "zoom": 0.7467072297113905
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/examples/EX1/example.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/examples/EX1/example.md
new file mode 100644
index 0000000000..a6379eacbe
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/ACTIVATE/examples/EX1/example.md
@@ -0,0 +1,7 @@
+In this example, the `ACTIVATE` node is responsible for activating the MECADEMIC MECA500 robot arm.
+
+The node takes in the IP address of the robot arm and an optional parameter to specify if the simulator should be activated instead of the actual robot arm.
+
+After activation, the node returns the same IP address as an acknowledgment that the robot arm is now active.
+
+The `ACTIVATE` node is often the first node in a flow, ensuring that the robot arm is ready for subsequent operations.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/CONNECT.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/CONNECT.md
new file mode 100644
index 0000000000..6c6c76f8bd
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/CONNECT.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/a1-[autogen]/docstring.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..a008080159
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/a1-[autogen]/docstring.txt
@@ -0,0 +1,7 @@
+
+The CONNECT node establishes a connection to the Mecademic robot arm via its API.
+
+Returns
+-------
+String
+ The IP address of the robot arm.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/a1-[autogen]/python_code.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..ef2828c7e2
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/a1-[autogen]/python_code.txt
@@ -0,0 +1,10 @@
+from flojoy import flojoy, TextBlob
+from PYTHON.utils.mecademic_state.mecademic_state import add_handle, init_handle_map
+
+
+@flojoy(deps={"mecademicpy": "1.4.0"})
+def CONNECT(ip_address: str) -> TextBlob:
+
+ init_handle_map(allow_reinit=True)
+ add_handle(ip_address)
+ return TextBlob(text_blob=ip_address)
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/appendix/hardware.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/appendix/media.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/appendix/notes.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/examples/EX1/app.json b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/examples/EX1/app.json
new file mode 100644
index 0000000000..4218544e3a
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/examples/EX1/app.json
@@ -0,0 +1,62 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "label": "CONNECT",
+ "func": "CONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "ip_address": {
+ "type": "str",
+ "default": null,
+ "desc": null,
+ "overload": null,
+ "functionName": "CONNECT",
+ "param": "ip_address",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/CONNECT/CONNECT.py",
+ "selected": true
+ },
+ "position": {
+ "x": 147.11340802118116,
+ "y": -226.6906150209435
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 147.11340802118116,
+ "y": -226.6906150209435
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [],
+ "viewport": {
+ "x": 669.537650867023,
+ "y": 398.1114317341454,
+ "zoom": 0.7467072297113905
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/examples/EX1/example.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/examples/EX1/example.md
new file mode 100644
index 0000000000..5ecbc8a8d5
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/CONNECT/examples/EX1/example.md
@@ -0,0 +1,7 @@
+In this example, the `CONNECT` node establishes a connection with the MECADEMIC MECA500 robot arm.
+
+The node takes in the IP address of the robot arm as an input. It initializes the handle map and adds a handle for the given IP address.
+
+Upon successful connection, the node returns the IP address, confirming that the robot arm is now connected and ready for further operations.
+
+The `CONNECT` node is used at the beginning of a workflow to ensure that a connection is established before any other operations are carried out.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/DELAY.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/DELAY.md
new file mode 100644
index 0000000000..1b016211bd
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/DELAY.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/a1-[autogen]/docstring.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..2d48138225
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/a1-[autogen]/docstring.txt
@@ -0,0 +1,16 @@
+
+The DELAY node delays the action between two nodes.
+
+Inputs
+------
+ip_address: TextBlob
+ The IP address of the robot arm.
+
+time: float
+ The time of delay in seconds.
+
+Returns
+-------
+ip_address
+ The IP address of the robot arm.
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/a1-[autogen]/python_code.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..28dce71882
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/a1-[autogen]/python_code.txt
@@ -0,0 +1,14 @@
+from flojoy import flojoy, TextBlob
+from PYTHON.utils.mecademic_state.mecademic_state import query_for_handle
+
+
+@flojoy(deps={"mecademicpy": "1.4.0"})
+def DELAY(
+ ip_address: TextBlob,
+ time: float,
+) -> TextBlob:
+
+ robot = query_for_handle(ip_address)
+ robot.Delay(time)
+ robot.WaitIdle()
+ return ip_address
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/appendix/hardware.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/appendix/media.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/appendix/notes.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/examples/EX1/app.json b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/examples/EX1/app.json
new file mode 100644
index 0000000000..9d24445be5
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/examples/EX1/app.json
@@ -0,0 +1,243 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "label": "CONNECT",
+ "func": "CONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "ip_address": {
+ "type": "str",
+ "default": null,
+ "desc": null,
+ "overload": null,
+ "functionName": "CONNECT",
+ "param": "ip_address",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/CONNECT/CONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "label": "ACTIVATE",
+ "func": "ACTIVATE",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "simulator": {
+ "type": "bool",
+ "default": false,
+ "desc": "Whether to activate the simulator or not. Defaults to False.",
+ "overload": null,
+ "functionName": "ACTIVATE",
+ "param": "simulator",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/ACTIVATE/ACTIVATE.py",
+ "selected": false
+ },
+ "position": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "label": "DISCONNECT",
+ "func": "DISCONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/DISCONNECT/DISCONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 1101.099966738314,
+ "y": -221.9504145013618
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 1101.099966738314,
+ "y": -221.9504145013618
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DELAY-224f6b43-7f67-4b99-8e54-b2e59d343dd4",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "DELAY-224f6b43-7f67-4b99-8e54-b2e59d343dd4",
+ "label": "DELAY",
+ "func": "DELAY",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "time": {
+ "type": "float",
+ "default": null,
+ "desc": "The time of delay in seconds.",
+ "overload": null,
+ "functionName": "DELAY",
+ "param": "time",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/DELAY/DELAY.py",
+ "selected": false
+ },
+ "position": {
+ "x": 796.8515702097197,
+ "y": -212.51275859234926
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 796.8515702097197,
+ "y": -212.51275859234926
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "sourceHandle": "default",
+ "target": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7default-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bip_address"
+ },
+ {
+ "source": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "sourceHandle": "default",
+ "target": "DELAY-224f6b43-7f67-4b99-8e54-b2e59d343dd4",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bdefault-DELAY-224f6b43-7f67-4b99-8e54-b2e59d343dd4ip_address"
+ },
+ {
+ "source": "DELAY-224f6b43-7f67-4b99-8e54-b2e59d343dd4",
+ "sourceHandle": "default",
+ "target": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-DELAY-224f6b43-7f67-4b99-8e54-b2e59d343dd4default-DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0dip_address"
+ }
+ ],
+ "viewport": {
+ "x": 669.537650867023,
+ "y": 398.1114317341454,
+ "zoom": 0.7467072297113905
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/examples/EX1/example.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/examples/EX1/example.md
new file mode 100644
index 0000000000..e0be158693
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DELAY/examples/EX1/example.md
@@ -0,0 +1,7 @@
+In this example, the `DELAY` node introduces a pause in the robot arm's operation for a specified duration.
+
+The node takes in the time for the delay in seconds.
+
+After initiating the delay, the node waits for the robot arm to become idle before proceeding.
+
+The `DELAY` node is useful in workflows where you need to introduce a pause between operations, such as waiting for an external sensor to trigger or allowing time for a mechanical process to complete.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/DISCONNECT.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/DISCONNECT.md
new file mode 100644
index 0000000000..4e1b7debfe
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/DISCONNECT.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/a1-[autogen]/docstring.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..b6686fe4bc
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/a1-[autogen]/docstring.txt
@@ -0,0 +1,8 @@
+
+The DISCONNECT node disconnect the Mecademic robot arm via its API.
+
+Inputs
+------
+ip_address
+ The IP address of the robot arm.
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/a1-[autogen]/python_code.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..f44c8698c8
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/a1-[autogen]/python_code.txt
@@ -0,0 +1,20 @@
+from flojoy import flojoy, TextBlob
+from PYTHON.utils.mecademic_state.mecademic_state import query_for_handle
+
+
+@flojoy(deps={"mecademicpy": "1.4.0"})
+def DISCONNECT(ip_address: TextBlob) -> None:
+
+
+ robot = query_for_handle(ip_address.text_blob)
+
+ robot.WaitIdle()
+
+ robot.DeactivateRobot()
+ robot.WaitDeactivated()
+
+ robot.Disconnect()
+ robot.WaitSimDeactivated()
+ robot.WaitDisconnected()
+
+ return None
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/appendix/hardware.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/appendix/media.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/appendix/notes.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/examples/EX1/app.json b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/examples/EX1/app.json
new file mode 100644
index 0000000000..39a513e969
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/examples/EX1/app.json
@@ -0,0 +1,177 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "label": "CONNECT",
+ "func": "CONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "ip_address": {
+ "type": "str",
+ "default": null,
+ "desc": null,
+ "overload": null,
+ "functionName": "CONNECT",
+ "param": "ip_address",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/CONNECT/CONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 147.11340802118116,
+ "y": -228.02982798180705
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 147.11340802118116,
+ "y": -228.02982798180705
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "label": "ACTIVATE",
+ "func": "ACTIVATE",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "simulator": {
+ "type": "bool",
+ "default": false,
+ "desc": "Whether to activate the simulator or not. Defaults to False.",
+ "overload": null,
+ "functionName": "ACTIVATE",
+ "param": "simulator",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/ACTIVATE/ACTIVATE.py",
+ "selected": false
+ },
+ "position": {
+ "x": 518.3290550495333,
+ "y": -229.41169426048555
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 518.3290550495333,
+ "y": -229.41169426048555
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DISCONNECT-44ec7a88-2ffa-4642-9578-3259d6035acf",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "DISCONNECT-44ec7a88-2ffa-4642-9578-3259d6035acf",
+ "label": "DISCONNECT",
+ "func": "DISCONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/DISCONNECT/DISCONNECT.py",
+ "selected": true
+ },
+ "position": {
+ "x": 873.82120699744,
+ "y": -235.86327031832397
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 873.82120699744,
+ "y": -235.86327031832397
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "sourceHandle": "default",
+ "target": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7default-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bip_address"
+ },
+ {
+ "source": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "sourceHandle": "default",
+ "target": "DISCONNECT-44ec7a88-2ffa-4642-9578-3259d6035acf",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bdefault-DISCONNECT-44ec7a88-2ffa-4642-9578-3259d6035acfip_address"
+ }
+ ],
+ "viewport": {
+ "x": 669.537650867023,
+ "y": 398.1114317341454,
+ "zoom": 0.7467072297113905
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/examples/EX1/example.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/examples/EX1/example.md
new file mode 100644
index 0000000000..0b779c166f
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/DISCONNECT/examples/EX1/example.md
@@ -0,0 +1,5 @@
+In this example, the `DISCONNECT` node terminates the connection with the MECADEMIC MECA500 robot arm.
+
+After ensuring the robot arm is idle, the node deactivates the robot and waits for confirmation of deactivation. It then disconnects from the robot arm entirely.
+
+The `DISCONNECT` node should always used at the end of a workflow to safely terminate the connection and ensure that the robot arm is in a deactivated state.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/HOME.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/HOME.md
new file mode 100644
index 0000000000..dbcb3611ae
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/HOME.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/a1-[autogen]/docstring.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..97a1bc3361
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/a1-[autogen]/docstring.txt
@@ -0,0 +1,12 @@
+
+The HOME node homes the robot arm. This node is required to be run before any other robot arm movement. It is recommended to run this node immediately after "ACTIVATE".
+
+Inputs
+------
+ip_address
+ The IP address of the robot arm.
+
+Returns
+-------
+ip_address
+ The IP address of the robot arm.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/a1-[autogen]/python_code.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..481f95aa41
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/a1-[autogen]/python_code.txt
@@ -0,0 +1,11 @@
+from flojoy import flojoy, TextBlob
+from PYTHON.utils.mecademic_state.mecademic_state import query_for_handle
+
+
+@flojoy(deps={"mecademicpy": "1.4.0"})
+def HOME(ip_address: TextBlob) -> TextBlob:
+
+ robot = query_for_handle(ip_address)
+ robot.Home()
+ robot.WaitHomed()
+ return ip_address
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/appendix/hardware.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/appendix/media.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/appendix/notes.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/examples/EX1/app.json b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/examples/EX1/app.json
new file mode 100644
index 0000000000..eefbaa52c1
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/examples/EX1/app.json
@@ -0,0 +1,233 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "label": "CONNECT",
+ "func": "CONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "ip_address": {
+ "type": "str",
+ "default": null,
+ "desc": null,
+ "overload": null,
+ "functionName": "CONNECT",
+ "param": "ip_address",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/CONNECT/CONNECT.py",
+ "selected": true
+ },
+ "position": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "label": "ACTIVATE",
+ "func": "ACTIVATE",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "simulator": {
+ "type": "bool",
+ "default": false,
+ "desc": "Whether to activate the simulator or not. Defaults to False.",
+ "overload": null,
+ "functionName": "ACTIVATE",
+ "param": "simulator",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/ACTIVATE/ACTIVATE.py",
+ "selected": false
+ },
+ "position": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "HOME-5d83ba76-5510-4e1c-8dd6-51e6e5e4a150",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "HOME-5d83ba76-5510-4e1c-8dd6-51e6e5e4a150",
+ "label": "HOME",
+ "func": "HOME",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/HOME/HOME.py",
+ "selected": false
+ },
+ "position": {
+ "x": 885.8669467295067,
+ "y": -220.98094200847677
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 885.8669467295067,
+ "y": -220.98094200847677
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "label": "DISCONNECT",
+ "func": "DISCONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/DISCONNECT/DISCONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 1273.85843868971,
+ "y": -224.62884042308886
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 1273.85843868971,
+ "y": -224.62884042308886
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "sourceHandle": "default",
+ "target": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7default-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bip_address"
+ },
+ {
+ "source": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "sourceHandle": "default",
+ "target": "HOME-5d83ba76-5510-4e1c-8dd6-51e6e5e4a150",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bdefault-HOME-5d83ba76-5510-4e1c-8dd6-51e6e5e4a150ip_address"
+ },
+ {
+ "source": "HOME-5d83ba76-5510-4e1c-8dd6-51e6e5e4a150",
+ "sourceHandle": "default",
+ "target": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-HOME-5d83ba76-5510-4e1c-8dd6-51e6e5e4a150default-DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0dip_address"
+ }
+ ],
+ "viewport": {
+ "x": 669.537650867023,
+ "y": 398.1114317341454,
+ "zoom": 0.7467072297113905
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/examples/EX1/example.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/examples/EX1/example.md
new file mode 100644
index 0000000000..866ed3dbdc
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/HOME/examples/EX1/example.md
@@ -0,0 +1,5 @@
+In this example, the `HOME` node homes the robot arm, setting it to its default position.
+
+This node is essential to run before any other movement operations on the robot arm. It's recommended to use this node immediately after the `ACTIVATE` node to ensure the robot arm is in a known state.
+
+After the homing process, the node waits for confirmation that the robot arm has been successfully homed.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MECADEMIC.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MECADEMIC.md
new file mode 100644
index 0000000000..f4769ff1d2
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MECADEMIC.md
@@ -0,0 +1,12 @@
+---
+sidebar_label: Mecademic
+slug: /nodes/IO/ROBOTICS/ARMS/
+---
+
+# MECADEMICS
+
+Welcome to the Mecademic Arm nodes page!
+
+Here you can explore various nodes related to the operations of the Mecademic robotic arm on the Flojoy platform. These nodes serve as the bridge between the Flojoy visual programming environment and the real-world mechanical operations carried out by the Mecademic robotic arm.
+
+Each node corresponds to a specific action or setting of the Mecademic robotic arm, making it effortless to visually program and control the robot for various applications.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/MOVE_JOINT.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/MOVE_JOINT.md
new file mode 100644
index 0000000000..0ade6cef08
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/MOVE_JOINT.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/a1-[autogen]/docstring.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..ef4439f6bc
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/a1-[autogen]/docstring.txt
@@ -0,0 +1,28 @@
+
+The MOVE_JOINT node linearly moves the robot's tool to an absolute Cartesian position.
+
+Inputs
+------
+ip_address: TextBlob
+ The IP address of the robot arm.
+
+Parameters
+------
+x : float
+ The x coordinate of the position to move to
+y : float
+ The y coordinate of the position to move to
+z : float
+ The z coordinate of the position to move to
+alpha : float, optional
+ The alpha coordinate (rotation in radians about the x axis) of the position to move to.
+beta : float, optional
+ The beta coordinate (rotation in radians about the y axis) of the position to move to.
+gamma : float, optional
+ The gamma coordinate (rotation in radians about the z axis) of the position to move to.
+
+Returns
+-------
+ip_address
+ The IP address of the robot arm.
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/a1-[autogen]/python_code.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..e21ca134d7
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/a1-[autogen]/python_code.txt
@@ -0,0 +1,20 @@
+from flojoy import flojoy, TextBlob
+from typing import Optional
+from PYTHON.utils.mecademic_state.mecademic_state import query_for_handle
+
+
+@flojoy(deps={"mecademicpy": "1.4.0"})
+def MOVE_JOINT(
+ ip_address: TextBlob,
+ x: float,
+ y: float,
+ z: float,
+ alpha: Optional[float] = 0,
+ beta: Optional[float] = 0,
+ gamma: Optional[float] = 0,
+) -> TextBlob:
+
+ robot = query_for_handle(ip_address)
+ robot.MoveJoints(x, y, z, alpha, beta, gamma)
+ robot.WaitIdle()
+ return ip_address
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/appendix/hardware.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/appendix/media.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/appendix/notes.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/examples/EX1/app.json b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/examples/EX1/app.json
new file mode 100644
index 0000000000..2e535cb1ca
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/examples/EX1/app.json
@@ -0,0 +1,344 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "label": "CONNECT",
+ "func": "CONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "ip_address": {
+ "type": "str",
+ "default": null,
+ "desc": null,
+ "overload": null,
+ "functionName": "CONNECT",
+ "param": "ip_address",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/CONNECT/CONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "label": "ACTIVATE",
+ "func": "ACTIVATE",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "simulator": {
+ "type": "bool",
+ "default": false,
+ "desc": "Whether to activate the simulator or not. Defaults to False.",
+ "overload": null,
+ "functionName": "ACTIVATE",
+ "param": "simulator",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/ACTIVATE/ACTIVATE.py",
+ "selected": false
+ },
+ "position": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "label": "DISCONNECT",
+ "func": "DISCONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/DISCONNECT/DISCONNECT.py",
+ "selected": true
+ },
+ "position": {
+ "x": 1340.819086732887,
+ "y": -239.3601829925878
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 1340.819086732887,
+ "y": -239.3601829925878
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "label": "HOME",
+ "func": "HOME",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/HOME/HOME.py",
+ "selected": false
+ },
+ "position": {
+ "x": 794.0911798892838,
+ "y": -216.0856892468523
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 794.0911798892838,
+ "y": -216.0856892468523
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "MOVE_JOINT-8a2342cd-08bc-44a9-b780-1543b2652601",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "MOVE_JOINT-8a2342cd-08bc-44a9-b780-1543b2652601",
+ "label": "MOVE JOINT",
+ "func": "MOVE_JOINT",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "x": {
+ "type": "float",
+ "default": null,
+ "desc": "The x coordinate of the position to move to",
+ "overload": null,
+ "functionName": "MOVE_JOINT",
+ "param": "x",
+ "value": ""
+ },
+ "y": {
+ "type": "float",
+ "default": null,
+ "desc": "The y coordinate of the position to move to",
+ "overload": null,
+ "functionName": "MOVE_JOINT",
+ "param": "y",
+ "value": ""
+ },
+ "z": {
+ "type": "float",
+ "default": null,
+ "desc": "The z coordinate of the position to move to",
+ "overload": null,
+ "functionName": "MOVE_JOINT",
+ "param": "z",
+ "value": ""
+ },
+ "alpha": {
+ "type": "float",
+ "default": 0,
+ "desc": "The alpha coordinate (rotation in radians about the x axis) of the position to move to.",
+ "overload": null,
+ "functionName": "MOVE_JOINT",
+ "param": "alpha",
+ "value": 0
+ },
+ "beta": {
+ "type": "float",
+ "default": 0,
+ "desc": "The beta coordinate (rotation in radians about the y axis) of the position to move to.",
+ "overload": null,
+ "functionName": "MOVE_JOINT",
+ "param": "beta",
+ "value": 0
+ },
+ "gamma": {
+ "type": "float",
+ "default": 0,
+ "desc": "The gamma coordinate (rotation in radians about the z axis) of the position to move to.",
+ "overload": null,
+ "functionName": "MOVE_JOINT",
+ "param": "gamma",
+ "value": 0
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/MOVE_JOINT/MOVE_JOINT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 1043.533227125186,
+ "y": -245.56497455650612
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 1043.533227125186,
+ "y": -245.56497455650612
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "sourceHandle": "default",
+ "target": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7default-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bip_address"
+ },
+ {
+ "source": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "sourceHandle": "default",
+ "target": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bdefault-HOME-15149cd9-755c-47da-8b07-cb63b74c6443ip_address"
+ },
+ {
+ "source": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "sourceHandle": "default",
+ "target": "MOVE_JOINT-8a2342cd-08bc-44a9-b780-1543b2652601",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-HOME-15149cd9-755c-47da-8b07-cb63b74c6443default-MOVE_JOINT-8a2342cd-08bc-44a9-b780-1543b2652601ip_address"
+ },
+ {
+ "source": "MOVE_JOINT-8a2342cd-08bc-44a9-b780-1543b2652601",
+ "sourceHandle": "default",
+ "target": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-MOVE_JOINT-8a2342cd-08bc-44a9-b780-1543b2652601default-DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0dip_address"
+ }
+ ],
+ "viewport": {
+ "x": 669.537650867023,
+ "y": 398.1114317341454,
+ "zoom": 0.7467072297113905
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/examples/EX1/example.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/examples/EX1/example.md
new file mode 100644
index 0000000000..d84c356981
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_JOINT/examples/EX1/example.md
@@ -0,0 +1,7 @@
+In this example, the `MOVE_JOINT` node moves the robot arm to a specified Cartesian position.
+
+The node takes in the x, y, and z coordinates, along with optional alpha, beta, and gamma rotations in radians.
+
+After initiating the movement, the node waits for the robot arm to become idle, indicating that the movement is complete.
+
+The `MOVE_JOINT` node is commonly used in workflows where precise positioning of the robot arm is required, such as picking up an object or performing a specific task.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/MOVE_LIN.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/MOVE_LIN.md
new file mode 100644
index 0000000000..1ba54fb60c
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/MOVE_LIN.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/a1-[autogen]/docstring.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..44e67936f3
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/a1-[autogen]/docstring.txt
@@ -0,0 +1,28 @@
+
+The MOVE_LIN node linearly moves the robot's tool to an absolute Cartesian position.
+
+Inputs
+------
+ip_address: TextBlob
+ The IP address of the robot arm.
+
+Parameters
+------
+x : float
+ The x coordinate of the position to move to
+y : float
+ The y coordinate of the position to move to
+z : float
+ The z coordinate of the position to move to
+alpha : float, optional
+ The alpha coordinate (rotation in radians about the x axis) of the position to move to.
+beta : float, optional
+ The beta coordinate (rotation in radians about the y axis) of the position to move to.
+gamma : float, optional
+ The gamma coordinate (rotation in radians about the z axis) of the position to move to.
+
+Returns
+-------
+ip_address
+ The IP address of the robot arm.
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/a1-[autogen]/python_code.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..2ee1855ed2
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/a1-[autogen]/python_code.txt
@@ -0,0 +1,20 @@
+from flojoy import flojoy, TextBlob
+from typing import Optional
+from PYTHON.utils.mecademic_state.mecademic_state import query_for_handle
+
+
+@flojoy(deps={"mecademicpy": "1.4.0"})
+def MOVE_LIN(
+ ip_address: TextBlob,
+ x: float,
+ y: float,
+ z: float,
+ alpha: Optional[float] = 0,
+ beta: Optional[float] = 0,
+ gamma: Optional[float] = 0,
+) -> TextBlob:
+
+ robot = query_for_handle(ip_address)
+ robot.MoveLin(x=x, y=y, z=z, alpha=alpha, beta=beta, gamma=gamma)
+ robot.WaitIdle()
+ return ip_address
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/appendix/hardware.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/appendix/media.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/appendix/notes.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/examples/EX1/app.json b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/examples/EX1/app.json
new file mode 100644
index 0000000000..ce0d262ea7
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/examples/EX1/app.json
@@ -0,0 +1,344 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "label": "CONNECT",
+ "func": "CONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "ip_address": {
+ "type": "str",
+ "default": null,
+ "desc": null,
+ "overload": null,
+ "functionName": "CONNECT",
+ "param": "ip_address",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/CONNECT/CONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "label": "ACTIVATE",
+ "func": "ACTIVATE",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "simulator": {
+ "type": "bool",
+ "default": false,
+ "desc": "Whether to activate the simulator or not. Defaults to False.",
+ "overload": null,
+ "functionName": "ACTIVATE",
+ "param": "simulator",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/ACTIVATE/ACTIVATE.py",
+ "selected": false
+ },
+ "position": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "label": "DISCONNECT",
+ "func": "DISCONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/DISCONNECT/DISCONNECT.py",
+ "selected": true
+ },
+ "position": {
+ "x": 1359.5680681849765,
+ "y": -215.25434969704412
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 1359.5680681849765,
+ "y": -215.25434969704412
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "label": "HOME",
+ "func": "HOME",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/HOME/HOME.py",
+ "selected": false
+ },
+ "position": {
+ "x": 794.0911798892838,
+ "y": -216.0856892468523
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 794.0911798892838,
+ "y": -216.0856892468523
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "MOVE_LIN-35a46f14-64c0-4744-b6c1-d8db200cd9bd",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "MOVE_LIN-35a46f14-64c0-4744-b6c1-d8db200cd9bd",
+ "label": "MOVE LIN",
+ "func": "MOVE_LIN",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "x": {
+ "type": "float",
+ "default": null,
+ "desc": "The x coordinate of the position to move to",
+ "overload": null,
+ "functionName": "MOVE_LIN",
+ "param": "x",
+ "value": ""
+ },
+ "y": {
+ "type": "float",
+ "default": null,
+ "desc": "The y coordinate of the position to move to",
+ "overload": null,
+ "functionName": "MOVE_LIN",
+ "param": "y",
+ "value": ""
+ },
+ "z": {
+ "type": "float",
+ "default": null,
+ "desc": "The z coordinate of the position to move to",
+ "overload": null,
+ "functionName": "MOVE_LIN",
+ "param": "z",
+ "value": ""
+ },
+ "alpha": {
+ "type": "float",
+ "default": 0,
+ "desc": "The alpha coordinate (rotation in radians about the x axis) of the position to move to.",
+ "overload": null,
+ "functionName": "MOVE_LIN",
+ "param": "alpha",
+ "value": 0
+ },
+ "beta": {
+ "type": "float",
+ "default": 0,
+ "desc": "The beta coordinate (rotation in radians about the y axis) of the position to move to.",
+ "overload": null,
+ "functionName": "MOVE_LIN",
+ "param": "beta",
+ "value": 0
+ },
+ "gamma": {
+ "type": "float",
+ "default": 0,
+ "desc": "The gamma coordinate (rotation in radians about the z axis) of the position to move to.",
+ "overload": null,
+ "functionName": "MOVE_LIN",
+ "param": "gamma",
+ "value": 0
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/MOVE_LIN/MOVE_LIN.py",
+ "selected": false
+ },
+ "position": {
+ "x": 1086.8498227608254,
+ "y": -228.4510184768089
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 1086.8498227608254,
+ "y": -228.4510184768089
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "sourceHandle": "default",
+ "target": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7default-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bip_address"
+ },
+ {
+ "source": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "sourceHandle": "default",
+ "target": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bdefault-HOME-15149cd9-755c-47da-8b07-cb63b74c6443ip_address"
+ },
+ {
+ "source": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "sourceHandle": "default",
+ "target": "MOVE_LIN-35a46f14-64c0-4744-b6c1-d8db200cd9bd",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-HOME-15149cd9-755c-47da-8b07-cb63b74c6443default-MOVE_LIN-35a46f14-64c0-4744-b6c1-d8db200cd9bdip_address"
+ },
+ {
+ "source": "MOVE_LIN-35a46f14-64c0-4744-b6c1-d8db200cd9bd",
+ "sourceHandle": "default",
+ "target": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-MOVE_LIN-35a46f14-64c0-4744-b6c1-d8db200cd9bddefault-DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0dip_address"
+ }
+ ],
+ "viewport": {
+ "x": 669.537650867023,
+ "y": 398.1114317341454,
+ "zoom": 0.7467072297113905
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/examples/EX1/example.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/examples/EX1/example.md
new file mode 100644
index 0000000000..21f09554bc
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_LIN/examples/EX1/example.md
@@ -0,0 +1,7 @@
+In this example, the `MOVE_LIN` node moves the robot arm in a straight line to a specified Cartesian position.
+
+The node takes in the x, y, and z coordinates, along with optional alpha, beta, and gamma rotations in radians.
+
+After initiating the linear movement, the node waits for the robot arm to become idle, indicating that the movement is complete.
+
+The `MOVE_LIN` node is useful in workflows where linear movements are required, such as drawing a straight line or moving from one point to another in a straight path.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/MOVE_POSE.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/MOVE_POSE.md
new file mode 100644
index 0000000000..750f59daf1
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/MOVE_POSE.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/a1-[autogen]/docstring.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..c077ea8c63
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/a1-[autogen]/docstring.txt
@@ -0,0 +1,28 @@
+
+The MOVE_POSE node moves the robot to a specified pose in space.
+
+Inputs
+------
+ip_address
+ The IP address of the robot arm.
+
+Parameters
+------
+x : float
+ The x coordinate of the position to move to
+y : float
+ The y coordinate of the position to move to
+z : float
+ The z coordinate of the position to move to
+alpha : float, optional
+ The alpha coordinate (rotation in radians about the x axis) of the position to move to.
+beta : float, optional
+ The beta coordinate (rotation in radians about the y axis) of the position to move to.
+gamma : float, optional
+ The gamma coordinate (rotation in radians about the z axis) of the position to move to.
+
+Returns
+-------
+ip_address
+ The IP address of the robot arm.
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/a1-[autogen]/python_code.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..39ac3caf4b
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/a1-[autogen]/python_code.txt
@@ -0,0 +1,20 @@
+from flojoy import flojoy, TextBlob
+from typing import Optional
+from PYTHON.utils.mecademic_state.mecademic_state import query_for_handle
+
+
+@flojoy(deps={"mecademicpy": "1.4.0"})
+def MOVE_POSE(
+ ip_address: TextBlob,
+ x: float,
+ y: float,
+ z: float,
+ alpha: Optional[float] = 0,
+ beta: Optional[float] = 0,
+ gamma: Optional[float] = 0,
+) -> TextBlob:
+
+ robot = query_for_handle(ip_address)
+ robot.MovePose(x=x, y=y, z=z, alpha=alpha, beta=beta, gamma=gamma)
+ robot.WaitIdle()
+ return ip_address
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/appendix/hardware.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/appendix/media.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/appendix/notes.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/examples/EX1/app.json b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/examples/EX1/app.json
new file mode 100644
index 0000000000..214aafe525
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/examples/EX1/app.json
@@ -0,0 +1,344 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "label": "CONNECT",
+ "func": "CONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "ip_address": {
+ "type": "str",
+ "default": null,
+ "desc": null,
+ "overload": null,
+ "functionName": "CONNECT",
+ "param": "ip_address",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/CONNECT/CONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "label": "ACTIVATE",
+ "func": "ACTIVATE",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "simulator": {
+ "type": "bool",
+ "default": false,
+ "desc": "Whether to activate the simulator or not. Defaults to False.",
+ "overload": null,
+ "functionName": "ACTIVATE",
+ "param": "simulator",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/ACTIVATE/ACTIVATE.py",
+ "selected": false
+ },
+ "position": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "label": "DISCONNECT",
+ "func": "DISCONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/DISCONNECT/DISCONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 1359.5680681849765,
+ "y": -215.25434969704412
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 1359.5680681849765,
+ "y": -215.25434969704412
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "label": "HOME",
+ "func": "HOME",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/HOME/HOME.py",
+ "selected": false
+ },
+ "position": {
+ "x": 794.0911798892838,
+ "y": -216.0856892468523
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 794.0911798892838,
+ "y": -216.0856892468523
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "MOVE_POSE-b2c91211-689a-4575-9b81-3a3dcb8e336d",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "MOVE_POSE-b2c91211-689a-4575-9b81-3a3dcb8e336d",
+ "label": "MOVE POSE",
+ "func": "MOVE_POSE",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "x": {
+ "type": "float",
+ "default": null,
+ "desc": "The x coordinate of the position to move to",
+ "overload": null,
+ "functionName": "MOVE_POSE",
+ "param": "x",
+ "value": ""
+ },
+ "y": {
+ "type": "float",
+ "default": null,
+ "desc": "The y coordinate of the position to move to",
+ "overload": null,
+ "functionName": "MOVE_POSE",
+ "param": "y",
+ "value": ""
+ },
+ "z": {
+ "type": "float",
+ "default": null,
+ "desc": "The z coordinate of the position to move to",
+ "overload": null,
+ "functionName": "MOVE_POSE",
+ "param": "z",
+ "value": ""
+ },
+ "alpha": {
+ "type": "float",
+ "default": 0,
+ "desc": "The alpha coordinate (rotation in radians about the x axis) of the position to move to.",
+ "overload": null,
+ "functionName": "MOVE_POSE",
+ "param": "alpha",
+ "value": 0
+ },
+ "beta": {
+ "type": "float",
+ "default": 0,
+ "desc": "The beta coordinate (rotation in radians about the y axis) of the position to move to.",
+ "overload": null,
+ "functionName": "MOVE_POSE",
+ "param": "beta",
+ "value": 0
+ },
+ "gamma": {
+ "type": "float",
+ "default": 0,
+ "desc": "The gamma coordinate (rotation in radians about the z axis) of the position to move to.",
+ "overload": null,
+ "functionName": "MOVE_POSE",
+ "param": "gamma",
+ "value": 0
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/MOVE_POSE/MOVE_POSE.py",
+ "selected": true
+ },
+ "position": {
+ "x": 1088.750702493049,
+ "y": -226.9880767820448
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 1088.750702493049,
+ "y": -226.9880767820448
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "sourceHandle": "default",
+ "target": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7default-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bip_address"
+ },
+ {
+ "source": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "sourceHandle": "default",
+ "target": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bdefault-HOME-15149cd9-755c-47da-8b07-cb63b74c6443ip_address"
+ },
+ {
+ "source": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "sourceHandle": "default",
+ "target": "MOVE_POSE-b2c91211-689a-4575-9b81-3a3dcb8e336d",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-HOME-15149cd9-755c-47da-8b07-cb63b74c6443default-MOVE_POSE-b2c91211-689a-4575-9b81-3a3dcb8e336dip_address"
+ },
+ {
+ "source": "MOVE_POSE-b2c91211-689a-4575-9b81-3a3dcb8e336d",
+ "sourceHandle": "default",
+ "target": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-MOVE_POSE-b2c91211-689a-4575-9b81-3a3dcb8e336ddefault-DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0dip_address"
+ }
+ ],
+ "viewport": {
+ "x": 669.537650867023,
+ "y": 398.1114317341454,
+ "zoom": 0.7467072297113905
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/examples/EX1/example.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/examples/EX1/example.md
new file mode 100644
index 0000000000..dac228711c
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/MOVE_POSE/examples/EX1/example.md
@@ -0,0 +1,7 @@
+In this example, the `MOVE_POSE` node moves the robot arm to a specified Cartesian position while also considering the orientation of the tool.
+
+The node takes in the x, y, and z coordinates, along with optional alpha, beta, and gamma rotations in radians.
+
+After initiating the movement, the node waits for the robot arm to become idle, indicating that the movement is complete.
+
+The `MOVE_POSE` node is particularly useful in workflows where both the position and orientation of the robot arm are crucial, such as aligning the arm with an object before picking it up.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/SET_CART_LIN_VEL.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/SET_CART_LIN_VEL.md
new file mode 100644
index 0000000000..199dcca1fa
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/SET_CART_LIN_VEL.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/a1-[autogen]/docstring.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..7050853732
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/a1-[autogen]/docstring.txt
@@ -0,0 +1,17 @@
+
+The SET_CART_LIN_VEL node sets the robot arm's linear velocity in Cartesian coordinates.
+
+Inputs
+------
+ip_address: TextBlob
+ The IP address of the robot arm.
+
+Parameters
+------
+v : float
+ The velocity to be set.
+
+Returns
+-------
+ip_address
+ The IP address of the robot arm.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/a1-[autogen]/python_code.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..800e49466c
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/a1-[autogen]/python_code.txt
@@ -0,0 +1,11 @@
+from flojoy import flojoy, TextBlob
+from PYTHON.utils.mecademic_state.mecademic_state import query_for_handle
+
+
+@flojoy(deps={"mecademicpy": "1.4.0"})
+def SET_CART_LIN_VEL(ip_address: TextBlob, v: float) -> TextBlob:
+
+
+ robot = query_for_handle(ip_address)
+ robot.SetCartLinVel(v)
+ return ip_address
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/appendix/hardware.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/appendix/media.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/appendix/notes.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/examples/EX1/app.json b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/examples/EX1/app.json
new file mode 100644
index 0000000000..37c322a597
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/examples/EX1/app.json
@@ -0,0 +1,299 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "label": "CONNECT",
+ "func": "CONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "ip_address": {
+ "type": "str",
+ "default": null,
+ "desc": null,
+ "overload": null,
+ "functionName": "CONNECT",
+ "param": "ip_address",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/CONNECT/CONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "label": "ACTIVATE",
+ "func": "ACTIVATE",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "simulator": {
+ "type": "bool",
+ "default": false,
+ "desc": "Whether to activate the simulator or not. Defaults to False.",
+ "overload": null,
+ "functionName": "ACTIVATE",
+ "param": "simulator",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/ACTIVATE/ACTIVATE.py",
+ "selected": false
+ },
+ "position": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "label": "DISCONNECT",
+ "func": "DISCONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/DISCONNECT/DISCONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 1359.5680681849765,
+ "y": -215.25434969704412
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 1359.5680681849765,
+ "y": -215.25434969704412
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "label": "HOME",
+ "func": "HOME",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/HOME/HOME.py",
+ "selected": false
+ },
+ "position": {
+ "x": 794.0911798892838,
+ "y": -216.0856892468523
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 794.0911798892838,
+ "y": -216.0856892468523
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "SET_CART_LIN_VEL-da61252e-3cd6-48a0-b784-b69508eb7cfd",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "SET_CART_LIN_VEL-da61252e-3cd6-48a0-b784-b69508eb7cfd",
+ "label": "SET CART LIN VEL",
+ "func": "SET_CART_LIN_VEL",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "v": {
+ "type": "float",
+ "default": null,
+ "desc": "The velocity to be set.",
+ "overload": null,
+ "functionName": "SET_CART_LIN_VEL",
+ "param": "v",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/SET_CART_LIN_VEL/SET_CART_LIN_VEL.py",
+ "selected": false
+ },
+ "position": {
+ "x": 1061.2726259973933,
+ "y": -217.83129616269082
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 1061.2726259973933,
+ "y": -217.83129616269082
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "sourceHandle": "default",
+ "target": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7default-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bip_address"
+ },
+ {
+ "source": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "sourceHandle": "default",
+ "target": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bdefault-HOME-15149cd9-755c-47da-8b07-cb63b74c6443ip_address"
+ },
+ {
+ "source": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "sourceHandle": "default",
+ "target": "SET_CART_LIN_VEL-da61252e-3cd6-48a0-b784-b69508eb7cfd",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-HOME-15149cd9-755c-47da-8b07-cb63b74c6443default-SET_CART_LIN_VEL-da61252e-3cd6-48a0-b784-b69508eb7cfdip_address"
+ },
+ {
+ "source": "SET_CART_LIN_VEL-da61252e-3cd6-48a0-b784-b69508eb7cfd",
+ "sourceHandle": "default",
+ "target": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-SET_CART_LIN_VEL-da61252e-3cd6-48a0-b784-b69508eb7cfddefault-DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0dip_address"
+ }
+ ],
+ "viewport": {
+ "x": 669.537650867023,
+ "y": 398.1114317341454,
+ "zoom": 0.7467072297113905
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/examples/EX1/example.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/examples/EX1/example.md
new file mode 100644
index 0000000000..5bb5a155aa
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_CART_LIN_VEL/examples/EX1/example.md
@@ -0,0 +1,7 @@
+In this example, the `SET_CART_LIN_VEL` node sets the linear velocity of the robot arm in Cartesian coordinates.
+
+The node takes in a single parameter, v, which is the velocity to be set for the robot arm's movements.
+
+After setting the velocity, the node doesn't wait for any specific state, meaning it's often used in conjunction with other movement nodes to control the speed of those movements.
+
+The `SET_CART_LIN_VEL` node is useful in workflows where you need to control the speed of the robot arm's linear movements, such as when you're trying to synchronize the robot arm with another moving object.
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/SET_JOINT_VEL.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/SET_JOINT_VEL.md
new file mode 100644
index 0000000000..aea18186e2
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/SET_JOINT_VEL.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/a1-[autogen]/docstring.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..d6723aa9e7
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/a1-[autogen]/docstring.txt
@@ -0,0 +1,18 @@
+
+ The SET_JOINT_VEL node sets the robot arm's angular velocity for its joints.
+
+ Inputs
+ ------
+ ip_address
+ The IP address of the robot arm.
+
+ Parameters
+ ------
+ v : float
+ The angular velocity to be set for each joint.
+
+Returns
+ -------
+ ip_address
+ The IP address of the robot arm.
+
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/a1-[autogen]/python_code.txt b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..3e04ed34d8
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/a1-[autogen]/python_code.txt
@@ -0,0 +1,11 @@
+from flojoy import flojoy, TextBlob
+from typing import Optional
+from PYTHON.utils.mecademic_state.mecademic_state import query_for_handle
+
+
+@flojoy(deps={"mecademicpy": "1.4.0"})
+def SET_JOINT_VEL(ip_address: TextBlob, v: float) -> TextBlob:
+
+ robot = query_for_handle(ip_address)
+ robot.SetJointVel(v)
+ return ip_address
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/appendix/hardware.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/appendix/media.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/appendix/notes.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/examples/EX1/app.json b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/examples/EX1/app.json
new file mode 100644
index 0000000000..eb80fdb4f3
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/examples/EX1/app.json
@@ -0,0 +1,299 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 192,
+ "height": 192,
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "label": "CONNECT",
+ "func": "CONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "ip_address": {
+ "type": "str",
+ "default": null,
+ "desc": null,
+ "overload": null,
+ "functionName": "CONNECT",
+ "param": "ip_address",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/CONNECT/CONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 149.79183394290823,
+ "y": -219.99455021662578
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "label": "ACTIVATE",
+ "func": "ACTIVATE",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "simulator": {
+ "type": "bool",
+ "default": false,
+ "desc": "Whether to activate the simulator or not. Defaults to False.",
+ "overload": null,
+ "functionName": "ACTIVATE",
+ "param": "simulator",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/ACTIVATE/ACTIVATE.py",
+ "selected": false
+ },
+ "position": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 527.703545775578,
+ "y": -214.68035169098664
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "label": "DISCONNECT",
+ "func": "DISCONNECT",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/DISCONNECT/DISCONNECT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 1359.5680681849765,
+ "y": -215.25434969704412
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 1359.5680681849765,
+ "y": -215.25434969704412
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "label": "HOME",
+ "func": "HOME",
+ "type": "INSTRUMENTS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "The IP address of the robot arm."
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/HOME/HOME.py",
+ "selected": false
+ },
+ "position": {
+ "x": 794.0911798892838,
+ "y": -216.0856892468523
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 794.0911798892838,
+ "y": -216.0856892468523
+ },
+ "dragging": true
+ },
+ {
+ "width": 192,
+ "height": 192,
+ "id": "SET_JOINT_VEL-a2576ed8-f0e6-407f-a674-322e180c09ac",
+ "type": "INSTRUMENTS",
+ "data": {
+ "id": "SET_JOINT_VEL-a2576ed8-f0e6-407f-a674-322e180c09ac",
+ "label": "SET JOINT VEL",
+ "func": "SET_JOINT_VEL",
+ "type": "INSTRUMENTS",
+ "ctrls": {
+ "v": {
+ "type": "float",
+ "default": null,
+ "desc": null,
+ "overload": null,
+ "functionName": "SET_JOINT_VEL",
+ "param": "v",
+ "value": ""
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "ip_address",
+ "id": "ip_address",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": null
+ }
+ ],
+ "pip_dependencies": [
+ {
+ "name": "mecademicpy",
+ "v": "1.4.0"
+ }
+ ],
+ "path": "PYTHON/nodes/INSTRUMENTS/MECADEMIC/SET_JOINT_VEL/SET_JOINT_VEL.py",
+ "selected": false
+ },
+ "position": {
+ "x": 1090.1561206221243,
+ "y": -238.30986226761058
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 1090.1561206221243,
+ "y": -238.30986226761058
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7",
+ "sourceHandle": "default",
+ "target": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-CONNECT-7ca02405-664b-43f0-a498-ef3ddecbd2b7default-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bip_address"
+ },
+ {
+ "source": "ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395b",
+ "sourceHandle": "default",
+ "target": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-ACTIVATE-83ad0faf-16a9-42c9-bcd2-fc0e0f25395bdefault-HOME-15149cd9-755c-47da-8b07-cb63b74c6443ip_address"
+ },
+ {
+ "source": "HOME-15149cd9-755c-47da-8b07-cb63b74c6443",
+ "sourceHandle": "default",
+ "target": "SET_JOINT_VEL-a2576ed8-f0e6-407f-a674-322e180c09ac",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-HOME-15149cd9-755c-47da-8b07-cb63b74c6443default-SET_JOINT_VEL-a2576ed8-f0e6-407f-a674-322e180c09acip_address"
+ },
+ {
+ "source": "SET_JOINT_VEL-a2576ed8-f0e6-407f-a674-322e180c09ac",
+ "sourceHandle": "default",
+ "target": "DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0d",
+ "targetHandle": "ip_address",
+ "id": "reactflow__edge-SET_JOINT_VEL-a2576ed8-f0e6-407f-a674-322e180c09acdefault-DISCONNECT-508704f3-6da0-4541-8590-21a3b4318e0dip_address"
+ }
+ ],
+ "viewport": {
+ "x": 669.537650867023,
+ "y": 398.1114317341454,
+ "zoom": 0.7467072297113905
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/examples/EX1/example.md b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/examples/EX1/example.md
new file mode 100644
index 0000000000..b535eb6f93
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ARMS/MECADEMIC/SET_JOINT_VEL/examples/EX1/example.md
@@ -0,0 +1,7 @@
+In this example, the `SET_JOINT_VEL` node sets the angular velocity for the joints of the robot arm.
+
+The node takes in a single parameter, v, which is the angular velocity to be set for each joint of the robot arm.
+
+After setting the velocity, the node doesn't wait for any specific state, meaning it's often used in conjunction with other movement nodes to control the speed of those movements.
+
+The `SET_JOINT_VEL` node is useful in workflows where you need to control the speed of the robot arm's joint movements, such as when performing tasks that require varying speeds for different joints.
diff --git a/docs/nodes/IO/ROBOTICS/ROBOTICS.md b/docs/nodes/IO/ROBOTICS/ROBOTICS.md
new file mode 100644
index 0000000000..cf504e90da
--- /dev/null
+++ b/docs/nodes/IO/ROBOTICS/ROBOTICS.md
@@ -0,0 +1,5 @@
+# ROBOTICS
+
+Welcome to Flojoy Robotics!
+
+![image](/img/robotics/robot_arm.png)
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/REPLACE_SUBSET.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/REPLACE_SUBSET.md
new file mode 100644
index 0000000000..5fc65b0339
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/REPLACE_SUBSET.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/a1-[autogen]/docstring.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..f0ba24495f
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/a1-[autogen]/docstring.txt
@@ -0,0 +1,22 @@
+The REPLACE_SUBSET node returns a new Vector with subset of elements replaced.
+
+ Inputs
+ ------
+ v : Vector
+ The input vector to replace subset from
+
+ Parameters
+ ----------
+ indices: Array
+ specified indices to replace values at from the input vector
+
+ values: Array
+ subset of values to replace the specified indices
+
+ length: int
+ number of elements to replace from the input vector, default is 1 (this only applies when one index is specified for indices parameter)
+
+ Returns
+ -------
+ Vector
+ The new vector with subset of elements replaced from the input vector
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/a1-[autogen]/python_code.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..fcdf3a6c67
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/a1-[autogen]/python_code.txt
@@ -0,0 +1,37 @@
+from numpy import any, array, arange, put
+from flojoy import flojoy, Vector, Array
+
+
+@flojoy
+def REPLACE_SUBSET(
+ default: Vector, indices: Array, values: Array, length: int = 1
+) -> Vector:
+
+
+ # unwrap the indices first
+ indices = array(indices.unwrap(), dtype=int)
+ # unwrap the values next
+ values = array(values.unwrap(), dtype=int)
+
+ assert len(default.v) > len(
+ indices
+ ), "The length of indices parameter must be less than the length of the Vector."
+ assert any(indices >= 0), "The indices must be greater than zero."
+
+ if len(indices) == 1:
+ assert (indices[0] + (length - 1)) < len(
+ default.v
+ ), "The length of items to delete starting from index parameter must not exceed the length of the Vector."
+
+ if len(indices) > 1:
+ assert len(indices) == len(
+ values
+ ), "The number of indices and the number of correpsonding elements must be equal."
+ put(default.v, indices, values)
+ else:
+ assert length == len(
+ values
+ ), "The number of indices and the number of correpsonding elements must be equal."
+ indices = arange(indices[0], length)
+ put(default.v, indices, values)
+ return Vector(v=default.v)
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/appendix/hardware.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/appendix/media.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/appendix/notes.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/examples/EX1/app.json b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/examples/EX1/app.json
new file mode 100644
index 0000000000..2da285bbb2
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/examples/EX1/app.json
@@ -0,0 +1,314 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 160,
+ "height": 160,
+ "id": "REPLACE_SUBSET-1ceabec0-02a8-481d-bb7d-4b2ae7f0c643",
+ "type": "TRANSFORMERS",
+ "data": {
+ "id": "REPLACE_SUBSET-1ceabec0-02a8-481d-bb7d-4b2ae7f0c643",
+ "label": "REPLACE SUBSET",
+ "func": "REPLACE_SUBSET",
+ "type": "TRANSFORMERS",
+ "ctrls": {
+ "indices": {
+ "type": "Array",
+ "default": null,
+ "desc": "specified indices to replace values at from the input vector",
+ "overload": null,
+ "functionName": "REPLACE_SUBSET",
+ "param": "indices",
+ "value": "1,4,6"
+ },
+ "values": {
+ "type": "Array",
+ "default": null,
+ "desc": "subset of values to replace the specified indices",
+ "overload": null,
+ "functionName": "REPLACE_SUBSET",
+ "param": "values",
+ "value": "-5,22,13"
+ },
+ "length": {
+ "type": "int",
+ "default": 1,
+ "desc": "number of elements to replace from the input vector, default is 1 (this only applies when one index is specified for indices parameter)",
+ "overload": null,
+ "functionName": "REPLACE_SUBSET",
+ "param": "length",
+ "value": 3
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "The new vector with subset of elements replaced from the input vector"
+ }
+ ],
+ "path": "TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/REPLACE_SUBSET.py",
+ "selected": false
+ },
+ "position": {
+ "x": 46.292395321543836,
+ "y": -191.62402629147334
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 46.292395321543836,
+ "y": -191.62402629147334
+ },
+ "dragging": true
+ },
+ {
+ "width": 208,
+ "height": 96,
+ "id": "LINSPACE-773b378b-53c4-41db-a6e0-62bd9a366bcb",
+ "type": "GENERATORS",
+ "data": {
+ "id": "LINSPACE-773b378b-53c4-41db-a6e0-62bd9a366bcb",
+ "label": "LINSPACE",
+ "func": "LINSPACE",
+ "type": "GENERATORS",
+ "ctrls": {
+ "start": {
+ "type": "float",
+ "default": 10,
+ "desc": "The start point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "start",
+ "value": 0
+ },
+ "end": {
+ "type": "float",
+ "default": 0,
+ "desc": "The end point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "end",
+ "value": 10
+ },
+ "step": {
+ "type": "int",
+ "default": 1000,
+ "desc": "The number of points in the vector.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "step",
+ "value": 10
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector|OrderedPair",
+ "multiple": false,
+ "desc": "Optional input in case LINSPACE is used in a loop. Not used."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "v: the vector between start and end with step number of points."
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/LINSPACE/LINSPACE.py",
+ "selected": false
+ },
+ "position": {
+ "x": -259.1040792489622,
+ "y": -159.2030807433828
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": -259.1040792489622,
+ "y": -159.2030807433828
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "SCATTER-ac863ad4-e233-40ac-a67e-239e7cf8acb5",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "SCATTER-ac863ad4-e233-40ac-a67e-239e7cf8acb5",
+ "label": "SCATTER",
+ "func": "SCATTER",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|DataFrame|Matrix|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly Scatter visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/SCATTER/SCATTER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 337.9370892627744,
+ "y": -261.0285656908869
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 337.9370892627744,
+ "y": -261.0285656908869
+ },
+ "dragging": true
+ },
+ {
+ "width": 208,
+ "height": 96,
+ "id": "TEXT-f7ac9b15-5256-41be-8944-6622466175bc",
+ "type": "GENERATORS",
+ "data": {
+ "id": "TEXT-f7ac9b15-5256-41be-8944-6622466175bc",
+ "label": "TEXT",
+ "func": "TEXT",
+ "type": "GENERATORS",
+ "ctrls": {
+ "value": {
+ "type": "str",
+ "default": "Hello World!",
+ "desc": "The value set in Parameters",
+ "overload": null,
+ "functionName": "TEXT",
+ "param": "value",
+ "value": "This app replaces the subsets of the input vector according to the values and corresponding indices specified. In this example, elements -5, 22, and 13 have been specified to replace the elements in indices 1, 4, and 6. "
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "_",
+ "id": "_",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "text_blob: return the value being set in Parameters"
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/TEXT/TEXT.py",
+ "selected": true
+ },
+ "position": {
+ "x": 884.1369074495883,
+ "y": -162.24699099748312
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 884.1369074495883,
+ "y": -162.24699099748312
+ },
+ "dragging": true
+ },
+ {
+ "width": 384,
+ "height": 288,
+ "id": "TEXT_VIEW-477492c2-b628-4289-9a51-528af5e09d70",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "TEXT_VIEW-477492c2-b628-4289-9a51-528af5e09d70",
+ "label": "TEXT VIEW",
+ "func": "TEXT_VIEW",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized in text format"
+ }
+ ],
+ "path": "VISUALIZERS/DATA_STRUCTURE/TEXT_VIEW/TEXT_VIEW.py",
+ "selected": false
+ },
+ "position": {
+ "x": 784.046104132004,
+ "y": -520.1653348334285
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 784.046104132004,
+ "y": -520.1653348334285
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "LINSPACE-773b378b-53c4-41db-a6e0-62bd9a366bcb",
+ "sourceHandle": "default",
+ "target": "REPLACE_SUBSET-1ceabec0-02a8-481d-bb7d-4b2ae7f0c643",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-773b378b-53c4-41db-a6e0-62bd9a366bcbdefault-REPLACE_SUBSET-1ceabec0-02a8-481d-bb7d-4b2ae7f0c643default"
+ },
+ {
+ "source": "REPLACE_SUBSET-1ceabec0-02a8-481d-bb7d-4b2ae7f0c643",
+ "sourceHandle": "default",
+ "target": "SCATTER-ac863ad4-e233-40ac-a67e-239e7cf8acb5",
+ "targetHandle": "default",
+ "id": "reactflow__edge-REPLACE_SUBSET-1ceabec0-02a8-481d-bb7d-4b2ae7f0c643default-SCATTER-ac863ad4-e233-40ac-a67e-239e7cf8acb5default"
+ },
+ {
+ "source": "SCATTER-ac863ad4-e233-40ac-a67e-239e7cf8acb5",
+ "sourceHandle": "default",
+ "target": "TEXT-f7ac9b15-5256-41be-8944-6622466175bc",
+ "targetHandle": "_",
+ "id": "reactflow__edge-SCATTER-ac863ad4-e233-40ac-a67e-239e7cf8acb5default-TEXT-f7ac9b15-5256-41be-8944-6622466175bc_"
+ },
+ {
+ "source": "TEXT-f7ac9b15-5256-41be-8944-6622466175bc",
+ "sourceHandle": "default",
+ "target": "TEXT_VIEW-477492c2-b628-4289-9a51-528af5e09d70",
+ "targetHandle": "default",
+ "id": "reactflow__edge-TEXT-f7ac9b15-5256-41be-8944-6622466175bcdefault-TEXT_VIEW-477492c2-b628-4289-9a51-528af5e09d70default"
+ }
+ ],
+ "viewport": {
+ "x": 637.654905587641,
+ "y": 363.60612546109087,
+ "zoom": 0.7111497425822767
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/examples/EX1/example.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/examples/EX1/example.md
new file mode 100644
index 0000000000..7e7b7a33fd
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/REPLACE_SUBSET/examples/EX1/example.md
@@ -0,0 +1 @@
+In this example, we generate a vector by using a `LINSPACE` node. Then indices 1, 4, 6 are replaced with values -5, 22, 13 respectively using `REPLACE_SUBSET`. The resulting vector is visualized with `SCATTER` node.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/SHIFT_VECTOR.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/SHIFT_VECTOR.md
new file mode 100644
index 0000000000..955f448172
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/SHIFT_VECTOR.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/a1-[autogen]/docstring.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..695dcb0121
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/a1-[autogen]/docstring.txt
@@ -0,0 +1,16 @@
+The SHIFT_VECTOR node shifts the elements in the vector by the amount specified
+
+ Inputs
+ ------
+ v : Vector
+ The input vector to shift elements from
+
+ Parameters
+ ----------
+ shift: int
+ the number of places in which elements are moved (negative values will shift them to the left)
+
+ Returns
+ -------
+ Vector
+ The new vector with elements shifted
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/a1-[autogen]/python_code.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..da35195590
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/a1-[autogen]/python_code.txt
@@ -0,0 +1,10 @@
+from numpy import roll
+from flojoy import flojoy, Vector
+
+
+@flojoy
+def SHIFT_VECTOR(default: Vector, shift: int = 1) -> Vector:
+
+
+ v = roll(default.v, shift)
+ return Vector(v=v)
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/appendix/hardware.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/appendix/media.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/appendix/notes.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/examples/EX1/app.json b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/examples/EX1/app.json
new file mode 100644
index 0000000000..1da935c49c
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/examples/EX1/app.json
@@ -0,0 +1,520 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 208,
+ "height": 96,
+ "id": "LINSPACE-e379dbbd-8e84-49d0-a55a-73c7bb83a9d0",
+ "type": "GENERATORS",
+ "data": {
+ "id": "LINSPACE-e379dbbd-8e84-49d0-a55a-73c7bb83a9d0",
+ "label": "LINSPACE",
+ "func": "LINSPACE",
+ "type": "GENERATORS",
+ "ctrls": {
+ "start": {
+ "type": "float",
+ "default": 10,
+ "desc": "The start point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "start",
+ "value": 0
+ },
+ "end": {
+ "type": "float",
+ "default": 0,
+ "desc": "The end point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "end",
+ "value": 10
+ },
+ "step": {
+ "type": "int",
+ "default": 1000,
+ "desc": "The number of points in the vector.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "step",
+ "value": 10
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector|OrderedPair",
+ "multiple": false,
+ "desc": "Optional input in case LINSPACE is used in a loop. Not used."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "v: the vector between start and end with step number of points."
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/LINSPACE/LINSPACE.py",
+ "selected": false
+ },
+ "position": {
+ "x": -223.86517863731433,
+ "y": 120.02433306680166
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": -223.86517863731433,
+ "y": 120.02433306680166
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "SCATTER-fc390cc7-cd39-478c-b149-44510a1abc55",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "SCATTER-fc390cc7-cd39-478c-b149-44510a1abc55",
+ "label": "SCATTER",
+ "func": "SCATTER",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|DataFrame|Matrix|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly Scatter visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/SCATTER/SCATTER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 467.0975797559655,
+ "y": -172.3190063382396
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 467.0975797559655,
+ "y": -172.3190063382396
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "SCATTER-c4aaa4eb-367d-49f9-944a-de4aa7b5eab7",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "SCATTER-c4aaa4eb-367d-49f9-944a-de4aa7b5eab7",
+ "label": "SCATTER 1",
+ "func": "SCATTER",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|DataFrame|Matrix|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly Scatter visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/SCATTER/SCATTER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 443.10500366948986,
+ "y": 179.3090438343204
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 443.10500366948986,
+ "y": 179.3090438343204
+ },
+ "dragging": true
+ },
+ {
+ "width": 208,
+ "height": 96,
+ "id": "LINSPACE-a3ecb471-ef0c-4af6-9b42-8b85d63aa15b",
+ "type": "GENERATORS",
+ "data": {
+ "id": "LINSPACE-a3ecb471-ef0c-4af6-9b42-8b85d63aa15b",
+ "label": "LINSPACE 1",
+ "func": "LINSPACE",
+ "type": "GENERATORS",
+ "ctrls": {
+ "start": {
+ "type": "float",
+ "default": 10,
+ "desc": "The start point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "start",
+ "value": 0
+ },
+ "end": {
+ "type": "float",
+ "default": 0,
+ "desc": "The end point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "end",
+ "value": 10
+ },
+ "step": {
+ "type": "int",
+ "default": 1000,
+ "desc": "The number of points in the vector.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "step",
+ "value": 10
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector|OrderedPair",
+ "multiple": false,
+ "desc": "Optional input in case LINSPACE is used in a loop. Not used."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "v: the vector between start and end with step number of points."
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/LINSPACE/LINSPACE.py",
+ "selected": false
+ },
+ "position": {
+ "x": -223.96114622718932,
+ "y": 707.270566627652
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": -223.96114622718932,
+ "y": 707.270566627652
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "SCATTER-4cd82265-65b6-462c-9523-286c65163e01",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "SCATTER-4cd82265-65b6-462c-9523-286c65163e01",
+ "label": "SCATTER 2",
+ "func": "SCATTER",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|DataFrame|Matrix|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly Scatter visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/SCATTER/SCATTER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 461.85436957217325,
+ "y": 633.327989002352
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 461.85436957217325,
+ "y": 633.327989002352
+ },
+ "dragging": true
+ },
+ {
+ "width": 208,
+ "height": 96,
+ "id": "TEXT-3c162e78-3b90-4392-9ef6-8988c48bac83",
+ "type": "GENERATORS",
+ "data": {
+ "id": "TEXT-3c162e78-3b90-4392-9ef6-8988c48bac83",
+ "label": "TEXT",
+ "func": "TEXT",
+ "type": "GENERATORS",
+ "ctrls": {
+ "value": {
+ "type": "str",
+ "default": "Hello World!",
+ "desc": "The value set in Parameters",
+ "overload": null,
+ "functionName": "TEXT",
+ "param": "value",
+ "value": "This app shows elements in the vector can be rotated (i.e shifted) in both directions. The one on the top shows elements that are shifted to the right by 3. The one on the bottom shows the elements that are shifted to the left by 3."
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "_",
+ "id": "_",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "text_blob: return the value being set in Parameters"
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/TEXT/TEXT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 931.0391647029419,
+ "y": 248.74566673722245
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 931.0391647029419,
+ "y": 248.74566673722245
+ },
+ "dragging": true
+ },
+ {
+ "width": 384,
+ "height": 288,
+ "id": "TEXT_VIEW-e7df43bd-4f8a-45d5-8b38-ee14fa4d26ef",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "TEXT_VIEW-e7df43bd-4f8a-45d5-8b38-ee14fa4d26ef",
+ "label": "TEXT VIEW",
+ "func": "TEXT_VIEW",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized in text format"
+ }
+ ],
+ "path": "VISUALIZERS/DATA_STRUCTURE/TEXT_VIEW/TEXT_VIEW.py",
+ "selected": false
+ },
+ "position": {
+ "x": 1353.5947356865488,
+ "y": 172.47563144496644
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 1353.5947356865488,
+ "y": 172.47563144496644
+ },
+ "dragging": true
+ },
+ {
+ "width": 160,
+ "height": 160,
+ "id": "SHIFT_VECTOR-19f0b259-c5c9-4691-bb1d-266f00b6bb8c",
+ "type": "TRANSFORMERS",
+ "data": {
+ "id": "SHIFT_VECTOR-19f0b259-c5c9-4691-bb1d-266f00b6bb8c",
+ "label": "SHIFT VECTOR",
+ "func": "SHIFT_VECTOR",
+ "type": "TRANSFORMERS",
+ "ctrls": {
+ "shift": {
+ "type": "int",
+ "default": 1,
+ "desc": "the number of places in which elements are moved (negative values will shift them to the left)",
+ "overload": null,
+ "functionName": "SHIFT_VECTOR",
+ "param": "shift",
+ "value": 3
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "The new vector with elements shifted"
+ }
+ ],
+ "path": "TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/SHIFT_VECTOR.py",
+ "selected": false
+ },
+ "position": {
+ "x": 132.48736880826465,
+ "y": -42.665656394050814
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 132.48736880826465,
+ "y": -42.665656394050814
+ },
+ "dragging": true
+ },
+ {
+ "width": 160,
+ "height": 160,
+ "id": "SHIFT_VECTOR-344524df-0eae-49bf-ad50-c5dfcae04ca0",
+ "type": "TRANSFORMERS",
+ "data": {
+ "id": "SHIFT_VECTOR-344524df-0eae-49bf-ad50-c5dfcae04ca0",
+ "label": "SHIFT VECTOR 1",
+ "func": "SHIFT_VECTOR",
+ "type": "TRANSFORMERS",
+ "ctrls": {
+ "shift": {
+ "type": "int",
+ "default": 1,
+ "desc": "the number of places in which elements are moved (negative values will shift them to the left)",
+ "overload": null,
+ "functionName": "SHIFT_VECTOR",
+ "param": "shift",
+ "value": -3
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "The new vector with elements shifted"
+ }
+ ],
+ "path": "TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/SHIFT_VECTOR.py",
+ "selected": false
+ },
+ "position": {
+ "x": 124.56549480602405,
+ "y": 654.762527395164
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 124.56549480602405,
+ "y": 654.762527395164
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "LINSPACE-e379dbbd-8e84-49d0-a55a-73c7bb83a9d0",
+ "sourceHandle": "default",
+ "target": "SCATTER-c4aaa4eb-367d-49f9-944a-de4aa7b5eab7",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-e379dbbd-8e84-49d0-a55a-73c7bb83a9d0default-SCATTER-c4aaa4eb-367d-49f9-944a-de4aa7b5eab7default"
+ },
+ {
+ "source": "TEXT-3c162e78-3b90-4392-9ef6-8988c48bac83",
+ "sourceHandle": "default",
+ "target": "TEXT_VIEW-e7df43bd-4f8a-45d5-8b38-ee14fa4d26ef",
+ "targetHandle": "default",
+ "id": "reactflow__edge-TEXT-3c162e78-3b90-4392-9ef6-8988c48bac83default-TEXT_VIEW-e7df43bd-4f8a-45d5-8b38-ee14fa4d26efdefault"
+ },
+ {
+ "source": "SHIFT_VECTOR-19f0b259-c5c9-4691-bb1d-266f00b6bb8c",
+ "sourceHandle": "default",
+ "target": "SCATTER-fc390cc7-cd39-478c-b149-44510a1abc55",
+ "targetHandle": "default",
+ "id": "reactflow__edge-SHIFT_VECTOR-19f0b259-c5c9-4691-bb1d-266f00b6bb8cdefault-SCATTER-fc390cc7-cd39-478c-b149-44510a1abc55default"
+ },
+ {
+ "source": "LINSPACE-e379dbbd-8e84-49d0-a55a-73c7bb83a9d0",
+ "sourceHandle": "default",
+ "target": "SHIFT_VECTOR-19f0b259-c5c9-4691-bb1d-266f00b6bb8c",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-e379dbbd-8e84-49d0-a55a-73c7bb83a9d0default-SHIFT_VECTOR-19f0b259-c5c9-4691-bb1d-266f00b6bb8cdefault"
+ },
+ {
+ "source": "LINSPACE-a3ecb471-ef0c-4af6-9b42-8b85d63aa15b",
+ "sourceHandle": "default",
+ "target": "SHIFT_VECTOR-344524df-0eae-49bf-ad50-c5dfcae04ca0",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-a3ecb471-ef0c-4af6-9b42-8b85d63aa15bdefault-SHIFT_VECTOR-344524df-0eae-49bf-ad50-c5dfcae04ca0default"
+ },
+ {
+ "source": "SHIFT_VECTOR-344524df-0eae-49bf-ad50-c5dfcae04ca0",
+ "sourceHandle": "default",
+ "target": "SCATTER-4cd82265-65b6-462c-9523-286c65163e01",
+ "targetHandle": "default",
+ "id": "reactflow__edge-SHIFT_VECTOR-344524df-0eae-49bf-ad50-c5dfcae04ca0default-SCATTER-4cd82265-65b6-462c-9523-286c65163e01default"
+ }
+ ],
+ "viewport": {
+ "x": 637.654905587641,
+ "y": 363.60612546109087,
+ "zoom": 0.7111497425822767
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/examples/EX1/example.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/examples/EX1/example.md
new file mode 100644
index 0000000000..14fa488195
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SHIFT_VECTOR/examples/EX1/example.md
@@ -0,0 +1 @@
+In this example, we generate a vector by using a `LINSPACE` node. Then specify the amount to shift in the vector with `ROTATE_VECTOR` node. In this case, we are only shifting 3 places to the right. The resulting vector is visualized with `SCATTER` node.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SORT_VECTOR/a1-[autogen]/docstring.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SORT_VECTOR/a1-[autogen]/docstring.txt
index e0b1d3fc15..bb1385bc85 100644
--- a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SORT_VECTOR/a1-[autogen]/docstring.txt
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SORT_VECTOR/a1-[autogen]/docstring.txt
@@ -5,6 +5,11 @@ The SORT_VECTOR node returns the input Vector that is sorted
default : Vector
The input vector
+ Parameters
+ ----------
+ reverse : bool
+ If False, sort in ascending order. If True, descending order.
+
Returns
-------
Vector
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SORT_VECTOR/a1-[autogen]/python_code.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SORT_VECTOR/a1-[autogen]/python_code.txt
index e908201a23..147351de6d 100644
--- a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SORT_VECTOR/a1-[autogen]/python_code.txt
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/SORT_VECTOR/a1-[autogen]/python_code.txt
@@ -4,7 +4,7 @@ from flojoy import flojoy, Vector
@flojoy
def SORT_VECTOR(
default: Vector,
+ reverse: bool = False,
) -> Vector:
-
- return Vector(v=sorted(default.v))
+ return Vector(v=sorted(default.v, reverse=reverse))
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/VECTOR_DELETE.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/VECTOR_DELETE.md
new file mode 100644
index 0000000000..269905c29d
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/VECTOR_DELETE.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/a1-[autogen]/docstring.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..4c401b6c4b
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/a1-[autogen]/docstring.txt
@@ -0,0 +1,19 @@
+The VECTOR_DELETE node returns a new Vector with elements deleted from requested indices
+
+ Inputs
+ ------
+ v : Vector
+ The input vector to delete from
+
+ Parameters
+ ----------
+ indices: Array
+ specified indices to delete value(s) at from the input vector
+
+ length: int
+ number of elements to delete from the input vector, default is 1 (this only applies when one index is specified for indices parameter)
+
+ Returns
+ -------
+ Vector
+ The new vector with element(s) deleted from the input vector
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/a1-[autogen]/python_code.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..07ced89bc1
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/a1-[autogen]/python_code.txt
@@ -0,0 +1,27 @@
+from numpy import any, array, delete, arange
+from flojoy import flojoy, Vector, Array
+
+
+@flojoy
+def VECTOR_DELETE(default: Vector, indices: Array, length: int = 1) -> Vector:
+
+
+ # unwrap the indices first
+ indices = array(indices.unwrap(), dtype=int)
+
+ assert len(default.v) > len(
+ indices
+ ), "The length of indices parameter must be less than the length of the Vector."
+ assert any(indices >= 0), "The indices must be greater than zero."
+
+ if len(indices) == 1:
+ assert (indices[0] + (length - 1)) < len(
+ default.v
+ ), "The length of items to delete starting from index parameter must not exceed the length of the Vector."
+
+ if len(indices) > 1:
+ v = delete(default.v, indices, None)
+ else:
+ indices = arange(indices[0], length)
+ v = delete(default.v, indices, None)
+ return Vector(v=v)
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/appendix/hardware.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/appendix/media.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/appendix/notes.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/examples/EX1/app.json b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/examples/EX1/app.json
new file mode 100644
index 0000000000..788f604430
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/examples/EX1/app.json
@@ -0,0 +1,255 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 208,
+ "height": 96,
+ "id": "LINSPACE-f80c30e0-eb44-4a25-94bb-f95afa92ad12",
+ "type": "GENERATORS",
+ "data": {
+ "id": "LINSPACE-f80c30e0-eb44-4a25-94bb-f95afa92ad12",
+ "label": "LINSPACE",
+ "func": "LINSPACE",
+ "type": "GENERATORS",
+ "ctrls": {
+ "start": {
+ "type": "float",
+ "default": 10,
+ "desc": "The start point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "start",
+ "value": 0
+ },
+ "end": {
+ "type": "float",
+ "default": 0,
+ "desc": "The end point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "end",
+ "value": 5
+ },
+ "step": {
+ "type": "int",
+ "default": 1000,
+ "desc": "The number of points in the vector.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "step",
+ "value": 10
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector|OrderedPair",
+ "multiple": false,
+ "desc": "Optional input in case LINSPACE is used in a loop. Not used."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "v: the vector between start and end with step number of points."
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/LINSPACE/LINSPACE.py",
+ "selected": false
+ },
+ "position": {
+ "x": -158.11513318068995,
+ "y": 2.8433502380470372
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": -158.11513318068995,
+ "y": 2.8433502380470372
+ },
+ "dragging": true
+ },
+ {
+ "width": 160,
+ "height": 160,
+ "id": "VECTOR_DELETE-454ae648-0ca5-4e30-8f6e-56edfee71ff0",
+ "type": "TRANSFORMERS",
+ "data": {
+ "id": "VECTOR_DELETE-454ae648-0ca5-4e30-8f6e-56edfee71ff0",
+ "label": "VECTOR DELETE",
+ "func": "VECTOR_DELETE",
+ "type": "TRANSFORMERS",
+ "ctrls": {
+ "indices": {
+ "type": "Array",
+ "default": null,
+ "desc": "specified indices to delete value(s) at from the input vector",
+ "overload": null,
+ "functionName": "VECTOR_DELETE",
+ "param": "indices",
+ "value": "0"
+ },
+ "length": {
+ "type": "int",
+ "default": 1,
+ "desc": "number of elements to delete from the input vector, default is 1 (this only applies when one index is specified for indices parameter)",
+ "overload": null,
+ "functionName": "VECTOR_DELETE",
+ "param": "length",
+ "value": 2
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "The new vector with element(s) deleted from the input vector"
+ }
+ ],
+ "path": "TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/VECTOR_DELETE.py",
+ "selected": false
+ },
+ "position": {
+ "x": 178.79385899805402,
+ "y": -68.85894937989926
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 178.79385899805402,
+ "y": -68.85894937989926
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "SCATTER-69115da9-f7af-44a0-ad96-a2ae12da4166",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "SCATTER-69115da9-f7af-44a0-ad96-a2ae12da4166",
+ "label": "SCATTER",
+ "func": "SCATTER",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|DataFrame|Matrix|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly Scatter visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/SCATTER/SCATTER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 420.16869133149214,
+ "y": -252.87031100366278
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 420.16869133149214,
+ "y": -252.87031100366278
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "SCATTER-439c772a-837a-424d-bd07-656245e01cc9",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "SCATTER-439c772a-837a-424d-bd07-656245e01cc9",
+ "label": "SCATTER 1",
+ "func": "SCATTER",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|DataFrame|Matrix|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly Scatter visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/SCATTER/SCATTER.py",
+ "selected": true
+ },
+ "position": {
+ "x": 410.27706108811014,
+ "y": 135.72610592210992
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 410.27706108811014,
+ "y": 135.72610592210992
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "LINSPACE-f80c30e0-eb44-4a25-94bb-f95afa92ad12",
+ "sourceHandle": "default",
+ "target": "VECTOR_DELETE-454ae648-0ca5-4e30-8f6e-56edfee71ff0",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-f80c30e0-eb44-4a25-94bb-f95afa92ad12default-VECTOR_DELETE-454ae648-0ca5-4e30-8f6e-56edfee71ff0default",
+ "selected": false
+ },
+ {
+ "source": "VECTOR_DELETE-454ae648-0ca5-4e30-8f6e-56edfee71ff0",
+ "sourceHandle": "default",
+ "target": "SCATTER-69115da9-f7af-44a0-ad96-a2ae12da4166",
+ "targetHandle": "default",
+ "id": "reactflow__edge-VECTOR_DELETE-454ae648-0ca5-4e30-8f6e-56edfee71ff0default-SCATTER-69115da9-f7af-44a0-ad96-a2ae12da4166default"
+ },
+ {
+ "source": "LINSPACE-f80c30e0-eb44-4a25-94bb-f95afa92ad12",
+ "sourceHandle": "default",
+ "target": "SCATTER-439c772a-837a-424d-bd07-656245e01cc9",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-f80c30e0-eb44-4a25-94bb-f95afa92ad12default-SCATTER-439c772a-837a-424d-bd07-656245e01cc9default",
+ "selected": false
+ }
+ ],
+ "viewport": {
+ "x": 637.654905587641,
+ "y": 363.60612546109087,
+ "zoom": 0.7111497425822767
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/examples/EX1/example.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/examples/EX1/example.md
new file mode 100644
index 0000000000..8d619890da
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_DELETE/examples/EX1/example.md
@@ -0,0 +1 @@
+In this example, we generate a vector by using a `LINSPACE` node. Then starting from index 0, 2 elements are deleted using `VECTOR_DELETE`. The resulting vector is visualized with `SCATTER` node, and another node has been connected to `LINSPACE` for comparison.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INDEXING/a1-[autogen]/python_code.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INDEXING/a1-[autogen]/python_code.txt
index b0301e125d..873aa60acc 100644
--- a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INDEXING/a1-[autogen]/python_code.txt
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INDEXING/a1-[autogen]/python_code.txt
@@ -1,4 +1,3 @@
-import numpy as np
from flojoy import flojoy, Vector, Scalar
@@ -8,10 +7,11 @@ def VECTOR_INDEXING(
index: int = 0,
) -> Scalar:
+
assert (
len(default.v) > index
), "The index parameter must be less than the length of the Vector."
- assert index >= 0, "The index parameter greater than zero."
+ assert index >= 0, "The index parameter must be greater than zero."
c = default.v[index]
return Scalar(c=c)
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/VECTOR_INSERT.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/VECTOR_INSERT.md
new file mode 100644
index 0000000000..4fd865b6f5
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/VECTOR_INSERT.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/a1-[autogen]/docstring.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..c8ac816d43
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/a1-[autogen]/docstring.txt
@@ -0,0 +1,20 @@
+The VECTOR_INSERT node inserts a value to the Vector at the
+ specified index.
+
+ Inputs
+ ------
+ v : Vector
+ The input vector to insert value.
+
+ Parameters
+ ----------
+ element: int
+ The value to add to the input vector.
+
+ index: int
+ The index of the vector to insert value.
+
+ Returns
+ -------
+ Vector
+ The new vector that contains the inserted value
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/a1-[autogen]/python_code.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..8cf00d7cb4
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/a1-[autogen]/python_code.txt
@@ -0,0 +1,19 @@
+from numpy import concatenate, array
+from flojoy import flojoy, Vector
+
+
+@flojoy
+def VECTOR_INSERT(default: Vector, index: int = 0, value: int = 0) -> Vector:
+
+
+ assert (
+ len(default.v) > index
+ ), "The index parameter must be less than the length of the Vector."
+ assert index >= 0, "The index parameter must be greater than zero."
+
+ if index == len(default.v) - 1:
+ v = concatenate((default.v, [value]))
+ else:
+ v = concatenate((default.v[:index], [value], default.v[index:]))
+
+ return Vector(v=v)
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/appendix/hardware.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/appendix/media.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/appendix/notes.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/examples/EX1/app.json b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/examples/EX1/app.json
new file mode 100644
index 0000000000..1652cf0ed4
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/examples/EX1/app.json
@@ -0,0 +1,324 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 160,
+ "height": 160,
+ "id": "VECTOR_INSERT-933e0106-5454-4bef-aa54-33e8537e0c0a",
+ "type": "TRANSFORMERS",
+ "data": {
+ "id": "VECTOR_INSERT-933e0106-5454-4bef-aa54-33e8537e0c0a",
+ "label": "VECTOR INSERT",
+ "func": "VECTOR_INSERT",
+ "type": "TRANSFORMERS",
+ "ctrls": {
+ "index": {
+ "type": "int",
+ "default": 0,
+ "desc": "The index of the vector to insert value.",
+ "overload": null,
+ "functionName": "VECTOR_INSERT",
+ "param": "index",
+ "value": 0
+ },
+ "value": {
+ "type": "int",
+ "default": 0,
+ "desc": null,
+ "overload": null,
+ "functionName": "VECTOR_INSERT",
+ "param": "value",
+ "value": 13
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "The new vector that contains the inserted value"
+ }
+ ],
+ "path": "TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/VECTOR_INSERT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 132.73363980782221,
+ "y": -275.2712172943302
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 132.73363980782221,
+ "y": -275.2712172943302
+ },
+ "dragging": true
+ },
+ {
+ "width": 208,
+ "height": 96,
+ "id": "LINSPACE-7a9f9fab-e8a8-490e-bb79-11dd2920655e",
+ "type": "GENERATORS",
+ "data": {
+ "id": "LINSPACE-7a9f9fab-e8a8-490e-bb79-11dd2920655e",
+ "label": "LINSPACE",
+ "func": "LINSPACE",
+ "type": "GENERATORS",
+ "ctrls": {
+ "start": {
+ "type": "float",
+ "default": 10,
+ "desc": "The start point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "start",
+ "value": 0
+ },
+ "end": {
+ "type": "float",
+ "default": 0,
+ "desc": "The end point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "end",
+ "value": 10
+ },
+ "step": {
+ "type": "int",
+ "default": 1000,
+ "desc": "The number of points in the vector.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "step",
+ "value": 10
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector|OrderedPair",
+ "multiple": false,
+ "desc": "Optional input in case LINSPACE is used in a loop. Not used."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "v: the vector between start and end with step number of points."
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/LINSPACE/LINSPACE.py",
+ "selected": false
+ },
+ "position": {
+ "x": -226.17189847801404,
+ "y": -236.96939764894648
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": -226.17189847801404,
+ "y": -236.96939764894648
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "SCATTER-3cdae249-bfc6-414c-90ca-676c409f63a1",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "SCATTER-3cdae249-bfc6-414c-90ca-676c409f63a1",
+ "label": "SCATTER",
+ "func": "SCATTER",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|DataFrame|Matrix|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly Scatter visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/SCATTER/SCATTER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 530.9194383287412,
+ "y": -298.5003635099639
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 530.9194383287412,
+ "y": -298.5003635099639
+ },
+ "dragging": true
+ },
+ {
+ "width": 208,
+ "height": 96,
+ "id": "LINSPACE-c18dd94e-5173-4351-9199-ef26d10df28d",
+ "type": "GENERATORS",
+ "data": {
+ "id": "LINSPACE-c18dd94e-5173-4351-9199-ef26d10df28d",
+ "label": "LINSPACE 1",
+ "func": "LINSPACE",
+ "type": "GENERATORS",
+ "ctrls": {
+ "start": {
+ "type": "float",
+ "default": 10,
+ "desc": "The start point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "start",
+ "value": 0
+ },
+ "end": {
+ "type": "float",
+ "default": 0,
+ "desc": "The end point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "end",
+ "value": 10
+ },
+ "step": {
+ "type": "int",
+ "default": 1000,
+ "desc": "The number of points in the vector.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "step",
+ "value": 10
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector|OrderedPair",
+ "multiple": false,
+ "desc": "Optional input in case LINSPACE is used in a loop. Not used."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "v: the vector between start and end with step number of points."
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/LINSPACE/LINSPACE.py",
+ "selected": false
+ },
+ "position": {
+ "x": -238.30662033776346,
+ "y": 15.672223666923344
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": -238.30662033776346,
+ "y": 15.672223666923344
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "SCATTER-cf0df1c2-d8f3-440d-be66-050f14028a73",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "SCATTER-cf0df1c2-d8f3-440d-be66-050f14028a73",
+ "label": "SCATTER 1",
+ "func": "SCATTER",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|DataFrame|Matrix|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly Scatter visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/SCATTER/SCATTER.py",
+ "selected": true
+ },
+ "position": {
+ "x": 122.75760249507664,
+ "y": -19.02508588254443
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 122.75760249507664,
+ "y": -19.02508588254443
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "LINSPACE-7a9f9fab-e8a8-490e-bb79-11dd2920655e",
+ "sourceHandle": "default",
+ "target": "VECTOR_INSERT-933e0106-5454-4bef-aa54-33e8537e0c0a",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-7a9f9fab-e8a8-490e-bb79-11dd2920655edefault-VECTOR_INSERT-933e0106-5454-4bef-aa54-33e8537e0c0adefault"
+ },
+ {
+ "source": "VECTOR_INSERT-933e0106-5454-4bef-aa54-33e8537e0c0a",
+ "sourceHandle": "default",
+ "target": "SCATTER-3cdae249-bfc6-414c-90ca-676c409f63a1",
+ "targetHandle": "default",
+ "id": "reactflow__edge-VECTOR_INSERT-933e0106-5454-4bef-aa54-33e8537e0c0adefault-SCATTER-3cdae249-bfc6-414c-90ca-676c409f63a1default"
+ },
+ {
+ "source": "LINSPACE-c18dd94e-5173-4351-9199-ef26d10df28d",
+ "sourceHandle": "default",
+ "target": "SCATTER-cf0df1c2-d8f3-440d-be66-050f14028a73",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-c18dd94e-5173-4351-9199-ef26d10df28ddefault-SCATTER-cf0df1c2-d8f3-440d-be66-050f14028a73default"
+ }
+ ],
+ "viewport": {
+ "x": 637.654905587641,
+ "y": 363.60612546109087,
+ "zoom": 0.7111497425822767
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/examples/EX1/example.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/examples/EX1/example.md
new file mode 100644
index 0000000000..560d9e6876
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_INSERT/examples/EX1/example.md
@@ -0,0 +1 @@
+In this example, we generate a vector by using a `LINSPACE` node. Then, a value specified (13) is inserted at index 0 `VECTOR_INSERT`. The value is visualized with `SCATTER` node. Another set of example excluding `VECTOR_INSERT` node has been added for comparison.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/VECTOR_MAX.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/VECTOR_MAX.md
new file mode 100644
index 0000000000..1ee225fb68
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/VECTOR_MAX.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/a1-[autogen]/docstring.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..a05015a675
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/a1-[autogen]/docstring.txt
@@ -0,0 +1,11 @@
+The VECTOR_MAX node returns the maximum value from the Vector
+
+ Inputs
+ ------
+ v : Vector
+ The input vector to use max peration
+
+ Returns
+ -------
+ Scalar
+ The maximum value found from the input vector
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/a1-[autogen]/python_code.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..8511d82d79
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/a1-[autogen]/python_code.txt
@@ -0,0 +1,9 @@
+import numpy as np
+from flojoy import flojoy, Vector, Scalar
+
+
+@flojoy
+def VECTOR_MAX(default: Vector) -> Scalar:
+
+
+ return Scalar(c=np.max(default.v))
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/appendix/hardware.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/appendix/media.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/appendix/notes.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/examples/EX1/app.json b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/examples/EX1/app.json
new file mode 100644
index 0000000000..98e1f718db
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/examples/EX1/app.json
@@ -0,0 +1,376 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 160,
+ "height": 160,
+ "id": "VECTOR_MAX-a96e94bf-eb75-4fb7-8f6c-f87279b5a6b3",
+ "type": "TRANSFORMERS",
+ "data": {
+ "id": "VECTOR_MAX-a96e94bf-eb75-4fb7-8f6c-f87279b5a6b3",
+ "label": "VECTOR MAX",
+ "func": "VECTOR_MAX",
+ "type": "TRANSFORMERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "The maximum value found from the input vector"
+ }
+ ],
+ "path": "TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/VECTOR_MAX.py",
+ "selected": false
+ },
+ "position": {
+ "x": 130.31981266859236,
+ "y": -328.83929636806715
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 130.31981266859236,
+ "y": -328.83929636806715
+ },
+ "dragging": true
+ },
+ {
+ "width": 160,
+ "height": 160,
+ "id": "VECTOR_MIN-7aab6cdd-c04e-4577-8f9c-b71748fd18ff",
+ "type": "TRANSFORMERS",
+ "data": {
+ "id": "VECTOR_MIN-7aab6cdd-c04e-4577-8f9c-b71748fd18ff",
+ "label": "VECTOR MIN",
+ "func": "VECTOR_MIN",
+ "type": "TRANSFORMERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "The minimum value found from the input vector"
+ }
+ ],
+ "path": "TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/VECTOR_MIN.py",
+ "selected": false
+ },
+ "position": {
+ "x": 145.13349056115274,
+ "y": 35.87207046216116
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 145.13349056115274,
+ "y": 35.87207046216116
+ },
+ "dragging": true
+ },
+ {
+ "width": 208,
+ "height": 96,
+ "id": "LINSPACE-be66f6ee-60ec-4c9e-b7a5-7d637dfd0a48",
+ "type": "GENERATORS",
+ "data": {
+ "id": "LINSPACE-be66f6ee-60ec-4c9e-b7a5-7d637dfd0a48",
+ "label": "LINSPACE",
+ "func": "LINSPACE",
+ "type": "GENERATORS",
+ "ctrls": {
+ "start": {
+ "type": "float",
+ "default": 10,
+ "desc": "The start point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "start",
+ "value": 8
+ },
+ "end": {
+ "type": "float",
+ "default": 0,
+ "desc": "The end point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "end",
+ "value": 50
+ },
+ "step": {
+ "type": "int",
+ "default": 1000,
+ "desc": "The number of points in the vector.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "step",
+ "value": 200
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector|OrderedPair",
+ "multiple": false,
+ "desc": "Optional input in case LINSPACE is used in a loop. Not used."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "v: the vector between start and end with step number of points."
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/LINSPACE/LINSPACE.py",
+ "selected": false
+ },
+ "position": {
+ "x": -321.7726099556296,
+ "y": -142.40389954737725
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": -321.7726099556296,
+ "y": -142.40389954737725
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-4c8e520d-df00-4e5b-8d3b-39fdc20885e5",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-4c8e520d-df00-4e5b-8d3b-39fdc20885e5",
+ "label": "BIG NUMBER",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether to show relative delta from last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 523.8297982318611,
+ "y": -364.2688477798421
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 523.8297982318611,
+ "y": -364.2688477798421
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-af51f687-5e84-4277-8ab7-452c4debd152",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-af51f687-5e84-4277-8ab7-452c4debd152",
+ "label": "BIG NUMBER 1",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether to show relative delta from last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 531.0832930102642,
+ "y": 7.055164039401802
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 531.0832930102642,
+ "y": 7.055164039401802
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "LINSPACE-be66f6ee-60ec-4c9e-b7a5-7d637dfd0a48",
+ "sourceHandle": "default",
+ "target": "VECTOR_MAX-a96e94bf-eb75-4fb7-8f6c-f87279b5a6b3",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-be66f6ee-60ec-4c9e-b7a5-7d637dfd0a48default-VECTOR_MAX-a96e94bf-eb75-4fb7-8f6c-f87279b5a6b3default"
+ },
+ {
+ "source": "LINSPACE-be66f6ee-60ec-4c9e-b7a5-7d637dfd0a48",
+ "sourceHandle": "default",
+ "target": "VECTOR_MIN-7aab6cdd-c04e-4577-8f9c-b71748fd18ff",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-be66f6ee-60ec-4c9e-b7a5-7d637dfd0a48default-VECTOR_MIN-7aab6cdd-c04e-4577-8f9c-b71748fd18ffdefault"
+ },
+ {
+ "source": "VECTOR_MAX-a96e94bf-eb75-4fb7-8f6c-f87279b5a6b3",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-4c8e520d-df00-4e5b-8d3b-39fdc20885e5",
+ "targetHandle": "default",
+ "id": "reactflow__edge-VECTOR_MAX-a96e94bf-eb75-4fb7-8f6c-f87279b5a6b3default-BIG_NUMBER-4c8e520d-df00-4e5b-8d3b-39fdc20885e5default"
+ },
+ {
+ "source": "VECTOR_MIN-7aab6cdd-c04e-4577-8f9c-b71748fd18ff",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-af51f687-5e84-4277-8ab7-452c4debd152",
+ "targetHandle": "default",
+ "id": "reactflow__edge-VECTOR_MIN-7aab6cdd-c04e-4577-8f9c-b71748fd18ffdefault-BIG_NUMBER-af51f687-5e84-4277-8ab7-452c4debd152default"
+ }
+ ],
+ "viewport": {
+ "x": 637.654905587641,
+ "y": 363.60612546109087,
+ "zoom": 0.7111497425822767
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/examples/EX1/example.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/examples/EX1/example.md
new file mode 100644
index 0000000000..ad5f2b9948
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/examples/EX1/example.md
@@ -0,0 +1 @@
+In this example, we generate a vector starting from 8 and ending at 50 by using a `LINSPACE` node. Then a `VECTOR_MAX` node is connected to the example vector where it will find the maximum value and the one below will find the minimum value. The value is visualized with `BIG_NUMBER` node.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/VECTOR_MIN.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/VECTOR_MIN.md
new file mode 100644
index 0000000000..6aef5d9dff
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/VECTOR_MIN.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/a1-[autogen]/docstring.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..d8033d9379
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/a1-[autogen]/docstring.txt
@@ -0,0 +1,11 @@
+The VECTOR_MIN node returns the minimum value from the Vector
+
+ Inputs
+ ------
+ v : Vector
+ The input vector to use min peration
+
+ Returns
+ -------
+ Scalar
+ The minimum value found from the input vector
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/a1-[autogen]/python_code.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..56563e9a5c
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/a1-[autogen]/python_code.txt
@@ -0,0 +1,9 @@
+import numpy as np
+from flojoy import flojoy, Vector, Scalar
+
+
+@flojoy
+def VECTOR_MIN(default: Vector) -> Scalar:
+
+
+ return Scalar(c=np.min(default.v))
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/appendix/hardware.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/appendix/media.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/appendix/notes.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/examples/EX1/app.json b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/examples/EX1/app.json
new file mode 100644
index 0000000000..98e1f718db
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/examples/EX1/app.json
@@ -0,0 +1,376 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 160,
+ "height": 160,
+ "id": "VECTOR_MAX-a96e94bf-eb75-4fb7-8f6c-f87279b5a6b3",
+ "type": "TRANSFORMERS",
+ "data": {
+ "id": "VECTOR_MAX-a96e94bf-eb75-4fb7-8f6c-f87279b5a6b3",
+ "label": "VECTOR MAX",
+ "func": "VECTOR_MAX",
+ "type": "TRANSFORMERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "The maximum value found from the input vector"
+ }
+ ],
+ "path": "TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MAX/VECTOR_MAX.py",
+ "selected": false
+ },
+ "position": {
+ "x": 130.31981266859236,
+ "y": -328.83929636806715
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 130.31981266859236,
+ "y": -328.83929636806715
+ },
+ "dragging": true
+ },
+ {
+ "width": 160,
+ "height": 160,
+ "id": "VECTOR_MIN-7aab6cdd-c04e-4577-8f9c-b71748fd18ff",
+ "type": "TRANSFORMERS",
+ "data": {
+ "id": "VECTOR_MIN-7aab6cdd-c04e-4577-8f9c-b71748fd18ff",
+ "label": "VECTOR MIN",
+ "func": "VECTOR_MIN",
+ "type": "TRANSFORMERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Scalar",
+ "desc": "The minimum value found from the input vector"
+ }
+ ],
+ "path": "TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/VECTOR_MIN.py",
+ "selected": false
+ },
+ "position": {
+ "x": 145.13349056115274,
+ "y": 35.87207046216116
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 145.13349056115274,
+ "y": 35.87207046216116
+ },
+ "dragging": true
+ },
+ {
+ "width": 208,
+ "height": 96,
+ "id": "LINSPACE-be66f6ee-60ec-4c9e-b7a5-7d637dfd0a48",
+ "type": "GENERATORS",
+ "data": {
+ "id": "LINSPACE-be66f6ee-60ec-4c9e-b7a5-7d637dfd0a48",
+ "label": "LINSPACE",
+ "func": "LINSPACE",
+ "type": "GENERATORS",
+ "ctrls": {
+ "start": {
+ "type": "float",
+ "default": 10,
+ "desc": "The start point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "start",
+ "value": 8
+ },
+ "end": {
+ "type": "float",
+ "default": 0,
+ "desc": "The end point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "end",
+ "value": 50
+ },
+ "step": {
+ "type": "int",
+ "default": 1000,
+ "desc": "The number of points in the vector.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "step",
+ "value": 200
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector|OrderedPair",
+ "multiple": false,
+ "desc": "Optional input in case LINSPACE is used in a loop. Not used."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "v: the vector between start and end with step number of points."
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/LINSPACE/LINSPACE.py",
+ "selected": false
+ },
+ "position": {
+ "x": -321.7726099556296,
+ "y": -142.40389954737725
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": -321.7726099556296,
+ "y": -142.40389954737725
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-4c8e520d-df00-4e5b-8d3b-39fdc20885e5",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-4c8e520d-df00-4e5b-8d3b-39fdc20885e5",
+ "label": "BIG NUMBER",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether to show relative delta from last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 523.8297982318611,
+ "y": -364.2688477798421
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 523.8297982318611,
+ "y": -364.2688477798421
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "BIG_NUMBER-af51f687-5e84-4277-8ab7-452c4debd152",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "BIG_NUMBER-af51f687-5e84-4277-8ab7-452c4debd152",
+ "label": "BIG NUMBER 1",
+ "func": "BIG_NUMBER",
+ "type": "VISUALIZERS",
+ "ctrls": {
+ "suffix": {
+ "type": "str",
+ "default": null,
+ "desc": "any suffix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "suffix",
+ "value": ""
+ },
+ "prefix": {
+ "type": "str",
+ "default": null,
+ "desc": "any prefix to show with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "prefix",
+ "value": ""
+ },
+ "title": {
+ "type": "str",
+ "default": null,
+ "desc": "title of the plot, default \"BIG_NUMBER\"",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "title",
+ "value": ""
+ },
+ "relative_delta": {
+ "type": "bool",
+ "default": true,
+ "desc": "whether to show relative delta from last run along with big number",
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "relative_delta",
+ "value": true
+ },
+ "scientific_notation": {
+ "type": "bool",
+ "default": false,
+ "desc": null,
+ "overload": null,
+ "functionName": "BIG_NUMBER",
+ "param": "scientific_notation",
+ "value": false
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|Scalar|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly big number visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/BIG_NUMBER/BIG_NUMBER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 531.0832930102642,
+ "y": 7.055164039401802
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 531.0832930102642,
+ "y": 7.055164039401802
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "LINSPACE-be66f6ee-60ec-4c9e-b7a5-7d637dfd0a48",
+ "sourceHandle": "default",
+ "target": "VECTOR_MAX-a96e94bf-eb75-4fb7-8f6c-f87279b5a6b3",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-be66f6ee-60ec-4c9e-b7a5-7d637dfd0a48default-VECTOR_MAX-a96e94bf-eb75-4fb7-8f6c-f87279b5a6b3default"
+ },
+ {
+ "source": "LINSPACE-be66f6ee-60ec-4c9e-b7a5-7d637dfd0a48",
+ "sourceHandle": "default",
+ "target": "VECTOR_MIN-7aab6cdd-c04e-4577-8f9c-b71748fd18ff",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-be66f6ee-60ec-4c9e-b7a5-7d637dfd0a48default-VECTOR_MIN-7aab6cdd-c04e-4577-8f9c-b71748fd18ffdefault"
+ },
+ {
+ "source": "VECTOR_MAX-a96e94bf-eb75-4fb7-8f6c-f87279b5a6b3",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-4c8e520d-df00-4e5b-8d3b-39fdc20885e5",
+ "targetHandle": "default",
+ "id": "reactflow__edge-VECTOR_MAX-a96e94bf-eb75-4fb7-8f6c-f87279b5a6b3default-BIG_NUMBER-4c8e520d-df00-4e5b-8d3b-39fdc20885e5default"
+ },
+ {
+ "source": "VECTOR_MIN-7aab6cdd-c04e-4577-8f9c-b71748fd18ff",
+ "sourceHandle": "default",
+ "target": "BIG_NUMBER-af51f687-5e84-4277-8ab7-452c4debd152",
+ "targetHandle": "default",
+ "id": "reactflow__edge-VECTOR_MIN-7aab6cdd-c04e-4577-8f9c-b71748fd18ffdefault-BIG_NUMBER-af51f687-5e84-4277-8ab7-452c4debd152default"
+ }
+ ],
+ "viewport": {
+ "x": 637.654905587641,
+ "y": 363.60612546109087,
+ "zoom": 0.7111497425822767
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/examples/EX1/example.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/examples/EX1/example.md
new file mode 100644
index 0000000000..e4bde7f1a9
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_MIN/examples/EX1/example.md
@@ -0,0 +1 @@
+In this example, we generate a vector starting from 8 and ending at 50 by using a `LINSPACE` node. Then a `VECTOR_MIN` node is connected to the example vector where it will find the minimum value and the one above will find the maximum value. The value is visualized with `BIG_NUMBER` node.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/VECTOR_SUBSET.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/VECTOR_SUBSET.md
new file mode 100644
index 0000000000..71e2facd9f
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/VECTOR_SUBSET.md
@@ -0,0 +1,57 @@
+
+[//]: # (Custom component imports)
+
+import DocString from '@site/src/components/DocString';
+import PythonCode from '@site/src/components/PythonCode';
+import AppDisplay from '@site/src/components/AppDisplay';
+import SectionBreak from '@site/src/components/SectionBreak';
+import AppendixSection from '@site/src/components/AppendixSection';
+
+[//]: # (Docstring)
+
+import DocstringSource from '!!raw-loader!./a1-[autogen]/docstring.txt';
+import PythonSource from '!!raw-loader!./a1-[autogen]/python_code.txt';
+
+{DocstringSource}
+{PythonSource}
+
+
+
+
+
+[//]: # (Examples)
+
+## Examples
+
+import Example1 from './examples/EX1/example.md';
+import App1 from '!!raw-loader!./examples/EX1/app.json';
+
+
+
+
+ {App1}
+
+
+
+
+
+
+
+
+[//]: # (Appendix)
+
+import Notes from './appendix/notes.md';
+import Hardware from './appendix/hardware.md';
+import Media from './appendix/media.md';
+
+## Appendix
+
+
+
+
+
+
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/a1-[autogen]/docstring.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/a1-[autogen]/docstring.txt
new file mode 100644
index 0000000000..2c57320766
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/a1-[autogen]/docstring.txt
@@ -0,0 +1,18 @@
+The VECTOR_SUBSET node returns the subset of values from requested indices
+ Inputs
+ ------
+ v : Vector
+ The input vector to return subset of values from
+
+ Parameters
+ ----------
+ indices: Array
+ specified indices to extract values at from the input vector
+
+ length: int
+ number of elements to extract from the input vector, default is 1 (this only applies when one index is specified for indices parameter)
+
+ Returns
+ -------
+ Vector
+ The new vector with subset of elements extracted from the input vector
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/a1-[autogen]/python_code.txt b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/a1-[autogen]/python_code.txt
new file mode 100644
index 0000000000..3e2844347f
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/a1-[autogen]/python_code.txt
@@ -0,0 +1,27 @@
+from numpy import any, array, arange, take
+from flojoy import flojoy, Vector, Array
+
+
+@flojoy
+def VECTOR_SUBSET(default: Vector, indices: Array, length: int = 1) -> Vector:
+
+
+ # unwrap the indices first
+ indices = array(indices.unwrap(), dtype=int)
+
+ assert len(default.v) > len(
+ indices
+ ), "The length of indices parameter must be less than the length of the Vector."
+ assert any(indices >= 0), "The indices must be greater than zero."
+
+ if len(indices) == 1:
+ assert (indices[0] + (length - 1)) < len(
+ default.v
+ ), "The length of items to delete starting from index parameter must not exceed the length of the Vector."
+
+ if len(indices) > 1:
+ v = take(default.v, indices)
+ else:
+ indices = arange(indices[0], length)
+ v = take(default.v, indices)
+ return Vector(v=v)
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/appendix/hardware.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/appendix/hardware.md
new file mode 100644
index 0000000000..7f78a555c4
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/appendix/hardware.md
@@ -0,0 +1 @@
+This node does not require any peripheral hardware to operate. Please see INSTRUMENTS for nodes that interact with the physical world through connected hardware.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/appendix/media.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/appendix/media.md
new file mode 100644
index 0000000000..8bcee9be90
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/appendix/media.md
@@ -0,0 +1 @@
+No supporting screenshots, photos, or videos have been added to the media.md file for this node.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/appendix/notes.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/appendix/notes.md
new file mode 100644
index 0000000000..04aded2ec9
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/appendix/notes.md
@@ -0,0 +1 @@
+No theory or technical notes have been contributed for this node yet.
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/examples/EX1/app.json b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/examples/EX1/app.json
new file mode 100644
index 0000000000..ca4db7e0a3
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/examples/EX1/app.json
@@ -0,0 +1,305 @@
+{
+ "rfInstance": {
+ "nodes": [
+ {
+ "width": 160,
+ "height": 160,
+ "id": "VECTOR_SUBSET-e808198b-5507-406c-816b-edfa5cd67c65",
+ "type": "TRANSFORMERS",
+ "data": {
+ "id": "VECTOR_SUBSET-e808198b-5507-406c-816b-edfa5cd67c65",
+ "label": "VECTOR SUBSET",
+ "func": "VECTOR_SUBSET",
+ "type": "TRANSFORMERS",
+ "ctrls": {
+ "indices": {
+ "type": "Array",
+ "default": null,
+ "desc": "specified indices to extract values at from the input vector",
+ "overload": null,
+ "functionName": "VECTOR_SUBSET",
+ "param": "indices",
+ "value": "3, 1, 9"
+ },
+ "length": {
+ "type": "int",
+ "default": 1,
+ "desc": "number of elements to extract from the input vector, default is 1 (this only applies when one index is specified for indices parameter)",
+ "overload": null,
+ "functionName": "VECTOR_SUBSET",
+ "param": "length",
+ "value": 1
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "The new vector with subset of elements extracted from the input vector"
+ }
+ ],
+ "path": "TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/VECTOR_SUBSET.py",
+ "selected": false
+ },
+ "position": {
+ "x": 104.03576804813667,
+ "y": -249.72160283864238
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 104.03576804813667,
+ "y": -249.72160283864238
+ },
+ "dragging": true
+ },
+ {
+ "width": 208,
+ "height": 96,
+ "id": "LINSPACE-d585a7bc-2746-403c-a11d-8e126f184986",
+ "type": "GENERATORS",
+ "data": {
+ "id": "LINSPACE-d585a7bc-2746-403c-a11d-8e126f184986",
+ "label": "LINSPACE",
+ "func": "LINSPACE",
+ "type": "GENERATORS",
+ "ctrls": {
+ "start": {
+ "type": "float",
+ "default": 10,
+ "desc": "The start point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "start",
+ "value": 0
+ },
+ "end": {
+ "type": "float",
+ "default": 0,
+ "desc": "The end point of the data.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "end",
+ "value": 10
+ },
+ "step": {
+ "type": "int",
+ "default": 1000,
+ "desc": "The number of points in the vector.",
+ "overload": null,
+ "functionName": "LINSPACE",
+ "param": "step",
+ "value": 10
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector|OrderedPair",
+ "multiple": false,
+ "desc": "Optional input in case LINSPACE is used in a loop. Not used."
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Vector",
+ "desc": "v: the vector between start and end with step number of points."
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/LINSPACE/LINSPACE.py",
+ "selected": false
+ },
+ "position": {
+ "x": -228.13999483234682,
+ "y": -219.17458038428336
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": -228.13999483234682,
+ "y": -219.17458038428336
+ },
+ "dragging": true
+ },
+ {
+ "width": 380,
+ "height": 293,
+ "id": "SCATTER-ab4ed575-e472-4057-a8aa-15f49220d247",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "SCATTER-ab4ed575-e472-4057-a8aa-15f49220d247",
+ "label": "SCATTER",
+ "func": "SCATTER",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "OrderedPair|DataFrame|Matrix|Vector",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "Plotly",
+ "desc": "the DataContainer containing Plotly Scatter visualization"
+ }
+ ],
+ "path": "VISUALIZERS/PLOTLY/SCATTER/SCATTER.py",
+ "selected": false
+ },
+ "position": {
+ "x": 428.99358461694226,
+ "y": -314.5602635329144
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 428.99358461694226,
+ "y": -314.5602635329144
+ },
+ "dragging": true
+ },
+ {
+ "width": 208,
+ "height": 96,
+ "id": "TEXT-8b9ff74a-8faa-4e7d-b66a-b1c757520398",
+ "type": "GENERATORS",
+ "data": {
+ "id": "TEXT-8b9ff74a-8faa-4e7d-b66a-b1c757520398",
+ "label": "TEXT",
+ "func": "TEXT",
+ "type": "GENERATORS",
+ "ctrls": {
+ "value": {
+ "type": "str",
+ "default": "Hello World!",
+ "desc": "The value set in Parameters",
+ "overload": null,
+ "functionName": "TEXT",
+ "param": "value",
+ "value": "This is an app that extracts the values from the input vector given the indices to locate the values from."
+ }
+ },
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "_",
+ "id": "_",
+ "type": "Any",
+ "multiple": false,
+ "desc": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "desc": "text_blob: return the value being set in Parameters"
+ }
+ ],
+ "path": "GENERATORS/SIMULATIONS/TEXT/TEXT.py",
+ "selected": false
+ },
+ "position": {
+ "x": 936.9816915983375,
+ "y": -214.31949084904693
+ },
+ "selected": false,
+ "positionAbsolute": {
+ "x": 936.9816915983375,
+ "y": -214.31949084904693
+ },
+ "dragging": true
+ },
+ {
+ "width": 384,
+ "height": 288,
+ "id": "TEXT_VIEW-51dabb17-f619-4f5b-963e-a84f3dec216e",
+ "type": "VISUALIZERS",
+ "data": {
+ "id": "TEXT_VIEW-51dabb17-f619-4f5b-963e-a84f3dec216e",
+ "label": "TEXT VIEW",
+ "func": "TEXT_VIEW",
+ "type": "VISUALIZERS",
+ "ctrls": {},
+ "initCtrls": {},
+ "inputs": [
+ {
+ "name": "default",
+ "id": "default",
+ "type": "TextBlob",
+ "multiple": false,
+ "desc": "the DataContainer to be visualized in text format"
+ }
+ ],
+ "path": "VISUALIZERS/DATA_STRUCTURE/TEXT_VIEW/TEXT_VIEW.py",
+ "selected": true
+ },
+ "position": {
+ "x": 840.4770466400951,
+ "y": -598.4440869703409
+ },
+ "selected": true,
+ "positionAbsolute": {
+ "x": 840.4770466400951,
+ "y": -598.4440869703409
+ },
+ "dragging": true
+ }
+ ],
+ "edges": [
+ {
+ "source": "LINSPACE-d585a7bc-2746-403c-a11d-8e126f184986",
+ "sourceHandle": "default",
+ "target": "VECTOR_SUBSET-e808198b-5507-406c-816b-edfa5cd67c65",
+ "targetHandle": "default",
+ "id": "reactflow__edge-LINSPACE-d585a7bc-2746-403c-a11d-8e126f184986default-VECTOR_SUBSET-e808198b-5507-406c-816b-edfa5cd67c65default"
+ },
+ {
+ "source": "VECTOR_SUBSET-e808198b-5507-406c-816b-edfa5cd67c65",
+ "sourceHandle": "default",
+ "target": "SCATTER-ab4ed575-e472-4057-a8aa-15f49220d247",
+ "targetHandle": "default",
+ "id": "reactflow__edge-VECTOR_SUBSET-e808198b-5507-406c-816b-edfa5cd67c65default-SCATTER-ab4ed575-e472-4057-a8aa-15f49220d247default"
+ },
+ {
+ "source": "SCATTER-ab4ed575-e472-4057-a8aa-15f49220d247",
+ "sourceHandle": "default",
+ "target": "TEXT-8b9ff74a-8faa-4e7d-b66a-b1c757520398",
+ "targetHandle": "_",
+ "id": "reactflow__edge-SCATTER-ab4ed575-e472-4057-a8aa-15f49220d247default-TEXT-8b9ff74a-8faa-4e7d-b66a-b1c757520398_"
+ },
+ {
+ "source": "TEXT-8b9ff74a-8faa-4e7d-b66a-b1c757520398",
+ "sourceHandle": "default",
+ "target": "TEXT_VIEW-51dabb17-f619-4f5b-963e-a84f3dec216e",
+ "targetHandle": "default",
+ "id": "reactflow__edge-TEXT-8b9ff74a-8faa-4e7d-b66a-b1c757520398default-TEXT_VIEW-51dabb17-f619-4f5b-963e-a84f3dec216edefault"
+ }
+ ],
+ "viewport": {
+ "x": 637.654905587641,
+ "y": 363.60612546109087,
+ "zoom": 0.7111497425822767
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/examples/EX1/example.md b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/examples/EX1/example.md
new file mode 100644
index 0000000000..d99a6d8e66
--- /dev/null
+++ b/docs/nodes/TRANSFORMERS/VECTOR_MANIPULATION/VECTOR_SUBSET/examples/EX1/example.md
@@ -0,0 +1 @@
+In this example, we generate a vector by using a `LINSPACE` node. Then the values located at indices 3, 1, 9 are extracted using `VECTOR_SUBSET`. The resulting vector is visualized with `SCATTER` node.
\ No newline at end of file
diff --git a/static/img/robotics/robot_arm.png b/static/img/robotics/robot_arm.png
new file mode 100644
index 0000000000..d2e08ddf4f
Binary files /dev/null and b/static/img/robotics/robot_arm.png differ
diff --git a/yarn.lock b/yarn.lock
index c07b8d0f74..93824d189c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6762,6 +6762,11 @@ fs.realpath@^1.0.0:
resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+fsevents@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
fstream@^1.0.12:
version "1.0.12"
resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz"