// Copyright (C) Stichting Deltares 2017. All rights reserved.
//
// This file is part of Ringtoets.
//
// Ringtoets is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// All names, logos, and references to "Deltares" are registered trademarks of
// Stichting Deltares and remain full property of Stichting Deltares at all times.
// All rights reserved.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using Core.Common.Base.Geometry;
using Core.Common.Controls.Commands;
using Core.Common.Gui.Commands;
using Core.Components.Gis.Data;
using Core.Components.Gis.Features;
using Core.Components.Gis.Geometries;
using Core.Components.Gis.Theme;
using Demo.Ringtoets.Properties;
namespace Demo.Ringtoets.Commands
{
///
/// The command for opening a view for with
/// categorial theming on random data.
///
public class OpenThematicalMapViewCommand : ICommand
{
private readonly IViewCommands viewCommands;
private const string selectedMetaDataAttributeName = "Waarde";
///
/// Creates a new instance of .
///
/// The to be used internally.
public OpenThematicalMapViewCommand(IViewCommands viewCommands)
{
this.viewCommands = viewCommands;
}
public bool Checked { get; } = false;
public void Execute()
{
var mapDataCollection = new MapDataCollection(Resources.OpenThematicalMapViewCommand_Execute_Demo_map_with_theming);
var mapPointDataEqualCriteria = new MapPointData(Resources.OpenThematicalMapViewCommand_Execute_MapPointData_with_EqualValueCriteria)
{
Features = CreateMapPointFeaturesWithMetaData(40),
Style =
{
Size = 10
},
SelectedMetaDataAttribute = selectedMetaDataAttributeName
};
SetEqualCriteria(mapPointDataEqualCriteria);
mapDataCollection.Add(mapPointDataEqualCriteria);
var mapPointDataUnequalCriteria = new MapPointData(Resources.OpenThematicalMapViewCommand_Execute_MapPointData_with_UnequalValueCriteria)
{
Features = CreateMapPointFeaturesWithMetaData(15),
Style =
{
Size = 10
},
SelectedMetaDataAttribute = selectedMetaDataAttributeName
};
SetUnequalCriteria(mapPointDataUnequalCriteria);
mapDataCollection.Add(mapPointDataUnequalCriteria);
var mapLineDataEqualCriteria = new MapLineData(Resources.OpenThematicalMapViewCommand_Execute_MapLineData_with_EqualValueCriteria)
{
Features = CreateMapLineFeaturesWithMetaData(40),
SelectedMetaDataAttribute = selectedMetaDataAttributeName
};
SetEqualCriteria(mapLineDataEqualCriteria);
mapDataCollection.Add(mapLineDataEqualCriteria);
var mapLineDataUnequalCriteria = new MapLineData(Resources.OpenThematicalMapViewCommand_Execute_MapLineData_with_UnequalValueCriteria)
{
Features = CreateMapLineFeaturesWithMetaData(10),
SelectedMetaDataAttribute = selectedMetaDataAttributeName
};
SetUnequalCriteria(mapLineDataUnequalCriteria);
mapDataCollection.Add(mapLineDataUnequalCriteria);
var mapPolygonDataEqualCriteria = new MapPolygonData(Resources.OpenThematicalMapViewCommand_Execute_MapPolygonData_with_EqualValueCriteria)
{
Features = CreatePolygonFeaturesWithMetaData(40),
SelectedMetaDataAttribute = selectedMetaDataAttributeName
};
SetEqualCriteria(mapPolygonDataEqualCriteria);
mapDataCollection.Add(mapPolygonDataEqualCriteria);
var mapPolygonDataUnequalCriteria = new MapPolygonData(Resources.OpenThematicalMapViewCommand_Execute_MapPolygonData_with_UnequalValueCriteria)
{
Features = CreatePolygonFeaturesWithMetaData(10),
SelectedMetaDataAttribute = selectedMetaDataAttributeName
};
SetUnequalCriteria(mapPolygonDataUnequalCriteria);
mapDataCollection.Add(mapPolygonDataUnequalCriteria);
viewCommands.OpenView(mapDataCollection);
}
private static void SetEqualCriteria(FeatureBasedMapData mapData)
{
var random = new Random(13);
int nrOfFeatures = mapData.Features.Count();
var theme = new MapTheme("Waarde", new[]
{
new CategoryTheme(Color.DarkOrange, new ValueCriterion(ValueCriterionOperator.EqualValue, random.Next(0, nrOfFeatures))),
new CategoryTheme(Color.OrangeRed, new ValueCriterion(ValueCriterionOperator.EqualValue, random.Next(0, nrOfFeatures))),
new CategoryTheme(Color.SkyBlue, new ValueCriterion(ValueCriterionOperator.EqualValue, random.Next(0, nrOfFeatures))),
new CategoryTheme(Color.GreenYellow, new ValueCriterion(ValueCriterionOperator.EqualValue, random.Next(0, nrOfFeatures)))
});
mapData.MapTheme = theme;
}
private static void SetUnequalCriteria(FeatureBasedMapData mapData)
{
var random = new Random(37);
int nrOfFeatures = mapData.Features.Count();
var theme = new MapTheme("Waarde", new[]
{
new CategoryTheme(Color.Purple, new ValueCriterion(ValueCriterionOperator.UnequalValue, random.Next(0, nrOfFeatures)))
});
mapData.MapTheme = theme;
}
private static IEnumerable CreateMapPointFeaturesWithMetaData(int nrOfPoints)
{
const double offset = 12;
double xCoordinate = 0;
var features = new MapFeature[nrOfPoints];
for (var i = 0; i < nrOfPoints; i++)
{
MapFeature feature = GetFeatureWithPoints(new[]
{
new Point2D(xCoordinate, 0)
});
feature.MetaData[selectedMetaDataAttributeName] = i;
features[i] = feature;
xCoordinate += offset;
}
return features;
}
private static IEnumerable CreateMapLineFeaturesWithMetaData(int nrOfLines)
{
double xCoordinate = 0;
var features = new MapFeature[nrOfLines];
for (var i = 0; i < nrOfLines; i++)
{
MapFeature feature = GetFeatureWithPoints(new[]
{
new Point2D(xCoordinate, 0),
new Point2D(xCoordinate++, 10)
});
feature.MetaData[selectedMetaDataAttributeName] = i;
features[i] = feature;
}
return features;
}
private static IEnumerable CreatePolygonFeaturesWithMetaData(int nrOfPolygons)
{
const double offset = 3;
double leftCoordinate = 0;
double rightCoordinate = 1;
var features = new MapFeature[nrOfPolygons];
for (var i = 0; i < nrOfPolygons; i++)
{
MapFeature feature = GetFeatureWithPoints(new[]
{
new Point2D(leftCoordinate, 0),
new Point2D(leftCoordinate, 5),
new Point2D(rightCoordinate, 5),
new Point2D(rightCoordinate, 0),
new Point2D(leftCoordinate, 0)
});
feature.MetaData[selectedMetaDataAttributeName] = i;
features[i] = feature;
leftCoordinate += offset;
rightCoordinate += offset;
}
return features;
}
private static MapFeature GetFeatureWithPoints(Point2D[] points)
{
return new MapFeature(new[]
{
new MapGeometry(new[]
{
points
})
});
}
}
}