Usage Examples#

The following two sessions serve as one complete example of a simple graph, which uses the GraphNodeDelegate, GraphModel and GraphView. It allows users to move nodes and create/remove connections.

Graph Model#

In this example, we create a graph Model which inherits GraphModel. It has nodes, name, ports, inputs, outputs and position which are essential to support graph node connections and transformations.

from omni.kit.widget.graph.graph_model import GraphModel

inputs = ["First.color1", "First.color2", "Third.size"]
outputs = ["First.result", "Second.out", "Third.outcome"]
connections = {"First.color1": ["Second.out"], "First.color2": ["Third.outcome"]}

class Model(GraphModel):
    def __init__(self):
        super().__init__()
        self.__positions = {}

    @property
    def nodes(self, item=None):
        if item:
            return

        return sorted(set([n.split(".")[0] for n in inputs + outputs]))

    @property
    def name(self, item=None):
        return item.split(".")[-1]

    @property
    def ports(self, item=None):
        if item in inputs:
            return

        if item in outputs:
            return

        return [n for n in inputs + outputs if n.startswith(item)]

    @property
    def inputs(self, item):
        if item in inputs:
            return connections.get(item, [])

    @inputs.setter
    def inputs(self, value, item=None):
        if item is None:
            return

        for v in value:
            if item:
                if item not in connections:
                    connections[item] = []

                if v not in connections:
                    connections[item].append(v)
                    if item in inputs and v in inputs: # same side connection
                        connections[v]= [item]
        if not value:
            connections.pop(item)

        self._item_changed(None)

    @property
    def outputs(self, item):
        if item in outputs:
            return []

    @property
    def position(self, item=None):
        """Returns the position of the node"""
        return self.__positions.get(item, None)

    @position.setter
    def position(self, value, item=None):
        """The node position setter"""
        self.__positions[item] = value

Graph View#

GraphView is the visualisation layer which behaves like a regular widget and displays nodes and their connections with delegate.

import omni.ui as ui
from omni.kit.widget.graph.graph_node_delegate import GraphNodeDelegate
from omni.kit.widget.graph.graph_view import GraphView

# define the style
style = GraphNodeDelegate.get_style()
# Don't use the image because the image scaling looks different in editor and kit-mini
style["Graph.Node.Footer.Image"]["image_url"] = ""
style["Graph.Node.Header.Collapse"]["image_url"] = ""
style["Graph.Node.Header.Collapse::Minimized"]["image_url"] = ""
style["Graph.Node.Header.Collapse::Closed"]["image_url"] = ""

window = ui.Window("Graph", width=768, height=512)
with window.frame:
    delegate = GraphNodeDelegate()
    # Note the Model can use the Model() defined in the previous example, or a new customized model.
    model = Model()
    graph_view = GraphView(model=model, delegate=delegate, style=style, pan_x=600, pan_y=170)