====== Mathematical Operators ======
The [[visual3d:documentation:pipeline:expressions:expressions_overview|Evaluate_Expression]] command can be used to evaluate arbitrary mathematical expressions. Use the following characters for your mathematical operators.
| **Arithmetic Operators** | [[#Plus|Plus ]] | [[#Minus|Minus]] | [[#Multiply|Multiply]] | [[#Divide|Divide]] | [[#Power|Power]] | |
| **Boolean Operators** | [[#Logical_Or|Logical OR]] | [[#Logical_And|Logical AND]] | [[#Using_the_Adjective_NOT|The Adjective NOT]] | | |
| **Comparison Operators** | [[#Equals|Equals]] | [[#Not_Equals|Not Equals]] | [[#Less_Than|Less Than]] | [[#Less_Than_Or_Equals|Less Than Or Equals]] | [[#Greater_Than|Greater Than]] | [[#Greater_Than_Or_Equals|Greater Than Or Equals]] |
Note: Visual3D parses the mathematical operators before it parses the signal names. If you have a signal name that contains a mathematical operator (e.g. R-Foot1), Visual3D will probably not be able to parse the equation expression properly.
==== Arithmetic Operators ====
Arithmetic operations can generally be performed using syntax that is similar to that found in a variety of programming and scripting languages.
=== Plus ===
Addition is accomplished using the + character. An alternative syntax is **add(a,b)** where a and b are expressions that evaluate to numbers.
NOTE: Pipeline command parameters use the + character as a delimiter. If the user wants to use an expression containing a + in a command parameter that allows multiple signals, then Visual3D will likely interpret this plus sign incorrectly. In this case the **add(a,b)** syntax should be used.
2 + 3 = 5
add(2,3) = 5
=== Minus ===
Subtraction is accomplished using the - character.
3 - 2 = 1
=== Multiply ===
Multiplication is accomplished using the * character.
3 * 2 = 6
=== Divide ===
Division is accomplished using the / character.
6 / 3 = 2
=== Power ===
Exponentiation is accomplished using the ^ character.
2^3 = 8
==== Boolean Operators ====
Boolean operators deal with boolean values, such as TRUE and FALSE. These are represented numerically as 1 (TRUE) and 0 (FALSE).
=== Logical OR ===
The Logical OR operator is signified by the | character. It takes two boolean values as input and returns TRUE if either of the input values is TRUE.
FALSE | FALSE = FALSE
FALSE | TRUE = TRUE
TRUE | FALSE = TRUE
TRUE | TRUE = FALSE
=== Logical AND ===
The Logical AND operator is signified by the & character. It takes two boolean values as input and returns TRUE when both input values are TRUE.
FALSE | FALSE = FALSE
FALSE | TRUE = FALSE
TRUE | FALSE = FALSE
TRUE | TRUE = FALSE
=== The Adjective NOT ===
The logical adjective NOT can be used with both the logical AND and logical OR operators. It takes one boolean value as input and negates that boolean value.
NOT(FALSE) = TRUE
NOT(TRUE) = FALSE
==Example==
Given a workspace containing 3 trials (*trial1.c3d, *trial2.c3d, and *trial3.c3d).
* All trials are assigned a TAG labeled WALK
* trial1.c3d is also assigned a TAG labeled BAD
Select_Active_File
/FILE_NAME=WALK
/QUERY=BAD
;
This command results in *trial1.c3d being active
Select_Active_File
/FILE_NAME=WALK
/QUERY=NOT(BAD)
;
This command results in *trial2.c3d and *trial3.c3d being active.
==== Comparison Operators ====
Comparison operators take two inputs of the same type and return a boolean value.
=== Equals ===
Equality is tested using either = or ==. It returns TRUE if the two inputs have the same value and FALSE if they do not.
==Example==
Consider a model metric that is defined as a string and compare it to an explicitly defined string.
Set_Model_Metric
! /CALIBRATION_FILE=
/METRIC_NAME=TEST
/METRIC_VALUE="TTT"
;
Evaluate_Expression**
/EXPRESSION=MODEL::METRIC::TEST="TTT"
/RESULT_NAME=SCOTT
/RESULT_TYPE=METRIC
! /RESULT_FOLDER=PROCESSED
;
The text strings are equal, so the resulting signal contains a 1 (indicating TRUE).
=== Not Equals ===
Non-equality is tested using either <> or ><. Its behaviour is opposite that of equality.
If (a==b) is TRUE then (a<>b) is FALSE. Similarly, if (a==b) is FALSE, then (a<>b) is TRUE.
=== Less Than ===
We can test is one value is less than another using the < character.
==Example==
Given two signals TARGET::ORIGINAL::RFT1 and TARGET::ORIGINAL::LFT1, use the Boolean operator < to identify when the Z component of RFT1 is less than the Z component of LFT1.
Evaluate_Expression
/EXPRESSION= TARGET::ORIGINAL::RFT1::Z < TARGET::ORIGINAL::LFT1::Z
/RESULT_NAME=RFT1_GREATER
/RESULT_TYPE=DERIVED
/RESULT_FOLDER=PROCESSED
;
The output signal will be 1 when RFT1::Z is less than LFT1::Z and 0 otherwise
==Example - Foot Clearance==
Heel and toe clearance are defined by two paths. It is possible to model "foot clearance" as the lower value of the heel and toe clearance values at each frame.
{{:heel_toe_clearance.jpg}}
Here is a simplified test of this. First, make the Global Workspace Active. Then, create 2 toy signals and calculate a third signal containing the lower value of the two toy signals.
Evaluate_Expression
/EXPRESSION=LIST(1,2,3,4,5)
! /SIGNAL_TYPES=
! /SIGNAL_FOLDER=ORIGINAL
! /SIGNAL_NAMES=
! /SIGNAL_COMPONENTS=
/RESULT_TYPES=DERIVED
/RESULT_FOLDERS=PROCESSED
/RESULT_NAME=SIGNAL1
! /APPLY_AS_SUFFIX_TO_SIGNAL_NAME=FALSE
;
Evaluate_Expression
/EXPRESSION=LIST(5,4,3,2,1)
! /SIGNAL_TYPES=
! /SIGNAL_FOLDER=ORIGINAL
! /SIGNAL_NAMES=
! /SIGNAL_COMPONENTS=
/RESULT_TYPES=DERIVED
/RESULT_FOLDERS=PROCESSED
/RESULT_NAME=SIGNAL2
! /APPLY_AS_SUFFIX_TO_SIGNAL_NAME=FALSE
;
!create a new signal that is the lower value of the two signals
Evaluate_Expression
/EXPRESSION=(DERIVED::PROCESSED::SIGNAL1<=DERIVED::PROCESSED::SIGNAL2)*DERIVED::PROCESSED::SIGNAL1
+(DERIVED::PROCESSED::SIGNAL2
{{:heel_toe_clearance2.jpg}}
=== Less Than Or Equals ===
This boolean operator uses one of the following syntaxes: <= or =<.
The expression (a <= b) is equivalent logically to ((a < b) | (a == b)).
==Example==
Given two signals TARGET::ORIGINAL::RFT1 and TARGET::ORIGINAL::LFT1, use the Boolean operator <= or the boolean operative =< to identify when the Z component of RFT1 is less than or equal to the Z component of LFT1.
Evaluate_Expression
/EXPRESSION= TARGET::ORIGINAL::RFT1::Z <= TARGET::ORIGINAL::LFT1::Z
/RESULT_NAME=RFT1_GREATER
/RESULT_TYPE=DERIVED
/RESULT_FOLDER=PROCESSED
;
The output signal will be 1 (indicating TRUE) when RFT1::Z is less than or equal to LFT1::Z and 0 (indicating FALSE) otherwise.
=== Greater Than ===
We can test is one value is less than another using the > character.
==Example==
Given two signals TARGET::ORIGINAL::RFT1 and TARGET::ORIGINAL::LFT1, use the Boolean operator > to identify when the Y component of RFT1 is greater than the Y component of LFT1.
Evaluate_Expression
/EXPRESSION= TARGET::ORIGINAL::RFT1::Y > TARGET::ORIGINAL::LFT1::Y
/RESULT_NAME=RFT1_GREATER
/RESULT_TYPE=DERIVED
/RESULT_FOLDER=PROCESSED
;
The output signal will be 1 (indicating TRUE) when RFT1::Y is greater than LFT1::Y and 0 (indicating FALSE) otherwise.
=== Greater Than Or Equals ===
This boolean operator uses one of the following syntaxes: >= or =>.
The expression (a >= b) is equivalent logically to ((a > b) | (a == b)).