Making this configurable would be nice for downstream users. I can confirm that only vtkUnstructuredGrid has this “remove ghost cells interface” behavior in vtk==9.6.0rc2, here’s a reproducer:
import vtk
def render_dataset(dataset):
# Mapper
mapper = vtk.vtkDataSetMapper()
mapper.SetInputData(dataset)
# Actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)
# Make grid white with black lines
prop = actor.GetProperty()
prop.EdgeVisibilityOn()
prop.SetEdgeColor(0.0, 0.0, 0.0)
prop.SetLineWidth(1.0)
prop.SetColor(1.0, 1.0, 1.0)
mapper.SetScalarVisibility(False)
# Renderer
renderer = vtk.vtkRenderer()
renderer.AddActor(actor)
renderer.SetBackground(0.1, 0.1, 0.1)
# Camera
camera = renderer.GetActiveCamera()
camera.SetPosition(1, 1, 1)
camera.SetViewUp(0, 0, 1)
renderer.ResetCamera()
# Render window
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
render_window.SetSize(800, 600)
# Interactor
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)
# Start
render_window.Render()
interactor.Start()
def create_image_data():
# Create data with 3x3x3 cells
dataset = vtk.vtkImageData()
dataset.SetDimensions(4, 4, 4)
return dataset
def add_ghost_cell_data(data):
ghost_array = vtk.vtkUnsignedCharArray()
ghost_array.SetName(vtk.vtkDataSetAttributes.GhostArrayName())
ghost_array.SetNumberOfTuples(data.GetNumberOfCells())
# Bottom layer: first 18 cells are visible
for i in range(18):
ghost_array.SetValue(i, 0)
# Top layer: next 9 cells are hidden
for i in range(18, 27):
ghost_array.SetValue(i, vtk.vtkDataSetAttributes.HIDDENCELL)
data.GetCellData().AddArray(ghost_array)
data.GetCellData().SetActiveScalars(vtk.vtkDataSetAttributes.GhostArrayName())
def image_data_to_structured_grid(data):
alg = vtk.vtkImageToStructuredGrid()
alg.SetInputData(data)
alg.Update()
return alg.GetOutput()
def image_data_to_unstructured_grid(data):
alg = vtk.vtkAppendFilter()
alg.AddInputData(data)
alg.Update()
return alg.GetOutput()
def image_data_to_explicit_structured_grid(data):
ugrid = image_data_to_unstructured_grid(data)
# Create BLOCK_I/J/K cell arrays
dims = data.GetDimensions()
ni, nj, nk = dims[0] - 1, dims[1] - 1, dims[2] - 1
n_cells = ugrid.GetNumberOfCells()
arr_i = vtk.vtkIntArray()
arr_i.SetName("BLOCK_I")
arr_i.SetNumberOfTuples(n_cells)
arr_j = vtk.vtkIntArray()
arr_j.SetName("BLOCK_J")
arr_j.SetNumberOfTuples(n_cells)
arr_k = vtk.vtkIntArray()
arr_k.SetName("BLOCK_K")
arr_k.SetNumberOfTuples(n_cells)
cid = 0
for k in range(nk):
for j in range(nj):
for i in range(ni):
arr_i.SetValue(cid, i)
arr_j.SetValue(cid, j)
arr_k.SetValue(cid, k)
cid += 1
cd = ugrid.GetCellData()
cd.AddArray(arr_i)
cd.AddArray(arr_j)
cd.AddArray(arr_k)
# Convert to explicit grid
alg = vtk.vtkUnstructuredGridToExplicitStructuredGrid()
alg.SetInputData(ugrid)
alg.SetInputArrayToProcess(0, 0, 0, 1, 'BLOCK_I')
alg.SetInputArrayToProcess(1, 0, 0, 1, 'BLOCK_J')
alg.SetInputArrayToProcess(2, 0, 0, 1, 'BLOCK_K')
alg.Update()
return alg.GetOutput()
image_data = create_image_data()
assert isinstance(image_data, vtk.vtkImageData)
add_ghost_cell_data(image_data)
render_dataset(image_data)
structured_grid = image_data_to_structured_grid(create_image_data())
assert isinstance(structured_grid, vtk.vtkStructuredGrid)
add_ghost_cell_data(structured_grid)
render_dataset(structured_grid)
unstructured_grid = image_data_to_unstructured_grid(create_image_data())
assert isinstance(unstructured_grid, vtk.vtkUnstructuredGrid)
add_ghost_cell_data(unstructured_grid)
render_dataset(unstructured_grid)
explicit_structured_grid = image_data_to_explicit_structured_grid(create_image_data())
assert isinstance(explicit_structured_grid, vtk.vtkExplicitStructuredGrid)
add_ghost_cell_data(explicit_structured_grid)
render_dataset(explicit_structured_grid)
vtkImageData:
vtkStructuredGrid:
vtkUnstructuredGrid:
vtkExplicitStructuredGrid:
EDIT: Add example for vtkExplicitStructuredGrid