scrollbar |
---|
Exercise outline
The goal of this exercise is to add a Ribbon button for volume models. As a result, it should be possible to configure the input data of volume models in just a couple of clicks.
Create a new gui command
Add a new folder to the plugin project named Commands. In this folder, create a new class named AddInputDataToVolumeModelCommand.cs and adapt the contents as shown below.
Note |
---|
A reference to DeltaShell.Plugins.NetworkEditor needs to be added in order to successfully build the code below (right click the References folder of the project in the Solution Explorer | Add Reference... | Browse... | Select D:\VolumeModel\packages\DeltaShell.1.0.0\delta-shell\plugins\DeltaShell.Plugins.NetworkEditor\DeltaShell.Plugins.NetworkEditor.dll). |
Code Block |
---|
outline {color:#ff0000}*\[TODO\]*{color} {color:#ff0000}Description of the exercise outline{color} h2. Fixme {color:#ff0000}*\[TODO\]*{color} {color:#ff0000}Fixme{color} h2. Fixme {color:#ff0000}*\[TODO\]*{color} {color:#ff0000}Fixme{color} h2. Exercise results {color:#ff0000}*\[TODO\]*{color} {color:#ff0000}Description of the exercise results{color}\\ \\ \\ \\ \\ 1. Add a new folder to the project named "Commands" 2. Create a new class named "AddDemoDataToVolumeModelCommand" \[TODO: Image\] 3. Add the following contents to this class: {code} using System.Collections.Generic; using System.Drawing; using System.Linq; using DelftToolsSystem.ShellWindows.GuiForms; using DeltaShellDelftTools.PluginShell.DemoApp.ImportersGui; using DeltaShell.PluginPlugins.DemoAppVolumeModel.ModelsImporters; using DeltaShell.Plugins.NetworkEditor.Import; using SharpMap.Api; using SharpMap.Data.Providers; namespace DeltaShell.PluginPlugins.DemoAppVolumeModel.Commands { internal class AddDemoDataToVolumeModelCommandAddInputDataToVolumeModelCommand : IGuiCommand { public string Name /// <summary> /// The { name of the gui command get { return "Add demo data"; } /// </summary> public string Name } { public bool Enabled get { return "Add input data"; } get {} return Gui != null && Gui.SelectedModel is VolumeModel; }/// <summary> } public Image Image { get; set; } /// Ensures the gui command is enabled for volume models only /// </summary> public bool Checked { get;public set;bool }Enabled public IGui Gui { get; set; } public voidget Execute(params object[] arguments) {{ return Gui != null && Gui.Selection is Models.VolumeModel; } } // Obtain the selected volume/// model<summary> /// The image of varthe volumeModel = (VolumeModel) Gui.SelectedModel; gui command /// Create</summary> a WaterML2 time series importer public Image Image { get; set; } var waterMl2TimeSeriesImporter = new WaterML2TimeSeriesImporter(); /// <summary> /// Whether or not //the Importgui acommand WaterML2is filechecked to the precipitation time series of the volume model/// </summary> /// <remarks>Not relevant waterMl2TimeSeriesImporter.ImportItem(@"..\..\precipitation_waterml.XML", volumeModel.Precipitation); in this tutorial</remarks> public bool Checked { // Create a catchment importer get; set; } /// <summary> var catchmentsImporter = new CatchmentFromGisImporter {/// A reference to the Delta Shell gui (automatically set by Delta Shell logic) /// </summary> FileBasedFeatureProviders =public newIGui List<IFileBasedFeatureProvider> Gui { get; set; } /// <summary> { /// The action that should be performed while executing the gui command new ShapeFile() /// </summary> public void Execute(params object[] }arguments) }; { // ConfigureObtain the catchmentselected volume importermodel var catchmentImporterSettingsvolumeModel = catchmentsImporter.FeatureFromGisImporterSettings (Models.VolumeModel) Gui.SelectedModel; catchmentImporterSettings.Path = @"D:\deltashell\Workshop\SoftwareDaysNov2013\Gemeenten.shp"; catchmentImporterSettings.PropertiesMapping.First(property => property.PropertyName == "Name").MappingColumn.ColumnName = "GM_NAAM"; // Try to obtain a precipitation file via a file dialog var fileDialog = new OpenFileDialog // Import a shape file to the basin{ of the volume model catchmentsImporter.ImportItem(null, volumeModel.Basin); Title = "Choose precipitation time }series", public void Unexecute() { Filter = "WaterML2 files|*.XML", } } } {code} 4. Create a new WPF user control named "DemoAppRibbon" \[TODO: Image\] 5. Add the following Multiselect xaml= code: {code} <UserControl x:Class="DeltaShell.Plugin.DemoApp.DemoAppRibbon" false xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"}; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" if (fileDialog.ShowDialog() != DialogResult.OK) { xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" return; } xmlns:fluent="clr-namespace:Fluent;assembly=Fluent" // Create a WaterML2 time mc:Ignorable="d"series importer d:DesignHeight="300" d:DesignWidth="300"> <!--Create a ribbon control--> var waterML2TimeSeriesImporter = new WaterML2TimeSeriesImporter(); <fluent:Ribbon Name="DemoAppRibbonControl" x:FieldModifier="private"> <!--Create a ribbon tab--> // Import the data from the precipitation file <fluent:RibbonTabItem Header="Volume model" fluent:KeyTip.Keys="E"> waterML2TimeSeriesImporter.ImportItem(fileDialog.FileName, volumeModel.Precipitation); <!--Create a ribbon group box--> // Try to obtain a shape file via a file dialog <fluent:RibbonGroupBox Header="Demo"> fileDialog = new OpenFileDialog <!--Create a ribbon button--> { <fluent:Button x:Name="ButtonAddDemoDataToVolumeModel" Title = "Choose basin shape file", Header Filter = "Add demo data"Shape files|*.shp", Multiselect = false ToolTip="Add demo data to the selected volume model"}; if (fileDialog.ShowDialog() != DialogResult.OK) { Click="ButtonAddDemoDataToVolumeModel_OnClick" return; } Size="Middle" // Create a catchment importer var catchmentsImporter = new CatchmentFromGisImporter SizeDefinition="Middle,Small,Small"/> { </fluent:RibbonGroupBox> </fluent:RibbonTabItem> </fluent:Ribbon> </UserControl> {code} 6. Additionally, add the following interaction logic in DemoAppRibbon.xaml.cs: {code} using System.Collections.Generic; using System.Windows; using DelftTools.Controls; using DelftTools.Shell.Gui; using DelftTools.Shell.Gui.Forms; using DeltaShell.Plugin.DemoApp.Commands; namespace DeltaShell.Plugin.DemoApp FileBasedFeatureProviders = new List<IFileBasedFeatureProvider> { /// <summary> /// Interaction logic for DemoAppRibbon.xaml /// </summary> public partial class DemoAppRibbon : IRibbonCommandHandler new ShapeFile() { private readonly IGuiCommand addDemoDataCommand = new AddDemoDataToVolumeModelCommand(); } public DemoAppRibbon() {}; InitializeComponent(); } // Configure the catchment importer public object GetRibbonControl() var catchmentImporterSettings = catchmentsImporter.FeatureFromGisImporterSettings; { catchmentImporterSettings.Path return DemoAppRibbonControl= fileDialog.FileName; } catchmentImporterSettings.PropertiesMapping.First(property => public void ValidateItems() property.PropertyName == "Name").MappingColumn.ColumnName = "GM_NAAM"; { // Import the data from the ButtonAddDemoDataToVolumeModel.IsEnabled = addDemoDataCommand.Enabled;shape file } public bool IsConextualTabVisible(string tabGroupName, string tabName)catchmentsImporter.ImportItem(null, volumeModel.Basin); {} /// <summary> return false; /// The action that should be } performed in order to undo execute actions of publicthe IEnumerable<ICommand>gui Commandscommand {/// </summary> /// <remarks>Not relevant in get { yield return addDemoDataCommand; }this tutorial</remarks> } private void ButtonAddDemoDataToVolumeModel_OnClick(object sender, RoutedEventArgs epublic void Unexecute() { addDemoDataCommand.Execute(); } } } {code} 7. Run the application, create a volume model and click the newly created Ribbon button: ensure input data is added correctly to the volume model by opening the data views or by running the model \[TODO: Image\] } } } |
Info |
---|
The command is derived from the IGuiCommand interface in order to obtain a reference to the Delta Shell gui (which is automatically set by the Delta Shell framework). The comments in the code explain the different parts of the gui command implementation. |
Create a new Ribbon control
Add a new folder to the plugin project named Ribbon. In this folder, create a new WPF user control named VolumeModelRibbon.xaml and adapt the contents (in the designer) as shown below:
Code Block |
---|
<UserControl x:Class="DeltaShell.Plugins.VolumeModel.Ribbon.VolumeModelRibbon"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:fluent="clr-namespace:Fluent;assembly=Fluent"
mc:Ignorable="d" Height="145" Width="632">
<!--Create a ribbon control-->
<fluent:Ribbon Name="VolumeModelRibbonControl" x:FieldModifier="private">
<!--Create a ribbon tab-->
<fluent:RibbonTabItem Header="Volume model" fluent:KeyTip.Keys="E">
<!--Create a ribbon group box-->
<fluent:RibbonGroupBox Header="Input">
<!--Create a ribbon button-->
<fluent:Button x:Name="ButtonAddInputDataToVolumeModel"
Header="Add input data"
ToolTip="Add input data to the selected volume model"
Click="ButtonAddInputDataToVolumeModel_OnClick"
Size="Middle"
SizeDefinition="Middle,Small,Small"/>
</fluent:RibbonGroupBox>
</fluent:RibbonTabItem>
</fluent:Ribbon>
</UserControl>
|
Additionally, adapt the contents of VolumeModelRibbon.xaml.cs as shown below (right click the class | View Code).
Note |
---|
A reference to System.Xaml needs to be added in order to successfully build the code below (right click the References folder of the project in the Solution Explorer | Add Reference... | Assemblies | Framework | Select System.Xaml). |
Code Block |
---|
using System.Collections.Generic;
using System.Windows;
using DelftTools.Controls;
using DelftTools.Shell.Gui;
using DelftTools.Shell.Gui.Forms;
using DeltaShell.Plugins.VolumeModel.Commands;
namespace DeltaShell.Plugins.VolumeModel.Ribbon
{
/// <summary>
/// Interaction logic for VolumeModelRibbon.xaml
/// </summary>
public partial class VolumeModelRibbon : IRibbonCommandHandler
{
private readonly IGuiCommand addInputDataToVolumeModelCommand = new AddInputDataToVolumeModelCommand(); // Instance of the implemented gui command
/// <summary>
/// Creates the Ribbon control
/// </summary>
public VolumeModelRibbon()
{
// Initialize the control (standard user control logic)
InitializeComponent();
}
/// <summary>
/// Returns the volume model Ribbon control
/// </summary>
public object GetRibbonControl()
{
return VolumeModelRibbonControl;
}
/// <summary>
/// Enabling/disabling actions to be performed while validating the Ribbon items (triggered by Delta Shell logic)
/// </summary>
public void ValidateItems()
{
ButtonAddInputDataToVolumeModel.IsEnabled = addInputDataToVolumeModelCommand.Enabled;
}
/// <summary>
/// Whether or not the contextual tab should be visible
/// </summary>
public bool IsConextualTabVisible(string tabGroupName, string tabName)
{
return false;
}
/// <summary>
/// The (gui) commands of the Ribbon control
/// </summary>
public IEnumerable<ICommand> Commands
{
get { yield return addInputDataToVolumeModelCommand; }
}
/// <summary>
/// Actions to be performed after clicking the AddInputDataToVolumeModel button
/// </summary>
private void ButtonAddInputDataToVolumeModel_OnClick(object sender, RoutedEventArgs e)
{
addInputDataToVolumeModelCommand.Execute();
}
}
}
|
Info |
---|
The Ribbon control is derived from the IRibbonCommandHandler interface so that it can be registered in the gui plugin. The comments in the code should explain the different parts of the Ribbon control implementation. |
Register the Ribbon control in the gui plugin class
Register the Ribbon control in the gui plugin by adding the following code to VolumeModelGuiPlugin.cs:
Code Block |
---|
using DelftTools.Shell.Gui.Forms;
using DeltaShell.Plugins.VolumeModel.Ribbon;
|
and
Code Block |
---|
public override IRibbonCommandHandler RibbonCommandHandler
{
get { return new VolumeModelRibbon(); }
}
|
Delta Shell should now automatically add the new Ribbon control to its Ribbon bar during the application startup.
Exercise results
First of all, download the following WaterML2 XML file: WaterML2_precipitation_data.XML. Also download and unzip the shape files contained in the following archive: Gemeenten.zip. You will use all these data along the exercise.
Next, run the application and check that a volume Ribbon button has been added to the Ribbon bar:
Then create a new volume model item (right click on project | Add | New Model ...), click the volume Ribbon button and, sequentially, select the previously downloaded WaterML2 XML file and shape files in the file selection dialogs.
Afterwards, verify that the input data has been correctly added to the volume model by opening the data views or by running the model:
scrollbar |
---|