Skip to content

Commit

Permalink
Fix extract_values invert parameter for multi-component values (#6057)
Browse files Browse the repository at this point in the history
* Fix extract_values invert for multi-component values

* Apply suggestions from code review

* Apply suggestions from code review

---------

Co-authored-by: Tetsuo Koyama <tkoyama010@gmail.com>
  • Loading branch information
user27182 and tkoyama010 committed May 13, 2024
1 parent 0b44c29 commit 7dc7320
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 10 deletions.
4 changes: 3 additions & 1 deletion pyvista/core/filters/data_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -5770,7 +5770,7 @@ def _extract_values(
def _update_id_mask(logic_):
"""Apply component logic and update the id mask."""
logic_ = component_logic(logic_) if component_logic else logic_
id_mask[logic_] = not invert
id_mask[logic_] = True

# Determine which ids to keep
id_mask = np.zeros((len(array),), dtype=np.bool_)
Expand All @@ -5793,6 +5793,8 @@ def _update_id_mask(logic_):
logic = np.ones_like(array, dtype=np.bool_)
_update_id_mask(logic)

id_mask = np.invert(id_mask) if invert else id_mask

# Extract point or cell ids
if association == FieldAssociation.POINT:
output = self.extract_points(
Expand Down
43 changes: 34 additions & 9 deletions tests/core/test_dataset_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -2517,49 +2517,71 @@ class ComponentModeTestCase(NamedTuple):
values: Any
component_mode: Any
expected: Any
expected_invert: Any


component_mode_test_cases = [
ComponentModeTestCase(
values=0,
component_mode=0,
expected=[BLACK, GREEN, BLUE],
expected_invert=[WHITE, RED],
),
ComponentModeTestCase(
values=0,
component_mode=1,
expected=[BLACK, RED, BLUE],
expected_invert=[WHITE, GREEN],
),
ComponentModeTestCase(
values=0,
component_mode=2,
expected=[BLACK, RED, GREEN],
expected_invert=[WHITE, BLUE],
),
ComponentModeTestCase(
values=0,
component_mode='any',
expected=[BLACK, RED, GREEN, BLUE],
expected_invert=[WHITE],
),
ComponentModeTestCase(
values=1,
component_mode='any',
expected=[WHITE, RED, GREEN, BLUE],
expected_invert=[BLACK],
),
ComponentModeTestCase(
values=0,
component_mode='all',
expected=[BLACK],
expected_invert=[WHITE, RED, GREEN, BLUE],
),
ComponentModeTestCase(
values=1,
component_mode='all',
expected=[WHITE],
expected_invert=[BLACK, RED, GREEN, BLUE],
),
ComponentModeTestCase(
values=BLACK,
component_mode='multi',
expected=[BLACK],
expected_invert=[WHITE, RED, GREEN, BLUE],
),
ComponentModeTestCase(values=0, component_mode='all', expected=[BLACK]),
ComponentModeTestCase(values=1, component_mode='all', expected=[WHITE]),
ComponentModeTestCase(values=BLACK, component_mode='multi', expected=[BLACK]),
ComponentModeTestCase(
values=[WHITE, RED],
component_mode='multi',
expected=[WHITE, RED],
expected_invert=[BLACK, GREEN, BLUE],
),
]


@pytest.mark.parametrize('values_as_ranges', [True, False])
@pytest.mark.parametrize('split', [True, False])
@pytest.mark.parametrize(('split', 'invert'), [(True, False), (False, True), (False, False)])
@pytest.mark.parametrize(
('values', 'component_mode', 'expected'),
('values', 'component_mode', 'expected', 'expected_invert'),
component_mode_test_cases,
)
@pytest.mark.needs_vtk_version(9, 1, 0)
Expand All @@ -2568,6 +2590,8 @@ def test_extract_values_component_mode(
values,
component_mode,
expected,
expected_invert,
invert,
split,
values_as_ranges,
):
Expand All @@ -2582,12 +2606,13 @@ def test_extract_values_component_mode(
**values_kwarg,
component_mode=component_mode,
split=split,
invert=invert,
)
single_mesh = extracted.combine() if split else extracted
actual_points = single_mesh.points
actual_colors = single_mesh['colors']
assert np.array_equal(actual_points, expected)
assert np.array_equal(actual_colors, expected)
assert np.array_equal(actual_points, expected_invert if invert else expected)
assert np.array_equal(actual_colors, expected_invert if invert else expected)


@pytest.mark.parametrize(
Expand Down Expand Up @@ -2632,15 +2657,15 @@ def test_extract_values_pass_ids(grid4x4, pass_point_ids, pass_cell_ids):
assert POINT_IDS in extracted.point_data

extracted = grid4x4.extract_values(
0,
ranges=grid4x4.get_data_range(preference='point'),
invert=True,
pass_point_ids=pass_point_ids,
pass_cell_ids=pass_cell_ids,
)
if pass_cell_ids:
assert extracted.cell_data.keys() == []
if pass_point_ids:
assert extracted.cell_data.keys() == []
assert extracted.point_data.keys() == []


def test_extract_values_empty():
Expand Down

0 comments on commit 7dc7320

Please sign in to comment.