summaryrefslogtreecommitdiff
path: root/vtk_to_png.py
blob: 9c3f4f3d8b8099377de92a10738e8ca2d820c68c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import vtk
import glob
import os

vtk_files = sorted(glob.glob("*.vtk"))
output_dir = "frames"
os.makedirs(output_dir, exist_ok=True)

renderer = vtk.vtkRenderer()
render_window = vtk.vtkRenderWindow()
render_window.SetOffScreenRendering(1)
render_window.SetSize(1024, 512)
render_window.AddRenderer(renderer)

renderer.SetBackground(1, 1, 1)

camera_initialized = False

for i, vtk_file in enumerate(vtk_files):
    reader = vtk.vtkStructuredPointsReader()
    reader.SetFileName(vtk_file)
    reader.Update()

    image = reader.GetOutput()

    mag = vtk.vtkImageMagnitude();
    mag.SetInputData(image);
    mag.Update();
    image = mag.GetOutput();
    scalar_name = "Velocity magnitude";

    scalars = image.GetPointData().GetScalars()
    if scalars is None:
        raise RuntimeError("No scalar data found")

    vmin, vmax = scalars.GetRange()

    # Image slice mapper (2D!)
    slice_mapper = vtk.vtkImageSliceMapper()
    slice_mapper.SetInputData(image)

    # Pick the only slice (or middle if dimension >1)
    extent = image.GetExtent()
    slice_mapper.SetSliceNumber(extent[4])  # Z slice

    slice_actor = vtk.vtkImageSlice()
    slice_actor.SetMapper(slice_mapper)

    # Grayscale mapping
    prop = slice_actor.GetProperty()
    prop.SetColorWindow(vmax - vmin)
    prop.SetColorLevel(0.5 * (vmax + vmin))

    renderer.RemoveAllViewProps()
    renderer.AddViewProp(slice_actor)

    if not camera_initialized:
        renderer.ResetCamera()
        camera_initialized = True

    render_window.Render()

    # Capture to PNG
    w2i = vtk.vtkWindowToImageFilter()
    w2i.SetInput(render_window)
    w2i.ReadFrontBufferOff()
    w2i.Update()

    writer = vtk.vtkPNGWriter()
    writer.SetFileName(f"{output_dir}/frame_{i:04d}.png")
    writer.SetInputConnection(w2i.GetOutputPort())
    writer.Write()

    print(f"Saved frame {i} range=({vmin},{vmax})")