Just to finish this thread and close it. I achieved exactly what I wanted with the help of:
The key point is to avoid loops and use numpy dot product with broadcasting.
Programmable Filter
-
Select geometry and Ctrl+TabletoPoints
TableToPoints should have Keep All Data Arrays ticked -
Script
import numpy
#get cog and angles from the cvs file (TableToPoints)
input1=inputs[1]
x_cg=input1.PointData["DX"]
y_cg=input1.PointData["DY"]
z_cg=input1.PointData["Radar_Altitude"]
yaw=float(-input1.PointData["HEADING"]*numpy.pi/180)
pitch=float(input1.PointData["PITCH_ANGLE"]*numpy.pi/180)
roll=float(-input1.PointData["ROLL_ANGLE"]*numpy.pi/180)
#initiliase the geometry class
pdi = self.GetPolyDataInput()
pdo = self.GetPolyDataOutput()
#initialise time (file number actually)
executive = self.GetExecutive()
outInfo = executive.GetOutputInformation(0)
ts= outInfo.Get(executive.UPDATE_TIME_STEP())
t=float(ts)
# from body to inertial frame
R = numpy.array([ [cos(yaw)*cos(pitch),cos(yaw)*sin(roll)*sin(pitch)-cos(roll)*sin(yaw),sin(roll)*sin(yaw)+cos(roll)*cos(yaw)*sin(pitch)] , [cos(pitch)*sin(yaw),cos(roll)*cos(yaw)+sin(roll)*sin(pitch)*sin(yaw),cos(roll)*sin(pitch)*sin(yaw)-cos(yaw)*sin(roll)] , [-sin(pitch),cos(pitch)*sin(roll),cos(roll)*cos(pitch)] ])
output.Points = R.dot(inputs[0].Points.T).T
output.Points = (output.Points.T+[x_cg,y_cg,z_cg+1.795]).T
- RequestInformation Script
def setOutputTimesteps(algorithm , timesteps):
"helper routine to set timestep information"
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,(0,0))