Пример #1
0
    public void ReadFuselage(Fuselage fsR, Fuselage fsL, bool flagMessage)
    {
        fsR.flag = 0;
        fsL.flag = 0;

        fsR.block_name = ReadString("blcok_name", flagMessage);
        int n = ReadIntValue("n", flagMessage);

        fsR.flag    = 1;
        fsR.ac_base = ReadVector("Ac", flagMessage);
        fsR.lfus    = ReadDblValue("length", flagMessage);
        fsR.vfus    = ReadDblValue("Vfus", flagMessage);
        fsR.cd_s    = ReadDblValue("CD*Spi(fus)", flagMessage);
        fsR.s_pi    = ReadDblValue("Spi", flagMessage);
        fsR.Init();

        if (n > 1)
        {
            fsL.block_name = fsR.block_name;
            fsL.flag       = fsR.flag;
            fsL.ac_base    = fsR.ac_base;
            fsL.lfus       = fsR.lfus;
            fsL.vfus       = fsR.vfus;
            fsL.cd_s       = fsR.cd_s;
            fsL.s_pi       = fsR.s_pi;
            fsL.Init();
        }
    }
Пример #2
0
        public async Task <IActionResult> ConfirmDeleteFromBody_list(int?id)
        {
            if (id != null)
            {
                Fuselage find_part = await PartsContext.Fuselages.FirstOrDefaultAsync(p => p.Id == id);

                return(DeleteView(find_part, "Body_list"));
            }
            return(NotFound());
        }
Пример #3
0
        public async Task <IActionResult> DeleteBody_list(int?id)
        {
            if (id != null)
            {
                Fuselage find_part = new Fuselage {
                    Id = id.Value
                };
                await DeletePart(find_part);

                return(RedirectToAction("Index"));
            }
            return(NotFound());
        }
        /// <summary>
        /// Calculate C_D0 for a fuselage
        /// </summary>
        /// <param name="fuselage"></param>
        /// <param name="S_ref"></param>
        /// <param name="Re"></param>
        /// <param name="C_f"></param>
        /// <returns></returns>
        private static float CalculateFuselageC_D0(Fuselage fuselage, float S_ref, float Re, float C_f)
        {
            var S_wet          = fuselage.CalculateArea();
            var fuselageLength = 0.1f * (fuselage.CentreFuselage.Length + fuselage.Diameter * (fuselage.NoseLengthDiameterRatio + fuselage.Afterbody.AfterbodyLengthDiameterRatio));

            // Fineness ratio
            var f = fuselageLength / (fuselage.Diameter / 10f);

            // Form factor adjustment
            var FF = 1 + (60f * Mathf.Pow(f, -3)) + f / 400f;

            // Interference estimation
            var Q = 1.3f;

            return((C_f * FF * Q * S_wet) / S_ref);
        }
Пример #5
0
    public virtual void ParametrizeUnityFromModel()
    {
        // Set mass and inertia
        body.mass = (float)model.Mass;
        Vector3 inertia = (model.Inertia * Vector <double> .Build.DenseOfArray(new double[] { 1, 1, 1 })).ToUnity();

        inertia.y         *= -1; // all inertia tensor components must be positive
        body.inertiaTensor = inertia;
        Debug.Log("Inertia tensor " + body.inertiaTensor);
        // TODO what about body.inertiaTensorRotation ?

        fcs      = model.FCS;
        engine   = model.Engine;
        gearBox  = model.GearBox;
        fuselage = model.Fuselage;

        foreach (var submodelName in submodelTransforms.Keys)
        {
            var submodel       = model.SubModels[submodelName];
            var childTransform = submodelTransforms[submodelName];
            Debug.Log("Transform from submodel: " + childTransform.name);
            childTransform.localPosition = submodel.Translation.ToUnity();
            childTransform.localRotation = submodel.Rotation.ToUnity();

            if (submodel is Rotor)
            {
                BoxCollider collider = childTransform.GetComponent <BoxCollider> ();
                var         sizey    = 0.1f;
                if (collider == null)
                {
                    collider = childTransform.gameObject.AddComponent <BoxCollider> ();
                }
                else
                {
                    sizey = collider.size.y;
                }
                var radius = (float)((Rotor)submodel).radius;
                var size   = Mathf.Sqrt(2 * radius * radius);
                collider.size = new Vector3(size, sizey, size);
            }
        }
    }
Пример #6
0
    public void MakeObject()
    {
        int i;

        for (i = 0; i < 7; i++)
        {
            for (int lr = 0; lr <= 1; lr++)
            {
                fuslage[i, lr] = new Fuselage();
            }
        }
        for (i = 0; i < 1; i++)
        {
            wing[i] = new Wing();
        }
        for (i = 0; i < 1; i++)
        {
            htail[i] = new Wing();
        }
        for (i = 0; i < 1; i++)
        {
            vtail[i] = new Wing();
        }
        for (i = 0; i < 1; i++)
        {
            canard[i] = new Wing();
        }
        for (i = 0; i < 5; i++)
        {
            fin[i] = new Wing();
        }
        for (i = 0; i < 1; i++)
        {
            for (int lr_0 = 0; lr_0 <= 1; lr_0++)
            {
                elevator[i, lr_0] = new ControlPlane();
            }
        }
        for (i = 0; i < 1; i++)
        {
            for (int lr_1 = 0; lr_1 <= 1; lr_1++)
            {
                aileron[i, lr_1] = new ControlPlane();
            }
        }
        for (i = 0; i < 1; i++)
        {
            for (int lr_2 = 0; lr_2 <= 1; lr_2++)
            {
                rudder[i, lr_2] = new ControlPlane();
            }
        }
        for (i = 0; i < 1; i++)
        {
            for (int lr_3 = 0; lr_3 <= 1; lr_3++)
            {
                t_flap[i, lr_3] = new ControlPlane();
            }
        }
        for (i = 0; i < 1; i++)
        {
            for (int lr_4 = 0; lr_4 <= 1; lr_4++)
            {
                l_flap[i, lr_4] = new ControlPlane();
            }
        }
        for (i = 0; i < 1; i++)
        {
            for (int lr_5 = 0; lr_5 <= 1; lr_5++)
            {
                canard_elevator[i, lr_5] = new ControlPlane();
            }
        }
        for (i = 0; i < 3; i++)
        {
            for (int lr_6 = 0; lr_6 <= 1; lr_6++)
            {
                landing_gear[i, lr_6] = new LandingGear();
            }
        }
    }
Пример #7
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());
        }
Пример #8
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());
        }