Trajectory Script Example
The following page gives you a full script example to create a trajectory in Speos.
Note: Make sure to use the 3.10.12 version of IronPython or Python language to write your
scripts.
# © 2012-2021 ANSYS, Inc. All rights reserved. Unauthorized use, distribution, or duplication is
prohibited.
# THIS ANSYS SOFTWARE PRODUCT AND PROGRAM DOCUMENTATION INCLUDE TRADE SECRETS
AND ARE CONFIDENTIAL AND PROPRIETARY PRODUCTS OF ANSYS, INC., ITS SUBSIDIARIES, OR
LICENSORS. The software products and documentation are furnished by ANSYS, Inc., its subsidiaries,
or affiliates under a software license agreement that contains provisions concerning non-disclosure,
copying, length and nature of use, compliance with exporting laws, warranties, disclaimers,
limitations of liability, and remedies, and other provisions. The software products and
documentation may be used, disclosed, transferred, or copied only in accordance with the terms and
conditions of that software license agreement.
import sys
import clr
import os
from os import path
sys.path += [R"C:\Program Files\ANSYS Inc\v211\Optical Products\SPEOS\Bin"]
clr.AddReferenceToFile("Optis.Core_net.dll")
clr.AddReferenceToFile("Optis.Data_net.dll")
# References to Optis.Core and Optis.Data
import Optis.Core as OptisCore
import Optis.Data as OptisData
def GetAxisSystemData(iTime, iFrame):
dAxisSystemData = OptisCore.DAxisSystemData()
dAxisSystemData.Time = iTime
dAxisSystemData.Origin.Init(1000 * iFrame.Origin.X,
1000 * iFrame.Origin.Y,
1000 * iFrame.Origin.Z)
tmpVector = OptisCore.Vector3_double()
tmpVector.Init(iFrame.DirX.X,
iFrame.DirX.Y,
iFrame.DirX.Z)
tmpVector.Normalize()
dAxisSystemData.Direction_X.Init(tmpVector.Get(0),
tmpVector.Get(1),
tmpVector.Get(2))
tmpVector.Init(iFrame.DirY.X,
iFrame.DirY.Y,
iFrame.DirY.Z)
tmpVector.Normalize()
dAxisSystemData.Direction_Y.Init(tmpVector.Get(0),
tmpVector.Get(1),
tmpVector.Get(2))
return dAxisSystemData
# Working directory
workingDirectory = path.dirname(GetRootPart().Document.Path.ToString())
# SpaceClaim InputHelper
ihTrajectoryName = InputHelper.CreateTextBox("Trajectory.1", 'Trajectory name: ', 'Enter the name of the trajectory')
ihFrameFrequency = InputHelper.CreateTextBox(30, 'Timeline frame rate:', 'Set timeline frame rate (s-1)', ValueType.PositiveInteger)
ihReverseDirection = InputHelper.CreateCheckBox(False, "Reverse direction", "Reverse direction on trajectory")
ihObjectSpeed = InputHelper.CreateTextBox(50, 'Object speed:', 'Set the moving object speed (km/h)', ValueType.PositiveDouble)
ihCoordinateSystem = InputHelper.CreateSelection("Reference coordinate system", SelectionFilter.CoordinateSystem, 1, True)
ihTrajectory = InputHelper.CreateSelection("Trajectory curve", SelectionFilter.Curve, 1, True)
InputHelper.PauseAndGetInput('Trajectory parameters', ihTrajectoryName, ihFrameFrequency, ihObjectSpeed, ihReverseDirection, ihCoordinateSystem, ihTrajectory)
# Animation frame rate (s-1)
frameFrequency = float(ihFrameFrequency.Value)
# Object speed (km/h)
objectSpeed = float(ihObjectSpeed.Value)
# Trajectory file
trajectoryName = str(ihTrajectoryName.Value)
trajectoryAcquisitionFile = workingDirectory + "\\" + trajectoryName
# Reference coordinate system
coordSysSelection = ihCoordinateSystem.Value
trajectoryCoordSys = coordSysSelection.Items[0]
# Trajectory curve
trajCurveSelection = ihTrajectory.Value
trajectoryCurve = trajCurveSelection.Items[0]
# Reversed trajectory (Boolean)
isReversedTrajectory = ihReverseDirection.Value
# Acquisition of positions
def GetPositionOrientation(i_CoordSys, i_ReferenceCoordSys):
# change base of current position
newMatric = Matrix.CreateMapping(i_ReferenceCoordSys.Frame)
currentPosition = newMatric.Inverse * i_CoordSys.Frame.Origin
currentPosition = Point.Create(round(currentPosition.X, 6), round(currentPosition.Y, 6), round(currentPosition.Z, 6))
# change base of current iDirection
iDirectionX = newMatric.Inverse * i_CoordSys.Frame.DirX
# change base of current iDirection
jDirectionX = newMatric.Inverse *i_CoordSys.Frame.DirY
# Return new frame
return Frame.Create(currentPosition, iDirectionX, jDirectionX)
def MoveAlongTrajectory(i_trajectoryCoordSys, i_trajectoryCurve, i_isReversedTrajectory, i_frameFrequency, i_objectSpeed):
selectedCoordSys = Selection.Create(i_trajectoryCoordSys)
newselectedCoordSys = i_trajectoryCoordSys
pathLength = i_trajectoryCurve.Shape.Length
selectedCurve = Selection.Create(i_trajectoryCurve)
# Convert speed in m/s
convObjectSpeed = float(i_objectSpeed * 1000 / 3600)
currentPosition = 0.0
timeStamp = 0.0
positionTable = []
timeTable = []
while currentPosition < 1:
options = MoveOptions()
if currentPosition == 0:
options.Copy = True
else:
options.Copy = False
if i_isReversedTrajectory:
result = Move.AlongTrajectory(selectedCoordSys, selectedCurve, 1-currentPosition, options)
if currentPosition == 0:
newselectedCoordSys = result.GetCreated[ICoordinateSystem]()[0]
selectedCoordSys = Selection.Create(newselectedCoordSys)
if newselectedCoordSys.Frame.Origin != i_trajectoryCoordSys.Frame.Origin:
options.Copy = False
result = Move.AlongTrajectory(selectedCoordSys, selectedCurve, currentPosition, options)
else:
result = Move.AlongTrajectory(selectedCoordSys, selectedCurve, currentPosition, options)
if currentPosition == 0:
newselectedCoordSys = result.GetCreated[ICoordinateSystem]()[0]
selectedCoordSys = Selection.Create(newselectedCoordSys)
if newselectedCoordSys.Frame.Origin != i_trajectoryCoordSys.Frame.Origin:
options.Copy = False
result = Move.AlongTrajectory(selectedCoordSys, selectedCurve, currentPosition, options)
if(result):
movedFrame = GetPositionOrientation(newselectedCoordSys, i_trajectoryCoordSys)
positionTable.append(movedFrame)
timeTable.append(timeStamp)
currentPosition += (convObjectSpeed / i_frameFrequency)/pathLength
timeStamp += 1/float(i_frameFrequency)
result = Delete.Execute(selectedCoordSys)
return timeTable, positionTable
# Length of path (m)
pathLength = trajectoryCurve.Shape.Length
# Get time stamps and relative coordinate systems
timeTable, positionTable = MoveAlongTrajectory(trajectoryCoordSys, trajectoryCurve, isReversedTrajectory, frameFrequency, objectSpeed)
dAxisSystemData_Table = []
for time in timeTable:
timeIndex = timeTable.index(time)
fFrame = positionTable[timeIndex]
dAxisSystemData = GetAxisSystemData(time, fFrame)
dAxisSystemData_Table.append(dAxisSystemData)
if len(dAxisSystemData_Table) > 0:
dmTrajectory = OptisCore.DAxisSystemTrajectory()
dmTrajectory.Trajectory.Resize(len(dAxisSystemData_Table))
for dAxisSystemData in dAxisSystemData_Table:
dmTrajectory.Trajectory.Set(dAxisSystemData_Table.index(dAxisSystemData), dAxisSystemData)
pathTrajectoryFile = str(workingDirectory + "\\" + str(ihTrajectoryName.Value) + ".json")
strPathTrajectoryFile = OptisCore.String.From(pathTrajectoryFile)
pathTrajectoryFile = OptisCore.Path(strPathTrajectoryFile)
cAxisSystemTrajectoryWriter = OptisData.CAxisSystemTrajectoryWriter()
cAxisSystemTrajectoryWriter.Open(pathTrajectoryFile)
cAxisSystemTrajectoryWriter.Write(dmTrajectory)
cAxisSystemTrajectoryWriter.Close()