Files
vms2016_kadisp/cVMS.NET_CS/Setting/Frm_Cell.cs
2024-11-26 20:15:16 +09:00

410 lines
14 KiB
C#

using System.Collections.Generic;
using System;
using System.Drawing;
using System.Diagnostics;
using System.Data;
using System.Collections;
using System.Windows.Forms;
using AR;
using System.Linq;
using System.Net.Security;
using COMM;
using OpenTK.Audio.OpenAL;
using System.ComponentModel;
namespace vmsnet
{
public partial class Frm_Cell
{
public HMI.CITEM cellidx = null;
readonly DataTable DT = new DataTable();
// SpPerfChart.PerfChart runChart1;
ScottPlot.Plottables.Scatter Logger1;
ScottPlot.Plottables.Crosshair CrossHair;
//ScottPlot.Plottables.VerticalLine[] CursorLine;
ScottPlot.WinForms.FormsPlot formsPlot1;
private int currentDataCount = 10;
private const int maxDataCount = 600;
short voltlimit = 0;
short timelimit = 1;
List<float> dataVolt = null;
List<double> dataTime = null;
public Frm_Cell()
{
// 이 호출은 디자이너에 필요합니다.
InitializeComponent();
// InitializeComponent() 호출 뒤에 초기화 코드를 추가하십시오.
InitControl();
}
public Frm_Cell(HMI.CITEM pidx)
{
// 이 호출은 디자이너에 필요합니다.
InitializeComponent();
cellidx = pidx;
cellidx.OnAlamStausChanged += cellidx_OnChangeStatus;
cellidx.OnChangeData += cellidx_OnChangeData;
cellidx.OnChangeValueData += cellidx_OnChangeValueData;
// InitializeComponent() 호출 뒤에 초기화 코드를 추가하십시오.
InitControl();
}
public void InitControl()
{
dataVolt = new List<float>(0);
dataTime = new List<double>(0);
formsPlot1 = new ScottPlot.WinForms.FormsPlot() { Dock = DockStyle.Fill };
formsPlot1.MouseDown += FormsPlot1_MouseDown;
formsPlot1.MouseUp += FormsPlot1_MouseUp;
formsPlot1.MouseMove += FormsPlot1_MouseMove;
CrossHair = formsPlot1.Plot.Add.Crosshair(0, 0);
CrossHair.TextColor = ScottPlot.Colors.White;
CrossHair.TextBackgroundColor = CrossHair.HorizontalLine.Color;
formsPlot1.Plot.YLabel("VOLTAGE");
formsPlot1.Plot.XLabel("COUNT");
formsPlot1.Plot.Axes.SetLimitsX(0, currentDataCount);
this.formsPlot1.Plot.ShowLegend();
formsPlot1.Plot.Axes.DateTimeTicksBottom();
this.formsPlot1.Plot.Axes.ContinuouslyAutoscale = true;
this.formsPlot1.Plot.RenderManager.RenderStarting += (s1, e1) =>
{
ScottPlot.Tick[] ticks = formsPlot1.Plot.Axes.Bottom.TickGenerator.Ticks;
for (int i = 0; i < ticks.Length; i++)
{
DateTime dt = DateTime.FromOADate(ticks[i].Position);
string label = $"{dt:yy-MM-dd\nHH:mm:ss}";
ticks[i] = new ScottPlot.Tick(ticks[i].Position, label);
}
};
this.TabPage1.Controls.Clear();
this.TabPage1.Controls.Add(this.formsPlot1); //runChart1
this.TabPage1.Controls.Add(this.DV_VALUE);
this.TabPage1.Controls.Add(this.ToolStrip2);
}
public void Frm_Cell_Load(object sender, System.EventArgs e)
{
DT.Columns.Add("VOLT");
DT.Columns.Add("TIME");
this.BS_DATA.DataSource = DT;
this.Text = cellidx. + "셀 속성";
this.PropertyGrid1.SelectedObject = cellidx;
loadviewSetting();
System.Windows.Forms.Binding bd = new System.Windows.Forms.Binding("text", cellidx, "column");
refreshalama();
}
public void Frm_Cell_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
{
cellidx.OnAlamStausChanged -= cellidx_OnChangeStatus;
cellidx.OnChangeData -= cellidx_OnChangeData;
cellidx.OnChangeValueData -= cellidx_OnChangeValueData;
formsPlot1.MouseDown -= FormsPlot1_MouseDown;
formsPlot1.MouseUp -= FormsPlot1_MouseUp;
formsPlot1.MouseMove -= FormsPlot1_MouseMove;
saveviewSetting();
}
private void loadviewSetting()
{
cmb_volt.SelectedIndex = (PUB.CONFIG.cell_voltindex); // Xml.Data("rtlview", "voltindex", "1")
cmb_time.SelectedIndex = (PUB.CONFIG.cell_timeindex); // XMl.Data("rtlview", "timeindex", "0")
}
private void saveviewSetting()
{
PUB.CONFIG.cell_voltindex = (cmb_volt.SelectedIndex);
PUB.CONFIG.cell_timeindex = (cmb_time.SelectedIndex);
PUB.CONFIG.Save();
}
#region "scott plot mouse event"
private ScottPlot.Plottables.AxisLine GetLineUnderMouse(float x, float y)
{
ScottPlot.CoordinateRect rect = formsPlot1.Plot.GetCoordinateRect(x, y, radius: 10);
foreach (var axLine in formsPlot1.Plot.GetPlottables<ScottPlot.Plottables.AxisLine>().Reverse())
{
if (axLine.IsUnderMouse(rect))
return axLine;
}
return null;
}
private void FormsPlot1_MouseDown(object sender, MouseEventArgs e)
{
var lineUnderMouse = GetLineUnderMouse(e.X, e.Y);
if (lineUnderMouse != null)
{
PlottableBeingDragged = lineUnderMouse;
formsPlot1.Interaction.Disable(); // disable panning while dragging
}
}
private void FormsPlot1_MouseUp(object sender, MouseEventArgs e)
{
PlottableBeingDragged = null;
formsPlot1.Interaction.Enable(); // enable panning again
formsPlot1.Refresh();
}
ScottPlot.Plottables.AxisLine PlottableBeingDragged = null;
private void FormsPlot1_MouseMove(object sender, MouseEventArgs e)
{
//update cross line
ScottPlot.Pixel mousePixel = new ScottPlot.Pixel(e.X, e.Y);
ScottPlot.Coordinates mouseCoordinates = formsPlot1.Plot.GetCoordinates(mousePixel);
if (mouseCoordinates.X is double.NaN || mouseCoordinates.Y is double.NaN ||
mouseCoordinates.X is double.PositiveInfinity || mouseCoordinates.Y is double.PositiveInfinity ||
mouseCoordinates.X is double.NegativeInfinity || mouseCoordinates.Y is double.NegativeInfinity)
{
return;
}
if (CrossHair != null)
{
CrossHair.Position = mouseCoordinates;
var time = DateTime.FromOADate(mouseCoordinates.X);
CrossHair.VerticalLine.Text = $"{time:yy-MM-dd\nHH:mm:ss}";
CrossHair.HorizontalLine.Text = $"{mouseCoordinates.Y:N2}v";
formsPlot1.Refresh();
}
// this rectangle is the area around the mouse in coordinate units
ScottPlot.CoordinateRect rect = formsPlot1.Plot.GetCoordinateRect(e.X, e.Y, radius: 10);
if (PlottableBeingDragged is null)
{
// set cursor based on what's beneath the plottable
var lineUnderMouse = GetLineUnderMouse(e.X, e.Y);
if (lineUnderMouse is null) Cursor = Cursors.Default;
else if (lineUnderMouse.IsDraggable && lineUnderMouse is ScottPlot.Plottables.VerticalLine) Cursor = Cursors.SizeWE;
else if (lineUnderMouse.IsDraggable && lineUnderMouse is ScottPlot.Plottables.HorizontalLine) Cursor = Cursors.SizeNS;
}
else
{
// update the position of the plottable being dragged
if (PlottableBeingDragged is ScottPlot.Plottables.HorizontalLine hl)
{
hl.Y = rect.VerticalCenter;
hl.Text = $"{hl.Y:0.00}v";
}
else if (PlottableBeingDragged is ScottPlot.Plottables.VerticalLine vl)
{
vl.X = rect.HorizontalCenter;
var time = DateTime.FromOADate(vl.X);
//vl.Text = $"{vl.X:0.00}";
vl.Text = $"{time:yy-MM-dd\nHH:mm:ss}";
}
formsPlot1.Refresh();
}
}
#endregion
public void Frm_Grp_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
}
private void refreshalama()
{
if (cellidx.)
{
this.ToolStripButton2.Image = global::vmsnet.Properties.Resources.Red_Ball;
}
else
{
this.ToolStripButton2.Image = global::vmsnet.Properties.Resources.Green_Ball;
}
if (cellidx.)
{
this.ToolStripButton1.Image = global::vmsnet.Properties.Resources.Red_Ball;
}
else
{
this.ToolStripButton1.Image = global::vmsnet.Properties.Resources.Green_Ball;
}
}
public void TabControl1_SelectedIndexChanged(object sender, System.EventArgs e)
{
switch (this.TabControl1.SelectedIndex)
{
case 1: ////알림목록 tab
var Dt = PUB.Alarm.GetAlarmData(cellidx._번호);
foreach (var Dr in Dt.Item2)
{
Dr.RTYPESTR = ((COMM.EALAMRAISETYPE)Dr.RTYPE).ToString();
Dr.ATYPESTR = ((COMM.EALAMTYPE)Dr.ATYPE).ToString();
}
Dt.Item2.AcceptChanges();
this.BS_ALAM.DataSource = Dt;
this.DataGridView1.AutoGenerateColumns = false;
this.DataGridView1.DataSource = this.BS_ALAM;
this.DataGridView1.AutoResizeColumns();
break;
}
}
public void DataGridView1_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)
{
var row = this.DataGridView1.Rows[e.RowIndex];
var CV = row.Cells["RTYPESTR"].Value;
if (CV == null)
{
row.DefaultCellStyle.BackColor = Color.Empty;
return;
}
switch (this.DataGridView1.Rows[e.RowIndex].Cells["RTYPESTR"].Value.ToString().ToUpper())
{
case "HIGH-OFF":
DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Empty;
break;
case "HIGH-ON":
DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Orange;
break;
case "LOW-OFF":
DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Empty;
break;
case "LOW-ON":
DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Blue;
break;
case "OVER-ON":
DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Magenta;
break;
case "OVER-OFF":
DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Empty;
break;
default:
DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Empty;
break;
}
}
private void cellidx_OnChangeStatus()
{
refreshalama();
}
private void cellidx_OnChangeData()
{
bool ok = PUBC.UpdateChannel(cellidx.idx, cellidx., (int)cellidx., (cellidx. ? 1 : 0), cellidx.HIGH, cellidx.LOW, cellidx.H, cellidx.L);
if (!ok)
{
UTIL.MsgE("셀 정보가 업데이트되지 않았습니다");
PUB.log.Add("Cell update error idx=" + cellidx.ToString());
}
}
private void cellidx_OnChangeValueData()
{
////값이 바뀌엇다.
float value = 0.0F;
float.TryParse(cellidx.Value.Replace("V", "").Replace("v", ""), out value);
this.tb_val.Text = value.ToString();
this.tb_time.Text = cellidx.mtime;
try
{
//datetime = CDate(cellidx.측정시간)
var dt = DateTime.Parse(cellidx.);
formsPlot1.Plot.Clear<ScottPlot.Plottables.Scatter>();
dataVolt.Add(value);
dataTime.Add(dt.ToOADate());
Logger1 = formsPlot1.Plot.Add.Scatter(dataTime.ToArray(), dataVolt.ToArray());
Logger1.Color = ScottPlot.Colors.Blue;
var mintime = DateTime.FromOADate(dataTime.First());
var maxtime = DateTime.FromOADate(dataTime.Last());
var ts = (maxtime - mintime);
if (ts.TotalMinutes >= this.timelimit)
{
//10개지운다
if (dataTime.Count > 10)
{
dataVolt.RemoveRange(0, 10);
dataTime.RemoveRange(0, 10);
}
}
this.BeginInvoke(new Action(() =>
{
this.DT.Rows.Add(value, dt.ToString("yy-MM-dd HH:mm:ss"));
this.DT.AcceptChanges();
if (voltlimit != 0) formsPlot1.Plot.Axes.AutoScaleX();
this.formsPlot1.Refresh();
}));
}
catch (Exception)
{
}
}
public void ToolStripComboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
}
public void cmb_time_SelectedIndexChanged(object sender, System.EventArgs e)
{
if (cmb_time.SelectedIndex < 0) return;
timelimit = short.Parse(this.cmb_time.Text.Replace("분", ""));
}
private void runChart1_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
this.DV_VALUE.Visible = !this.DV_VALUE.Visible;
}
private void TabPage1_Click(object sender, EventArgs e)
{
DV_VALUE.Visible = !DV_VALUE.Visible;
}
}
}