Programmable Sourceで時刻データにアクセスする方法についてはProducing Data with Timesteps (Source) | ParaView Wikiを参照のこと。
動作確認バージョン
ParaView 4.2.0
ParaView 5.0.0 RC1
Output Data Set Type
vtkPolyData
Script
from paraview import vtk import numpy as np pps = 700000 # points per second frq = 15 # frequency dsr = 32 # DSRs s_ang = 90.0 s_len = 120.0 s_gnd = -2.7 s_hil = -2.5 def GetUpdateTimestep(algorithm): """Returns the requested time value, or None if not present""" executive = algorithm.GetExecutive() outInfo = executive.GetOutputInformation(0) if not outInfo.Has(executive.UPDATE_TIME_STEP()): return None return outInfo.Get(executive.UPDATE_TIME_STEP()) s_len -= GetUpdateTimestep(self) * 60.0 / 3.6 dsr_ang_v = np.array([(8.0 - x) * 4.0 / 3.0 / 180.0 * np.pi for x in range(9, 32)]).reshape((-1, 1)) #dsr_ang_h = np.array([2.0 * np.pi / pps * frq * dsr * x for x in range(0, 1458)]).reshape((1, -1)) dsr_ang_h = np.array([2.0 * np.pi / pps * frq * dsr * x for x in range(-364, 365)]).reshape((1, -1)) dsr_ang_h[np.where(dsr_ang_h == 0.0)] = 1.0e-100 ray = np.array(( np.sin(dsr_ang_v) * np.sin(dsr_ang_h), np.sin(dsr_ang_v) * np.cos(dsr_ang_h), np.cos(dsr_ang_v) * np.sin(dsr_ang_h) * np.cos(dsr_ang_h), )) def getCloud(ang, length, height): t = np.tan(-ang / 180.0 * np.pi) plane = np.array((t, 0.0, 1.0, -length * t - height)) x = -plane[3] / (plane[0] + ray[0] / ray[1] * plane[1] + ray[0] / ray[2] * plane[2]) y = ray[0] / ray[1] * x z = ray[0] / ray[2] * x a = np.ones(np.shape(x)) * ang id = np.indices(np.shape(x)) + (32 - np.shape(x)[0]) return np.vstack((x.reshape(-1), y.reshape(-1), z.reshape(-1), a.reshape(-1), id[0].reshape(-1))) cloud_g = getCloud(0.0, s_len, s_gnd) cloud_s = getCloud(s_ang, s_len, s_gnd) cloud_h = getCloud(0.0, s_len, s_hil) for i in range(np.shape(cloud_g)[1]): if cloud_g[0, i] <= s_len: continue elif cloud_s[2, i] <= s_hil: cloud_g[:, i] = cloud_s[:, i] else: cloud_g[:, i] = cloud_h[:, i] cloud_g[np.where((-1.0e-20 < cloud_g) & (cloud_g < 1.0e-20))] = 0.0 pdo = self.GetPolyDataOutput() # pdo = self.GetOutput() pts = vtk.vtkPoints() for i in range(np.shape(cloud_g)[1]): pts.InsertPoint(i, cloud_g[0, i], cloud_g[1, i], cloud_g[2, i] - s_gnd) pdo.SetPoints(pts) pdo.Allocate(np.shape(cloud_g)[1], 1) ang = vtk.vtkDoubleArray() ang.SetName('angle') ang.SetNumberOfComponents(1) ang.SetNumberOfTuples(np.shape(cloud_g)[1]) id = vtk.vtkDoubleArray() id.SetName('id') id.SetNumberOfComponents(1) id.SetNumberOfTuples(np.shape(cloud_g)[1]) for i in range(np.shape(cloud_g)[1]): vrt = vtk.vtkVertex() vrt.GetPointIds().SetNumberOfIds(1) vrt.GetPointIds().SetId(0, i) pdo.InsertNextCell(vrt.GetCellType(), vrt.GetPointIds()) ang.SetValue(i, cloud_g[3, i]) id.SetValue(i, cloud_g[4, i]) pdo.GetPointData().AddArray(ang) pdo.GetPointData().AddArray(id)
Script (RequestInformation)
import numpy as np def SetOutputTimesteps(algorithm, timesteps): executive = algorithm.GetExecutive() outInfo = executive.GetOutputInformation(0) outInfo.Remove(executive.TIME_STEPS()) for timestep in timesteps: outInfo.Append(executive.TIME_STEPS(), timestep) outInfo.Remove(executive.TIME_RANGE()) outInfo.Append(executive.TIME_RANGE(), timesteps[0]) outInfo.Append(executive.TIME_RANGE(), timesteps[-1]) SetOutputTimesteps(self, np.arange(0, 8, 0.1))
コメントを残す