Google Colaboratory上での可視化

Google Colaboratory上でVTKの可視化を行うためには、ダミーのXセッションを起動する必要がありますが、Gooble Colaboratoryではバックグラウンドプロセルの起動はできないため、pyvirtualdisplayを起動して、DISPLAY環境変数を指定します。

 !apt-get -qq -y install xvfb freeglut3-dev ffmpeg> /dev/null
 !pip install vtk pyvirtualdisplay

pyvirtualdisplayを起動して、DISPLAY環境変数するためには、次のコードを実行します。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
-
!
 
 
 
 
 
# Start virtual display
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 480))
display.start()
import os
os.environ["DISPLAY"] = ":" + str(display.display) + "." + str(display.screen)

VTKのコードでは、vtkRenderWindowのwindowをvtkPNGWriterでメモリ上に出力し、それをIPython.displayに渡します。

以下は、その一例です。

Everything is expanded.Everything is shortened.
  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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
import vtk
 
fileName = '/content/couette_flow_2d/couette_flow_2d-040.vtu'
 
reader = vtk.vtkXMLUnstructuredGridReader()
reader.SetFileName(fileName)
reader.Update()
ug = reader.GetOutput()
ug.GetPointData().SetActiveScalars('Density')
 
mapper = vtk.vtkDataSetMapper()
mapper.SetInputConnection(reader.GetOutputPort())
mapper.SetScalarRange(ug.GetPointData().GetScalars().GetRange())
 
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().EdgeVisibilityOn()
 
scalarBar = vtk.vtkScalarBarActor()
scalarBar.SetLookupTable(mapper.GetLookupTable())
scalarBar.SetTitle("Density")
 
renderer = vtk.vtkRenderer()
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
 
renderer.AddActor(actor)
renderer.AddActor2D(scalarBar)
renderer.ResetCamera()
 
renderer.GradientBackgroundOn()
renderer.SetBackground(1, 1, 1)
renderer.SetBackground2(0, 0, 0)
 
renderWindow.SetSize(680, 480)
renderWindow.OffScreenRenderingOn()
 
w2if = vtk.vtkWindowToImageFilter()
w2if.SetInput(renderWindow)
w2if.Update()
 
writer = vtk.vtkPNGWriter()
writer.WriteToMemoryOn()
writer.SetInputConnection(w2if.GetOutputPort())
writer.Write()
data = bytes(memoryview(writer.GetResult()))
 
from IPython.display import Image
Image(data)

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-12-28 (金) 10:43:49 (53d)