123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- import os
- from paraview import simple
- from vtkmodules.vtkIOImage import vtkPNGReader
- from vtkmodules.vtkCommonCore import vtkFloatArray, vtkUnsignedCharArray
- VTK_DATA_TYPES = [
- "void", # 0
- "bit", # 1
- "char", # 2
- "unsigned_char", # 3
- "short", # 4
- "unsigned_short", # 5
- "int", # 6
- "unsigned_int", # 7
- "long", # 8
- "unsigned_long", # 9
- "float", # 10
- "double", # 11
- "id_type", # 12
- "unspecified", # 13
- "unspecified", # 14
- "signed_char",
- ]
- # -----------------------------------------------------------------------------
- # Scalar Value to File
- # -----------------------------------------------------------------------------
- class ScalarRenderer(object):
- def __init__(self, isWriter=True, removePNG=True):
- self.view = simple.CreateView("RenderView")
- self.view.Background = [0.0, 0.0, 0.0]
- self.view.CenterAxesVisibility = 0
- self.view.OrientationAxesVisibility = 0
- self.reader = vtkPNGReader()
- self.cleanAfterMe = removePNG
- self.canWrite = isWriter
- def getView(self):
- return self.view
- def writeLightArray(self, path, source):
- rep = simple.Show(source, self.view)
- rep.Representation = "Surface"
- rep.DiffuseColor = [1, 1, 1]
- simple.ColorBy(rep, ("POINTS", None))
- # Grab data
- tmpFileName = path + "__.png"
- self.view.LockBounds = 1
- simple.SaveScreenshot(tmpFileName, self.view)
- self.view.LockBounds = 0
- if self.canWrite:
- # Convert data
- self.reader.SetFileName(tmpFileName)
- self.reader.Update()
- rgbArray = self.reader.GetOutput().GetPointData().GetArray(0)
- arraySize = rgbArray.GetNumberOfTuples()
- rawArray = vtkUnsignedCharArray()
- rawArray.SetNumberOfTuples(arraySize)
- for idx in range(arraySize):
- light = rgbArray.GetTuple3(idx)[0]
- rawArray.SetTuple1(idx, light)
- with open(path, "wb") as f:
- f.write(memoryview(rawArray))
- # Delete temporary file
- if self.cleanAfterMe:
- os.remove(tmpFileName)
- simple.Hide(source, self.view)
- def writeMeshArray(self, path, source):
- rep = simple.Show(source, self.view)
- rep.Representation = "Surface With Edges"
- rep.DiffuseColor = [0, 0, 0]
- rep.EdgeColor = [1.0, 1.0, 1.0]
- simple.ColorBy(rep, ("POINTS", None))
- # Grab data
- tmpFileName = path + "__.png"
- self.view.LockBounds = 1
- simple.SaveScreenshot(tmpFileName, self.view)
- self.view.LockBounds = 0
- if self.canWrite:
- # Convert data
- self.reader.SetFileName(tmpFileName)
- self.reader.Update()
- rgbArray = self.reader.GetOutput().GetPointData().GetArray(0)
- arraySize = rgbArray.GetNumberOfTuples()
- rawArray = vtkUnsignedCharArray()
- rawArray.SetNumberOfTuples(arraySize)
- for idx in range(arraySize):
- light = rgbArray.GetTuple3(idx)[0]
- rawArray.SetTuple1(idx, light)
- with open(path, "wb") as f:
- f.write(memoryview(rawArray))
- # Delete temporary file
- if self.cleanAfterMe:
- os.remove(tmpFileName)
- simple.Hide(source, self.view)
- def writeArray(self, path, source, name, component=0):
- rep = simple.Show(source, self.view)
- rep.Representation = "Surface"
- rep.DiffuseColor = [1, 1, 1]
- dataRange = [0.0, 1.0]
- fieldToColorBy = ["POINTS", name]
- self.view.ArrayNameToDraw = name
- self.view.ArrayComponentToDraw = component
- pdi = source.GetPointDataInformation()
- cdi = source.GetCellDataInformation()
- if pdi.GetArray(name):
- self.view.DrawCells = 0
- dataRange = pdi.GetArray(name).GetRange(component)
- fieldToColorBy[0] = "POINTS"
- elif cdi.GetArray(name):
- self.view.DrawCells = 1
- dataRange = cdi.GetArray(name).GetRange(component)
- fieldToColorBy[0] = "CELLS"
- else:
- print("No array with that name", name)
- return
- realRange = dataRange
- if dataRange[0] == dataRange[1]:
- dataRange = [dataRange[0] - 0.1, dataRange[1] + 0.1]
- simple.ColorBy(rep, fieldToColorBy)
- # Grab data
- tmpFileName = path + "__.png"
- self.view.ScalarRange = dataRange
- self.view.LockBounds = 1
- self.view.StartCaptureValues()
- simple.SaveScreenshot(tmpFileName, self.view)
- self.view.StopCaptureValues()
- self.view.LockBounds = 0
- if self.canWrite:
- # Convert data
- self.reader.SetFileName(tmpFileName)
- self.reader.Update()
- rgbArray = self.reader.GetOutput().GetPointData().GetArray(0)
- arraySize = rgbArray.GetNumberOfTuples()
- rawArray = vtkFloatArray()
- rawArray.SetNumberOfTuples(arraySize)
- minValue = 10000.0
- maxValue = -100000.0
- delta = (dataRange[1] - dataRange[0]) / 16777215.0 # 2^24 - 1 => 16,777,215
- for idx in range(arraySize):
- rgb = rgbArray.GetTuple3(idx)
- if rgb[0] != 0 or rgb[1] != 0 or rgb[2] != 0:
- value = dataRange[0] + delta * float(
- rgb[0] * 65536 + rgb[1] * 256 + rgb[2] - 1
- )
- rawArray.SetTuple1(idx, value)
- minValue = min(value, minValue)
- maxValue = max(value, maxValue)
- else:
- rawArray.SetTuple1(idx, float("NaN"))
- # print ('Array bounds', minValue, maxValue, 'compare to', dataRange)
- with open(path, "wb") as f:
- f.write(memoryview(rawArray))
- # Delete temporary file
- if self.cleanAfterMe:
- os.remove(tmpFileName)
- # Remove representation from view
- simple.Hide(source, self.view)
- return realRange
|