From 1cc69cf1650f39e612cefd2e987325e6eb257de9 Mon Sep 17 00:00:00 2001 From: yuriqdev Date: Fri, 8 Jun 2018 14:24:54 +0300 Subject: [PATCH] Final release XAxis labels are now showing in 2 lines. Other UI fixes. --- WinCCFlexArchViewer/About.Designer.cs | 4 +- WinCCFlexArchViewer/Main.Designer.cs | 24 +-- WinCCFlexArchViewer/Main.cs | 185 +++++++++--------- WinCCFlexArchViewer/NumTextBox.cs | 2 +- .../Properties/AssemblyInfo.cs | 4 +- .../bin/Release/WinCCFlexLogViewer.exe | Bin 816640 -> 816640 bytes changelog.txt | 4 + 7 files changed, 118 insertions(+), 105 deletions(-) diff --git a/WinCCFlexArchViewer/About.Designer.cs b/WinCCFlexArchViewer/About.Designer.cs index b91c6b7..08170cf 100644 --- a/WinCCFlexArchViewer/About.Designer.cs +++ b/WinCCFlexArchViewer/About.Designer.cs @@ -40,9 +40,9 @@ private void InitializeComponent() this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204))); this.label1.Location = new System.Drawing.Point(158, 8); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(268, 16); + this.label1.Size = new System.Drawing.Size(225, 16); this.label1.TabIndex = 1; - this.label1.Text = "WinCC flexible Log Viewer 1.9.0 beta3"; + this.label1.Text = "WinCC flexible Log Viewer 1.9.0"; // // label3 // diff --git a/WinCCFlexArchViewer/Main.Designer.cs b/WinCCFlexArchViewer/Main.Designer.cs index 7069703..dab3104 100644 --- a/WinCCFlexArchViewer/Main.Designer.cs +++ b/WinCCFlexArchViewer/Main.Designer.cs @@ -91,8 +91,8 @@ private void InitializeComponent() // this.togleTableToolStripMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_120_table; this.togleTableToolStripMenuItem.Name = "togleTableToolStripMenuItem"; - this.togleTableToolStripMenuItem.Size = new System.Drawing.Size(98, 20); - this.togleTableToolStripMenuItem.Text = "toggle table"; + this.togleTableToolStripMenuItem.Size = new System.Drawing.Size(64, 20); + this.togleTableToolStripMenuItem.Text = "Table"; this.togleTableToolStripMenuItem.ToolTipText = "Toggle table view"; this.togleTableToolStripMenuItem.Click += new System.EventHandler(this.togleTableToolStripMenuItem_Click); // @@ -100,15 +100,15 @@ private void InitializeComponent() // this.hideshowcurveMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_115_list; this.hideshowcurveMenuItem.Name = "hideshowcurveMenuItem"; - this.hideshowcurveMenuItem.Size = new System.Drawing.Size(123, 20); - this.hideshowcurveMenuItem.Text = "show/hide curve"; + this.hideshowcurveMenuItem.Size = new System.Drawing.Size(71, 20); + this.hideshowcurveMenuItem.Text = "Curves"; // // printMenuItem // this.printMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_16_print; this.printMenuItem.Name = "printMenuItem"; this.printMenuItem.Size = new System.Drawing.Size(60, 20); - this.printMenuItem.Text = "print"; + this.printMenuItem.Text = "Print"; this.printMenuItem.ToolTipText = "Print Graph"; this.printMenuItem.Click += new System.EventHandler(this.printMenuItem_Click); // @@ -117,8 +117,8 @@ private void InitializeComponent() this.lockunlockvzoomMenuItem.CheckOnClick = true; this.lockunlockvzoomMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_242_flash; this.lockunlockvzoomMenuItem.Name = "lockunlockvzoomMenuItem"; - this.lockunlockvzoomMenuItem.Size = new System.Drawing.Size(131, 20); - this.lockunlockvzoomMenuItem.Text = "lock vertical zoom"; + this.lockunlockvzoomMenuItem.Size = new System.Drawing.Size(134, 20); + this.lockunlockvzoomMenuItem.Text = "Lock vertical zoom"; this.lockunlockvzoomMenuItem.ToolTipText = "Toggle Y-axis zoom lock"; this.lockunlockvzoomMenuItem.Click += new System.EventHandler(this.lockunlockvzoomMenuItem_Click); // @@ -146,8 +146,8 @@ private void InitializeComponent() // this.ControlsStripMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_589_remote_control_tv; this.ControlsStripMenuItem.Name = "ControlsStripMenuItem"; - this.ControlsStripMenuItem.Size = new System.Drawing.Size(78, 20); - this.ControlsStripMenuItem.Text = "controls"; + this.ControlsStripMenuItem.Size = new System.Drawing.Size(80, 20); + this.ControlsStripMenuItem.Text = "Controls"; this.ControlsStripMenuItem.ToolTipText = "Toggle Control pad"; this.ControlsStripMenuItem.Click += new System.EventHandler(this.ControlsStripMenuItem_Click); // @@ -155,8 +155,8 @@ private void InitializeComponent() // this.fullscreenToolStripMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.fullscreen2; this.fullscreenToolStripMenuItem.Name = "fullscreenToolStripMenuItem"; - this.fullscreenToolStripMenuItem.Size = new System.Drawing.Size(86, 20); - this.fullscreenToolStripMenuItem.Text = "fullscreen"; + this.fullscreenToolStripMenuItem.Size = new System.Drawing.Size(88, 20); + this.fullscreenToolStripMenuItem.Text = "Fullscreen"; this.fullscreenToolStripMenuItem.ToolTipText = "Toggle fullscreen mode"; this.fullscreenToolStripMenuItem.Click += new System.EventHandler(this.fullscreenToolStripMenuItem_Click); // @@ -343,7 +343,6 @@ private void InitializeComponent() this.loadingpanel.Size = new System.Drawing.Size(846, 454); this.loadingpanel.TabIndex = 1; this.loadingpanel.Visible = false; - this.loadingpanel.Paint += new System.Windows.Forms.PaintEventHandler(this.loadingpanel_Paint); // // progress_counter_textlabel // @@ -366,6 +365,7 @@ private void InitializeComponent() // DTrend // this.DTrend.Dock = System.Windows.Forms.DockStyle.Fill; + this.DTrend.IsEnableSelection = true; this.DTrend.Location = new System.Drawing.Point(0, 0); this.DTrend.Margin = new System.Windows.Forms.Padding(0); this.DTrend.Name = "DTrend"; diff --git a/WinCCFlexArchViewer/Main.cs b/WinCCFlexArchViewer/Main.cs index 911dd2b..d7d8b85 100644 --- a/WinCCFlexArchViewer/Main.cs +++ b/WinCCFlexArchViewer/Main.cs @@ -55,6 +55,7 @@ public Main() DTrend.GraphPane.Y2Axis.MinorTic.IsOpposite = false; DTrend.GraphPane.Y2Axis.IsVisible = false; DTrend.GraphPane.X2Axis.IsVisible = false; + DTrend.Selection.SelectionChangedEvent += new EventHandler(Selection_SelectionChangedEvent); DTrend.GraphPane.AxisChange(); DTrend.Refresh(); string[] commandLineArgs = Environment.GetCommandLineArgs(); @@ -72,7 +73,7 @@ public Main() if (File.Exists(path)) { loadingpanel.Visible = true; - csv_file = path; + log_file = path; startparsing(); } } @@ -100,7 +101,7 @@ private void fileToolStripMenuItem_Click(object sender, EventArgs e) if (openFileDialog1.ShowDialog() == DialogResult.OK) { loadingpanel.Visible = true; - csv_file = openFileDialog1.FileName; + log_file = openFileDialog1.FileName; startparsing(); } } @@ -115,7 +116,7 @@ private void startparsing() centerLoadingAnnimation(); BackgroundWorker backgroundWorker = new BackgroundWorker(); backgroundWorker.WorkerSupportsCancellation = true; - if (Path.GetExtension(csv_file) != ".rdb") + if (Path.GetExtension(log_file) != ".rdb") backgroundWorker.DoWork += parse_data; else backgroundWorker.DoWork += startparsingSQL; @@ -133,7 +134,7 @@ private void startparsingSQL(object sender, DoWorkEventArgs e) dataColumn.ColumnName = "Date Time"; table.Columns.Add(dataColumn); //добавляем столбец Дата-Время - SQLiteConnection m_dbConn = new SQLiteConnection("Data Source=" + csv_file + ";Version=3;"); + SQLiteConnection m_dbConn = new SQLiteConnection("Data Source=" + log_file + ";Version=3;"); try { m_dbConn.Open(); @@ -190,7 +191,7 @@ private void parse_data(object sender, DoWorkEventArgs e) List list = new List(); try { // Чтение файла построчно в список - StreamReader streamReader = new StreamReader(new FileStream(csv_file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.Default); + StreamReader streamReader = new StreamReader(new FileStream(log_file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.Default); string item; while ( (item = streamReader.ReadLine()) != null ) { @@ -280,10 +281,9 @@ private void parse_data(object sender, DoWorkEventArgs e) flag = 0; foreach (string text5 in list) // { - if (flag == 0) flag++; // сделано для пропуска первой строки в списке - Заголовок лога + if (flag == 0) flag++; // else { - // flag++; //Скорее всего это не нужно string[] array2 = text5.Split( new char[]{c} ); // Получаем массив элементов из строки списка лога if (array2.Length == 5 && array2[0].IndexOf("\"\"") == -1) { @@ -325,7 +325,14 @@ private void parse_data(object sender, DoWorkEventArgs e) // private void dataparsing_complete(object sender, RunWorkerCompletedEventArgs e) - { if(goodRecCounter==0) { MessageBox.Show("File contains no data"); panel1.Hide(); progress_timer.Enabled = false; return; } + { + if (goodRecCounter==0) + { + MessageBox.Show("File contains no data"); + panel1.Hide(); + progress_timer.Enabled = false; + return; + } dataGridView_data.DataSource = table; dataGridView_data.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; int numColor = 0; @@ -398,7 +405,7 @@ private void dataparsing_complete(object sender, RunWorkerCompletedEventArgs e) int num3 = 0; foreach (DateTime dateTime in timeList) { - array[num3] = dateTime.ToString(); + array[num3] = dateTime.ToString().Replace(" ", "\n"); num3++; } DTrend.GraphPane.XAxis.Scale.Max = (double)num3; @@ -422,8 +429,8 @@ private void setYminMax(object sender, EventArgs e) if (yaxis.Title.Text.IndexOf(((ToolStripMenuItem)sender).OwnerItem.Text) != -1) { YScaleSettings yscaleSettings = new YScaleSettings(yaxis.Scale.Min, yaxis.Scale.Max, ((ToolStripMenuItem)sender).OwnerItem.Text); - yscaleSettings.ShowDialog(); - if (yscaleSettings.set) + yscaleSettings.ShowDialog(); + if (yscaleSettings.set) { yaxis.Scale.MaxAuto = false; yaxis.Scale.MinAuto = false; @@ -507,35 +514,18 @@ private void lockunlockvzoomMenuItem_Click(object sender, EventArgs e) lockunlockvzoomMenuItem.BackColor = SystemColors.Control; } - // Print proc + // Toolbar Print button click private void printMenuItem_Click(object sender, EventArgs e) { - using (PrintDocument printDocument = new PrintDocument()) - { - printDlg.Document = printDocument; //yur - printDlg.AllowSelection = true; //yur - printDlg.AllowSomePages = true; //yur - // - printDocument.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0); - printDocument.OriginAtMargins = false; - printDocument.DefaultPageSettings.Landscape = true; - printDocument.PrintPage += delegate(object _, PrintPageEventArgs o) - { - double num = 39.370078740157481; - Image image = DTrend.MasterPane.GetImage(); - o.Graphics.DrawImage(image, (float)(1.0 * num), (float)(1.0 * num), (float)(27.0 * num), (float)(18.0 * num)); - o.HasMorePages = false; - }; - if (printDlg.ShowDialog() == DialogResult.OK) //yur - printDocument.Print(); - } - } + DoPrint(); + } // private void aboutMenuItem_Click(object sender, EventArgs e) { About about = new About(); about.ShowDialog(); + about.Dispose(); } // @@ -544,7 +534,7 @@ private void ExitStripMenuItem_Click(object sender, EventArgs e) Application.Exit(); } - // ToggleFullScreenButton Click + // Toolbar ToggleFullScreen Button Click private void fullscreenToolStripMenuItem_Click(object sender, EventArgs e) { if (FormBorderStyle == FormBorderStyle.Sizable) @@ -636,27 +626,14 @@ private void button_panbottom_Click(object sender, EventArgs e) DTrend.Refresh(); } - // + // ControlPad print button click private void button_print_Click(object sender, EventArgs e) { - using (PrintDocument printDocument = new PrintDocument()) - { - printDocument.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0); - printDocument.OriginAtMargins = false; - printDocument.DefaultPageSettings.Landscape = true; - printDocument.PrintPage += delegate(object _, PrintPageEventArgs o) - { - double num = 39.370078740157481; - Image image = DTrend.MasterPane.GetImage(); - o.Graphics.DrawImage(image, (float)(1.0 * num), (float)(1.0 * num), (float)(27.0 * num), (float)(18.0 * num)); - o.HasMorePages = false; - }; - printDocument.Print(); - } - } + DoPrint(); + } - // - private void DTrend_ZoomEvent(ZedGraphControl sender, ZoomState oldState, ZoomState newState) + // + private void DTrend_ZoomEvent(ZedGraphControl sender, ZoomState oldState, ZoomState newState) { griddatascroll(); } @@ -707,13 +684,50 @@ private void progress_timer_Tick(object sender, EventArgs e) centerLoadingAnnimation(); } - // - private void loadingpanel_Paint(object sender, PaintEventArgs e) - { - } + // + private void SaveCSVMenuItem_Click(object sender, EventArgs e) + { + if (dataGridView_data.RowCount <= 0) //test to see if the DataGridView has any rows + { + MessageBox.Show("DataGrid contains no data\nNothing to save :)"); + return; + } + var sfd = new SaveFileDialog(); + sfd.Filter = "CSV files (*.csv)|*.csv"; + sfd.FileName = "table.csv"; + if (sfd.ShowDialog() != DialogResult.OK) return; + + string value = String.Empty; + StreamWriter swOut = new StreamWriter(sfd.FileName, false); - // Массив цветов для графиков - public string[] colors = new string[] + foreach (DataGridViewColumn dc in dataGridView_data.Columns) + { + value += dc.Name + ";"; + } + value = value.Substring(0, value.Length - 1) + Environment.NewLine; + swOut.Write(value); + value = String.Empty; + + foreach (DataGridViewRow ddr in dataGridView_data.Rows) + { + if (ddr.IsNewRow) + continue; + foreach (DataGridViewCell dc in ddr.Cells) + { + if (dc.Value != null) + { + value += dc.Value.ToString() + ";"; + } + } + value = value.Substring(0, value.Length - 1) + Environment.NewLine; + swOut.Write(value); + value = ""; + } + swOut.Close(); + } + + // Массив цветов для графиков + public string[] colors = new string[] { "#00FF00", // Lime ярко желто-зеленый "#0000FF", // Blue ярко синий @@ -775,7 +789,7 @@ private void loadingpanel_Paint(object sender, PaintEventArgs e) }; // Имя открытого файла лога - private string csv_file = ""; + private string log_file = ""; // private SortedList data_graph = new SortedList(); // @@ -791,45 +805,40 @@ private void loadingpanel_Paint(object sender, PaintEventArgs e) // Количество "полезных" записей (равно общее кол-во строк минус заголовок минус записи служебных тегов Скады) private int goodRecCounter; - private void SaveCSVMenuItem_Click(object sender, EventArgs e) + + private void DoPrint() { - if (dataGridView_data.RowCount <= 0) //test to see if the DataGridView has any rows + using (PrintDocument printDocument = new PrintDocument()) { - MessageBox.Show("DataGrid contains no data\nNothing to save :)"); - return; - } - var sfd = new SaveFileDialog(); - sfd.Filter = "CSV files (*.csv)|*.csv"; - sfd.FileName = "table.csv"; - if (sfd.ShowDialog() != DialogResult.OK) return; + printDlg.Document = printDocument; + printDlg.AllowSelection = true; + printDlg.AllowSomePages = true; - string value = String.Empty; - StreamWriter swOut = new StreamWriter(sfd.FileName, false); - - foreach (DataGridViewColumn dc in dataGridView_data.Columns) - { - value += dc.Name + ";"; + printDocument.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0); + printDocument.OriginAtMargins = false; + printDocument.DefaultPageSettings.Landscape = true; + printDocument.PrintPage += delegate (object _, PrintPageEventArgs o) + { + double num = 39.370078740157481; + Image image = DTrend.MasterPane.GetImage(); + o.Graphics.DrawImage(image, (float)(1.0 * num), (float)(1.0 * num), (float)(27.0 * num), (float)(18.0 * num)); + o.HasMorePages = false; + }; + if (printDlg.ShowDialog() == DialogResult.OK) + printDocument.Print(); } - value = value.Substring(0, value.Length - 1) + Environment.NewLine; - swOut.Write(value); - value = String.Empty; + } - foreach (DataGridViewRow ddr in dataGridView_data.Rows) + private void Selection_SelectionChangedEvent(object sender, EventArgs e) + {//zedGraph.Selection + foreach (var curve in DTrend.GraphPane.CurveList) { - if (ddr.IsNewRow) - continue; - foreach (DataGridViewCell dc in ddr.Cells) + if (curve.IsSelected) { - if (dc.Value != null) - { - value += dc.Value.ToString() + ";"; - } + curve.IsSelected = false; } - value = value.Substring(0, value.Length - 1) + Environment.NewLine; - swOut.Write(value); - value = ""; } - swOut.Close(); + } } } diff --git a/WinCCFlexArchViewer/NumTextBox.cs b/WinCCFlexArchViewer/NumTextBox.cs index e9fd369..b02409c 100644 --- a/WinCCFlexArchViewer/NumTextBox.cs +++ b/WinCCFlexArchViewer/NumTextBox.cs @@ -19,7 +19,7 @@ protected override void OnKeyPress(KeyPressEventArgs e) } if (e.KeyChar != 22) - e.Handled = !Char.IsDigit(e.KeyChar) && (e.KeyChar != ',' || (this.Text.Contains(",") && !this.SelectedText.Contains(","))) && e.KeyChar != (char)Keys.Back && (e.KeyChar != '-' || this.SelectionStart != 0 || (this.Text.Contains("-") && !this.SelectedText.Contains("-"))); + e.Handled = !char.IsDigit(e.KeyChar) && (e.KeyChar != ',' || (Text.Contains(",") && !SelectedText.Contains(","))) && e.KeyChar != (char)Keys.Back && (e.KeyChar != '-' || SelectionStart != 0 || (Text.Contains("-") && !SelectedText.Contains("-"))); } protected override void WndProc(ref Message m) diff --git a/WinCCFlexArchViewer/Properties/AssemblyInfo.cs b/WinCCFlexArchViewer/Properties/AssemblyInfo.cs index 7fdc1e8..c47790e 100644 --- a/WinCCFlexArchViewer/Properties/AssemblyInfo.cs +++ b/WinCCFlexArchViewer/Properties/AssemblyInfo.cs @@ -4,7 +4,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -[assembly: AssemblyVersion("1.9.0.3")] +[assembly: AssemblyVersion("1.9")] [assembly: AssemblyDescription("")] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: AssemblyConfiguration("")] @@ -15,6 +15,6 @@ [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyProduct("WinCCFlexLogViewer")] [assembly: ComVisible(false)] -[assembly: AssemblyFileVersion("1.9.0.3")] +[assembly: AssemblyFileVersion("1.9")] [assembly: AssemblyTitle("WinCCFlexLogViewer")] [assembly: Guid("6a71dd27-4f68-47f0-8074-655f5ca0c788")] diff --git a/WinCCFlexArchViewer/bin/Release/WinCCFlexLogViewer.exe b/WinCCFlexArchViewer/bin/Release/WinCCFlexLogViewer.exe index 7f1a563d75cbf8dcc14a32217314ccae7f7166a2..5ae2739ae58185a634202d314126e0a62548ba02 100644 GIT binary patch delta 17857 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 delta 17693 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 ZceKxU|13E^p|?K9cK6-!{cZdw{y!_nQT6}; diff --git a/changelog.txt b/changelog.txt index 9ad7a5f..0e77094 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +1.9 +XAxis labels are now showing in 2 lines. +Other UI fixes. + 1.9.0 beta 3 Added Tooltips for menu buttons. Minor code improvements.