コード例 #1
0
        public void LoadRobot(RobotDataManager robotDataManager)
        {
            SuspendLayout();

            DefinePartsLayout.Controls.Clear();
            DefinePartsLayout.RowStyles.Clear();

            jointCards.Clear();
            foreach (var node in robotDataManager.RobotBaseNode.ListAllNodes())
            {
                if (node.GetSkeletalJoint() == null || JointDriver.GetAllowedDrivers(node.GetSkeletalJoint()).Length == 0)
                {
                    continue;
                }

                var panel = new JointCardUC(node, this, robotDataManager)
                {
                    Dock = DockStyle.Top
                };
                jointCards.Add(panel);
                AddControlToNewTableRow(panel, DefinePartsLayout);
            }

            jointCards.ForEach(card => card.LoadPreviewIcon());

            ResumeLayout();
        }
コード例 #2
0
        public void ShowDialog(SkeletalJoint_Base baseJoint, List <RigidNode_Base> nodes, Form owner)
        {
            Saved = false;

            if (nodes.Count > 1)
            {
                bool same = true;

                foreach (RigidNode_Base node in nodes)
                {
                    JointDriver driver = node.GetSkeletalJoint().cDriver;
                    if (driver == null || driver.CompareTo(baseJoint.cDriver) != 0)
                    {
                        same = false;
                    }
                }

                if (same)
                {
                    joint = baseJoint;
                }
                else
                {
                    joint = SkeletalJoint_Base.JOINT_FACTORY(baseJoint.GetJointType());
                }
            }
            else
            {
                joint = baseJoint;
            }
            this.nodes  = nodes;
            typeOptions = JointDriver.GetAllowedDrivers(joint);

            // Used for capitalization
            TextInfo textInfo = new CultureInfo("en-US", true).TextInfo;

            cmbJointDriver.Items.Clear();
            cmbJointDriver.Items.Add("No Driver");
            foreach (JointDriverType type in typeOptions)
            {
                cmbJointDriver.Items.Add(textInfo.ToTitleCase(Enum.GetName(typeof(JointDriverType), type).Replace('_', ' ').ToLowerInvariant()));
            }
            if (joint.cDriver != null)
            {
                cmbJointDriver.SelectedIndex = Array.IndexOf(typeOptions, joint.cDriver.GetDriveType()) + 1;

                if (joint.cDriver.port1 < txtPort1.Minimum)
                {
                    txtPort1.Value = txtPort1.Minimum;
                }
                else if (joint.cDriver.port1 > txtPort1.Maximum)
                {
                    txtPort1.Value = txtPort1.Maximum;
                }
                else
                {
                    txtPort1.Value = joint.cDriver.port1;
                }

                if (joint.cDriver.port2 < txtPort2.Minimum)
                {
                    txtPort2.Value = txtPort2.Minimum;
                }
                else if (joint.cDriver.port2 > txtPort2.Maximum)
                {
                    txtPort2.Value = txtPort2.Maximum;
                }
                else
                {
                    txtPort2.Value = joint.cDriver.port2;
                }

                txtLowLimit.Value  = (decimal)joint.cDriver.lowerLimit;
                txtHighLimit.Value = (decimal)joint.cDriver.upperLimit;

                rbPWM.Checked          = !joint.cDriver.isCan;
                rbCAN.Checked          = joint.cDriver.isCan;
                chkBoxHasBrake.Checked = joint.cDriver.hasBrake;
                if (joint.cDriver.OutputGear == 0)// prevents output gear from being 0
                {
                    joint.cDriver.OutputGear = 1;
                }
                if (joint.cDriver.InputGear == 0)// prevents input gear from being 0
                {
                    joint.cDriver.InputGear = 1;
                }
                OutputGeartxt.Value = (decimal)joint.cDriver.OutputGear; // reads the existing gearing and writes it to the input field so the user sees their existing value
                InputGeartxt.Value  = (decimal)joint.cDriver.InputGear;  // reads the existing gearing and writes it to the input field so the user sees their existing value

                {
                    PneumaticDriverMeta pneumaticMeta = joint.cDriver.GetInfo <PneumaticDriverMeta>();
                    if (pneumaticMeta != null)
                    {
                        numericUpDownPnuDia.Value          = (decimal)pneumaticMeta.width;
                        cmbPneumaticPressure.SelectedIndex = (int)pneumaticMeta.pressureEnum;
                    }
                    else
                    {
                        numericUpDownPnuDia.Value          = (decimal)1.0;
                        cmbPneumaticPressure.SelectedIndex = (int)PneumaticPressure.HIGH;
                    }
                }
                {
                    WheelDriverMeta wheelMeta = joint.cDriver.GetInfo <WheelDriverMeta>();
                    if (wheelMeta != null)
                    {
                        try
                        {
                            cmbWheelType.SelectedIndex     = (int)wheelMeta.type;
                            cmbFrictionLevel.SelectedIndex = (int)wheelMeta.GetFrictionLevel();
                        }
                        catch
                        {
                            // If an exception was thrown (System.ArguementOutOfRangeException) it means
                            // the user did not choose a wheel type when they were configuring the
                            // wheel joint
                            cmbWheelType.SelectedIndex     = (int)WheelType.NORMAL;
                            cmbFrictionLevel.SelectedIndex = (int)FrictionLevel.MEDIUM;
                        }

                        chkBoxDriveWheel.Checked = wheelMeta.isDriveWheel;
                        cmbWheelType_SelectedIndexChanged(null, null);
                    }
                    else
                    {
                        cmbWheelType.SelectedIndex     = (int)WheelType.NOT_A_WHEEL;
                        cmbFrictionLevel.SelectedIndex = (int)FrictionLevel.MEDIUM;
                    }
                }
                {
                    ElevatorDriverMeta elevatorMeta = joint.cDriver.GetInfo <ElevatorDriverMeta>();
                }
                {
                    switch (joint.cDriver.motor)
                    {
                    case MotorType.GENERIC:
                        RobotCompetitionDropDown.SelectedItem = RobotExporterAddInServer.Instance.AddInSettingsManager.DefaultRobotCompetition.ToString();
                        MotorTypeDropDown.SelectedItem        = "GENERIC";
                        break;

                    case MotorType.CIM:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "CIM";
                        break;

                    case MotorType.MINI_CIM:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "MIN_CIM";
                        break;

                    case MotorType.BAG_MOTOR:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "BAG_MOTOR";
                        break;

                    case MotorType.REDLINE_775_PRO:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "REDLINE_775_PRO";
                        break;

                    case MotorType.ANDYMARK_9015:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "ANDYMARK_9015";
                        break;

                    case MotorType.BANEBOTS_775_18v:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "BANEBOTS_775_18v";
                        break;

                    case MotorType.BANEBOTS_775_12v:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "BANEBOTS_775_12v";
                        break;

                    case MotorType.BANEBOTS_550_12v:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "BANEBOTS_550_12v";
                        break;

                    case MotorType.ANDYMARK_775_125:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "ANDYMARK_775_125";
                        break;

                    case MotorType.SNOW_BLOWER:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "SNOW_BLOWER";
                        break;

                    case MotorType.NIDEC_BLDC:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "NIDEC_BLDC";
                        break;

                    case MotorType.THROTTLE_MOTOR:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "THROTTLE_MOTOR";
                        break;

                    case MotorType.WINDOW_MOTOR:
                        RobotCompetitionDropDown.SelectedItem = "FRC";
                        MotorTypeDropDown.SelectedItem        = "WINDOW_MOTOR";
                        break;

                    case MotorType.NEVEREST:
                        RobotCompetitionDropDown.SelectedItem = "FTC";
                        MotorTypeDropDown.SelectedItem        = "NEVEREST";
                        break;

                    case MotorType.TETRIX_MOTOR:
                        RobotCompetitionDropDown.SelectedItem = "FTC";
                        MotorTypeDropDown.SelectedItem        = "TETRIX_MOTOR";
                        break;

                    case MotorType.MODERN_ROBOTICS_MATRIX:
                        RobotCompetitionDropDown.SelectedItem = "FTC";
                        MotorTypeDropDown.SelectedItem        = "MODERN_ROBOTICS_MATRIX";
                        break;

                    case MotorType.REV_ROBOTICS_HD_HEX_20_TO_1:
                        RobotCompetitionDropDown.SelectedItem = "FTC";
                        MotorTypeDropDown.SelectedItem        = "REV_ROBOTICS_HD_HEX_20_TO_1";
                        break;

                    case MotorType.REV_ROBOTICS_HD_HEX_40_TO_1:
                        RobotCompetitionDropDown.SelectedItem = "FTC";
                        MotorTypeDropDown.SelectedItem        = "REV_ROBOTICS_HD_HEX_40_TO_1";
                        break;

                    case MotorType.REV_ROBOTICS_CORE_HEX:
                        RobotCompetitionDropDown.SelectedItem = "FTC";
                        MotorTypeDropDown.SelectedItem        = "REV_ROBOTICS_CORE_HEX";
                        break;

                    case MotorType.VEX_V5_Smart_Motor_600_RPM:
                        RobotCompetitionDropDown.SelectedItem = "VEX";
                        MotorTypeDropDown.SelectedItem        = "VEX_V5_Smart_Motor_600_RPM";
                        break;

                    case MotorType.VEX_V5_Smart_Motor_200_RPM:
                        RobotCompetitionDropDown.SelectedItem = "VEX";
                        MotorTypeDropDown.SelectedItem        = "VEX_V5_Smart_Motor_200_RPM";
                        break;

                    case MotorType.VEX_V5_Smart_Motor_100_RPM:
                        RobotCompetitionDropDown.SelectedItem = "VEX";
                        MotorTypeDropDown.SelectedItem        = "VEX_V5_Smart_Motor_100_RPM";
                        break;

                    case MotorType.VEX_393_NORMAL_SPEED:
                        RobotCompetitionDropDown.SelectedItem = "VEX";
                        MotorTypeDropDown.SelectedItem        = "VEX_393_NORMAL_SPEED";
                        break;

                    case MotorType.VEX_393_HIGH_SPEED:
                        RobotCompetitionDropDown.SelectedItem = "VEX";
                        MotorTypeDropDown.SelectedItem        = "VEX_393_HIGH_SPEED";
                        break;

                    case MotorType.VEX_393_TURBO_GEAR_SET:
                        RobotCompetitionDropDown.SelectedItem = "VEX";
                        MotorTypeDropDown.SelectedItem        = "VEX_393_TURBO_GEAR_SET";
                        break;
                    }
                }
            }
            else //Default values
            {
                cmbJointDriver.SelectedIndex = 0;
                txtPort1.Value      = txtPort1.Minimum;
                txtPort2.Value      = txtPort2.Minimum;
                txtLowLimit.Value   = txtLowLimit.Minimum;
                txtHighLimit.Value  = txtHighLimit.Minimum;
                InputGeartxt.Value  = (decimal)1.0;
                OutputGeartxt.Value = (decimal)1.0;

                rbPWM.Checked = true;

                chkBoxHasBrake.Checked = false;

                numericUpDownPnuDia.Value          = (decimal)0.5;
                cmbPneumaticPressure.SelectedIndex = (int)PneumaticPressure.MEDIUM;

                cmbWheelType.SelectedIndex     = (int)WheelType.NOT_A_WHEEL;
                cmbFrictionLevel.SelectedIndex = (int)FrictionLevel.MEDIUM;
                chkBoxDriveWheel.Checked       = false;

                RobotCompetitionDropDown.SelectedItem = RobotExporterAddInServer.Instance.AddInSettingsManager.DefaultRobotCompetition;
                MotorTypeDropDown.SelectedItem        = "GENERIC";
            }

            PrepLayout();
            base.Location = new System.Drawing.Point(Cursor.Position.X - 10, Cursor.Position.Y - base.Height - 10);
            this.ShowDialog(owner);
        }
コード例 #3
0
ファイル: JointCardUC.cs プロジェクト: xiaodelea/synthesis
        public void LoadValues()
        {
            advancedSettingsForm = new AdvancedJointSettingsForm(node.GetSkeletalJoint());
            var joint       = node.GetSkeletalJoint();
            var typeOptions = JointDriver.GetAllowedDrivers(joint); // TODO: This doesn't protect multi-edit

            jointTypeComboBox.Items.Clear();
            if (typeOptions.Contains(JointDriverType.MOTOR))
            {
                jointTypeComboBox.Items.AddRange(new object[]
                {
                    "(Select an option)",
                    "Drivetrain Wheel",
                    "Mechanism Joint"
                });
            }
            else
            {
                jointTypeComboBox.Items.AddRange(new object[]
                {
                    "(Select an option)",
                    "Mechanism Joint"
                });
            }

            driverTypeComboBox.Items.Clear();
            var textInfo = new CultureInfo("en-US", true).TextInfo;

            foreach (var type in typeOptions)
            {
                var name = Enum.GetName(typeof(JointDriverType), type);
                if (name != null) // TODO: Get rid of this mess
                {
                    driverTypeComboBox.Items.Add(textInfo.ToTitleCase(name.Replace('_', ' ').ToLowerInvariant()));
                }
            }

            jointName.Text = ToStringUtils.NodeNameString(node);

            // Defaults when switched:
            weightInput.Value                = 0;
            dtSideComboBox.SelectedIndex     = 0;
            wheelTypeComboBox.SelectedIndex  = 0;
            driverTypeComboBox.SelectedIndex = 0;

            var jointDriver = joint.cDriver; // sometimes null

            if (jointDriver == null)
            {
                jointTypeComboBox.SelectedItem = "(Select an option)";
            }
            else if (jointDriver.port1 <= 2) // Drivetrain wheel
            {
                jointTypeComboBox.SelectedItem = "Drivetrain Wheel";
                dtSideComboBox.SelectedIndex   = jointDriver.port1;
                var wheelDriverMeta = jointDriver.GetInfo <WheelDriverMeta>();
                if (wheelDriverMeta != null)
                {
                    wheelTypeComboBox.SelectedIndex = (int)wheelDriverMeta.type - 1;
                }
            }
            else // Mechanism joint
            {
                jointTypeComboBox.SelectedItem = "Mechanism Joint";
                weightInput.Value = (decimal)Math.Max(joint.weight, 0);
                driverTypeComboBox.SelectedIndex = Array.IndexOf(typeOptions, joint.cDriver.GetDriveType());
            }
        }
コード例 #4
0
ファイル: JointCardUC.cs プロジェクト: xiaodelea/synthesis
        public void SaveValues()
        {
            var joint = node.GetSkeletalJoint();

            if ((string)jointTypeComboBox.SelectedItem == "(Select an option)")
            {
                joint.cDriver = null;
                joint.weight  = 0;
            }
            else
            {
                // Driver type
                var cType = (string)jointTypeComboBox.SelectedItem == "Drivetrain Wheel" ? JointDriverType.MOTOR : JointDriver.GetAllowedDrivers(joint)[driverTypeComboBox.SelectedIndex];
                if (joint.cDriver == null || !joint.cDriver.GetDriveType().Equals(cType)) // Defaults
                {
                    joint.cDriver = new JointDriver(cType)
                    {
                        port1      = 3,
                        port2      = 3,
                        InputGear  = 1,
                        OutputGear = 1,
                        lowerLimit = 0,
                        upperLimit = 0,
                        isCan      = true
                    };
                }

                // Always
                joint.cDriver.hasBrake   = true;
                joint.cDriver.motor      = MotorType.GENERIC;
                joint.cDriver.InputGear  = 1;
                joint.cDriver.OutputGear = advancedSettingsForm.GearRatio;
                joint.cDriver.lowerLimit = 0;
                joint.cDriver.upperLimit = 0;

                if ((string)jointTypeComboBox.SelectedItem == "Drivetrain Wheel")
                {
                    // Port/wheel side
                    joint.cDriver.port1 = dtSideComboBox.SelectedIndex;
                    joint.cDriver.isCan = true;

                    // Wheel type
                    var wheelDriver = new WheelDriverMeta
                    {
                        type         = (WheelType)wheelTypeComboBox.SelectedIndex + 1,
                        isDriveWheel = true
                    };
                    wheelDriver.SetFrictionLevel(FrictionLevel.MEDIUM);
                    joint.cDriver.AddInfo(wheelDriver);

                    // Weight
                    joint.weight = 0;
                }
                else if ((string)jointTypeComboBox.SelectedItem == "Mechanism Joint")
                {
                    // Port/wheel side
                    joint.cDriver.port1 = advancedSettingsForm.PortId;
                    if (joint.cDriver.port1 <= 2)
                    {
                        joint.cDriver.port1 = 2;
                    }
                    joint.cDriver.isCan = advancedSettingsForm.IsCan;

                    // Wheel driver
                    joint.cDriver.RemoveInfo <WheelDriverMeta>();

                    // Weight
                    joint.weight = (double)weightInput.Value;
                }
            }
        }
コード例 #5
0
ファイル: DriveChooser.cs プロジェクト: chargen/synthesis
    public void ShowDialog(SkeletalJoint_Base baseJoint, List <RigidNode_Base> nodes, Form owner)
    {
        Saved = false;

        if (nodes.Count > 1)
        {
            bool same = true;

            foreach (RigidNode_Base node in nodes)
            {
                JointDriver driver = node.GetSkeletalJoint().cDriver;
                if (driver == null || driver.CompareTo(baseJoint.cDriver) != 0)
                {
                    same = false;
                }
            }

            if (same)
            {
                joint = baseJoint;
            }
            else
            {
                joint = SkeletalJoint_Base.JOINT_FACTORY(baseJoint.GetJointType());
            }
        }
        else
        {
            joint = baseJoint;
        }
        this.nodes  = nodes;
        typeOptions = JointDriver.GetAllowedDrivers(joint);

        // Used for capitalization
        TextInfo textInfo = new CultureInfo("en-US", true).TextInfo;

        cmbJointDriver.Items.Clear();
        cmbJointDriver.Items.Add("No Driver");
        foreach (JointDriverType type in typeOptions)
        {
            cmbJointDriver.Items.Add(textInfo.ToTitleCase(Enum.GetName(typeof(JointDriverType), type).Replace('_', ' ').ToLowerInvariant()));
        }
        if (joint.cDriver != null)
        {
            cmbJointDriver.SelectedIndex = Array.IndexOf(typeOptions, joint.cDriver.GetDriveType()) + 1;

            if (joint.cDriver.port1 < txtPort1.Minimum)
            {
                txtPort1.Value = txtPort1.Minimum;
            }
            else if (joint.cDriver.port1 > txtPort1.Maximum)
            {
                txtPort1.Value = txtPort1.Maximum;
            }
            else
            {
                txtPort1.Value = joint.cDriver.port1;
            }

            if (joint.cDriver.port2 < txtPort2.Minimum)
            {
                txtPort2.Value = txtPort2.Minimum;
            }
            else if (joint.cDriver.port2 > txtPort2.Maximum)
            {
                txtPort2.Value = txtPort2.Maximum;
            }
            else
            {
                txtPort2.Value = joint.cDriver.port2;
            }

            txtLowLimit.Value  = (decimal)joint.cDriver.lowerLimit;
            txtHighLimit.Value = (decimal)joint.cDriver.upperLimit;

            rbPWM.Checked          = !joint.cDriver.isCan;
            rbCAN.Checked          = joint.cDriver.isCan;
            chkBoxHasBrake.Checked = joint.cDriver.hasBrake;
            if (joint.cDriver.OutputGear == 0)    // prevents output gear from being 0
            {
                joint.cDriver.OutputGear = 1;
            }
            if (joint.cDriver.InputGear == 0)// prevents input gear from being 0
            {
                joint.cDriver.InputGear = 1;
            }
            OutputGeartxt.Value = (decimal)joint.cDriver.OutputGear; // reads the existing gearing and writes it to the input field so the user sees their existing value
            InputGeartxt.Value  = (decimal)joint.cDriver.InputGear;  // reads the existing gearing and writes it to the input field so the user sees their existing value

            #region Meta info recovery
            {
                PneumaticDriverMeta pneumaticMeta = joint.cDriver.GetInfo <PneumaticDriverMeta>();
                if (pneumaticMeta != null)
                {
                    cmbPneumaticDiameter.SelectedIndex = (int)pneumaticMeta.widthEnum;
                    cmbPneumaticPressure.SelectedIndex = (int)pneumaticMeta.pressureEnum;
                }
                else
                {
                    cmbPneumaticDiameter.SelectedIndex = (int)PneumaticDiameter.MEDIUM;
                    cmbPneumaticPressure.SelectedIndex = (int)PneumaticPressure.HIGH;
                }
            }
            {
                WheelDriverMeta wheelMeta = joint.cDriver.GetInfo <WheelDriverMeta>();
                if (wheelMeta != null)
                {
                    try
                    {
                        cmbWheelType.SelectedIndex     = (int)wheelMeta.type;
                        cmbFrictionLevel.SelectedIndex = (int)wheelMeta.GetFrictionLevel();
                    }
                    catch
                    {
                        // If an exception was thrown (System.ArguementOutOfRangeException) it means
                        // the user did not choose a wheel type when they were configuring the
                        // wheel joint
                        cmbWheelType.SelectedIndex     = (int)WheelType.NORMAL;
                        cmbFrictionLevel.SelectedIndex = (int)FrictionLevel.MEDIUM;
                    }

                    chkBoxDriveWheel.Checked = wheelMeta.isDriveWheel;
                    cmbWheelType_SelectedIndexChanged(null, null);
                }
                else
                {
                    cmbWheelType.SelectedIndex     = (int)WheelType.NOT_A_WHEEL;
                    cmbFrictionLevel.SelectedIndex = (int)FrictionLevel.MEDIUM;
                }
            }
            {
                ElevatorDriverMeta elevatorMeta = joint.cDriver.GetInfo <ElevatorDriverMeta>();
            }
            #endregion
        }
        else //Default values
        {
            cmbJointDriver.SelectedIndex = 0;
            txtPort1.Value      = txtPort1.Minimum;
            txtPort2.Value      = txtPort2.Minimum;
            txtLowLimit.Value   = txtLowLimit.Minimum;
            txtHighLimit.Value  = txtHighLimit.Minimum;
            InputGeartxt.Value  = (decimal)1.0;
            OutputGeartxt.Value = (decimal)1.0;

            rbPWM.Checked = true;

            chkBoxHasBrake.Checked = false;

            cmbPneumaticDiameter.SelectedIndex = (int)PneumaticDiameter.MEDIUM;
            cmbPneumaticPressure.SelectedIndex = (int)PneumaticPressure.MEDIUM;

            cmbWheelType.SelectedIndex     = (int)WheelType.NOT_A_WHEEL;
            cmbFrictionLevel.SelectedIndex = (int)FrictionLevel.MEDIUM;
            chkBoxDriveWheel.Checked       = false;
        }

        PrepLayout();
        base.Location = new System.Drawing.Point(Cursor.Position.X - 10, Cursor.Position.Y - base.Height - 10);
        this.ShowDialog(owner);
    }
コード例 #6
0
ファイル: DriveChooser.cs プロジェクト: j143-zz/synthesis
    public void ShowDialog(SkeletalJoint_Base baseJoint, List <RigidNode_Base> nodes, Form owner)
    {
        Saved = false;

        if (nodes.Count > 1)
        {
            bool same = true;

            foreach (RigidNode_Base node in nodes)
            {
                JointDriver driver = node.GetSkeletalJoint().cDriver;
                if (driver == null || driver.CompareTo(baseJoint.cDriver) != 0)
                {
                    same = false;
                }
            }

            if (same)
            {
                joint = baseJoint;
            }
            else
            {
                joint = SkeletalJoint_Base.JOINT_FACTORY(baseJoint.GetJointType());
            }
        }
        else
        {
            joint = baseJoint;
        }
        this.nodes  = nodes;
        typeOptions = JointDriver.GetAllowedDrivers(joint);

        cmbJointDriver.Items.Clear();
        cmbJointDriver.Items.Add("No Driver");
        foreach (JointDriverType type in typeOptions)
        {
            cmbJointDriver.Items.Add(Enum.GetName(typeof(JointDriverType), type).Replace('_', ' ').ToLowerInvariant());
        }
        if (joint.cDriver != null)
        {
            cmbJointDriver.SelectedIndex = Array.IndexOf(typeOptions, joint.cDriver.GetDriveType()) + 1;
            txtPortA.Value     = joint.cDriver.portA;
            txtPortB.Value     = joint.cDriver.portB;
            txtLowLimit.Value  = (decimal)joint.cDriver.lowerLimit;
            txtHighLimit.Value = (decimal)joint.cDriver.upperLimit;

            #region Meta info recovery
            {
                PneumaticDriverMeta pneumaticMeta = joint.cDriver.GetInfo <PneumaticDriverMeta>();
                if (pneumaticMeta != null)
                {
                    cmbPneumaticDiameter.SelectedIndex = (byte)pneumaticMeta.widthEnum;
                    cmbPneumaticPressure.SelectedIndex = (byte)pneumaticMeta.pressureEnum;
                }
                else
                {
                    cmbPneumaticDiameter.SelectedIndex = (byte)PneumaticDiameter.MEDIUM;
                    cmbPneumaticPressure.SelectedIndex = (byte)PneumaticPressure.HIGH;
                }
            }
            {
                WheelDriverMeta wheelMeta = joint.cDriver.GetInfo <WheelDriverMeta>();
                if (wheelMeta != null)
                {
                    try
                    {
                        // TODO:  This is a really sketchy hack and I don't even know where the cat is.
                        cmbWheelType.SelectedIndex = (byte)wheelMeta.type;
                        if (wheelMeta.forwardExtremeValue > 8)
                        {
                            cmbFrictionLevel.SelectedIndex = (byte)FrictionLevel.HIGH;
                        }
                        else if (wheelMeta.forwardExtremeValue > 4)
                        {
                            cmbFrictionLevel.SelectedIndex = (byte)FrictionLevel.MEDIUM;
                        }
                        else
                        {
                            cmbFrictionLevel.SelectedIndex = (byte)FrictionLevel.LOW;
                        }
                    }
                    catch
                    {
                        // If an exception was thrown (System.ArguementOutOfRangeException) it means
                        // the user did not choose a wheel type when they were configuring the
                        // wheel joint
                        cmbWheelType.SelectedIndex     = (byte)WheelType.NORMAL;
                        cmbFrictionLevel.SelectedIndex = (byte)FrictionLevel.MEDIUM;
                    }

                    chkBoxDriveWheel.Checked = wheelMeta.isDriveWheel;
                    cmbWheelType_SelectedIndexChanged(null, null);
                }
                else
                {
                    cmbWheelType.SelectedIndex     = (byte)WheelType.NOT_A_WHEEL;
                    cmbFrictionLevel.SelectedIndex = (byte)FrictionLevel.MEDIUM;
                }
            }
            {
                ElevatorDriverMeta elevatorMeta = joint.cDriver.GetInfo <ElevatorDriverMeta>();
                if (elevatorMeta != null)
                {
                    cmbStages.SelectedIndex = (byte)elevatorMeta.type;
                }
            }
            #endregion
        }
        else //Default values
        {
            cmbJointDriver.SelectedIndex = 0;
            txtPortA.Value     = txtPortA.Minimum;
            txtPortB.Value     = txtPortB.Minimum;
            txtLowLimit.Value  = txtLowLimit.Minimum;
            txtHighLimit.Value = txtHighLimit.Minimum;

            cmbPneumaticDiameter.SelectedIndex = (byte)PneumaticDiameter.MEDIUM;
            cmbPneumaticPressure.SelectedIndex = (byte)PneumaticPressure.MEDIUM;

            cmbWheelType.SelectedIndex     = (byte)WheelType.NOT_A_WHEEL;
            cmbFrictionLevel.SelectedIndex = (byte)FrictionLevel.MEDIUM;
            chkBoxDriveWheel.Checked       = false;

            cmbStages.SelectedIndex = (byte)ElevatorType.NOT_MULTI;
        }
        PerformLayout();
        this.ShowDialog(owner);
    }