Transform geometry based on input from a table of points

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

  1. Select geometry and Ctrl+TabletoPoints
    TableToPoints should have Keep All Data Arrays ticked

  2. 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
  1. 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))
1 Like