/// <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); }
private void CreateWheel() { WheelDriverMeta wheel = this.GetDriverMeta <WheelDriverMeta>(); BSphereShape sphereShape = MainObject.AddComponent <BSphereShape>(); sphereShape.Radius = wheel.radius * 0.01f; }
// 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); } } } }
/// <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; }
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); }
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"); }
/// <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; } }
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); }
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"); } }
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; }
/// <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); } } } }
/// <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(); }
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); }
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); }
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; } } }
/// <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); }
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)); }; }
/// <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(); } }
/// <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); }
/// <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(); }
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); }
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); }; }
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); }
/// <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); }
/// <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(); } }