Пример #1
0
        public static bool TryReadLValue(this Scanner scanner, out ILValue result)
        {
            string identifier;

            if (scanner.TryReadToken(Token.Identifier, out identifier))
            {
                if (scanner.CurrentToken == Token.LParen)
                {
                    throw new ParserException(ErrorMessages.MissingLValue);
                }

                if (scanner.TryReadToken(Token.LBracket))
                {
                    var indexes = scanner.ReadExpressions();
                    scanner.ReadToken(Token.RBracket);
                    result = new ArrayVariable(identifier, indexes);
                    return(true);
                }

                result = new ScalarVariable(identifier);
                return(true);
            }

            result = null;
            return(false);
        }
Пример #2
0
        public void Execute_OfInput_StoresValueFromInput()
        {
            var inputOutput = MakeInputOutput("12345");
            var rte         = MakeRunTimeEnvironment(inputOutput);
            var i           = new ScalarVariable("I");
            var input       = new Input(i);

            input.Execute(rte);
            var actual = rte.Variables["I"];

            Assert.AreEqual(12345, actual);
        }
Пример #3
0
        public void Execute_OfForNext_RepeatsInnerStatement()
        {
            var rte              = MakeRunTimeEnvironment();
            var i                = new ScalarVariable("I");
            var from             = new Constant(1);
            var to               = new Constant(10);
            var step             = new Constant(1);
            var shoudBeEqualTo50 = 0;
            var forNext          = new ForNext(i, from, to, step, MakeStatement(() => { shoudBeEqualTo50 += 5; }));

            forNext.Execute(rte);

            Assert.AreEqual(50, shoudBeEqualTo50);
        }
Пример #4
0
        public void Execute_OfFor_RepeatsInnerStatement()
        {
            var rte              = MakeRunTimeEnvironment();
            var i                = new ScalarVariable("I");
            var from             = new Constant(1);
            var to               = new Constant(10);
            var shoudBeEqualTo50 = 0;

            rte.AddOrUpdate(new Line("20", new For(i, from, to, new Constant(1))));
            rte.AddOrUpdate(new Line("30", MakeStatement(() => { shoudBeEqualTo50 += 5; })));
            rte.AddOrUpdate(new Line("40", new Next()));
            rte.Run();

            Assert.AreEqual(50, shoudBeEqualTo50);
        }
Пример #5
0
        private static bool TryReadArrayFunctionOrScalar(this Scanner scanner, out IExpression expression)
        {
            if (scanner.TryReadToken(Token.Identifier, out string text))
            {
                if (scanner.TryReadToken(Token.LBracket))
                {
                    var parameters = scanner.ReadExpressions();
                    scanner.ReadToken(Token.RBracket);
                    expression = new ArrayVariable(text, parameters);
                    return(true);
                }

                if (scanner.TryReadToken(Token.LParen))
                {
                    IReadOnlyList <IExpression> parameters;

                    if (scanner.TryReadToken(Token.RParen))
                    {
                        parameters = new IExpression[0];
                    }
                    else
                    {
                        parameters = scanner.ReadExpressions();
                        scanner.ReadToken(Token.RParen);
                    }

                    if (string.Equals("RND", text, StringComparison.OrdinalIgnoreCase))
                    {
                        expression = new Rnd(parameters);
                    }
                    else
                    {
                        expression = new Function(text, parameters);
                    }

                    return(true);
                }

                expression = new ScalarVariable(text);
                return(true);
            }

            expression = null;
            return(false);
        }
Пример #6
0
        public static FMUData ImportFMU(string vehicleName)
        {
            FMUData data = null;

            string[] filters = { "FMUs", "fmu", "All files", "*" };
            string   fmuPath = EditorUtility.OpenFilePanelWithFilters("Import FMU", "", filters);

            if (!string.IsNullOrEmpty(fmuPath))
            {
                data = new FMUData();
                var fmuName  = Path.GetFileNameWithoutExtension(fmuPath);
                var unzipDir = Path.Combine(Application.dataPath, "External", "Vehicles", vehicleName, fmuName);

                ZipFile zip = new ZipFile(fmuPath);
                ExtractZipFile(fmuPath, unzipDir);
                XDocument doc = XDocument.Load(unzipDir + "/modelDescription.xml");
                if (doc != null)
                {
                    var root = doc.Root;
                    data.Version   = (string)root.Attribute("fmiVersion");
                    data.GUID      = (string)root.Attribute("guid");
                    data.modelName = (string)root.Attribute("modelName");

                    // TODO support multiple modelIdentifiers ME or CS
                    data.type = FMIType.ModelExchange;
                    foreach (var e in root.Elements("CoSimulation"))
                    {
                        data.type = FMIType.CoSimulation;
                    }

                    var variables = new List <ScalarVariable>();
                    foreach (var e in root.Element("ModelVariables").Elements("ScalarVariable"))
                    {
                        var v = new ScalarVariable
                        {
                            name           = (string)e.Attribute("name"),
                            description    = (string)e.Attribute("description"),
                            causality      = (string)e.Attribute("causality"),
                            variability    = (string)e.Attribute("variability"),
                            initial        = (string)e.Attribute("initial"),
                            valueReference = (uint)e.Attribute("valueReference"),
                        };
                        variables.Add(v);

                        foreach (var el in e.Elements("Real"))
                        {
                            v.type  = VariableType.Real;
                            v.start = (string)el.Attribute("start");
                        }

                        foreach (var el in e.Elements("Integer"))
                        {
                            v.type  = VariableType.Integer;
                            v.start = (string)el.Attribute("start");
                        }

                        foreach (var el in e.Elements("Boolean"))
                        {
                            v.type  = VariableType.Boolean;
                            v.start = (string)el.Attribute("start");
                        }

                        foreach (var el in e.Elements("String"))
                        {
                            v.type  = VariableType.String;
                            v.start = (string)el.Attribute("start");
                        }
                    }
                    data.modelVariables = variables;
                    data.Name           = fmuName;

                    AssetDatabase.Refresh();
                }
            }
            return(data);
        }
Пример #7
0
    public static void ImportFMU()
    {
        string[] filters = { "FMUs", "fmu", "All files", "*" };

        string fmuPath = EditorUtility.OpenFilePanelWithFilters("Import FMU", "", filters);

        if (string.IsNullOrEmpty(fmuPath))
        {
            return;
        }

        var fmuName = Path.GetFileNameWithoutExtension(fmuPath);

        var unzipdir = Path.Combine(Application.streamingAssetsPath, fmuName);

        var zip = ZipFile.Read(fmuPath);

        zip.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently;
        zip.ExtractAll(unzipdir);

        var modelDescription = ScriptableObject.CreateInstance <ModelDescription>();

        XDocument doc = XDocument.Load(unzipdir + "/modelDescription.xml");

        var root = doc.Root;

        modelDescription.fmiVersion = (string)root.Attribute("fmiVersion");
        modelDescription.guid       = ((string)root.Attribute("guid")).ToCharArray();
        modelDescription.modelName  = (string)root.Attribute("modelName");

        foreach (var e in root.Elements("CoSimulation"))
        {
            modelDescription.coSimulation = new Implementation();
            modelDescription.coSimulation.modelIdentifier = (string)e.Attribute("modelIdentifier");
        }

        var variables = new List <ScalarVariable>();

        foreach (var e in root.Element("ModelVariables").Elements("ScalarVariable"))
        {
            var v = new ScalarVariable
            {
                name           = (string)e.Attribute("name"),
                description    = (string)e.Attribute("description"),
                causality      = (string)e.Attribute("causality"),
                variability    = (string)e.Attribute("variability"),
                initial        = (string)e.Attribute("initial"),
                valueReference = (uint)e.Attribute("valueReference"),
            };

            variables.Add(v);

            foreach (var el in e.Elements("Real"))
            {
                v.type  = VariableType.Real;
                v.start = (string)el.Attribute("start");
            }

            foreach (var el in e.Elements("Integer"))
            {
                v.type  = VariableType.Integer;
                v.start = (string)el.Attribute("start");
            }

            foreach (var el in e.Elements("Boolean"))
            {
                v.type  = VariableType.Boolean;
                v.start = (string)el.Attribute("start");
            }

            foreach (var el in e.Elements("String"))
            {
                v.type  = VariableType.String;
                v.start = (string)el.Attribute("start");
            }
        }

        modelDescription.modelVariables = variables.ToArray();

        AssetDatabase.CreateAsset(modelDescription, "Assets/Resources/" + fmuName + ".asset");
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
        EditorUtility.FocusProjectWindow();
        Selection.activeObject = modelDescription;
    }