Module sverchok.utils.nodes_mixins.loop_nodes
Expand source code
# This file is part of project Sverchok. It's copyrighted by the contributors
# recorded in the version control history of the file, available from
# its original location https://github.com/nortikin/sverchok/commit/master
#
# SPDX-License-Identifier: GPL3
# License-Filename: LICENSE
from typing import Optional
from bpy_types import NodeSocket
from sverchok.core.update_system import SearchTree
class LoopNode:
def repeat_last_socket(self,
search_tree: SearchTree,
min_input: int = 1):
"""It adds extra input socket if last socket is already connected.
It removes last socket if it and socket above are not connected.
:param min_input: number of to sockets which should be never removed
"""
from_socket = search_tree.socket_from_input(self.inputs[-1])
if from_socket is not None:
from_node = search_tree.node_from_input(self.inputs[-1])
new_label = from_node.label or from_node.name
self.inputs[-1].label = new_label
self.inputs.new('SvStringsSocket', 'Data')
self.outputs.new('SvStringsSocket', 'Data').label = new_label
else:
while len(self.inputs) > min_input and not self.inputs[-2].is_linked:
self.inputs.remove(self.inputs[-1])
self.outputs.remove(self.outputs[-1])
self.inputs[-1].label = ''
def fix_output_types(self,
search_tree: SearchTree,
in_start: int = 0,
out_start: int = 0):
"""It checks type of socket connected to input one and if it does not
fit to type of relevant output socket it changes its type.
Also, it copies labels from input to output.
:param in_start: position of input socket where to start the check
:param out_start: position of output socket where to start the check
"""
others = [search_tree.socket_from_input(s) for s in self.inputs[in_start:]]
self.copy_sockets(others, self.outputs[out_start:], 'bl_idname')
self.copy_sockets(self.inputs[in_start:], self.outputs[out_start:], 'label')
@staticmethod
def copy_sockets(from_socks: list[Optional[NodeSocket]],
to_socks: list[NodeSocket],
attr_name: str):
"""It copies the attribute from sockets to sockets"""
if attr_name == 'bl_idname':
for from_, to in zip(from_socks, to_socks):
if from_ is None:
continue
if from_.bl_idname != to.bl_idname:
to.replace_socket(from_.bl_idname)
else:
for from_, to in zip(from_socks, to_socks):
if from_ is None:
continue
setattr(to, attr_name, getattr(from_, attr_name))
@staticmethod
def fix_socket_number(socket_collection, request: int):
"""It makes length of given collection of sockets equal to request number"""
current = len(socket_collection)
if request > current:
for _ in range(request - current):
socket_collection.new('SvStringsSocket', 'Data')
elif request < current:
for _ in range(current - request):
socket_collection.remove(socket_collection[-1])
Classes
class LoopNode
-
Expand source code
class LoopNode: def repeat_last_socket(self, search_tree: SearchTree, min_input: int = 1): """It adds extra input socket if last socket is already connected. It removes last socket if it and socket above are not connected. :param min_input: number of to sockets which should be never removed """ from_socket = search_tree.socket_from_input(self.inputs[-1]) if from_socket is not None: from_node = search_tree.node_from_input(self.inputs[-1]) new_label = from_node.label or from_node.name self.inputs[-1].label = new_label self.inputs.new('SvStringsSocket', 'Data') self.outputs.new('SvStringsSocket', 'Data').label = new_label else: while len(self.inputs) > min_input and not self.inputs[-2].is_linked: self.inputs.remove(self.inputs[-1]) self.outputs.remove(self.outputs[-1]) self.inputs[-1].label = '' def fix_output_types(self, search_tree: SearchTree, in_start: int = 0, out_start: int = 0): """It checks type of socket connected to input one and if it does not fit to type of relevant output socket it changes its type. Also, it copies labels from input to output. :param in_start: position of input socket where to start the check :param out_start: position of output socket where to start the check """ others = [search_tree.socket_from_input(s) for s in self.inputs[in_start:]] self.copy_sockets(others, self.outputs[out_start:], 'bl_idname') self.copy_sockets(self.inputs[in_start:], self.outputs[out_start:], 'label') @staticmethod def copy_sockets(from_socks: list[Optional[NodeSocket]], to_socks: list[NodeSocket], attr_name: str): """It copies the attribute from sockets to sockets""" if attr_name == 'bl_idname': for from_, to in zip(from_socks, to_socks): if from_ is None: continue if from_.bl_idname != to.bl_idname: to.replace_socket(from_.bl_idname) else: for from_, to in zip(from_socks, to_socks): if from_ is None: continue setattr(to, attr_name, getattr(from_, attr_name)) @staticmethod def fix_socket_number(socket_collection, request: int): """It makes length of given collection of sockets equal to request number""" current = len(socket_collection) if request > current: for _ in range(request - current): socket_collection.new('SvStringsSocket', 'Data') elif request < current: for _ in range(current - request): socket_collection.remove(socket_collection[-1])
Subclasses
- sverchok.nodes.logic.loop_in.SvLoopInNode
- sverchok.nodes.logic.loop_out.SvLoopOutNode
Static methods
def copy_sockets(from_socks: list, to_socks: list, attr_name: str)
-
It copies the attribute from sockets to sockets
Expand source code
@staticmethod def copy_sockets(from_socks: list[Optional[NodeSocket]], to_socks: list[NodeSocket], attr_name: str): """It copies the attribute from sockets to sockets""" if attr_name == 'bl_idname': for from_, to in zip(from_socks, to_socks): if from_ is None: continue if from_.bl_idname != to.bl_idname: to.replace_socket(from_.bl_idname) else: for from_, to in zip(from_socks, to_socks): if from_ is None: continue setattr(to, attr_name, getattr(from_, attr_name))
def fix_socket_number(socket_collection, request: int)
-
It makes length of given collection of sockets equal to request number
Expand source code
@staticmethod def fix_socket_number(socket_collection, request: int): """It makes length of given collection of sockets equal to request number""" current = len(socket_collection) if request > current: for _ in range(request - current): socket_collection.new('SvStringsSocket', 'Data') elif request < current: for _ in range(current - request): socket_collection.remove(socket_collection[-1])
Methods
def fix_output_types(self, search_tree: SearchTree, in_start: int = 0, out_start: int = 0)
-
It checks type of socket connected to input one and if it does not fit to type of relevant output socket it changes its type. Also, it copies labels from input to output.
:param in_start: position of input socket where to start the check :param out_start: position of output socket where to start the check
Expand source code
def fix_output_types(self, search_tree: SearchTree, in_start: int = 0, out_start: int = 0): """It checks type of socket connected to input one and if it does not fit to type of relevant output socket it changes its type. Also, it copies labels from input to output. :param in_start: position of input socket where to start the check :param out_start: position of output socket where to start the check """ others = [search_tree.socket_from_input(s) for s in self.inputs[in_start:]] self.copy_sockets(others, self.outputs[out_start:], 'bl_idname') self.copy_sockets(self.inputs[in_start:], self.outputs[out_start:], 'label')
def repeat_last_socket(self, search_tree: SearchTree, min_input: int = 1)
-
It adds extra input socket if last socket is already connected. It removes last socket if it and socket above are not connected.
:param min_input: number of to sockets which should be never removed
Expand source code
def repeat_last_socket(self, search_tree: SearchTree, min_input: int = 1): """It adds extra input socket if last socket is already connected. It removes last socket if it and socket above are not connected. :param min_input: number of to sockets which should be never removed """ from_socket = search_tree.socket_from_input(self.inputs[-1]) if from_socket is not None: from_node = search_tree.node_from_input(self.inputs[-1]) new_label = from_node.label or from_node.name self.inputs[-1].label = new_label self.inputs.new('SvStringsSocket', 'Data') self.outputs.new('SvStringsSocket', 'Data').label = new_label else: while len(self.inputs) > min_input and not self.inputs[-2].is_linked: self.inputs.remove(self.inputs[-1]) self.outputs.remove(self.outputs[-1]) self.inputs[-1].label = ''