# Marker

Model ElementMarker defines an orthonormal, right-handed coordinate system and reference frame in MotionSolve. A Marker must belong to a part. The body can be any type: rigid, flexible, or point.

Marker

## Description

The Newtonian reference frame (Ground) is considered to be a special case of a rigid PART.

## Attribute Summary

Name Property Modifiable by command? Designable?
id Int ()
label Str ()
part Reference (Part)   Yes
point_mass Reference (PointMass)   Yes
flex_body Reference (FlexBody)   Yes
body Reference (Body) # Alias Yes Yes
qp Location (Point(), required=True) Yes Yes
zp Location () Yes Yes
xp Location () Yes Yes
xv Location()   Yes
zv Location()   Yes
reuler Angles () Yes Yes
floating Bool ()
rm Reference ("Marker")
node Int ()
usexp Bool ()
usexv Bool ()
routine Routine ()

## Usage

#1: Defined completely in the input file
Marker (body=objBody, optional_attributes)

#2: Defined in a compiled user-written subroutine
Marker (body=objBody, function=userString, routine=string, optional_attributes)

#3: Defined in a Python script
Marker (body=objBody, function=userString, routine=functionPointer, optional_attributes)

## Attributes

Attributes Defined Completely in the Input File
body
Reference to an existing Part, PointMass or FlexBody object
Specifies an already existing PART, POINT_MASS or FLEX_BODY object to which the Marker belongs.
The body attribute is mandatory
qp
A Location object or a list of 3 doubles
Specifies the coordinates of the origin of the Marker in the RM Marker coordinate system.
The qp attribute is optional. When not specified, it is assumed to be coincident with the global origin, i.e. (0, 0, 0).
zp
A Location object or a list of 3 doubles
Specifies the coordinates of a point on the z-axis of the Marker in the RM Marker coordinate system.
The zp attribute is optional. When not specified, the point is assumed to be on the z-axis of the RM Marker.
The zp/xp attribute is exclusive to zv, xv, reuler, and function. Only one of them may be specified.
xp
A Location object or a list of 3 doubles.
Specifies the coordinates of a point on the x-axis of the Marker in the RM Marker coordinate system.
The xp attribute is optional. When not specified, the point is assumed to be on the x-axis of the RM Marker.
The zp/xp attribute is exclusive to zv, xv, reuler, and function. Only one of them may be specified.
usexp
Boolean
The usexp attribute is optional.
• When usexp is set to "TRUE", the x-axis of the Marker is calculated first using the QP and XP values. Then the z-axis is computed using QP and ZP such that it is orthonormal to the x-axis. Lastly, the y-axis is computed using the right-hand rule.
• When usexp is set to "FALSE" or it is not defined, the z-axis of the Marker is calculated first using the QP and ZP values. Then the x-axis is computed using QP and XP such that it is orthonormal to the z-axis. Lastly, the y-axis is computed using the right-hand rule.
zv
A Location object or a list of 3doubles.
Specifies the z axis direction of the Marker in the RM Marker coordinate system.
The zv attribute is optional. When not specified, the z-axis of the RM Marker will be used.
The zv/xv attributes are exclusive to zp, xp, reuler and function. Only one of them may be specified.
xv
A Location object or a list of 3doubles.
Specifies the x-axis direction of the Marker in the RM Marker coordinate system.
The xv attribute is optional. When not specified, the x-axis of the RM Marker will be used.
The zv/xv attribute is exclusive to zp, xp, reuler, and function. Only one of them may be specified.
usexv
Boolean.
The usexv attribute is optional.
• When usexv is set to "TRUE", the x-axis of the Marker is calculated first using xv. Then, the z-axis is computed using zv such that it is orthonormal to the x-axis. Lastly, the y-axis is computed using the right-hand rule.
• When usexv is set to "FALSE" or it is not defined, the z-axis of the Marker is calculated first using zv. Then, the x-axis is computed using xv such that it is orthonormal to the z-axis. Lastly, the y-axis is computed using the right-hand rule.
reuler
A list of 3 doubles
Specifies the body-fixed 3-1-3 Euler angles, in radians, of the Marker with respect to the RM Marker.
The reuler attribute is optional. When not specified, it is assumed to be (0,0,0). In other words, the Marker has the same orientation as the RM Marker.
The reuler attribute is exclusive to zv/xv, zp/xp, and function. Only one of them may be specified.
Attributes Defined in a Compiled User-written Subroutine
body
Reference to an existing Part, PointMass or FlexBody object
Specifies an already existing PART, POINT_MASS or FLEX_BODY object to which the Marker belongs.
The body attribute is mandatory
function
String
The list of parameters that are passed from the data file to the user-defined subroutine.
The function attribute is mandatory
routine
String
Specifies an alternative name for the user subroutine. The name consists of two pieces of information, separated by "::". The first is the pathname to the shared library containing the function that computes the response of the user-defined Surface. The second is the name of the function in the shared library that does the computation.
An example is: routine="/staff/Altair/engine.dll::myMarker"
• "/staff/Altair/ engine.dll is the dll
• myMarker" is the function within this DLL that performs the calculations
The attribute routine is optional.
When not specified, routine defaults to MARKER_READ.
When function is specified, but routine is not, routine defaults to MARKER_READ.
Attributes Defined in a Python Script
body
Reference to an existing Part, PointMass or FlexBody object
Specifies an already existing PART, POINT_MASS or FLEX_BODY object to which the Marker belongs.
The body attribute is mandatory
function
String
The list of parameters that are passed from the data file to the user-defined subroutine.
The function attribute is mandatory
routine
Pointer to a callable function in Python
An example is: routine=myMarker
• myMarker is a Python function or method that can be called from wherever the model resides.
The attribute routine is optional.
When not specified, routine defaults to MARKER_READ.
Optional Attributes Available to all Methods
id
Integer
Specifies the element identification number. This number must be unique among all the Marker objects in the model.
This attribute is optional. MotionSolve will automatically create an ID when one is not specified.
Range of values: id > 0
label
String
Specifies the name of the Marker object.
This attribute is optional. When not specified, MotionSolve will create a label for you.
rm
Reference to an existing Marker
Defines the reference coordinate system in which the MARKER location and orientation are described.
If you want to specify the position and orientation of the MARKER in the global reference frame, use RM=0.
The rm attribute is optional. When not specified, the position and orientation of the MARKER is assumed to be with respect to the LPRF of the hosting body.
floating
Boolean
Specifies whether the MARKER is a floating marker or not.
The attribute floating is optional. When not specified it is set to "FALSE".
node
Integer
Specifies the node on the flexible body to which the MARKER is attached.
The node attribute is required only when a Marker is to be placed oat a node on a flexible body. It is not to be used for rigid bodies or point mass bodies.

## Examples

Define a marker on a rigid part p1000.
m1012 = Marker (id=1012, label="marker 1012", body=p1000, qp=[1.414,3.142,1.618],
zp=[101.327,3.142,-2.545], xp=[1.414, 3.142, 101.618])
Define a Marker at the LPRF of part p30303 with the same orientation as the LPRF.
m30303 = Marker (label="joint 3-marker-i", body=p30303)
Define a Marker on Part p30102 in a user written function, MARKER_READ, written in Python.
m30102040 = Marker (id=30102040, label="Marker 2", body=p30102, function="user(1, -0.5, 0.3, 0., 1.57079633, 1.57079633, -1.57079633)",
routine=marker_read)
The script marker_read.py is defined below:
def marker_read (id, par, npar):
eflg = 0
errflg = 0
r = 3*[0.0]
angle = 6*[0.0]
angle_type = int(par[0])
r[0] = par[1]
r[1] = par[2]
r[2] = par[3]
if angle_type==0: # DCMTX
angle[0] = par[4]
angle[1] = par[5]
angle[2] = par[6]
angle[3] = par[7]
angle[4] = par[8]
angle[5] = par[9]
elif (angle_type == 1) | (angle_type == 2): # Euler angles (313 or YPR)
angle[0] = par[4]
angle[1] = par[5]
angle[2] = par[6]
elif angle_type == 3: # Euler parameters
angle[0] = par[4]
angle[1] = par[5]
angle[2] = par[6]
angle[3] = par[7]
else:
errflg = 1;
return errflg
eflg = py_put_marker(id, r, angle_type, angle)
return errflg
Define a Marker whose location is dependent on design variables.
# DVs_
qpx = Dv (label="X coordinate of Point B", b=40)
qpy = Dv (label="Y coordinate of Point B", b=200)
qpz = Dv (label="Z coordinate of Point B", b=350)

# QP
qp = [qpx, qpy, qpz]

# ZP is along x-axis
zp = [qpx+10, qpy, qpz]

# XP is along z-axis
xp = [qpx, qpy, qpz+10]

# Now define the Marker and hold it in the Python variable markerB
markerB = Marker (body=p1, qp=qp, zp=zp, xp=xp, label="markerB")
Define a Marker, m2, whose location and orientation is the same as another, m1.
m2 = Marker (body=p2, qp=m1.qp, zp=m1.zp, xp=m1.xp, label="m2")