Exemplo n.º 1
0
def getRawNodeInstance(nodeClassName,
                       packageName=None,
                       libName=None,
                       **kwargs):
    from PyFlow.Core.NodeBase import NodeBase
    package = GET_PACKAGE_CHECKED(packageName)
    # try find function first
    if libName is not None:
        for key, lib in package.GetFunctionLibraries().items():
            foos = lib.getFunctions()
            if libName == key and nodeClassName in foos:
                return NodeBase.initializeFromFunction(foos[nodeClassName])

    # try find node class
    nodes = package.GetNodeClasses()
    if nodeClassName in nodes:
        return nodes[nodeClassName](nodeClassName, **kwargs)

    # try find exported py nodes
    packagePath = GET_PACKAGE_PATH(packageName)
    pyNodesPath = os.path.join(packagePath, "PyNodes")
    if os.path.exists(pyNodesPath):
        for path, dirs, files in os.walk(pyNodesPath):
            for pyNodeFileName in files:
                pyNodeName, _ = os.path.splitext(pyNodeFileName)
                if nodeClassName == pyNodeName:
                    pythonNode = getRawNodeInstance("pythonNode", packageName)
                    pyNodeFullPath = os.path.join(path, pyNodeFileName)
                    with open(pyNodeFullPath, "r") as f:
                        pythonNode._nodeData = f.read()
                    return pythonNode
Exemplo n.º 2
0
    def mousePressEvent(self, event):
        super(NodeBoxTreeWidget, self).mousePressEvent(event)
        item_clicked = self.currentItem()
        if not item_clicked:
            event.ignore()
            return
        # check if clicked item is a category
        if item_clicked.bCategory:
            event.ignore()
            return
        # find top level parent
        rootItem = item_clicked
        while not rootItem.parent() is None:
            rootItem = rootItem.parent()
        packageName = rootItem.text(0)
        pressed_text = item_clicked.text(0)
        libName = item_clicked.libName

        if pressed_text in self.categoryPaths.keys():
            event.ignore()
            return

        jsonTemplate = NodeBase.jsonTemplate()
        jsonTemplate['package'] = packageName
        jsonTemplate['lib'] = libName
        jsonTemplate['type'] = pressed_text
        jsonTemplate['name'] = pressed_text
        jsonTemplate['uuid'] = str(uuid.uuid4())
        jsonTemplate['meta']['label'] = pressed_text

        # TODO: Rewrite self.bGripsEnabled. Node box can be floating window or a tool.
        # If node box is a tool it onbly can create nodes by dragging and dropping
        if self.canvas.pressedPin is not None and self.bGripsEnabled:
            a = self.canvas.mapToScene(self.canvas.mouseReleasePos)
            jsonTemplate["x"] = a.x()
            jsonTemplate["y"] = a.y()
            node = self.canvas.createNode(jsonTemplate)
            self.canvas.hideNodeBox()
            pressedPin = self.canvas.pressedPin
            if pressedPin.direction == PinDirection.Input:
                for pin in node.UIoutputs.values():
                    wire = self.canvas.connectPinsInternal(pressedPin, pin)
                    if wire is not None:
                        EditorHistory().saveState("Connect pins", modify=True)
                        break
            if pressedPin.direction == PinDirection.Output:
                for pin in node.UIinputs.values():
                    wire = self.canvas.connectPinsInternal(pin, pressedPin)
                    if wire is not None:
                        EditorHistory().saveState("Connect pins", modify=True)
                        break
        else:
            drag = QtGui.QDrag(self)
            mime_data = QtCore.QMimeData()

            pressed_text = json.dumps(jsonTemplate)
            mime_data.setText(pressed_text)
            drag.setMimeData(mime_data)
            drag.exec_()
Exemplo n.º 3
0
def getRawNodeInstance(nodeClassName,
                       packageName=None,
                       libName=None,
                       **kwargs):
    # raw instance no uid
    from PyFlow.Core.NodeBase import NodeBase
    package = GET_PACKAGE_CHECKED(packageName)
    # try find function first
    if libName is not None:
        for key, lib in package.GetFunctionLibraries().items():
            foos = lib.getFunctions()
            if libName == key and nodeClassName in foos:
                return NodeBase.initializeFromFunction(foos[nodeClassName])

    # try find node class
    nodes = package.GetNodeClasses()
    if nodeClassName in nodes:
        return nodes[nodeClassName](nodeClassName, **kwargs)

    # try find exported py nodes
    packagePath = GET_PACKAGE_PATH(packageName)
    pyNodesPath = os.path.join(packagePath, "PyNodes")
    if os.path.exists(pyNodesPath):
        for path, dirs, files in os.walk(pyNodesPath):
            for pyNodeFileName in files:
                pyNodeName, _ = os.path.splitext(pyNodeFileName)
                if nodeClassName == pyNodeName:
                    pythonNode = getRawNodeInstance("pythonNode", "PyFlowBase")
                    pyNodeFullPath = os.path.join(path, pyNodeFileName)
                    with open(pyNodeFullPath, "r") as f:
                        pythonNode._nodeData = f.read()
                    return pythonNode

    # try find exported compound nodes
    compoundNodesPath = os.path.join(packagePath, "Compounds")
    if os.path.exists(compoundNodesPath):
        for path, dirs, files in os.walk(compoundNodesPath):
            for compoundNodeFileName in files:
                compoundNodeName, _ = os.path.splitext(compoundNodeFileName)
                compoundNodeFullPath = os.path.join(path, compoundNodeFileName)
                with open(compoundNodeFullPath, 'r') as f:
                    compoundData = json.load(f)
                    if compoundData["name"] == nodeClassName:
                        compoundNode = getRawNodeInstance(
                            "compound", "PyFlowBase")
                        compoundNodeFullPath = os.path.join(
                            path, compoundNodeFileName)
                        with open(compoundNodeFullPath, "r") as f:
                            jsonString = f.read()
                            compoundNode._rawGraphJson = json.loads(jsonString)
                        return compoundNode
Exemplo n.º 4
0
def getRawNodeInstance(nodeClassName, packageName=None, libName=None, **kwargs):
    from PyFlow.Core.NodeBase import NodeBase
    package = GET_PACKAGE_CHECKED(packageName)
    # try find function first
    if libName is not None:
        for key, lib in package.GetFunctionLibraries().items():
            foos = lib.getFunctions()
            if libName == key and nodeClassName in foos:
                return NodeBase.initializeFromFunction(foos[nodeClassName])

    # try find node class
    nodes = package.GetNodeClasses()
    if nodeClassName in nodes:
        return nodes[nodeClassName](nodeClassName, **kwargs)
Exemplo n.º 5
0
    def mousePressEvent(self, event):
        super(NodeBoxTreeWidget, self).mousePressEvent(event)
        canvas = self.parent().canvasRef()
        item_clicked = self.currentItem()
        if not item_clicked:
            event.ignore()
            return
        # check if clicked item is a category
        if item_clicked.bCategory:
            event.ignore()
            return
        # find top level parent
        rootItem = item_clicked
        while not rootItem.parent() is None:
            rootItem = rootItem.parent()
        packageName = rootItem.text(0)
        pressed_text = item_clicked.text(0)
        libName = item_clicked.libName

        if pressed_text in self.categoryPaths.keys():
            event.ignore()
            return

        try:
            mousePos = canvas.mapToScene(canvas.mousePressPose)
        except:
            mousePos = canvas.mapToScene(canvas.mousePressPose.toPoint())

        jsonTemplate = NodeBase.jsonTemplate()
        jsonTemplate['package'] = packageName
        jsonTemplate['lib'] = libName
        jsonTemplate['type'] = pressed_text
        jsonTemplate['name'] = pressed_text
        jsonTemplate['uuid'] = str(uuid.uuid4())
        jsonTemplate['x'] = mousePos.x()
        jsonTemplate['y'] = mousePos.y()
        jsonTemplate['meta']['label'] = pressed_text

        if self.bUseDragAndDrop:
            drag = QtGui.QDrag(self)
            mime_data = QtCore.QMimeData()

            pressed_text = json.dumps(jsonTemplate)
            mime_data.setText(pressed_text)
            drag.setMimeData(mime_data)
            drag.exec_()
        else:
            canvas.createNode(jsonTemplate)
Exemplo n.º 6
0
 def eventDropOnCanvas(self):
     # TODO: try to simplify this with Canvas.spawnNode
     nodeTemplate = NodeBase.jsonTemplate()
     nodeTemplate['package'] = "Base"
     nodeTemplate['lib'] = ""
     nodeTemplate['type'] = "loopEnd"
     nodeTemplate['name'] = self.canvasRef().graphManager.getUniqNodeName(
         "loopEnd")
     nodeTemplate['x'] = self.scenePos().x() + self.geometry().width() + 30
     nodeTemplate['y'] = self.scenePos().y()
     nodeTemplate['uuid'] = str(uuid.uuid4())
     endNode = self.canvasRef()._createNode(nodeTemplate)
     self.getPinSG("Paired block").setData(str(endNode.path()))
     endNode.getPinSG("Paired block").setData(self.path())
     self.canvasRef().connectPins(self.getPinSG("LoopBody"),
                                  endNode.getPinSG(DEFAULT_IN_EXEC_NAME))
Exemplo n.º 7
0
    def keyPressEvent(self, event):
        super(NodeBoxTreeWidget, self).keyPressEvent(event)
        key = event.key()
        canvas = self.parent().canvasRef()
        if key == QtCore.Qt.Key_Return:
            item_clicked = self.currentItem()
            if not item_clicked:
                event.ignore()
                return
            # check if clicked item is a category
            if item_clicked.bCategory:
                event.ignore()
                return
            # find top level parent
            rootItem = item_clicked
            while not rootItem.parent() is None:
                rootItem = rootItem.parent()
            packageName = rootItem.text(0)
            pressed_text = item_clicked.text(0)
            libName = item_clicked.libName
            if pressed_text in self.categoryPaths.keys():
                event.ignore()
                return

            nodeClassName = self.currentItem().text(0)
            name = nodeClassName
            try:
                # TODO: replace position gathering method to canvas center
                pos = canvas.mapToScene(canvas.mouseReleasePos)
                nodeTemplate = NodeBase.jsonTemplate()
                nodeTemplate['package'] = packageName
                nodeTemplate['lib'] = libName
                nodeTemplate['type'] = pressed_text
                nodeTemplate['name'] = name
                nodeTemplate['x'] = pos.x()
                nodeTemplate['y'] = pos.y()
                nodeTemplate['meta']['label'] = nodeClassName
                nodeTemplate['uuid'] = str(uuid.uuid4())

                canvas.createNode(nodeTemplate)
            except:
                pass