├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── WinCCFlexArchViewer ├── About.Designer.cs ├── About.cs ├── About.resx ├── License-LGPL.txt ├── Main.Designer.cs ├── Main.cs ├── Main.resx ├── NumTextBox.cs ├── Program.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── Resources │ ├── fullscreen2.png │ └── save_64.png ├── WinCCFlexArchViewer.ico ├── WinCCFlexLogViewer.csproj ├── YScaleSettings.Designer.cs ├── YScaleSettings.cs ├── YScaleSettings.resx ├── app.config ├── app.manifest ├── bin │ └── Release │ │ ├── System.Data.SQLite.dll │ │ ├── WinCCFlexLogViewer.exe │ │ ├── ZedGraph.dll │ │ ├── x64 │ │ └── SQLite.Interop.dll │ │ └── x86 │ │ └── SQLite.Interop.dll └── packages.config ├── WinCCFlexLogViewer.sln └── changelog.txt /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | !*.exe 11 | !*.dll 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Build results 17 | [Dd]ebug/ 18 | [Dd]ebugPublic/ 19 | [Rr]elease/ 20 | [Rr]eleases/ 21 | [Xx]64/ 22 | [Xx]86/ 23 | [Bb]uild/ 24 | bld/ 25 | [Bb]in/ 26 | [Oo]bj/ 27 | 28 | 29 | 30 | # Visual Studio 2015 cache/options directory 31 | .vs/ 32 | # Uncomment if you have tasks that create the project's static files in wwwroot 33 | #wwwroot/ 34 | 35 | # MSTest test Results 36 | [Tt]est[Rr]esult*/ 37 | [Bb]uild[Ll]og.* 38 | 39 | # NUNIT 40 | *.VisualState.xml 41 | TestResult.xml 42 | 43 | # Build Results of an ATL Project 44 | [Dd]ebugPS/ 45 | [Rr]eleasePS/ 46 | dlldata.c 47 | 48 | # DNX 49 | project.lock.json 50 | artifacts/ 51 | 52 | *_i.c 53 | *_p.c 54 | *_i.h 55 | *.ilk 56 | *.meta 57 | *.obj 58 | *.pch 59 | *.pdb 60 | *.pgc 61 | *.pgd 62 | *.rsp 63 | *.sbr 64 | *.tlb 65 | *.tli 66 | *.tlh 67 | *.tmp 68 | *.tmp_proj 69 | *.log 70 | *.vspscc 71 | *.vssscc 72 | .builds 73 | *.pidb 74 | *.svclog 75 | *.scc 76 | 77 | # Chutzpah Test files 78 | _Chutzpah* 79 | 80 | # Visual C++ cache files 81 | ipch/ 82 | *.aps 83 | *.ncb 84 | *.opendb 85 | *.opensdf 86 | *.sdf 87 | *.cachefile 88 | *.VC.db 89 | 90 | # Visual Studio profiler 91 | *.psess 92 | *.vsp 93 | *.vspx 94 | *.sap 95 | 96 | # TFS 2012 Local Workspace 97 | $tf/ 98 | 99 | # Guidance Automation Toolkit 100 | *.gpState 101 | 102 | # ReSharper is a .NET coding add-in 103 | _ReSharper*/ 104 | *.[Rr]e[Ss]harper 105 | *.DotSettings.user 106 | 107 | # JustCode is a .NET coding add-in 108 | .JustCode 109 | 110 | # TeamCity is a build add-in 111 | _TeamCity* 112 | 113 | # DotCover is a Code Coverage Tool 114 | *.dotCover 115 | 116 | # NCrunch 117 | _NCrunch_* 118 | .*crunch*.local.xml 119 | nCrunchTemp_* 120 | 121 | # MightyMoose 122 | *.mm.* 123 | AutoTest.Net/ 124 | 125 | # Web workbench (sass) 126 | .sass-cache/ 127 | 128 | # Installshield output folder 129 | [Ee]xpress/ 130 | 131 | # DocProject is a documentation generator add-in 132 | DocProject/buildhelp/ 133 | DocProject/Help/*.HxT 134 | DocProject/Help/*.HxC 135 | DocProject/Help/*.hhc 136 | DocProject/Help/*.hhk 137 | DocProject/Help/*.hhp 138 | DocProject/Help/Html2 139 | DocProject/Help/html 140 | 141 | # Click-Once directory 142 | publish/ 143 | 144 | # Publish Web Output 145 | *.[Pp]ublish.xml 146 | *.azurePubxml 147 | 148 | # TODO: Un-comment the next line if you do not want to checkin 149 | # your web deploy settings because they may include unencrypted 150 | # passwords 151 | #*.pubxml 152 | *.publishproj 153 | 154 | # NuGet Packages 155 | *.nupkg 156 | # The packages folder can be ignored because of Package Restore 157 | **/packages/* 158 | # except build/, which is used as an MSBuild target. 159 | !**/packages/build/ 160 | # Uncomment if necessary however generally it will be regenerated when needed 161 | #!**/packages/repositories.config 162 | # NuGet v3's project.json files produces more ignoreable files 163 | *.nuget.props 164 | *.nuget.targets 165 | 166 | # Microsoft Azure Build Output 167 | csx/ 168 | *.build.csdef 169 | 170 | # Microsoft Azure Emulator 171 | ecf/ 172 | rcf/ 173 | 174 | # Windows Store app package directory 175 | AppPackages/ 176 | BundleArtifacts/ 177 | 178 | # Visual Studio cache files 179 | # files ending in .cache can be ignored 180 | *.[Cc]ache 181 | # but keep track of directories ending in .cache 182 | !*.[Cc]ache/ 183 | 184 | # Others 185 | ClientBin/ 186 | [Ss]tyle[Cc]op.* 187 | ~$* 188 | *~ 189 | *.dbmdl 190 | *.dbproj.schemaview 191 | *.pfx 192 | *.publishsettings 193 | node_modules/ 194 | orleans.codegen.cs 195 | 196 | # RIA/Silverlight projects 197 | Generated_Code/ 198 | 199 | # Backup & report files from converting an old project file 200 | # to a newer Visual Studio version. Backup files are not needed, 201 | # because we have git ;-) 202 | _UpgradeReport_Files/ 203 | Backup*/ 204 | UpgradeLog*.XML 205 | UpgradeLog*.htm 206 | 207 | # SQL Server files 208 | *.mdf 209 | *.ldf 210 | 211 | # Business Intelligence projects 212 | *.rdl.data 213 | *.bim.layout 214 | *.bim_*.settings 215 | 216 | # Microsoft Fakes 217 | FakesAssemblies/ 218 | 219 | # GhostDoc plugin setting file 220 | *.GhostDoc.xml 221 | 222 | # Node.js Tools for Visual Studio 223 | .ntvs_analysis.dat 224 | 225 | # Visual Studio 6 build log 226 | *.plg 227 | 228 | # Visual Studio 6 workspace options file 229 | *.opt 230 | 231 | # Visual Studio LightSwitch build output 232 | **/*.HTMLClient/GeneratedArtifacts 233 | **/*.DesktopClient/GeneratedArtifacts 234 | **/*.DesktopClient/ModelManifest.xml 235 | **/*.Server/GeneratedArtifacts 236 | **/*.Server/ModelManifest.xml 237 | _Pvt_Extensions 238 | 239 | # LightSwitch generated files 240 | GeneratedArtifacts/ 241 | ModelManifest.xml 242 | 243 | # Paket dependency manager 244 | .paket/paket.exe 245 | 246 | # FAKE - F# Make 247 | .fake/ 248 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 yur 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WinCCflexLogViewer 2 | 3 | WinCCflexLogViewer is a lightweight and simple-to-use archive Data log Viewer / Analyzer. 4 | 5 | It is compatible with archives created with the WinCC (TIA Portal) Panel or PC Runtime as well as with the WinCC flexible Panel or PC Runtime. 6 | 7 | Supports CSV (*.csv, *.txt) and SQLite (*.rdb) Siemens data log formats. 8 | 9 | Allows to export parsed log data to CSV file (for further analysis, printing e.g.), print selected curves. 10 | 11 | The tool is a stand-alone GUI application developed in C# language and requires .Net Framework 3.5 or higher. 12 | 13 | ## Thanks to 14 | **plc2k** http://plc2k.com/wincc-flexible-tia-portal-archive-viewer 15 | 16 | **ZedGraph** https://github.com/ZedGraph/ZedGraph 17 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/About.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace WinCCFlexLogViewer 2 | { 3 | public partial class About : System.Windows.Forms.Form 4 | { 5 | protected override void Dispose(bool disposing) 6 | { 7 | if (disposing && components != null) 8 | { 9 | components.Dispose(); 10 | } 11 | base.Dispose(disposing); 12 | } 13 | 14 | private void InitializeComponent() 15 | { 16 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(About)); 17 | this.pictureBox1 = new System.Windows.Forms.PictureBox(); 18 | this.label1 = new System.Windows.Forms.Label(); 19 | this.label3 = new System.Windows.Forms.Label(); 20 | this.label4 = new System.Windows.Forms.Label(); 21 | this.linkLabel1 = new System.Windows.Forms.LinkLabel(); 22 | this.button1 = new System.Windows.Forms.Button(); 23 | this.linkLabel2 = new System.Windows.Forms.LinkLabel(); 24 | this.lblBuild = new System.Windows.Forms.Label(); 25 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); 26 | this.SuspendLayout(); 27 | // 28 | // pictureBox1 29 | // 30 | this.pictureBox1.BackgroundImage = global::WinCCFlexLogViewer.Properties.Resources.logo; 31 | this.pictureBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; 32 | this.pictureBox1.Location = new System.Drawing.Point(12, 12); 33 | this.pictureBox1.Name = "pictureBox1"; 34 | this.pictureBox1.Size = new System.Drawing.Size(110, 110); 35 | this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; 36 | this.pictureBox1.TabIndex = 0; 37 | this.pictureBox1.TabStop = false; 38 | // 39 | // label1 40 | // 41 | this.label1.AutoSize = true; 42 | this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 43 | this.label1.Location = new System.Drawing.Point(151, 6); 44 | this.label1.Name = "label1"; 45 | this.label1.Size = new System.Drawing.Size(225, 16); 46 | this.label1.TabIndex = 1; 47 | this.label1.Text = "WinCC flexible Log Viewer 1.9.1"; 48 | // 49 | // label3 50 | // 51 | this.label3.AutoSize = true; 52 | this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 53 | this.label3.Location = new System.Drawing.Point(155, 28); 54 | this.label3.Name = "label3"; 55 | this.label3.Size = new System.Drawing.Size(129, 26); 56 | this.label3.TabIndex = 3; 57 | this.label3.Text = "Copyright (C) 2016 plc2k\r\nCopyright (C) 2018 yur"; 58 | // 59 | // label4 60 | // 61 | this.label4.AutoSize = true; 62 | this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 63 | this.label4.Location = new System.Drawing.Point(154, 62); 64 | this.label4.Name = "label4"; 65 | this.label4.Size = new System.Drawing.Size(233, 165); 66 | this.label4.TabIndex = 4; 67 | this.label4.Text = resources.GetString("label4.Text"); 68 | // 69 | // linkLabel1 70 | // 71 | this.linkLabel1.AutoSize = true; 72 | this.linkLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 73 | this.linkLabel1.Location = new System.Drawing.Point(282, 28); 74 | this.linkLabel1.Name = "linkLabel1"; 75 | this.linkLabel1.Size = new System.Drawing.Size(87, 13); 76 | this.linkLabel1.TabIndex = 6; 77 | this.linkLabel1.TabStop = true; 78 | this.linkLabel1.Text = "http://plc2k.com"; 79 | this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); 80 | // 81 | // button1 82 | // 83 | this.button1.Location = new System.Drawing.Point(189, 235); 84 | this.button1.Name = "button1"; 85 | this.button1.Size = new System.Drawing.Size(75, 23); 86 | this.button1.TabIndex = 7; 87 | this.button1.Text = "OK"; 88 | this.button1.UseVisualStyleBackColor = true; 89 | this.button1.Click += new System.EventHandler(this.button1_Click); 90 | // 91 | // linkLabel2 92 | // 93 | this.linkLabel2.AutoSize = true; 94 | this.linkLabel2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 95 | this.linkLabel2.Location = new System.Drawing.Point(270, 41); 96 | this.linkLabel2.Name = "linkLabel2"; 97 | this.linkLabel2.Size = new System.Drawing.Size(140, 13); 98 | this.linkLabel2.TabIndex = 8; 99 | this.linkLabel2.TabStop = true; 100 | this.linkLabel2.Text = "https://github.com/yuriqdev"; 101 | this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel2_LinkClicked); 102 | // 103 | // lblBuild 104 | // 105 | this.lblBuild.AutoSize = true; 106 | this.lblBuild.Location = new System.Drawing.Point(13, 129); 107 | this.lblBuild.Name = "lblBuild"; 108 | this.lblBuild.Size = new System.Drawing.Size(91, 13); 109 | this.lblBuild.TabIndex = 9; 110 | // 111 | // About 112 | // 113 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 114 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 115 | this.ClientSize = new System.Drawing.Size(453, 265); 116 | this.Controls.Add(this.lblBuild); 117 | this.Controls.Add(this.linkLabel2); 118 | this.Controls.Add(this.button1); 119 | this.Controls.Add(this.linkLabel1); 120 | this.Controls.Add(this.label4); 121 | this.Controls.Add(this.label3); 122 | this.Controls.Add(this.label1); 123 | this.Controls.Add(this.pictureBox1); 124 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; 125 | this.MaximizeBox = false; 126 | this.MinimizeBox = false; 127 | this.Name = "About"; 128 | this.ShowIcon = false; 129 | this.ShowInTaskbar = false; 130 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 131 | this.Text = "About WinCC flex Log Viewer"; 132 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); 133 | this.ResumeLayout(false); 134 | this.PerformLayout(); 135 | 136 | } 137 | // 138 | private System.ComponentModel.IContainer components; 139 | private System.Windows.Forms.PictureBox pictureBox1; 140 | private System.Windows.Forms.Label label1; 141 | private System.Windows.Forms.Label label3; 142 | private System.Windows.Forms.Label label4; 143 | private System.Windows.Forms.LinkLabel linkLabel1; 144 | private System.Windows.Forms.Button button1; 145 | private System.Windows.Forms.LinkLabel linkLabel2; 146 | private System.Windows.Forms.Label lblBuild; 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/About.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | using System.Windows.Forms; 4 | //using WinCCFlexLogViewer.Properties; 5 | 6 | namespace WinCCFlexLogViewer 7 | { 8 | public partial class About : Form 9 | { 10 | public About() 11 | { 12 | InitializeComponent(); 13 | var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; 14 | DateTime buildDate = new DateTime(2000, 1, 1).AddDays(version.Build).AddSeconds(version.Revision * 2); 15 | lblBuild.Text = buildDate.ToString(); 16 | } 17 | 18 | private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 19 | { 20 | linkLabel1.LinkVisited = true; 21 | Process.Start("http://plc2k.com"); 22 | } 23 | 24 | private void button1_Click(object sender, EventArgs e) 25 | { 26 | Close(); 27 | } 28 | 29 | private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 30 | { 31 | linkLabel1.LinkVisited = true; 32 | Process.Start("https://github.com/yuriqdev/WinCCflexLogViewer"); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/About.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | Mouse Controls: 122 | Pan: mouse wheel button 123 | Zoom In/Out: mouse wheel 124 | Zoom Selection: mouse left 125 | Menu: mouse right button 126 | 127 | Command line arguments: 128 | -f "filename" open specified file 129 | -fullscreen start in fullscreen mode 130 | -nofilebutton hide openfile button 131 | -noprintbutton hide print button 132 | 133 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/License-LGPL.txt: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 2.1, February 1999 3 | 4 | Copyright (C) 1991, 1999 Free Software Foundation, Inc. 5 | 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | [This is the first released version of the Lesser GPL. It also counts 10 | as the successor of the GNU Library Public License, version 2, hence 11 | the version number 2.1.] 12 | 13 | Preamble 14 | 15 | The licenses for most software are designed to take away your 16 | freedom to share and change it. By contrast, the GNU General Public 17 | Licenses are intended to guarantee your freedom to share and change 18 | free software--to make sure the software is free for all its users. 19 | 20 | This license, the Lesser General Public License, applies to some 21 | specially designated software packages--typically libraries--of the 22 | Free Software Foundation and other authors who decide to use it. You 23 | can use it too, but we suggest you first think carefully about whether 24 | this license or the ordinary General Public License is the better 25 | strategy to use in any particular case, based on the explanations below. 26 | 27 | When we speak of free software, we are referring to freedom of use, 28 | not price. Our General Public Licenses are designed to make sure that 29 | you have the freedom to distribute copies of free software (and charge 30 | for this service if you wish); that you receive source code or can get 31 | it if you want it; that you can change the software and use pieces of 32 | it in new free programs; and that you are informed that you can do 33 | these things. 34 | 35 | To protect your rights, we need to make restrictions that forbid 36 | distributors to deny you these rights or to ask you to surrender these 37 | rights. These restrictions translate to certain responsibilities for 38 | you if you distribute copies of the library or if you modify it. 39 | 40 | For example, if you distribute copies of the library, whether gratis 41 | or for a fee, you must give the recipients all the rights that we gave 42 | you. You must make sure that they, too, receive or can get the source 43 | code. If you link other code with the library, you must provide 44 | complete object files to the recipients, so that they can relink them 45 | with the library after making changes to the library and recompiling 46 | it. And you must show them these terms so they know their rights. 47 | 48 | We protect your rights with a two-step method: (1) we copyright the 49 | library, and (2) we offer you this license, which gives you legal 50 | permission to copy, distribute and/or modify the library. 51 | 52 | To protect each distributor, we want to make it very clear that 53 | there is no warranty for the free library. Also, if the library is 54 | modified by someone else and passed on, the recipients should know 55 | that what they have is not the original version, so that the original 56 | author's reputation will not be affected by problems that might be 57 | introduced by others. 58 | 59 | Finally, software patents pose a constant threat to the existence of 60 | any free program. We wish to make sure that a company cannot 61 | effectively restrict the users of a free program by obtaining a 62 | restrictive license from a patent holder. Therefore, we insist that 63 | any patent license obtained for a version of the library must be 64 | consistent with the full freedom of use specified in this license. 65 | 66 | Most GNU software, including some libraries, is covered by the 67 | ordinary GNU General Public License. This license, the GNU Lesser 68 | General Public License, applies to certain designated libraries, and 69 | is quite different from the ordinary General Public License. We use 70 | this license for certain libraries in order to permit linking those 71 | libraries into non-free programs. 72 | 73 | When a program is linked with a library, whether statically or using 74 | a shared library, the combination of the two is legally speaking a 75 | combined work, a derivative of the original library. The ordinary 76 | General Public License therefore permits such linking only if the 77 | entire combination fits its criteria of freedom. The Lesser General 78 | Public License permits more lax criteria for linking other code with 79 | the library. 80 | 81 | We call this license the "Lesser" General Public License because it 82 | does Less to protect the user's freedom than the ordinary General 83 | Public License. It also provides other free software developers Less 84 | of an advantage over competing non-free programs. These disadvantages 85 | are the reason we use the ordinary General Public License for many 86 | libraries. However, the Lesser license provides advantages in certain 87 | special circumstances. 88 | 89 | For example, on rare occasions, there may be a special need to 90 | encourage the widest possible use of a certain library, so that it becomes 91 | a de-facto standard. To achieve this, non-free programs must be 92 | allowed to use the library. A more frequent case is that a free 93 | library does the same job as widely used non-free libraries. In this 94 | case, there is little to gain by limiting the free library to free 95 | software only, so we use the Lesser General Public License. 96 | 97 | In other cases, permission to use a particular library in non-free 98 | programs enables a greater number of people to use a large body of 99 | free software. For example, permission to use the GNU C Library in 100 | non-free programs enables many more people to use the whole GNU 101 | operating system, as well as its variant, the GNU/Linux operating 102 | system. 103 | 104 | Although the Lesser General Public License is Less protective of the 105 | users' freedom, it does ensure that the user of a program that is 106 | linked with the Library has the freedom and the wherewithal to run 107 | that program using a modified version of the Library. 108 | 109 | The precise terms and conditions for copying, distribution and 110 | modification follow. Pay close attention to the difference between a 111 | "work based on the library" and a "work that uses the library". The 112 | former contains code derived from the library, whereas the latter must 113 | be combined with the library in order to run. 114 | 115 | GNU LESSER GENERAL PUBLIC LICENSE 116 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 117 | 118 | 0. This License Agreement applies to any software library or other 119 | program which contains a notice placed by the copyright holder or 120 | other authorized party saying it may be distributed under the terms of 121 | this Lesser General Public License (also called "this License"). 122 | Each licensee is addressed as "you". 123 | 124 | A "library" means a collection of software functions and/or data 125 | prepared so as to be conveniently linked with application programs 126 | (which use some of those functions and data) to form executables. 127 | 128 | The "Library", below, refers to any such software library or work 129 | which has been distributed under these terms. A "work based on the 130 | Library" means either the Library or any derivative work under 131 | copyright law: that is to say, a work containing the Library or a 132 | portion of it, either verbatim or with modifications and/or translated 133 | straightforwardly into another language. (Hereinafter, translation is 134 | included without limitation in the term "modification".) 135 | 136 | "Source code" for a work means the preferred form of the work for 137 | making modifications to it. For a library, complete source code means 138 | all the source code for all modules it contains, plus any associated 139 | interface definition files, plus the scripts used to control compilation 140 | and installation of the library. 141 | 142 | Activities other than copying, distribution and modification are not 143 | covered by this License; they are outside its scope. The act of 144 | running a program using the Library is not restricted, and output from 145 | such a program is covered only if its contents constitute a work based 146 | on the Library (independent of the use of the Library in a tool for 147 | writing it). Whether that is true depends on what the Library does 148 | and what the program that uses the Library does. 149 | 150 | 1. You may copy and distribute verbatim copies of the Library's 151 | complete source code as you receive it, in any medium, provided that 152 | you conspicuously and appropriately publish on each copy an 153 | appropriate copyright notice and disclaimer of warranty; keep intact 154 | all the notices that refer to this License and to the absence of any 155 | warranty; and distribute a copy of this License along with the 156 | Library. 157 | 158 | You may charge a fee for the physical act of transferring a copy, 159 | and you may at your option offer warranty protection in exchange for a 160 | fee. 161 | 162 | 2. You may modify your copy or copies of the Library or any portion 163 | of it, thus forming a work based on the Library, and copy and 164 | distribute such modifications or work under the terms of Section 1 165 | above, provided that you also meet all of these conditions: 166 | 167 | a) The modified work must itself be a software library. 168 | 169 | b) You must cause the files modified to carry prominent notices 170 | stating that you changed the files and the date of any change. 171 | 172 | c) You must cause the whole of the work to be licensed at no 173 | charge to all third parties under the terms of this License. 174 | 175 | d) If a facility in the modified Library refers to a function or a 176 | table of data to be supplied by an application program that uses 177 | the facility, other than as an argument passed when the facility 178 | is invoked, then you must make a good faith effort to ensure that, 179 | in the event an application does not supply such function or 180 | table, the facility still operates, and performs whatever part of 181 | its purpose remains meaningful. 182 | 183 | (For example, a function in a library to compute square roots has 184 | a purpose that is entirely well-defined independent of the 185 | application. Therefore, Subsection 2d requires that any 186 | application-supplied function or table used by this function must 187 | be optional: if the application does not supply it, the square 188 | root function must still compute square roots.) 189 | 190 | These requirements apply to the modified work as a whole. If 191 | identifiable sections of that work are not derived from the Library, 192 | and can be reasonably considered independent and separate works in 193 | themselves, then this License, and its terms, do not apply to those 194 | sections when you distribute them as separate works. But when you 195 | distribute the same sections as part of a whole which is a work based 196 | on the Library, the distribution of the whole must be on the terms of 197 | this License, whose permissions for other licensees extend to the 198 | entire whole, and thus to each and every part regardless of who wrote 199 | it. 200 | 201 | Thus, it is not the intent of this section to claim rights or contest 202 | your rights to work written entirely by you; rather, the intent is to 203 | exercise the right to control the distribution of derivative or 204 | collective works based on the Library. 205 | 206 | In addition, mere aggregation of another work not based on the Library 207 | with the Library (or with a work based on the Library) on a volume of 208 | a storage or distribution medium does not bring the other work under 209 | the scope of this License. 210 | 211 | 3. You may opt to apply the terms of the ordinary GNU General Public 212 | License instead of this License to a given copy of the Library. To do 213 | this, you must alter all the notices that refer to this License, so 214 | that they refer to the ordinary GNU General Public License, version 2, 215 | instead of to this License. (If a newer version than version 2 of the 216 | ordinary GNU General Public License has appeared, then you can specify 217 | that version instead if you wish.) Do not make any other change in 218 | these notices. 219 | 220 | Once this change is made in a given copy, it is irreversible for 221 | that copy, so the ordinary GNU General Public License applies to all 222 | subsequent copies and derivative works made from that copy. 223 | 224 | This option is useful when you wish to copy part of the code of 225 | the Library into a program that is not a library. 226 | 227 | 4. You may copy and distribute the Library (or a portion or 228 | derivative of it, under Section 2) in object code or executable form 229 | under the terms of Sections 1 and 2 above provided that you accompany 230 | it with the complete corresponding machine-readable source code, which 231 | must be distributed under the terms of Sections 1 and 2 above on a 232 | medium customarily used for software interchange. 233 | 234 | If distribution of object code is made by offering access to copy 235 | from a designated place, then offering equivalent access to copy the 236 | source code from the same place satisfies the requirement to 237 | distribute the source code, even though third parties are not 238 | compelled to copy the source along with the object code. 239 | 240 | 5. A program that contains no derivative of any portion of the 241 | Library, but is designed to work with the Library by being compiled or 242 | linked with it, is called a "work that uses the Library". Such a 243 | work, in isolation, is not a derivative work of the Library, and 244 | therefore falls outside the scope of this License. 245 | 246 | However, linking a "work that uses the Library" with the Library 247 | creates an executable that is a derivative of the Library (because it 248 | contains portions of the Library), rather than a "work that uses the 249 | library". The executable is therefore covered by this License. 250 | Section 6 states terms for distribution of such executables. 251 | 252 | When a "work that uses the Library" uses material from a header file 253 | that is part of the Library, the object code for the work may be a 254 | derivative work of the Library even though the source code is not. 255 | Whether this is true is especially significant if the work can be 256 | linked without the Library, or if the work is itself a library. The 257 | threshold for this to be true is not precisely defined by law. 258 | 259 | If such an object file uses only numerical parameters, data 260 | structure layouts and accessors, and small macros and small inline 261 | functions (ten lines or less in length), then the use of the object 262 | file is unrestricted, regardless of whether it is legally a derivative 263 | work. (Executables containing this object code plus portions of the 264 | Library will still fall under Section 6.) 265 | 266 | Otherwise, if the work is a derivative of the Library, you may 267 | distribute the object code for the work under the terms of Section 6. 268 | Any executables containing that work also fall under Section 6, 269 | whether or not they are linked directly with the Library itself. 270 | 271 | 6. As an exception to the Sections above, you may also combine or 272 | link a "work that uses the Library" with the Library to produce a 273 | work containing portions of the Library, and distribute that work 274 | under terms of your choice, provided that the terms permit 275 | modification of the work for the customer's own use and reverse 276 | engineering for debugging such modifications. 277 | 278 | You must give prominent notice with each copy of the work that the 279 | Library is used in it and that the Library and its use are covered by 280 | this License. You must supply a copy of this License. If the work 281 | during execution displays copyright notices, you must include the 282 | copyright notice for the Library among them, as well as a reference 283 | directing the user to the copy of this License. Also, you must do one 284 | of these things: 285 | 286 | a) Accompany the work with the complete corresponding 287 | machine-readable source code for the Library including whatever 288 | changes were used in the work (which must be distributed under 289 | Sections 1 and 2 above); and, if the work is an executable linked 290 | with the Library, with the complete machine-readable "work that 291 | uses the Library", as object code and/or source code, so that the 292 | user can modify the Library and then relink to produce a modified 293 | executable containing the modified Library. (It is understood 294 | that the user who changes the contents of definitions files in the 295 | Library will not necessarily be able to recompile the application 296 | to use the modified definitions.) 297 | 298 | b) Use a suitable shared library mechanism for linking with the 299 | Library. A suitable mechanism is one that (1) uses at run time a 300 | copy of the library already present on the user's computer system, 301 | rather than copying library functions into the executable, and (2) 302 | will operate properly with a modified version of the library, if 303 | the user installs one, as long as the modified version is 304 | interface-compatible with the version that the work was made with. 305 | 306 | c) Accompany the work with a written offer, valid for at 307 | least three years, to give the same user the materials 308 | specified in Subsection 6a, above, for a charge no more 309 | than the cost of performing this distribution. 310 | 311 | d) If distribution of the work is made by offering access to copy 312 | from a designated place, offer equivalent access to copy the above 313 | specified materials from the same place. 314 | 315 | e) Verify that the user has already received a copy of these 316 | materials or that you have already sent this user a copy. 317 | 318 | For an executable, the required form of the "work that uses the 319 | Library" must include any data and utility programs needed for 320 | reproducing the executable from it. However, as a special exception, 321 | the materials to be distributed need not include anything that is 322 | normally distributed (in either source or binary form) with the major 323 | components (compiler, kernel, and so on) of the operating system on 324 | which the executable runs, unless that component itself accompanies 325 | the executable. 326 | 327 | It may happen that this requirement contradicts the license 328 | restrictions of other proprietary libraries that do not normally 329 | accompany the operating system. Such a contradiction means you cannot 330 | use both them and the Library together in an executable that you 331 | distribute. 332 | 333 | 7. You may place library facilities that are a work based on the 334 | Library side-by-side in a single library together with other library 335 | facilities not covered by this License, and distribute such a combined 336 | library, provided that the separate distribution of the work based on 337 | the Library and of the other library facilities is otherwise 338 | permitted, and provided that you do these two things: 339 | 340 | a) Accompany the combined library with a copy of the same work 341 | based on the Library, uncombined with any other library 342 | facilities. This must be distributed under the terms of the 343 | Sections above. 344 | 345 | b) Give prominent notice with the combined library of the fact 346 | that part of it is a work based on the Library, and explaining 347 | where to find the accompanying uncombined form of the same work. 348 | 349 | 8. You may not copy, modify, sublicense, link with, or distribute 350 | the Library except as expressly provided under this License. Any 351 | attempt otherwise to copy, modify, sublicense, link with, or 352 | distribute the Library is void, and will automatically terminate your 353 | rights under this License. However, parties who have received copies, 354 | or rights, from you under this License will not have their licenses 355 | terminated so long as such parties remain in full compliance. 356 | 357 | 9. You are not required to accept this License, since you have not 358 | signed it. However, nothing else grants you permission to modify or 359 | distribute the Library or its derivative works. These actions are 360 | prohibited by law if you do not accept this License. Therefore, by 361 | modifying or distributing the Library (or any work based on the 362 | Library), you indicate your acceptance of this License to do so, and 363 | all its terms and conditions for copying, distributing or modifying 364 | the Library or works based on it. 365 | 366 | 10. Each time you redistribute the Library (or any work based on the 367 | Library), the recipient automatically receives a license from the 368 | original licensor to copy, distribute, link with or modify the Library 369 | subject to these terms and conditions. You may not impose any further 370 | restrictions on the recipients' exercise of the rights granted herein. 371 | You are not responsible for enforcing compliance by third parties with 372 | this License. 373 | 374 | 11. If, as a consequence of a court judgment or allegation of patent 375 | infringement or for any other reason (not limited to patent issues), 376 | conditions are imposed on you (whether by court order, agreement or 377 | otherwise) that contradict the conditions of this License, they do not 378 | excuse you from the conditions of this License. If you cannot 379 | distribute so as to satisfy simultaneously your obligations under this 380 | License and any other pertinent obligations, then as a consequence you 381 | may not distribute the Library at all. For example, if a patent 382 | license would not permit royalty-free redistribution of the Library by 383 | all those who receive copies directly or indirectly through you, then 384 | the only way you could satisfy both it and this License would be to 385 | refrain entirely from distribution of the Library. 386 | 387 | If any portion of this section is held invalid or unenforceable under any 388 | particular circumstance, the balance of the section is intended to apply, 389 | and the section as a whole is intended to apply in other circumstances. 390 | 391 | It is not the purpose of this section to induce you to infringe any 392 | patents or other property right claims or to contest validity of any 393 | such claims; this section has the sole purpose of protecting the 394 | integrity of the free software distribution system which is 395 | implemented by public license practices. Many people have made 396 | generous contributions to the wide range of software distributed 397 | through that system in reliance on consistent application of that 398 | system; it is up to the author/donor to decide if he or she is willing 399 | to distribute software through any other system and a licensee cannot 400 | impose that choice. 401 | 402 | This section is intended to make thoroughly clear what is believed to 403 | be a consequence of the rest of this License. 404 | 405 | 12. If the distribution and/or use of the Library is restricted in 406 | certain countries either by patents or by copyrighted interfaces, the 407 | original copyright holder who places the Library under this License may add 408 | an explicit geographical distribution limitation excluding those countries, 409 | so that distribution is permitted only in or among countries not thus 410 | excluded. In such case, this License incorporates the limitation as if 411 | written in the body of this License. 412 | 413 | 13. The Free Software Foundation may publish revised and/or new 414 | versions of the Lesser General Public License from time to time. 415 | Such new versions will be similar in spirit to the present version, 416 | but may differ in detail to address new problems or concerns. 417 | 418 | Each version is given a distinguishing version number. If the Library 419 | specifies a version number of this License which applies to it and 420 | "any later version", you have the option of following the terms and 421 | conditions either of that version or of any later version published by 422 | the Free Software Foundation. If the Library does not specify a 423 | license version number, you may choose any version ever published by 424 | the Free Software Foundation. 425 | 426 | 14. If you wish to incorporate parts of the Library into other free 427 | programs whose distribution conditions are incompatible with these, 428 | write to the author to ask for permission. For software which is 429 | copyrighted by the Free Software Foundation, write to the Free 430 | Software Foundation; we sometimes make exceptions for this. Our 431 | decision will be guided by the two goals of preserving the free status 432 | of all derivatives of our free software and of promoting the sharing 433 | and reuse of software generally. 434 | 435 | NO WARRANTY 436 | 437 | 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO 438 | WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 439 | EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR 440 | OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY 441 | KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE 442 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 443 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE 444 | LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME 445 | THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 446 | 447 | 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN 448 | WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY 449 | AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU 450 | FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR 451 | CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE 452 | LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING 453 | RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A 454 | FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF 455 | SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 456 | DAMAGES. 457 | 458 | END OF TERMS AND CONDITIONS 459 | 460 | How to Apply These Terms to Your New Libraries 461 | 462 | If you develop a new library, and you want it to be of the greatest 463 | possible use to the public, we recommend making it free software that 464 | everyone can redistribute and change. You can do so by permitting 465 | redistribution under these terms (or, alternatively, under the terms of the 466 | ordinary General Public License). 467 | 468 | To apply these terms, attach the following notices to the library. It is 469 | safest to attach them to the start of each source file to most effectively 470 | convey the exclusion of warranty; and each file should have at least the 471 | "copyright" line and a pointer to where the full notice is found. 472 | 473 | 474 | Copyright (C) 475 | 476 | This library is free software; you can redistribute it and/or 477 | modify it under the terms of the GNU Lesser General Public 478 | License as published by the Free Software Foundation; either 479 | version 2.1 of the License, or (at your option) any later version. 480 | 481 | This library is distributed in the hope that it will be useful, 482 | but WITHOUT ANY WARRANTY; without even the implied warranty of 483 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 484 | Lesser General Public License for more details. 485 | 486 | You should have received a copy of the GNU Lesser General Public 487 | License along with this library; if not, write to the Free Software 488 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 489 | 490 | Also add information on how to contact you by electronic and paper mail. 491 | 492 | You should also get your employer (if you work as a programmer) or your 493 | school, if any, to sign a "copyright disclaimer" for the library, if 494 | necessary. Here is a sample; alter the names: 495 | 496 | Yoyodyne, Inc., hereby disclaims all copyright interest in the 497 | library `Frob' (a library for tweaking knobs) written by James Random Hacker. 498 | 499 | , 1 April 1990 500 | Ty Coon, President of Vice 501 | 502 | That's all there is to it! 503 | 504 | 505 | 506 | 507 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/Main.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace WinCCFlexLogViewer 2 | { 3 | public partial class Main : System.Windows.Forms.Form 4 | { 5 | protected override void Dispose(bool disposing) 6 | { 7 | if (disposing && components != null) 8 | { 9 | components.Dispose(); 10 | } 11 | base.Dispose(disposing); 12 | } 13 | // 14 | private void InitializeComponent() 15 | { 16 | this.components = new System.ComponentModel.Container(); 17 | this.menuStrip1 = new System.Windows.Forms.MenuStrip(); 18 | this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 19 | this.togleTableToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 20 | this.hideshowcurveMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 21 | this.printMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 22 | this.lockunlockvzoomMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 23 | this.ExitStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 24 | this.aboutMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 25 | this.ControlsStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 26 | this.fullscreenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 27 | this.SaveCSVMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 28 | this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); 29 | this.splitContainer1 = new System.Windows.Forms.SplitContainer(); 30 | this.controlPanel = new System.Windows.Forms.Panel(); 31 | this.button_loclunlockvzoom = new System.Windows.Forms.Button(); 32 | this.button_panright = new System.Windows.Forms.Button(); 33 | this.button_zoomin = new System.Windows.Forms.Button(); 34 | this.button_panbottom = new System.Windows.Forms.Button(); 35 | this.button_resetzoompan = new System.Windows.Forms.Button(); 36 | this.button_pantop = new System.Windows.Forms.Button(); 37 | this.button_zoomout = new System.Windows.Forms.Button(); 38 | this.button_panleft = new System.Windows.Forms.Button(); 39 | this.button_print = new System.Windows.Forms.Button(); 40 | this.panel1 = new System.Windows.Forms.Panel(); 41 | this.loadingpanel = new System.Windows.Forms.Panel(); 42 | this.progress_counter_textlabel = new System.Windows.Forms.Label(); 43 | this.loadingpictureBox = new System.Windows.Forms.PictureBox(); 44 | this.DTrend = new ZedGraph.ZedGraphControl(); 45 | this.dataGridView_data = new System.Windows.Forms.DataGridView(); 46 | this.progress_timer = new System.Windows.Forms.Timer(this.components); 47 | this.printDlg = new System.Windows.Forms.PrintDialog(); 48 | this.saveFileDialog = new System.Windows.Forms.SaveFileDialog(); 49 | this.menuStrip1.SuspendLayout(); 50 | this.splitContainer1.Panel1.SuspendLayout(); 51 | this.splitContainer1.Panel2.SuspendLayout(); 52 | this.splitContainer1.SuspendLayout(); 53 | this.controlPanel.SuspendLayout(); 54 | this.panel1.SuspendLayout(); 55 | this.loadingpanel.SuspendLayout(); 56 | ((System.ComponentModel.ISupportInitialize)(this.loadingpictureBox)).BeginInit(); 57 | ((System.ComponentModel.ISupportInitialize)(this.dataGridView_data)).BeginInit(); 58 | this.SuspendLayout(); 59 | // 60 | // menuStrip1 61 | // 62 | this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 63 | this.fileToolStripMenuItem, 64 | this.togleTableToolStripMenuItem, 65 | this.hideshowcurveMenuItem, 66 | this.printMenuItem, 67 | this.lockunlockvzoomMenuItem, 68 | this.ExitStripMenuItem, 69 | this.aboutMenuItem, 70 | this.ControlsStripMenuItem, 71 | this.fullscreenToolStripMenuItem, 72 | this.SaveCSVMenuItem}); 73 | this.menuStrip1.Location = new System.Drawing.Point(0, 0); 74 | this.menuStrip1.Name = "menuStrip1"; 75 | this.menuStrip1.Padding = new System.Windows.Forms.Padding(6, 2, 2, 2); 76 | this.menuStrip1.ShowItemToolTips = true; 77 | this.menuStrip1.Size = new System.Drawing.Size(846, 24); 78 | this.menuStrip1.TabIndex = 0; 79 | this.menuStrip1.Text = "menuStrip1"; 80 | // 81 | // fileToolStripMenuItem 82 | // 83 | this.fileToolStripMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_142_database_plus; 84 | this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; 85 | this.fileToolStripMenuItem.Size = new System.Drawing.Size(53, 20); 86 | this.fileToolStripMenuItem.Text = "File"; 87 | this.fileToolStripMenuItem.ToolTipText = "Import data log file"; 88 | this.fileToolStripMenuItem.Click += new System.EventHandler(this.fileToolStripMenuItem_Click); 89 | // 90 | // togleTableToolStripMenuItem 91 | // 92 | this.togleTableToolStripMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_120_table; 93 | this.togleTableToolStripMenuItem.Name = "togleTableToolStripMenuItem"; 94 | this.togleTableToolStripMenuItem.Size = new System.Drawing.Size(64, 20); 95 | this.togleTableToolStripMenuItem.Text = "Table"; 96 | this.togleTableToolStripMenuItem.ToolTipText = "Toggle table view"; 97 | this.togleTableToolStripMenuItem.Click += new System.EventHandler(this.togleTableToolStripMenuItem_Click); 98 | // 99 | // hideshowcurveMenuItem 100 | // 101 | this.hideshowcurveMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_115_list; 102 | this.hideshowcurveMenuItem.Name = "hideshowcurveMenuItem"; 103 | this.hideshowcurveMenuItem.Size = new System.Drawing.Size(71, 20); 104 | this.hideshowcurveMenuItem.Text = "Curves"; 105 | // 106 | // printMenuItem 107 | // 108 | this.printMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_16_print; 109 | this.printMenuItem.Name = "printMenuItem"; 110 | this.printMenuItem.Size = new System.Drawing.Size(60, 20); 111 | this.printMenuItem.Text = "Print"; 112 | this.printMenuItem.ToolTipText = "Print Graph"; 113 | this.printMenuItem.Click += new System.EventHandler(this.printMenuItem_Click); 114 | // 115 | // lockunlockvzoomMenuItem 116 | // 117 | this.lockunlockvzoomMenuItem.CheckOnClick = true; 118 | this.lockunlockvzoomMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_242_flash; 119 | this.lockunlockvzoomMenuItem.Name = "lockunlockvzoomMenuItem"; 120 | this.lockunlockvzoomMenuItem.Size = new System.Drawing.Size(134, 20); 121 | this.lockunlockvzoomMenuItem.Text = "Lock vertical zoom"; 122 | this.lockunlockvzoomMenuItem.ToolTipText = "Toggle Y-axis zoom lock"; 123 | this.lockunlockvzoomMenuItem.Click += new System.EventHandler(this.lockunlockvzoomMenuItem_Click); 124 | // 125 | // ExitStripMenuItem 126 | // 127 | this.ExitStripMenuItem.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; 128 | this.ExitStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; 129 | this.ExitStripMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_389_exit; 130 | this.ExitStripMenuItem.Name = "ExitStripMenuItem"; 131 | this.ExitStripMenuItem.Size = new System.Drawing.Size(28, 20); 132 | this.ExitStripMenuItem.Text = "exit"; 133 | this.ExitStripMenuItem.Click += new System.EventHandler(this.ExitStripMenuItem_Click); 134 | // 135 | // aboutMenuItem 136 | // 137 | this.aboutMenuItem.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; 138 | this.aboutMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_196_circle_info; 139 | this.aboutMenuItem.Name = "aboutMenuItem"; 140 | this.aboutMenuItem.Size = new System.Drawing.Size(38, 20); 141 | this.aboutMenuItem.Text = " "; 142 | this.aboutMenuItem.ToolTipText = "About"; 143 | this.aboutMenuItem.Click += new System.EventHandler(this.aboutMenuItem_Click); 144 | // 145 | // ControlsStripMenuItem 146 | // 147 | this.ControlsStripMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_589_remote_control_tv; 148 | this.ControlsStripMenuItem.Name = "ControlsStripMenuItem"; 149 | this.ControlsStripMenuItem.Size = new System.Drawing.Size(80, 20); 150 | this.ControlsStripMenuItem.Text = "Controls"; 151 | this.ControlsStripMenuItem.ToolTipText = "Toggle Control pad"; 152 | this.ControlsStripMenuItem.Click += new System.EventHandler(this.ControlsStripMenuItem_Click); 153 | // 154 | // fullscreenToolStripMenuItem 155 | // 156 | this.fullscreenToolStripMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.fullscreen2; 157 | this.fullscreenToolStripMenuItem.Name = "fullscreenToolStripMenuItem"; 158 | this.fullscreenToolStripMenuItem.Size = new System.Drawing.Size(88, 20); 159 | this.fullscreenToolStripMenuItem.Text = "Fullscreen"; 160 | this.fullscreenToolStripMenuItem.ToolTipText = "Toggle fullscreen mode"; 161 | this.fullscreenToolStripMenuItem.Click += new System.EventHandler(this.fullscreenToolStripMenuItem_Click); 162 | // 163 | // SaveCSVMenuItem 164 | // 165 | this.SaveCSVMenuItem.Image = global::WinCCFlexLogViewer.Properties.Resources.save_64; 166 | this.SaveCSVMenuItem.Name = "SaveCSVMenuItem"; 167 | this.SaveCSVMenuItem.Size = new System.Drawing.Size(79, 20); 168 | this.SaveCSVMenuItem.Text = "Save csv"; 169 | this.SaveCSVMenuItem.ToolTipText = "Save Table data to CSV file"; 170 | this.SaveCSVMenuItem.Click += new System.EventHandler(this.SaveCSVMenuItem_Click); 171 | // 172 | // openFileDialog1 173 | // 174 | this.openFileDialog1.Filter = "All Log Files(*.csv;*.txt;*rdb)|*.csv;*.txt;*rdb|csv file|*.csv|rdb file|*.rdb|An" + 175 | "y file|*.*"; 176 | this.openFileDialog1.Title = "Open WinCC flexible or TIA Portal Log file"; 177 | // 178 | // splitContainer1 179 | // 180 | this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; 181 | this.splitContainer1.Location = new System.Drawing.Point(0, 24); 182 | this.splitContainer1.Name = "splitContainer1"; 183 | this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; 184 | // 185 | // splitContainer1.Panel1 186 | // 187 | this.splitContainer1.Panel1.Controls.Add(this.controlPanel); 188 | this.splitContainer1.Panel1.Controls.Add(this.panel1); 189 | this.splitContainer1.Panel1.Controls.Add(this.DTrend); 190 | // 191 | // splitContainer1.Panel2 192 | // 193 | this.splitContainer1.Panel2.Controls.Add(this.dataGridView_data); 194 | this.splitContainer1.Panel2Collapsed = true; 195 | this.splitContainer1.Size = new System.Drawing.Size(846, 454); 196 | this.splitContainer1.SplitterDistance = 354; 197 | this.splitContainer1.TabIndex = 1; 198 | // 199 | // controlPanel 200 | // 201 | this.controlPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 202 | this.controlPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 203 | this.controlPanel.Controls.Add(this.button_loclunlockvzoom); 204 | this.controlPanel.Controls.Add(this.button_panright); 205 | this.controlPanel.Controls.Add(this.button_zoomin); 206 | this.controlPanel.Controls.Add(this.button_panbottom); 207 | this.controlPanel.Controls.Add(this.button_resetzoompan); 208 | this.controlPanel.Controls.Add(this.button_pantop); 209 | this.controlPanel.Controls.Add(this.button_zoomout); 210 | this.controlPanel.Controls.Add(this.button_panleft); 211 | this.controlPanel.Controls.Add(this.button_print); 212 | this.controlPanel.Location = new System.Drawing.Point(718, 3); 213 | this.controlPanel.Name = "controlPanel"; 214 | this.controlPanel.Size = new System.Drawing.Size(122, 116); 215 | this.controlPanel.TabIndex = 1; 216 | this.controlPanel.Visible = false; 217 | // 218 | // button_loclunlockvzoom 219 | // 220 | this.button_loclunlockvzoom.FlatAppearance.BorderSize = 0; 221 | this.button_loclunlockvzoom.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 222 | this.button_loclunlockvzoom.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_242_flash; 223 | this.button_loclunlockvzoom.Location = new System.Drawing.Point(85, 79); 224 | this.button_loclunlockvzoom.Name = "button_loclunlockvzoom"; 225 | this.button_loclunlockvzoom.Size = new System.Drawing.Size(37, 34); 226 | this.button_loclunlockvzoom.TabIndex = 8; 227 | this.button_loclunlockvzoom.UseVisualStyleBackColor = true; 228 | this.button_loclunlockvzoom.Click += new System.EventHandler(this.button_loclunlockvzoom_Click); 229 | // 230 | // button_panright 231 | // 232 | this.button_panright.FlatAppearance.BorderSize = 0; 233 | this.button_panright.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 234 | this.button_panright.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_218_circle_arrow_right; 235 | this.button_panright.Location = new System.Drawing.Point(85, 39); 236 | this.button_panright.Name = "button_panright"; 237 | this.button_panright.Size = new System.Drawing.Size(37, 34); 238 | this.button_panright.TabIndex = 7; 239 | this.button_panright.UseVisualStyleBackColor = true; 240 | this.button_panright.Click += new System.EventHandler(this.button_panright_Click); 241 | // 242 | // button_zoomin 243 | // 244 | this.button_zoomin.FlatAppearance.BorderSize = 0; 245 | this.button_zoomin.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 246 | this.button_zoomin.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_237_zoom_in; 247 | this.button_zoomin.Location = new System.Drawing.Point(85, -1); 248 | this.button_zoomin.Name = "button_zoomin"; 249 | this.button_zoomin.Size = new System.Drawing.Size(37, 34); 250 | this.button_zoomin.TabIndex = 6; 251 | this.button_zoomin.UseVisualStyleBackColor = true; 252 | this.button_zoomin.Click += new System.EventHandler(this.button_zoomin_Click); 253 | // 254 | // button_panbottom 255 | // 256 | this.button_panbottom.FlatAppearance.BorderSize = 0; 257 | this.button_panbottom.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 258 | this.button_panbottom.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_220_circle_arrow_down; 259 | this.button_panbottom.Location = new System.Drawing.Point(42, 79); 260 | this.button_panbottom.Name = "button_panbottom"; 261 | this.button_panbottom.Size = new System.Drawing.Size(37, 34); 262 | this.button_panbottom.TabIndex = 5; 263 | this.button_panbottom.UseVisualStyleBackColor = true; 264 | this.button_panbottom.Click += new System.EventHandler(this.button_panbottom_Click); 265 | // 266 | // button_resetzoompan 267 | // 268 | this.button_resetzoompan.FlatAppearance.BorderSize = 0; 269 | this.button_resetzoompan.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 270 | this.button_resetzoompan.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_215_resize_small; 271 | this.button_resetzoompan.Location = new System.Drawing.Point(42, 39); 272 | this.button_resetzoompan.Name = "button_resetzoompan"; 273 | this.button_resetzoompan.Size = new System.Drawing.Size(37, 34); 274 | this.button_resetzoompan.TabIndex = 4; 275 | this.button_resetzoompan.UseVisualStyleBackColor = true; 276 | this.button_resetzoompan.Click += new System.EventHandler(this.button_resetzoompan_Click); 277 | // 278 | // button_pantop 279 | // 280 | this.button_pantop.FlatAppearance.BorderSize = 0; 281 | this.button_pantop.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 282 | this.button_pantop.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_219_circle_arrow_top; 283 | this.button_pantop.Location = new System.Drawing.Point(42, -1); 284 | this.button_pantop.Name = "button_pantop"; 285 | this.button_pantop.Size = new System.Drawing.Size(37, 34); 286 | this.button_pantop.TabIndex = 3; 287 | this.button_pantop.UseVisualStyleBackColor = true; 288 | this.button_pantop.Click += new System.EventHandler(this.button_pantop_Click); 289 | // 290 | // button_zoomout 291 | // 292 | this.button_zoomout.FlatAppearance.BorderSize = 0; 293 | this.button_zoomout.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 294 | this.button_zoomout.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_238_zoom_out; 295 | this.button_zoomout.Location = new System.Drawing.Point(-1, 79); 296 | this.button_zoomout.Name = "button_zoomout"; 297 | this.button_zoomout.Size = new System.Drawing.Size(37, 34); 298 | this.button_zoomout.TabIndex = 2; 299 | this.button_zoomout.UseVisualStyleBackColor = true; 300 | this.button_zoomout.Click += new System.EventHandler(this.button_zoomout_Click); 301 | // 302 | // button_panleft 303 | // 304 | this.button_panleft.FlatAppearance.BorderSize = 0; 305 | this.button_panleft.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 306 | this.button_panleft.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_217_circle_arrow_left; 307 | this.button_panleft.Location = new System.Drawing.Point(-1, 39); 308 | this.button_panleft.Name = "button_panleft"; 309 | this.button_panleft.Size = new System.Drawing.Size(37, 34); 310 | this.button_panleft.TabIndex = 1; 311 | this.button_panleft.UseVisualStyleBackColor = true; 312 | this.button_panleft.Click += new System.EventHandler(this.button_panleft_Click); 313 | // 314 | // button_print 315 | // 316 | this.button_print.FlatAppearance.BorderSize = 0; 317 | this.button_print.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 318 | this.button_print.Image = global::WinCCFlexLogViewer.Properties.Resources.glyphicons_16_print; 319 | this.button_print.Location = new System.Drawing.Point(-1, -1); 320 | this.button_print.Name = "button_print"; 321 | this.button_print.Size = new System.Drawing.Size(37, 34); 322 | this.button_print.TabIndex = 0; 323 | this.button_print.UseVisualStyleBackColor = true; 324 | this.button_print.Click += new System.EventHandler(this.button_print_Click); 325 | // 326 | // panel1 327 | // 328 | this.panel1.Controls.Add(this.loadingpanel); 329 | this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; 330 | this.panel1.Location = new System.Drawing.Point(0, 0); 331 | this.panel1.Name = "panel1"; 332 | this.panel1.Size = new System.Drawing.Size(846, 454); 333 | this.panel1.TabIndex = 1; 334 | // 335 | // loadingpanel 336 | // 337 | this.loadingpanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; 338 | this.loadingpanel.Controls.Add(this.progress_counter_textlabel); 339 | this.loadingpanel.Controls.Add(this.loadingpictureBox); 340 | this.loadingpanel.Dock = System.Windows.Forms.DockStyle.Fill; 341 | this.loadingpanel.Location = new System.Drawing.Point(0, 0); 342 | this.loadingpanel.Name = "loadingpanel"; 343 | this.loadingpanel.Size = new System.Drawing.Size(846, 454); 344 | this.loadingpanel.TabIndex = 1; 345 | this.loadingpanel.Visible = false; 346 | // 347 | // progress_counter_textlabel 348 | // 349 | this.progress_counter_textlabel.AutoSize = true; 350 | this.progress_counter_textlabel.Location = new System.Drawing.Point(387, 261); 351 | this.progress_counter_textlabel.Name = "progress_counter_textlabel"; 352 | this.progress_counter_textlabel.Size = new System.Drawing.Size(0, 13); 353 | this.progress_counter_textlabel.TabIndex = 1; 354 | this.progress_counter_textlabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 355 | // 356 | // loadingpictureBox 357 | // 358 | this.loadingpictureBox.Image = global::WinCCFlexLogViewer.Properties.Resources.loading; 359 | this.loadingpictureBox.Location = new System.Drawing.Point(371, 192); 360 | this.loadingpictureBox.Name = "loadingpictureBox"; 361 | this.loadingpictureBox.Size = new System.Drawing.Size(63, 66); 362 | this.loadingpictureBox.TabIndex = 0; 363 | this.loadingpictureBox.TabStop = false; 364 | // 365 | // DTrend 366 | // 367 | this.DTrend.Dock = System.Windows.Forms.DockStyle.Fill; 368 | this.DTrend.IsEnableSelection = true; 369 | this.DTrend.Location = new System.Drawing.Point(0, 0); 370 | this.DTrend.Margin = new System.Windows.Forms.Padding(0); 371 | this.DTrend.Name = "DTrend"; 372 | this.DTrend.ScrollGrace = 0D; 373 | this.DTrend.ScrollMaxX = 0D; 374 | this.DTrend.ScrollMaxY = 0D; 375 | this.DTrend.ScrollMaxY2 = 0D; 376 | this.DTrend.ScrollMinX = 0D; 377 | this.DTrend.ScrollMinY = 0D; 378 | this.DTrend.ScrollMinY2 = 0D; 379 | this.DTrend.Size = new System.Drawing.Size(846, 454); 380 | this.DTrend.TabIndex = 0; 381 | this.DTrend.UseExtendedPrintDialog = true; 382 | this.DTrend.ZoomEvent += new ZedGraph.ZedGraphControl.ZoomEventHandler(this.DTrend_ZoomEvent); 383 | // 384 | // dataGridView_data 385 | // 386 | this.dataGridView_data.AllowUserToOrderColumns = true; 387 | this.dataGridView_data.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; 388 | this.dataGridView_data.Dock = System.Windows.Forms.DockStyle.Fill; 389 | this.dataGridView_data.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically; 390 | this.dataGridView_data.Location = new System.Drawing.Point(0, 0); 391 | this.dataGridView_data.Name = "dataGridView_data"; 392 | this.dataGridView_data.ReadOnly = true; 393 | this.dataGridView_data.Size = new System.Drawing.Size(150, 46); 394 | this.dataGridView_data.TabIndex = 0; 395 | // 396 | // progress_timer 397 | // 398 | this.progress_timer.Interval = 50; 399 | this.progress_timer.Tick += new System.EventHandler(this.progress_timer_Tick); 400 | // 401 | // printDlg 402 | // 403 | this.printDlg.UseEXDialog = true; 404 | // 405 | // saveFileDialog 406 | // 407 | this.saveFileDialog.FileName = "table.csv"; 408 | // 409 | // Main 410 | // 411 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 412 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 413 | this.ClientSize = new System.Drawing.Size(846, 478); 414 | this.Controls.Add(this.splitContainer1); 415 | this.Controls.Add(this.menuStrip1); 416 | this.MainMenuStrip = this.menuStrip1; 417 | this.Name = "Main"; 418 | this.Resize += new System.EventHandler(this.Main_Resize); 419 | this.menuStrip1.ResumeLayout(false); 420 | this.menuStrip1.PerformLayout(); 421 | this.splitContainer1.Panel1.ResumeLayout(false); 422 | this.splitContainer1.Panel2.ResumeLayout(false); 423 | this.splitContainer1.ResumeLayout(false); 424 | this.controlPanel.ResumeLayout(false); 425 | this.panel1.ResumeLayout(false); 426 | this.loadingpanel.ResumeLayout(false); 427 | this.loadingpanel.PerformLayout(); 428 | ((System.ComponentModel.ISupportInitialize)(this.loadingpictureBox)).EndInit(); 429 | ((System.ComponentModel.ISupportInitialize)(this.dataGridView_data)).EndInit(); 430 | this.ResumeLayout(false); 431 | this.PerformLayout(); 432 | 433 | } 434 | // 435 | private System.ComponentModel.IContainer components; 436 | // 437 | private System.Windows.Forms.MenuStrip menuStrip1; 438 | // 439 | private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; 440 | // 441 | private System.Windows.Forms.OpenFileDialog openFileDialog1; 442 | // 443 | private System.Windows.Forms.SplitContainer splitContainer1; 444 | // ZedGraph Instance 445 | private ZedGraph.ZedGraphControl DTrend; 446 | // 447 | private System.Windows.Forms.DataGridView dataGridView_data; 448 | // 449 | private System.Windows.Forms.ToolStripMenuItem togleTableToolStripMenuItem; 450 | // 451 | private System.Windows.Forms.ToolStripMenuItem hideshowcurveMenuItem; 452 | // 453 | private System.Windows.Forms.ToolStripMenuItem printMenuItem; 454 | // 455 | private System.Windows.Forms.ToolStripMenuItem lockunlockvzoomMenuItem; 456 | // 457 | private System.Windows.Forms.ToolStripMenuItem aboutMenuItem; 458 | // 459 | private System.Windows.Forms.Panel panel1; 460 | // 461 | private System.Windows.Forms.ToolStripMenuItem ControlsStripMenuItem; 462 | // 463 | private System.Windows.Forms.ToolStripMenuItem ExitStripMenuItem; 464 | // 465 | private System.Windows.Forms.Panel controlPanel; 466 | // 467 | private System.Windows.Forms.Button button_loclunlockvzoom; 468 | // 469 | private System.Windows.Forms.Button button_panright; 470 | // 471 | private System.Windows.Forms.Button button_zoomin; 472 | // 473 | private System.Windows.Forms.Button button_panbottom; 474 | // 475 | private System.Windows.Forms.Button button_resetzoompan; 476 | // 477 | private System.Windows.Forms.Button button_pantop; 478 | // 479 | private System.Windows.Forms.Button button_zoomout; 480 | // 481 | private System.Windows.Forms.Button button_panleft; 482 | // 483 | private System.Windows.Forms.Button button_print; 484 | // 485 | private System.Windows.Forms.Panel loadingpanel; 486 | // 487 | private System.Windows.Forms.PictureBox loadingpictureBox; 488 | // 489 | private System.Windows.Forms.Label progress_counter_textlabel; 490 | // 491 | private System.Windows.Forms.Timer progress_timer; 492 | // 493 | private System.Windows.Forms.PrintDialog printDlg; 494 | private System.Windows.Forms.ToolStripMenuItem fullscreenToolStripMenuItem; 495 | private System.Windows.Forms.ToolStripMenuItem SaveCSVMenuItem; 496 | private System.Windows.Forms.SaveFileDialog saveFileDialog; 497 | } 498 | } 499 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/Main.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Data.SQLite; 6 | using System.Drawing; 7 | using System.Drawing.Printing; 8 | using System.Globalization; 9 | using System.IO; 10 | using System.Text; 11 | using System.Text.RegularExpressions; 12 | using System.Windows.Forms; 13 | using WinCCFlexLogViewer.Properties; 14 | using ZedGraph; 15 | 16 | namespace WinCCFlexLogViewer 17 | { 18 | public partial class Main : Form 19 | { 20 | public Main() 21 | { 22 | InitializeComponent(); 23 | Icon = Resources.logo1; 24 | Text = Application.ProductName + " v" + Application.ProductVersion; 25 | DTrend.GraphPane.Title.IsVisible = false; 26 | DTrend.MasterPane[0].IsFontsScaled = false; 27 | DTrend.GraphPane.Legend.IsVisible = false; 28 | DTrend.GraphPane.Border.IsVisible = false; 29 | DTrend.GraphPane.Chart.Border.IsVisible = false; 30 | DTrend.MasterPane.Margin.Left = 0f; 31 | DTrend.MasterPane.Margin.Right = 0f; 32 | DTrend.MasterPane.Margin.Top = 0f; 33 | DTrend.MasterPane.Margin.Bottom = 0f; 34 | DTrend.MasterPane.InnerPaneGap = 0f; 35 | DTrend.GraphPane.Margin.Left = 0f; 36 | DTrend.GraphPane.Margin.Right = 2f; 37 | DTrend.GraphPane.Margin.Top = 5f; 38 | DTrend.GraphPane.Margin.Bottom = 0f; 39 | DTrend.GraphPane.XAxis.Type = AxisType.Text; 40 | DTrend.GraphPane.XAxis.IsVisible = true; 41 | DTrend.GraphPane.XAxis.Title.IsVisible = false; 42 | DTrend.GraphPane.XAxis.IsAxisSegmentVisible = false; 43 | DTrend.GraphPane.XAxis.Scale.FontSpec.Size = 10f; 44 | DTrend.GraphPane.XAxis.Scale.Min = 0.0; 45 | DTrend.GraphPane.XAxis.MajorGrid.PenWidth = 0.5f; 46 | DTrend.GraphPane.XAxis.MajorGrid.IsVisible = true; 47 | DTrend.GraphPane.XAxis.MinorTic.IsOpposite = false; 48 | DTrend.GraphPane.XAxis.MajorTic.IsOpposite = false; 49 | DTrend.GraphPane.YAxis.IsVisible = false; 50 | DTrend.GraphPane.YAxis.Scale.MinAuto = false; 51 | DTrend.GraphPane.YAxis.Scale.MaxAuto = false; 52 | DTrend.GraphPane.YAxis.Scale.Min = -100.0; 53 | DTrend.GraphPane.YAxis.Scale.Max = 5000.0; 54 | DTrend.GraphPane.Y2Axis.MajorTic.IsOpposite = false; 55 | DTrend.GraphPane.Y2Axis.MinorTic.IsOpposite = false; 56 | DTrend.GraphPane.Y2Axis.IsVisible = false; 57 | DTrend.GraphPane.X2Axis.IsVisible = false; 58 | DTrend.Selection.SelectionChangedEvent += new EventHandler(Selection_SelectionChangedEvent); 59 | DTrend.GraphPane.AxisChange(); 60 | DTrend.Refresh(); 61 | string[] commandLineArgs = Environment.GetCommandLineArgs(); 62 | 63 | for (int i = 0; i < commandLineArgs.Length; i++) // Парсинг аргументов командной строки 64 | { 65 | string path = ""; 66 | string a = commandLineArgs[i]; 67 | if (a == "-f") 68 | { 69 | if (i < commandLineArgs.Length - 1) 70 | { 71 | path = commandLineArgs[i + 1]; 72 | if (File.Exists(path)) 73 | { 74 | loadingpanel.Visible = true; 75 | log_file = path; 76 | startparsing(); 77 | } 78 | } 79 | } 80 | else if (a == "-fullscreen") 81 | { 82 | FormBorderStyle = FormBorderStyle.None; 83 | WindowState = FormWindowState.Maximized; 84 | } 85 | else if (a == "-nofilebutton") 86 | { 87 | fileToolStripMenuItem.Visible = false; 88 | } 89 | else if (a == "-noprintbutton") 90 | { 91 | printMenuItem.Visible = button_print.Visible = false; 92 | } 93 | } 94 | } 95 | 96 | // FileOpen Button Click 97 | private void fileToolStripMenuItem_Click(object sender, EventArgs e) 98 | { 99 | if (openFileDialog1.ShowDialog() == DialogResult.OK) 100 | { 101 | loadingpanel.Visible = true; 102 | log_file = openFileDialog1.FileName; 103 | startparsing(); 104 | } 105 | } 106 | 107 | // Запуск парсинга файла в фоновом режиме 108 | private void startparsing() 109 | { 110 | hideshowcurveMenuItem.DropDownItems.Clear(); 111 | DTrend.GraphPane.YAxisList.Clear(); 112 | DTrend.GraphPane.CurveList.Clear(); 113 | panel1.Show(); 114 | centerLoadingAnnimation(); 115 | BackgroundWorker backgroundWorker = new BackgroundWorker(); 116 | backgroundWorker.WorkerSupportsCancellation = true; 117 | if (Path.GetExtension(log_file) != ".rdb") 118 | backgroundWorker.DoWork += parse_data; 119 | else 120 | backgroundWorker.DoWork += startparsingSQL; 121 | backgroundWorker.RunWorkerAsync(); 122 | backgroundWorker.RunWorkerCompleted += dataparsing_complete; 123 | progress_timer.Enabled = true; 124 | } 125 | 126 | // Парсинг SQLite файла лога 127 | private void startparsingSQL(object sender, DoWorkEventArgs e) 128 | { 129 | table = new DataTable(); 130 | DataColumn dataColumn = new DataColumn(); 131 | dataColumn.DataType = Type.GetType("System.String"); 132 | dataColumn.ColumnName = "Date Time"; 133 | table.Columns.Add(dataColumn); //добавляем столбец Дата-Время 134 | 135 | SQLiteConnection m_dbConn = new SQLiteConnection("Data Source=" + log_file + ";Version=3;"); 136 | try 137 | { 138 | m_dbConn.Open(); 139 | } 140 | catch (SQLiteException ex) 141 | { 142 | MessageBox.Show("Cannnot open the file " + ex.ToString()); 143 | } 144 | 145 | SQLiteCommand m_sqlCmd = new SQLiteCommand("SELECT DISTINCT VarName FROM logdata WHERE (VarName != '$RT_OFF$')", m_dbConn); 146 | SQLiteDataReader reader = m_sqlCmd.ExecuteReader(); 147 | 148 | channel_names = new List(); // Список имен тегов 149 | timeList = new List(); 150 | while (reader.Read()) // Добавляем столбцы с тегами 151 | { 152 | dataColumn = new DataColumn(); 153 | dataColumn.DataType = Type.GetType("System.Double"); 154 | dataColumn.ColumnName = reader.GetString(0); 155 | table.Columns.Add(dataColumn); 156 | 157 | channel_names.Add(dataColumn.ColumnName); 158 | } 159 | reader.Close(); 160 | m_sqlCmd.CommandText = "SELECT VarName, VarValue, Time_ms FROM logdata WHERE (VarName != '$RT_OFF$')"; 161 | reader = m_sqlCmd.ExecuteReader(); 162 | double tmpNum; 163 | DateTime d; 164 | int i = -1; 165 | while (reader.Read()) 166 | { 167 | tmpNum = reader.GetDouble(2) / 1000000.0; 168 | d = DateTime.FromOADate(tmpNum); //форматируем в дату-время 169 | DataRow dataRow = table.NewRow(); 170 | dataRow["Date Time"] = d.ToString() + "." + d.ToString("fff"); 171 | 172 | if (i == -1) { table.Rows.Add(dataRow); i++; table.Rows[i][reader.GetString(0)] = reader.GetDouble(1); timeList.Add(d); continue; } 173 | 174 | if (table.Rows[i]["Date Time"].ToString() != dataRow["Date Time"].ToString()) 175 | { 176 | table.Rows.Add(dataRow); 177 | timeList.Add(d); 178 | i++; 179 | } 180 | table.Rows[i][reader.GetString(0)] = reader.GetDouble(1); 181 | } 182 | reader.Close(); 183 | m_dbConn.Dispose(); 184 | goodRecCounter = table.Rows.Count; 185 | } 186 | 187 | // Парсинг CSV файла лога 188 | private void parse_data(object sender, DoWorkEventArgs e) 189 | { 190 | List list = new List(); 191 | try 192 | { // Чтение файла построчно в список 193 | StreamReader streamReader = new StreamReader(new FileStream(log_file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.Default); 194 | string item; 195 | while ( (item = streamReader.ReadLine()) != null ) 196 | { 197 | // totRecCounter++; // Общий счетчик строк для отображения на индикаторе прогресса 198 | list.Add(item); 199 | } 200 | totRecCounter = list.Count; //немного оптимизации, получим число записей сразу, без цикла 201 | } 202 | catch (Exception value) 203 | { 204 | MessageBox.Show("Cannot access the file. " + value.ToString()); 205 | return; 206 | } 207 | 208 | char c = ';'; // Скорее всего эта инициализация не нужна 209 | string text = list[0]; 210 | c = text.Split( new char[]{'"'} )[2][0]; // Получаем символ-разделитель элементов строки 211 | 212 | channel_names = new List(); // Список имен тегов 213 | timeList = new List(); // 214 | byte flag = 0; 215 | foreach (string text2 in list) // Цикл разбора списка на списки Имен тегов и Дата-Время 216 | { 217 | if (flag == 0) flag++; // сделано для пропуска первой строки в списке - Заголовок лога 218 | else 219 | { 220 | string[] array = text2.Split( new char[]{c} ); // Получаем массив элементов из строки списка лога 221 | if (array.Length == 5 && array[0].IndexOf("\"\"") == -1) // В строке должно быть 5 элементов и 222 | { 223 | string txtTagName = array[0].Replace("\"", ""); //Получаем имя тега без слэшей 224 | string txtTimems = array[4]; //Получаем значение время в мсек 225 | if (!channel_names.Contains(txtTagName) && !txtTagName.Equals("$RT_DIS$") && !txtTagName.Equals("$RT_COUNT$") && !txtTagName.Equals("$RT_OFF$")) 226 | { 227 | channel_names.Add(txtTagName); //Заносим в список имен если имя не служебный тег скады 228 | } 229 | if (!txtTagName.Equals("$RT_DIS$") && !txtTagName.Equals("$RT_COUNT$") && !txtTagName.Equals("$RT_OFF$")) 230 | { 231 | txtTimems = Regex.Replace(txtTimems, "[^\\d]", "");//Очищаем от НЕ цифр 232 | if (txtTimems.Length < 15) 233 | { 234 | int num2 = 15 - txtTimems.Length; 235 | for (int i = 0; i < num2; i++) 236 | { 237 | txtTimems += "0"; 238 | } 239 | } 240 | try 241 | { 242 | double num3 = double.Parse(txtTimems); // Конвертируем строку в число 243 | num3 /= 10000.0; 244 | num3 /= 1000000.0; 245 | DateTime item2 = DateTime.FromOADate(num3); //форматируем в дату-время 246 | if (!timeList.Contains(item2)) 247 | { 248 | // datapointCounter++; 249 | timeList.Add(item2); 250 | } 251 | } 252 | catch (Exception ex) 253 | { 254 | MessageBox.Show("Error 1." + ex.ToString()); 255 | } 256 | } 257 | } 258 | } 259 | } //EndOfForeach 260 | 261 | datapointCounter = timeList.Count; // получим число записей сразу, без цикла 262 | table = new DataTable(); 263 | DataColumn dataColumn = new DataColumn(); 264 | dataColumn.DataType = Type.GetType("System.String"); 265 | dataColumn.ColumnName = "Date Time"; 266 | table.Columns.Add(dataColumn); //добавляем столбец Дата-Время 267 | foreach (string columnName in channel_names) // Добавляем столбцы с тегами 268 | { 269 | dataColumn = new DataColumn(); 270 | dataColumn.DataType = Type.GetType("System.Double"); 271 | dataColumn.ColumnName = columnName; 272 | table.Columns.Add(dataColumn); 273 | } 274 | foreach (DateTime dateTime in timeList) // Добавляем в таблицу строки из списка Даты-Времени 275 | { 276 | DataRow dataRow = table.NewRow(); 277 | dataRow["Date Time"] = dateTime.ToString() + "." + dateTime.ToString("fff"); 278 | table.Rows.Add(dataRow); 279 | } 280 | flag = 0; 281 | foreach (string text5 in list) // 282 | { 283 | if (flag == 0) flag++; 284 | else 285 | { 286 | string[] array2 = text5.Split( new char[]{c} ); // Получаем массив элементов из строки списка лога 287 | if (array2.Length == 5 && array2[0].IndexOf("\"\"") == -1) 288 | { 289 | string text6 = array2[0].Replace("\"", ""); //Получаем имя тега без слэшей 290 | string text7 = array2[4]; //Получаем значение время в мсек 291 | string text8 = array2[2]; //Получаем значение Тега 292 | if (!text6.Equals("$RT_DIS$") && !text6.Equals("$RT_COUNT$") && !text6.Equals("$RT_OFF$")) 293 | { 294 | text7 = Regex.Replace(text7, "[^\\d]", ""); 295 | if (text7.Length < 15) 296 | { 297 | int num2 = 15 - text7.Length; 298 | for (int i = 0; i < num2; i++) 299 | { 300 | text7 += "0"; 301 | } 302 | } 303 | try 304 | { 305 | double num4 = double.Parse(text7); 306 | num4 /= 10000.0; 307 | num4 /= 1000000.0; 308 | DateTime item3 = DateTime.FromOADate(num4); 309 | double num5 = double.Parse(text8.Replace(string.Concat(Main.GetDecimalSep(text8)), CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator ?? "")); 310 | int index = timeList.IndexOf(item3); 311 | table.Rows[index][text6] = num5; 312 | // goodRecCounter++; 313 | } 314 | catch (Exception ex) 315 | { 316 | MessageBox.Show("Error 2. " + ex.ToString()); 317 | } 318 | } 319 | } 320 | } 321 | } //EndOfForeach 322 | goodRecCounter = table.Rows.Count; 323 | } 324 | 325 | // 326 | private void dataparsing_complete(object sender, RunWorkerCompletedEventArgs e) 327 | { 328 | if (goodRecCounter==0) 329 | { 330 | MessageBox.Show("LogFile contains no data"); 331 | panel1.Hide(); 332 | progress_timer.Enabled = false; 333 | return; 334 | } 335 | dataGridView_data.DataSource = table; 336 | dataGridView_data.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; 337 | int numColor = 0; 338 | foreach (string text in channel_names) 339 | { 340 | PointPairList pointPairList = new PointPairList(); 341 | int num2 = 0; 342 | foreach (DataRow dataRow in table.Rows) 343 | { 344 | if (dataRow[text].ToString() != "") 345 | { 346 | pointPairList.Add((double)num2, double.Parse(string.Concat(dataRow[text]))); 347 | } 348 | else if (num2 > 0) 349 | { 350 | pointPairList.Add((double)num2, pointPairList[num2 - 1].Y); 351 | } 352 | else 353 | { 354 | pointPairList.Add((double)num2, double.NaN); 355 | } 356 | num2++; 357 | } 358 | Color color = ColorTranslator.FromHtml(colors[numColor]); 359 | YAxis yaxis = new YAxis(text); 360 | DTrend.GraphPane.YAxisList.Add(yaxis); 361 | yaxis.Title.IsVisible = true; 362 | yaxis.Type = AxisType.Linear; 363 | yaxis.Color = Color.Black; //color; 364 | yaxis.Scale.FontSpec.Size = 10f; 365 | yaxis.Scale.FontSpec.FontColor = color; 366 | yaxis.IsVisible = true; 367 | yaxis.Scale.MaxAuto = true; 368 | yaxis.Scale.MinAuto = true; 369 | yaxis.MajorGrid.IsZeroLine = false; 370 | yaxis.MajorGrid.IsVisible = true; 371 | yaxis.MajorTic.IsInside = false; 372 | yaxis.MinorTic.IsInside = false; 373 | yaxis.MajorTic.IsOpposite = false; 374 | yaxis.MinorTic.IsOpposite = false; 375 | yaxis.Scale.Align = AlignP.Inside; 376 | yaxis.Title.FontSpec.Size = 10f; 377 | yaxis.Title.FontSpec.FontColor = color; 378 | 379 | LineItem lineItem = DTrend.GraphPane.AddCurve(text, pointPairList, color, SymbolType.None); 380 | lineItem.Line.IsOptimizedDraw = true; 381 | lineItem.Line.Width = 1f; 382 | lineItem.YAxisIndex = DTrend.GraphPane.YAxisList.IndexOf(text); 383 | dataGridView_data.Columns[text].DefaultCellStyle.ForeColor = color; 384 | ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(text); 385 | toolStripMenuItem.ForeColor = ColorTranslator.FromHtml(colors[numColor]); 386 | ToolStripMenuItem toolStripMenuItem2 = new ToolStripMenuItem("hide/show"); 387 | toolStripMenuItem2.Checked = true; 388 | toolStripMenuItem2.ForeColor = ColorTranslator.FromHtml(colors[numColor]); 389 | toolStripMenuItem2.Click += toggleViewCurve; 390 | toolStripMenuItem2.Paint += toolMnuItemChSta; 391 | ToolStripMenuItem toolStripMenuItem3 = new ToolStripMenuItem("change Y scale min/max"); 392 | toolStripMenuItem3.Click += setYminMax; 393 | toolStripMenuItem.DropDownItems.Add(toolStripMenuItem2); 394 | toolStripMenuItem.DropDownItems.Add(toolStripMenuItem3); 395 | hideshowcurveMenuItem.DropDownItems.Add(toolStripMenuItem); 396 | numColor++; 397 | } //EndOfForeach 398 | ToolStripMenuItem toolStripMnuItem = new ToolStripMenuItem("Show All/Hide All"); 399 | toolStripMnuItem.Checked = true; 400 | hideshowcurveMenuItem.DropDownItems.Add(toolStripMnuItem); 401 | toolStripMnuItem.Click += toggleAllCurves; 402 | string[] array = new string[timeList.Count]; 403 | 404 | int num3 = 0; 405 | foreach (DateTime dateTime in timeList) 406 | { 407 | array[num3] = dateTime.ToString().Replace(" ", "\n"); 408 | num3++; 409 | } 410 | DTrend.GraphPane.XAxis.Scale.Max = (double)num3; 411 | DTrend.GraphPane.XAxis.Scale.TextLabels = array; 412 | DTrend.GraphPane.XAxis.Type = AxisType.Text; 413 | DTrend.GraphPane.Title.IsVisible = false; 414 | DTrend.GraphPane.Legend.IsVisible = false; 415 | DTrend.GraphPane.AxisChange(); 416 | DTrend.Refresh(); 417 | panel1.Hide(); 418 | loadingpanel.Visible = false; 419 | progress_timer.Enabled = false; 420 | Text = Application.ProductName + " v" + Application.ProductVersion + " rec. " + goodRecCounter.ToString(); 421 | } 422 | 423 | // 424 | private void setYminMax(object sender, EventArgs e) 425 | { 426 | foreach (YAxis yaxis in DTrend.GraphPane.YAxisList) 427 | { 428 | if (yaxis.Title.Text.IndexOf(((ToolStripMenuItem)sender).OwnerItem.Text) != -1) 429 | { 430 | YScaleSettings yscaleSettings = new YScaleSettings(yaxis.Scale.Min, yaxis.Scale.Max, ((ToolStripMenuItem)sender).OwnerItem.Text); 431 | yscaleSettings.ShowDialog(); 432 | if (yscaleSettings.set) 433 | { 434 | yaxis.Scale.MaxAuto = false; 435 | yaxis.Scale.MinAuto = false; 436 | yaxis.Scale.Max = yscaleSettings.max; 437 | yaxis.Scale.Min = yscaleSettings.min; 438 | } 439 | } 440 | } 441 | DTrend.AxisChange(); 442 | DTrend.Refresh(); 443 | } 444 | 445 | //Устанавливает чек итема в соответствии с видимостью курвы 446 | private void toolMnuItemChSta(object sender, EventArgs e) 447 | { 448 | ((ToolStripMenuItem)sender).Checked = DTrend.GraphPane.CurveList[((ToolStripMenuItem)sender).OwnerItem.Text].IsVisible; 449 | } 450 | 451 | // Event handler for Dropdown MenuItem "show/hide ALL Curves" 452 | private void toggleAllCurves(object sender, EventArgs e) 453 | { 454 | ((ToolStripMenuItem)sender).Checked = !((ToolStripMenuItem)sender).Checked; 455 | foreach (YAxis yaxis in DTrend.GraphPane.YAxisList) 456 | { 457 | yaxis.IsVisible = ((ToolStripMenuItem)sender).Checked; 458 | DTrend.GraphPane.CurveList[yaxis.Title.Text].IsVisible = ((ToolStripMenuItem)sender).Checked; 459 | } 460 | DTrend.AxisChange(); 461 | DTrend.Refresh(); 462 | } 463 | // 464 | private void toggleViewCurve(object sender, EventArgs e) 465 | { 466 | ((ToolStripMenuItem)sender).Checked = !((ToolStripMenuItem)sender).Checked; 467 | DTrend.GraphPane.CurveList[((ToolStripMenuItem)sender).OwnerItem.Text].IsVisible = ((ToolStripMenuItem)sender).Checked; 468 | foreach (YAxis yaxis in DTrend.GraphPane.YAxisList) 469 | { 470 | if (yaxis.Title.Text.IndexOf(((ToolStripMenuItem)sender).OwnerItem.Text) != -1) 471 | { 472 | yaxis.IsVisible = ((ToolStripMenuItem)sender).Checked; 473 | } 474 | } 475 | DTrend.AxisChange(); 476 | DTrend.Refresh(); 477 | } 478 | 479 | // 480 | private static char GetDecimalSep(string input) 481 | { 482 | char[] array = input.ToCharArray(); 483 | foreach (char c in array) 484 | { 485 | if (!char.IsNumber(c) && c != '-') 486 | { 487 | return c; 488 | } 489 | } 490 | return '.'; 491 | } 492 | 493 | // 494 | private void togleTableToolStripMenuItem_Click(object sender, EventArgs e) 495 | { 496 | splitContainer1.Panel2Collapsed = !splitContainer1.Panel2Collapsed; 497 | griddatascroll(); 498 | 499 | if (!splitContainer1.Panel2Collapsed) 500 | togleTableToolStripMenuItem.BackColor = SystemColors.ControlDark; 501 | else 502 | togleTableToolStripMenuItem.BackColor = SystemColors.Control; 503 | } 504 | 505 | // 506 | private void lockunlockvzoomMenuItem_Click(object sender, EventArgs e) 507 | { 508 | DTrend.IsEnableVZoom = !DTrend.IsEnableVZoom; 509 | 510 | if (!DTrend.IsEnableVZoom) 511 | lockunlockvzoomMenuItem.BackColor = SystemColors.ControlDark; 512 | else 513 | lockunlockvzoomMenuItem.BackColor = SystemColors.Control; 514 | } 515 | 516 | // Toolbar Print button click 517 | private void printMenuItem_Click(object sender, EventArgs e) 518 | { 519 | DoPrint(); 520 | } 521 | 522 | // 523 | private void aboutMenuItem_Click(object sender, EventArgs e) 524 | { 525 | About about = new About(); 526 | about.ShowDialog(); 527 | about.Dispose(); 528 | } 529 | 530 | // 531 | private void ExitStripMenuItem_Click(object sender, EventArgs e) 532 | { 533 | Application.Exit(); 534 | } 535 | 536 | // Toolbar ToggleFullScreen Button Click 537 | private void fullscreenToolStripMenuItem_Click(object sender, EventArgs e) 538 | { 539 | if (FormBorderStyle == FormBorderStyle.Sizable) 540 | {; 541 | FormBorderStyle = FormBorderStyle.None; 542 | WindowState = FormWindowState.Maximized; 543 | } 544 | else 545 | { 546 | FormBorderStyle = FormBorderStyle.Sizable; 547 | WindowState = FormWindowState.Normal; 548 | } 549 | } 550 | 551 | // 552 | private void ControlsStripMenuItem_Click(object sender, EventArgs e) 553 | { 554 | controlPanel.Visible = !controlPanel.Visible; 555 | } 556 | 557 | // 558 | private void button_loclunlockvzoom_Click(object sender, EventArgs e) 559 | { 560 | DTrend.IsEnableVZoom = !DTrend.IsEnableVZoom; 561 | } 562 | 563 | // 564 | private void button_resetzoompan_Click(object sender, EventArgs e) 565 | { 566 | DTrend.RestoreScale(DTrend.GraphPane); 567 | } 568 | 569 | // 570 | private void button_zoomin_Click(object sender, EventArgs e) 571 | { 572 | DTrend.ZoomPane(DTrend.GraphPane, 0.9, default(PointF), false); 573 | } 574 | 575 | // 576 | private void button_zoomout_Click(object sender, EventArgs e) 577 | { 578 | DTrend.ZoomPane(DTrend.GraphPane, 1.1, default(PointF), false); 579 | } 580 | 581 | // 582 | private void button_panleft_Click(object sender, EventArgs e) 583 | { 584 | double num = (DTrend.GraphPane.XAxis.Scale.Max - DTrend.GraphPane.XAxis.Scale.Min) / 3.0; 585 | DTrend.GraphPane.XAxis.Scale.Min = DTrend.GraphPane.XAxis.Scale.Min - num; 586 | DTrend.GraphPane.XAxis.Scale.Max = DTrend.GraphPane.XAxis.Scale.Max - num; 587 | DTrend.AxisChange(); 588 | DTrend.Refresh(); 589 | } 590 | 591 | // 592 | private void button_panright_Click(object sender, EventArgs e) 593 | { 594 | double num = (DTrend.GraphPane.XAxis.Scale.Max - DTrend.GraphPane.XAxis.Scale.Min) / 3.0; 595 | DTrend.GraphPane.XAxis.Scale.Min = DTrend.GraphPane.XAxis.Scale.Min + num; 596 | DTrend.GraphPane.XAxis.Scale.Max = DTrend.GraphPane.XAxis.Scale.Max + num; 597 | DTrend.AxisChange(); 598 | DTrend.Refresh(); 599 | } 600 | 601 | // 602 | private void button_pantop_Click(object sender, EventArgs e) 603 | { 604 | double num = (DTrend.GraphPane.YAxis.Scale.Max - DTrend.GraphPane.YAxis.Scale.Min) / 3.0; 605 | foreach (YAxis yaxis in DTrend.GraphPane.YAxisList) 606 | { 607 | yaxis.Scale.Min = yaxis.Scale.Min + num; 608 | yaxis.Scale.Max = yaxis.Scale.Max + num; 609 | } 610 | DTrend.AxisChange(); 611 | DTrend.Refresh(); 612 | } 613 | 614 | // 615 | private void button_panbottom_Click(object sender, EventArgs e) 616 | { 617 | double num = (DTrend.GraphPane.YAxis.Scale.Max - DTrend.GraphPane.YAxis.Scale.Min) / 3.0; 618 | foreach (YAxis yaxis in DTrend.GraphPane.YAxisList) 619 | { 620 | yaxis.Scale.Min = yaxis.Scale.Min - num; 621 | yaxis.Scale.Max = yaxis.Scale.Max - num; 622 | } 623 | DTrend.AxisChange(); 624 | DTrend.Refresh(); 625 | } 626 | 627 | // ControlPad print button click 628 | private void button_print_Click(object sender, EventArgs e) 629 | { 630 | DoPrint(); 631 | } 632 | 633 | // 634 | private void DTrend_ZoomEvent(ZedGraphControl sender, ZoomState oldState, ZoomState newState) 635 | { 636 | griddatascroll(); 637 | } 638 | 639 | // 640 | private void griddatascroll() 641 | { 642 | if (!splitContainer1.Panel2Collapsed && dataGridView_data.Rows.Count > 0) 643 | { 644 | int num = (int)DTrend.GraphPane.XAxis.Scale.Min; 645 | if (num >= 0 && num <= dataGridView_data.Rows.Count) 646 | { 647 | dataGridView_data.FirstDisplayedScrollingRowIndex = num; 648 | return; 649 | } 650 | if (num >= dataGridView_data.Rows.Count - 1) 651 | { 652 | dataGridView_data.FirstDisplayedScrollingRowIndex = dataGridView_data.Rows.Count - 1; 653 | } 654 | } 655 | } 656 | 657 | // 658 | private void centerLoadingAnnimation() 659 | { 660 | if (loadingpanel.Visible) 661 | { 662 | loadingpictureBox.Location = new Point(loadingpanel.Width / 2 - loadingpictureBox.Width / 2, loadingpanel.Height / 2 - loadingpictureBox.Height / 2); 663 | progress_counter_textlabel.Location = new Point(loadingpanel.Width / 2 - progress_counter_textlabel.Width / 2, loadingpanel.Height / 2 - loadingpictureBox.Height / 2 + 66); 664 | } 665 | } 666 | 667 | // 668 | private void Main_Resize(object sender, EventArgs e) 669 | { 670 | centerLoadingAnnimation(); 671 | } 672 | 673 | // 674 | private void progress_timer_Tick(object sender, EventArgs e) 675 | { 676 | progress_counter_textlabel.Text = string.Concat(new object[] 677 | { 678 | totRecCounter, " | ", //Общее количество записей в файле 679 | datapointCounter, " | ", // 680 | goodRecCounter // 681 | }); 682 | centerLoadingAnnimation(); 683 | } 684 | 685 | // 686 | private void SaveCSVMenuItem_Click(object sender, EventArgs e) 687 | { 688 | if (dataGridView_data.RowCount <= 0) //test to see if the DataGridView has any rows 689 | { 690 | MessageBox.Show("DataGrid contains no data\nNothing to save :)"); 691 | return; 692 | } 693 | var sfd = new SaveFileDialog(); 694 | sfd.Filter = "CSV files (*.csv)|*.csv"; 695 | sfd.FileName = "table.csv"; 696 | if (sfd.ShowDialog() != DialogResult.OK) return; 697 | 698 | string value = String.Empty; 699 | StreamWriter swOut = new StreamWriter(sfd.FileName, false); 700 | 701 | foreach (DataGridViewColumn dc in dataGridView_data.Columns) 702 | { 703 | value += dc.Name + ";"; 704 | } 705 | value = value.Substring(0, value.Length - 1) + Environment.NewLine; 706 | swOut.Write(value); 707 | value = String.Empty; 708 | 709 | foreach (DataGridViewRow ddr in dataGridView_data.Rows) 710 | { 711 | if (ddr.IsNewRow) 712 | continue; 713 | foreach (DataGridViewCell dc in ddr.Cells) 714 | { 715 | if (dc.Value != null) 716 | { 717 | value += dc.Value.ToString() + ";"; 718 | } 719 | } 720 | value = value.Substring(0, value.Length - 1) + Environment.NewLine; 721 | swOut.Write(value); 722 | value = ""; 723 | } 724 | swOut.Close(); 725 | } 726 | 727 | // Массив цветов для графиков 728 | public string[] colors = new string[] 729 | { 730 | "#0000FF", // Blue ярко синий 731 | "#000000", // Black 732 | "#FF0000", // Red 733 | "#85A900", // 734 | "#006400", // DarkGreen 735 | "#FE8900", // 736 | "#95003A", // светло-фиолетовый 737 | "#FF0056", 738 | "#007DB5", // светло-голубой 739 | "#FF00F6", // 740 | "#FF937E", // 741 | "#6A826C", // 742 | "#FF029D", // 743 | "#010067" , // 744 | "#7A4782", 745 | "#7E2DD2", 746 | "#01FFFE", // Cyan #00FFFF 747 | "#00FF00", 748 | "#A42400", 749 | "#00AE7E", 750 | "#683D3B", 751 | "#BDC6FF", 752 | "#263400", 753 | "#BDD393", 754 | "#00B917", 755 | "#9E008E", 756 | "#001544", 757 | "#C28C9F", 758 | "#FF74A3", 759 | "#01D0FF", 760 | "#004754", 761 | "#E56FFE", 762 | "#788231", 763 | "#0E4CA1", 764 | "#91D0CB", 765 | "#BE9970", 766 | "#968AE8", 767 | "#BB8800", 768 | "#43002C", 769 | "#DEFF74", 770 | "#00FFC6", 771 | "#FFE502", 772 | "#620E00", 773 | "#008F9C", 774 | "#98FF52", 775 | "#7544B1", 776 | "#B500FF", 777 | "#00FF78", 778 | "#FF6E41", 779 | "#005F39", 780 | "#6B6882", 781 | "#5FAD4E", 782 | "#A75740", 783 | "#A5FFD2", 784 | "#FFB167", 785 | "#009BFF", 786 | "#E85EBE" 787 | }; 788 | 789 | // Имя открытого файла лога 790 | private string log_file = ""; 791 | // 792 | private SortedList data_graph = new SortedList(); 793 | // 794 | private DataTable table; 795 | // 796 | private List channel_names; 797 | // 798 | private List timeList; 799 | // Количество строк в файле лога 800 | private int totRecCounter; 801 | // Количество точек для графика 802 | private int datapointCounter; 803 | // Количество "полезных" записей (равно общее кол-во строк минус заголовок минус записи служебных тегов Скады) 804 | private int goodRecCounter; 805 | 806 | 807 | private void DoPrint() 808 | { 809 | using (PrintDocument printDocument = new PrintDocument()) 810 | { 811 | printDlg.Document = printDocument; 812 | printDlg.AllowSelection = true; 813 | printDlg.AllowSomePages = true; 814 | 815 | printDocument.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0); 816 | printDocument.OriginAtMargins = false; 817 | printDocument.DefaultPageSettings.Landscape = true; 818 | printDocument.PrintPage += delegate (object _, PrintPageEventArgs o) 819 | { 820 | double num = 39.370078740157481; 821 | Image image = DTrend.MasterPane.GetImage(); 822 | o.Graphics.DrawImage(image, (float)(1.0 * num), (float)(1.0 * num), (float)(27.0 * num), (float)(18.0 * num)); 823 | o.HasMorePages = false; 824 | }; 825 | if (printDlg.ShowDialog() == DialogResult.OK) 826 | printDocument.Print(); 827 | } 828 | } 829 | 830 | private void Selection_SelectionChangedEvent(object sender, EventArgs e) 831 | {//zedGraph.Selection 832 | foreach (LineItem curve in DTrend.GraphPane.CurveList) 833 | { 834 | if (curve.IsSelected) 835 | { 836 | curve.Line.Width = (curve.Line.Width == 1f) ? 3f : 1f; 837 | curve.IsSelected = false; 838 | } 839 | } 840 | } 841 | } 842 | } 843 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/Main.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | 124 | 132, 17 125 | 126 | 127 | 272, 17 128 | 129 | 130 | 405, 17 131 | 132 | 133 | 501, 17 134 | 135 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/NumTextBox.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Windows.Forms; 4 | 5 | namespace WinCCFlexLogViewer 6 | { 7 | public partial class NumTextBox : TextBox 8 | { 9 | private const int WM_PASTE = 0x0302; 10 | private bool ok = false; 11 | 12 | protected override void OnKeyPress(KeyPressEventArgs e) 13 | { 14 | base.OnKeyPress(e); 15 | 16 | if (e.KeyChar == '.' || e.KeyChar == ',') 17 | { 18 | e.KeyChar = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0]; 19 | } 20 | 21 | if (e.KeyChar != 22) 22 | 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("-"))); 23 | } 24 | 25 | protected override void WndProc(ref Message m) 26 | { 27 | if (m.Msg != WM_PASTE) 28 | { 29 | base.WndProc(ref m); // Handle all other messages normally 30 | } 31 | else 32 | { 33 | double value; 34 | if (double.TryParse(Clipboard.GetText(), out value)) 35 | { 36 | Text = value.ToString(); 37 | } 38 | else MessageBox.Show("Only Number Allowed", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); 39 | } 40 | } 41 | 42 | private double DblParse() 43 | { 44 | double d = 0.0; 45 | if (Text == String.Empty) 46 | { 47 | MessageBox.Show("Empty Value Not Allowed", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); 48 | ok = false; 49 | } 50 | else 51 | { 52 | ok = double.TryParse(this.Text, out d); 53 | if (ok == false) MessageBox.Show("Only Number Allowed", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); 54 | } 55 | return d; 56 | } 57 | 58 | public double DoubleVal 59 | { 60 | get 61 | { 62 | return DblParse(); 63 | } 64 | } 65 | 66 | public bool NumOK 67 | { 68 | get 69 | { 70 | return ok; 71 | } 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace WinCCFlexLogViewer 5 | { 6 | internal static class Program 7 | { 8 | [STAThread] 9 | private static void Main() 10 | { 11 | Application.EnableVisualStyles(); 12 | Application.SetCompatibleTextRenderingDefault(false); 13 | Application.Run(new Main()); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | using System.Reflection; 4 | using System.Runtime.CompilerServices; 5 | using System.Runtime.InteropServices; 6 | 7 | [assembly: AssemblyVersion("1.9.*")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: CompilationRelaxations(8)] 13 | [assembly: AssemblyCopyright("Copyright © 2018")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] 16 | [assembly: AssemblyProduct("WinCCFlexLogViewer")] 17 | [assembly: ComVisible(false)] 18 | [assembly: AssemblyFileVersion("1.9.1")] 19 | [assembly: AssemblyTitle("WinCCFlexLogViewer")] 20 | [assembly: Guid("6a71dd27-4f68-47f0-8074-655f5ca0c788")] 21 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace WinCCFlexLogViewer.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WinCCFlexLogViewer.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Looks up a localized resource of type System.Drawing.Bitmap. 65 | /// 66 | internal static System.Drawing.Bitmap fullscreen2 { 67 | get { 68 | object obj = ResourceManager.GetObject("fullscreen2", resourceCulture); 69 | return ((System.Drawing.Bitmap)(obj)); 70 | } 71 | } 72 | 73 | /// 74 | /// Looks up a localized resource of type System.Drawing.Bitmap. 75 | /// 76 | internal static System.Drawing.Bitmap glyphicons_115_list { 77 | get { 78 | object obj = ResourceManager.GetObject("glyphicons_115_list", resourceCulture); 79 | return ((System.Drawing.Bitmap)(obj)); 80 | } 81 | } 82 | 83 | /// 84 | /// Looks up a localized resource of type System.Drawing.Bitmap. 85 | /// 86 | internal static System.Drawing.Bitmap glyphicons_120_table { 87 | get { 88 | object obj = ResourceManager.GetObject("glyphicons_120_table", resourceCulture); 89 | return ((System.Drawing.Bitmap)(obj)); 90 | } 91 | } 92 | 93 | /// 94 | /// Looks up a localized resource of type System.Drawing.Bitmap. 95 | /// 96 | internal static System.Drawing.Bitmap glyphicons_142_database_plus { 97 | get { 98 | object obj = ResourceManager.GetObject("glyphicons_142_database_plus", resourceCulture); 99 | return ((System.Drawing.Bitmap)(obj)); 100 | } 101 | } 102 | 103 | /// 104 | /// Looks up a localized resource of type System.Drawing.Bitmap. 105 | /// 106 | internal static System.Drawing.Bitmap glyphicons_16_print { 107 | get { 108 | object obj = ResourceManager.GetObject("glyphicons_16_print", resourceCulture); 109 | return ((System.Drawing.Bitmap)(obj)); 110 | } 111 | } 112 | 113 | /// 114 | /// Looks up a localized resource of type System.Drawing.Bitmap. 115 | /// 116 | internal static System.Drawing.Bitmap glyphicons_196_circle_info { 117 | get { 118 | object obj = ResourceManager.GetObject("glyphicons_196_circle_info", resourceCulture); 119 | return ((System.Drawing.Bitmap)(obj)); 120 | } 121 | } 122 | 123 | /// 124 | /// Looks up a localized resource of type System.Drawing.Bitmap. 125 | /// 126 | internal static System.Drawing.Bitmap glyphicons_215_resize_small { 127 | get { 128 | object obj = ResourceManager.GetObject("glyphicons_215_resize_small", resourceCulture); 129 | return ((System.Drawing.Bitmap)(obj)); 130 | } 131 | } 132 | 133 | /// 134 | /// Looks up a localized resource of type System.Drawing.Bitmap. 135 | /// 136 | internal static System.Drawing.Bitmap glyphicons_217_circle_arrow_left { 137 | get { 138 | object obj = ResourceManager.GetObject("glyphicons_217_circle_arrow_left", resourceCulture); 139 | return ((System.Drawing.Bitmap)(obj)); 140 | } 141 | } 142 | 143 | /// 144 | /// Looks up a localized resource of type System.Drawing.Bitmap. 145 | /// 146 | internal static System.Drawing.Bitmap glyphicons_218_circle_arrow_right { 147 | get { 148 | object obj = ResourceManager.GetObject("glyphicons_218_circle_arrow_right", resourceCulture); 149 | return ((System.Drawing.Bitmap)(obj)); 150 | } 151 | } 152 | 153 | /// 154 | /// Looks up a localized resource of type System.Drawing.Bitmap. 155 | /// 156 | internal static System.Drawing.Bitmap glyphicons_219_circle_arrow_top { 157 | get { 158 | object obj = ResourceManager.GetObject("glyphicons_219_circle_arrow_top", resourceCulture); 159 | return ((System.Drawing.Bitmap)(obj)); 160 | } 161 | } 162 | 163 | /// 164 | /// Looks up a localized resource of type System.Drawing.Bitmap. 165 | /// 166 | internal static System.Drawing.Bitmap glyphicons_220_circle_arrow_down { 167 | get { 168 | object obj = ResourceManager.GetObject("glyphicons_220_circle_arrow_down", resourceCulture); 169 | return ((System.Drawing.Bitmap)(obj)); 170 | } 171 | } 172 | 173 | /// 174 | /// Looks up a localized resource of type System.Drawing.Bitmap. 175 | /// 176 | internal static System.Drawing.Bitmap glyphicons_237_zoom_in { 177 | get { 178 | object obj = ResourceManager.GetObject("glyphicons_237_zoom_in", resourceCulture); 179 | return ((System.Drawing.Bitmap)(obj)); 180 | } 181 | } 182 | 183 | /// 184 | /// Looks up a localized resource of type System.Drawing.Bitmap. 185 | /// 186 | internal static System.Drawing.Bitmap glyphicons_238_zoom_out { 187 | get { 188 | object obj = ResourceManager.GetObject("glyphicons_238_zoom_out", resourceCulture); 189 | return ((System.Drawing.Bitmap)(obj)); 190 | } 191 | } 192 | 193 | /// 194 | /// Looks up a localized resource of type System.Drawing.Bitmap. 195 | /// 196 | internal static System.Drawing.Bitmap glyphicons_242_flash { 197 | get { 198 | object obj = ResourceManager.GetObject("glyphicons_242_flash", resourceCulture); 199 | return ((System.Drawing.Bitmap)(obj)); 200 | } 201 | } 202 | 203 | /// 204 | /// Looks up a localized resource of type System.Drawing.Bitmap. 205 | /// 206 | internal static System.Drawing.Bitmap glyphicons_389_exit { 207 | get { 208 | object obj = ResourceManager.GetObject("glyphicons_389_exit", resourceCulture); 209 | return ((System.Drawing.Bitmap)(obj)); 210 | } 211 | } 212 | 213 | /// 214 | /// Looks up a localized resource of type System.Drawing.Bitmap. 215 | /// 216 | internal static System.Drawing.Bitmap glyphicons_589_remote_control_tv { 217 | get { 218 | object obj = ResourceManager.GetObject("glyphicons_589_remote_control_tv", resourceCulture); 219 | return ((System.Drawing.Bitmap)(obj)); 220 | } 221 | } 222 | 223 | /// 224 | /// Looks up a localized resource of type System.Drawing.Bitmap. 225 | /// 226 | internal static System.Drawing.Bitmap loading { 227 | get { 228 | object obj = ResourceManager.GetObject("loading", resourceCulture); 229 | return ((System.Drawing.Bitmap)(obj)); 230 | } 231 | } 232 | 233 | /// 234 | /// Looks up a localized resource of type System.Drawing.Bitmap. 235 | /// 236 | internal static System.Drawing.Bitmap logo { 237 | get { 238 | object obj = ResourceManager.GetObject("logo", resourceCulture); 239 | return ((System.Drawing.Bitmap)(obj)); 240 | } 241 | } 242 | 243 | /// 244 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 245 | /// 246 | internal static System.Drawing.Icon logo1 { 247 | get { 248 | object obj = ResourceManager.GetObject("logo1", resourceCulture); 249 | return ((System.Drawing.Icon)(obj)); 250 | } 251 | } 252 | 253 | /// 254 | /// Looks up a localized resource of type System.Drawing.Bitmap. 255 | /// 256 | internal static System.Drawing.Bitmap save_64 { 257 | get { 258 | object obj = ResourceManager.GetObject("save_64", resourceCulture); 259 | return ((System.Drawing.Bitmap)(obj)); 260 | } 261 | } 262 | } 263 | } 264 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace WinCCFlexLogViewer.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/Resources/fullscreen2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yuriqdev/WinCCflexLogViewer/bc8c728e3a63871747c461b7e6d468a572b63f6b/WinCCFlexArchViewer/Resources/fullscreen2.png -------------------------------------------------------------------------------- /WinCCFlexArchViewer/Resources/save_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yuriqdev/WinCCflexLogViewer/bc8c728e3a63871747c461b7e6d468a572b63f6b/WinCCFlexArchViewer/Resources/save_64.png -------------------------------------------------------------------------------- /WinCCFlexArchViewer/WinCCFlexArchViewer.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yuriqdev/WinCCflexLogViewer/bc8c728e3a63871747c461b7e6d468a572b63f6b/WinCCFlexArchViewer/WinCCFlexArchViewer.ico -------------------------------------------------------------------------------- /WinCCFlexArchViewer/WinCCFlexLogViewer.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | x86 7 | {4709856B-B2D9-4827-BADC-D0D7B4A64849} 8 | WinExe 9 | Properties 10 | WinCCFlexLogViewer 11 | WinCCFlexLogViewer 12 | v3.5 13 | 512 14 | app.manifest 15 | WinCCFlexArchViewer.ico 16 | WinCCFlexLogViewer.Program 17 | 18 | false 19 | 20 | 21 | publish\ 22 | true 23 | Disk 24 | false 25 | Foreground 26 | 7 27 | Days 28 | false 29 | false 30 | true 31 | 0 32 | 1.0.0.%2a 33 | false 34 | true 35 | 36 | 37 | x86 38 | true 39 | full 40 | true 41 | bin\Debug\ 42 | DEBUG;TRACE 43 | prompt 44 | 4 45 | false 46 | 47 | 48 | AnyCPU 49 | pdbonly 50 | true 51 | bin\Release\ 52 | TRACE 53 | prompt 54 | 4 55 | false 56 | 57 | 58 | 59 | 60 | 61 | ..\packages\System.Data.SQLite.Core.1.0.108.0\lib\net20\System.Data.SQLite.dll 62 | True 63 | 64 | 65 | 66 | 67 | ..\packages\ZedGraph.5.1.7\lib\net35-Client\ZedGraph.dll 68 | True 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | Form 77 | 78 | 79 | About.cs 80 | 81 | 82 | Form 83 | 84 | 85 | Main.cs 86 | 87 | 88 | Component 89 | 90 | 91 | 92 | 93 | Resources.resx 94 | True 95 | True 96 | 97 | 98 | Settings.settings 99 | True 100 | True 101 | 102 | 103 | Form 104 | 105 | 106 | YScaleSettings.cs 107 | 108 | 109 | 110 | 111 | About.cs 112 | 113 | 114 | Main.cs 115 | 116 | 117 | ResXFileCodeGenerator 118 | Resources.Designer.cs 119 | 120 | 121 | YScaleSettings.cs 122 | 123 | 124 | 125 | 126 | 127 | 128 | Designer 129 | 130 | 131 | SettingsSingleFileGenerator 132 | Settings.Designer.cs 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | False 142 | .NET Framework 3.5 SP1 143 | true 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. 154 | 155 | 156 | 157 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/YScaleSettings.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace WinCCFlexLogViewer 2 | { 3 | public partial class YScaleSettings : System.Windows.Forms.Form 4 | { 5 | protected override void Dispose(bool disposing) 6 | { 7 | if (disposing && components != null) 8 | { 9 | components.Dispose(); 10 | } 11 | base.Dispose(disposing); 12 | } 13 | 14 | // 15 | private void InitializeComponent() 16 | { 17 | this.channel_name_label = new System.Windows.Forms.Label(); 18 | this.btnSet = new System.Windows.Forms.Button(); 19 | this.btnCancel = new System.Windows.Forms.Button(); 20 | this.channel_Y_min_label = new System.Windows.Forms.Label(); 21 | this.channel_Y_max_label = new System.Windows.Forms.Label(); 22 | this.channel_Y_max_input = new WinCCFlexLogViewer.NumTextBox(); 23 | this.channel_Y_min_input = new WinCCFlexLogViewer.NumTextBox(); 24 | this.SuspendLayout(); 25 | // 26 | // channel_name_label 27 | // 28 | this.channel_name_label.AutoSize = true; 29 | this.channel_name_label.Location = new System.Drawing.Point(5, 9); 30 | this.channel_name_label.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); 31 | this.channel_name_label.Name = "channel_name_label"; 32 | this.channel_name_label.Size = new System.Drawing.Size(75, 13); 33 | this.channel_name_label.TabIndex = 0; 34 | this.channel_name_label.Text = "Channel name"; 35 | // 36 | // btnSet 37 | // 38 | this.btnSet.Location = new System.Drawing.Point(12, 79); 39 | this.btnSet.Name = "btnSet"; 40 | this.btnSet.Size = new System.Drawing.Size(75, 23); 41 | this.btnSet.TabIndex = 1; 42 | this.btnSet.Text = "Set"; 43 | this.btnSet.UseVisualStyleBackColor = true; 44 | this.btnSet.Click += new System.EventHandler(this.btnSet_Click); 45 | // 46 | // btnCancel 47 | // 48 | this.btnCancel.Location = new System.Drawing.Point(93, 79); 49 | this.btnCancel.Name = "btnCancel"; 50 | this.btnCancel.Size = new System.Drawing.Size(75, 23); 51 | this.btnCancel.TabIndex = 2; 52 | this.btnCancel.Text = "Cancel"; 53 | this.btnCancel.UseVisualStyleBackColor = true; 54 | this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); 55 | // 56 | // channel_Y_min_label 57 | // 58 | this.channel_Y_min_label.AutoSize = true; 59 | this.channel_Y_min_label.Location = new System.Drawing.Point(12, 34); 60 | this.channel_Y_min_label.Name = "channel_Y_min_label"; 61 | this.channel_Y_min_label.Size = new System.Drawing.Size(37, 13); 62 | this.channel_Y_min_label.TabIndex = 5; 63 | this.channel_Y_min_label.Text = "Y Min:"; 64 | // 65 | // channel_Y_max_label 66 | // 67 | this.channel_Y_max_label.AutoSize = true; 68 | this.channel_Y_max_label.Location = new System.Drawing.Point(12, 56); 69 | this.channel_Y_max_label.Name = "channel_Y_max_label"; 70 | this.channel_Y_max_label.Size = new System.Drawing.Size(40, 13); 71 | this.channel_Y_max_label.TabIndex = 6; 72 | this.channel_Y_max_label.Text = "Y Max:"; 73 | // 74 | // channel_Y_max_input 75 | // 76 | this.channel_Y_max_input.Location = new System.Drawing.Point(55, 53); 77 | this.channel_Y_max_input.Name = "channel_Y_max_input"; 78 | this.channel_Y_max_input.Size = new System.Drawing.Size(100, 20); 79 | this.channel_Y_max_input.TabIndex = 4; 80 | this.channel_Y_max_input.Text = "0"; 81 | this.channel_Y_max_input.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; 82 | this.channel_Y_max_input.WordWrap = false; 83 | // 84 | // channel_Y_min_input 85 | // 86 | this.channel_Y_min_input.Location = new System.Drawing.Point(55, 31); 87 | this.channel_Y_min_input.Name = "channel_Y_min_input"; 88 | this.channel_Y_min_input.Size = new System.Drawing.Size(100, 20); 89 | this.channel_Y_min_input.TabIndex = 3; 90 | this.channel_Y_min_input.Text = "0"; 91 | this.channel_Y_min_input.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; 92 | this.channel_Y_min_input.WordWrap = false; 93 | // 94 | // YScaleSettings 95 | // 96 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 97 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 98 | this.ClientSize = new System.Drawing.Size(184, 112); 99 | this.Controls.Add(this.channel_Y_max_label); 100 | this.Controls.Add(this.channel_Y_min_label); 101 | this.Controls.Add(this.channel_Y_max_input); 102 | this.Controls.Add(this.channel_Y_min_input); 103 | this.Controls.Add(this.btnCancel); 104 | this.Controls.Add(this.btnSet); 105 | this.Controls.Add(this.channel_name_label); 106 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; 107 | this.MaximizeBox = false; 108 | this.MinimizeBox = false; 109 | this.Name = "YScaleSettings"; 110 | this.ShowIcon = false; 111 | this.ShowInTaskbar = false; 112 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 113 | this.Text = " Y scale settings"; 114 | this.ResumeLayout(false); 115 | this.PerformLayout(); 116 | 117 | } 118 | // 119 | private System.ComponentModel.IContainer components; 120 | // 121 | private System.Windows.Forms.Label channel_name_label; 122 | // 123 | private System.Windows.Forms.Button btnSet; 124 | // 125 | private System.Windows.Forms.Button btnCancel; 126 | // 127 | private NumTextBox channel_Y_min_input; 128 | // 129 | private NumTextBox channel_Y_max_input; 130 | // 131 | private System.Windows.Forms.Label channel_Y_min_label; 132 | // 133 | private System.Windows.Forms.Label channel_Y_max_label; 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/YScaleSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace WinCCFlexLogViewer 5 | { 6 | public partial class YScaleSettings : Form 7 | { 8 | public YScaleSettings(double min, double max, string c_name) 9 | { 10 | InitializeComponent(); 11 | channel_name_label.Text = c_name; 12 | channel_Y_min_input.Text = string.Concat(min); 13 | channel_Y_max_input.Text = string.Concat(max); 14 | } 15 | 16 | private void btnSet_Click(object sender, EventArgs e) 17 | { 18 | min = channel_Y_min_input.DoubleVal; 19 | max = channel_Y_max_input.DoubleVal; 20 | if (channel_Y_min_input.NumOK == true & channel_Y_max_input.NumOK == true) 21 | { 22 | set = true; 23 | Close(); 24 | } 25 | } 26 | 27 | private void btnCancel_Click(object sender, EventArgs e) 28 | { 29 | set = false; 30 | Close(); 31 | } 32 | // 33 | public double min; 34 | // 35 | public double max; 36 | // 37 | public bool set; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/YScaleSettings.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/app.manifest: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /WinCCFlexArchViewer/bin/Release/System.Data.SQLite.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yuriqdev/WinCCflexLogViewer/bc8c728e3a63871747c461b7e6d468a572b63f6b/WinCCFlexArchViewer/bin/Release/System.Data.SQLite.dll -------------------------------------------------------------------------------- /WinCCFlexArchViewer/bin/Release/WinCCFlexLogViewer.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yuriqdev/WinCCflexLogViewer/bc8c728e3a63871747c461b7e6d468a572b63f6b/WinCCFlexArchViewer/bin/Release/WinCCFlexLogViewer.exe -------------------------------------------------------------------------------- /WinCCFlexArchViewer/bin/Release/ZedGraph.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yuriqdev/WinCCflexLogViewer/bc8c728e3a63871747c461b7e6d468a572b63f6b/WinCCFlexArchViewer/bin/Release/ZedGraph.dll -------------------------------------------------------------------------------- /WinCCFlexArchViewer/bin/Release/x64/SQLite.Interop.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yuriqdev/WinCCflexLogViewer/bc8c728e3a63871747c461b7e6d468a572b63f6b/WinCCFlexArchViewer/bin/Release/x64/SQLite.Interop.dll -------------------------------------------------------------------------------- /WinCCFlexArchViewer/bin/Release/x86/SQLite.Interop.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yuriqdev/WinCCflexLogViewer/bc8c728e3a63871747c461b7e6d468a572b63f6b/WinCCFlexArchViewer/bin/Release/x86/SQLite.Interop.dll -------------------------------------------------------------------------------- /WinCCFlexArchViewer/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /WinCCFlexLogViewer.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.25420.1 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinCCFlexLogViewer", "WinCCFlexArchViewer\WinCCFlexLogViewer.csproj", "{4709856B-B2D9-4827-BADC-D0D7B4A64849}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Debug|Mixed Platforms = Debug|Mixed Platforms 12 | Debug|x86 = Debug|x86 13 | Release|Any CPU = Release|Any CPU 14 | Release|Mixed Platforms = Release|Mixed Platforms 15 | Release|x86 = Release|x86 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {4709856B-B2D9-4827-BADC-D0D7B4A64849}.Debug|Any CPU.ActiveCfg = Debug|x86 19 | {4709856B-B2D9-4827-BADC-D0D7B4A64849}.Debug|Any CPU.Build.0 = Debug|x86 20 | {4709856B-B2D9-4827-BADC-D0D7B4A64849}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 21 | {4709856B-B2D9-4827-BADC-D0D7B4A64849}.Debug|Mixed Platforms.Build.0 = Debug|x86 22 | {4709856B-B2D9-4827-BADC-D0D7B4A64849}.Debug|x86.ActiveCfg = Debug|x86 23 | {4709856B-B2D9-4827-BADC-D0D7B4A64849}.Debug|x86.Build.0 = Debug|x86 24 | {4709856B-B2D9-4827-BADC-D0D7B4A64849}.Release|Any CPU.ActiveCfg = Release|x86 25 | {4709856B-B2D9-4827-BADC-D0D7B4A64849}.Release|Any CPU.Build.0 = Release|x86 26 | {4709856B-B2D9-4827-BADC-D0D7B4A64849}.Release|Mixed Platforms.ActiveCfg = Release|x86 27 | {4709856B-B2D9-4827-BADC-D0D7B4A64849}.Release|Mixed Platforms.Build.0 = Release|x86 28 | {4709856B-B2D9-4827-BADC-D0D7B4A64849}.Release|x86.ActiveCfg = Release|x86 29 | {4709856B-B2D9-4827-BADC-D0D7B4A64849}.Release|x86.Build.0 = Release|x86 30 | EndGlobalSection 31 | GlobalSection(SolutionProperties) = preSolution 32 | HideSolutionNode = FALSE 33 | EndGlobalSection 34 | EndGlobal 35 | -------------------------------------------------------------------------------- /changelog.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yuriqdev/WinCCflexLogViewer/bc8c728e3a63871747c461b7e6d468a572b63f6b/changelog.txt --------------------------------------------------------------------------------