using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; using System.IO; using KinectServer; namespace LiveScanPlayer { public partial class PlayerWindowForm : Form { BindingList lFrameFiles = new BindingList(); bool bPlayerRunning = false; List lAllVertices = new List(); List lAllColors = new List(); TransferServer oTransferServer = new TransferServer(); AutoResetEvent eUpdateWorkerFinished = new AutoResetEvent(false); public PlayerWindowForm() { InitializeComponent(); oTransferServer.lVertices = lAllVertices; oTransferServer.lColors = lAllColors; lFrameFilesListView.Columns.Add("Current frame", 75); lFrameFilesListView.Columns.Add("Filename", 300); } private void PlayerWindowForm_FormClosing(object sender, FormClosingEventArgs e) { bPlayerRunning = false; oTransferServer.StopServer(); } private void btSelect_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Multiselect = true; dialog.ShowDialog(); lock (lFrameFiles) { for (int i = 0; i < dialog.FileNames.Length; i++) { lFrameFiles.Add(new FrameFileReaderBin(dialog.FileNames[i])); var item = new ListViewItem(new [] { "0", dialog.FileNames[i]}); lFrameFilesListView.Items.Add(item); } } } private void btnSelectPly_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Multiselect = true; dialog.ShowDialog(); if (dialog.FileNames.Length == 0) return; lock (lFrameFiles) { lFrameFiles.Add(new FrameFileReaderPly(dialog.FileNames)); var item = new ListViewItem(new[] { "0", Path.GetDirectoryName(dialog.FileNames[0]) }); lFrameFilesListView.Items.Add(item); } } private void btStart_Click(object sender, EventArgs e) { bPlayerRunning = !bPlayerRunning; if (bPlayerRunning) { oTransferServer.StartServer(); updateWorker.RunWorkerAsync(); btStart.Text = "Stop player"; } else { oTransferServer.StopServer(); btStart.Text = "Start player"; eUpdateWorkerFinished.WaitOne(); } } private void btRemove_Click(object sender, EventArgs e) { if (lFrameFilesListView.SelectedIndices.Count == 0) return; lock (lFrameFiles) { int idx = lFrameFilesListView.SelectedIndices[0]; lFrameFilesListView.Items.RemoveAt(idx); lFrameFiles.RemoveAt(idx); } } private void btRewind_Click(object sender, EventArgs e) { lock (lFrameFiles) { for (int i = 0; i < lFrameFiles.Count; i++) { lFrameFiles[i].Rewind(); lFrameFilesListView.Items[i].Text = "0"; } } } private void btShow_Click(object sender, EventArgs e) { if (!OpenGLWorker.IsBusy) OpenGLWorker.RunWorkerAsync(); } private void updateWorker_DoWork(object sender, DoWorkEventArgs e) { int curFrameIdx = 0; string outDir = "outPlayer\\"; DirectoryInfo di = Directory.CreateDirectory(outDir); while (bPlayerRunning) { Thread.Sleep(50); List tempAllVertices = new List(); List tempAllColors = new List(); lock (lFrameFiles) { for (int i = 0; i < lFrameFiles.Count; i++) { List vertices = new List(); List colors = new List(); lFrameFiles[i].ReadFrame(vertices, colors); tempAllVertices.AddRange(vertices); tempAllColors.AddRange(colors); } } Thread frameIdxUpdate = new Thread(() => this.Invoke((MethodInvoker)delegate { this.UpdateDisplayedFrameIndices(); })); frameIdxUpdate.Start(); lock (lAllVertices) { lAllVertices.Clear(); lAllColors.Clear(); lAllVertices.AddRange(tempAllVertices); lAllColors.AddRange(tempAllColors); } if (chSaveFrames.Checked) SaveCurrentFrameToFile(outDir, curFrameIdx); curFrameIdx++; } eUpdateWorkerFinished.Set(); } private void OpenGLWorker_DoWork(object sender, DoWorkEventArgs e) { OpenGLWindow openGLWindow = new OpenGLWindow(); openGLWindow.vertices = lAllVertices; openGLWindow.colors = lAllColors; openGLWindow.Run(); } private void lFrameFilesListView_DoubleClick(object sender, EventArgs e) { lFrameFilesListView.SelectedItems[0].BeginEdit(); } private void lFrameFilesListView_AfterLabelEdit(object sender, LabelEditEventArgs e) { int fileIdx = lFrameFilesListView.SelectedIndices[0]; int frameIdx; bool res = Int32.TryParse(e.Label, out frameIdx); if (!res) { e.CancelEdit = true; return; } lock (lFrameFiles) { lFrameFiles[fileIdx].JumpToFrame(frameIdx); } } private void UpdateDisplayedFrameIndices() { lock (lFrameFiles) { for (int i = 0; i < lFrameFiles.Count; i++) { lFrameFilesListView.Items[i].SubItems[0].Text = lFrameFiles[i].frameIdx.ToString(); } } } private void SaveCurrentFrameToFile(string outDir, int frameIdx) { List lVertices = new List(); List lColors = new List(); lock (lAllVertices) { lVertices.AddRange(lAllVertices); lColors.AddRange(lAllColors); } string outputFilename = outDir + frameIdx.ToString().PadLeft(5, '0') + ".ply"; Utils.saveToPly(outputFilename, lVertices, lColors, true); } } }