Example #1
0
    public static void SaveBin(this MultiGridData multigrid, string filename)
    {
        using (var bw = new BinaryWriter(File.Open(filename, FileMode.Create)))
        {
            PatchDataIO.WriteBinVersion(bw);
            PatchDataIO.WriteBinBoundsHeader(bw, multigrid);

            // Write Metadata (if available)
            PatchDataIO.WriteBinMetadata(bw, multigrid.metadata);

            bw.Write((byte)multigrid.coloring);

            int categoriesCount = multigrid.categories == null ? 0 : multigrid.categories.Length;
            bw.Write(categoriesCount);

            if (multigrid.categories != null)
            {
                // Write categories (without values)
                foreach (var c in multigrid.categories)
                {
                    bw.Write(c.name);
                }

                // Write Grids
                foreach (var c in multigrid.categories)
                {
                    GridDataIO.WriteBinProperties(bw, c.grid);
                    GridDataIO.WriteBinValues(bw, c.grid);
                }
            }
        }
    }
Example #2
0
 private static MultiGridData ParseBin(BinaryReader br, string filename, MultiGridData multigrid)
 {
     ParseBinHeader(br, filename, multigrid);
     ParseBinProperties(br, multigrid);
     ParseBinGrids(br, filename, multigrid);
     return(multigrid);
 }
Example #3
0
    public static MultiGridData ParseBinHeader(BinaryReader br, string filename, MultiGridData multigrid)
    {
        // Read header
        PatchDataIO.SkipBinVersion(br);
        PatchDataIO.ReadBinBoundsHeader(br, filename, multigrid);

        return(multigrid);
    }
Example #4
0
    private MultiGridData QuickReadMultiGridPatch(string filename)
    {
        var data = new MultiGridData();

        using (var br = new BinaryReader(File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
        {
            MultiGridDataIO.ParseBinHeader(br, filename, data);
            MultiGridDataIO.ParseBinProperties(br, data);
        }
        return(data);
    }
Example #5
0
    private void CreateMultiGridMapLayer(MultiGridData multigrid)
    {
        int count = multigrid.categories.Length;

        for (int i = 0; i < count; i++)
        {
            if (multigrid.gridFilter.IsSet(i))
            {
                CreateGridMapLayer(multigrid.categories[i].grid);

                // Change the map layer's color to the category's one (by default it will have the datalayer's color)
                visibleGrids[visibleGrids.Count - 1].SetColor(multigrid.categories[i].color);
            }
        }
    }
Example #6
0
    public static void ParseBinGrids(BinaryReader br, string filename, MultiGridData multigrid)
    {
        if (multigrid.categories != null)
        {
            int count = multigrid.categories.Length;
            for (int i = 0; i < count; i++)
            {
                var grid = new GridData(multigrid);
                GridDataIO.ParseBinProperties(br, filename, grid);
                GridDataIO.ParseBinValues(br, grid);
                grid.patch = multigrid.patch;

                multigrid.categories[i].grid = grid;
            }
        }
    }
Example #7
0
    public MultiGridData(MultiGridData other, bool withValues = true) : base(other)
    {
        if (other.categories != null)
        {
            int count = other.categories.Length;
            categories = new GridCategory[other.categories.Length];
            for (int i = 0; i < count; i++)
            {
                var c        = other.categories[i];
                var category = new GridCategory(c.name, new GridData(c.grid, withValues), c.color);
                category.grid.patch = patch;
                categories[i]       = category;
            }
        }

        gridFilter = other.gridFilter;
        coloring   = other.coloring;
    }
Example #8
0
    public static void ParseBinProperties(BinaryReader br, MultiGridData multigrid)
    {
        // Read Metadata (if available)
        multigrid.metadata = PatchDataIO.ReadBinMetadata(br);

        // Read coloring
        multigrid.coloring = (GridData.Coloring)br.ReadByte();

        // Read categories (without values)
        int gridCount = br.ReadInt32();

        if (gridCount > 0)
        {
            multigrid.categories = new GridCategory[gridCount];
            for (int i = 0; i < gridCount; i++)
            {
                multigrid.categories[i] = new GridCategory(br.ReadString(), null, Color.white);
            }
        }
    }
Example #9
0
    private static void ReadValues(StreamReader sr, MultiGridData multigrid, string filename)
    {
        int categoriesCount = multigrid.categories == null? 0 : multigrid.categories.Length;

        if (categoriesCount == 0)
        {
            return;
        }

        List <float>[] data = new List <float> [categoriesCount];
        for (int i = 0; i < categoriesCount; i++)
        {
            data[i] = new List <float>();
        }

        string line;

        string[] cells;
        float    value;
        var      cultureInfo = CultureInfo.InvariantCulture;

        // Read each data row at a time with value
        while ((line = sr.ReadLine()) != null)
        {
            cells = line.Split(',');
            for (int i = 0; i < categoriesCount; i++)
            {
                value = float.Parse(cells[i], cultureInfo);
                data[i].Add(value);
                var g = multigrid.categories[i].grid;
                g.minValue = Mathf.Min(g.minValue, value);
                g.maxValue = Mathf.Max(g.maxValue, value);
            }
        }

        for (int i = 0; i < categoriesCount; i++)
        {
            multigrid.categories[i].grid.values = data[i].ToArray();
        }
    }
Example #10
0
    //
    // Public Methods
    //

    public void ShowProperties(DataLayer layer, Site site)
    {
        activeLayer = layer;
        activeSite  = site;
        if (activeLayer == null)
        {
            return;
        }

        properties.name.Init(activeLayer.Name);
        properties.group.Init(activeLayer.Group);
        properties.color.Init(activeLayer.Color);

        layerNameInput.text = properties.name;
        UpdateGroupsDropdown(properties.group);
        colorButton.image.color = properties.color;

        if (layer.IsTemp)
        {
            layerNameInput.readOnly     = true;
            groupDropdown.interactable  = false;
            addGroupButton.interactable = false;
        }
        else
        {
            layerNameInput.readOnly     = false;
            groupDropdown.interactable  = true;
            addGroupButton.interactable = true;
        }

        properties.site.Init();
        properties.year.Init();
        properties.units.Init();
        properties.categories.Init();
        properties.coloring.Init();
        properties.metadata.Init();

#if !UNITY_WEBGL
        if (activeSite == null || layer.IsTemp)
#endif
        {
            sitePanel.SetActive(false);
            metadataPanel.SetActive(false);
        }
#if !UNITY_WEBGL
        else
        {
            properties.site.Init(activeSite.Name);

            sitePanel.SetActive(true);
            metadataPanel.SetActive(true);

            UpdateSitesDropdown(activeSite);

            // Gather data from all the layer's patches
            List <int>               years      = new List <int>();
            List <string>            units      = new List <string>();
            List <DataType>          types      = new List <DataType>();
            List <GridData.Coloring> styles     = new List <GridData.Coloring>();
            List <Category>          categories = null;
            bool differentCategories            = false;
            List <MetadataPair> metadata        = null;
            bool differentMetadata = false;
            foreach (var level in layer.levels)
            {
                foreach (var layerSite in level.layerSites)
                {
                    if (layerSite.Site == activeSite)
                    {
                        foreach (var record in layerSite.records)
                        {
                            var siteRecord = record.Value;
                            if (!years.Contains(siteRecord.Year))
                            {
                                years.Add(siteRecord.Year);
                            }

                            foreach (var patch in siteRecord.patches)
                            {
                                var    filename = patch.Filename;
                                string type     = Patch.GetFileNameType(filename);
                                if (type.Equals(GridDataIO.FileSufix))
                                {
                                    GridData data = patch.Data as GridData;
                                    if (!data.IsLoaded())
                                    {
                                        data = QuickReadGridPatch(filename);
                                    }

                                    if (!units.Contains(data.units))
                                    {
                                        units.Add(data.units);
                                    }
                                    var dataType = data.IsCategorized ? DataType.Categorised : DataType.Continuous;
                                    if (!types.Contains(dataType))
                                    {
                                        types.Add(dataType);
                                    }
                                    if (!styles.Contains(data.coloring))
                                    {
                                        styles.Add(data.coloring);
                                    }

                                    if (data.IsCategorized && !differentCategories)
                                    {
                                        if (categories != null)
                                        {
                                            if (!categories.SequenceEqual(data.categories))
                                            {
                                                categories.Clear();
                                                differentCategories = true;
                                            }
                                        }
                                        else if (data.categories != null)
                                        {
                                            categories = new List <Category>(data.categories);
                                        }
                                    }

                                    if (!differentMetadata)
                                    {
                                        if (metadata != null)
                                        {
                                            if (!metadata.SequenceEqual(data.metadata))
                                            {
                                                metadata.Clear();
                                                differentMetadata = true;
                                            }
                                        }
                                        else if (data.metadata != null)
                                        {
                                            metadata = new List <MetadataPair>(data.metadata);
                                        }
                                    }
                                }
                                else if (type.Equals(MultiGridDataIO.FileSufix))
                                {
                                    MultiGridData data = patch.Data as MultiGridData;
                                    if (!data.IsLoaded())
                                    {
                                        data = QuickReadMultiGridPatch(filename);
                                    }

                                    if (!units.Contains(null))
                                    {
                                        units.Add(null);
                                    }
                                    if (!types.Contains(DataType.Categorised))
                                    {
                                        types.Add(DataType.Categorised);
                                    }
                                    if (!styles.Contains(data.coloring))
                                    {
                                        styles.Add(data.coloring);
                                    }
                                }
                                else if (type.Equals(GraphDataIO.FileSufix))
                                {
                                    types.Add(DataType.Graph);
                                }
                                else
                                {
                                    types.Add(DataType.Unknown);
                                }
                            }
                        }
                        break;
                    }
                }
            }

            // Update Year
            if (years.Count != 1)
            {
                yearInput.interactable = false;
                yearInput.text         = "";
            }
            else
            {
                properties.year.Init(years[0]);

                yearInput.interactable = true;
                yearInput.text         = properties.year.Value.ToString();
            }

            // Update Units
            if (units.Count != 1)
            {
                unitsInput.interactable = false;
                unitsInput.text         = "";
            }
            else
            {
                properties.units.Init(units[0]);

                unitsInput.interactable = true;
                unitsInput.text         = properties.units;
            }

            // Update Type
            if (types.Count != 1)
            {
                typeInput.text = "";
                categoriesButton.interactable = false;
            }
            else
            {
                typeInput.text = types[0].ToString();

                properties.categories.Init(categories?.ToArray());
                categoriesButton.interactable = !differentCategories && categories != null && categories.Count > 0;
            }

            // Update Style
            if (styles.Count != 1)
            {
                styleButton.interactable       =
                    styleDropdown.interactable = false;
                styleDropdown.transform.GetChild(0).gameObject.SetActive(true);
                styleDropdown.captionText.text = "";
            }
            else
            {
                properties.coloring.Init(styles[0]);

                styleDropdown.transform.GetChild(0).gameObject.SetActive(false);
                styleDropdown.interactable = true;
                styleButton.interactable   = properties.coloring == GridData.Coloring.Custom;

                styleDropdown.onValueChanged.RemoveListener(OnStyleDropdownChanged);
                styleDropdown.value = (int)properties.coloring.Value;
                styleDropdown.onValueChanged.AddListener(OnStyleDropdownChanged);
            }

            // Update Metadata
            if (differentMetadata)
            {
                noMetadataMessage.SetActive(false);
                multipleMetadataMessage.SetActive(true);
                addMetadataButton.interactable = false;

                ClearMetadata();
            }
            else if (metadata == null || metadata.Count == 0)
            {
                noMetadataMessage.SetActive(true);
                multipleMetadataMessage.SetActive(false);

                bool validMetadata = types.Count == 1 && (types[0] == DataType.Continuous || types[0] == DataType.Categorised);
                addMetadataButton.interactable = validMetadata;

                ClearMetadata();
            }
            else
            {
                properties.metadata.Init(metadata);

                noMetadataMessage.SetActive(false);
                multipleMetadataMessage.SetActive(false);
                addMetadataButton.interactable = true;

                UpdateMetadataList(properties.metadata);
            }
        }
#endif
    }
Example #11
0
 public MultiGridPatch(DataLayer dataLayer, int level, int year, MultiGridData multigrid, string filename)
     : base(dataLayer, level, year, filename)
 {
     this.multigrid  = multigrid;
     multigrid.patch = this;
 }
Example #12
0
    private static void ParseCsv(ParseTaskData data)
    {
        GridDataIO.Parameter parameter = null;
        bool[] found = new bool[GridDataIO.Parameters.Length];

        string line = null;

        string[] cells        = null;
        bool     skipLineRead = false;

        GridData grid = new GridData();

        MultiGridData multigrid = null;

        while (true)
        {
            if (!skipLineRead)
            {
                line = data.sr.ReadLine();
            }
            else
            {
                skipLineRead = false;
            }

            if (line == null)
            {
                break;
            }

            cells     = line.Split(',');
            parameter = GridDataIO.CheckParameter(cells[0], cells[1], GridDataIO.Parameters, out bool hasData);

            if (parameter == null)
            {
#if UNITY_EDITOR
                Debug.LogWarning("File " + data.filename + " has unrecognized header parameter " + cells[0] + ". Should it go to the metadata?");
#endif
                if (grid.metadata != null)
                {
                    grid.metadata.Add(cells[0], cells[1]);
                }
                continue;
            }

#if UNITY_EDITOR
            if (found[(int)parameter.id])
            {
                Debug.LogWarning("File " + data.filename + " has duplicate metadata entry: " + parameter.label);
            }
#endif
            found[(int)parameter.id] = true;

            switch (parameter.id)
            {
            case GridDataIO.ParamId.Metadata:
                if (hasData)
                {
                    grid.metadata = PatchDataIO.ReadCsvMetadata(data.sr, GridDataIO.CsvTokens, ref line);
                    skipLineRead  = line != null;
                }
                break;

            //case GridDataIO.ParamId.NameToValue:
            //    if (hasData)
            //    {
            //		nameToValues = GridDataIO.ReadCsvNameToValues(sr, CsvTokens, ref line);
            //        skipLineRead = line != null;
            //    }
            //    break;
            case GridDataIO.ParamId.Categories:
                if (hasData)
                {
                    grid.categories = GridDataIO.ReadCsvCategories(data.sr, data.filename, GridDataIO.CsvTokens, ref line);
                    skipLineRead    = line != null;
                }
                break;

            case GridDataIO.ParamId.Coloring:
            case GridDataIO.ParamId.Colouring:
                try
                {
                    grid.coloring = (GridData.Coloring)Enum.Parse(typeof(GridData.Coloring), cells[1], true);
                }
                catch (Exception)
                {
                    grid.coloring = GridData.Coloring.Single;
                }
                break;

            case GridDataIO.ParamId.West:
                grid.west = double.Parse(cells[1], CultureInfo.InvariantCulture);
                break;

            case GridDataIO.ParamId.North:
                grid.north = double.Parse(cells[1], CultureInfo.InvariantCulture);
                if (grid.north > GeoCalculator.MaxLatitude)
                {
                    Debug.LogWarning("File " + data.filename + " has north above " + GeoCalculator.MaxLatitude + ": " + grid.north);
                }
                break;

            case GridDataIO.ParamId.East:
                grid.east = double.Parse(cells[1], CultureInfo.InvariantCulture);
                break;

            case GridDataIO.ParamId.South:
                grid.south = double.Parse(cells[1], CultureInfo.InvariantCulture);
                if (grid.south < GeoCalculator.MinLatitude)
                {
                    Debug.LogWarning("File " + data.filename + " has south below " + GeoCalculator.MinLatitude + ": " + grid.south);
                }
                break;

            case GridDataIO.ParamId.CountX:
                grid.countX = int.Parse(cells[1]);
                break;

            case GridDataIO.ParamId.CountY:
                grid.countY = int.Parse(cells[1]);
                break;

            case GridDataIO.ParamId.Units:
                grid.units = cells[1];
                break;

            case GridDataIO.ParamId.Values:
                multigrid = new MultiGridData(grid);
                ReadValues(data.sr, multigrid, data.filename);
                break;

            default:
#if UNITY_EDITOR
                Debug.Log("File " + data.filename + " will ignore row: " + line);
#endif
                skipLineRead = false;
                break;
            }
        }

#if UNITY_EDITOR
        foreach (var p in GridDataIO.Parameters)
        {
            if (p.isRequired && !found[(int)p.id])
            {
                Debug.LogError("Didn't find " + p.label + " in " + data.filename);
            }
        }
#endif

        data.patch = multigrid;
    }
Example #13
0
 public static IEnumerator LoadBin(this MultiGridData mulyigrid, string filename, PatchDataLoadedCallback <MultiGridData> callback)
 {
     yield return(FileRequest.GetBinary(filename, (br) => callback(ParseBin(br, filename, mulyigrid))));
 }
Example #14
0
 private void OnMultiGridChange(MultiGridData grid)
 {
     OnCategoriesChange(grid.categories);
 }