Commit 4a228559 authored by 潘栩锋's avatar 潘栩锋 🚴

删除 把下吹的吸料删除

parent eb1424f5
......@@ -87,18 +87,6 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="UiModule\FeederPanel\FeederPanel2.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="UiModule\FeederPanel\FeederStyle.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="UiModule\FeederPanel\UcFeeder2.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="UiModule\TempAreaPanel\TempAreaPanel2.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
......@@ -123,18 +111,6 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="UiModule\FeederPanel\FeederPanel.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="UiModule\FeederPanel\UcFeeder.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="UiModule\FeederPanel\FeederPanelStyle.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="UiModule\MenuSetting.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
......@@ -243,18 +219,6 @@
<DependentUpon>DynAreaWinderV3.xaml</DependentUpon>
</Compile>
<Compile Include="UiModule\DynAreaWinder\UiModule2_DynAreaWinder.cs" />
<Compile Include="UiModule\FeederPanel\FeederPanel2.xaml.cs">
<DependentUpon>FeederPanel2.xaml</DependentUpon>
</Compile>
<Compile Include="UiModule\FeederPanel\FeederPanel.xaml.cs">
<DependentUpon>FeederPanel.xaml</DependentUpon>
</Compile>
<Compile Include="UiModule\FeederPanel\UcFeeder2.xaml.cs">
<DependentUpon>UcFeeder2.xaml</DependentUpon>
</Compile>
<Compile Include="UiModule\FeederPanel\UcFeeder.xaml.cs">
<DependentUpon>UcFeeder.xaml</DependentUpon>
</Compile>
<Compile Include="UiModule\MenuSetting.xaml.cs">
<DependentUpon>MenuSetting.xaml</DependentUpon>
</Compile>
......@@ -281,7 +245,6 @@
<Compile Include="UiModule\TempAreaPanel\WdTempAreaSet.xaml.cs">
<DependentUpon>WdTempAreaSet.xaml</DependentUpon>
</Compile>
<Compile Include="UiModule\FeederPanel\UiModule2_FeederPanel.cs" />
<Compile Include="UiModule\WdManual\WdManualV4.xaml.cs">
<DependentUpon>WdManualV4.xaml</DependentUpon>
</Compile>
......
<UserControl x:Class="FLY.DownBlowing.UI.Client.UiModule.FeederPanel"
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:local="clr-namespace:FLY.DownBlowing.UI.Client.UiModule"
mc:Ignorable="d" Width="1600" Height="954">
<Grid d:DataContext="{StaticResource downBlowingSystemUt}">
<ItemsControl ItemsSource="{Binding FeederDatas}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:UcFeeder DataContext="{Binding .}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</UserControl>
using FLY.DownBlowing.IService;
using FLY.OBJComponents.Client;
using MultiLayout.UiModule;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Unity;
namespace FLY.DownBlowing.UI.Client.UiModule
{
/// <summary>
/// FeederPanel.xaml 的交互逻辑
/// </summary>
public partial class FeederPanel : UserControl
{
IDownBlowingSystemService downBlowingSystemService;
IUnityContainer container;
List<SetPLCUpdatePlan> setPlan_feederDatas = new List<SetPLCUpdatePlan>();
public FeederPanel()
{
InitializeComponent();
}
[InjectionMethod]
public void Init(
IUnityContainer container,
IDownBlowingSystemService downBlowingSystemService)
{
this.downBlowingSystemService = downBlowingSystemService;
this.DataContext = this.downBlowingSystemService;
for (int i = 0; i < this.downBlowingSystemService.FeederDatas.Count(); i++)
{
string objname = $"{nameof(IDownBlowingSystemService.FeederDatas)}[{i}]";
SetPLCUpdatePlan plan = new SetPLCUpdatePlan(
this.downBlowingSystemService.PLCos,
objname,
UcFeeder.update_propertynames);
setPlan_feederDatas.Add(plan);
}
this.downBlowingSystemService.PropertyChanged += DownBlowingSystemService_PropertyChanged;
}
private void DownBlowingSystemService_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(downBlowingSystemService.FeederDatas))
{
ResetItemsEvent();
}
}
private void ResetItemsEvent()
{
//把多出来的删除
int remove_cnt = setPlan_feederDatas.Count() - this.downBlowingSystemService.FeederDatas.Count();
if (remove_cnt > 0)
{
for (int i = 0; i < remove_cnt; i++)
{
SetPLCUpdatePlan plan = setPlan_feederDatas[setPlan_feederDatas.Count() - 1 - i];
plan.Dispose();
}
setPlan_feederDatas.RemoveRange(setPlan_feederDatas.Count() - remove_cnt, remove_cnt);
}
else
{
int start_idx = setPlan_feederDatas.Count();
int add_cnt = -remove_cnt;
for (int i = 0; i < add_cnt; i++)
{
string objname = $"{nameof(IDownBlowingSystemService.FeederDatas)}[{start_idx+i}]";
SetPLCUpdatePlan plan = new SetPLCUpdatePlan(
this.downBlowingSystemService.PLCos,
objname,
UcFeeder.update_propertynames);
setPlan_feederDatas.Add(plan);
}
}
}
}
}
<UserControl x:Class="FLY.DownBlowing.UI.Client.UiModule.FeederPanel2"
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:local="clr-namespace:FLY.DownBlowing.UI.Client.UiModule"
mc:Ignorable="d" d:DesignWidth="1600" d:DesignHeight="954" Unloaded="UserControl_Unloaded" Loaded="UserControl_Loaded" >
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="FeederPanelStyle.xaml"/>
<ResourceDictionary Source="FeederStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid d:DataContext="{StaticResource downBlowingSystemUt}">
<ItemsControl x:Name="ic" ItemsSource="{Binding FeederDatas}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="{Binding ElementName=ic,Path=Items.Count}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl ContentTemplate="{StaticResource Feeder2Template}" Content="{Binding .}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</UserControl>
using FLY.DownBlowing.Client;
using FLY.DownBlowing.IService;
using FLY.OBJComponents.Client;
using MultiLayout.UiModule;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Unity;
namespace FLY.DownBlowing.UI.Client.UiModule
{
/// <summary>
/// FeederPanel.xaml 的交互逻辑
/// </summary>
public partial class FeederPanel2 : UserControl
{
IDownBlowingSystemService downBlowingSystemService;
IUnityContainer container;
List<SetPLCUpdatePlan> setPlan_feederDatas = new List<SetPLCUpdatePlan>();
public FeederPanel2()
{
InitializeComponent();
}
[InjectionMethod]
public void Init(
IUnityContainer container,
IDownBlowingSystemService downBlowingSystemService)
{
this.downBlowingSystemService = downBlowingSystemService;
this.DataContext = this.downBlowingSystemService;
if (this.downBlowingSystemService is DownBlowingSystemServiceClient)
{
(this.downBlowingSystemService as DownBlowingSystemServiceClient).ResetFeederDatasEvent += ResetItemsEvent;
}
}
private void ResetItemsEvent()
{
if (setPlan_feederDatas.Count() == 0)
return;//从来没注册
//把多出来的删除
int remove_cnt = setPlan_feederDatas.Count() - this.downBlowingSystemService.FeederDatas.Count();
if (remove_cnt > 0)
{
for (int i = 0; i < remove_cnt; i++)
{
SetPLCUpdatePlan plan = setPlan_feederDatas[setPlan_feederDatas.Count() - 1 - i];
plan.Dispose();
}
setPlan_feederDatas.RemoveRange(setPlan_feederDatas.Count() - remove_cnt, remove_cnt);
}
else
{
int start_idx = setPlan_feederDatas.Count();
int add_cnt = -remove_cnt;
for (int i = 0; i < add_cnt; i++)
{
string objname = $"{nameof(IDownBlowingSystemService.FeederDatas)}[{start_idx + i}]";
SetPLCUpdatePlan plan = new SetPLCUpdatePlan(
this.downBlowingSystemService.PLCos,
objname,
UcFeeder.update_propertynames);
setPlan_feederDatas.Add(plan);
}
}
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
if (setPlan_feederDatas.Count() == 0)
{
for (int i = 0; i < this.downBlowingSystemService.FeederDatas.Count(); i++)
{
string objname = $"{nameof(IDownBlowingSystemService.FeederDatas)}[{i}]";
SetPLCUpdatePlan plan = new SetPLCUpdatePlan(
this.downBlowingSystemService.PLCos,
objname,
UcFeeder.update_propertynames); ;
setPlan_feederDatas.Add(plan);
}
}
}
private void UserControl_Unloaded(object sender, RoutedEventArgs e)
{
for (int i = 0; i < setPlan_feederDatas.Count(); i++)
{
setPlan_feederDatas[i].Dispose();
}
setPlan_feederDatas.Clear();
}
}
}
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
xmlns:flyctrl="clr-namespace:FLY.ControlLibrary;assembly=FLY.ControlLibrary">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/FLY.DownBlowing.UI.Client;component/Themes/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
\ No newline at end of file
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:flyctrl="clr-namespace:FLY.ControlLibrary;assembly=FLY.ControlLibrary"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors" >
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="FeederPanelStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
<!--单层吸料界面模板 横向-->
<DataTemplate x:Key="FeederTemplate">
<Grid >
<Border Style="{StaticResource Styles.Module.Border}" Background="{StaticResource Color_background}">
<Viewbox Margin="{StaticResource ControlMargin}" Stretch="Uniform" StretchDirection="DownOnly" HorizontalAlignment="Left" VerticalAlignment="Top">
<Grid >
<StackPanel>
<Border Width="100" Background="{StaticResource Color_badgeBg}" Margin="3" HorizontalAlignment="Left">
<TextBlock Text="{Binding Number}" Width="100" Height="100" FontSize="100" FontWeight="Bold" FontFamily="Arial Black" Foreground="{StaticResource Color_badgeText}" VerticalAlignment="Top" HorizontalAlignment="Left"/>
</Border>
<ItemsControl ItemsSource="{Binding Feeders}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}">
<Grid>
<flyctrl:ToggleButtonOnOff Style="{StaticResource ToggleButtonOnOffStyle}" Width="140"
Margin="{StaticResource ControlMargin}"
OnLabel="吸料开" OnBrush="{StaticResource Color_on}"
OffLabel="吸料关" OffBrush="{StaticResource Color_off}"
IsChecked="{Binding IsFeederOn}"/>
<TextBlock HorizontalAlignment="Right" VerticalAlignment="Top" Padding="6,2" Margin="0,-5,-5,0"
Background="{StaticResource Color_badgeBg}" Foreground="{StaticResource Color_badgeText}"
FontSize="30"
Text="{Binding Number}" />
</Grid>
<Grid Width="20"/>
<Button Style="{StaticResource MahApps.Styles.Button.Square.Accent}"
Padding="20,5" Margin="{StaticResource ControlMargin}"
FontSize="{StaticResource FontSize_title}"
Content="复位"
Visibility="{Binding IsFeederResetValid,Converter={StaticResource visbilityconv}}">
<i:Interaction.Behaviors>
<flyctrl:Set1Behavior Binding="{Binding FeederReset}"/>
</i:Interaction.Behaviors>
</Button>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>
</Viewbox>
</Border>
</Grid>
</DataTemplate>
<!--单层吸料界面模板 纵向-->
<DataTemplate x:Key="Feeder2Template">
<Grid >
<Border Style="{StaticResource Styles.Module.Border}" Background="{StaticResource Color_background}">
<Viewbox Margin="{StaticResource ControlMargin}" Stretch="Uniform" StretchDirection="DownOnly" HorizontalAlignment="Left" VerticalAlignment="Top">
<Grid >
<StackPanel>
<Border Width="100" Background="{StaticResource Color_badgeBg}" Margin="3" HorizontalAlignment="Left">
<TextBlock Text="{Binding Number}" Width="100" Height="100" FontSize="100" FontWeight="Bold" FontFamily="Arial Black" Foreground="{StaticResource Color_badgeText}" VerticalAlignment="Top" HorizontalAlignment="Left"/>
</Border>
<ItemsControl ItemsSource="{Binding Feeders}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Margin="{StaticResource ControlMargin}">
<Grid HorizontalAlignment="Left">
<flyctrl:ToggleButtonOnOff Style="{StaticResource ToggleButtonOnOffStyle}" Width="140"
Margin="{StaticResource ControlMargin}"
OnLabel="吸料开" OnBrush="{StaticResource Color_on}"
OffLabel="吸料关" OffBrush="{StaticResource Color_off}"
IsChecked="{Binding IsFeederOn}"/>
<TextBlock HorizontalAlignment="Right" VerticalAlignment="Top" Padding="6,2" Margin="0,-5,-5,0"
Background="{StaticResource Color_badgeBg}" Foreground="{StaticResource Color_badgeText}"
FontSize="30"
Text="{Binding Number}" />
</Grid>
<Grid Width="20"/>
<Button Style="{StaticResource MahApps.Styles.Button.Square.Accent}"
Padding="20,5" Margin="{StaticResource ControlMargin}"
FontSize="{StaticResource FontSize_title}"
Content="复位"
Visibility="{Binding IsFeederResetValid,Converter={StaticResource visbilityconv}}">
<i:Interaction.Behaviors>
<flyctrl:Set1Behavior Binding="{Binding FeederReset}"/>
</i:Interaction.Behaviors>
</Button>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>
</Viewbox>
</Border>
</Grid>
</DataTemplate>
</ResourceDictionary>
\ No newline at end of file
<UserControl x:Class="FLY.DownBlowing.UI.Client.UiModule.UcFeeder"
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:local="clr-namespace:FLY.DownBlowing.UI.Client.UiModule"
xmlns:flyctrl="clr-namespace:FLY.ControlLibrary;assembly=FLY.ControlLibrary"
xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:ut="clr-namespace:FLY.DownBlowing.UI.Client.UnitTests"
mc:Ignorable="d" >
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="FeederPanelStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid d:DataContext="{Binding Source={StaticResource downBlowingSystemUt},Path=FeederDatas[0]}">
<Border Style="{StaticResource Styles.Module.Border}" Background="{StaticResource Color_background}">
<Viewbox Margin="{StaticResource ControlMargin}" Stretch="Uniform" StretchDirection="DownOnly" HorizontalAlignment="Left" VerticalAlignment="Top">
<Grid >
<StackPanel>
<Border Width="100" Background="{StaticResource Color_badgeBg}" Margin="3" HorizontalAlignment="Left">
<TextBlock Text="{Binding Number}" Width="100" Height="100" FontSize="100" FontWeight="Bold" FontFamily="Arial Black" Foreground="{StaticResource Color_badgeText}" VerticalAlignment="Top" HorizontalAlignment="Left"/>
</Border>
<ItemsControl ItemsSource="{Binding Feeders}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}">
<Grid>
<flyctrl:ToggleButtonOnOff Style="{StaticResource ToggleButtonOnOffStyle}" Width="140"
Margin="{StaticResource ControlMargin}"
OnLabel="吸料开" OnBrush="{StaticResource Color_on}"
OffLabel="吸料关" OffBrush="{StaticResource Color_off}"
IsChecked="{Binding IsFeederOn}"/>
<TextBlock HorizontalAlignment="Right" VerticalAlignment="Top" Padding="6,2" Margin="0,-5,-5,0"
Background="{StaticResource Color_badgeBg}" Foreground="{StaticResource Color_badgeText}"
FontSize="30"
Text="{Binding Number}" />
</Grid>
<Grid Width="20"/>
<Button Style="{StaticResource MahApps.Styles.Button.Square.Accent}"
Padding="20,5" Margin="{StaticResource ControlMargin}"
FontSize="{StaticResource FontSize_title}"
Content="复位"
Visibility="{Binding IsFeederResetValid,Converter={StaticResource visbilityconv}}">
<i:Interaction.Behaviors>
<flyctrl:Set1Behavior Binding="{Binding FeederReset}"/>
</i:Interaction.Behaviors>
</Button>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>
</Viewbox>
</Border>
</Grid>
</UserControl>
using FLY.DownBlowing.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace FLY.DownBlowing.UI.Client.UiModule
{
/// <summary>
/// UcFeeder.xaml 的交互逻辑
/// </summary>
public partial class UcFeeder : UserControl
{
public static string[] update_propertynames;
static UcFeeder() {
string[] propertynames = new string[] {
nameof(FeederData.IsFeederOn1),
nameof(FeederData.IsFeederResetValid1),
nameof(FeederData.FeederReset1)
};
List<string> update_propertynames = new List<string>();
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < propertynames.Count(); j++)
{
update_propertynames.Add(propertynames[j].Replace("1", (i + 1).ToString()));
}
}
UcFeeder.update_propertynames = update_propertynames.ToArray();
}
public UcFeeder()
{
InitializeComponent();
}
}
}
<UserControl x:Class="FLY.DownBlowing.UI.Client.UiModule.UcFeeder2"
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:local="clr-namespace:FLY.DownBlowing.UI.Client.UiModule"
xmlns:flyctrl="clr-namespace:FLY.ControlLibrary;assembly=FLY.ControlLibrary"
xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:ut="clr-namespace:FLY.DownBlowing.UI.Client.UnitTests"
mc:Ignorable="d" >
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="FeederPanelStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid d:DataContext="{Binding Source={StaticResource downBlowingSystemUt},Path=FeederDatas[0]}">
<Border Style="{StaticResource Styles.Module.Border}" Background="{StaticResource Color_background}">
<Viewbox Margin="{StaticResource ControlMargin}" Stretch="Uniform" StretchDirection="DownOnly" HorizontalAlignment="Left" VerticalAlignment="Top">
<Grid >
<StackPanel>
<Border Width="100" Background="{StaticResource Color_badgeBg}" Margin="3" HorizontalAlignment="Left">
<TextBlock Text="{Binding Number}" Width="100" Height="100" FontSize="100" FontWeight="Bold" FontFamily="Arial Black" Foreground="{StaticResource Color_badgeText}" VerticalAlignment="Top" HorizontalAlignment="Left"/>
</Border>
<ItemsControl ItemsSource="{Binding Feeders}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Margin="{StaticResource ControlMargin}">
<Grid HorizontalAlignment="Left">
<flyctrl:ToggleButtonOnOff Style="{StaticResource ToggleButtonOnOffStyle}" Width="140"
Margin="{StaticResource ControlMargin}"
OnLabel="吸料开" OnBrush="{StaticResource Color_on}"
OffLabel="吸料关" OffBrush="{StaticResource Color_off}"
IsChecked="{Binding IsFeederOn}"/>
<TextBlock HorizontalAlignment="Right" VerticalAlignment="Top" Padding="6,2" Margin="0,-5,-5,0"
Background="{StaticResource Color_badgeBg}" Foreground="{StaticResource Color_badgeText}"
FontSize="30"
Text="{Binding Number}" />
</Grid>
<Grid Width="20"/>
<Button Style="{StaticResource MahApps.Styles.Button.Square.Accent}"
Padding="20,5" Margin="{StaticResource ControlMargin}"
FontSize="{StaticResource FontSize_title}"
Content="复位"
Visibility="{Binding IsFeederResetValid,Converter={StaticResource visbilityconv}}">
<i:Interaction.Behaviors>
<flyctrl:Set1Behavior Binding="{Binding FeederReset}"/>
</i:Interaction.Behaviors>
</Button>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>
</Viewbox>
</Border>
</Grid>
</UserControl>
using FLY.DownBlowing.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace FLY.DownBlowing.UI.Client.UiModule
{
/// <summary>
/// UcFeeder.xaml 的交互逻辑
/// </summary>
public partial class UcFeeder2 : UserControl
{
public UcFeeder2()
{
InitializeComponent();
}
}
}
using MultiLayout.UiModule;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using Unity;
namespace FLY.DownBlowing.UI.Client.UiModule
{
public class UiModule2_FeederPanel : IUiModule2
{
/// <summary>
/// 控件标题
/// 它的值取决于culture
/// </summary>
public string Title => "下吹.吸料";
public ComponentType Type => ComponentType.Graph;
public bool IsUnique => true;
/// <summary>
/// 控件
/// 创建时,需要给它唯一ID,让加载自己的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public FrameworkElement GetComponent(int id, IUnityContainer container)
{
FeederPanel2 graph = new FeederPanel2();
container.BuildUp(graph);
return graph;
}
/// <summary>
/// 控件缩略图,用于编辑界面时,大致看看
/// 创建时,需要给它唯一ID,让加载自己的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public FrameworkElement GetThumbnail()
{
return new System.Windows.Controls.Grid();
}
/// <summary>
/// 给出全部控件ID, 控件自行删除没有的参数
/// </summary>
/// <param name="IDs"></param>
public void MatchParam(int[] IDs)
{
}
}
}
......@@ -38,22 +38,12 @@ namespace FLY.DownBlowing.UI.Client.UnitTests
/// </summary>
public IbcData IbcData { get; } = new IbcData();
/// <summary>
/// 吸料
/// </summary>
public ObservableCollection<FeederData> FeederDatas { get; } = new ObservableCollection<FeederData>();
/// <summary>
/// 挤出温控
/// </summary>
public ObservableCollection<TempArea> TAreas { get; } = new ObservableCollection<TempArea>();
/// <summary>
/// 报警的寄存器
/// </summary>
public FeederAccessory FeederAccessory { get; } = new FeederAccessory();
private PLCProxySystem plcos = new PLCProxySystem();
......@@ -65,8 +55,6 @@ namespace FLY.DownBlowing.UI.Client.UnitTests
/// </summary>
public IPLCProxySystemService PLCos { get { return plcos; } }
public int[] FeederCntOfEachs { get; set; }
public string Version { get; set; } = "3";
#endregion
......@@ -89,20 +77,6 @@ namespace FLY.DownBlowing.UI.Client.UnitTests
ta.Init(number);
TAreas.Add(ta);
}
FeederCntOfEachs = new int[9];
for (int i = 0; i < 9; i++)
{
FeederCntOfEachs[i] = 4;
}
FeederCntOfEachs[8] = 6;
for (int i = 0; i < FeederCntOfEachs.Count(); i++)
{
string number = FeederIndex2Number(i);
FeederData fd = new FeederData();
fd.Init(number, FeederCntOfEachs[i] );
FeederDatas.Add(fd);
}
......@@ -227,11 +201,5 @@ namespace FLY.DownBlowing.UI.Client.UnitTests
}
return number;
}
string FeederIndex2Number(int index)
{
string number = ((char)('A' + (index ))).ToString();
return number;
}
}
}
......@@ -35,18 +35,6 @@ namespace FLY.DownBlowing.Client
/// </summary>
public IbcData IbcData { get; } = new IbcData();
#region 吸料
/// <summary>
/// 吸料
/// </summary>
public ObservableCollection<FeederData> FeederDatas { get; } = new ObservableCollection<FeederData>();
/// <summary>
/// 每层吸料的吸料数量
/// </summary>
public int[] FeederCntOfEachs { get; set; } = new int[] { 4, 4, 4, 4, 4, 4, 4, 4, 4 };
#endregion
#region 挤出温控
/// <summary>
......@@ -118,20 +106,7 @@ namespace FLY.DownBlowing.Client
}
return number;
}
string FeederIndex2Number(int index)
{
string number = ((char)('A' + (index))).ToString();
return number;
}
void FeederDatasAdd(int i, int feederCnt) {
string number = FeederIndex2Number(i);
var feederData = new FeederData();
feederData.Init(number, feederCnt);
FeederDatas.Add(feederData);
}
void Init()
{
Load();
......@@ -147,12 +122,6 @@ namespace FLY.DownBlowing.Client
TAreasAdd(i);
}
for (int i = 0; i < FeederCntOfEachs.Count(); i++)
{
FeederDatasAdd(i, FeederCntOfEachs[i]);
}
//--------------------------------------------------------------
//属性同步
Dictionary<string, INotifyPropertyChanged> objnames = GetObjNames();
......@@ -183,9 +152,6 @@ namespace FLY.DownBlowing.Client
for (int i = 0; i < TAreas.Count(); i++)
objnames.Add($"{nameof(TAreas)}[{i}]", TAreas[i]);
}
if(FeederDatas!=null)
for (int i = 0; i < FeederDatas.Count(); i++)
objnames.Add($"{nameof(FeederDatas)}[{i}]", FeederDatas[i]);
return objnames;
}
......@@ -210,14 +176,6 @@ namespace FLY.DownBlowing.Client
Save();
}
}
else if (e.PropertyName == nameof(FeederCntOfEachs))
{
if (IsFeederCntOfEachsChanged())
{
ResetFeederDatas();
Save();
}
}
else if (e.PropertyName == nameof(Version))
{
Save();
......@@ -267,56 +225,6 @@ namespace FLY.DownBlowing.Client
return;
}
bool IsFeederCntOfEachsChanged()
{
var feederCnts = FeederDatas.Select(i => i.FeederCnt).ToArray();
return !Enumerable.SequenceEqual(FeederCntOfEachs, feederCnts);
}
/// <summary>
/// 重新创建 FeederDatas
/// </summary>
void ResetFeederDatas()
{
int remove_cnt = FeederDatas.Count() - FeederCntOfEachs.Count();
if (remove_cnt > 0)
{
//多出来的Item 都要删除
for (int i = 0; i < remove_cnt; i++)
{
int index = FeederDatas.Count() - 1;
FeederDatas.RemoveAt(index);
string objname = $"{nameof(FeederDatas)}[{index}]";
syncPropServiceClient.Remove(objname);
}
}
else if (remove_cnt < 0)
{
//少了,需要添加
for (int i = 0; i < -remove_cnt; i++)
{
int index = FeederDatas.Count();
FeederDatasAdd(index, FeederCntOfEachs[index]);
string objname = $"{nameof(FeederDatas)}[{index}]";
syncPropServiceClient.Add(objname, FeederDatas[index]);
}
}
//现在数量一样, 重新初始化每层的吸料数量
for (int i = 0; i < FeederCntOfEachs.Count(); i++)
{
if (FeederDatas[i].FeederCnt != FeederCntOfEachs[i])
{
FeederDatas[i].Init(FeederIndex2Number(i), FeederCntOfEachs[i]);
}
}
ResetFeederDatasEvent?.Invoke();
return;
}
/// <summary>
///
/// </summary>
......@@ -344,7 +252,6 @@ namespace FLY.DownBlowing.Client
{
return new string[]{
nameof(TAreasCnt),
nameof(FeederCntOfEachs),
nameof(Version)
};
}
......@@ -359,10 +266,6 @@ namespace FLY.DownBlowing.Client
{
public int TAreasCnt=10;
/// <summary>
/// 每层吸料的吸料数量
/// </summary>
public int[] FeederCntOfEachs = new int[] { 4, 4, 4, 4, 4, 4, 4, 4, 4 };
public string Version = "3";
......@@ -373,7 +276,6 @@ namespace FLY.DownBlowing.Client
DownBlowingSystemServiceClientJsonDb jsonDb = new DownBlowingSystemServiceClientJsonDb()
{
TAreasCnt = src.TAreasCnt,
FeederCntOfEachs = src.FeederCntOfEachs,
Version = src.Version
};
string json = Newtonsoft.Json.JsonConvert.SerializeObject(jsonDb);
......@@ -394,7 +296,6 @@ namespace FLY.DownBlowing.Client
string json = File.ReadAllText(filePath);
var p = Newtonsoft.Json.JsonConvert.DeserializeObject<DownBlowingSystemServiceClientJsonDb>(json);
src.TAreasCnt = p.TAreasCnt;
src.FeederCntOfEachs = p.FeederCntOfEachs;
src.Version = p.Version;
return true;
}
......
using Misc;
using System.ComponentModel;
namespace FLY.DownBlowing.Common
{
public class FeederAccessory : INotifyPropertyChanged
{
public FeederAccessory()
{
}
#region 辅助代码生成
/// <summary>
/// 吸料急停开启!!!请检查
/// </summary>
[Description("吸料急停开启!!!请检查")]
[IsError()]
public bool Warning001 { get; set; }
/// <summary>
/// 吸料1号电机过载!!!请检查
/// </summary>
[Description("吸料1号电机过载!!!请检查")]
[IsError()]
public bool Warning002 { get; set; }
/// <summary>
/// 吸料2号电机过载!!!请检查
/// </summary>
[Description("吸料2号电机过载!!!请检查")]
[IsError()]
public bool Warning003 { get; set; }
#endregion
public event PropertyChangedEventHandler PropertyChanged;
}
}
using FLY.OBJComponents.IService;
using Misc;
using System.Collections.Generic;
using System.ComponentModel;
namespace FLY.DownBlowing.Common
{
public class FeederData : INotifyPropertyChanged, IPropertyOpt
{
public FeederData()
{
}
public void Init(string number, int feederCnt)
{
Number = number;
FeederCnt = feederCnt;
FeedersBinding();
}
/// <summary>
/// 名称:A,B,C,D,E
/// </summary>
public string Number { get; private set; }
public int FeederCnt { get; private set; }
#region 辅助代码生成
/// <summary>
/// 吸料开1
/// </summary>
[Description("吸料开1")]
public bool IsFeederOn1 { get; set; }
/// <summary>
/// 吸料开2
/// </summary>
[Description("吸料开2")]
public bool IsFeederOn2 { get; set; }
/// <summary>
/// 吸料开3
/// </summary>
[Description("吸料开3")]
public bool IsFeederOn3 { get; set; }
/// <summary>
/// 吸料开4
/// </summary>
[Description("吸料开4")]
public bool IsFeederOn4 { get; set; }
/// <summary>
/// 吸料开5
/// </summary>
[Description("吸料开5")]
public bool IsFeederOn5 { get; set; }
/// <summary>
/// 吸料开6
/// </summary>
[Description("吸料开6")]
public bool IsFeederOn6 { get; set; }
/// <summary>
/// 吸料复位1(按1)
/// </summary>
[Description("吸料复位1(按1)")]
public bool FeederReset1 { get; set; }
/// <summary>
/// 吸料复位2(按1)
/// </summary>
[Description("吸料复位2(按1)")]
public bool FeederReset2 { get; set; }
/// <summary>
/// 吸料复位3(按1)
/// </summary>
[Description("吸料复位3(按1)")]
public bool FeederReset3 { get; set; }
/// <summary>
/// 吸料复位4(按1)
/// </summary>
[Description("吸料复位4(按1)")]
public bool FeederReset4 { get; set; }
/// <summary>
/// 吸料复位5(按1)
/// </summary>
[Description("吸料复位5(按1)")]
public bool FeederReset5 { get; set; }
/// <summary>
/// 吸料复位6(按1)
/// </summary>
[Description("吸料复位6(按1)")]
public bool FeederReset6 { get; set; }
/// <summary>
/// 吸料复位有效1
/// </summary>
[Description("吸料复位有效1")]
public bool IsFeederResetValid1 { get; set; }
/// <summary>
/// 吸料复位有效2
/// </summary>
[Description("吸料复位有效2")]
public bool IsFeederResetValid2 { get; set; }
/// <summary>
/// 吸料复位有效3
/// </summary>
[Description("吸料复位有效3")]
public bool IsFeederResetValid3 { get; set; }
/// <summary>
/// 吸料复位有效4
/// </summary>
[Description("吸料复位有效4")]
public bool IsFeederResetValid4 { get; set; }
/// <summary>
/// 吸料复位有效5
/// </summary>
[Description("吸料复位有效5")]
public bool IsFeederResetValid5 { get; set; }
/// <summary>
/// 吸料复位有效6
/// </summary>
[Description("吸料复位有效6")]
public bool IsFeederResetValid6 { get; set; }
/// <summary>
/// NO.1未吸到料!!!请检查
/// </summary>
[Description("NO.1未吸到料!!!请检查")]
[IsError()]
public bool Warning001 { get; set; }
/// <summary>
/// NO.2未吸到料!!!请检查
/// </summary>
[Description("NO.2未吸到料!!!请检查")]
[IsError()]
public bool Warning002 { get; set; }
/// <summary>
/// NO.3未吸到料!!!请检查
/// </summary>
[Description("NO.3未吸到料!!!请检查")]
[IsError()]
public bool Warning003 { get; set; }
/// <summary>
/// NO.4未吸到料!!!请检查
/// </summary>
[Description("NO.4未吸到料!!!请检查")]
[IsError()]
public bool Warning004 { get; set; }
/// <summary>
/// NO.5未吸到料!!!请检查
/// </summary>
[Description("NO.5未吸到料!!!请检查")]
[IsError()]
public bool Warning005 { get; set; }
/// <summary>
/// NO.6未吸到料!!!请检查
/// </summary>
[Description("NO.6未吸到料!!!请检查")]
[IsError()]
public bool Warning006 { get; set; }
#endregion
public event PropertyChangedEventHandler PropertyChanged;
public string[] GetSyncPropNames()
{
return null;
}
public string[] GetNoSyncPropNames()
{
return new string[] {
nameof(Number),
nameof(Feeders)
};
}
public List<FeederCell> Feeders { get; } = new List<FeederCell>();
/// <summary>
/// 每个料仓 绑定到 对应的队列
/// </summary>
void FeedersBinding()
{
Feeders.Clear();
for (int i = 0; i < FeederCnt; i++)
{
int no = i + 1;
FeederCell feeder = new FeederCell();
feeder.Number = no.ToString();
Misc.BindingOperations.SetBinding(this, $"IsFeederOn{no}", feeder, nameof(feeder.IsFeederOn), Misc.BindingOperations.BindingMode.TwoWay);
Misc.BindingOperations.SetBinding(this, $"FeederReset{no}", feeder, nameof(feeder.FeederReset), Misc.BindingOperations.BindingMode.TwoWay);
Misc.BindingOperations.SetBinding(this, $"IsFeederResetValid{no}", feeder, nameof(feeder.IsFeederResetValid));
Feeders.Add(feeder);
}
}
}
public class FeederCell : INotifyPropertyChanged
{
/// <summary>
/// 序号
/// </summary>
public string Number { get; set; }
/// <summary>
/// 吸料开1
/// </summary>
[Description("吸料开")]
public bool IsFeederOn { get; set; }
/// <summary>
/// 吸料复位1(按1)
/// </summary>
[Description("吸料复位(按1)")]
public bool FeederReset { get; set; }
/// <summary>
/// 吸料复位有效6
/// </summary>
[Description("吸料复位有效")]
public bool IsFeederResetValid { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
}
}
......@@ -48,10 +48,8 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Client\DownBlowingSystemServiceClient.cs" />
<Compile Include="Common\FeederData.cs" />
<Compile Include="Common\IBCData.cs" />
<Compile Include="Common\TempArea.cs" />
<Compile Include="Common\FeederAccessory.cs" />
<Compile Include="Common\WinderAccessory.cs" />
<Compile Include="Common\WinderInsideOutside.cs" />
<Compile Include="IService\IDownBlowingSystemService.cs" />
......
......@@ -25,17 +25,6 @@ namespace FLY.DownBlowing.IService
/// 外冷
/// </summary>
IbcData IbcData { get; }
#region 吸料
/// <summary>
/// 吸料
/// </summary>
ObservableCollection<FeederData> FeederDatas { get; }
/// <summary>
/// 每层吸料的吸料数量
/// </summary>
int[] FeederCntOfEachs { get; }
#endregion
#region 挤出温控
......
......@@ -34,9 +34,6 @@ namespace FLY.DownBlowing.Server.OBJProxy
for (int i = 0; i < data.TAreas.Count(); i++)
objnames.Add($"{nameof(DownBlowingSystem.TAreas)}[{i}]", data.TAreas[i]);
for (int i = 0; i < data.FeederDatas.Count(); i++)
objnames.Add($"{nameof(DownBlowingSystem.FeederDatas)}[{i}]", data.FeederDatas[i]);
var syncProp_OBJProxy = new SyncProp_OBJProxy(
objsys_idx, ID + 1, objnames);
......
......@@ -40,17 +40,7 @@ namespace FLY.DownBlowing.Server
/// 外冷
/// </summary>
public IbcData IbcData { get; } = new IbcData();
#region 吸料
/// <summary>
/// 吸料
/// </summary>
public ObservableCollection<FeederData> FeederDatas { get; } = new ObservableCollection<FeederData>();
/// <summary>
/// 每层吸料的吸料数量
/// </summary>
public int[] FeederCntOfEachs { get; private set; } = new int[] { 4, 4, 4, 4, 4, 4, 4, 4, 4 };
#endregion
#region 挤出温控
/// <summary>
......@@ -63,10 +53,6 @@ namespace FLY.DownBlowing.Server
public ObservableCollection<TempArea> TAreas { get; } = new ObservableCollection<TempArea>();
#endregion
/// <summary>
/// 吸料综合
/// </summary>
public FeederAccessory FeederAccessory { get; } = new FeederAccessory();
public PLCProxySystem plcos = new PLCProxySystem();
/// <summary>
......@@ -116,7 +102,6 @@ namespace FLY.DownBlowing.Server
errorConf.AddErrorAction(WinderAccessory);
errorConf.AddErrorAction(IbcData);
errorConf.AddErrorAction(FeederAccessory);
WIOs[0].Init("外");
WIOs[1].Init("内");
......@@ -130,16 +115,6 @@ namespace FLY.DownBlowing.Server
}, wio);
}
foreach(var feederdata in FeederDatas)
{
errorConf.AddErrorAction(feederdata,
(ref string description, object state) => {
var fd = state as FeederData;
description = fd.Number + "层 " + description;
},
feederdata);
}
foreach (var tarea in TAreas)
{
errorConf.AddErrorAction(tarea,
......@@ -186,12 +161,6 @@ namespace FLY.DownBlowing.Server
plcos.Init();
}
string FeederIndex2Number(int index)
{
string number = ((char)('A' + (index))).ToString();
return number;
}
string TAreaIndex2Number(int index)
{
......@@ -231,34 +200,6 @@ namespace FLY.DownBlowing.Server
TAreasCnt = tAreasCnt;
//吸料
List<int> feederCntOfEachs = new List<int>();
r = new Regex($@"{nameof(FeederDatas)}\[([0-9])\]");
Regex r2 = new Regex(@"IsFeederOn([1-9])");
foreach (PLCGroup.PLCVariable var in plcgroup.Variables)
{
Match m = r.Match(var.OwnerName);
if (m.Success)
{
int feederdata_idx = int.Parse(m.Groups[1].Value);
if (feederCntOfEachs.Count() <= feederdata_idx)
{
while (feederCntOfEachs.Count() <= feederdata_idx)
feederCntOfEachs.Add(0);
}
Match m2 = r2.Match(var.PropertyName);
if (m2.Success)
{
int feederCnt = int.Parse(m2.Groups[1].Value);
if (feederCntOfEachs[feederdata_idx] < feederCnt)
feederCntOfEachs[feederdata_idx] = feederCnt;
}
}
}
FeederCntOfEachs = feederCntOfEachs.ToArray();
for (int i = 0; i < TAreasCnt; i++)
{
......@@ -268,20 +209,11 @@ namespace FLY.DownBlowing.Server
TAreas.Add(ta);
}
for (int i = 0; i < FeederCntOfEachs.Count(); i++)
{
string number = FeederIndex2Number(i);
FeederData fd = new FeederData();
fd.Init(number, FeederCntOfEachs[i]);
FeederDatas.Add(fd);
}
//objname 转 obj
Dictionary<string, INotifyPropertyChanged> objnames = new Dictionary<string, INotifyPropertyChanged>();
objnames.Add(nameof(WinderAccessory), WinderAccessory);
objnames.Add(nameof(IbcData), IbcData);
objnames.Add(nameof(FeederAccessory), FeederAccessory);
for(int i=0;i<WIOs.Count();i++)
objnames.Add($"{nameof(WIOs)}[{i}]", WIOs[i]);
......@@ -291,11 +223,7 @@ namespace FLY.DownBlowing.Server
for (int i = 0; i < TAreas.Count(); i++)
objnames.Add($"{nameof(TAreas)}[{i}]", TAreas[i]);
}
if (FeederDatas != null)
{
for (int i = 0; i < FeederDatas.Count(); i++)
objnames.Add($"{nameof(FeederDatas)}[{i}]", FeederDatas[i]);
}
return objnames;
});
......@@ -307,7 +235,6 @@ namespace FLY.DownBlowing.Server
{
return new string[]{
nameof(TAreasCnt),
nameof(FeederCntOfEachs),
nameof(Version)
};
}
......
......@@ -12,7 +12,6 @@
<register type="IUiModule2" mapTo="UiModule2_DynAreaWinder" name="downBlowing_daw" />
<register type="IUiModule2" mapTo="UiModule2_WinderPanel" name="downBlowing_wp" />
<register type="IUiModule2" mapTo="UiModule2_TempAreaPanel" name="downBlowing_tap" />
<register type="IUiModule2" mapTo="UiModule2_FeederPanel" name="downBlowing_fp" />
</container>
</unity>
</configuration>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment