Пример #1
0
        /// <summary>
        /// Creates a wheel and attaches it to the parent BRaycastVehicle.
        /// </summary>
        /// <param name="node"></param>
        public void CreateWheel(RigidNode node)
        {
            this.node = node;

            RigidNode parent = (RigidNode)node.GetParent();

            robot = parent.MainObject.GetComponent <BRaycastRobot>();

            if (robot == null)
            {
                Debug.LogError("Could not add BRaycastWheel because its parent does not have a BRaycastVehicle!");
                Destroy(this);
            }

            RotationalJoint_Base joint = (RotationalJoint_Base)node.GetSkeletalJoint();

            joint.basePoint.x *= -1;

            node.OrientWheelNormals();

            axis = joint.axis.AsV3();

            WheelDriverMeta driverMeta = node.GetDriverMeta <WheelDriverMeta>();

            radius = driverMeta.radius * 0.01f;

            Vector3 localPosition = parent.MainObject.transform.InverseTransformPoint(node.MainObject.transform.position);

            basePoint = localPosition.ToBullet() + new BulletSharp.Math.Vector3(0f, VerticalOffset, 0f);

            wheelIndex = robot.AddWheel(driverMeta.type, basePoint, axis.normalized.ToBullet(), VerticalOffset, radius);
        }
Пример #2
0
    private void CreateWheel()
    {
        WheelDriverMeta wheel       = this.GetDriverMeta <WheelDriverMeta>();
        BSphereShape    sphereShape = MainObject.AddComponent <BSphereShape>();

        sphereShape.Radius = wheel.radius * 0.01f;
    }
Пример #3
0
        // Generation Methods
        private RigidNode_Base CreateNodeWithChild()
        {
            RotationalJoint_Base joint = new RotationalJoint_Base();

            joint.axis      = new BXDVector3(2, 2, 2);
            joint.basePoint = new BXDVector3(3, 131, 3);

            JointDriver driver = new JointDriver(JointDriverType.MOTOR);

            driver.SetPort(414);
            driver.isCan = true;

            WheelDriverMeta wheelDriverMeta = new WheelDriverMeta();

            wheelDriverMeta.radius = 9.4F;
            wheelDriverMeta.center = new BXDVector3(1, 1, 1);

            driver.AddInfo(wheelDriverMeta);


            joint.cDriver = driver;



            Guid           childID   = new Guid();
            RigidNode_Base baseNode  = new RigidNode_Base(id);
            RigidNode_Base childNode = new RigidNode_Base(childID);

            baseNode.AddChild(joint, childNode);
            return(baseNode);
        }
        /// <summary>
        /// Update the list of joints
        /// </summary>
        private void UpdateJointList()
        {
            lstJoints.Items.Clear();

            if (nodeList == null)
            {
                return;
            }

            foreach (RigidNode_Base node in nodeList)
            {
                if (node.GetSkeletalJoint() != null)
                {
                    SkeletalJoint_Base joint = node.GetSkeletalJoint();
                    if (joint != null)
                    {
                        WheelDriverMeta wheelData = null;
                        if (joint.cDriver != null)
                        {
                            wheelData = joint.cDriver.GetInfo <WheelDriverMeta>();
                        }

                        System.Windows.Forms.ListViewItem item = new System.Windows.Forms.ListViewItem(new string[] {
                            Enum.GetName(typeof(SkeletalJointType), joint.GetJointType()).ToLowerInvariant(),
                            node.GetParent().ModelFileName,
                            node.ModelFileName, joint.cDriver != null ? joint.cDriver.ToString() : "No driver",
                            wheelData != null ? wheelData.GetTypeString() : "No Wheel",
                            joint.attachedSensors.Count.ToString()
                        });
                        item.Tag = node;
                        lstJoints.Items.Add(item);
                    }
                }
            }
        }
Пример #5
0
    /// <summary>
    /// Creates the capsule collider and better wheel collider for this object.
    /// </summary>
    private void CreateWheel()
    {
        WheelDriverMeta wheel = this.GetDriverMeta <WheelDriverMeta>();

        if (wheel == null)
        {
            return;
        }

        wheelCollider = new GameObject(unityObject.name + " Collider");

        wheelCollider.transform.parent = unityObject.transform;
        Vector3 anchorBase = joint.connectedAnchor;
        float   centerMod  = Vector3.Dot(wheel.center.AsV3() - anchorBase, joint.axis);

        wheelCollider.transform.localPosition = centerMod * joint.axis + anchorBase;
        wheelCollider.transform.rotation      = Quaternion.FromToRotation(new Vector3(1, 0, 0), new Vector3(joint.axis.x, joint.axis.y, joint.axis.z));

        wheelCollider.AddComponent <CapsuleCollider>().radius    = (wheel.radius * 1.10f) * 0.01f;
        wheelCollider.GetComponent <CapsuleCollider>().height    = wheelCollider.GetComponent <CapsuleCollider>().radius / 4f + wheel.width * 0.01f;
        wheelCollider.GetComponent <CapsuleCollider>().center    = new Vector3(0, 0, 0);
        wheelCollider.GetComponent <CapsuleCollider>().direction = 0;
        unityObject.AddComponent <BetterWheelCollider>();
        //I want the grandfather to have a rigidbody

        unityObject.GetComponent <Rigidbody>().useConeFriction = true;
    }
Пример #6
0
        private bool ShouldSave()
        {
            if (joint.cDriver == null)
            {
                return(true);
            }

            double inputGear = 1, outputGear = 1;

            inputGear  = (double)InputGeartxt.Value;
            outputGear = (double)OutputGeartxt.Value;

            PneumaticDriverMeta pneumatic = joint.cDriver.GetInfo <PneumaticDriverMeta>();
            WheelDriverMeta     wheel     = joint.cDriver.GetInfo <WheelDriverMeta>();
            ElevatorDriverMeta  elevator  = joint.cDriver.GetInfo <ElevatorDriverMeta>();

            Enum.TryParse(MotorTypeDropDown.SelectedItem.ToString(), out MotorType motor);
            if (cmbJointDriver.SelectedIndex != typeOptions.ToList().IndexOf(joint.cDriver.GetDriveType()) + 1 ||
                txtPort1.Value != joint.cDriver.port1 ||
                txtPort2.Value != joint.cDriver.port2 ||
                txtLowLimit.Value != (decimal)joint.cDriver.lowerLimit ||
                txtHighLimit.Value != (decimal)joint.cDriver.upperLimit ||
                inputGear != joint.cDriver.InputGear || outputGear != joint.cDriver.OutputGear ||
                rbCAN.Checked != joint.cDriver.isCan || chkBoxHasBrake.Checked != joint.cDriver.hasBrake ||
                motor != joint.cDriver.motor)
            {
                return(true);
            }

            if (pneumatic != null &&
                (numericUpDownPnuDia.Value != (decimal)pneumatic.width ||
                 cmbPneumaticPressure.SelectedIndex != (int)pneumatic.pressureEnum))
            {
                return(true);
            }

            if (wheel != null &&
                (cmbWheelType.SelectedIndex != (int)wheel.type ||
                 cmbFrictionLevel.SelectedIndex != (int)wheel.GetFrictionLevel() ||
                 chkBoxDriveWheel.Checked != wheel.isDriveWheel))
            {
                return(true);
            }

            if (elevator != null)
            {
                return(true);
            }

            //If going from "NOT A WHEEL" to a wheel
            if (cmbWheelType.SelectedIndex != 0 && wheel == null && joint.cDriver.GetDriveType() == JointDriverType.MOTOR)
            {
                return(true);
            }

            return(false);
        }
Пример #7
0
        public static string WheelTypeString(SkeletalJoint_Base joint)
        {
            WheelDriverMeta wheelData = null;

            if (joint.cDriver != null)
            {
                wheelData = joint.cDriver.GetInfo <WheelDriverMeta>();
            }

            return(wheelData != null?wheelData.GetTypeString() + ", " + WheelFrictionString(wheelData) + " Friction" : "No Wheel");
        }
Пример #8
0
        /// <summary>
        /// Creates the joint data
        /// </summary>
        public void CreateJoint()
        {
            if (joint != null || GetSkeletalJoint() == null)
            {
                return;
            }

            switch (GetSkeletalJoint().GetJointType())
            {
            case SkeletalJointType.ROTATIONAL:
                RotationalJoint_Base nodeR        = (RotationalJoint_Base)GetSkeletalJoint();
                CollisionObject      parentObject = ((BulletRigidNode)GetParent()).BulletObject;
                WheelDriverMeta      wheel        = GetSkeletalJoint().cDriver.GetInfo <WheelDriverMeta>();

                Vector3 pivot = nodeR.basePoint.Convert();

                Matrix4 locJ, locP;     //Local Joint Pivot, Local Parent Pivot

                BulletObject.WorldTransform = parentObject.WorldTransform * Matrix4.CreateTranslation(pivot);

                if (debug)
                {
                    Console.WriteLine("Pivot at " + pivot);
                }

                GetFrames(nodeR.basePoint.Convert(), parentObject.WorldTransform, BulletObject.WorldTransform, out locP, out locJ);

                //HingeConstraint temp = new HingeConstraint((RigidBody)parentObject, /*(RigidBody)*/BulletObject, locP, locJ);
                HingeConstraint temp = new HingeConstraint((RigidBody)parentObject, BulletObject, pivot, Vector3.Zero, nodeR.axis.Convert(), nodeR.axis.Convert());
                joint = temp;
                temp.SetAxis(nodeR.axis.Convert());

                if (nodeR.hasAngularLimit)
                {
                    temp.SetLimit(nodeR.angularLimitLow, nodeR.angularLimitHigh);
                }

                //also need to find a less screwy way to do this
                Update = (f) => { (/*(RigidBody)*/ BulletObject).ApplyTorque(nodeR.axis.Convert() * f * 25); };

                if (debug)
                {
                    Console.WriteLine("{0} joint made", wheel == null ? "Rotational" : "Wheel");
                }
                break;

            default:
                if (debug)
                {
                    Console.WriteLine("Received joint of type {0}", GetSkeletalJoint().GetJointType());
                }
                break;
            }
        }
Пример #9
0
    private bool shouldSave()
    {
        if (joint.cDriver == null)
        {
            return(true);
        }

        PneumaticDriverMeta pneumatic = joint.cDriver.GetInfo <PneumaticDriverMeta>();
        WheelDriverMeta     wheel     = joint.cDriver.GetInfo <WheelDriverMeta>();
        ElevatorDriverMeta  elevator  = joint.cDriver.GetInfo <ElevatorDriverMeta>();

        bool shouldSave = false;

        if (cmbJointDriver.SelectedIndex != typeOptions.ToList().IndexOf(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)
        {
            shouldSave = true;
        }

        if (pneumatic != null &&
            (cmbPneumaticDiameter.SelectedIndex != (byte)pneumatic.widthEnum ||
             cmbPneumaticPressure.SelectedIndex != (byte)pneumatic.pressureEnum))
        {
            shouldSave = true;
        }

        if (wheel != null &&
            (cmbWheelType.SelectedIndex != (byte)wheel.type ||
             cmbFrictionLevel.SelectedIndex != (byte)Math.Min(Math.Floor(wheel.forwardExtremeValue / 4), 2) || //ayy lmao
             chkBoxDriveWheel.Checked != wheel.isDriveWheel))
        {
            shouldSave = true;
        }

        if (elevator != null &&
            cmbStages.SelectedIndex != (byte)elevator.type)
        {
            shouldSave = true;
        }

        //If going from "NOT A WHEEL" to a wheel
        if (cmbWheelType.SelectedIndex != 0 && wheel == null && joint.cDriver.GetDriveType() == JointDriverType.MOTOR)
        {
            shouldSave = true;
        }

        return(shouldSave);
    }
Пример #10
0
        public static string WheelFrictionString(WheelDriverMeta wheel)
        {
            switch (wheel.GetFrictionLevel())
            {
            case FrictionLevel.LOW:
                return("Low");

            case FrictionLevel.MEDIUM:
                return("Medium");

            case FrictionLevel.HIGH:
                return("High");

            default:
                return("None");
            }
        }
Пример #11
0
    private void CreateWheel()
    {
        BRigidBody rigidBody = MainObject.GetComponent <BRigidBody>();

        rigidBody.friction = WHEEL_FRICTION;

        WheelDriverMeta wheel       = this.GetDriverMeta <WheelDriverMeta>();
        BSphereShape    sphereShape = MainObject.AddComponent <BSphereShape>();

        sphereShape.Radius = wheel.radius * 0.01f;

        // Old cylinder method... collision not as smoth.
        ////BCylinderShapeZ cylinderShape = MainObject.AddComponent<BCylinderShapeZ>();
        //BCylinderShapeX cylinderShape = MainObject.AddComponent<BCylinderShapeX>();
        //cylinderShape.HalfExtent = new Vector3(wheel.radius * 1.5f, wheel.width, wheel.width) * 0.01f;
        //cylinderShape.GetCollisionShape().Margin = wheel.radius * 0.005f; // hopefully change later?

        // ... and continuous collision detection
        rigidBody.GetCollisionObject().CcdMotionThreshold   = CCD_MOTION_THRESHOLD;
        rigidBody.GetCollisionObject().CcdSweptSphereRadius = CCD_SWEPT_SPHERE_RADIUS;
    }
Пример #12
0
        /// <summary>
        /// Update the list of joints
        /// </summary>
        private void UpdateJointList()
        {
            lstJoints.Items.Clear();

            if (nodeList == null)
            {
                return;
            }

            foreach (RigidNode_Base node in nodeList)
            {
                if (node.GetSkeletalJoint() != null)
                {
                    SkeletalJoint_Base joint = node.GetSkeletalJoint();
                    if (joint != null)
                    {
                        WheelDriverMeta wheelData = null;
                        if (joint.cDriver != null)
                        {
                            wheelData = joint.cDriver.GetInfo <WheelDriverMeta>();
                        }

                        ListViewItem item = new ListViewItem(new string[] {
                            Utilities.CapitalizeFirstLetter(Enum.GetName(typeof(SkeletalJointType), joint.GetJointType()), true),
                            Utilities.CapitalizeFirstLetter(node.GetParent().ModelFileName.Replace('_', ' ').Replace(".bxda", "")),
                            Utilities.CapitalizeFirstLetter(node.ModelFileName.Replace('_', ' ').Replace(".bxda", "")),
                            joint.cDriver != null ? joint.cDriver.ToString() : "No Driver",
                            wheelData != null ? wheelData.GetTypeString() : "No Wheel",
                            joint.attachedSensors.Count.ToString()
                        })
                        {
                            Tag = node
                        };
                        lstJoints.Items.Add(item);
                    }
                }
            }
        }
Пример #13
0
    /// <summary>
    /// Used for writing wheel driver meta data.
    /// </summary>
    /// <param name="meta"></param>
    /// <param name="writer"></param>
    private static void WriteWheelDriverMeta(WheelDriverMeta meta, XmlWriter writer)
    {
        writer.WriteStartElement("WheelDriverMeta");

        writer.WriteAttributeString("DriverMetaID", meta.GetID().ToString());

        writer.WriteElementString("WheelType", meta.type.ToString());
        writer.WriteElementString("WheelRadius", meta.radius.ToString("F4"));
        writer.WriteElementString("WheelWidth", meta.width.ToString("F4"));

        WriteBXDVector3(meta.center, writer, "WheelCenter");

        writer.WriteElementString("ForwardAsympSlip", meta.forwardAsympSlip.ToString("F4"));
        writer.WriteElementString("ForwardAsympValue", meta.forwardAsympValue.ToString("F4"));
        writer.WriteElementString("ForwardExtremeSlip", meta.forwardExtremeSlip.ToString("F4"));
        writer.WriteElementString("ForwardExtremeValue", meta.forwardExtremeValue.ToString("F4"));
        writer.WriteElementString("SideAsympSlip", meta.sideAsympSlip.ToString("F4"));
        writer.WriteElementString("SideAsympValue", meta.sideAsympValue.ToString("F4"));
        writer.WriteElementString("SideExtremeSlip", meta.sideExtremeSlip.ToString("F4"));
        writer.WriteElementString("SideExtremeValue", meta.sideExtremeValue.ToString("F4"));
        writer.WriteElementString("IsDriveWheel", meta.isDriveWheel.ToString().ToLower());

        writer.WriteEndElement();
    }
Пример #14
0
            public void ApplyToNode()
            {
                Node.GetSkeletalJoint().cDriver = new JointDriver(JointDriverType.MOTOR);
                Node.GetSkeletalJoint().cDriver.SetPort(PWMPort);
                WheelDriverMeta wheelDriver = new WheelDriverMeta();

                switch (FrictionLevel)
                {
                case WizardFrictionLevel.HIGH:
                    wheelDriver.forwardExtremeSlip  = 1;    //Speed of max static friction force.
                    wheelDriver.forwardExtremeValue = 10;   //Force of max static friction force.
                    wheelDriver.forwardAsympSlip    = 1.5f; //Speed of leveled off kinetic friction force.
                    wheelDriver.forwardAsympValue   = 8;    //Force of leveld off kinetic friction force.

                    if (WheelType == WizardWheelType.OMNI)  //Set to relatively low friction, as omni wheels can move sidways.
                    {
                        wheelDriver.sideExtremeSlip  = 1;   //Same as above, but orthogonal to the movement of the wheel.
                        wheelDriver.sideExtremeValue = .01f;
                        wheelDriver.sideAsympSlip    = 1.5f;
                        wheelDriver.sideAsympValue   = .005f;
                    }
                    else
                    {
                        wheelDriver.sideExtremeSlip  = 1;
                        wheelDriver.sideExtremeValue = 10;
                        wheelDriver.sideAsympSlip    = 1.5f;
                        wheelDriver.sideAsympValue   = 8;
                    }
                    break;

                case WizardFrictionLevel.MEDIUM:
                    wheelDriver.forwardExtremeSlip  = 1f;
                    wheelDriver.forwardExtremeValue = 7;
                    wheelDriver.forwardAsympSlip    = 1.5f;
                    wheelDriver.forwardAsympValue   = 5;

                    if (WheelType == WizardWheelType.OMNI)
                    {
                        wheelDriver.sideExtremeSlip  = 1;
                        wheelDriver.sideExtremeValue = .01f;
                        wheelDriver.sideAsympSlip    = 1.5f;
                        wheelDriver.sideAsympValue   = .005f;
                    }
                    else
                    {
                        wheelDriver.sideExtremeSlip  = 1;
                        wheelDriver.sideExtremeValue = 7;
                        wheelDriver.sideAsympSlip    = 1.5f;
                        wheelDriver.sideAsympValue   = 5;
                    }
                    break;

                case WizardFrictionLevel.LOW:
                    wheelDriver.forwardExtremeSlip  = 1;
                    wheelDriver.forwardExtremeValue = 5;
                    wheelDriver.forwardAsympSlip    = 1.5f;
                    wheelDriver.forwardAsympValue   = 3;

                    if (WheelType == WizardWheelType.OMNI)
                    {
                        wheelDriver.sideExtremeSlip  = 1;
                        wheelDriver.sideExtremeValue = .01f;
                        wheelDriver.sideAsympSlip    = 1.5f;
                        wheelDriver.sideAsympValue   = .005f;
                    }
                    else
                    {
                        wheelDriver.sideExtremeSlip  = 1;
                        wheelDriver.sideExtremeValue = 5;
                        wheelDriver.sideAsympSlip    = 1.5f;
                        wheelDriver.sideAsympValue   = 3;
                    }
                    break;
                }
                wheelDriver.type         = (global::WheelType)WheelType;
                wheelDriver.isDriveWheel = true;
                Utilities.GUI.LoadMeshes();
                Node.GetSkeletalJoint().cDriver.AddInfo(wheelDriver);

                wheelDriver = (WheelDriverMeta)Node.GetSkeletalJoint().cDriver.GetInfo(typeof(WheelDriverMeta));
                (Node as OGLViewer.OGL_RigidNode).GetWheelInfo(out float radius, out float width, out BXDVector3 center);
                wheelDriver.radius = radius;
                wheelDriver.center = center;
                wheelDriver.width  = width;

                Node.GetSkeletalJoint().cDriver.AddInfo(wheelDriver);
            }
Пример #15
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);
        }
Пример #16
0
        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;
                }
            }
        }
Пример #17
0
    /// <summary>
    /// The lite equivalent of the 'Start Exporter' <see cref="Button"/> in the <see cref="ExporterForm"/>. Used in <see cref="ExporterWorker_DoWork(Object, "/>
    /// </summary>
    /// <seealso cref="ExporterWorker_DoWork"/>
    /// <param name="baseNode"></param>
    /// <returns></returns>
    public List <BXDAMesh> ExportMeshesLite(RigidNode_Base baseNode, float totalMassKg)
    {
        SurfaceExporter surfs = new SurfaceExporter();

        BXDJSkeleton.SetupFileNames(baseNode);

        List <RigidNode_Base> nodes = new List <RigidNode_Base>();

        baseNode.ListAllNodes(nodes);

        List <BXDAMesh> meshes = new List <BXDAMesh>();

        SetProgress(0, "Exporting Model");

        for (int i = 0; i < nodes.Count; i++)
        {
            RigidNode_Base node = nodes[i];

            if (node is RigidNode && node.GetModel() != null && node.ModelFileName != null && node.GetModel() is CustomRigidGroup)
            {
                try
                {
                    CustomRigidGroup group = (CustomRigidGroup)node.GetModel();

                    BXDAMesh output = surfs.ExportAll(group, node.GUID, (long progress, long total) =>
                    {
                        SetProgress(((double)progress / total) / nodes.Count + (double)i / nodes.Count);
                    });

                    output.colliders.Clear();
                    output.colliders.AddRange(ConvexHullCalculator.GetHull(output));

                    meshes.Add(output);
                }
                catch (Exception e)
                {
                    throw new Exception("Error exporting mesh: " + node.GetModelID(), e);
                }
            }
        }

        // Apply custom mass to mesh
        if (totalMassKg > 0) // Negative value indicates that default mass should be left alone (TODO: Make default mass more accurate)
        {
            float totalDefaultMass = 0;
            foreach (BXDAMesh mesh in meshes)
            {
                totalDefaultMass += mesh.physics.mass;
            }
            for (int i = 0; i < meshes.Count; i++)
            {
                meshes[i].physics.mass = totalMassKg * (float)(meshes[i].physics.mass / totalDefaultMass);
            }
        }

        // Add meshes to all nodes
        for (int i = 0; i < meshes.Count; i++)
        {
            ((OGL_RigidNode)nodes[i]).loadMeshes(meshes[i]);
        }

        // Get wheel information (radius, center, etc.) for all wheels
        foreach (RigidNode_Base node in nodes)
        {
            SkeletalJoint_Base joint = node.GetSkeletalJoint();

            // Joint will be null if the node has no connection.
            // cDriver will be null if there is no driver connected to the joint.
            if (joint != null && joint.cDriver != null)
            {
                WheelDriverMeta wheelDriver = (WheelDriverMeta)joint.cDriver.GetInfo(typeof(WheelDriverMeta));

                // Drivers without wheel metadata do not need radius, center, or width info.
                if (wheelDriver != null)
                {
                    (node as OGLViewer.OGL_RigidNode).GetWheelInfo(out float radius, out float width, out BXDVector3 center);
                    wheelDriver.radius = radius;
                    wheelDriver.center = center;
                    wheelDriver.width  = width;

                    joint.cDriver.AddInfo(wheelDriver);
                }
            }
        }

        return(meshes);
    }
Пример #18
0
    public SynthesisGUI()
    {
        InitializeComponent();

        Instance = this;

        robotViewer1.LoadSettings(ViewerSettings);
        bxdaEditorPane1.Units = ViewerSettings.modelUnits;

        RigidNode_Base.NODE_FACTORY = delegate(Guid guid)
        {
            return(new OGL_RigidNode(guid));
        };

        fileNew.Click += new System.EventHandler(delegate(object sender, System.EventArgs e)
        {
            SetNew();
        });
        fileLoad.Click += new System.EventHandler(delegate(object sender, System.EventArgs e)
        {
            LoadFromInventor();
        });
        fileOpen.Click += new System.EventHandler(delegate(object sender, System.EventArgs e)
        {
            OpenExisting();
        });
        fileSave.Click += new System.EventHandler(delegate(object sender, System.EventArgs e)
        {
            SaveRobot(false);
        });
        fileSaveAs.Click += new System.EventHandler(delegate(object sender, System.EventArgs e)
        {
            SaveRobot(true);
        });
        fileExit.Click += new System.EventHandler(delegate(object sender, System.EventArgs e)
        {
            Close();
        });

        settingsExporter.Click += new System.EventHandler(delegate(object sender, System.EventArgs e)
        {
            var defaultValues = BXDSettings.Instance.GetSettingsObject("Exporter Settings");

            ExporterSettingsForm eSettingsForm = new ExporterSettingsForm((defaultValues != null) ? (ExporterSettingsForm.ExporterSettingsValues)defaultValues :
                                                                          ExporterSettingsForm.GetDefaultSettings());

            eSettingsForm.ShowDialog(this);

            BXDSettings.Instance.AddSettingsObject("Exporter Settings", eSettingsForm.values);
            ExporterSettings = eSettingsForm.values;
        });
        settingsViewer.Click += new System.EventHandler(delegate(object sender, System.EventArgs e)
        {
            var defaultValues = BXDSettings.Instance.GetSettingsObject("Viewer Settings");

            ViewerSettingsForm vSettingsForm = new ViewerSettingsForm((defaultValues != null) ? (ViewerSettingsForm.ViewerSettingsValues)defaultValues :
                                                                      ViewerSettingsForm.GetDefaultSettings());

            vSettingsForm.ShowDialog(this);

            BXDSettings.Instance.AddSettingsObject("Viewer Settings", vSettingsForm.values);
            ViewerSettings = vSettingsForm.values;

            robotViewer1.LoadSettings(ViewerSettings);
            bxdaEditorPane1.Units = ViewerSettings.modelUnits;
        });

        helpAbout.Click += new System.EventHandler(delegate(object sender, System.EventArgs e)
        {
            AboutDialog about = new AboutDialog();
            about.ShowDialog(this);
        });

        this.FormClosing += new FormClosingEventHandler(delegate(object sender, FormClosingEventArgs e)
        {
            if (SkeletonBase != null && !WarnUnsaved())
            {
                e.Cancel = true;
            }
            else
            {
                BXDSettings.Save();
            }

            InventorManager.ReleaseInventor();
        });

        jointEditorPane1.ModifiedJoint += delegate(List <RigidNode_Base> nodes)
        {
            if (nodes == null || nodes.Count == 0)
            {
                return;
            }

            foreach (RigidNode_Base node in nodes)
            {
                if (node.GetSkeletalJoint() != null && node.GetSkeletalJoint().cDriver != null &&
                    node.GetSkeletalJoint().cDriver.GetInfo <WheelDriverMeta>() != null &&
                    node.GetSkeletalJoint().cDriver.GetInfo <WheelDriverMeta>().radius == 0 &&
                    node is OGL_RigidNode)
                {
                    float      radius, width;
                    BXDVector3 center;

                    (node as OGL_RigidNode).GetWheelInfo(out radius, out width, out center);

                    WheelDriverMeta wheelDriver = node.GetSkeletalJoint().cDriver.GetInfo <WheelDriverMeta>();
                    wheelDriver.center = center;
                    wheelDriver.radius = radius;
                    wheelDriver.width  = width;
                    node.GetSkeletalJoint().cDriver.AddInfo(wheelDriver);
                }
            }
        };


        jointEditorPane1.SelectedJoint += robotViewer1.SelectJoints;
        jointEditorPane1.SelectedJoint += bxdaEditorPane1.SelectJoints;

        robotViewer1.NodeSelected += jointEditorPane1.AddSelection;
        robotViewer1.NodeSelected += bxdaEditorPane1.AddSelection;

        bxdaEditorPane1.NodeSelected += (BXDAMesh mesh) =>
        {
            List <RigidNode_Base> nodes = new List <RigidNode_Base>();
            SkeletonBase.ListAllNodes(nodes);

            jointEditorPane1.AddSelection(nodes[Meshes.IndexOf(mesh)], true);
        };

        bxdaEditorPane1.NodeSelected += (BXDAMesh mesh) =>
        {
            List <RigidNode_Base> nodes = new List <RigidNode_Base>();
            SkeletonBase.ListAllNodes(nodes);

            robotViewer1.SelectJoints(nodes.GetRange(Meshes.IndexOf(mesh), 1));
        };
    }
Пример #19
0
        /// <summary>
        /// Saves all the data from the DriveChooser frame to be used elsewhere in the program.  Also begins calculation of wheel radius.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SaveButton_Click(object sender, EventArgs e)
        {
            bool canClose = true;

            if (!ShouldSave())
            {
                Close();
                return;
            }

            if (cmbJointDriver.SelectedIndex <= 0)
            {
                joint.cDriver = null;
            }
            else
            {
                JointDriverType cType = typeOptions[cmbJointDriver.SelectedIndex - 1];

                double inputGear = 1, outputGear = 1;

                inputGear = (double)InputGeartxt.Value;

                outputGear = (double)OutputGeartxt.Value;// tries to parse the double from the output gear

                joint.cDriver = new JointDriver(cType)
                {
                    port1      = (int)txtPort1.Value,
                    port2      = (int)txtPort2.Value,
                    InputGear  = inputGear,  // writes the input gear to the internal joint driver so it can be exported
                    OutputGear = outputGear, // writes the output gear to the internal joint driver so it can be exported
                    lowerLimit = (float)txtLowLimit.Value,
                    upperLimit = (float)txtHighLimit.Value,
                    isCan      = rbCAN.Checked,
                    hasBrake   = chkBoxHasBrake.Checked
                };
                if (cType.IsMotor())
                {
                    if (!Enum.TryParse(MotorTypeDropDown.SelectedItem.ToString(), out MotorType motor))
                    {
                        motor = MotorType.GENERIC;
                    }
                    joint.cDriver.motor = motor;
                    RobotExporterAddInServer.Instance.AddInSettingsManager.DefaultRobotCompetition = RobotCompetitionDropDown.SelectedItem.ToString();
                }
                //Only need to store wheel driver if run by motor and is a wheel.
                if (cType.IsMotor() && (WheelType)cmbWheelType.SelectedIndex != WheelType.NOT_A_WHEEL)
                {
                    WheelDriverMeta wheelDriver = new WheelDriverMeta()
                    {
                        type         = (WheelType)cmbWheelType.SelectedIndex,
                        isDriveWheel = chkBoxDriveWheel.Checked
                    }; //The info about the wheel attached to the joint.
                       //TODO: Find real values that make sense for the friction.  Also add Mecanum wheels.

                    wheelDriver.SetFrictionLevel((FrictionLevel)cmbFrictionLevel.SelectedIndex);

                    joint.cDriver.AddInfo(wheelDriver);
                }
                else
                {
                    joint.cDriver.RemoveInfo <WheelDriverMeta>();
                }

                if (cType.IsPneumatic())
                {
                    PneumaticDriverMeta pneumaticDriver = new PneumaticDriverMeta()
                    {
                        pressureEnum = (PneumaticPressure)cmbPneumaticPressure.SelectedIndex,
                        width        = (double)numericUpDownPnuDia.Value
                    }; //The info about the wheel attached to the joint.
                    joint.cDriver.AddInfo(pneumaticDriver);
                }
                else
                {
                    joint.cDriver.RemoveInfo <PneumaticDriverMeta>();
                }

                if (cType.IsElevator())
                {
                    ElevatorDriverMeta elevatorDriver = new ElevatorDriverMeta()
                    {
                        type = ElevatorType.NOT_MULTI
                    };
                    joint.cDriver.AddInfo(elevatorDriver);
                }
                else
                {
                    joint.cDriver.RemoveInfo <ElevatorDriverMeta>();
                }
            }

            if (nodes.Count > 1)
            {
                foreach (RigidNode_Base node in nodes)
                {
                    if (joint.cDriver == null)
                    {
                        node.GetSkeletalJoint().cDriver = null;
                    }
                    else
                    {
                        JointDriver driver = new JointDriver(joint.cDriver.GetDriveType())
                        {
                            port1      = joint.cDriver.port1,
                            port2      = joint.cDriver.port2,
                            isCan      = joint.cDriver.isCan,
                            OutputGear = joint.cDriver.OutputGear,
                            InputGear  = joint.cDriver.InputGear,
                            lowerLimit = joint.cDriver.lowerLimit,
                            upperLimit = joint.cDriver.upperLimit
                        };
                        joint.cDriver.CopyMetaInfo(driver);

                        node.GetSkeletalJoint().cDriver = driver;
                    }
                }
            }

            if (canClose)// make sure there are no outstanding issues for the user to fix before we save
            {
                Saved = true;
                Close();
            }
        }
Пример #20
0
        /// <summary>
        /// Creates a Rigid Body from a .bxda file
        /// </summary>
        /// <param name="FilePath"></param>
        public void CreateRigidBody(string FilePath)
        {
            CollisionShape     shape;
            WheelDriverMeta    wheel = null;
            DefaultMotionState motion;
            BXDAMesh           mesh = new BXDAMesh();

            mesh.ReadFromFile(FilePath);
            Vector3    loc;
            Quaternion rot = Quaternion.Identity;

            //Is it a wheel?
            if ((wheel = GetSkeletalJoint()?.cDriver?.GetInfo <WheelDriverMeta>()) != null && true)
            {
                //Align the cylinders
                Vector3 min, max;
                GetShape(mesh).GetAabb(Matrix4.Identity, out min, out max);
                Vector3 extents = max - min;

                //Find the thinnest dimension, that is probably wheat the cylinder should be aligned to
                if (extents.X < extents.Y) //X or Z
                {
                    if (extents.X < extents.Z)
                    {
                        shape = new CylinderShapeX(wheel.width, wheel.radius, wheel.radius); //X
                    }
                    else
                    {
                        shape = new CylinderShapeZ(wheel.radius, wheel.radius, wheel.width); //Z
                    }
                }
                else //Y or Z
                {
                    if (extents.Y < extents.Z)
                    {
                        shape = new CylinderShape(wheel.radius, wheel.width, wheel.radius); //Y
                    }
                    else
                    {
                        shape = new CylinderShapeZ(wheel.radius, wheel.radius, wheel.width); //Z
                    }
                }

                loc = MeshUtilities.MeshCenter(mesh);
            }
            //Rigid Body Construction
            else
            {
                shape = GetShape(mesh);
                loc   = MeshUtilities.MeshCenter(mesh);
            }

            if (debug)
            {
                Console.WriteLine("Rotation is " + rot);
            }

            motion = new DefaultMotionState(Matrix4.CreateTranslation(loc + new Vector3(0, 100, 0)));
            RigidBodyConstructionInfo info = new RigidBodyConstructionInfo(mesh.physics.mass, motion, shape, shape.CalculateLocalInertia(mesh.physics.mass));

            //Temp?
            info.Friction        = 100;
            info.RollingFriction = 100;
            //info.AngularDamping = 0f;
            //info.LinearDamping = 0.5f;

            BulletObject = new RigidBody(info);
        }
Пример #21
0
    /// <summary>
    /// Saves all the data from the DriveChooser frame to be used elsewhere in the program.  Also begins calculation of wheel radius.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnSave_Click(object sender, EventArgs e)
    {
        if (!shouldSave())
        {
            Hide();
            return;
        }

        if (cmbJointDriver.SelectedIndex <= 0)
        {
            joint.cDriver = null;
        }
        else
        {
            JointDriverType cType = typeOptions[cmbJointDriver.SelectedIndex - 1];

            joint.cDriver = new JointDriver(cType)
            {
                portA      = (int)txtPortA.Value,
                portB      = (int)txtPortB.Value,
                lowerLimit = (float)txtLowLimit.Value,
                upperLimit = (float)txtHighLimit.Value,
                isCan      = rbCAN.Checked
            };
            //Only need to store wheel driver if run by motor and is a wheel.
            if (cType.IsMotor() && (WheelType)cmbWheelType.SelectedIndex != WheelType.NOT_A_WHEEL)
            {
                #region WHEEL_SAVING
                WheelDriverMeta wheelDriver = new WheelDriverMeta()
                {
                    type         = (WheelType)cmbWheelType.SelectedIndex,
                    isDriveWheel = chkBoxDriveWheel.Checked
                }; //The info about the wheel attached to the joint.
                   //TODO: Find real values that make sense for the friction.  Also add Mecanum wheels.
                switch ((FrictionLevel)cmbFrictionLevel.SelectedIndex)
                {
                case FrictionLevel.HIGH:
                    wheelDriver.forwardExtremeSlip  = 1;    //Speed of max static friction force.
                    wheelDriver.forwardExtremeValue = 10;   //Force of max static friction force.
                    wheelDriver.forwardAsympSlip    = 1.5f; //Speed of leveled off kinetic friction force.
                    wheelDriver.forwardAsympValue   = 8;    //Force of leveld off kinetic friction force.

                    if (wheelDriver.type == WheelType.OMNI) //Set to relatively low friction, as omni wheels can move sidways.
                    {
                        wheelDriver.sideExtremeSlip  = 1;   //Same as above, but orthogonal to the movement of the wheel.
                        wheelDriver.sideExtremeValue = .01f;
                        wheelDriver.sideAsympSlip    = 1.5f;
                        wheelDriver.sideAsympValue   = .005f;
                    }
                    else
                    {
                        wheelDriver.sideExtremeSlip  = 1;
                        wheelDriver.sideExtremeValue = 10;
                        wheelDriver.sideAsympSlip    = 1.5f;
                        wheelDriver.sideAsympValue   = 8;
                    }
                    break;

                case FrictionLevel.MEDIUM:
                    wheelDriver.forwardExtremeSlip  = 1f;
                    wheelDriver.forwardExtremeValue = 7;
                    wheelDriver.forwardAsympSlip    = 1.5f;
                    wheelDriver.forwardAsympValue   = 5;

                    if (wheelDriver.type == WheelType.OMNI)
                    {
                        wheelDriver.sideExtremeSlip  = 1;
                        wheelDriver.sideExtremeValue = .01f;
                        wheelDriver.sideAsympSlip    = 1.5f;
                        wheelDriver.sideAsympValue   = .005f;
                    }
                    else
                    {
                        wheelDriver.sideExtremeSlip  = 1;
                        wheelDriver.sideExtremeValue = 7;
                        wheelDriver.sideAsympSlip    = 1.5f;
                        wheelDriver.sideAsympValue   = 5;
                    }
                    break;

                case FrictionLevel.LOW:
                    wheelDriver.forwardExtremeSlip  = 1;
                    wheelDriver.forwardExtremeValue = 5;
                    wheelDriver.forwardAsympSlip    = 1.5f;
                    wheelDriver.forwardAsympValue   = 3;

                    if (wheelDriver.type == WheelType.OMNI)
                    {
                        wheelDriver.sideExtremeSlip  = 1;
                        wheelDriver.sideExtremeValue = .01f;
                        wheelDriver.sideAsympSlip    = 1.5f;
                        wheelDriver.sideAsympValue   = .005f;
                    }
                    else
                    {
                        wheelDriver.sideExtremeSlip  = 1;
                        wheelDriver.sideExtremeValue = 5;
                        wheelDriver.sideAsympSlip    = 1.5f;
                        wheelDriver.sideAsympValue   = 3;
                    }
                    break;
                }

                joint.cDriver.AddInfo(wheelDriver);
                #endregion
            }
            else
            {
                joint.cDriver.RemoveInfo <WheelDriverMeta>();
            }

            if (cType.IsPneumatic())
            {
                #region PNEUMATIC_SAVING
                PneumaticDriverMeta pneumaticDriver = new PneumaticDriverMeta()
                {
                    pressureEnum = (PneumaticPressure)cmbPneumaticPressure.SelectedIndex,
                    widthEnum    = (PneumaticDiameter)cmbPneumaticDiameter.SelectedIndex
                }; //The info about the wheel attached to the joint.
                joint.cDriver.AddInfo(pneumaticDriver);
                #endregion
            }
            else
            {
                joint.cDriver.RemoveInfo <PneumaticDriverMeta>();
            }

            if (cType.IsElevator())
            {
                #region ELEVATOR_SAVING
                ElevatorDriverMeta elevatorDriver = new ElevatorDriverMeta()
                {
                    type = (ElevatorType)cmbStages.SelectedIndex
                };
                joint.cDriver.AddInfo(elevatorDriver);
                #endregion
            }
            else
            {
                joint.cDriver.RemoveInfo <ElevatorDriverMeta>();
            }
        }

        if (nodes.Count > 1)
        {
            foreach (RigidNode_Base node in nodes)
            {
                if (joint.cDriver == null)
                {
                    node.GetSkeletalJoint().cDriver = null;
                }
                else
                {
                    JointDriver driver = new JointDriver(joint.cDriver.GetDriveType())
                    {
                        portA      = joint.cDriver.portA,
                        portB      = joint.cDriver.portB,
                        isCan      = joint.cDriver.isCan,
                        lowerLimit = joint.cDriver.lowerLimit,
                        upperLimit = joint.cDriver.upperLimit
                    };
                    joint.cDriver.CopyMetaInfo(driver);

                    node.GetSkeletalJoint().cDriver = driver;
                }
            }
        }

        Saved = true;
        Hide();
    }
Пример #22
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);

        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);
    }
Пример #23
0
    public SynthesisGUI(bool MakeOwners = false)
    {
        InitializeComponent();

        Instance = this;

        bxdaEditorPane1.Units = "lbs";
        BXDAViewerPaneForm.Controls.Add(bxdaEditorPane1);
        if (MakeOwners)
        {
            BXDAViewerPaneForm.Owner = this;
        }
        BXDAViewerPaneForm.FormClosing += Generic_FormClosing;

        JointPaneForm.Controls.Add(jointEditorPane1);
        if (MakeOwners)
        {
            JointPaneForm.Owner = this;
        }
        JointPaneForm.FormClosing += Generic_FormClosing;


        RigidNode_Base.NODE_FACTORY = delegate(Guid guid)
        {
            return(new OGL_RigidNode(guid));
        };

        settingsExporter.Click += SettingsExporter_OnClick;

        Shown += SynthesisGUI_Shown;

        FormClosing += new FormClosingEventHandler(delegate(object sender, FormClosingEventArgs e)
        {
            if (SkeletonBase != null && !WarnUnsaved())
            {
                e.Cancel = true;
            }
            InventorManager.ReleaseInventor();
        });

        jointEditorPane1.ModifiedJoint += delegate(List <RigidNode_Base> nodes)
        {
            if (nodes == null || nodes.Count == 0)
            {
                return;
            }

            foreach (RigidNode_Base node in nodes)
            {
                if (node.GetSkeletalJoint() != null && node.GetSkeletalJoint().cDriver != null &&
                    node.GetSkeletalJoint().cDriver.GetInfo <WheelDriverMeta>() != null &&
                    node.GetSkeletalJoint().cDriver.GetInfo <WheelDriverMeta>().radius == 0 &&
                    node is OGL_RigidNode)
                {
                    (node as OGL_RigidNode).GetWheelInfo(out float radius, out float width, out BXDVector3 center);

                    WheelDriverMeta wheelDriver = node.GetSkeletalJoint().cDriver.GetInfo <WheelDriverMeta>();
                    wheelDriver.center = center;
                    wheelDriver.radius = radius;
                    wheelDriver.width  = width;
                    node.GetSkeletalJoint().cDriver.AddInfo(wheelDriver);
                }
            }
        };

        jointEditorPane1.SelectedJoint += bxdaEditorPane1.SelectJoints;

        bxdaEditorPane1.NodeSelected += (BXDAMesh mesh) =>
        {
            List <RigidNode_Base> nodes = new List <RigidNode_Base>();
            SkeletonBase.ListAllNodes(nodes);

            jointEditorPane1.AddSelection(nodes[Meshes.IndexOf(mesh)], true);
        };
    }
Пример #24
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

            #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);
    }
Пример #25
0
    /// <summary>
    /// Reads a WheelDriverMeta from the given XmlReader.
    /// </summary>
    /// <param name="reader"></param>
    /// <returns></returns>
    private static WheelDriverMeta ReadWheelDriverMeta_3_0(XmlReader reader)
    {
        // Create new WheelDriveMeta.
        WheelDriverMeta wheelDriverMeta = new WheelDriverMeta();

        foreach (string name in IOUtilities.AllElements(reader))
        {
            switch (name)
            {
            case "WheelType":
                // Assign a value to the type.
                wheelDriverMeta.type = (WheelType)Enum.Parse(typeof(WheelType), reader.ReadElementContentAsString());
                break;

            case "WheelRadius":
                // Assign a value to the radius.
                wheelDriverMeta.radius = float.Parse(reader.ReadElementContentAsString());
                break;

            case "WheelWidth":
                // Assign a value to the width.
                wheelDriverMeta.width = float.Parse(reader.ReadElementContentAsString());
                break;

            case "BXDVector3":
                // Assign a value to the center.
                wheelDriverMeta.center = ReadBXDVector3_3_0(reader.ReadSubtree());
                break;

            case "ForwardAsympSlip":
                // Assign a value to the forwardAsympSlip.
                wheelDriverMeta.forwardAsympSlip = float.Parse(reader.ReadElementContentAsString());
                break;

            case "ForwardAsympValue":
                // Assign a value to the forwardAsympValue.
                wheelDriverMeta.forwardAsympValue = float.Parse(reader.ReadElementContentAsString());
                break;

            case "ForwardExtremeSlip":
                // Assign a value to the forwardExtremeSlip.
                wheelDriverMeta.forwardExtremeSlip = float.Parse(reader.ReadElementContentAsString());
                break;

            case "ForwardExtremeValue":
                // Assign a value to the forwardExtremeValue.
                wheelDriverMeta.forwardExtremeValue = float.Parse(reader.ReadElementContentAsString());
                break;

            case "SideAsympSlip":
                // Assign a value to the sideAsympSlip.
                wheelDriverMeta.sideAsympSlip = float.Parse(reader.ReadElementContentAsString());
                break;

            case "SideAsympValue":
                // Assign a value to the sideAsympValue.
                wheelDriverMeta.sideAsympValue = float.Parse(reader.ReadElementContentAsString());
                break;

            case "SideExtremeSlip":
                // Assign a value to the sideExtremeSlip.
                wheelDriverMeta.sideExtremeSlip = float.Parse(reader.ReadElementContentAsString());
                break;

            case "SideExtremeValue":
                // Assign a value to the sideExtremeValue.
                wheelDriverMeta.sideExtremeValue = float.Parse(reader.ReadElementContentAsString());
                break;

            case "IsDriveWheel":
                // Assign a value to isDriveWheel.
                wheelDriverMeta.isDriveWheel = reader.ReadElementContentAsBoolean();
                break;
            }
        }

        return(wheelDriverMeta);
    }
Пример #26
0
    /// <summary>
    /// Saves all the data from the DriveChooser frame to be used elsewhere in the program.  Also begins calculation of wheel radius.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void SaveButton_Click(object sender, EventArgs e)
    {
        bool canClose = true;

        if (!ShouldSave())
        {
            Close();
            return;
        }

        if (cmbJointDriver.SelectedIndex <= 0)
        {
            joint.cDriver = null;
        }
        else
        {
            JointDriverType cType = typeOptions[cmbJointDriver.SelectedIndex - 1];

            double inputGear = 1, outputGear = 1;

            inputGear = (double)InputGeartxt.Value;

            outputGear = (double)OutputGeartxt.Value;// tries to parse the double from the output gear

            joint.cDriver = new JointDriver(cType)
            {
                port1      = (int)txtPort1.Value,
                port2      = (int)txtPort2.Value,
                InputGear  = inputGear,  // writes the input gear to the internal joint driver so it can be exported
                OutputGear = outputGear, // writes the output gear to the internal joint driver so it can be exported
                lowerLimit = (float)txtLowLimit.Value,
                upperLimit = (float)txtHighLimit.Value,
                isCan      = rbCAN.Checked,
                hasBrake   = chkBoxHasBrake.Checked
            };
            //Only need to store wheel driver if run by motor and is a wheel.
            if (cType.IsMotor() && (WheelType)cmbWheelType.SelectedIndex != WheelType.NOT_A_WHEEL)
            {
                #region WHEEL_SAVING
                WheelDriverMeta wheelDriver = new WheelDriverMeta()
                {
                    type         = (WheelType)cmbWheelType.SelectedIndex,
                    isDriveWheel = chkBoxDriveWheel.Checked
                }; //The info about the wheel attached to the joint.
                   //TODO: Find real values that make sense for the friction.  Also add Mecanum wheels.

                wheelDriver.SetFrictionLevel((FrictionLevel)cmbFrictionLevel.SelectedIndex);

                joint.cDriver.AddInfo(wheelDriver);
                #endregion
            }
            else
            {
                joint.cDriver.RemoveInfo <WheelDriverMeta>();
            }

            if (cType.IsPneumatic())
            {
                #region PNEUMATIC_SAVING
                PneumaticDriverMeta pneumaticDriver = new PneumaticDriverMeta()
                {
                    pressureEnum = (PneumaticPressure)cmbPneumaticPressure.SelectedIndex,
                    widthEnum    = (PneumaticDiameter)cmbPneumaticDiameter.SelectedIndex
                }; //The info about the wheel attached to the joint.
                joint.cDriver.AddInfo(pneumaticDriver);
                #endregion
            }
            else
            {
                joint.cDriver.RemoveInfo <PneumaticDriverMeta>();
            }

            if (cType.IsElevator())
            {
                #region ELEVATOR_SAVING
                ElevatorDriverMeta elevatorDriver = new ElevatorDriverMeta()
                {
                    type = ElevatorType.NOT_MULTI
                };
                joint.cDriver.AddInfo(elevatorDriver);
                #endregion
            }
            else
            {
                joint.cDriver.RemoveInfo <ElevatorDriverMeta>();
            }
        }

        if (nodes.Count > 1)
        {
            foreach (RigidNode_Base node in nodes)
            {
                if (joint.cDriver == null)
                {
                    node.GetSkeletalJoint().cDriver = null;
                }
                else
                {
                    JointDriver driver = new JointDriver(joint.cDriver.GetDriveType())
                    {
                        port1      = joint.cDriver.port1,
                        port2      = joint.cDriver.port2,
                        isCan      = joint.cDriver.isCan,
                        OutputGear = joint.cDriver.OutputGear,
                        InputGear  = joint.cDriver.InputGear,
                        lowerLimit = joint.cDriver.lowerLimit,
                        upperLimit = joint.cDriver.upperLimit
                    };
                    joint.cDriver.CopyMetaInfo(driver);

                    node.GetSkeletalJoint().cDriver = driver;
                }
            }
        }

        if (canClose)// make sure there are no outstanding issues for the user to fix before we save
        {
            Saved = true;
            LegacyInterchange.LegacyEvents.OnRobotModified();
            Close();
        }
    }