Ejemplo n.º 1
0
    def __init__(self, visualScripting: VisualScripting, parentWindow=None):
        super().__init__()

        self.graph = NodeGraph()
        self.graphViewer = self.graph.viewer()

        self.graphManager = visualScripting.graphManager

        self.initNodes()
        self.setupPropertiesBin()

        self.window = asset_manager.loadUI("graphQt.ui")

        self.splitter = QtWidgets.QSplitter()
        self.window.bottomLayout.addWidget(self.splitter)
        self.splitter.addWidget(self.nodeTree)
        self.splitter.addWidget(self.graphViewer)
        self.splitter.addWidget(self.propertiesBin)

        self.setupMenuBar(self.graph)

        self.onSaveEvent = Event()

        self.dockWidgets: List[QtWidgets.QDockWidget] = []

        self.settingsViewer = SettingsViewer(self.window, visualScripting)
        self.setupDockWidget(self.settingsViewer.dockWidget)
Ejemplo n.º 2
0
    NODE_NAME = 'my node'

    def __init__(self):
        super(MyNode, self).__init__()
        self.set_color(25, 58, 51)

        # create input and output port.
        self.add_input('in port')
        self.add_output('out port')


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    # create node graph.
    graph = NodeGraph()

    # set up default menu and commands.
    setup_context_menu(graph)

    # viewer widget used for the node graph.
    viewer = graph.viewer()
    viewer.resize(1100, 800)
    viewer.show()

    # registered nodes.
    reg_nodes = [
        Backdrop, MyNode, basic_nodes.FooNode, basic_nodes.BarNode,
        widget_nodes.DropdownMenuNode, widget_nodes.TextInputNode
    ]
    for n in reg_nodes:
Ejemplo n.º 3
0
        if not i.endswith(".node") and not i.endswith(".json"):
            continue
        file_name = os.path.join(folder_path, i)
        node = Publish.create_node_class(file_name)
        if node is not None:
            nodes.append(node)

    return nodes


if __name__ == '__main__':
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    app = QtWidgets.QApplication()

    # create node graph.
    graph = NodeGraph()
    graph.use_OpenGL()

    # set up default menu and commands.
    setup_context_menu(graph)
    setup_node_menu(graph, Publish)

    # show the properties bin when a node is "double clicked" in the graph.
    properties_bin = PropertiesBinWidget(node_graph=graph)
    properties_bin.setWindowFlags(QtCore.Qt.Tool)

    def show_prop_bin(node):
        if not properties_bin.isVisible():
            properties_bin.show()

    graph.node_double_clicked.connect(show_prop_bin)
Ejemplo n.º 4
0
    def setupMenuBar(self, graph: NodeGraph):
        rootMenu = graph.context_menu()

        fileMenu = rootMenu.add_menu('&File')
        editMenu = rootMenu.add_menu('&Edit')

        # create "File" menu.
        fileMenu.add_command('Open Graph...',
                             lambda: actions._open_session(graph),
                             QtGui.QKeySequence.Open)
        fileMenu.add_command('Export Graph As...',
                             lambda: actions._save_session_as(graph),
                             'Alt+Shift+s')
        fileMenu.add_command('Clear', lambda: actions._clear_session(graph))

        fileMenu.add_separator()

        fileMenu.add_command('Zoom In', lambda: actions._zoom_in(graph), '=')
        fileMenu.add_command('Zoom Out', lambda: actions._zoom_out(graph), '-')
        fileMenu.add_command('Reset Zoom', graph.reset_zoom, 'h')

        # create "Edit" menu.
        undo_actn = graph.undo_stack().createUndoAction(
            graph.viewer(), '&Undo')
        if LooseVersion(QtCore.qVersion()) >= LooseVersion('5.10'):
            undo_actn.setShortcutVisibleInContextMenu(True)
        undo_actn.setShortcuts(QtGui.QKeySequence.Undo)
        editMenu.qmenu.addAction(undo_actn)

        redo_actn = graph.undo_stack().createRedoAction(
            graph.viewer(), '&Redo')
        if LooseVersion(QtCore.qVersion()) >= LooseVersion('5.10'):
            redo_actn.setShortcutVisibleInContextMenu(True)
        redo_actn.setShortcuts(QtGui.QKeySequence.Redo)
        editMenu.qmenu.addAction(redo_actn)

        editMenu.add_separator()
        editMenu.add_command('Clear Undo History',
                             lambda: actions._clear_undo(graph))
        editMenu.add_separator()

        editMenu.add_command('Copy', graph.copy_nodes, QtGui.QKeySequence.Copy)
        editMenu.add_command('Paste', graph.paste_nodes,
                             QtGui.QKeySequence.Paste)
        editMenu.add_command(
            'Delete', lambda: graph.delete_nodes(graph.selected_nodes()),
            QtGui.QKeySequence.Delete)

        editMenu.add_separator()

        editMenu.add_command('Select all', graph.select_all, 'Ctrl+A')
        editMenu.add_command('Deselect all', graph.clear_selection,
                             'Ctrl+Shift+A')
        editMenu.add_command(
            'Enable/Disable',
            lambda: graph.disable_nodes(graph.selected_nodes()), 'd')

        editMenu.add_command(
            'Duplicate', lambda: graph.duplicate_nodes(graph.selected_nodes()),
            'Alt+c')
        editMenu.add_command('Center Selection', graph.fit_to_selection, 'f')

        editMenu.add_separator()

        menuBar = QtWidgets.QMenuBar()
        sessionMenu = QtWidgets.QMenu("Session")

        menuBar.addMenu(fileMenu.qmenu)
        menuBar.addMenu(editMenu.qmenu)
        menuBar.addMenu(sessionMenu)

        self.saveAction = QtWidgets.QAction("Save")
        self.saveAction.setShortcut(QtGui.QKeySequence.Save)
        self.saveAction.triggered.connect(self.onSave)

        self.saveAsAction = QtWidgets.QAction("Save As...")
        self.saveAsAction.setShortcut("Ctrl+Shift+S")
        self.saveAsAction.triggered.connect(self.onSaveAs)

        self.loadAction = QtWidgets.QAction("Load")
        self.loadAction.triggered.connect(self.onLoad)

        self.runAction = QtWidgets.QAction("Run")
        self.runAction.triggered.connect(self.onRun)
        self.runAction.setShortcut(QtGui.QKeySequence("R"))

        self.openInCode = QtWidgets.QAction("Show Code In Visual Studio Code")
        self.openInCode.triggered.connect(self.onOpenInVisualStudioCode)
        self.openInCode.setShortcut(QtGui.QKeySequence("Q"))

        sessionMenu.addAction(self.saveAction)
        sessionMenu.addAction(self.saveAsAction)
        sessionMenu.addAction(self.loadAction)
        sessionMenu.addAction(self.runAction)
        sessionMenu.addAction(self.openInCode)
        self.sessionMenu = sessionMenu

        self.viewMenu = QtWidgets.QMenu("View")
        menuBar.addMenu(self.viewMenu)

        self.window.verticalLayout.insertWidget(0, menuBar)
Ejemplo n.º 5
0

def print_functions(graph, node):
    for func in node.module_functions:
        print(func)


def toggle_auto_cook(graph, node):
    node.autoCook = not node.autoCook


if __name__ == '__main__':
    app = QtWidgets.QApplication([])

    # create node graph.
    graph = NodeGraph()
    graph.use_opengl()

    # set up default menu and commands.
    setup_context_menu(graph)

    # widget used for the node graph.
    graph_widget = graph.widget
    graph_widget.resize(1100, 800)
    graph_widget.show()

    # show the properties bin when a node is "double clicked" in the graph.
    properties_bin = PropertiesBinWidget(node_graph=graph)
    properties_bin.setWindowFlags(QtCore.Qt.Tool)

    def show_prop_bin(node):
Ejemplo n.º 6
0
class VisualScriptingViewer(QtCore.QObject):
    def __init__(self, visualScripting: VisualScripting, parentWindow=None):
        super().__init__()

        self.graph = NodeGraph()
        self.graphViewer = self.graph.viewer()

        self.graphManager = visualScripting.graphManager

        self.initNodes()
        self.setupPropertiesBin()

        self.window = asset_manager.loadUI("graphQt.ui")

        self.splitter = QtWidgets.QSplitter()
        self.window.bottomLayout.addWidget(self.splitter)
        self.splitter.addWidget(self.nodeTree)
        self.splitter.addWidget(self.graphViewer)
        self.splitter.addWidget(self.propertiesBin)

        self.setupMenuBar(self.graph)

        self.onSaveEvent = Event()

        self.dockWidgets: List[QtWidgets.QDockWidget] = []

        self.settingsViewer = SettingsViewer(self.window, visualScripting)
        self.setupDockWidget(self.settingsViewer.dockWidget)

    def onOpenInVisualStudioCode(self):
        QThreadPool.globalInstance().start(
            core.LambdaTask(self.openInVisualStudioCode))

    def openInVisualStudioCode(self):
        session = self.graphManager.curSession
        if session != None:
            codePath = self.graphManager.getPythonCodePath(
                session.graphSettings)

            try:
                subprocess.Popen(f'code \"{os.path.normpath(codePath)}\"',
                                 shell=True)
            except Exception as e:
                print(
                    f"Failed: {e} - Please make sure Visual Studio Code is installed and 'code' is registered as a command."
                )

    # Modified setup_context_menu from NodeGraphQt.base.actions
    def setupMenuBar(self, graph: NodeGraph):
        rootMenu = graph.context_menu()

        fileMenu = rootMenu.add_menu('&File')
        editMenu = rootMenu.add_menu('&Edit')

        # create "File" menu.
        fileMenu.add_command('Open Graph...',
                             lambda: actions._open_session(graph),
                             QtGui.QKeySequence.Open)
        fileMenu.add_command('Export Graph As...',
                             lambda: actions._save_session_as(graph),
                             'Alt+Shift+s')
        fileMenu.add_command('Clear', lambda: actions._clear_session(graph))

        fileMenu.add_separator()

        fileMenu.add_command('Zoom In', lambda: actions._zoom_in(graph), '=')
        fileMenu.add_command('Zoom Out', lambda: actions._zoom_out(graph), '-')
        fileMenu.add_command('Reset Zoom', graph.reset_zoom, 'h')

        # create "Edit" menu.
        undo_actn = graph.undo_stack().createUndoAction(
            graph.viewer(), '&Undo')
        if LooseVersion(QtCore.qVersion()) >= LooseVersion('5.10'):
            undo_actn.setShortcutVisibleInContextMenu(True)
        undo_actn.setShortcuts(QtGui.QKeySequence.Undo)
        editMenu.qmenu.addAction(undo_actn)

        redo_actn = graph.undo_stack().createRedoAction(
            graph.viewer(), '&Redo')
        if LooseVersion(QtCore.qVersion()) >= LooseVersion('5.10'):
            redo_actn.setShortcutVisibleInContextMenu(True)
        redo_actn.setShortcuts(QtGui.QKeySequence.Redo)
        editMenu.qmenu.addAction(redo_actn)

        editMenu.add_separator()
        editMenu.add_command('Clear Undo History',
                             lambda: actions._clear_undo(graph))
        editMenu.add_separator()

        editMenu.add_command('Copy', graph.copy_nodes, QtGui.QKeySequence.Copy)
        editMenu.add_command('Paste', graph.paste_nodes,
                             QtGui.QKeySequence.Paste)
        editMenu.add_command(
            'Delete', lambda: graph.delete_nodes(graph.selected_nodes()),
            QtGui.QKeySequence.Delete)

        editMenu.add_separator()

        editMenu.add_command('Select all', graph.select_all, 'Ctrl+A')
        editMenu.add_command('Deselect all', graph.clear_selection,
                             'Ctrl+Shift+A')
        editMenu.add_command(
            'Enable/Disable',
            lambda: graph.disable_nodes(graph.selected_nodes()), 'd')

        editMenu.add_command(
            'Duplicate', lambda: graph.duplicate_nodes(graph.selected_nodes()),
            'Alt+c')
        editMenu.add_command('Center Selection', graph.fit_to_selection, 'f')

        editMenu.add_separator()

        menuBar = QtWidgets.QMenuBar()
        sessionMenu = QtWidgets.QMenu("Session")

        menuBar.addMenu(fileMenu.qmenu)
        menuBar.addMenu(editMenu.qmenu)
        menuBar.addMenu(sessionMenu)

        self.saveAction = QtWidgets.QAction("Save")
        self.saveAction.setShortcut(QtGui.QKeySequence.Save)
        self.saveAction.triggered.connect(self.onSave)

        self.saveAsAction = QtWidgets.QAction("Save As...")
        self.saveAsAction.setShortcut("Ctrl+Shift+S")
        self.saveAsAction.triggered.connect(self.onSaveAs)

        self.loadAction = QtWidgets.QAction("Load")
        self.loadAction.triggered.connect(self.onLoad)

        self.runAction = QtWidgets.QAction("Run")
        self.runAction.triggered.connect(self.onRun)
        self.runAction.setShortcut(QtGui.QKeySequence("R"))

        self.openInCode = QtWidgets.QAction("Show Code In Visual Studio Code")
        self.openInCode.triggered.connect(self.onOpenInVisualStudioCode)
        self.openInCode.setShortcut(QtGui.QKeySequence("Q"))

        sessionMenu.addAction(self.saveAction)
        sessionMenu.addAction(self.saveAsAction)
        sessionMenu.addAction(self.loadAction)
        sessionMenu.addAction(self.runAction)
        sessionMenu.addAction(self.openInCode)
        self.sessionMenu = sessionMenu

        self.viewMenu = QtWidgets.QMenu("View")
        menuBar.addMenu(self.viewMenu)

        self.window.verticalLayout.insertWidget(0, menuBar)

    def onRun(self):
        if self.graphManager.curSession != None:
            self.graphManager.executeGraph()
        else:
            QMessageBox.critical(None, "Unsaved state",
                                 "Please save the graph first.")

    def setupCategoryComboBox(self, comboBox):
        categories = self.graphManager.graphCategoryToNamesMap.keys()
        for category in categories:
            comboBox.addItem(category)

    def setupFolderComboBox(self, comboBox):
        for folder in self.graphManager.serializationFolders:
            comboBox.addItem(folder)

    def loadDialog(self, relUIPath) -> QDialog:
        dialog = asset_manager.loadUI(relUIPath)
        dialog.setWindowFlags(Qt.Dialog | Qt.MSWindowsFixedSizeDialogHint)
        return dialog

    def saveAs(self):
        currentGraphName = self.graphManager.getSessionGraphName()
        currentStartNodeName = self.graphManager.getSessionStartNodeName()
        currentCategory = self.graphManager.getSessionCategory()
        currentFolder = self.graphManager.getSessionGraphFolder()

        dialog = self.loadDialog("saveGraphDialog.ui")
        dialog.graphNameLineEdit.setText(currentGraphName)
        self.setupCategoryComboBox(dialog.categoryComboBox)
        self.setupFolderComboBox(dialog.folderComboBox)

        dialog.categoryComboBox.setCurrentText(currentCategory)
        dialog.folderComboBox.setCurrentText(currentFolder)

        scriptingNodes = [
            n for n in self.graph.all_nodes() if n.isScriptingNode
        ]
        allGraphNodeNames = [
            n.name() for n in scriptingNodes if n.isViableStartNode
        ]
        for n in allGraphNodeNames:
            dialog.startNodeComboBox.addItem(n)

        if currentStartNodeName in allGraphNodeNames:
            dialog.startNodeComboBox.setCurrentText(currentStartNodeName)

        ok = dialog.exec_()
        graphName = dialog.graphNameLineEdit.text()
        graphCategory = dialog.categoryComboBox.currentText()

        if ok and graphName and len(graphName) > 0:
            startNodeName = dialog.startNodeComboBox.currentText()
            graphFolder = dialog.folderComboBox.currentText()

            writeGraph = True
            if self.graphManager.doesGraphExist(graphName, graphCategory):
                ret = QMessageBox.question(
                    None, "Name already exists.",
                    "Are you sure you want to overwrite the existing graph with the same name?"
                )
                writeGraph = ret == QMessageBox.Yes

            if writeGraph:
                self.graphManager.saveGraph(self.graph,
                                            graphFolder,
                                            graphName,
                                            graphCategory,
                                            startNodeName=startNodeName)

        self.onSaveEvent()

    def onSave(self):
        if self.graphManager.curSession != None:
            self.graphManager.saveCurrentSession()
            self.onSaveEvent()
            return

        self.saveAs()

    def onSaveAs(self):
        self.saveAs()

    def fillListView(self, listView, category):
        items = self.graphManager.graphCategoryToNamesMap.get(category)
        if items == None:
            return

        model = QStandardItemModel()
        listView.setModel(model)

        for item in items:
            sItem = QStandardItem(item)
            model.appendRow(sItem)

    def onLoad(self):
        dialog = self.loadDialog("loadGraphDialog.ui")
        self.setupCategoryComboBox(dialog.categoryComboBox)
        self.fillListView(dialog.graphListView,
                          dialog.categoryComboBox.currentText())
        dialog.categoryComboBox.currentIndexChanged.connect(
            lambda: self.fillListView(dialog.graphListView,
                                      dialog.categoryComboBox.currentText()))

        ok = dialog.exec_()

        if ok:
            selectionModel = dialog.graphListView.selectionModel()
            selectedRows = selectionModel.selectedRows()

            if len(selectedRows) > 0:
                listItem = dialog.graphListView.model().item(
                    selectedRows[0].row())
                graphName = listItem.text()
                category = dialog.categoryComboBox.currentText()
                self.graphManager.loadGraph(self.graph, graphName, category)

    def setupPropertiesBin(self):
        self.propertiesBin = PropertiesBinWidget(node_graph=self.graph)
        self.propertiesBin.setWindowFlags(QtCore.Qt.Tool)

        # Show node properties on node-double-click:
        def showPropertyBin(node):
            if not self.propertiesBin.isVisible():
                self.propertiesBin.show()

        self.graph.node_double_clicked.connect(showPropertyBin)

    def initNodes(self):
        for n in node_exec.nodes_cfg.NODE_CLASSES_TO_REGISTER:
            try:
                self.graph.register_node(n)
            except:
                pass

        self.graph.register_node(BackdropNode)

        self.nodeTree = NodeTreeWidget(node_graph=self.graph)
        self.nodeTree.update()

        node_exec.nodes_cfg.NODE_CLASS_ADDED_EVENT.subscribe(
            self.tryRegisterNode)

    def updateNodeRegistration(self):
        for n in node_exec.nodes_cfg.NODE_CLASSES_TO_REGISTER:
            self.tryRegisterNode(n)

    def tryRegisterNode(self, n):
        try:
            self.graph.register_node(n)
        except:
            pass

    def getAsDockWidget(self, parent):
        self.dockWidget = QtWidgets.QDockWidget("Visual Scripting", parent)
        self.dockWidget.setWidget(self.window)
        self.dockWidget.setObjectName("visualScriptingDockWidget")
        return self.dockWidget

    def getSettingsAsDockWidget(self):
        return self.settingsViewer.dockWidget

    def saveWindowState(self, settings):
        settings.setValue("visual_scripting_splitter_sizes",
                          self.splitter.saveState())

    def restoreWindowState(self, settings):
        self.splitter.restoreState(
            settings.value("visual_scripting_splitter_sizes"))

    def setupDockWidget(self, dockWidget: QtWidgets.QDockWidget):
        self.dockWidgets.append(dockWidget)

        # Add visibility checkbox to view main menu:
        self.viewMenu.addAction(dockWidget.toggleViewAction())
        # Allow window functionality (e.g. maximize)
        dockWidget.topLevelChanged.connect(self.dockWidgetTopLevelChanged)
        self.setDockWidgetFlags(dockWidget)

        dockWidget.toggleViewAction()

    def dockWidgetTopLevelChanged(self, changed):
        self.setDockWidgetFlags(self.sender())

    def setDockWidgetFlags(self, dockWidget):
        if dockWidget.isFloating():
            dockWidget.setWindowFlags(QtCore.Qt.CustomizeWindowHint
                                      | QtCore.Qt.Window
                                      | QtCore.Qt.WindowMinimizeButtonHint
                                      | QtCore.Qt.WindowMaximizeButtonHint
                                      | QtCore.Qt.WindowCloseButtonHint)
            dockWidget.show()
#!/usr/bin/python
# -*- coding: utf-8 -*-
from example_nodes import Nodes
from NodeGraphQt import (NodeGraph, BaseNode, setup_context_menu)
from NodeGraphQt import QtWidgets, QtCore, PropertiesBinWidget, NodeTreeWidget

if __name__ == '__main__':
    app = QtWidgets.QApplication([])

    # create node graph.
    graph = NodeGraph()

    # set up default menu and commands.
    setup_context_menu(graph)

    # widget used for the node graph.
    graph_widget = graph.widget
    graph_widget.resize(1100, 800)
    graph_widget.show()

    # show the properties bin when a node is "double clicked" in the graph.
    properties_bin = PropertiesBinWidget(node_graph=graph)
    properties_bin.setWindowFlags(QtCore.Qt.Tool)

    def show_prop_bin(node):
        if not properties_bin.isVisible():
            properties_bin.show()

    graph.node_double_clicked.connect(show_prop_bin)

    # show the nodes list when a node is "double clicked" in the graph.
Ejemplo n.º 8
0
            self.create_property('color_picker', (0, 0, 255),
                                 widget_type=NODE_PROP_COLORPICKER)
            self.create_property('integer', 10,
                                 widget_type=NODE_PROP_QSPINBOX)
            self.create_property('list', 'foo',
                                 items=['foo', 'bar'],
                                 widget_type=NODE_PROP_QCOMBO)
            self.create_property('range', 50,
                                 range=(45, 55),
                                 widget_type=NODE_PROP_SLIDER)

    def prop_changed(node_id, prop_name, prop_value):
        print('-'*100)
        print(node_id, prop_name, prop_value)


    app = QtWidgets.QApplication(sys.argv)

    graph = NodeGraph()
    graph.register_node(TestNode)

    prop_bin = PropertiesBinWidget()
    prop_bin.property_changed.connect(prop_changed)

    node = graph.create_node('nodeGraphQt.nodes.TestNode')

    prop_bin.add_node(node)
    prop_bin.show()

    app.exec_()
Ejemplo n.º 9
0
    NODE_NAME = 'My Node'

    def __init__(self):
        super(MyNode, self).__init__()
        self.set_color(81, 54, 88)
        self.add_checkbox('cb_hello', '', 'Hello', True)
        self.add_checkbox('cb_world', '', 'World', False)
        self.add_input('in')
        self.add_output('out')


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    # create node graph.
    graph = NodeGraph()

    viewer = graph.viewer()
    viewer.setWindowTitle('My Node Graph')
    viewer.resize(1100, 800)
    viewer.show()

    # registered nodes.
    reg_nodes = [
        Backdrop, MyNode, menu_node.DropdownMenuNode, simple_nodes.FooNode,
        simple_nodes.BarNode, text_input_node.TextInputNode
    ]
    [graph.register_node(n) for n in reg_nodes]

    my_node = graph.create_node('com.chantasticvfx.MyNode',
                                name='test',
Ejemplo n.º 10
0
        super(MyNode, self).__init__()
        self.set_color(25, 58, 51)

        # create input and output port.
        self.add_input('in port', color=(200, 10, 0))
        self.add_output('default port')
        self.add_output('square port', painter_func=draw_square_port)
        self.add_output('triangle port', painter_func=draw_triangle_port)


if __name__ == '__main__':
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    app = QtWidgets.QApplication([])

    # create node graph.
    graph = NodeGraph()

    # set up default menu and commands.
    setup_context_menu(graph)

    # widget used for the node graph.
    graph_widget = graph.widget
    graph_widget.resize(1100, 800)
    graph_widget.show()

    # show the properties bin when a node is "double clicked" in the graph.
    properties_bin = PropertiesBinWidget(node_graph=graph)
    properties_bin.setWindowFlags(QtCore.Qt.Tool)

    def show_prop_bin(node):
        if not properties_bin.isVisible():
Ejemplo n.º 11
0
import os

from NodeGraphQt import (NodeGraph, BaseNode, BackdropNode, setup_context_menu)
from NodeGraphQt import QtWidgets, QtCore, PropertiesBinWidget, NodeTreeWidget

from frames import InfoNode, SpeakNode, CameraNode, MoveNode

if __name__ == '__main__':
    app = QtWidgets.QApplication([])

    # Base node graph widget
    graph = NodeGraph()

    # set up default menu and commands.
    setup_context_menu(graph)

    # widget used for the node graph.
    graph_widget = graph.widget
    graph_widget.resize(1100, 800)
    graph_widget.show()

    # show the properties bin when a node is "double clicked" in the graph.
    properties_bin = PropertiesBinWidget(node_graph=graph)
    properties_bin.setWindowFlags(QtCore.Qt.Tool)

    def show_prop_bin(node):
        if not properties_bin.isVisible():
            properties_bin.show()

    graph.node_double_clicked.connect(show_prop_bin)
Ejemplo n.º 12
0
        super(MyNode, self).__init__()
        self.set_color(25, 58, 51)

        # create input and output port.
        self.add_input('in port', color=(200, 10, 0))
        self.add_output('default port')
        self.add_output('square port', painter_func=draw_square_port)
        self.add_output('triangle port', painter_func=draw_triangle_port)


if __name__ == '__main__':
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    app = QtWidgets.QApplication([])

    # create node graph.
    graph = NodeGraph()

    # set up default menu and commands.
    setup_context_menu(graph)

    # widget used for the node graph.
    graph_widget = graph.widget
    graph_widget.resize(1100, 800)
    graph_widget.show()

    # show the properties bin when a node is "double clicked" in the graph.
    properties_bin = PropertiesBinWidget(node_graph=graph)
    properties_bin.setWindowFlags(QtCore.Qt.Tool)

    def show_prop_bin(node):
        if not properties_bin.isVisible():
Ejemplo n.º 13
0
        self.add_output("Out")

    def set_content(self, content):
        #print(type(self.view))
        for item in content:
            self.add_checkbox(item, '', item, True)

        self.update()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    # create node graph.
    graph = NodeGraph()

    # set up default menu and commands.
    setup_context_menu(graph)

    # viewer widget used for the node graph.
    viewer = graph.viewer()
    viewer.resize(1100, 800)
    viewer.show()
    """
    # show the properties bin when a node is "double clicked" in the graph.
    properties_bin = PropertiesBinWidget(node_graph=graph)
    properties_bin.setWindowFlags(QtCore.Qt.Tool)
    def show_prop_bin(node):
        if not properties_bin.isVisible():
            properties_bin.show()
Ejemplo n.º 14
0
from NodeGraphQt import NodeGraph, BaseNode


class FlowpipeNode(BaseNode):

    __identifier__ = 'flowpipe'

    NODE_NAME = 'FlowpipeNode'

    def __init__(self):
        super(FlowpipeNode, self).__init__()


QTGRAPH = NodeGraph()

try:
    QTGRAPH.register_node(FlowpipeNode)
except:
    pass
Ejemplo n.º 15
0
#!/usr/bin/python
# -*- coding: utf-8 -*-
from example_nodes import Nodes
from NodeGraphQt import (NodeGraph, update_nodes_by_down, setup_context_menu)
from NodeGraphQt import QtWidgets, QtCore, PropertiesBinWidget, NodeTreeWidget

if __name__ == '__main__':
    app = QtWidgets.QApplication([])

    # create node graph.
    graph = NodeGraph()

    # set up default menu and commands.
    setup_context_menu(graph)

    # widget used for the node graph.
    graph_widget = graph.widget
    graph_widget.resize(1100, 800)
    graph_widget.show()

    # show the properties bin when a node is "double clicked" in the graph.
    properties_bin = PropertiesBinWidget(node_graph=graph)
    properties_bin.setWindowFlags(QtCore.Qt.Tool)

    def show_prop_bin(node):
        if not properties_bin.isVisible():
            properties_bin.show()

    graph.node_double_clicked.connect(show_prop_bin)

    # show the nodes list when a node is "double clicked" in the graph.
Ejemplo n.º 16
0
    def setup_exp(self):
        """Prepares the patch expander once a patch has been selected.
        Currently triggered via a button press.
        """

        class MyNode(BaseNode):
            """
            example test node.
            """

            # set a unique node identifier.
            __identifier__ = 'com.chantasticvfx'

            # set the initial default node name.
            NODE_NAME = 'my node'

            def __init__(self):
                super(MyNode, self).__init__()
                self.set_color(25, 58, 51)

        # QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
        # win = QtWidgets.QApplication([])

        win = QWidget()
        win.setWindowTitle(
            "Interactive Patch Routing: {}".format(self.curr_viz["name"])
        )
        win.setWindowIcon(QIcon(
            os.path.join(os.getcwd(), "zoia_lib", "UI", "resources",
                         "logo.ico")))
        win.setFixedSize(540, 540)

        # create node graph.
        graph = NodeGraph()

        # set up default menu and commands.
        setup_context_menu(graph)

        # widget used for the node graph.
        graph_widget = graph.widget
        graph_widget.resize(1100, 800)
        graph_widget.show()

        # show the properties bin when a node is "double clicked" in the graph.
        properties_bin = PropertiesBinWidget(node_graph=graph)
        properties_bin.setWindowFlags(QtCore.Qt.Tool)

        def show_prop_bin(node):
            if not properties_bin.isVisible():
                properties_bin.show()

        graph.node_double_clicked.connect(show_prop_bin)

        # show the nodes list when a node is "double clicked" in the graph.
        node_tree = NodeTreeWidget(node_graph=graph)

        def show_nodes_list(node):
            if not node_tree.isVisible():
                node_tree.update()
                node_tree.show()

        graph.node_double_clicked.connect(show_nodes_list)

        # registered nodes.
        nodes_to_reg = [
            # BackdropNode,
            MyNode,
            # basic_nodes.FooNode,
            # basic_nodes.BarNode,
            # widget_nodes.DropdownMenuNode,
            # widget_nodes.TextInputNode,
            # widget_nodes.CheckboxNode
        ]
        graph.register_nodes(nodes_to_reg)

        pch = self.curr_viz

        nodes = {}
        for module in pch['modules']:
            my_node = graph.create_node(
                'com.chantasticvfx.MyNode',
                name=(module['type'] if module['name'] == '' else module['name']) + str(module["number"]),
                color='#0a1e20',
                text_color='#feab20'
            )
            inp, outp, in_pos, out_pos = [], [], [], []
            for key, param in module['blocks'].items():
                if 'in' in key:
                    my_node.add_input(key)
                    inp.append(key)
                    in_pos.append(int(param["position"]))
                elif param["isParam"]:
                    my_node.add_input(key)
                    inp.append(key)
                    in_pos.append(int(param["position"]))
                elif 'out' in key:
                    my_node.add_output(key)
                    outp.append(key)
                    out_pos.append(int(param["position"]))
            nodes[module["number"]] = my_node, inp, outp, in_pos, out_pos

        # print(nodes)

        # map pos from nodes to connections
        def node_pos_map(node):
            inpts = node[1]
            outps = node[2]
            in_pos = node[3]
            out_pos = node[4]
            node_pos_start = [x for x in range(0, len(inpts))]
            node_pos_end = [x for x in range(0, len(outps))]
            data_input = dict(zip(in_pos, node_pos_start))
            data_output = dict(zip(out_pos, node_pos_end))

            return {**data_input, **data_output}

        data = []
        for key, node in nodes.items():
            data.append(node_pos_map(node))

        for conn in pch['connections']:
            mod, block = conn['source'].split('.')
            nmod, nblock = conn['destination'].split('.')
            src = data[int(mod)]
            dest = data[int(nmod)]
            try:
                nodes[int(mod)][0].set_output(
                    src[int(block)],
                    nodes[int(nmod)][0].input(dest[int(nblock)])
                )
            except KeyError as e:
                print(conn, e)
            except IndexError as e:
                print(conn, e)
        print('done making connections')

        # auto layout nodes.
        graph.auto_layout_nodes()

        # wrap a backdrop node.
        # backdrop_node = graph.create_node('nodeGraphQt.nodes.BackdropNode')
        # backdrop_node.wrap_nodes([text_node, checkbox_node])

        graph.fit_to_selection()

        win.exec_()
Ejemplo n.º 17
0

def publish_node(graph, node):
    wid = NodePublishWidget(node=node)
    wid.show()


def cook_nodes(nodes):
    update_nodes(nodes)


if __name__ == '__main__':
    app = QtWidgets.QApplication([])

    # create node graph.
    graph = NodeGraph()
    graph.use_opengl()

    # set up default menu and commands.
    setup_context_menu(graph)

    # show the properties bin when a node is "double clicked" in the graph.
    properties_bin = PropertiesBinWidget(node_graph=graph)
    properties_bin.setWindowFlags(QtCore.Qt.Tool)

    def show_prop_bin(node):
        if not properties_bin.isVisible():
            properties_bin.show()

    graph.node_double_clicked.connect(show_prop_bin)
Ejemplo n.º 18
0
    NODE_NAME = 'my node'

    def __init__(self):
        super(MyNode, self).__init__()
        self.set_color(25, 58, 51)

        # create input and output port.
        self.add_input('in port')
        self.add_output('out port')


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    # create node graph.
    graph = NodeGraph()

    # set up default menu and commands.
    setup_context_menu(graph)

    # viewer widget used for the node graph.
    viewer = graph.viewer()
    viewer.resize(1100, 800)
    viewer.show()

    # show the properties bin when a node is "double clicked" in the graph.
    properties_bin = PropertiesBinWidget(node_graph=graph)
    properties_bin.setWindowFlags(QtCore.Qt.Tool)

    def show_prop_bin(node):
        if not properties_bin.isVisible():
Ejemplo n.º 19
0
from examples.custom_nodes import (
    basic_nodes,
    custom_ports_node,
    widget_nodes,
)

if __name__ == '__main__':
    # handle SIGINT to make the app terminate on CTRL+C
    signal.signal(signal.SIGINT, signal.SIG_DFL)

    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)

    app = QtWidgets.QApplication([])

    # create graph controller.
    graph = NodeGraph()

    # registered example nodes.
    graph.register_nodes([
        basic_nodes.BasicNodeA, basic_nodes.BasicNodeB,
        custom_ports_node.CustomPortsNode, group_node.MyGroupNode,
        widget_nodes.DropdownMenuNode, widget_nodes.TextInputNode,
        widget_nodes.CheckboxNode
    ])

    # show the node graph widget.
    graph_widget = graph.widget
    graph_widget.resize(1100, 800)
    graph_widget.show()

    # create node with custom text color and disable it.