Repository: pyvista/pyvista

Issue:
Allow clearing cell and point data for all blocks in `MultiBlock` objects
### Describe the feature you would like to be added.

PyVista `DataSet` objects have `clear_data`, `clear_point_data`, and `clear_cell_data` [methods](https://docs.pyvista.org/version/stable/api/core/_autosummary/pyvista.dataset#pyvista.DataSet). It would be nice to be able to recursively call these methods on all blocks of a MultiBlock using something like `MultiBlock.clear_all_data()`, `MultiBlock.clear_all_point_data()` and `MultiBlock.clear_all_cell_data()`.

### Links to VTK Documentation, Examples, or Class Definitions.

_No response_

### Pseudocode or Screenshots

_No response_

Discussion:
tkoyama010: @pyvista-bot preview
pyvista-bot: <!-- NETLIFY DEPLOY COMMENT GENERATED BY ACTIONS_NETLIFY - APP ID SHA256: a13cb84fb117b1fbb38c5e9d3853a95b804288edd848742e6f4a409c37f2648c -->
🚀 Deployed on https://663a3ffb7b66d20e2a353b9d--meek-duckanoo-d2f5ec.netlify.app

Patch:
diff --git a/pyvista/core/composite.py b/pyvista/core/composite.py
index bb75aeb3..f6018f2e 100644
--- a/pyvista/core/composite.py
+++ b/pyvista/core/composite.py
@@ -1308,3 +1308,27 @@ class MultiBlock(
         point_name = point_names.pop() if len(point_names) == 1 else None
         cell_name = cell_names.pop() if len(cell_names) == 1 else None
         return point_name, cell_name
+
+    def clear_all_data(self):
+        """Clear all data from all blocks."""
+        for block in self:
+            if isinstance(block, MultiBlock):
+                block.clear_all_data()
+            elif block is not None:
+                block.clear_data()
+
+    def clear_all_point_data(self):
+        """Clear all point data from all blocks."""
+        for block in self:
+            if isinstance(block, MultiBlock):
+                block.clear_all_point_data()
+            elif block is not None:
+                block.clear_point_data()
+
+    def clear_all_cell_data(self):
+        """Clear all cell data from all blocks."""
+        for block in self:
+            if isinstance(block, MultiBlock):
+                block.clear_all_cell_data()
+            elif block is not None:
+                block.clear_cell_data()


Test patch:
diff --git a/tests/core/test_composite.py b/tests/core/test_composite.py
index 53268f85..99a37bbd 100644
--- a/tests/core/test_composite.py
+++ b/tests/core/test_composite.py
@@ -785,3 +785,51 @@ def test_activate_scalars(multiblock_poly):
     for block in multiblock_poly:
         data = np.array(['a'] * block.n_points)
         block.point_data.set_array(data, 'data')
+
+
+def test_clear_all_data(multiblock_all):
+    for block in multiblock_all:
+        block.point_data['data'] = range(block.n_points)
+        block.cell_data['data'] = range(block.n_cells)
+    multiblock_all.append(multiblock_all.copy())
+    multiblock_all.clear_all_data()
+    for block in multiblock_all:
+        if isinstance(block, MultiBlock):
+            for subblock in block:
+                assert subblock.point_data.keys() == []
+                assert subblock.cell_data.keys() == []
+        else:
+            assert block.point_data.keys() == []
+            assert block.cell_data.keys() == []
+
+
+def test_clear_all_point_data(multiblock_all):
+    for block in multiblock_all:
+        block.point_data['data'] = range(block.n_points)
+        block.cell_data['data'] = range(block.n_cells)
+    multiblock_all.append(multiblock_all.copy())
+    multiblock_all.clear_all_point_data()
+    for block in multiblock_all:
+        if isinstance(block, MultiBlock):
+            for subblock in block:
+                assert subblock.point_data.keys() == []
+                assert subblock.cell_data.keys() != []
+        else:
+            assert block.point_data.keys() == []
+            assert block.cell_data.keys() != []
+
+
+def test_clear_all_cell_data(multiblock_all):
+    for block in multiblock_all:
+        block.point_data['data'] = range(block.n_points)
+        block.cell_data['data'] = range(block.n_cells)
+    multiblock_all.append(multiblock_all.copy())
+    multiblock_all.clear_all_cell_data()
+    for block in multiblock_all:
+        if isinstance(block, MultiBlock):
+            for subblock in block:
+                assert subblock.point_data.keys() != []
+                assert subblock.cell_data.keys() == []
+        else:
+            assert block.point_data.keys() != []
+            assert block.cell_data.keys() == []