Switch to side-by-side view

--- a
+++ b/Tools/ModelUtilities/KinematicLimits/RangeOfMotionLimits_template.any
@@ -0,0 +1,668 @@
+#ifndef _RANGE_OF_MOTION_LIMITS_TEMPLATE_ANY_
+#define _RANGE_OF_MOTION_LIMITS_TEMPLATE_ANY_
+/*
+---
+group: Utilities
+topic: Kinematic limits
+descr: |
+  Create joint limits as soft kinematic constraints
+  given some range of motion. 
+---
+
+To use these drivers import the file:
+#include "<AMMR_TOOLS>/ModelUtilities/kinematicLimits/RangeOfMotionLimits_template.any"
+
+See below for more information on how to use the class.
+
+*/
+
+#include "KinLimit_template.any"
+
+
+
+// The class creates a set of limits (soft kinematic constraints) 
+// for the human model given some range of motion. 
+// 
+// The class template should be used after the human model is included in the model.
+// This ensures that all the `BM_*` statements are defined. 
+// 
+// :::{note} Make sure the Limit drivers are included in your study. 
+// Otherwise they will have no effect. 
+// :::
+// 
+// :::{rubric} Example
+// :::
+// 
+// ```{code-block} AnyScriptDoc
+// 
+// RangeOfMotionLimits RoMLimits(
+//    ARM_RIGHT = BM_ARM_RIGHT,
+//    ARM_LEFT = BM_ARM_LEFT,
+//    LEG_RIGHT = BM_LEG_RIGHT,
+//    LEG_LEFT = BM_LEG_LEFT
+// ) = {
+//    // Example of changing af few of the limits:
+//    Limits.Trunk.PelvisThoraxExtension = {-90, 90};
+//    Limits.Right.ElbowPronation = {-90, 90};
+// }; 
+//       
+// ```
+// 
+// If some joint should not have a range of motion limits, the class accepts
+// arguments for disabling individual joint limits:
+// 
+// ```{code-block} AnyScriptDoc
+//   RangeOfMotionLimits RoMLimits(
+//     PELVIS_THORAX_LATERAL_BENDING = "Off"
+//     ... 
+// ```
+// 
+#class_template RangeOfMotionLimits (
+      ARM_RIGHT,
+      ARM_LEFT,
+      LEG_RIGHT,
+      LEG_LEFT,
+      PELVIS_THORAX_EXTENSION = "On",
+      PELVIS_THORAX_LATERAL_BENDING = "On",
+      PELVIS_THORAX_ROTATION = "On",
+      SKULL_THORAX_FLEXION = "On",
+      SKULL_THORAX_LATERALBENDING = "On",
+      SKULL_THORAX_ROTATION = "On",
+      STERNO_CLAVICULAR_PROTRACTION = "On",
+      STERNO_CLAVICULAR_ELEVATION = "On",
+      STERNO_CLAVICULAR_AXIALROTATION = "Off",
+      GLENOHUMERAL_FLEXION = "On",
+      GLENOHUMERAL_EXTERNAL_ROTATION = "On",
+      GLENOHUMERAL_ABDUCTION = "On",
+      ELBOW_FLEXION = "On",
+      ELBOW_PRONATION = "On",
+      WRIST_FLEXION = "On",
+      WRIST_ABDUCTION = "On",
+      HIP_ABDUCTION = "On",
+      HIP_FLEXION = "On",
+      HIP_EXTERNAL_ROTATION = "On",
+      KNEE_FLEXION = "On",
+      ANKLE_PLANTAR_FLEXION = "On",
+      SUBTALAR_EVERSION = "On",
+      HUMAN_MODEL = Main.HumanModel,
+)
+{
+
+   // Arguments
+   //--------------
+   //RangeOfMotionLimits#ARM_RIGHT
+   // Indicate if the right arm should be included in the limits. 
+   // Set this to BM_ARM_RIGHT to make it follow the body config
+   //RangeOfMotionLimits#ARM_LEFT
+   // Indicate if the left arm should be included in the limits.
+   // Set this to BM_ARM_LEFT to make it follow the body config
+   //RangeOfMotionLimits#LEG_RIGHT
+   // Indicate if the right leg should be included in the limits.
+   // Set this to BM_LEG_RIGHT to make it follow the body config
+   //RangeOfMotionLimits#LEG_LEFT
+   // Indicate if the left leg should be included in the limits.
+   // Set this to BM_LEG_LEFT to make it follow the body config
+   //RangeOfMotionLimits#PELVIS_THORAX_EXTENSION
+   // Enables/disables limits for the pelvis thorax extension
+   //RangeOfMotionLimits#PELVIS_THORAX_LATERAL_BENDING
+   // Enables/disables limits for the pelvis thorax lateral bending
+   //RangeOfMotionLimits#PELVIS_THORAX_ROTATION
+   // Enables/disables limits for the pelvis thorax rotation
+   //RangeOfMotionLimits#SKULL_THORAX_FLEXION
+   // Enables/disables limits for the skull thorax flexion
+   //RangeOfMotionLimits#SKULL_THORAX_LATERALBENDING
+   // Enables/disables limits for the skull thorax lateral bending
+   //RangeOfMotionLimits#SKULL_THORAX_ROTATION
+   // Enables/disables limits for the skull thorax rotation
+   //RangeOfMotionLimits#STERNO_CLAVICULAR_PROTRACTION
+   // Enables/disables limits for the sterno clavicular protraction
+   //RangeOfMotionLimits#STERNO_CLAVICULAR_ELEVATION
+   // Enables/disables limits for the sterno clavicular elevation
+   //RangeOfMotionLimits#STERNO_CLAVICULAR_AXIALROTATION
+   // Enables/disables limits for the sterno clavicular axial rotation
+   //RangeOfMotionLimits#GLENOHUMERAL_FLEXION
+   // Enables/disables limits for the glenohumeral flexion
+   //RangeOfMotionLimits#GLENOHUMERAL_EXTERNAL_ROTATION
+   // Enables/disables limits for the glenohumeral external rotation
+   //RangeOfMotionLimits#GLENOHUMERAL_ABDUCTION
+   // Enables/disables limits for the glenohumeral abduction
+   //RangeOfMotionLimits#ELBOW_FLEXION
+   // Enables/disables limits for the elbow flexion
+   //RangeOfMotionLimits#ELBOW_PRONATION
+   // Enables/disables limits for the elbow pronation
+   //RangeOfMotionLimits#WRIST_FLEXION
+   // Enables/disables limits for the wrist flexion
+   //RangeOfMotionLimits#WRIST_ABDUCTION
+   // Enables/disables limits for the wrist abduction
+   //RangeOfMotionLimits#HIP_ABDUCTION
+   // Enables/disables limits for the hip abduction
+   //RangeOfMotionLimits#HIP_FLEXION
+   // Enables/disables limits for the hip flexion
+   //RangeOfMotionLimits#HIP_EXTERNAL_ROTATION
+   // Enables/disables limits for the hip external rotation
+   //RangeOfMotionLimits#KNEE_FLEXION
+   // Enables/disables limits for the knee flexion
+   //RangeOfMotionLimits#ANKLE_PLANTAR_FLEXION
+   // Enables/disables limits for the ankle plantar flexion
+   //RangeOfMotionLimits#SUBTALAR_EVERSION
+   // Enables/disables limits for the subtalar eversion
+   //RangeOfMotionLimits#HUMAN_MODEL
+   // The human model to which the limits should be applied.
+
+      
+    AnyFolder Limits = 
+    {
+      AnyFolder Trunk = 
+      {
+         //RangeOfMotionLimits.Limits.Trunk
+         /// The limits for PelvisThoraxExtension
+         #var AnyVector PelvisThoraxExtension          = DesignVar({ -80, 30});
+         //RangeOfMotionLimits.Limits.Trunk
+         /// The limits for PelvisThoraxLateralBending
+         #var AnyVector PelvisThoraxLateralBending     = DesignVar({ -40, 40});
+         //RangeOfMotionLimits.Limits.Trunk
+         /// The limits for PelvisThoraxRotation
+         #var AnyVector PelvisThoraxRotation           = DesignVar({-90,  90});
+         //RangeOfMotionLimits.Limits.Trunk
+         /// The limits for SkullThoraxFlexion
+         #var AnyVector SkullThoraxFlexion             = DesignVar({-70,  70});
+         //RangeOfMotionLimits.Limits.Trunk
+         /// The limits for SkullThoraxLateralBending
+         #var AnyVector SkullThoraxLateralBending      = DesignVar({-60,  60});
+         //RangeOfMotionLimits.Limits.Trunk
+         /// The limits for SkullThoraxRotation
+         #var AnyVector SkullThoraxRotation            = DesignVar({-90,  90});
+      };
+      AnyFolder Right = 
+      {
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for SternoClavicularProtraction
+         #var AnyVector SternoClavicularProtraction    = DesignVar({-23-20,  -23+20});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for SternoClavicularElevation
+         #var AnyVector SternoClavicularElevation      = DesignVar({11.5-11.5,  11.5+70});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for SternoClavicularAxialRotation
+         #var AnyVector SternoClavicularAxialRotation  = DesignVar({-20-5,  -20+5});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for GlenohumeralFlexion
+         #var AnyVector GlenohumeralFlexion            = DesignVar({-70,  180});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for GlenohumeralAbduction
+         #var AnyVector GlenohumeralAbduction          = DesignVar({-5,  180});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for GlenohumeralExternalRotation
+         #var AnyVector GlenohumeralExternalRotation   = DesignVar({-50,  50});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for ElbowFlexion
+         #var AnyVector ElbowFlexion                   = DesignVar({0,  160});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for ElbowPronation
+         #var AnyVector ElbowPronation                 = DesignVar({-90,  90});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for WristFlexion
+         #var AnyVector WristFlexion                   = DesignVar({-90,  90});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for WristAbduction
+         #var AnyVector WristAbduction                 = DesignVar({-30,  30});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for HipFlexion
+         #var AnyVector HipFlexion                     = DesignVar({-30,  100});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for HipAbduction
+         #var AnyVector HipAbduction                   = DesignVar({-20,  45});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for HipExternalRotation
+         #var AnyVector HipExternalRotation            = DesignVar({-45,  60});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for KneeFlexion
+         #var AnyVector KneeFlexion                    = DesignVar({0,  160});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for AnklePlantarFlexion
+         #var AnyVector AnklePlantarFlexion            = DesignVar({-80,  40});
+         //RangeOfMotionLimits.Limits.Right
+         /// The limits for SubTalarEversion
+         #var AnyVector SubTalarEversion               = DesignVar({-40,  40});
+      };
+      AnyFolder Left = 
+      {
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for SternoClavicularProtraction
+         #var AnyVector SternoClavicularProtraction    = DesignVar({-23-20,  -23+20});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for SternoClavicularElevation
+         #var AnyVector SternoClavicularElevation      = DesignVar({11.5-11.5,  11.5+70});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for SternoClavicularAxialRotation
+         #var AnyVector SternoClavicularAxialRotation  = DesignVar({-20-5,  -20+5});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for GlenohumeralFlexion
+         #var AnyVector GlenohumeralFlexion            = DesignVar({-70,  180});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for GlenohumeralAbduction
+         #var AnyVector GlenohumeralAbduction          = DesignVar({-5,  180});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for GlenohumeralExternalRotation
+         #var AnyVector GlenohumeralExternalRotation   = DesignVar({-50,  50});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for ElbowFlexion
+         #var AnyVector ElbowFlexion                   = DesignVar({0,  160});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for ElbowPronation
+         #var AnyVector ElbowPronation                 = DesignVar({-90,  90});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for WristFlexion
+         #var AnyVector WristFlexion                   = DesignVar({-90,  90});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for WristAbduction
+         #var AnyVector WristAbduction                 = DesignVar({-30,  30});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for HipFlexion
+         #var AnyVector HipFlexion                     = DesignVar({-30,  100});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for HipAbduction
+         #var AnyVector HipAbduction                   = DesignVar({-20,  45});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for HipExternalRotation
+         #var AnyVector HipExternalRotation            = DesignVar({-45,  60});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for KneeFlexion
+         #var AnyVector KneeFlexion                    = DesignVar({0,  160});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for AnklePlantarFlexion
+         #var AnyVector AnklePlantarFlexion            = DesignVar({-80,  40});
+         //RangeOfMotionLimits.Limits.Left
+         /// The limits for SubTalarEversion
+         #var AnyVector SubTalarEversion               = DesignVar({-40,  40});
+      };
+      
+    };
+    
+
+            
+    AnyFolder& InterfaceRef = HUMAN_MODEL.BodyModel.Interface;
+    AnyFolder Trunk = 
+    {
+       #if PELVIS_THORAX_EXTENSION == "On" 
+       AnyFolder PelvisThoraxExtension = 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Trunk.PelvisThoraxExtension
+          ) =  { LowerLimit =...Limits.Trunk.PelvisThoraxExtension[0]; HighLimit = ...Limits.Trunk.PelvisThoraxExtension[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+
+       #if PELVIS_THORAX_LATERAL_BENDING == "On" 
+       AnyFolder PelvisThoraxLateralBending= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Trunk.PelvisThoraxLateralBending
+          ) =  { LowerLimit =...Limits.Trunk.PelvisThoraxLateralBending[0]; HighLimit = ...Limits.Trunk.PelvisThoraxLateralBending[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if PELVIS_THORAX_ROTATION == "On" 
+       AnyFolder PelvisThoraxRotation= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Trunk.PelvisThoraxRotation
+          ) =  { LowerLimit =...Limits.Trunk.PelvisThoraxRotation[0]; HighLimit = ...Limits.Trunk.PelvisThoraxRotation[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+             
+       #if SKULL_THORAX_FLEXION == "On" 
+       AnyFolder SkullThoraxFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Trunk.SkullThoraxFlexion
+          ) =  { LowerLimit =...Limits.Trunk.SkullThoraxFlexion[0]; HighLimit = ...Limits.Trunk.SkullThoraxFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+
+       #if SKULL_THORAX_LATERALBENDING == "On" 
+       AnyFolder SkullThoraxLateralBending= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Trunk.SkullThoraxLateralBending
+          ) =  { LowerLimit =...Limits.Trunk.SkullThoraxLateralBending[0]; HighLimit = ...Limits.Trunk.SkullThoraxLateralBending[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+
+       #if SKULL_THORAX_ROTATION == "On" 
+       AnyFolder SkullThoraxRotation= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Trunk.SkullThoraxRotation
+          ) =  { LowerLimit =...Limits.Trunk.SkullThoraxRotation[0]; HighLimit = ...Limits.Trunk.SkullThoraxRotation[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+
+    };
+     
+     
+     AnyFolder Right = 
+     {
+       
+#if ARM_RIGHT == 1
+       
+       #if STERNO_CLAVICULAR_PROTRACTION == "On" 
+       AnyFolder SternoClavicularProtraction= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.SternoClavicularProtraction
+          ) =  { LowerLimit =...Limits.Right.SternoClavicularProtraction[0]; HighLimit = ...Limits.Right.SternoClavicularProtraction[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+
+       #if STERNO_CLAVICULAR_ELEVATION == "On" 
+       AnyFolder SternoClavicularElevation = {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.SternoClavicularElevation
+          ) =  { LowerLimit =...Limits.Right.SternoClavicularElevation[0]; HighLimit = ...Limits.Right.SternoClavicularElevation[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if STERNO_CLAVICULAR_AXIALROTATION == "On" 
+       AnyFolder SternoClavicularAxialRotation= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.SternoClavicularAxialRotation
+          ) =  { LowerLimit =...Limits.Right.SternoClavicularAxialRotation[0]; HighLimit = ...Limits.Right.SternoClavicularAxialRotation[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if GLENOHUMERAL_FLEXION == "On" 
+       AnyFolder GlenohumeralFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.GlenohumeralFlexion
+          ) =  { LowerLimit =...Limits.Right.GlenohumeralFlexion[0]; HighLimit = ...Limits.Right.GlenohumeralFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if GLENOHUMERAL_ABDUCTION == "On" 
+       AnyFolder GlenohumeralAbduction= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.GlenohumeralAbduction
+          ) =  { LowerLimit =...Limits.Right.GlenohumeralAbduction[0]; HighLimit = ...Limits.Right.GlenohumeralAbduction[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if GLENOHUMERAL_EXTERNAL_ROTATION == "On" 
+       AnyFolder GlenohumeralExternalRotation= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.GlenohumeralExternalRotation
+          ) =  { LowerLimit =...Limits.Right.GlenohumeralExternalRotation[0]; HighLimit = ...Limits.Right.GlenohumeralExternalRotation[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if ELBOW_FLEXION == "On" 
+       AnyFolder ElbowFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.ElbowFlexion
+          ) =  { LowerLimit =...Limits.Right.ElbowFlexion[0]; HighLimit = ...Limits.Right.ElbowFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if ELBOW_PRONATION == "On" 
+       AnyFolder ElbowPronation= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.ElbowPronation
+          ) =  { LowerLimit =...Limits.Right.ElbowPronation[0]; HighLimit = ...Limits.Right.ElbowPronation[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if WRIST_FLEXION == "On" 
+       AnyFolder WristFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.WristFlexion
+          ) =  { LowerLimit =...Limits.Right.WristFlexion[0]; HighLimit = ...Limits.Right.WristFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+
+       #if WRIST_ABDUCTION == "On" 
+       AnyFolder WristAbduction= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.WristAbduction
+          ) =  { LowerLimit =...Limits.Right.WristAbduction[0]; HighLimit = ...Limits.Right.WristAbduction[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+#endif
+
+#if LEG_RIGHT
+
+       #if HIP_FLEXION == "On" 
+       AnyFolder HipFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.HipFlexion
+          ) =  { LowerLimit =...Limits.Right.HipFlexion[0]; HighLimit = ...Limits.Right.HipFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+  
+       #if HIP_ABDUCTION == "On" 
+       AnyFolder HipAbduction= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.HipAbduction
+          ) =  { LowerLimit =...Limits.Right.HipAbduction[0]; HighLimit = ...Limits.Right.HipAbduction[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+
+       #if HIP_EXTERNAL_ROTATION == "On" 
+       AnyFolder HipExternalRotation= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.HipExternalRotation
+          ) =  { LowerLimit =...Limits.Right.HipExternalRotation[0]; HighLimit = ...Limits.Right.HipExternalRotation[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if KNEE_FLEXION == "On" 
+       AnyFolder KneeFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.KneeFlexion
+          ) =  { LowerLimit =...Limits.Right.KneeFlexion[0]; HighLimit = ...Limits.Right.KneeFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if ANKLE_PLANTAR_FLEXION == "On" 
+       AnyFolder AnklePlantarFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.AnklePlantarFlexion
+          ) =  { LowerLimit =...Limits.Right.AnklePlantarFlexion[0]; HighLimit = ...Limits.Right.AnklePlantarFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+#endif
+
+       
+#if LEG_RIGHT
+       
+       #if SUBTALAR_EVERSION == "On" 
+       AnyFolder SubTalarEversion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Right.SubTalarEversion
+          ) =  { LowerLimit =...Limits.Right.SubTalarEversion[0]; HighLimit = ...Limits.Right.SubTalarEversion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+
+#endif
+
+
+     };//Right
+
+
+
+     AnyFolder Left = 
+     {
+       
+#if ARM_LEFT == 1
+       
+       #if STERNO_CLAVICULAR_PROTRACTION == "On" 
+       AnyFolder SternoClavicularProtraction= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.SternoClavicularProtraction
+          ) =  { LowerLimit =...Limits.Left.SternoClavicularProtraction[0]; HighLimit = ...Limits.Left.SternoClavicularProtraction[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+
+       #if STERNO_CLAVICULAR_ELEVATION == "On" 
+       AnyFolder SternoClavicularElevation = {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.SternoClavicularElevation
+          ) =  { LowerLimit =...Limits.Left.SternoClavicularElevation[0]; HighLimit = ...Limits.Left.SternoClavicularElevation[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if STERNO_CLAVICULAR_AXIALROTATION == "On" 
+       AnyFolder SternoClavicularAxialRotation= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.SternoClavicularAxialRotation
+          ) =  { LowerLimit =...Limits.Left.SternoClavicularAxialRotation[0]; HighLimit = ...Limits.Left.SternoClavicularAxialRotation[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if GLENOHUMERAL_FLEXION == "On" 
+       AnyFolder GlenohumeralFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.GlenohumeralFlexion
+          ) =  { LowerLimit =...Limits.Left.GlenohumeralFlexion[0]; HighLimit = ...Limits.Left.GlenohumeralFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if GLENOHUMERAL_ABDUCTION == "On" 
+       AnyFolder GlenohumeralAbduction= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.GlenohumeralAbduction
+          ) =  { LowerLimit =...Limits.Left.GlenohumeralAbduction[0]; HighLimit = ...Limits.Left.GlenohumeralAbduction[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if GLENOHUMERAL_EXTERNAL_ROTATION == "On" 
+       AnyFolder GlenohumeralExternalRotation= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.GlenohumeralExternalRotation
+          ) =  { LowerLimit =...Limits.Left.GlenohumeralExternalRotation[0]; HighLimit = ...Limits.Left.GlenohumeralExternalRotation[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if ELBOW_FLEXION == "On" 
+       AnyFolder ElbowFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.ElbowFlexion
+          ) =  { LowerLimit =...Limits.Left.ElbowFlexion[0]; HighLimit = ...Limits.Left.ElbowFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if ELBOW_PRONATION == "On" 
+       AnyFolder ElbowPronation= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.ElbowPronation
+          ) =  { LowerLimit =...Limits.Left.ElbowPronation[0]; HighLimit = ...Limits.Left.ElbowPronation[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if WRIST_FLEXION == "On" 
+       AnyFolder WristFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.WristFlexion
+          ) =  { LowerLimit =...Limits.Left.WristFlexion[0]; HighLimit = ...Limits.Left.WristFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+
+       #if WRIST_ABDUCTION == "On" 
+       AnyFolder WristAbduction= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.WristAbduction
+          ) =  { LowerLimit =...Limits.Left.WristAbduction[0]; HighLimit = ...Limits.Left.WristAbduction[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+#endif
+
+#if LEG_LEFT
+
+       #if HIP_FLEXION == "On" 
+       AnyFolder HipFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.HipFlexion
+          ) =  { LowerLimit =...Limits.Left.HipFlexion[0]; HighLimit = ...Limits.Left.HipFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+  
+       #if HIP_ABDUCTION == "On" 
+       AnyFolder HipAbduction= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.HipAbduction
+          ) =  { LowerLimit =...Limits.Left.HipAbduction[0]; HighLimit = ...Limits.Left.HipAbduction[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+
+       #if HIP_EXTERNAL_ROTATION == "On" 
+       AnyFolder HipExternalRotation= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.HipExternalRotation
+          ) =  { LowerLimit =...Limits.Left.HipExternalRotation[0]; HighLimit = ...Limits.Left.HipExternalRotation[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if KNEE_FLEXION == "On" 
+       AnyFolder KneeFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.KneeFlexion
+          ) =  { LowerLimit =...Limits.Left.KneeFlexion[0]; HighLimit = ...Limits.Left.KneeFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+       
+       #if ANKLE_PLANTAR_FLEXION == "On" 
+       AnyFolder AnklePlantarFlexion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.AnklePlantarFlexion
+          ) =  { LowerLimit =...Limits.Left.AnklePlantarFlexion[0]; HighLimit = ...Limits.Left.AnklePlantarFlexion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+#endif
+
+       
+#if LEG_LEFT
+       
+       #if SUBTALAR_EVERSION == "On" 
+       AnyFolder SubTalarEversion= 
+       {
+          KinLimitsDriver Driver(
+             KinMeasure= ...InterfaceRef.Left.SubTalarEversion
+          ) =  { LowerLimit =...Limits.Left.SubTalarEversion[0]; HighLimit = ...Limits.Left.SubTalarEversion[1]; MeasureConversion=180/pi; };
+       };
+       #endif
+
+#endif
+       
+
+     };//Left   
+ };
+     
+#endif