Открыть боковую панель
nikitronn
sverchok
Коммиты
55c1efa1
Коммит
55c1efa1
создал
Июн 02, 2019
по автору
Ilya Portnov
Просмотр файлов
Test cases for calc_mask.
владелец
a5e7a872
Изменения
3
Скрыть пробелы
Построчно
Рядом
data_structure.py
Просмотр файла @
55c1efa1
...
...
@@ -367,6 +367,42 @@ def describe_data_shape(data):
nesting
,
result
=
helper
(
data
)
return
"Level {}: {}"
.
format
(
nesting
,
result
)
def
calc_mask
(
subset_data
,
set_data
,
level
=
0
,
negate
=
False
,
ignore_order
=
True
):
"""
Calculate mask: for each item in set_data, return True if it is present in subset_data.
The function can work at any specified level.
subset_data: subset, for example [1]
set_data: set, for example [1, 2, 3]
level: 0 to check immediate members of set and subset; 1 to work with lists of lists and so on.
negate: if True, then result will be negated (True if item of set is not present in subset).
ignore_order: when comparing lists, ignore items order.
Raises an exception if nesting level of input sets is less than specified level parameter.
calc_mask([1], [1,2,3]) == [True, False, False])
calc_mask([1], [1,2,3], negate=True) == [False, True, True]
"""
if
level
==
0
:
if
not
isinstance
(
subset_data
,
(
tuple
,
list
)):
raise
Exception
(
"Specified level is too high for given Subset"
)
if
not
isinstance
(
set_data
,
(
tuple
,
list
)):
raise
Exception
(
"Specified level is too high for given Set"
)
if
ignore_order
and
get_data_nesting_level
(
subset_data
)
>
1
:
if
negate
:
return
[
set
(
item
)
not
in
map
(
set
,
subset_data
)
for
item
in
set_data
]
else
:
return
[
set
(
item
)
in
map
(
set
,
subset_data
)
for
item
in
set_data
]
else
:
if
negate
:
return
[
item
not
in
subset_data
for
item
in
set_data
]
else
:
return
[
item
in
subset_data
for
item
in
set_data
]
else
:
sub_objects
=
match_long_repeat
([
subset_data
,
set_data
])
return
[
calc_mask
(
subset_item
,
set_item
,
level
-
1
,
negate
,
ignore_order
)
for
subset_item
,
set_item
in
zip
(
*
sub_objects
)]
#####################################################
################### matrix magic ####################
#####################################################
...
...
nodes/list_masks/calc_mask.py
Просмотр файла @
55c1efa1
...
...
@@ -19,7 +19,7 @@
import
bpy
from
bpy.props
import
BoolProperty
,
EnumProperty
,
IntProperty
from
sverchok.node_tree
import
SverchCustomTreeNode
,
StringsSocket
,
VerticesSocket
from
sverchok.data_structure
import
updateNode
,
match_long_repeat
,
fullList
from
sverchok.data_structure
import
updateNode
,
match_long_repeat
,
fullList
,
calc_mask
class
SvCalcMaskNode
(
bpy
.
types
.
Node
,
SverchCustomTreeNode
):
"""
...
...
@@ -51,27 +51,6 @@ class SvCalcMaskNode(bpy.types.Node, SverchCustomTreeNode):
self
.
inputs
.
new
(
'StringsSocket'
,
"Set"
)
self
.
outputs
.
new
(
'StringsSocket'
,
'Mask'
)
def
calc
(
self
,
subset_data
,
set_data
,
level
):
if
level
==
0
:
if
not
isinstance
(
subset_data
,
(
tuple
,
list
)):
raise
Exception
(
"Specified level is too high for given Subset"
)
if
not
isinstance
(
set_data
,
(
tuple
,
list
)):
raise
Exception
(
"Specified level is too high for given Set"
)
if
self
.
ignore_order
:
if
self
.
negate
:
return
[
set
(
item
)
not
in
map
(
set
,
subset_data
)
for
item
in
set_data
]
else
:
return
[
set
(
item
)
in
map
(
set
,
subset_data
)
for
item
in
set_data
]
else
:
if
self
.
negate
:
return
[
item
not
in
subset_data
for
item
in
set_data
]
else
:
return
[
item
in
subset_data
for
item
in
set_data
]
else
:
sub_objects
=
match_long_repeat
([
subset_data
,
set_data
])
return
[
self
.
calc
(
subset_item
,
set_item
,
level
-
1
)
for
subset_item
,
set_item
in
zip
(
*
sub_objects
)]
def
process
(
self
):
if
not
any
(
output
.
is_linked
for
output
in
self
.
outputs
):
...
...
@@ -83,7 +62,7 @@ class SvCalcMaskNode(bpy.types.Node, SverchCustomTreeNode):
objects
=
match_long_repeat
([
subset_s
,
set_s
])
for
subset
,
set
in
zip
(
*
objects
):
mask
=
self
.
calc
(
subset
,
set
,
self
.
level
)
mask
=
calc_mask
(
subset
,
set
,
level
=
self
.
level
,
negate
=
self
.
negate
,
ignore_order
=
self
.
ignore_order
)
out_masks
.
append
(
mask
)
self
.
outputs
[
'Mask'
].
sv_set
(
out_masks
)
...
...
tests/data_structure_tests.py
Просмотр файла @
55c1efa1
...
...
@@ -68,3 +68,46 @@ class DataStructureTests(SverchokTestCase):
self
.
subtest_assert_equals
(
describe_data_shape
([
1
]),
'Level 1: list [1] of int'
)
self
.
subtest_assert_equals
(
describe_data_shape
([[(
1
,
2
,
3
)]]),
'Level 3: list [1] of list [1] of tuple [3] of int'
)
class
CalcMaskTests
(
SverchokTestCase
):
def
test_calc_mask_1
(
self
):
subset
=
[
1
]
set
=
[
1
,
2
,
3
]
mask
=
calc_mask
(
subset
,
set
,
level
=
0
)
expected
=
[
True
,
False
,
False
]
self
.
assertEquals
(
mask
,
expected
)
def
test_calc_mask_2
(
self
):
subset
=
[
1
]
set
=
[
1
,
2
,
3
]
mask
=
calc_mask
(
subset
,
set
,
negate
=
True
)
expected
=
[
False
,
True
,
True
]
self
.
assertEquals
(
mask
,
expected
)
def
test_calc_mask_3
(
self
):
subset
=
[[
1
,
2
],
[
3
,
4
]]
set
=
[[
1
,
2
],
[
3
,
4
],
[
5
,
6
]]
mask
=
calc_mask
(
subset
,
set
,
level
=
0
)
expected
=
[
True
,
True
,
False
]
self
.
assertEquals
(
mask
,
expected
)
def
test_calc_mask_4
(
self
):
subset
=
[[
1
,
2
],
[
3
,
4
]]
set
=
[[
1
,
2
],
[
3
,
4
],
[
5
,
6
]]
mask
=
calc_mask
(
subset
,
set
,
level
=
1
)
expected
=
[[
True
,
True
],
[
True
,
True
],
[
False
,
False
]]
self
.
assertEquals
(
mask
,
expected
)
def
test_calc_mask_5
(
self
):
subset
=
[[
1
],
[
5
,
6
]]
set
=
[[
1
,
2
,
3
],
[
7
,
8
,
9
]]
mask
=
calc_mask
(
subset
,
set
,
level
=
0
)
expected
=
[
False
,
False
]
self
.
assertEquals
(
mask
,
expected
)
def
test_calc_mask_6
(
self
):
subset
=
[[
1
],
[
5
,
6
]]
set
=
[[
1
,
2
,
3
],
[
7
,
8
,
9
]]
mask
=
calc_mask
(
subset
,
set
,
level
=
1
)
expected
=
[[
True
,
False
,
False
],
[
False
,
False
,
False
]]
self
.
assertEquals
(
mask
,
expected
)
Редактирование
Предварительный просмотр
Поддерживает Markdown
0%
Попробовать снова
или
прикрепить новый файл
.
Отмена
You are about to add
0
people
to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Отмена
Пожалуйста,
зарегистрируйтесь
или
войдите
чтобы прокомментировать