====== 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 ;