Ejemplo n.º 1
0
    private static void ImportThread(ImportThreadInfo info)
    {
        var interpreter = Interpreter.Get(info.inputFilename);

        if (interpreter != null)
        {
            if (interpreter.Read(info.inputFilename, info.progress.Push(0.8f), out PatchData data))
            {
                info.progress.Pop();

                data.metadata = info.metadata;

                if (data is GridData grid)
                {
                    if (info.resampler != null)
                    {
                        info.resampler.Convert(grid, info.resX, info.resY);
                    }

                    info.progress.value = 0.9f;

                    grid.UpdateMinMaxValues();
                    grid.UpdateDistribution();

                    info.progress.value = 0.95f;

                    grid.SaveBin(info.outputFilename);
                }
            }
        }

        info.progress.value = 1f;
        info.running        = false;
        info.thread         = null;
    }
Ejemplo n.º 2
0
    private IEnumerator _Import(ImportInfo info)
    {
        var componentManager = ComponentManager.Instance;
        var dialogManager    = componentManager.Get <ModalDialogManager>();
        var dataManager      = componentManager.Get <DataManager>();
        var dataLayers       = componentManager.Get <DataLayers>();

        bool addedGroupOrLayer = false;

        // Create group if necessary (also UI panel)
        DataLayerGroupPanel groupPanel;
        var group = info.group;

        if (group == null)
        {
            group             = dataManager.AddLayerGroup(info.newGroupName);
            groupPanel        = dataLayers.AddLayerGroup(group.name);
            addedGroupOrLayer = true;
        }
        else
        {
            groupPanel = dataLayers.GetLayerGroup(group.name);
        }

        // Create layer if necessary (also UI panel)
        var layer = info.layer;

        if (layer == null)
        {
            var layerName = info.newLayerName;
            layer = group.GetLayer(layerName);
            if (layer == null)
            {
                layer = new DataLayer(dataManager, layerName, info.newLayerColor, group);
                dataLayers.AddLayer(layer, groupPanel);
                addedGroupOrLayer = true;
            }
        }

        if (layer.Group != group)
        {
            Debug.LogError("Selected group doesn't match selected layer's group");
            yield break;
        }

        if (addedGroupOrLayer)
        {
            dataManager.UpdateLayerConfig();
        }

        var filename = info.inputFilename;
        var resX     = info.resolution.ToDegrees();
        var resY     = resX;

        Resampler resampler = null;

        if (info.needsResampling)
        {
            //+ TODO: create appropriate resampler
            resampler = new NearestNeighbourResampler();
        }

        // Create output directory
        Directory.CreateDirectory(Path.GetDirectoryName(info.outputFilename));

        bool patchAlreadyExists = File.Exists(info.outputFilename);

        // Show progress bar
        var progressDialog = dialogManager.NewProgressDialog();

        progressDialog.SetMessage(Translator.Get("Importing") + " " + Path.GetFileName(filename));
        progressDialog.SetProgress(0);

        var threadInfo = new ImportThreadInfo
        {
            inputFilename  = filename,
            outputFilename = info.outputFilename,
            resX           = resX,
            resY           = resY,
            units          = info.units,
            metadata       = info.metadata,
            resampler      = resampler,
            running        = true
        };

        threadInfo.thread = new Thread(() => ImportThread(threadInfo))
        {
            Name = "ImportDataThread"
        };
        threadInfo.thread.Start();

        // Import data
        do
        {
            yield return(null);

            progressDialog.SetProgress(threadInfo.progress.Total());
        }while (threadInfo.running);

        yield return(null);

        if (patchAlreadyExists)
        {
            dataManager.ReloadPatches(layer, info.site.Name, info.level, info.year);
        }
        else
        {
            yield return(layer.CreatePatch(info.outputFilename));
        }

        yield return(null);

        // Update Site Browser
        var siteBrowser = componentManager.Get <SiteBrowser>();

        if (info.site != null && info.site == siteBrowser.ActiveSite)
        {
            siteBrowser.UpdateMinMaxLevels();
        }
        else
        {
            // If it's the first site, it will change to the new site automatically
            siteBrowser.RebuildList();
        }

        yield return(null);

        // Update the Data Layers list
        componentManager.Get <DataLayers>().UpdateLayers();

        yield return(null);

        // Hide the progress
        progressDialog.Close();

        // Send the event that the import process has finished
        var site = info.site;

        if (site == null)
        {
            dataManager.TryGetSite(info.newSiteName, out site);
        }
        info.OnFinishImport.Invoke(site, layer);

        // Destroy this (the importer) game object
        Destroy(gameObject);
    }