Example #1
0
        /// <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());
        }
Example #2
0
        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");
        }
Example #3
0
        /// <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());
        }