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.
lj_plc/Main/Mesnac.Gui.Edit/Dialog/FrmVar.cs

516 lines
22 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ICSharpCode.Core;
using Mesnac.Basic;
namespace Mesnac.Gui.Edit.Dialog
{
public partial class FrmVar : Form
{
private string msg = String.Empty;
AccidenceAnalyzer express;
public FrmVar()
{
InitializeComponent();
express = new AccidenceAnalyzer();
express.OnAccidenceAnalysis += new AccidenceAnalyzer.AccidenceAnalysis(express_OnAccidenceAnalysis);
express.OnCallBack += new AccidenceAnalyzer.CallBack(express_OnCallBack);
button2.Enabled = false;
button3.Enabled = false;
this.InitUIMethod();
}
/// <summary>
/// 初始化界面元素
/// </summary>
public void InitUIMethod()
{
this.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Text"));
this.label1.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_label1"));
this.label2.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_label2"));
this.label3.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_label3"));
this.label4.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_label4"));
this.button1.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_button1"));
this.button2.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_button2"));
this.button3.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_btnOK"));
this.button4.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_btnCancel"));
this.tabPageAll.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_tabPageAll"));
this.tabPageFilter.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_tabPageFilter"));
this.listViewFunction.Columns[0].Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_listViewFunction_columnHeader1"));
this.listViewFunction.Columns[1].Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_listViewFunction_columnHeader2"));
this.listViewVar.Columns[0].Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_listViewVar_columnName"));
this.listViewVar.Columns[1].Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_listViewVar_columnGroup"));
this.listViewVar.Columns[2].Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_listViewVar_columnDevice"));
this.listViewVar.Columns[3].Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_listViewVar_columnComment"));
}
//函数传到这个回调函数里
static object express_OnCallBack(string funcName, object[] param, ref bool isOk)
{
isOk = true;
string fun = funcName.ToUpper();
if (fun.Equals("SIN"))
{
return Math.Sin(Convert.ToDouble(param[0]));
}
else if (fun.Equals("COS"))
{
return Math.Cos(Convert.ToDouble(param[0]));
}
else if (fun.Equals("LOG10"))
{
return Math.Log10(Convert.ToDouble(param[0]));
}
else if (fun.Equals("EXP"))
{
return Math.Exp(Convert.ToDouble(param[0]));
}
else if (fun.Equals("ASIN"))
{
return Math.Asin(Convert.ToDouble(param[0]));
}
else if (fun.Equals("ACOS"))
{
return Math.Acos(Convert.ToDouble(param[0]));
}
else if (fun.Equals("ABS"))
{
return Math.Abs(Convert.ToDecimal(param[0]));
}
else if (fun.Equals("ATAN"))
{
return Math.Atan(Convert.ToDouble(param[0]));
}
else if (fun.Equals("CEILING"))
{
return Math.Ceiling(Convert.ToDouble(param[0]));
}
else if (fun.Equals("COSH"))
{
return Math.Cosh(Convert.ToDouble(param[0]));
}
else if (fun.Equals("FLOOR"))
{
return Math.Floor(Convert.ToDouble(param[0]));
}
else if (fun.Equals("SINH"))
{
return Math.Sinh(Convert.ToDouble(param[0]));
}
else if (fun.Equals("SQRT"))
{
return Math.Sqrt(Convert.ToDouble(param[0]));
}
else if (fun.Equals("TAN"))
{
return Math.Tan(Convert.ToDouble(param[0]));
}
else if (fun.Equals("TANH"))
{
return Math.Tanh(Convert.ToDouble(param[0]));
}
else if (fun.Equals("TRUNCATE"))
{
return Math.Truncate(Convert.ToDouble(param[0]));
}
isOk = false;
return 0;
}
//变量传到这个回调函数里
static bool express_OnAccidenceAnalysis(ref Operand opd)
{
////变量名是value值
if (opd.Type == OperandType.STRING)
{
Dictionary<string, Mesnac.Equips.BaseEquip> allEquips = Mesnac.Equips.Factory.Instance.AllEquips;
foreach (string key in allEquips.Keys)
{
Dictionary<string, Mesnac.Equips.BaseInfo.Group> allGroups = allEquips[key].Group;
foreach (string key2 in allGroups.Keys)
{
Dictionary<string, Mesnac.Equips.BaseInfo.Data> datas = allGroups[key2].Data;
foreach (string key3 in datas.Keys)
{
if (datas[key3].KeyName.Equals(opd.Value.ToString()))
{
opd.Type = OperandType.NUMBER;
opd.Value = datas[key3].Value;
return true;
}
}
}
}
opd.Type = OperandType.NUMBER;
opd.Value = 0;
return false;
}
else
{
return true;
}
}
private void button2_Click(object sender, EventArgs e)
{
bool bok = express.Parse(textBox1.Text);
if (bok)
{
//bool ok = false;
//object d = express.Evaluate(ref ok);
bool ok = true;
if (ok)
{
errorProvider1.SetError((Control)textBox1, "");
//MessageBox.Show(this, "OK", "信息提示");
button2.Enabled = false;
}
else
{
errorProvider1.SetIconAlignment((Control)textBox1, ErrorIconAlignment.MiddleRight);
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Msg1")); //有错误,请检查输入表达式或变量名!
errorProvider1.SetError((Control)textBox1, this.msg);
}
}
else
{
errorProvider1.SetIconAlignment((Control)textBox1, ErrorIconAlignment.MiddleRight);
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Msg1")); //有错误,请检查输入表达式或变量名!
errorProvider1.SetError((Control)textBox1, this.msg);
}
}
public string VarExpress
{
get
{
return this.textBox1.Text;
}
set
{
this.textBox1.Text = value;
}
}
private void button3_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
private void button4_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
private void addfun()
{
int pos = 0;
listViewFunction.Items.Clear();
ListViewItem item = new ListViewItem();
item = listViewFunction.Items.Add("Sin");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回指定角度的正弦值");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Sin"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Cos");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回指定角度的余弦值");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Cos"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Log10");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回指定数字以10为底的对数");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Log10"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Exp");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回e的指定次幂");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Exp"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Asin");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回正弦值为指定数字的角度");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Asin"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Acos");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回余弦值为指定数字的角度");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Acos"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Abs");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回指定数字的绝对值");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Abs"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Atan");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回正切值为指定数字的角度");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Atan"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Ceiling");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回大于或等于该指定双精度浮点数的最小整数");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Ceiling"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Cosh");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回指定角度的双曲余弦值");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Cosh"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Floor");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回小于或等于该指定双精度浮点数的最大整数");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Floor"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Sinh");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回指定角度的双曲正弦值");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Sinh"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Sqrt");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回指定数字的平方根");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Sqrt"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Tan");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回指定角度的正切值");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Tan"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Tanh");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("返回指定角度的双曲正切值");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Tanh"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("Truncate");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("计算指定双精度浮点数的整数部分");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_Truncate"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("+、-、*、/、%、()");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("算术运算:加、减、乘、除、求余,左右括号");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_SSYSF"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add(">=,>,<,<=,=");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("比较运算:大于等于、大于、小于、小于等于、等于");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_BJYSF"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
item = listViewFunction.Items.Add("&、|、!、,");
listViewFunction.Items[pos++].ImageIndex = 0;
//item.SubItems.Add("逻辑运算:与、或、非、逗号运算");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_LJYSF"));
item.SubItems.Add(this.msg);
item = new ListViewItem();
//item = listViewFunction.Items.Add("注意:");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_NoteTitle"));
item = listViewFunction.Items.Add(this.msg);
listViewFunction.Items[pos++].ImageIndex = 1;
//item.SubItems.Add("函数内只能是常数或者变量不能是带变量的表达式函数参考请参考C#函数语法");
this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmVar_Fun_NoteContent"));
item.SubItems.Add(this.msg);
listViewFunction.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
}
private void FrmPlcVar_Load(object sender, EventArgs e)
{
addfun();
this.treeView1.Nodes.Clear();
TreeNode firstLevelNode = null;
ListViewItem li = new ListViewItem();
Dictionary<string, Mesnac.Equips.SetConfig.ConfigEquip> allEquips2 = Mesnac.Equips.Factory.Instance.AllConfigEquip;
foreach (string key in allEquips2.Keys)
{
firstLevelNode = new TreeNode();
firstLevelNode.Text = key;
Dictionary<string, Mesnac.Equips.BaseInfo.Group> allGroups2 = allEquips2[key].Group;
TreeNode secondLevelNode = null;
foreach (string key2 in allGroups2.Keys)
{
secondLevelNode = new TreeNode();
secondLevelNode.Text = key2;
Dictionary<string, Mesnac.Equips.BaseInfo.Data> datas2 = allGroups2[key2].Data;
TreeNode threeLevelNode = null;
foreach (string key3 in datas2.Keys)
{
li.SubItems.Clear();
Mesnac.Equips.BaseInfo.Data data = datas2[key3];
threeLevelNode = new TreeNode();
threeLevelNode.Text = data.KeyName;
threeLevelNode.ToolTipText = data.Remark;
li.Text = threeLevelNode.Text;
li.SubItems.Add(secondLevelNode.Text);
li.SubItems.Add(firstLevelNode.Text);
listViewVar.Items.Add((ListViewItem)li.Clone());
secondLevelNode.Nodes.Add(threeLevelNode);
}
firstLevelNode.Nodes.Add(secondLevelNode);
}
this.treeView1.Nodes.Add(firstLevelNode);
}
this.treeView1.ExpandAll();
this.tabControlRight.SelectedIndex = 1;
//
}
private void listViewVar_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void listViewVar_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (listViewVar.SelectedItems.Count == 1)
{
string name = listViewVar.SelectedItems[0].SubItems[0].Text;
VarExpress = name;
}
}
public Color FillColor
{
get
{
return label3.BackColor;
}
set
{
label3.BackColor = value;
}
}
private bool _b = false;
public void SetFillColorVisible(bool b)
{
_b = b;
label3.Enabled = _b;
button1.Enabled = _b;
label3.Visible = _b;
button1.Visible = _b;
label2.Visible = _b;
}
private void button1_Click(object sender, EventArgs e)
{
ColorDialog dlg = new ColorDialog();
dlg.Color = label3.BackColor;
if (dlg.ShowDialog(this) == DialogResult.OK)
{
label3.BackColor = dlg.Color;
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
button3.Enabled = true;
button2.Enabled = true;
}
/// <summary>
/// 过滤处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtFilter_TextChanged(object sender, EventArgs e)
{
string filterName = this.txtFilter.Text.Trim(); //要过滤的变量名
this.treeView1.Nodes.Clear();
TreeNode firstLevelNode = null;
Dictionary<string, Mesnac.Equips.SetConfig.ConfigEquip> allEquips2 = Mesnac.Equips.Factory.Instance.AllConfigEquip;
foreach (string key in allEquips2.Keys)
{
firstLevelNode = new TreeNode();
firstLevelNode.Text = key;
firstLevelNode.ToolTipText = key;
Dictionary<string, Mesnac.Equips.BaseInfo.Group> allGroups2 = allEquips2[key].Group;
TreeNode secondLevelNode = null;
foreach (string key2 in allGroups2.Keys)
{
secondLevelNode = new TreeNode();
secondLevelNode.Text = key2;
secondLevelNode.ToolTipText = key2;
Dictionary<string, Mesnac.Equips.BaseInfo.Data> datas2 = allGroups2[key2].Data;
TreeNode threeLevelNode = null;
foreach (string key3 in datas2.Keys)
{
Mesnac.Equips.BaseInfo.Data data = datas2[key3];
if (String.IsNullOrWhiteSpace(filterName) || data.KeyName.ToLower().Contains(filterName.ToLower()))
{
threeLevelNode = new TreeNode();
threeLevelNode.Text = data.KeyName;
threeLevelNode.ToolTipText = data.Remark;
secondLevelNode.Nodes.Add(threeLevelNode);
}
}
firstLevelNode.Nodes.Add(secondLevelNode);
}
this.treeView1.Nodes.Add(firstLevelNode);
}
this.treeView1.ExpandAll();
}
private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
//判断是否为变量级别
if (e.Node.Level == 2)
{
string name = e.Node.Text;
VarExpress = name;
}
}
}
}