430 lines (406 with data), 16.5 kB
#define Macro_DrawRedBall(_TARGETNODENAME_, _DRAWOBJECTNAME_) _TARGETNODENAME_ = { AnyDrawNode _DRAWOBJECTNAME_ = { RGB = {1, 0, 0}; Opacity = 0.5; ScaleXYZ = 0.015*{1, 1, 1}; }; };
#define Macro_DrawGreenBall(_TARGETNODENAME_, _DRAWOBJECTNAME_) _TARGETNODENAME_ = { AnyDrawNode _DRAWOBJECTNAME_ = { RGB = {0, 1, 0}; Opacity = 0.5; ScaleXYZ = 0.015*{1, 1, 1}; }; };
#define Macro_DrawBlueBall(_TARGETNODENAME_, _DRAWOBJECTNAME_) _TARGETNODENAME_ = { AnyDrawNode _DRAWOBJECTNAME_ = { RGB = {0, 0, 1}; Opacity = 0.5; ScaleXYZ = 0.015*{1, 1, 1}; }; };
#class_template ClassDefineHumanEnvironmentConnection(
UserInputConnectionType,
UserInputHumanSegType, AnyFolder& UserInputRefHumanSeg, UserInputHumanSegSingleConnectiontNodeName,
AnyRefFrame& UserInputTargetName, UserInputTargetNormalDir,
UserInputApplyingForceOnOff, UserInputApplyingForceNodeName, UserInputUseGlobalApplyingForceOnOff,
UserInputCalcReacOnOff, UserInputCalcReacNodesNumber)
{
#var AnyVec3 UserInputConnectNodeInHumanSeg_Offset_sRel = {0, 0, 0};
#var AnyMat33 UserInputConnectNodeInHumanSeg_Offset_ARel = {{1,0,0},{0,1,0},{0,0,1}};
#var AnyVec3 sRel_ConnectNodeInHumanSeg = UserInputRefHumanSeg.UserInputHumanSegSingleConnectiontNodeName.sRel + UserInputConnectNodeInHumanSeg_Offset_sRel ;
#var AnyMat33 ARel_ConnectNodeInHumanSeg = UserInputRefHumanSeg.UserInputHumanSegSingleConnectiontNodeName.ARel * UserInputConnectNodeInHumanSeg_Offset_ARel ;
#if UserInputApplyingForceOnOff == 1
#var AnyVec3 sRel_ApplyingForceNodeInHumanSeg = UserInputRefHumanSeg.UserInputApplyingForceNodeName.sRel ;
#var AnyMat33 ARel_ApplyingForceNodeInHumanSeg = UserInputRefHumanSeg.UserInputApplyingForceNodeName.ARel ;
#endif
AnyFolder &DrawRef=Main.DrawSettings;
#var AnyVec3 UserInputApplyingForce = {0, 0, 0};
#var AnyVec3 UserInputApplyingMoment = {0, 0, 0};
#var AnyVar UserInputReacVolumeHeightLimitLow = -0.05 ;
#var AnyVar UserInputReacVolumeHeightLimitHigh = 0.05 ;
#var AnyVar UserInputReacVolumeRadiusLimit = 0.1 ;
#var AnyVar UserInputReacForceFrictionCoeff = 0.5;
#var AnyVar UserInputReacForceMaxStrength = 3000;
#var AnyVar UserInputReacForceVisualScaleFactor = 1;
//-->Definitions of the single connection node(which position can be adjustable) and the applying force node inside the human segment
UserInputRefHumanSeg =
{
#if UserInputConnectionType != "None"
AnyRefNode ITF_ConnectNode =
{
sRel = ..sRel_ConnectNodeInHumanSeg ;
ARel = ..ARel_ConnectNodeInHumanSeg ;
AnyDrawRefFrame drw =
{
ScaleXYZ = 0.05*{1, 1, 1};
RGB = {0, 1, 0};
};
};
#endif
#if UserInputApplyingForceOnOff == 1
AnyRefNode ITF_ApplyingForceNode =
{
sRel = ..sRel_ApplyingForceNodeInHumanSeg ;
ARel = ..ARel_ApplyingForceNodeInHumanSeg ;
};
Macro_DrawRedBall(ITF_ApplyingForceNode, DrwRedBall)
#endif
};
//<--
//-->Definitions of the human segment connection nodes(predefined anatomical nodes) according to different connection types and human segment types
//-->Hand
#if UserInputHumanSegType == "Hand"
#if UserInputConnectionType == "BallJoint"
AnyRefFrame& HumanSegConnectNode1 = UserInputRefHumanSeg.ITF_ConnectNode;
#endif
#if UserInputConnectionType == "RevoluteJoint"
AnyRefFrame& HumanSegConnectNode1 = UserInputRefHumanSeg.ITF_ConnectNode;
#endif
#if UserInputConnectionType == "FixJoint"
AnyRefFrame& HumanSegConnectNode1 = UserInputRefHumanSeg.ITF_ConnectNode;
#endif
#if UserInputConnectionType == "2PointsOnLine"
AnyRefFrame& HumanSegConnectNode1 = UserInputRefHumanSeg.PalmLateralContactNode;
AnyRefFrame& HumanSegConnectNode2 = UserInputRefHumanSeg.PalmMedialContactNode;
#endif
#if UserInputConnectionType == "3PointsOnPlane"
AnyRefFrame& HumanSegConnectNode1 = UserInputRefHumanSeg.PalmLateralContactNode;
AnyRefFrame& HumanSegConnectNode2 = UserInputRefHumanSeg.PalmMedialContactNode;
AnyRefFrame& HumanSegConnectNode3 = UserInputRefHumanSeg.WristContactNode;
#endif
#endif
//<--Hand
//-->Foot
#if UserInputHumanSegType == "Foot"
#if UserInputConnectionType == "BallJoint"
//AnyRefFrame& HumanSegConnectNode1 = UserInputRefHumanSeg.ITF_ConnectNode;
#endif
#if UserInputConnectionType == "RevoluteJoint"
//AnyRefFrame& HumanSegConnectNode1 = UserInputRefHumanSeg.ITF_ConnectNode;
#endif
#if UserInputConnectionType == "FixJoint"
//AnyRefFrame& HumanSegConnectNode1 = UserInputRefHumanSeg.ITF_ConnectNode;
#endif
#if UserInputConnectionType == "2PointsOnLine"
//AnyRefFrame& HumanSegConnectNode1 = UserInputRefHumanSeg.PalmLateralContactNode;
//AnyRefFrame& HumanSegConnectNode2 = UserInputRefHumanSeg.PalmMedialContactNode;
#endif
#if UserInputConnectionType == "3PointsOnPlane"
//AnyRefFrame& HumanSegConnectNode1 = UserInputRefHumanSeg.PalmLateralContactNode;
//AnyRefFrame& HumanSegConnectNode2 = UserInputRefHumanSeg.PalmMedialContactNode;
//AnyRefFrame& HumanSegConnectNode3 = UserInputRefHumanSeg.WristContactNode;
#endif
#endif
//<--Foot
//-->Pelvis
#if UserInputHumanSegType == "Pelvis"
#endif
//<--Pelvis
//<--
//-->Definitions of the human segment contact nodes accroding to different human segment types
#if UserInputCalcReacOnOff == 1
//-->Hand
#if UserInputHumanSegType == "Hand"
#if UserInputCalcReacNodesNumber == 1
AnyRefFrame& HumanSegContactNode1 = UserInputRefHumanSeg.ITF_ConnectNode;
#endif
#if UserInputCalcReacNodesNumber == 2
AnyRefFrame& HumanSegContactNode1 = UserInputRefHumanSeg.PalmLateralContactNode;
AnyRefFrame& HumanSegContactNode2 = UserInputRefHumanSeg.PalmMedialContactNode;
#endif
#if UserInputCalcReacNodesNumber == 3
AnyRefFrame& HumanSegContactNode1 = UserInputRefHumanSeg.PalmLateralContactNode;
AnyRefFrame& HumanSegContactNode2 = UserInputRefHumanSeg.PalmMedialContactNode;
AnyRefFrame& HumanSegContactNode3 = UserInputRefHumanSeg.WristContactNode;
#endif
#endif
//<--Hand
//-->Foot
#if UserInputHumanSegType == "Foot"
#if UserInputCalcReacNodesNumber == 1
//AnyRefFrame& HumanSegContactNode1 = UserInputRefHumanSeg.ITF_ConnectNode;
#endif
#if UserInputCalcReacNodesNumber == 2
//AnyRefFrame& HumanSegContactNode1 = UserInputRefHumanSeg.PalmLateralContactNode;
//AnyRefFrame& HumanSegContactNode2 = UserInputRefHumanSeg.PalmMedialContactNode;
#endif
#if UserInputCalcReacNodesNumber == 3
//AnyRefFrame& HumanSegContactNode1 = UserInputRefHumanSeg.PalmLateralContactNode;
//AnyRefFrame& HumanSegContactNode2 = UserInputRefHumanSeg.PalmMedialContactNode;
//AnyRefFrame& HumanSegContactNode3 = UserInputRefHumanSeg.WristContactNode;
#endif
#endif
//<--Foot
#endif
//<--
//-->Definitions of the conditional contact nodes according to the number of the contact nodes defined by users
#if UserInputCalcReacOnOff == 1
#if UserInputCalcReacNodesNumber >= 1
ConditionalContactClass Contact1(BaseObject = .UserInputTargetName, TargetObject = .HumanSegContactNode1,
DisplayTriggerVolume = 1, DisplayTargetNode = 0) =
{
UserDefinedLimitLow = .UserInputReacVolumeHeightLimitLow ;
UserDefinedLimitHigh = .UserInputReacVolumeHeightLimitHigh ;
UserDefinedRadiusLimit = .UserInputReacVolumeRadiusLimit ;
Strength = .UserInputReacForceMaxStrength ;
StaticFrictionCoefficient = .UserInputReacForceFrictionCoeff ;
ScaleFactor = .UserInputReacForceVisualScaleFactor ;
#if UserInputTargetNormalDir == "X"
NormalDirection = 0;
FrictionDirection1 = 1;
FrictionDirection2 = 2;
#endif
#if UserInputTargetNormalDir == "Y"
NormalDirection = 1;
FrictionDirection1 = 2;
FrictionDirection2 = 0;
#endif
#if UserInputTargetNormalDir == "Z"
NormalDirection = 2;
FrictionDirection1 = 0;
FrictionDirection2 = 1;
#endif
};
Macro_DrawBlueBall(HumanSegContactNode1, DrwBlueBall)
#endif
#if UserInputCalcReacNodesNumber >= 2
ConditionalContactClass Contact2(BaseObject = .UserInputTargetName, TargetObject = .HumanSegContactNode2,
DisplayTriggerVolume = 0, DisplayTargetNode = 0) =
{
UserDefinedLimitLow = .UserInputReacVolumeHeightLimitLow ;
UserDefinedLimitHigh = .UserInputReacVolumeHeightLimitHigh ;
UserDefinedRadiusLimit = .UserInputReacVolumeRadiusLimit ;
Strength = .UserInputReacForceMaxStrength ;
StaticFrictionCoefficient = .UserInputReacForceFrictionCoeff ;
ScaleFactor = .UserInputReacForceVisualScaleFactor ;
#if UserInputTargetNormalDir == "X"
NormalDirection = 0;
FrictionDirection1 = 1;
FrictionDirection2 = 2;
#endif
#if UserInputTargetNormalDir == "Y"
NormalDirection = 1;
FrictionDirection1 = 2;
FrictionDirection2 = 0;
#endif
#if UserInputTargetNormalDir == "Z"
NormalDirection = 2;
FrictionDirection1 = 0;
FrictionDirection2 = 1;
#endif
};
Macro_DrawBlueBall(HumanSegContactNode2, DrwBlueBall)
#endif
#if UserInputCalcReacNodesNumber >= 3
ConditionalContactClass Contact3(BaseObject = .UserInputTargetName, TargetObject = .HumanSegContactNode3,
DisplayTriggerVolume = 0, DisplayTargetNode = 0) =
{
UserDefinedLimitLow = .UserInputReacVolumeHeightLimitLow ;
UserDefinedLimitHigh = .UserInputReacVolumeHeightLimitHigh ;
UserDefinedRadiusLimit = .UserInputReacVolumeRadiusLimit ;
Strength = .UserInputReacForceMaxStrength ;
StaticFrictionCoefficient = .UserInputReacForceFrictionCoeff ;
ScaleFactor = .UserInputReacForceVisualScaleFactor ;
#if UserInputTargetNormalDir == "X"
NormalDirection = 0;
FrictionDirection1 = 1;
FrictionDirection2 = 2;
#endif
#if UserInputTargetNormalDir == "Y"
NormalDirection = 1;
FrictionDirection1 = 2;
FrictionDirection2 = 0;
#endif
#if UserInputTargetNormalDir == "Z"
NormalDirection = 2;
FrictionDirection1 = 0;
FrictionDirection2 = 1;
#endif
};
Macro_DrawBlueBall(HumanSegContactNode3, DrwBlueBall)
#endif
#endif
//<--
//-->Definition of the external applied force on the force node defined in the human segment
#if UserInputApplyingForceOnOff == 1
AnyForce3D AppliedForce =
{
AnyRefFrame& ref = .UserInputRefHumanSeg.ITF_ApplyingForceNode;
#if UserInputUseGlobalApplyingForceOnOff == 1
F = .UserInputApplyingForce ;
#else
Flocal = .ApplyingForce;
#endif
AnyDrawForce drw =
{
ShowTotalForces = On;
//ShowComponentForces = On;
ForceScale = ..DrawRef.DrawSettingsSupport.Lin.ScaleFactor;
AppliedForceColor = {1, 0, 0};
ScaleToView = Off;
};
};
AnyMoment3D AppliedMoment =
{
AnyRefFrame& ref = .UserInputRefHumanSeg.ITF_ApplyingForceNode;
#if UserInputUseGlobalApplyingForceOnOff == 1
M = .UserInputApplyingMoment ;
#else
Mlocal = .UserInputApplyingMoment ;
#endif
};
#endif
//<--
//-->Definition of the kinematic constrains according the different kinemtic interface types defined by users
#if UserInputConnectionType == "BallJoint"
AnyKinEq KinEqs =
{
AnyKinLinear lin =
{
AnyRefFrame& ref0 = ..UserInputTargetName ;
AnyRefFrame& ref1 = ..HumanSegConnectNode1;
Ref = 0;
Macro_DrawGreenBall(ref1, DrwGreenBall)
};
Reaction.Type = {Off, Off, Off};
};
#endif
#if UserInputConnectionType == "RevoluteJoint"
AnyRevoluteJoint KinEqs =
{
AnyRefFrame& ref0 = .UserInputTargetName ;
AnyRefFrame& ref1 = .HumanSegConnectNode1;
#if UserInputTargetNormalDir == "X"
Axis = x;
#endif
#if UserInputTargetNormalDir == "Y"
Axis = y;
#endif
#if UserInputTargetNormalDir == "Z"
Axis = z;
#endif
Constraints.Reaction.Type = {Off, Off, Off, Off, Off};
Macro_DrawGreenBall(ref1, DrwGreenBall)
};
#endif
#if UserInputConnectionType == "FixJoint"
AnyStdJoint KinEqs =
{
AnyRefFrame& ref0 = .UserInputTargetName ;
AnyRefFrame& ref1 = .HumanSegConnectNode1;
#if UserInputCalcReacOnOff == 1
Constraints.Reaction.Type = {On, On, On, On, On, On};
#else
Constraints.Reaction.Type = {Off, Off, Off, Off, Off, Off};
#endif
Macro_DrawGreenBall(ref1, DrwGreenBall)
};
#endif
#if UserInputConnectionType == "2PointsOnLine"
AnyKinEq KinEqs =
{
AnyKinLinear lin1 =
{
AnyRefFrame& ref0 = ..UserInputTargetName ;
AnyRefFrame& ref1 = ..HumanSegConnectNode1 ;
Ref = 0;
Macro_DrawGreenBall(ref1, DrwGreenBall)
};
AnyKinLinear lin2 =
{
AnyRefFrame& ref0 = ..UserInputTargetName ;
AnyRefFrame& ref1 = ..HumanSegConnectNode2 ;
Ref = 0;
Macro_DrawGreenBall(ref1, DrwGreenBall)
};
#if UserInputTargetNormalDir == "X"
MeasureOrganizer = {0, 3};
#endif
#if UserInputTargetNormalDir == "Y"
MeasureOrganizer = {1, 4};
#endif
#if UserInputTargetNormalDir == "Z"
MeasureOrganizer = {2, 5};
#endif
Reaction.Type = {Off, Off};
};
#endif
#if UserInputConnectionType == "3PointsOnPlane"
AnyKinEq KinEqs =
{
AnyKinLinear lin1 =
{
AnyRefFrame& ref0 = ..UserInputTargetName ;
AnyRefFrame& ref1 = ..HumanSegConnectNode1 ;
Ref = 0;
Macro_DrawGreenBall(ref1, DrwGreenBall)
};
AnyKinLinear lin2 =
{
AnyRefFrame& ref0 = ..UserInputTargetName ;
AnyRefFrame& ref1 = ..HumanSegConnectNode2 ;
Ref = 0;
Macro_DrawGreenBall(ref1, DrwGreenBall)
};
AnyKinLinear lin3 =
{
AnyRefFrame& ref0 = ..UserInputTargetName ;
AnyRefFrame& ref1 = ..HumanSegConnectNode3 ;
Ref = 0;
Macro_DrawGreenBall(ref1, DrwGreenBall)
};
#if UserInputTargetNormalDir == "X"
MeasureOrganizer = {0, 3, 6};
#endif
#if UserInputTargetNormalDir == "Y"
MeasureOrganizer = {1, 4, 7};
#endif
#if UserInputTargetNormalDir == "Z"
MeasureOrganizer = {2, 5, 8};
#endif
Reaction.Type = {Off, Off, Off};
};
#endif
//<--
// //-->Summary for input variables
// #if UserInputCalcReacOnOff == 1
// AnyMessage Reac_Friction_Coeff =
// {
// TriggerConst = On ;
// Type = MSG_Message ;
// Message = strformat("Friction coefficient for reaction force = ") + strval(.UserInputReacForceFrictionCoeff, "%10.3E");
// };
// #endif
// #if UserInputApplyingForceOnOff == 1
// AnyMessage Applying_Force_Vector =
// {
// TriggerConst = On ;
// Type = MSG_Message ;
// Message = strformat("Applying force vector = (")
// + strval(.ApplyingForce[0], "%10.3E")
// + strformat(", ")
// + strval(.ApplyingForce[1], "%10.3E")
// + strformat(", ")
// + strval(.ApplyingForce[2], "%10.3E")
// + strformat(") ");
//
// };
// AnyMessage Applying_Moment_Vector =
// {
// TriggerConst = On ;
// Type = MSG_Message ;
// Message = strformat("Applying moment vector = (")
// + strval(.ApplyingMoment[0], "%10.3E")
// + strformat(", ")
// + strval(.ApplyingMoment[1], "%10.3E")
// + strformat(", ")
// + strval(.ApplyingMoment[2], "%10.3E")
// + strformat(") ");
//
// };
// #endif
// //<--Summary for input variables
};