public Spring(AnimatTools.Framework.DataObject doParent)
            : base(doParent)
        {
            Color  = System.Drawing.Color.NavajoWhite;

            m_snNaturalLength = new AnimatTools.Framework.ScaledNumber(this, "NaturalLength", "meters", "m");
            m_snStiffness = new AnimatTools.Framework.ScaledNumber(this, "Stiffness", 50, AnimatTools.Framework.ScaledNumber.enumNumericScale.Kilo, "N/m", "N/m");
            m_snDamping = new AnimatTools.Framework.ScaledNumber(this, "Damping", 1, AnimatTools.Framework.ScaledNumber.enumNumericScale.Kilo, "g/s", "g/s");

            if(Util.Environment != null)
                m_snNaturalLength.SetFromValue(1, (int) Util.Environment.DisplayDistanceUnits);

            AnimatTools.DataObjects.Physical.PhysicalStructure doStruct = null;
            if(doParent != null && doParent is AnimatTools.DataObjects.Physical.BodyPart)
            {
                AnimatTools.DataObjects.Physical.BodyPart bpPart = (AnimatTools.DataObjects.Physical.BodyPart) doParent;
                doStruct = bpPart.ParentStructure;
            }

            m_tpBodyPartType = typeof(VortexAnimatTools.DataObjects.Physical.RigidBodies.MuscleAttachment);
            m_thPrimaryAttachment = new AnimatTools.TypeHelpers.LinkedBodyPartList(doStruct, null, m_tpBodyPartType);
            m_thSecondaryAttachment = new AnimatTools.TypeHelpers.LinkedBodyPartList(doStruct, null, m_tpBodyPartType);
            m_snSpringLength = new AnimatTools.Framework.ScaledNumber(this, "SpringLength", 0, AnimatTools.Framework.ScaledNumber.enumNumericScale.None, "Meters", "m");

            m_thDataTypes.DataTypes.Clear();
            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("SpringLength", "Spring Length", "Meters", "m", -10, 10));
            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("Displacement", "Displacement", "Meters", "m", -10, 10));
            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("Tension", "Tension", "Newtons", "N", -1000, 1000));
            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("Energy", "Energy", "Joules", "J", -10, 10));
            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("Enable", "Enable", "", "", 0, 1));
            m_thDataTypes.ID = "SpringLength";

            m_thIncomingDataType = new AnimatTools.DataObjects.DataType("Enabled", "Enabled", "", "", 0, 1, ScaledNumber.enumNumericScale.None, ScaledNumber.enumNumericScale.None);
        }
        public InverseMuscleDynamics(AnimatTools.Framework.DataObject doParent)
            : base(doParent)
        {
            m_tpBodyPartType = typeof(VortexAnimatTools.DataObjects.Physical.RigidBodies.MuscleBase);
            m_thMuscle = new AnimatTools.TypeHelpers.LinkedBodyPartList(null, null, m_tpBodyPartType);
            m_strMuscleLengthData = "";
            m_snConductance = new AnimatTools.Framework.ScaledNumber(this, "Conductance", 100, AnimatTools.Framework.ScaledNumber.enumNumericScale.nano, "Siemens", "S");
            m_snRestPotential = new AnimatTools.Framework.ScaledNumber(this, "RestPotential", -100, AnimatTools.Framework.ScaledNumber.enumNumericScale.milli, "Volts", "V");

            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("A", "A", "Newtons", "N", 0, 1000));
            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("Vm", "Vm", "Volts", "V", -0.100, 0.100));
            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("Current", "Current", "Amps", "A", -100e-9, 100e-9));
            m_thDataTypes.ID = "A";
        }
        public VelocityClamp(AnimatTools.Framework.DataObject doParent)
            : base(doParent)
        {
            m_thPrimaryAttachment = new AnimatTools.TypeHelpers.LinkedBodyPartList(m_doStructure, null, m_tpBodyPartType);
            m_thSecondaryAttachment = new AnimatTools.TypeHelpers.LinkedBodyPartList(m_doStructure, null, m_tpBodyPartType);
            m_tpBodyPartType = typeof(VortexAnimatTools.DataObjects.Physical.RigidBodies.MuscleAttachment);
            m_snVelocity = new AnimatTools.Framework.ScaledNumber(this, "Velocity", 0, AnimatTools.Framework.ScaledNumber.enumNumericScale.None, "meters/second", "m/s");
            m_snMaxForce = new AnimatTools.Framework.ScaledNumber(this, "MaxForce", 1, AnimatTools.Framework.ScaledNumber.enumNumericScale.Kilo, "Newton", "N");

            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("Force", "Force", "Newtons", "N", 0, 1000));
            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("PError", "Proportional Error", "Meters", "m", 0, 1000));
            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("DError", "Derivative Error", "M/s", "m/s", 0, 1));
            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("IError", "Integrator Error", "m^2", "m^2", 0, 1000));
            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("Position", "Velocity", "m/s", "m/s", 0, 1000));
            m_thDataTypes.DataTypes.Add(new AnimatTools.DataObjects.DataType("Velocity", "Acceleration", "m/s^2", "m/s^2", 0, 1000));
            m_thDataTypes.ID = "Force";
        }
        protected override void CloneInternal(AnimatTools.Framework.DataObject doOriginal, bool bCutData, AnimatTools.Framework.DataObject doRoot)
        {
            base.CloneInternal (doOriginal, bCutData, doRoot);

            InverseMuscleDynamics doOrigBody = (InverseMuscleDynamics) doOriginal;

            m_thMuscle = (AnimatTools.TypeHelpers.LinkedBodyPart) doOrigBody.m_thMuscle.Clone(this, bCutData, doRoot);
            m_strMuscleLengthData = doOrigBody.m_strMuscleLengthData;
            m_snConductance = (AnimatTools.Framework.ScaledNumber) doOrigBody.m_snConductance.Clone(this, bCutData, doRoot);
            m_snRestPotential = (AnimatTools.Framework.ScaledNumber) doOrigBody.m_snRestPotential.Clone(this, bCutData, doRoot);
        }
        public override void LoadData(ref AnimatTools.Interfaces.StdXml oXml)
        {
            base.LoadData(ref oXml);

             oXml.IntoElem();

            if(oXml.FindChildElement("MuscleID", false))
            {
              string strMuscleID = oXml.GetChildString("MuscleID");
              if(m_doOrganism != null && strMuscleID.Trim().Length > 0)
                {
                    AnimatTools.DataObjects.Physical.BodyPart rbPart = (AnimatTools.DataObjects.Physical.BodyPart) m_doOrganism.FindBodyPart(strMuscleID, false);
                    if(rbPart != null)
                        m_thMuscle = new AnimatTools.TypeHelpers.LinkedBodyPartList(m_doOrganism, rbPart, m_tpBodyPartType);
                }
            }
            else
                m_thMuscle = new AnimatTools.TypeHelpers.LinkedBodyPartList(m_doOrganism, null, m_tpBodyPartType);

            m_strMuscleLengthData = oXml.GetChildString("MuscleLengthData", m_strMuscleLengthData);

            if(oXml.FindChildElement("Conductance", false))
                m_snConductance.LoadData(ref oXml, "Conductance");

            if(oXml.FindChildElement("RestPotential", false))
                m_snRestPotential.LoadData(ref oXml, "RestPotential");

            oXml.OutOfElem();
        }
        protected override void CloneInternal(AnimatTools.Framework.DataObject doOriginal, bool bCutData, AnimatTools.Framework.DataObject doRoot)
        {
            base.CloneInternal (doOriginal, bCutData, doRoot);

            Spring doOrigBody = (Spring) doOriginal;

            m_thPrimaryAttachment = (AnimatTools.TypeHelpers.LinkedBodyPart) doOrigBody.m_thPrimaryAttachment.Clone(this, bCutData, doRoot);
            m_thSecondaryAttachment = (AnimatTools.TypeHelpers.LinkedBodyPart) doOrigBody.m_thSecondaryAttachment.Clone(this, bCutData, doRoot);

            m_snNaturalLength = (AnimatTools.Framework.ScaledNumber) doOrigBody.m_snNaturalLength.Clone(this, bCutData, doRoot);
            m_snStiffness = (AnimatTools.Framework.ScaledNumber) doOrigBody.m_snStiffness.Clone(this, bCutData, doRoot);
            m_snDamping = (AnimatTools.Framework.ScaledNumber) doOrigBody.m_snDamping.Clone(this, bCutData, doRoot);
            m_fRadius = doOrigBody.m_fRadius;
            m_bEnabled = doOrigBody.m_bEnabled;
        }
        public override void SwapBodyPartCopy(AnimatTools.DataObjects.Physical.BodyPart doOriginal)
        {
            base.SwapBodyPartCopy(doOriginal);

            if(Util.IsTypeOf(doOriginal.GetType(), typeof(VortexAnimatTools.DataObjects.Physical.RigidBodies.Spring), false))
            {
                VortexAnimatTools.DataObjects.Physical.RigidBodies.Spring msOrig = (VortexAnimatTools.DataObjects.Physical.RigidBodies.Spring) doOriginal;

                m_thPrimaryAttachment = msOrig.m_thPrimaryAttachment;
                m_thSecondaryAttachment = msOrig.m_thSecondaryAttachment;
                m_snNaturalLength = msOrig.m_snNaturalLength;
                m_snStiffness = msOrig.m_snStiffness;
                m_snDamping = msOrig.m_snDamping;
                m_snSpringLength = msOrig.m_snSpringLength;
                m_fRadius = msOrig.m_fRadius;
            }
            else if(Util.IsTypeOf(doOriginal.GetType(), typeof(VortexAnimatTools.DataObjects.Physical.RigidBodies.MuscleBase), false))
            {
                VortexAnimatTools.DataObjects.Physical.RigidBodies.MuscleBase msOrig = (VortexAnimatTools.DataObjects.Physical.RigidBodies.MuscleBase) doOriginal;

                if(msOrig.AttachmentPoints.Count > 0 && m_thPrimaryAttachment != null)
                    m_thPrimaryAttachment.BodyPart = msOrig.AttachmentPoints[0];

                if(msOrig.AttachmentPoints.Count > 1 && m_thSecondaryAttachment != null)
                    m_thSecondaryAttachment.BodyPart = msOrig.AttachmentPoints[1];
            }
        }
        public override void InitializeAfterLoad(ref AnimatTools.DataObjects.Simulation dsSim, ref AnimatTools.DataObjects.Physical.PhysicalStructure doStructure)
        {
            if(m_strPrimaryAttachID.Trim().Length > 0)
            {
                AnimatTools.DataObjects.Physical.BodyPart rbPart = (AnimatTools.DataObjects.Physical.BodyPart) doStructure.FindBodyPart(m_strPrimaryAttachID, true);
                m_thPrimaryAttachment = new AnimatTools.TypeHelpers.LinkedBodyPartList(doStructure, rbPart, m_tpBodyPartType);
            }

            if(m_strSecondaryAttachID.Trim().Length > 0)
            {
                AnimatTools.DataObjects.Physical.BodyPart rbPart = (AnimatTools.DataObjects.Physical.BodyPart) doStructure.FindBodyPart(m_strSecondaryAttachID, true);
                m_thSecondaryAttachment = new AnimatTools.TypeHelpers.LinkedBodyPartList(doStructure, rbPart, m_tpBodyPartType);
            }
        }
        protected override void CloneInternal(AnimatTools.Framework.DataObject doOriginal, bool bCutData, AnimatTools.Framework.DataObject doRoot)
        {
            base.CloneInternal (doOriginal, bCutData, doRoot);

            VelocityClamp doOrigBody = (VelocityClamp) doOriginal;

            m_thPrimaryAttachment = (AnimatTools.TypeHelpers.LinkedBodyPart) doOrigBody.m_thPrimaryAttachment.Clone(this, bCutData, doRoot);
            m_thSecondaryAttachment = (AnimatTools.TypeHelpers.LinkedBodyPart) doOrigBody.m_thSecondaryAttachment.Clone(this, bCutData, doRoot);
            m_snVelocity = (AnimatTools.Framework.ScaledNumber) doOrigBody.m_snVelocity.Clone(this, bCutData, doRoot);
            m_snMaxForce = (AnimatTools.Framework.ScaledNumber) doOrigBody.m_snMaxForce.Clone(this, bCutData, doRoot);
            m_fltProportionalGain = doOrigBody.m_fltProportionalGain;
            m_fltDerivativeGain = doOrigBody.m_fltDerivativeGain;
            m_fltIntegratorGain = doOrigBody.m_fltIntegratorGain;
            m_fltMaxIntegratorValue = doOrigBody.m_fltMaxIntegratorValue;
        }
        public override void LoadData(ref AnimatTools.Interfaces.StdXml oXml)
        {
            base.LoadData(ref oXml);

            oXml.IntoElem();

            if(oXml.FindChildElement("PrimaryAttachmentID", false))
            {
              string strAttachID = oXml.GetChildString("PrimaryAttachmentID");
                if(m_doStructure != null && strAttachID.Trim().Length > 0)
                {
                    AnimatTools.DataObjects.Physical.BodyPart rbPart = (AnimatTools.DataObjects.Physical.BodyPart) m_doStructure.FindBodyPart(strAttachID, false);
                    if(rbPart != null)
                        m_thPrimaryAttachment = new AnimatTools.TypeHelpers.LinkedBodyPartList(m_doStructure, rbPart, m_tpBodyPartType);
                }
            }
            else
                m_thPrimaryAttachment = new AnimatTools.TypeHelpers.LinkedBodyPartList(m_doStructure, null, m_tpBodyPartType);

            if(oXml.FindChildElement("SecondaryAttachmentID", false))
            {
                string strAttachID = oXml.GetChildString("SecondaryAttachmentID");
                if(m_doStructure != null && strAttachID.Trim().Length > 0)
                {
                    AnimatTools.DataObjects.Physical.BodyPart rbPart = (AnimatTools.DataObjects.Physical.BodyPart) m_doStructure.FindBodyPart(strAttachID, false);
                    if(rbPart != null)
                        m_thSecondaryAttachment = new AnimatTools.TypeHelpers.LinkedBodyPartList(m_doStructure, rbPart, m_tpBodyPartType);
                }
            }
            else
                m_thSecondaryAttachment = new AnimatTools.TypeHelpers.LinkedBodyPartList(m_doStructure, null, m_tpBodyPartType);

            m_fltProportionalGain = oXml.GetChildFloat("PGain", m_fltProportionalGain);
            m_fltDerivativeGain = oXml.GetChildFloat("DGain", m_fltDerivativeGain);
            m_fltIntegratorGain = oXml.GetChildFloat("IGain", m_fltIntegratorGain);
            m_fltMaxIntegratorValue = oXml.GetChildFloat("MaxIValue", m_fltMaxIntegratorValue);
            m_snVelocity.LoadData(ref oXml, "Velocity");
            m_snMaxForce.LoadData(ref oXml, "MaxForce");

            SetPositionUnits();
            oXml.OutOfElem();
        }