/// <summary> /// 框架生成 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonFrame_Click(object sender, EventArgs e) { XDocument document = XDocument.Load(textBoxPath.Text); XElement partsEle = document.Element("Aircraft").Element("Assembly").Element("Parts"); List <XElement> partsElements = document.Element("Aircraft").Element("Assembly").Element("Parts").Elements("Part").ToList(); fuselages = new List <Fuselage>(); foreach (XElement part in partsElements) { if (part.Attribute("partType").Value == "Fuselage-Body-1") { if (part.Attribute("materials").Value == "14") { Fuselage fuselage = new Fuselage(); float[] pos = REW_Func.ReadFloatArrayStr(part.Attribute("position").Value); fuselage.position = new Vector3(pos[0], pos[1], pos[2]); float[] rot = REW_Func.ReadFloatArrayStr(part.Attribute("rotation").Value); fuselage.rotationEuler = new Vector3(rot[0], rot[1], rot[2]); float[] frontScale = REW_Func.ReadFloatArrayStr(part.Element("Fuselage.State").Attribute("frontScale").Value); float[] rearScale = REW_Func.ReadFloatArrayStr(part.Element("Fuselage.State").Attribute("rearScale").Value); float[] offset = REW_Func.ReadFloatArrayStr(part.Element("Fuselage.State").Attribute("offset").Value); fuselage.sectionL = new Vector2(frontScale[0], frontScale[1]); fuselage.sectionR = new Vector2(rearScale[0], rearScale[1]); fuselage.run = offset[0]; fuselage.rise = offset[1]; fuselage.length = offset[2]; fuselage.cornerTypes = REW_Func.ReadIntArrayStr(part.Element("Fuselage.State").Attribute("cornerTypes").Value); fuselages.Add(fuselage); } } } foreach (Fuselage fuselage in fuselages) { int[] cornersL = new int[] { fuselage.cornerTypes[0], fuselage.cornerTypes[1], fuselage.cornerTypes[2], fuselage.cornerTypes[3], fuselage.cornerTypes[0], fuselage.cornerTypes[1], fuselage.cornerTypes[2], fuselage.cornerTypes[3] }; int[] cornersR = new int[] { fuselage.cornerTypes[4], fuselage.cornerTypes[5], fuselage.cornerTypes[6], fuselage.cornerTypes[7], fuselage.cornerTypes[4], fuselage.cornerTypes[5], fuselage.cornerTypes[6], fuselage.cornerTypes[7] }; int lastIndex; int.TryParse((partsEle.Elements("Part").LastOrDefault().Attribute("id").Value), out lastIndex); partsEle.Add(new XElement("Part", new XAttribute("id", (lastIndex + 1)), new XAttribute("partType", "Fuselage-Body-1"), new XAttribute("position", fuselage.PosL().ToString()), new XAttribute("rotation", fuselage.rotationEuler.ToString()), new XAttribute("drag", "0,0,0,0,0,0"), new XAttribute("materials", "0"), new XAttribute("partCollisionResponse", "Default"), new XElement("FuelTank.State", new XAttribute("fuel", "0"), new XAttribute("capacity", "0")), new XElement("Fuselage.State", new XAttribute("version", "2"), new XAttribute("frontScale", fuselage.sectionL.ToString()), new XAttribute("rearScale", fuselage.sectionL.ToString()), new XAttribute("offset", 0f + "," + 0f + "," + 0.05f), new XAttribute("deadWeight", "0"), new XAttribute("buoyancy", "0"), new XAttribute("fuelPercentage", "0"), new XAttribute("autoSizeOnConnected", "false"), new XAttribute("cornerTypes", REW_Func.ArrayToString(cornersL)) ))); int.TryParse((partsEle.Elements("Part").LastOrDefault().Attribute("id").Value), out lastIndex); partsEle.Add(new XElement("Part", new XAttribute("id", (lastIndex + 1)), new XAttribute("partType", "Fuselage-Body-1"), new XAttribute("position", fuselage.PosR().ToString()), new XAttribute("rotation", fuselage.rotationEuler.ToString()), new XAttribute("drag", "0,0,0,0,0,0"), new XAttribute("materials", "1"), new XAttribute("partCollisionResponse", "Default"), new XElement("FuelTank.State", new XAttribute("fuel", "0"), new XAttribute("capacity", "0")), new XElement("Fuselage.State", new XAttribute("version", "2"), new XAttribute("frontScale", fuselage.sectionR.ToString()), new XAttribute("rearScale", fuselage.sectionR.ToString()), new XAttribute("offset", 0f + "," + 0f + "," + 0.05f), new XAttribute("deadWeight", "0"), new XAttribute("buoyancy", "0"), new XAttribute("fuelPercentage", "0"), new XAttribute("autoSizeOnConnected", "false"), new XAttribute("cornerTypes", REW_Func.ArrayToString(cornersR)) ))); } document.Save(textBoxPath.Text.Trim()); }
private void button1_Click(object sender, EventArgs e) { XDocument documentSR2 = XDocument.Load(textBoxPathSR2.Text); List <XElement> partsElementsSR2 = documentSR2.Element("Craft").Element("Assembly").Element("Parts").Elements("Part").ToList(); //List<XElement> block1ElementsSP = partsElementsSP.FindAll(x => x.Attribute("partType").Value == "Block-1"); //List<XElement> block2ElementsSP = partsElementsSP.FindAll(x => x.Attribute("partType").Value == "Block-2"); List <XElement> fuselageElementsSR2 = partsElementsSR2.FindAll(x => x.Attribute("partType").Value == "Fuselage1"); List <XElement> inletFuselageElementsSR2 = partsElementsSR2.FindAll(x => x.Attribute("partType").Value == "Inlet1"); List <XElement> structFuselageElementsSR2 = partsElementsSR2.FindAll(x => x.Attribute("partType").Value == "Strut1"); #region =======圆筒======= //--------------------------------------转换FuselageBody\FuselageCone-------------------------------------------- List <XElement> totalFuselageElementsSR2 = new List <XElement>(); totalFuselageElementsSR2.AddRange(fuselageElementsSR2); totalFuselageElementsSR2.AddRange(inletFuselageElementsSR2); totalFuselageElementsSR2.AddRange(structFuselageElementsSR2); List <XElement> totalFuselageElementsSP = new List <XElement>(); foreach (XElement fuselageEleSR2 in totalFuselageElementsSR2) { //partType int type; //0-fuselage 1-hollowFuselage 2-cone string strPartType = ""; switch (fuselageEleSR2.Attribute("partType").Value) { case "Fuselage1": strPartType = "Fuselage-Body-1"; type = 1; break; case "Inlet1": strPartType = "Fuselage-Hollow-1"; type = 2; break; case "Struct1": strPartType = "Fuselage-Body-1"; type = 3; break; default: strPartType = "Fuselage-Body-1"; type = 0; break; } ////Collision //string strDisableCol = fuselageEleSR2.Attribute("disableAircraftCollisions") != null ? fuselageEleSR2.Attribute("disableAircraftCollisions").Value : "false"; //string strPartCollisionHandling; //switch (strDisableCol) //{ // case "true": // strPartCollisionHandling = "Never"; // break; // case "false": // strPartCollisionHandling = "Default"; // break; // default: // strPartCollisionHandling = "Default"; // break; //} //materials int[] arrayMaterial = REW_Func.ReadIntArrayStr(fuselageEleSR2.Attribute("materials").Value); //scale string strPartScale = fuselageEleSR2.Element("Config").Attribute("partScale") != null?fuselageEleSR2.Element("Config").Attribute("partScale").Value : "1,1,1"; float[] scaleSR2 = REW_Func.ReadFloatArrayStr(strPartScale); float[] scaleSP = new float[] { scaleSR2[0], scaleSR2[2], scaleSR2[1] };; //SP2SR:1-3-2 SR2SP: 1-3-2 //sectionScale string strBottom = fuselageEleSR2.Element("Fuselage").Attribute("bottomScale").Value; string strTop = fuselageEleSR2.Element("Fuselage").Attribute("topScale").Value; float bottom1 = REW_Func.ReadFloatArrayStr(strBottom)[0] * 4f; //SP2SR : 0.25f float bottom2 = REW_Func.ReadFloatArrayStr(strBottom)[1] * 4f; float top1 = REW_Func.ReadFloatArrayStr(strTop)[0] * 4f; float top2 = REW_Func.ReadFloatArrayStr(strTop)[1] * 4f; //offset string strOffset = fuselageEleSR2.Element("Fuselage").Attribute("offset").Value; float offset1 = REW_Func.ReadFloatArrayStr(strOffset)[0] * 4f; float offset2 = REW_Func.ReadFloatArrayStr(strOffset)[1] * 4f; float offset3 = REW_Func.ReadFloatArrayStr(strOffset)[2] * 4f; if (true) { offset1 = -offset1; //offset3 = -offset3; } //rotation string strRotation = fuselageEleSR2.Attribute("rotation").Value; float rotationX = REW_Func.ReadFloatArrayStr(strRotation)[0]; float rotationY = REW_Func.ReadFloatArrayStr(strRotation)[1]; float rotationZ = REW_Func.ReadFloatArrayStr(strRotation)[2]; Matrix4x4 m1 = REW_Func.EulerToMatix(90f, 0, 0); Matrix4x4 m2 = REW_Func.EulerToMatix(-rotationX, -rotationY, -rotationZ); Vector3 euler = REW_Func.MatrixToEuler(m2 * m1); strRotation = euler.x + "," + euler.y + "," + euler.z; //cornertype string strCornerRads; if (fuselageEleSR2.Element("Fuselage").Attribute("cornerRadiuses") != null) { strCornerRads = fuselageEleSR2.Element("Fuselage").Attribute("cornerRadiuses").Value; } else { strCornerRads = "1,1,1,1,1,1,1,1"; } float[] cornerRads = REW_Func.ReadFloatArrayStr(strCornerRads); int[] cornerTypes = new int[8]; cornerTypes[0] = (int)Math.Ceiling(cornerRads[2] * 3); cornerTypes[1] = (int)Math.Ceiling(cornerRads[1] * 3); cornerTypes[2] = (int)Math.Ceiling(cornerRads[0] * 3); cornerTypes[3] = (int)Math.Ceiling(cornerRads[3] * 3); cornerTypes[4] = (int)Math.Ceiling(cornerRads[6] * 3); cornerTypes[5] = (int)Math.Ceiling(cornerRads[5] * 3); cornerTypes[6] = (int)Math.Ceiling(cornerRads[4] * 3); cornerTypes[7] = (int)Math.Ceiling(cornerRads[7] * 3); //??? ////deadWeight //string strDeadWeight = fuselageEleSR2.Element("Fuselage.State").Attribute("deadWeight").Value; //float deadWeight = Convert.ToSingle(strDeadWeight); ////fuelPercentage //string strFuelPercentage = fuselageEleSR2.Element("Fuselage.State").Attribute("fuelPercentage").Value; //float fuelPercentage = Convert.ToSingle(strFuelPercentage); XElement fuselageEleSPnew = new XElement("Part", new XAttribute("id", fuselageEleSR2.Attribute("id").Value), new XAttribute("partType", strPartType), new XAttribute("position", fuselageEleSR2.Attribute("position").Value), new XAttribute("rotation", strRotation), new XAttribute("materials", arrayMaterial[0] + "," + arrayMaterial[1] + "," + arrayMaterial[2]), new XAttribute("drag", "0,0,0,0,0,0"), new XAttribute("scale", scaleSP[0] + "," + scaleSP[1] + "," + scaleSP[2]), new XElement("FuelTank.State", new XAttribute("fuel", "0"), new XAttribute("capacity", "0")//fuel="0" capacity="0" ), new XElement("Fuselage.State", new XAttribute("version", "2"), new XAttribute("rearScale", bottom1 + "," + bottom2), new XAttribute("cornerTypes", REW_Func.ArrayToString(cornerTypes)), new XAttribute("deadWeight", "0"), new XAttribute("buoyancy", "0"), new XAttribute("fuelPercentage", "0"), new XAttribute("offset", offset1 + "," + offset3 + "," + offset2), new XAttribute("frontScale", top1 + "," + top2) ) ); totalFuselageElementsSP.Add(fuselageEleSPnew); } #endregion XDocument document = XDocument.Parse(Properties.Resources.ExportTemplateSP); XElement partsEle = document.Element("Aircraft").Element("Assembly").Element("Parts"); //XElement connsEle = document.Element("Craft").Element("Assembly").Element("Connections"); XElement cockpit = partsEle.Elements().ToList().Find(x => x.Attribute("partType").Value == "Cockpit-1"); cockpit.Attribute("id").SetValue("1"); partsEle.Add(totalFuselageElementsSP); //connsEle.Add(connElementsSR2); #region ---------------------------材质------------------------------------ List <XElement> materialsElements = documentSR2.Element("Craft").Element("DesignerSettings").Element("Theme").Elements("Material").ToList(); foreach (XElement material in materialsElements) { material.Add(new XAttribute("r", "0")); document.Element("Aircraft").Element("Theme").Add(material); } #endregion #region ---------------------------名称------------------------------------ document.Element("Aircraft").Attribute("name").SetValue("Export"); #endregion document.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\Export.xml"); }
/// <summary> /// 桥接生成 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonBridge_Click(object sender, EventArgs e) { XDocument document = XDocument.Load(textBoxPath.Text); XElement partsEle = document.Element("Aircraft").Element("Assembly").Element("Parts"); List <XElement> partsElements = document.Element("Aircraft").Element("Assembly").Element("Parts").Elements("Part").ToList(); List <Fuselage> frameFuselages = new List <Fuselage>(); bridges = new List <Bridge>(); foreach (XElement part in partsElements) { if (part.Attribute("partType").Value == "Fuselage-Body-1") { if (part.Attribute("materials").Value == "14") { Fuselage frameFuselage = new Fuselage(); float[] pos = REW_Func.ReadFloatArrayStr(part.Attribute("position").Value); frameFuselage.position = new Vector3(pos[0], pos[1], pos[2]); float[] rot = REW_Func.ReadFloatArrayStr(part.Attribute("rotation").Value); frameFuselage.rotationEuler = new Vector3(rot[0], rot[1], rot[2]); float[] frontScale = REW_Func.ReadFloatArrayStr(part.Element("Fuselage.State").Attribute("frontScale").Value); float[] rearScale = REW_Func.ReadFloatArrayStr(part.Element("Fuselage.State").Attribute("rearScale").Value); float[] offset = REW_Func.ReadFloatArrayStr(part.Element("Fuselage.State").Attribute("offset").Value); frameFuselage.sectionL = new Vector2(frontScale[0], frontScale[1]); frameFuselage.sectionR = new Vector2(rearScale[0], rearScale[1]); frameFuselage.run = offset[0]; frameFuselage.rise = offset[1]; frameFuselage.length = offset[2]; frameFuselage.cornerTypes = REW_Func.ReadIntArrayStr(part.Element("Fuselage.State").Attribute("cornerTypes").Value); frameFuselages.Add(frameFuselage); } } } foreach (Fuselage frameFuselage in frameFuselages) { bool isNew = true; foreach (Bridge bridge in bridges) { float error = (bridge.fuselageL.rotationEuler - frameFuselage.rotationEuler).Magnitude; if (error <= 1.0f) { isNew = false; bridge.fuselageR = frameFuselage; } } if (isNew) { Bridge bridgeNew = new Bridge(); bridgeNew.fuselageL = frameFuselage; bridgeNew.fuselageR = null; bridges.Add(bridgeNew); } } foreach (Bridge bridge in bridges) { if (bridge.fuselageL != null && bridge.fuselageR != null) { Vector3 startEndVector = bridge.fuselageR.position - bridge.fuselageL.position; Vector3 rightVec = bridge.fuselageL.Right(); Vector3 upVec = bridge.fuselageL.Up(); Vector3 forwardVec = bridge.fuselageL.Forward(); float run = Vector3.Dot(startEndVector, rightVec) * 2f; float rise = Vector3.Dot(startEndVector, upVec) * 2f; float length = Vector3.Dot(startEndVector, forwardVec) * 2f; Fuselage result = new Fuselage(); result.sectionL = bridge.fuselageL.sectionL; result.sectionR = bridge.fuselageR.sectionR; result.run = run; result.rise = rise; result.length = length; result.rotationEuler = bridge.fuselageL.rotationEuler; result.position = (bridge.fuselageL.position + bridge.fuselageR.position) * 0.5f; //拐角处理 int[] cornersL = bridge.fuselageL.cornerTypes; int[] cornersR = bridge.fuselageR.cornerTypes; result.cornerTypes = new int[8] { cornersL[0], cornersL[1], cornersL[2], cornersL[3], cornersR[0], cornersR[1], cornersR[2], cornersR[3] }; //反向圆筒处理 if (result.length < 0) { result.length *= -1f; result.run *= -1f; result.rise *= -1f; Vector2 temp = result.sectionL; result.sectionL = result.sectionR; result.sectionR = temp; int[] newCorners = new int[8] { result.cornerTypes[4], result.cornerTypes[5], result.cornerTypes[6], result.cornerTypes[7], result.cornerTypes[0], result.cornerTypes[1], result.cornerTypes[2], result.cornerTypes[3] }; result.cornerTypes = newCorners; } int lastIndex; int.TryParse((partsEle.Elements("Part").LastOrDefault().Attribute("id").Value), out lastIndex); partsEle.Add(new XElement("Part", new XAttribute("id", (lastIndex + 1)), new XAttribute("partType", "Fuselage-Body-1"), new XAttribute("position", result.position.ToString()), new XAttribute("rotation", result.rotationEuler.ToString()), new XAttribute("drag", "0,0,0,0,0,0"), new XAttribute("materials", "0"), new XAttribute("partCollisionResponse", "Default"), new XElement("FuelTank.State", new XAttribute("fuel", "0"), new XAttribute("capacity", "0")), new XElement("Fuselage.State", new XAttribute("version", "2"), new XAttribute("frontScale", result.sectionL.ToString()), new XAttribute("rearScale", result.sectionR.ToString()), new XAttribute("offset", result.run + "," + result.rise + "," + result.length), new XAttribute("deadWeight", "0"), new XAttribute("buoyancy", "0"), new XAttribute("fuelPercentage", "0"), new XAttribute("autoSizeOnConnected", "false"), new XAttribute("cornerTypes", REW_Func.ArrayToString(result.cornerTypes)) ))); } //if } //foreachBridges document.Save(textBoxPath.Text.Trim()); }