示例#1
0
    /// <summary>
    /// Scans the roboy_worlds repository and stores the worlds in a dictionary.
    /// </summary>
    public void Scan()
    {
        string[] scanArguments = { "python", UpdaterUtility.PathToScanScript, Github_Repository + @"tree/" + Branch };
        CommandlineUtility.RunCommandLine(scanArguments);
        // to do whether scan file exists and is right
        // check whether file exists
        string pathToScanFile = UpdaterUtility.ProjectFolder + @"/tempModelURLs.txt";

        if (!File.Exists(pathToScanFile))
        {
            Debug.LogWarning("Scan file not found! Check whether it exists or if python script is working!");
            return;
        }
        // get file content of format title;url
        string[] scanContent = File.ReadAllLines(pathToScanFile);

        File.Delete(pathToScanFile);

        Dictionary <string, string> tempURLDic = new Dictionary <string, string>();

        foreach (var line in scanContent)
        {
            // split at ":"
            string[] titleURL = line.Split(';');
            // check if there is exactly one ";" meaning only two elements
            if (titleURL.Length != 2)
            {
                Debug.Log("In line:\n" + line + "\nthe format does not match title;URL");
                continue;
            }
            // ignore link if it is not in the github repo
            if (!titleURL[1].Contains(Github_Repository))
            {
                Debug.Log("Link does not have the github repository!");
                continue;
            }
            if (titleURL[0] != "models")
            {
                tempURLDic.Add(titleURL[0], titleURL[1]);
            }
            else
            {
                m_PathToModelsFolder = titleURL[1];
            }
        }
        // clear all old links and add the new links
        m_URLDictionary.Clear();
        m_URLDictionary = tempURLDic;
        WorldChoiceDictionary.Clear();

        Debug.Log(m_PathToModelsFolder);

        //this will be used to select the models to download
        foreach (var urlDicEntry in m_URLDictionary)
        {
            WorldChoiceDictionary.Add(urlDicEntry.Key, false);
        }
        WorldsCurrentState = UpdaterUtility.State.Scanned;
    }
示例#2
0
    /// <summary>
    /// Downloads the .world files from the scan dictionary which were selected by the user.
    /// </summary>
    public void LoadWorlds()
    {
        string pathToOriginWorlds = UpdaterUtility.ProjectFolder + @"/SimulationWorlds/";

        List <KeyValuePair <string, bool> > tempURLList = WorldChoiceDictionary.Where(entry => entry.Value == true).ToList();

        foreach (var urlEntry in tempURLList)
        {
            //replace "tree" with "raw" in URL
            var regex = new Regex(Regex.Escape("tree"));
            m_URLDictionary[urlEntry.Key] = regex.Replace(m_URLDictionary[urlEntry.Key], "raw", 1);
            //start modeldownloader.py for .world files
            string[] updateArgumentsWorld = { "start \"\" \"" + UpdaterUtility.PathToBlender + "\" -P", UpdaterUtility.PathToDownloadScript, m_URLDictionary[urlEntry.Key] + @"/", UpdaterUtility.ProjectFolder + @"/SimulationWorlds/" + urlEntry.Key, "" };
            CommandlineUtility.RunCommandLine(updateArgumentsWorld);
        }
    }
示例#3
0
 /// <summary>
 /// Calls the python scan script through a commandline.
 /// </summary>
 public void Scan()
 {
     string[] scanArguments = { "python", m_PathToScanScript, Github_Repository };
     CommandlineUtility.RunCommandLine(scanArguments);
 }
示例#4
0
    /// <summary>
    /// Downloads the models from the scan dictionary which were selected by the user.
    /// </summary>
    public void UpdateModels()
    {
        string pathToOriginModels = UpdaterUtility.ProjectFolder + @"/SimulationModels/";
        //var processInfo = new ProcessStartInfo("cmd.exe", "/C" + "start \"\" \"" + m_PathToBlender + "\" -P \"" + m_PathToDownloadScript + "\" \"" + pathToMeshes + "\" \"" + m_pathToProjectModels + "\" \"\"");
        //UnityEngine.Debug.Log("Run not implemented yet!");
        // get a list of all entries which the user wants to update
        List <KeyValuePair <string, bool> > tempURLList = ModelChoiceDictionary.Where(entry => entry.Value == true).ToList();

        foreach (var urlEntry in tempURLList)
        {
            string[] scanArguments = { "python", UpdaterUtility.PathToScanScript, m_URLDictionary[urlEntry.Key] };
            CommandlineUtility.RunCommandLine(scanArguments);
            //Debug.Log(m_URLDictionary[urlEntry.Key]);

            string pathToScanFile = UpdaterUtility.ProjectFolder + @"/tempModelURLs.txt";
            if (!File.Exists(pathToScanFile))
            {
                Debug.LogWarning("Scan file not found! Check whether it exists or if python script is working!");
                return;
            }
            // get file content of format title:url
            string[] scanContent = File.ReadAllLines(pathToScanFile);

            File.Delete(pathToScanFile);

            foreach (var line in scanContent)
            {
                string[] titleURL = line.Split(';');
                // check if there is exactly one ";" meaning only two elements
                if (titleURL.Length != 2)
                {
                    Debug.Log("In line:\n" + line + "\nthe format does not match title;URL");
                    continue;
                }
                // ignore link if it is not in the github repo
                if (!titleURL[1].Contains(Github_Repository))
                {
                    Debug.Log("Link does not have the github repository!");
                    continue;
                }

                //replace "tree" with "raw" in URL
                var regex = new Regex(Regex.Escape("tree"));
                titleURL[1] = regex.Replace(titleURL[1], "raw", 1);

                //replace "tree" with "raw" in URL
                var    regex1       = new Regex(Regex.Escape("tree"));
                string tempModelURL = regex.Replace(m_URLDictionary[urlEntry.Key], "raw", 1);

                //start modeldownloader.py for visual
                string[] updateArgumentsXML = { "start \"\" \"" + UpdaterUtility.PathToBlender + "\" -P", UpdaterUtility.PathToDownloadScript, tempModelURL + @"/", UpdaterUtility.ProjectFolder + @"/SimulationModels/" + urlEntry.Key + @"/OriginModels", "" };
                CommandlineUtility.RunCommandLine(updateArgumentsXML);

                //start modeldownloader.py for visual
                string[] updateArgumentsVis = { "start \"\" \"" + UpdaterUtility.PathToBlender + "\" -P", UpdaterUtility.PathToDownloadScript, titleURL[1] + @"/visual/", UpdaterUtility.ProjectFolder + @"/SimulationModels/" + urlEntry.Key + @"/OriginModels/visual", "" };
                CommandlineUtility.RunCommandLine(updateArgumentsVis);

                //start modeldownloader.py for collision
                string[] updateArgumentsCol = { "start \"\" \"" + UpdaterUtility.PathToBlender + "\" -P", UpdaterUtility.PathToDownloadScript, titleURL[1] + @"/collision/", UpdaterUtility.ProjectFolder + @"/SimulationModels/" + urlEntry.Key + @"/OriginModels/collision", "" };
                CommandlineUtility.RunCommandLine(updateArgumentsCol);

                if (!m_ModelNames.Contains(urlEntry.Key))
                {
                    m_ModelNames.Add(urlEntry.Key);
                }
            }
            if (File.Exists(pathToOriginModels + urlEntry.Key + @"/OriginModels/model.sdf"))
            {
                Debug.Log("model.sdf found!");
                // read .sdf file
                string[] argumentsSDFreader = { "python \"" + UpdaterUtility.PathToSDFreader + "\"", pathToOriginModels + urlEntry.Key + @"/OriginModels/model.sdf" };
                CommandlineUtility.RunCommandLine(argumentsSDFreader);
            }
            else
            {
                Debug.LogWarning("model.sdf not found!");
            }

            ModelsCurrentState = UpdaterUtility.State.Downloaded;
        }
    }
示例#5
0
    /// <summary>
    /// Downloads models given in the .world files and saves their pose in a struct.
    /// </summary>
    public void Magic()
    {
        List <KeyValuePair <string, bool> > tempURLList = WorldChoiceDictionary.Where(entry => entry.Value == true).ToList();

        foreach (var urlEntry in tempURLList)
        {
            if (File.Exists(UpdaterUtility.ProjectFolder + @"/SimulationWorlds/" + urlEntry.Key + @"/" + urlEntry.Key + ".world"))
            {
                Debug.Log(".world file found!");
                // read .world file
                string[] argumentsSDFreader = { "python \"" + UpdaterUtility.PathToWorldReader + "\" \"" + UpdaterUtility.ProjectFolder + @"/SimulationWorlds/" + urlEntry.Key + @"/" + urlEntry.Key + ".world\"" };
                CommandlineUtility.RunCommandLine(argumentsSDFreader);
            }
            else
            {
                Debug.LogWarning(".world file not found!");
            }

            string pathToWorldFile = UpdaterUtility.ProjectFolder + @"/temp" + urlEntry.Key + @"World.txt";
            if (!File.Exists(pathToWorldFile))
            {
                Debug.LogWarning("Scan file not found! Check whether it exists or if python script is working!");
                return;
            }

            //save content of temp file
            string[] WorldContent = File.ReadAllLines(pathToWorldFile);

            //delete temp file
            File.Delete(pathToWorldFile);

            List <string[]> modelList = new List <string[]>();

            foreach (string line in WorldContent)
            {
                //each line contains of a model link with pose, scale, model_link
                string[] SDFline = line.Split(';');
                modelList.Add(SDFline);
            }
            string worldName = null;
            for (int i = 0; i < modelList.Count; i++)
            {
                if (modelList[i][0] == "world_name")
                {
                    //get world name
                    worldName = modelList[i][1];
                    modelList.Remove(modelList[i]);
                }
            }

            foreach (string[] line in modelList)
            {
                //each model will be saved in a struct, so we can apply pose and scale later on
                ModelTransformation testModel = new ModelTransformation();
                testModel.worldname = worldName;

                //check which attributes are set by the .world file and set them in the struct
                for (int j = 0; j < line.Length; j++)
                {
                    testModel.link = new LinkTransformation();

                    string[] pose = null;


                    if (line[j] == "model_pose")
                    {   //saving model_pose
                        pose = line[j + 1].Split(' ');
                        testModel.position = GazeboUtility.GazeboPositionToUnity(new Vector3(float.Parse(pose[0], CultureInfo.InvariantCulture.NumberFormat),
                                                                                             float.Parse(pose[1], CultureInfo.InvariantCulture.NumberFormat),
                                                                                             float.Parse(pose[2], CultureInfo.InvariantCulture.NumberFormat)));
                        testModel.rotation = GazeboUtility.GazeboPositionToUnity(new Vector3(Mathf.Rad2Deg * float.Parse(pose[3], CultureInfo.InvariantCulture.NumberFormat),
                                                                                             Mathf.Rad2Deg * float.Parse(pose[4], CultureInfo.InvariantCulture.NumberFormat),
                                                                                             Mathf.Rad2Deg * float.Parse(pose[5], CultureInfo.InvariantCulture.NumberFormat)));
                    }

                    if (line[j] == "model_link")
                    {   //saving model_link name
                        testModel.link.name = line[j + 1];
                    }
                    if (line[j] == "VIS_mesh_uri")
                    {   // saving VIS_mesh_link and model.name
                        testModel.link.VIS_meshName = line[j + 1];
                        string name1 = Regex.Replace(line[j + 1], ".*?//", "");
                        string name2 = Regex.Replace(name1, "/.*", "");
                        testModel.name = name2;
                        Debug.Log(testModel.link.VIS_meshName);
                    }

                    //saving COL_mesh_link
                    if (line[j] == "COL_mesh_uri")
                    {
                        testModel.link.COL_meshName = line[j + 1];
                    }

                    string[] VIS_Scale = null;
                    if (line[j] == "VIS_mesh_scale")
                    {
                        //saving model scale
                        VIS_Scale = line[j + 1].Split(' ');
                    }
                    if (VIS_Scale != null)
                    {   //converting model scale
                        testModel.link.VIS_scale = GazeboUtility.GazeboPositionToUnity(new Vector3(100 * float.Parse(VIS_Scale[0], CultureInfo.InvariantCulture.NumberFormat),
                                                                                                   100 * float.Parse(VIS_Scale[1], CultureInfo.InvariantCulture.NumberFormat),
                                                                                                   100 * float.Parse(VIS_Scale[2], CultureInfo.InvariantCulture.NumberFormat)));
                    }
                    string[] linkpose = null;
                    if (line[j] == "link_pose")
                    {
                        pose = line[j + 1].Split(' ');
                    }
                    if (linkpose != null)
                    {
                        testModel.position = GazeboUtility.GazeboPositionToUnity(new Vector3(float.Parse(linkpose[0], CultureInfo.InvariantCulture.NumberFormat),
                                                                                             float.Parse(linkpose[1], CultureInfo.InvariantCulture.NumberFormat),
                                                                                             float.Parse(linkpose[2], CultureInfo.InvariantCulture.NumberFormat)));
                        testModel.rotation = GazeboUtility.GazeboPositionToUnity(new Vector3(Mathf.Rad2Deg * float.Parse(linkpose[3], CultureInfo.InvariantCulture.NumberFormat),
                                                                                             Mathf.Rad2Deg * float.Parse(linkpose[4], CultureInfo.InvariantCulture.NumberFormat),
                                                                                             Mathf.Rad2Deg * float.Parse(linkpose[5], CultureInfo.InvariantCulture.NumberFormat)));
                    }
                }
                modellist.Add(testModel);


                //}
            }


            WorldsCurrentState = UpdaterUtility.State.Downloaded;
        }
        List <string> names = new List <string>();

        foreach (ModelTransformation model in modellist)
        {
            if (!names.Contains(model.name))
            {
                names.Add(model.name);
                //Debug.Log(model.name);
            }
        }
        foreach (string name in names)
        {
            //replace "tree" with "raw" in URL
            var regex = new Regex(Regex.Escape("tree"));
            m_PathToModelsFolder = regex.Replace(m_PathToModelsFolder, "raw", 1);
            //start modeldownloader.py for visual
            string[] updateArgumentsWorld = { "start \"\" \"" + UpdaterUtility.PathToBlender + "\" -P", UpdaterUtility.PathToDownloadScript, m_PathToModelsFolder + @"/" + name + @"/meshes/", UpdaterUtility.ProjectFolder + @"/SimulationWorlds/Models/" + name + "/meshes", "" };
            CommandlineUtility.RunCommandLine(updateArgumentsWorld);
        }
    }
示例#6
0
        public async Task <bool> TryCreateNewInstance(InstanceConfiguration instanceConfiguration)
        {
            try
            {
                var instanceName = instanceConfiguration.Name;

                if (DoesDatabaseExist(instanceName))
                {
                    _logger.LogError("The database for this instance already exists. Database Name: {instanceName}", instanceName);
                    return(false);
                }

                _logger.LogInformation("Instance is being created. Instance Name: {instanceName}", instanceName);
                var    directoryPath            = Directory.GetCurrentDirectory();
                string originalSourceFolderName = _config.GetValue <string>("OriginalSourceFolderName");
                string sourcePath      = $"{directoryPath}\\..\\{originalSourceFolderName}";
                string destinationPath = $"{directoryPath}\\..\\{originalSourceFolderName}_{instanceName}";

                if (Directory.Exists(sourcePath) == false)
                {
                    _logger.LogError($"Original Source path doesn't exist. Source Path: {sourcePath}");
                    return(false);
                }

                //DirectoryUtility.DirectoryCopy(sourcePath, destinationPath, true);
                //string copyOutput = null;
                var copyOutput = CommandlineUtility.Copy(sourcePath, destinationPath, null);

                if (string.IsNullOrWhiteSpace(copyOutput))
                {
                    _logger.LogError("Couldn't copy correctly. The copy output is null");
                    return(false);

                    throw new InvalidOperationException("Unable to publish using cli");
                }

                _logger.LogInformation(copyOutput);
                _logger.LogInformation("Template source copied from: {sourcePath} to: {destinationPath}", sourcePath, destinationPath);
                string appSettingsPath          = $"{destinationPath}\\{originalSourceFolderName}\\appsettings.json";
                bool   isNewDatabaseNameWritten = false;

                if (File.Exists(appSettingsPath))
                {
                    isNewDatabaseNameWritten = await TryWriteNewDatabaseName(instanceName, appSettingsPath);
                }
                else
                {
                    _logger.LogError($"Appsettings path doesn't exist at this time. Appsettings path Path: {appSettingsPath}");
                    return(false);
                }

                if (isNewDatabaseNameWritten == false)
                {
                    _logger.LogError($"The database name could not be written.");
                    return(false);
                }

                _logger.LogInformation($"New Database name written to appsettings. Path: {appSettingsPath}");
                string layoutPath           = $"{destinationPath}\\{originalSourceFolderName}\\Views\\Shared\\_layout.cshtml";
                bool   isWebsiteNameWritten = TryWriteWebsiteName(layoutPath, instanceName, originalSourceFolderName);

                if (isWebsiteNameWritten == false)
                {
                    _logger.LogError($"The Website name could not be written to the template.");
                    return(false);
                }

                var publishOutput = CommandlineUtility.BuildAndPublish(destinationPath);

                if (string.IsNullOrWhiteSpace(publishOutput))
                {
                    _logger.LogError("Couldn't publish intance correctly. The publish output is null");
                    return(false);

                    throw new InvalidOperationException("Unable to publish using cli");
                }

                _logger.LogInformation(publishOutput);
                _logger.LogInformation($"New instance built and published with name: {instanceName}");
                return(true);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.Message);
                return(false);
            }
        }