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

Fix extract_values invert parameter for multi-component values #6057

Merged
merged 9 commits into from
May 13, 2024
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