def _deserialize(self, data, relative_pos=False, pos=None): """ deserialize node data. (used internally by the node graph) Args: data (dict): node data. relative_pos (bool): position node relative to the cursor. Returns: list[NodeGraphQt.Nodes]: list of node instances. """ nodes = {} # build the nodes. for n_id, n_data in data.get('nodes', {}).items(): identifier = n_data['type_'] NodeCls = self._node_factory.create_node_instance(identifier) if NodeCls: node = NodeCls() node.NODE_NAME = n_data.get('name', node.NODE_NAME) # set properties. for prop in node.model.properties.keys(): if prop in n_data.keys(): node.model.set_property(prop, n_data[prop]) # set custom properties. for prop, val in n_data.get('custom', {}).items(): node.model.set_property(prop, val) nodes[n_id] = node self.add_node(node, n_data.get('pos')) node.set_graph(self) # build the connections. for connection in data.get('connections', []): nid, pname = connection.get('in', ('', '')) in_node = nodes.get(nid) if not in_node: continue in_port = in_node.inputs().get(pname) if in_node else None nid, pname = connection.get('out', ('', '')) out_node = nodes.get(nid) if not out_node: continue out_port = out_node.outputs().get(pname) if out_node else None if in_port and out_port: self._undo_stack.push(PortConnectedCmd(in_port, out_port)) node_objs = list(nodes.values()) if relative_pos: self._viewer.move_nodes([n.view for n in node_objs]) [setattr(n.model, 'pos', n.view.xy_pos) for n in node_objs] elif pos: self._viewer.move_nodes([n.view for n in node_objs], pos=pos) [setattr(n.model, 'pos', n.view.xy_pos) for n in node_objs] return node_objs
def connect_to(self, port=None): """ Create connection to the specified port and emits the "port_connected" signal from the parent node graph. Args: port (NodeGraphQt.Port): port object. """ if not port: return graph = self.node().graph viewer = graph.viewer() undo_stack = graph.undo_stack() undo_stack.beginMacro('connect port') pre_conn_port = None src_conn_ports = self.connected_ports() if not self.multi_connection() and src_conn_ports: pre_conn_port = src_conn_ports[0] if not port: if pre_conn_port: undo_stack.push(NodeInputDisconnectedCmd(self, port)) undo_stack.push(PortDisconnectedCmd(self, port)) return if graph.acyclic() and viewer.acyclic_check(self.view, port.view): if pre_conn_port: undo_stack.push(NodeInputDisconnectedCmd(self, pre_conn_port)) undo_stack.push(PortDisconnectedCmd(self, pre_conn_port)) return trg_conn_ports = port.connected_ports() if not port.multi_connection() and trg_conn_ports: dettached_port = trg_conn_ports[0] undo_stack.push(NodeInputDisconnectedCmd(port, dettached_port)) undo_stack.push(PortDisconnectedCmd(port, dettached_port)) if pre_conn_port: undo_stack.push(NodeInputDisconnectedCmd(self, pre_conn_port)) undo_stack.push(PortDisconnectedCmd(self, pre_conn_port)) undo_stack.push(NodeInputConnectedCmd(self, port)) undo_stack.push(PortConnectedCmd(self, port)) undo_stack.endMacro() # emit "port_connected" signal from the parent graph. ports = {p.type_(): p for p in [self, port]} graph.port_connected.emit(ports[IN_PORT], ports[OUT_PORT])
def connect_to(self, port=None): """ Create connection to the specified port. Args: port (NodeGraphQt.Port): port object. """ if not port: return graph = self.node().graph viewer = graph.viewer() undo_stack = graph.undo_stack() undo_stack.beginMacro('connected port') pre_conn_port = None src_conn_ports = self.connected_ports() if not self.multi_connection() and src_conn_ports: pre_conn_port = src_conn_ports[0] if not port: if pre_conn_port: undo_stack.push(PortDisconnectedCmd(self, port)) return if graph.acyclic() and viewer.acyclic_check(self.view, port.view): if pre_conn_port: undo_stack.push(PortDisconnectedCmd(self, pre_conn_port)) return trg_conn_ports = port.connected_ports() if not port.multi_connection() and trg_conn_ports: dettached_port = trg_conn_ports[0] undo_stack.push(PortDisconnectedCmd(port, dettached_port)) if pre_conn_port: undo_stack.push(PortDisconnectedCmd(self, pre_conn_port)) undo_stack.push(PortConnectedCmd(self, port)) undo_stack.endMacro()
def _deserialize(self, data, relative_pos=False, pos=None): """ deserialize node data. Args: data (dict): node data. relative_pos (bool): position node relative to the cursor. Returns: list[NodeGraphQt.Nodes]: list of node instances. """ nodes = {} # build the nodes. for n_id, n_data in data.get('nodes', {}).items(): identifier = n_data['type'] NodeInstance = NodeVendor.create_node_instance(identifier) if NodeInstance: node = NodeInstance() node._graph = self name = self.get_unique_name(n_data.get('name', node.NODE_NAME)) n_data['name'] = name # set properties. for prop, val in node.model.properties.items(): if prop in n_data.keys(): setattr(node.model, prop, n_data[prop]) # set custom properties. for prop, val in n_data.get('custom', {}).items(): if prop in node.model.custom_properties.keys(): node.model.custom_properties[prop] = val node.update() self._undo_stack.push( NodeAddedCmd(self, node, n_data.get('pos'))) nodes[n_id] = node # build the connections. for connection in data.get('connections', []): nid, pname = connection.get('in', ('', '')) in_node = nodes.get(nid) if not in_node: continue in_port = in_node.inputs().get(pname) if in_node else None nid, pname = connection.get('out', ('', '')) out_node = nodes.get(nid) if not out_node: continue out_port = out_node.outputs().get(pname) if out_node else None if in_port and out_port: self._undo_stack.push(PortConnectedCmd(in_port, out_port)) node_objs = list(nodes.values()) if relative_pos: self._viewer.move_nodes([n.view for n in node_objs]) [setattr(n.model, 'pos', n.view.pos) for n in node_objs] elif pos: self._viewer.move_nodes([n.view for n in node_objs], pos=pos) return node_objs
def connect_to(self, port=None, push_undo=True): """ Create connection to the specified port and emits the :attr:`NodeGraph.port_connected` signal from the parent node graph. Args: port (NodeGraphQt.Port): port object. push_undo (bool): register the command to the undo stack. (default: True) """ if not port: return if self in port.connected_ports(): return if self.locked() or port.locked(): name = [p.name() for p in [self, port] if p.locked()][0] raise PortError( 'Can\'t connect port because "{}" is locked.'.format(name)) graph = self.node().graph viewer = graph.viewer() if push_undo: undo_stack = graph.undo_stack() undo_stack.beginMacro('connect port') pre_conn_port = None src_conn_ports = self.connected_ports() if not self.multi_connection() and src_conn_ports: pre_conn_port = src_conn_ports[0] if not port: if pre_conn_port: if push_undo: undo_stack.push(PortDisconnectedCmd(self, port)) undo_stack.push(NodeInputDisconnectedCmd(self, port)) undo_stack.endMacro() else: PortDisconnectedCmd(self, port).redo() NodeInputDisconnectedCmd(self, port).redo() return if graph.acyclic() and viewer.acyclic_check(self.view, port.view): if pre_conn_port: if push_undo: undo_stack.push(PortDisconnectedCmd(self, pre_conn_port)) undo_stack.push( NodeInputDisconnectedCmd(self, pre_conn_port)) undo_stack.endMacro() else: PortDisconnectedCmd(self, pre_conn_port).redo() NodeInputDisconnectedCmd(self, pre_conn_port).redo() return trg_conn_ports = port.connected_ports() if not port.multi_connection() and trg_conn_ports: dettached_port = trg_conn_ports[0] if push_undo: undo_stack.push(PortDisconnectedCmd(port, dettached_port)) undo_stack.push(NodeInputDisconnectedCmd(port, dettached_port)) else: PortDisconnectedCmd(port, dettached_port).redo() NodeInputDisconnectedCmd(port, dettached_port).redo() if pre_conn_port: if push_undo: undo_stack.push(PortDisconnectedCmd(self, pre_conn_port)) undo_stack.push(NodeInputDisconnectedCmd(self, pre_conn_port)) else: PortDisconnectedCmd(self, pre_conn_port).redo() NodeInputDisconnectedCmd(self, pre_conn_port).redo() if push_undo: undo_stack.push(PortConnectedCmd(self, port)) undo_stack.push(NodeInputConnectedCmd(self, port)) undo_stack.endMacro() else: PortConnectedCmd(self, port).redo() NodeInputConnectedCmd(self, port).redo() # emit "port_connected" signal from the parent graph. ports = {p.type_(): p for p in [self, port]} graph.port_connected.emit(ports[PortTypeEnum.IN.value], ports[PortTypeEnum.OUT.value])