====== Shift Force Platform Corners Using a Meta-command ======
One of our customers noted that all force platforms were shifted in space by a measurable amount. It is certainly possible to modify each corner location by computing the required new corner locations, but this seemed like an interesting challenge for a meta-command. The command could be made more elegant (and more general), but this seemed a good compromise as an example.
**Note:** This meta-command example assumes that there are 3 force platforms, and that each of the corners will be shifted consistently by a shift in the x, y, and z components by (100,200,300).
The meta-command listed below can be called from this Visual3D script:
FP_CORNER_SHIFT
/FP_NUMBERS=1+2+3
/X_SHIFT=100
/Y_SHIFT=200
/Z_SHIFT=300
;
The following Meta Command can be Cut-and-Paste into a file named **FP_CORNER_SHIFT.v3m**
! BEGIN_META
! META_CMD_NAME=FP_CORNER_SHIFT
! META_PARAM= FP_NUMBERS : string ::yes
! META_PARAM= X_SHIFT : string ::yes
! META_PARAM= Y_SHIFT : string ::yes
! META_PARAM= Z_SHIFT : string ::yes
! END_META
! ----------------------------------------
! Create a METRIC signal containing the
! force platform parameter corners
! ----------------------------------------
Metric_From_Parameter
/METRIC_NAME=C3D_CORNERS
/PARAMETER_GROUP=FORCE_PLATFORM
/PARAMETER_NAME=CORNERS
;
! -------------------------------
! create an offset to be used
! when parsing the corners metric
! -------------------------------
Metric_Explicit
/RESULT_METRIC_NAME=OFFSET
/RESULT_METRIC_FOLDER=CORNERS
/METRIC_VALUE=0
;
! ------------------------------------
! Create a vector containing the shift
! ------------------------------------
Metric_Explicit
/RESULT_METRIC_NAME=SHIFT
/RESULT_METRIC_FOLDER=CORNERS
/METRIC_VALUE=::X_SHIFT&+&::Y_SHIFT&+&::Z_SHIFT
;
! -------------------------------
! clean up some temporary signals
! -------------------------------
Remove_Signals
/SIGNAL_TYPES=METRIC+METRIC+METRIC+METRIC
/SIGNAL_NAMES=CORNER1+CORNER2+CORNER3+CORNER4
/SIGNAL_FOLDER=CORNERS+CORNERS+CORNERS+CORNERS
';
Remove_Signals
/SIGNAL_TYPES=METRIC+METRIC+METRIC+METRIC
/SIGNAL_NAMES=C1+C2+C3+C4
/SIGNAL_FOLDER=CORNERS+CORNERS+CORNERS+CORNERS
;
! ------------------------------------------
! Loop over the input Force Platform numbers
! ------------------------------------------
For_Each
/ITERATION_PARAMETER_NAME=INDEX
/ITEMS=::FP_NUMBERS
;
! ------------------------------
! Extract Corner values
! append the values from each FP
! ------------------------------
Evaluate_Expression
/EXPRESSION=VECTOR(METRIC::PROCESSED::C3D_CORNERS[(1+METRIC::CORNERS::OFFSET)],METRIC::PROCESSED::C3D_CORNERS[2+METRIC::CORNERS::OFFSET],METRIC::PROCESSED::C3D_CORNERS[3+METRIC::CORNERS::OFFSET])
/RESULT_NAME=TEMP
/RESULT_TYPE=METRIC
/RESULT_FOLDER=CORNERS
;
Metric_Mean
/RESULT_METRIC_NAME=CORNER1
! /APPLY_AS_SUFFIX_TO_SIGNAL_NAME=FALSE
/RESULT_METRIC_FOLDER=CORNERS
/SIGNAL_TYPES=METRIC
/SIGNAL_NAMES=TEMP
/SIGNAL_FOLDER=CORNERS
! /SIGNAL_COMPONENTS=ALL_COMPONENTS
/EVENT_SEQUENCE=
/EXCLUDE_EVENTS=
/GENERATE_MEAN_AND_STDDEV=FALSE
/APPEND_TO_EXISTING_VALUES=TRUE
;
Evaluate_Expression
/EXPRESSION=VECTOR(METRIC::PROCESSED::C3D_CORNERS[(4+METRIC::CORNERS::OFFSET)],METRIC::PROCESSED::C3D_CORNERS[5+METRIC::CORNERS::OFFSET],METRIC::PROCESSED::C3D_CORNERS[6+METRIC::CORNERS::OFFSET])
/RESULT_NAME=TEMP
/RESULT_TYPE=METRIC
/RESULT_FOLDER=CORNERS
;
Metric_Mean
/RESULT_METRIC_NAME=CORNER2
! /APPLY_AS_SUFFIX_TO_SIGNAL_NAME=FALSE
/RESULT_METRIC_FOLDER=CORNERS
/SIGNAL_TYPES=METRIC
/SIGNAL_NAMES=TEMP
/SIGNAL_FOLDER=CORNERS
! /SIGNAL_COMPONENTS=ALL_COMPONENTS
/EVENT_SEQUENCE=
/EXCLUDE_EVENTS=
/GENERATE_MEAN_AND_STDDEV=FALSE
/APPEND_TO_EXISTING_VALUES=TRUE
;
Evaluate_Expression
/EXPRESSION=VECTOR(METRIC::PROCESSED::C3D_CORNERS[(7+METRIC::CORNERS::OFFSET)],METRIC::PROCESSED::C3D_CORNERS[8+METRIC::CORNERS::OFFSET],METRIC::PROCESSED::C3D_CORNERS[9+METRIC::CORNERS::OFFSET])
/RESULT_NAME=TEMP
/RESULT_TYPE=METRIC
/RESULT_FOLDER=CORNERS
;
Metric_Mean
/RESULT_METRIC_NAME=CORNER3
! /APPLY_AS_SUFFIX_TO_SIGNAL_NAME=FALSE
/RESULT_METRIC_FOLDER=CORNERS
/SIGNAL_TYPES=METRIC
/SIGNAL_NAMES=TEMP
/SIGNAL_FOLDER=CORNERS
! /SIGNAL_COMPONENTS=ALL_COMPONENTS
/EVENT_SEQUENCE=
/EXCLUDE_EVENTS=
/GENERATE_MEAN_AND_STDDEV=FALSE
/APPEND_TO_EXISTING_VALUES=TRUE
;
Evaluate_Expression
/EXPRESSION=VECTOR(METRIC::PROCESSED::C3D_CORNERS[(10+METRIC::CORNERS::OFFSET)],METRIC::PROCESSED::C3D_CORNERS[11+METRIC::CORNERS::OFFSET],METRIC::PROCESSED::C3D_CORNERS[12+METRIC::CORNERS::OFFSET])
/RESULT_NAME=TEMP
/RESULT_TYPE=METRIC
/RESULT_FOLDER=CORNERS
;
Metric_Mean
/RESULT_METRIC_NAME=CORNER4
! /APPLY_AS_SUFFIX_TO_SIGNAL_NAME=FALSE
/RESULT_METRIC_FOLDER=CORNERS
/SIGNAL_TYPES=METRIC
/SIGNAL_NAMES=TEMP
/SIGNAL_FOLDER=CORNERS
! /SIGNAL_COMPONENTS=ALL_COMPONENTS
/EVENT_SEQUENCE=
/EXCLUDE_EVENTS=
/GENERATE_MEAN_AND_STDDEV=FALSE
/APPEND_TO_EXISTING_VALUES=TRUE
;
! ------------------------------------------------------
! increment the offset for parsing the Corner parameters
! ------------------------------------------------------
Add_Constant_To_Signals
/SIGNAL_TYPES=METRIC
/SIGNAL_NAMES=OFFSET
/SIGNAL_FOLDER=CORNERS
/RESULT_NAMES=OFFSET
/RESULT_FOLDER=CORNERS
! /RESULT_SUFFIX=
! /SIGNAL_COMPONENTS=
/CONSTANT=12
;
End_For_Each
/ITERATION_PARAMETER_NAME=INDEX
;
! --------------------------------------
! add the offsets to each of the corners
! --------------------------------------
Add_Signals
/SIGNAL_TYPES=METRIC+METRIC
/SIGNAL_NAMES=CORNER1+SHIFT
/SIGNAL_FOLDER=CORNERS+CORNERS
/RESULT_NAME=C1
/RESULT_FOLDER=CORNERS
;
Add_Signals
/SIGNAL_TYPES=METRIC+METRIC
/SIGNAL_NAMES=CORNER2+SHIFT
/SIGNAL_FOLDER=CORNERS+CORNERS
/RESULT_NAME=C2
/RESULT_FOLDER=CORNERS
;
Add_Signals
/SIGNAL_TYPES=METRIC+METRIC
/SIGNAL_NAMES=CORNER3+SHIFT
/SIGNAL_FOLDER=CORNERS+CORNERS
/RESULT_NAME=C3
/RESULT_FOLDER=CORNERS
;
Add_Signals
/SIGNAL_TYPES=METRIC+METRIC
/SIGNAL_NAMES=CORNER4+SHIFT
/SIGNAL_FOLDER=CORNERS+CORNERS
/RESULT_NAME=C4
/RESULT_FOLDER=CORNERS
;
! ------------------------------------------------
! create pipeline parameters to be used
! for the modify_force_platform_parameters command
! ------------------------------------------------
Set_Pipeline_Parameter_To_Data_Value
/PARAMETER_NAME=C1
/SIGNAL_TYPES=METRIC
/SIGNAL_NAMES=C1
/SIGNAL_FOLDER=CORNERS
! /SIGNAL_COMPONENTS=ALL_COMPONENTS
;
Set_Pipeline_Parameter_To_Data_Value
/PARAMETER_NAME=C2
/SIGNAL_TYPES=METRIC
/SIGNAL_NAMES=C2
/SIGNAL_FOLDER=CORNERS
! /SIGNAL_COMPONENTS=ALL_COMPONENTS
;
Set_Pipeline_Parameter_To_Data_Value
/PARAMETER_NAME=C3
/SIGNAL_TYPES=METRIC
/SIGNAL_NAMES=C3
/SIGNAL_FOLDER=CORNERS
! /SIGNAL_COMPONENTS=ALL_COMPONENTS
;
Set_Pipeline_Parameter_To_Data_Value
/PARAMETER_NAME=C4
/SIGNAL_TYPES=METRIC
/SIGNAL_NAMES=C4
/SIGNAL_FOLDER=CORNERS
! /SIGNAL_COMPONENTS=ALL_COMPONENTS
;
! ----------------------------------
! Modify the corners
! not that FP_USED must be specified
! ----------------------------------
Modify_Force_Platform_Parameters
/FP_USED=3
/FP_CORNER1=::C1
/FP_CORNER2=::C2
/FP_CORNER3=::C3
/FP_CORNER4=::C4
;
! -------------------------------
! clean up some temporary signals
! -------------------------------
Remove_Signals
/SIGNAL_TYPES=METRIC+METRIC+METRIC+METRIC
/SIGNAL_NAMES=CORNER1+CORNER2+CORNER3+CORNER4
/SIGNAL_FOLDER=CORNERS+CORNERS+CORNERS+CORNERS
;
Remove_Signals
/SIGNAL_TYPES=METRIC+METRIC+METRIC+METRIC
/SIGNAL_NAMES=C1+C2+C3+C4
/SIGNAL_FOLDER=CORNERS
;