Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SvRecursiveNode mixin #3954

Merged
merged 9 commits into from
Mar 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion core/sockets.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ class SvSocketProcessing():
# for input sockets, if the node knows it can handle simplified data.
# For outputs, these properties are not used.
allow_flatten : BoolProperty(default = False)
allow_flatten_topology : BoolProperty(default = False)
allow_simplify : BoolProperty(default = False)
allow_graft : BoolProperty(default = False)
allow_unwrap : BoolProperty(default = False)
Expand Down Expand Up @@ -193,6 +194,10 @@ def update_simplify_flag(self, context):

process_from_socket(self, context)

use_flatten_topology : BoolProperty(
name = "Flatten Topology",
default = False,
update = process_from_socket)
# Only one of properties can be set to true: use_flatten or use_simplfy
use_flatten : BoolProperty(
name = "Flatten",
Expand All @@ -208,6 +213,8 @@ def get_mode_flags(self):
flags = []
if self.use_flatten:
flags.append('F')
if self.use_flatten_topology:
flags.append('FT')
if self.use_simplify:
flags.append('S')
if self.use_graft:
Expand All @@ -221,6 +228,9 @@ def get_mode_flags(self):
def can_flatten(self):
return hasattr(self, 'do_flatten') and (self.allow_flatten or self.is_output)

def can_flatten_topology(self):
return hasattr(self, 'do_flat_topology') and (self.allow_flatten_topology or self.is_output)

def can_simplify(self):
return hasattr(self, 'do_simplify') and (self.allow_simplify or self.is_output)

Expand Down Expand Up @@ -255,6 +265,8 @@ def preprocess_input(self, data):

def postprocess_output(self, data):
result = data
if self.use_flatten_topology:
result = self.do_flat_topology(data)
if self.use_flatten:
result = self.do_flatten(data)
elif self.use_simplify:
Expand All @@ -279,6 +291,8 @@ def draw_menu_button(self, context, layout, node, text):
layout.menu('SV_MT_SocketOptionsMenu', text='', icon='TRIA_DOWN')

def draw_menu_items(self, context, layout):
if self.can_flatten_topology():
layout.prop(self, 'use_flatten_topology')
self.draw_simplify_modes(layout)
if self.can_graft():
layout.prop(self, 'use_graft')
Expand Down Expand Up @@ -313,6 +327,10 @@ class SvSocketCommon(SvSocketProcessing):
objects_number: IntProperty(min=0, options={'SKIP_SAVE'})

description : StringProperty()
is_mandatory: BoolProperty(default=False)
nesting_level: IntProperty(default=2)
default_mode: EnumProperty(items=enum_item_4(['NONE', 'EMPTY_LIST', 'MATRIX', 'MASK']), default='EMPTY_LIST')
pre_processing: EnumProperty(items=enum_item_4(['NONE', 'ONE_ITEM']), default='NONE')

def get_link_parameter_node(self):
return self.quick_link_to_node
Expand Down Expand Up @@ -662,7 +680,7 @@ class SvVerticesSocket(NodeSocket, SvSocketCommon):

color = (0.9, 0.6, 0.2, 1.0)
quick_link_to_node = 'GenVectorsNode'

nesting_level: IntProperty(default=3)
def setup_parameter_node(self, param_node):
if self.use_prop or self.get_prop_name():
value = self.sv_get()[0][0]
Expand All @@ -681,6 +699,9 @@ def setup_parameter_node(self, param_node):
def do_simplify(self, data):
return flatten_data(data, 2)

def do_flat_topology(self, data):
return flatten_data(data, 3)

@property
def default_property(self):
return self.prop
Expand Down Expand Up @@ -927,6 +948,8 @@ def draw_property(self, layout, prop_origin=None, prop_name=None):

def draw_menu_items(self, context, layout):
self.draw_simplify_modes(layout)
if self.can_flatten_topology():
layout.prop(self, 'use_flatten_topology')
if self.can_graft():
layout.prop(self, 'use_graft')
if not self.use_flatten:
Expand All @@ -936,6 +959,9 @@ def draw_menu_items(self, context, layout):
if self.can_wrap():
layout.prop(self, 'use_wrap')

def do_flat_topology(self, data):
return flatten_data(data, 3)

def do_flatten(self, data):
return flatten_data(data, 1)

Expand Down Expand Up @@ -972,6 +998,9 @@ def preprocess_input(self, data):

def postprocess_output(self, data):
result = data

if self.use_flatten_topology:
result = self.do_flat_topology(data)
if self.use_flatten:
result = self.do_flatten(data)
elif self.use_simplify:
Expand Down
27 changes: 27 additions & 0 deletions data_structure.py
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,33 @@ def ensure_nesting_level(data, target_level, data_types=SIMPLE_DATA_TYPES, input
result = [result]
return result

def ensure_min_nesting(data, target_level, data_types=SIMPLE_DATA_TYPES, input_name=None):
"""
data: number, or list of numbers, or list of lists, etc.
target_level: minimum data nesting level required for further processing.
data_types: list or tuple of types.
input_name: name of input socket data was taken from. Optional. If specified,
used for error reporting.

Wraps data in so many [] as required to achieve target nesting level.
If data already has too high nesting level the same data will be returned

ensure_nesting_level(17, 0) == 17
ensure_nesting_level(17, 1) == [17]
ensure_nesting_level([17], 1) == [17]
ensure_nesting_level([17], 2) == [[17]]
ensure_nesting_level([(1,2,3)], 3) == [[(1,2,3)]]
ensure_nesting_level([[[17]]], 1) => [[[17]]]
"""

current_level = get_data_nesting_level(data, data_types)
if current_level >= target_level:
return data
result = data
for i in range(target_level - current_level):
result = [result]
return result

def flatten_data(data, target_level=1, data_types=SIMPLE_DATA_TYPES):
"""
Reduce nesting level of `data` to `target_level`, by concatenating nested sub-lists.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ The inner workings go something like::
print(mesh_join(verts_nested, keys_nested))

# result
[(0.2, 1.5, 0.1), (1.2, 0.5, 0.1), (1.2, 1.5, 0.1),
(0.2, 2.5, 5.1), (0.2, 0.5, 2.1), (0.2, 2.5, 0.1),
(0.2, 1.4, 0.1), (1.2, 0.2, 0.3), (1.2, 4.5, 4.1),
(0.2, 1.5, 3.4), (5.2, 6.5, 2.1), (0.2, 5.5, 2.1)]
[(0.2, 1.5, 0.1), (1.2, 0.5, 0.1), (1.2, 1.5, 0.1),
(0.2, 2.5, 5.1), (0.2, 0.5, 2.1), (0.2, 2.5, 0.1),
(0.2, 1.4, 0.1), (1.2, 0.2, 0.3), (1.2, 4.5, 4.1),
(0.2, 1.5, 3.4), (5.2, 6.5, 2.1), (0.2, 5.5, 2.1)]

[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]

Expand All @@ -55,7 +55,7 @@ The inner workings go something like::
Inputs & Outputs
----------------

The inputs and outputs are *vertices* and *polygons / edges*.
The inputs and outputs are *vertices*, edges and *polygons*.

Expects a nested collection of vertex lists. Each nested list represents an object which can itself have many vertices and key lists.

Expand All @@ -67,4 +67,4 @@ Examples
:alt: MeshJoinDemo1.PNG

Notes
-----
-----
2 changes: 1 addition & 1 deletion docs/nodes/modifier_change/modifier_change_index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Modifier Change
holes_fill
flip_normals
merge_by_distance
mesh_join
mesh_join_mk2
mesh_separate
objects_along_edge
offset
Expand Down
2 changes: 1 addition & 1 deletion index.md
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@
SvEdgeBoomNode
SvDissolveMeshElements
SvPols2EdgsNodeMk2
SvMeshJoinNode
SvMeshJoinNodeMk2
---
SvFillsHoleNode
SvRecalcNormalsNode
Expand Down
Loading