You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

607 lines
23 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Text;
using System.Xml;
using System.Windows.Forms;
using System.Reflection;
namespace Mesnac.Equips.SetConfig.DataConfig
{
public partial class NewEquipForm : Form
{
private bool isNew = false;
private ConfigEquipFactory configEquipFactory = null;
public NewEquipForm(ConfigEquipFactory configEquipFactory, bool isNew)
{
this.isNew = isNew;
this.configEquipFactory = configEquipFactory;
InitializeComponent();
}
private void NewEquip_Load(object sender, EventArgs e)
{
IniFormComboBox();
}
private void NewEquip_Shown(object sender, EventArgs e)
{
IniDefault();
}
private class CanUseEquip
{
public string BrandName { get; set; }
public string BrandCaption { get; set; }
public string ModelName { get; set; }
public string ModelCaption { get; set; }
public string ConnName { get; set; }
public string ConnCaption { get; set; }
public string Remark { get; set; }
public string AssemblyFile { get; set; }
}
private class Item
{
public string Key { get; set; }
public string Value { get; set; }
public CanUseEquip Equip { get; set; }
public Item(string key, string value, CanUseEquip equip)
{
this.Key = key;
this.Value = value;
this.Equip = equip;
}
public Item(string key, string value)
{
this.Key = key;
this.Value = value;
this.Equip = null;
}
public override string ToString()
{
return this.Value;
}
}
private bool GetFirstNodeValue(XmlNode node, string path, string attribute, bool throwException, out string value)
{
value = string.Empty;
try
{
value = node.SelectNodes(path)[0].Attributes[attribute.ToLower()].Value.ToString();
}
catch (Exception ex)
{
if (throwException)
{
throw (ex);
}
return false;
}
return true;
}
private bool GetNodeAttributeValue(XmlNode node, string attribute, bool throwException, out string value)
{
value = string.Empty;
try
{
value = node.Attributes[attribute.ToLower()].Value.ToString();
}
catch (Exception ex)
{
if (throwException)
{
throw (ex);
}
return false;
}
return true;
}
private List<CanUseEquip> CanUseEquipList = new List<CanUseEquip>();
private bool SameEquipName(string name)
{
foreach (BaseEquip equip in this.configEquipFactory.AllEquips.Values)
{
if (equip.Name.Equals(name))
{
if (isNew)
{
return true;
}
else
{
if (equip.Name != this.configEquipFactory.CurrentEquip.Name)
{
return true;
}
}
}
}
return false;
}
private void IniCanUseEquipByReflection()
{
string thisPath = this.GetType().Assembly.Location;
List<string> files = new List<string>();
DirectoryInfo dirTop = new DirectoryInfo(Path.GetDirectoryName(thisPath) + "\\Data\\DeviceConfig\\Mesnac.Equips");
if (!dirTop.Exists)
{
return;
}
foreach (DirectoryInfo equipDir in dirTop.GetDirectories())
{
foreach (FileInfo equipFile in equipDir.GetFiles())
{
try
{
if (equipFile.Extension.ToLower() != ".dll")
{
continue;
}
Assembly ass = Assembly.LoadFile(equipFile.FullName);
if (ass == null)
{
continue;
}
foreach (Type type in ass.GetTypes())
{
if ((typeof(BaseEquip).IsAssignableFrom(type)) && (type.Name == "Equip"))
{
string fullName = type.Namespace;
string ss = "Mesnac.Equip.";
if (!fullName.StartsWith(ss))
{
continue;
}
fullName = fullName.Substring(ss.Length);
int index = 0;
CanUseEquip canequip = new CanUseEquip();
canequip.AssemblyFile = equipFile.FullName;
#region BrandName
index = fullName.IndexOf(".");
if (index < 0)
{
continue;
}
ss = fullName.Substring(0, index);
fullName = fullName.Substring(index + 1);
canequip.BrandName = ss;
canequip.BrandCaption = ss;
#endregion
#region ModelName
index = fullName.IndexOf(".");
if (index < 0)
{
continue;
}
ss = fullName.Substring(0, index);
fullName = fullName.Substring(index + 1);
canequip.ModelName = ss;
canequip.ModelCaption = ss;
#endregion
#region ConnName
ss = fullName;
canequip.ConnName = ss;
canequip.ConnCaption = ss;
#endregion
CanUseEquipList.Add(canequip);
}
}
}
catch (Exception ee)
{
Console.WriteLine(ee.Message);
Console.WriteLine(ee.StackTrace);
}
}
}
}
private void IniFormComboBox()
{
int i = 0;
while (true)
{
i++;
this.textBox1.Text = "A" + i.ToString();
if (!SameEquipName(this.textBox1.Text))
{
break;
}
}
IniCanUseEquipByReflection();
comboBox1.Items.Clear();
comboBox1.Items.Add(new Item(_selectDefault, _selectDefault));
foreach (CanUseEquip equip in CanUseEquipList)
{
bool isExists = false;
foreach (object item in comboBox1.Items)
{
if (((Item)item).Key == equip.BrandName)
{
isExists = true;
break;
}
}
if (!isExists)
{
comboBox1.Items.Add(new Item(equip.BrandName, equip.BrandCaption));
}
}
if (comboBox1.Items.Count > 0)
{
comboBox1.SelectedIndex = 0;
}
}
private void SetComboBox(ComboBox cb, string key)
{
for (int i = 0; i < cb.Items.Count; i++)
{
if (((Item)cb.Items[i]).Key == key)
{
cb.SelectedIndex = i;
return;
}
}
}
private void IniDefault()
{
if (!isNew && this.configEquipFactory.CurrentEquip != null)
{
this.ConnType = this.configEquipFactory.CurrentEquip.Main.ConnType;
this.textBox1.Text = this.configEquipFactory.CurrentEquip.Name;
#region 郑立兵于2015-01-19添加用于设置和显示设备群组的设置
this.cbGroup.Checked = this.configEquipFactory.CurrentEquip.IsEnableGroup;
this.txtRange.Text = this.configEquipFactory.CurrentEquip.GroupRange;
#endregion
this.textBox2.Text = this.configEquipFactory.CurrentEquip.Main.ReadHz.ToString();
SetComboBox(this.comboBox1, this.configEquipFactory.CurrentEquip.Main.Brand);
SetComboBox(this.comboBox2, this.configEquipFactory.CurrentEquip.Main.Model);
SetComboBox(this.comboBox3, this.configEquipFactory.CurrentEquip.Main.ConnType.Name);
if (ConnType is Mesnac.Equips.Connection.Default.ConnType)
{
var type=ConnType as Mesnac.Equips.Connection.Default.ConnType;
this.txt_num.Text = type.IP;
}
}
}
private readonly string _selectDefault = "------请选择------";
private Mesnac.Equips.Connection.ConnType ConnType;
private void button1_Click(object sender, EventArgs e)
{
#region 数据校验
string sModel = string.Empty;
try
{
sModel = listViewEquip.SelectedItems[0].Text.Trim().Replace(_selectDefault, string.Empty);
}
catch
{
}
if (this.isNew)
{
if (string.IsNullOrWhiteSpace(sModel))
{
//MessageBox.Show("请选择模版!");
//return;
}
}
if (SameEquipName(textBox1.Text.Trim()))
{
MessageBox.Show("设备名称重复!");
return;
}
if (string.IsNullOrWhiteSpace(textBox1.Text.Trim()))
{
MessageBox.Show("请输入名称!");
return;
}
if (this.cbGroup.Checked)
{
if (!EquipTools.CheckRuleColon(this.txtRange.Text) && !EquipTools.CheckRuleJoin(this.txtRange.Text))
{
MessageBox.Show("设备群组范围格式设置不正确!\r\n请参照以下格式:\r\n1、1:2:3:4:5\r\n或者\r\n1..5", "提示");
return;
}
}
if ((comboBox1.SelectedItem == null) || (string.IsNullOrWhiteSpace(((Item)comboBox1.SelectedItem).Key.Replace(_selectDefault, string.Empty))))
{
MessageBox.Show("请选择品牌!");
return;
}
if ((comboBox2.SelectedItem == null) || (string.IsNullOrWhiteSpace(((Item)comboBox2.SelectedItem).Key.Replace(_selectDefault, string.Empty))))
{
MessageBox.Show("请选择类型!");
return;
}
if (ConnType == null)
{
MessageBox.Show("请选择连接方式!");
return;
}
if (ConnType is Mesnac.Equips.Connection.Default.ConnType && string.IsNullOrWhiteSpace(txt_num.Text.Trim()))
{
MessageBox.Show("请输入站号!");
return;
}
else
{
var type = (Mesnac.Equips.Connection.Default.ConnType)ConnType;
type.IP = txt_num.Text.Trim();
ConnType.IP = txt_num.Text.Trim();
}
int iReadHz = 1000;
if (!int.TryParse(textBox2.Text, out iReadHz))
{
MessageBox.Show("请填写正确的读取频率!");
return;
}
if (!isNew && this.configEquipFactory.CurrentEquip != null)
{
this.configEquipFactory.AllEquips.Remove(this.configEquipFactory.CurrentEquip.Name);
}
#endregion
#region 数据复制
#region 使用模版
Dictionary<string, ConfigEquip> configEquipList = new Dictionary<string, ConfigEquip>();
if (!string.IsNullOrWhiteSpace(sModel)) //模版
{
try
{
string _xmlPath = Path.Combine(sModel, "Equip.config");
ConfigEquipFactory factory = new ConfigEquipFactory(_xmlPath, "模板");
factory.ReadConfig();
configEquipList = factory.AllEquips;
}
catch { }
}
if (configEquipList.Count > 0) //使用模版
{
foreach (ConfigEquip equip in configEquipList.Values)
{
this.configEquipFactory.CurrentEquip = equip;
break;
}
this.configEquipFactory.CurrentEquip.Project = this.configEquipFactory.ProjectWizardName;
this.configEquipFactory.CurrentEquip.Name = textBox1.Text.Trim();
this.configEquipFactory.CurrentEquip.IsEnableGroup = this.cbGroup.Checked;
if (this.cbGroup.Checked)
{
this.configEquipFactory.CurrentEquip.GroupRange = this.txtRange.Text.Trim();
}
else
{
this.configEquipFactory.CurrentEquip.GroupRange = String.Empty;
}
this.configEquipFactory.CurrentEquip.Main.Brand = ((Item)comboBox1.SelectedItem).Key.Replace(_selectDefault, string.Empty).Trim();
this.configEquipFactory.CurrentEquip.Main.Model = ((Item)comboBox2.SelectedItem).Key.Replace(_selectDefault, string.Empty).Trim();
this.configEquipFactory.CurrentEquip.Main.ReadHz = Convert.ToInt32(textBox2.Text.Trim());
this.configEquipFactory.CurrentEquip.Main.ConnType = ConnType;
}
#endregion
#region 不使用模版
else
{
if (this.isNew)
{
this.configEquipFactory.CurrentEquip = new ConfigEquip();
}
this.configEquipFactory.CurrentEquip.Project = this.configEquipFactory.ProjectWizardName;
this.configEquipFactory.CurrentEquip.Name = textBox1.Text.Trim();
this.configEquipFactory.CurrentEquip.IsEnableGroup = this.cbGroup.Checked;
if (this.cbGroup.Checked)
{
this.configEquipFactory.CurrentEquip.GroupRange = this.txtRange.Text.Trim();
}
else
{
this.configEquipFactory.CurrentEquip.GroupRange = String.Empty;
}
this.configEquipFactory.CurrentEquip.Main.Brand = ((Item)comboBox1.SelectedItem).Key.Replace(_selectDefault, string.Empty).Trim();
this.configEquipFactory.CurrentEquip.Main.Model = ((Item)comboBox2.SelectedItem).Key.Replace(_selectDefault, string.Empty).Trim();
this.configEquipFactory.CurrentEquip.Main.ReadHz = Convert.ToInt32(textBox2.Text.Trim());
this.configEquipFactory.CurrentEquip.Main.ConnType = ConnType;
}
this.configEquipFactory.AllEquips.Add(this.configEquipFactory.CurrentEquip.Name, this.configEquipFactory.CurrentEquip);
#endregion
#endregion
this.DialogResult = System.Windows.Forms.DialogResult.OK;
this.Close();
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string brand = string.Empty;
brand = ((Item)comboBox1.SelectedItem).Key.Replace(_selectDefault, string.Empty);
comboBox2.Items.Clear();
comboBox3.Items.Clear();
if (string.IsNullOrWhiteSpace(brand))
{
return;
}
comboBox2.Items.Add(new Item(_selectDefault, _selectDefault));
foreach (CanUseEquip equip in CanUseEquipList)
{
bool isExists = false;
if (equip.BrandName == brand)
{
foreach (object item in comboBox2.Items)
{
if (((Item)item).Key == equip.ModelName)
{
isExists = true;
break;
}
}
if (!isExists)
{
comboBox2.Items.Add(new Item(equip.ModelName, equip.ModelCaption));
}
}
}
if (comboBox2.Items.Count > 0)
{
comboBox2.SelectedIndex = 0;
}
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
string brand = string.Empty;
brand = ((Item)comboBox1.SelectedItem).Key.Replace(_selectDefault, string.Empty);
string type = string.Empty;
type = ((Item)comboBox2.SelectedItem).Key.Replace(_selectDefault, string.Empty);
comboBox3.Items.Clear();
if (string.IsNullOrWhiteSpace(brand))
{
return;
}
if (string.IsNullOrWhiteSpace(brand))
{
return;
}
comboBox3.Items.Add(new Item(_selectDefault, _selectDefault));
foreach (CanUseEquip equip in CanUseEquipList)
{
bool isExists = false;
if (equip.BrandName == brand && equip.ModelName == type)
{
foreach (object item in comboBox3.Items)
{
if (((Item)item).Key == equip.ConnName)
{
isExists = true;
break;
}
}
if (!isExists)
{
comboBox3.Items.Add(new Item(equip.ConnName, equip.ConnCaption, equip));
}
}
}
if (comboBox3.Items.Count > 0)
{
comboBox3.SelectedIndex = 0;
}
ConnType = null;
}
private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
{
ConnType = null;
listViewEquip.Items.Clear();
getConnType(false);
if (ConnType == null)
{
return;
}
string brand = string.Empty;
brand = ((Item)comboBox1.SelectedItem).Key.Replace(_selectDefault, string.Empty);
string type = string.Empty;
type = ((Item)comboBox2.SelectedItem).Key.Replace(_selectDefault, string.Empty);
string conn = string.Empty;
Item item = (Item)comboBox3.SelectedItem;
conn = item.Key.Replace(_selectDefault, string.Empty);
ListViewItem listItem = listViewEquip.Items.Add(_selectDefault);
listItem.SubItems.Add("0");
listItem.SubItems.Add(_selectDefault);
if (item.Equip == null)
{
return;
}
if (string.IsNullOrWhiteSpace(this.configEquipFactory.ProjectWizardName))
{
return;
}
//string thisPath = item.Equip.AssemblyFile;
string thisPath = this.GetType().Assembly.Location;
string path = Path.Combine(Path.GetDirectoryName(thisPath),
"Data\\DeviceConfig\\Mesnac.Equips",
"Mesnac.Equip." + brand,
"EquipConfig." + type,
this.configEquipFactory.ProjectWizardName);
DirectoryInfo dirTop = new DirectoryInfo(path);
if (!dirTop.Exists)
{
return;
}
DirectoryInfo[] dirs = (dirTop).GetDirectories();
int index = 0;
foreach (DirectoryInfo dir in dirs)
{
index++;
ListViewItem _item = listViewEquip.Items.Add(dir.FullName);
_item.SubItems.Add(index.ToString());
_item.SubItems.Add(dir.Name);
}
}
private void getConnType(bool get)
{
string conn = string.Empty;
conn = ((Item)comboBox3.SelectedItem).Key.Replace(_selectDefault, string.Empty);
if (string.IsNullOrWhiteSpace(conn))
{
ConnType = null;
return;
}
else
{
try
{
ConnType = new Mesnac.Equips.Connection.Default.ConnType();
//if (conn == this.configEquipFactory.CurrentEquip.Main.ConnType.Name)
//{
// ConnType = this.configEquipFactory.CurrentEquip.Main.ConnType;
//}
}
catch { }
}
if (ConnType == null || get)
{
//ConnType = Mesnac.Equips.Connection.Factory.Instance.SetConfig(conn, ConnType);
}
}
private void button2_Click(object sender, EventArgs e)
{
getConnType(true);
}
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
//判断按键是不是要输入的类型。
if (((int)e.KeyChar < 48 || (int)e.KeyChar > 57) && (int)e.KeyChar != 8 && (int)e.KeyChar != 46)
{
e.Handled = true;
}
}
#region 郑立兵于2015-01-19添加扩展设备群组控制
/// <summary>
/// 启用设备群组
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cbGroup_CheckedChanged(object sender, EventArgs e)
{
this.lblRange.Visible = this.cbGroup.Checked;
this.txtRange.Visible = this.cbGroup.Checked;
}
#endregion
}
}