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
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_()
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
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)
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)
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))
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