Не подтверждена Коммит 77e4670e создал по автору Durman's avatar Durman Зафиксировано автором GitHub
Просмотр файлов

Merge pull request #4341 from nortikin/fix_index_to_mask_node

Index to mask node refactoring
владельцы 4f3a5a0b 3e4426f8
...@@ -15,62 +15,17 @@ ...@@ -15,62 +15,17 @@
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# #
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
from itertools import cycle
import numpy as np import numpy as np
import bpy import bpy
from bpy.props import IntProperty, BoolProperty from bpy.props import IntProperty, BoolProperty
from sverchok.data_structure import updateNode
from sverchok.node_tree import SverchCustomTreeNode from sverchok.node_tree import SverchCustomTreeNode
from sverchok.utils.handling_nodes import NodeProperties, SockTypes, SocketProperties, initialize_node, WrapNode
node = WrapNode()
node.props.data_to_mask = NodeProperties(
bpy_props=BoolProperty(
name="Data masking",
description="Use data to define mask length",
default=False))
node.props.is_topo_mask = NodeProperties(
bpy_props=BoolProperty(
name="Topo mask",
description="data consists of verts or polygons / edges. "
"Otherwise the two vertices will be masked as [[[T, T, T], [F, F, F]]] instead of [[T, F]]",
default=False))
node.props.output_numpy = NodeProperties(
bpy_props=BoolProperty(
name="Output NumPy",
description="Output Numpy arrays in stead of regular python lists",
default=False))
node.props.index = NodeProperties(bpy_props=IntProperty(name="Index"))
node.props.mask_size = NodeProperties(bpy_props=IntProperty(name='Mask Length', default=10, min=2))
node.inputs.index = SocketProperties(
name="Index",
socket_type=SockTypes.STRINGS,
prop=node.props.index,
deep_copy=False)
node.inputs.mask_size = SocketProperties(
name="Mask size",
socket_type=SockTypes.STRINGS,
prop=node.props.mask_size,
deep_copy=False,
show_function=lambda: not node.props.data_to_mask)
node.inputs.data_to_mask = SocketProperties(
name="Data masking",
socket_type=SockTypes.STRINGS,
deep_copy=False,
mandatory=True,
show_function=lambda: node.props.data_to_mask)
node.outputs.mask = SocketProperties(name="Mask", socket_type=SockTypes.STRINGS)
@initialize_node(node)
class SvIndexToMaskNode(bpy.types.Node, SverchCustomTreeNode): class SvIndexToMaskNode(bpy.types.Node, SverchCustomTreeNode):
''' Create mask list from index ''' ''' Create mask list from index '''
bl_idname = 'SvIndexToMaskNode' bl_idname = 'SvIndexToMaskNode'
...@@ -78,6 +33,33 @@ class SvIndexToMaskNode(bpy.types.Node, SverchCustomTreeNode): ...@@ -78,6 +33,33 @@ class SvIndexToMaskNode(bpy.types.Node, SverchCustomTreeNode):
bl_icon = 'OUTLINER_OB_EMPTY' bl_icon = 'OUTLINER_OB_EMPTY'
sv_icon = 'SV_INDEX_TO_MASK' sv_icon = 'SV_INDEX_TO_MASK'
def data_to_mask_update(self, context):
self.inputs['Mask size'].hide_safe = self.data_to_mask
self.inputs['Data masking'].hide_safe = not self.data_to_mask
updateNode(self, context)
data_to_mask: BoolProperty(name="Data masking", description="Use data to define mask length", default=False,
update=data_to_mask_update)
is_topo_mask: BoolProperty(
name="Topo mask", default=False, update=updateNode,
description="data consists of verts or polygons / edges. "
"Otherwise the two vertices will be masked as [[[T, T, T], [F, F, F]]] instead of [[T, F]]")
output_numpy: BoolProperty(
name="Output NumPy", default=False, update=updateNode,
description="Output Numpy arrays in stead of regular python lists")
# socket properties
index: IntProperty(name="Index", update=updateNode)
mask_size: IntProperty(name='Mask Length', default=10, min=2, update=updateNode)
def sv_init(self, context):
self.inputs.new("SvStringsSocket", "Index").prop_name = "index"
self.inputs.new("SvStringsSocket", "Mask size").prop_name = "mask_size"
self.inputs.new("SvStringsSocket", "Data masking").hide_safe = True
self.outputs.new("SvStringsSocket", "Mask")
def draw_buttons(self, context, layout): def draw_buttons(self, context, layout):
col = layout.column(align=True) col = layout.column(align=True)
col.prop(self, "data_to_mask", toggle=True) col.prop(self, "data_to_mask", toggle=True)
...@@ -92,17 +74,38 @@ class SvIndexToMaskNode(bpy.types.Node, SverchCustomTreeNode): ...@@ -92,17 +74,38 @@ class SvIndexToMaskNode(bpy.types.Node, SverchCustomTreeNode):
layout.prop(self, 'output_numpy') layout.prop(self, 'output_numpy')
def process(self): def process(self):
if not node.props.data_to_mask: # upgrade old nodes
mask = np.zeros(int(node.inputs.mask_size[0]), dtype=bool) if 'mask size' in self.inputs:
else: self.inputs['mask size'].name = 'Mask size'
if node.props.is_topo_mask: if 'data to mask' in self.inputs:
mask = np.zeros(len(node.inputs.data_to_mask), dtype=bool) self.inputs['data to mask'].name = 'Data masking'
if 'mask' in self.outputs:
self.outputs['mask'].name = 'Mask'
index = self.inputs["Index"].sv_get(deepcopy=False, default=[])
mask_size = self.inputs['Mask size'].sv_get(deepcopy=False, default=cycle([None]))
data_to_mask = self.inputs['Data masking'].sv_get(deepcopy=False,
default=[] if self.data_to_mask else cycle([None]))
masks = []
for ind, mask, data in zip(index, mask_size, data_to_mask):
if not self.data_to_mask:
mask = mask[0] if mask is not None else 0
mask = np.zeros(int(mask), dtype=bool)
else: else:
# inconsistent mode with Sverchok data structure, should be reconsidered in MK2 version if self.is_topo_mask:
mask = np.zeros_like(node.inputs.data_to_mask, dtype=bool) mask = np.zeros(len(data), dtype=bool)
else:
# inconsistent mode with Sverchok data structure, should be reconsidered in MK2 version
mask = np.zeros_like(data, dtype=bool)
mask[node.inputs.index] = True mask[ind] = True
if node.props.output_numpy: masks.append(mask)
node.outputs.mask = mask
if self.output_numpy:
self.outputs['Mask'].sv_set(masks)
else: else:
node.outputs.mask = mask.tolist() self.outputs['Mask'].sv_set([m.tolist() for m in masks])
register, unregister = bpy.utils.register_classes_factory([SvIndexToMaskNode])
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать