// Simulation Button private void SimulationButton(object sender, RoutedEventArgs e) { select_TEM = TEMRadioButton.IsChecked == true; select_STEM = STEMRadioButton.IsChecked == true; select_CBED = CBEDRadioButton.IsChecked == true; if (!TestSimulationPrerequisites()) { return; } Application.Current.Resources["Accent"] = Application.Current.Resources["ErrorColOrig"]; CurrentResolution = Resolution; CurrentPixelScale = pixelScale; CurrentWavelength = wavelength; CurrentVoltage = ImagingParameters.kilovoltage; // DiffDisplay.tCanvas.Width = CurrentResolution; // DiffDisplay.tCanvas.Height = CurrentResolution; SimulateEWButton.IsEnabled = false; SimulateImageButton.IsEnabled = false; var TDSruns = 1; if (select_STEM) { TDSruns = Convert.ToInt32(STEM_TDSCounts.Text); } else if (select_CBED) { TDSruns = Convert.ToInt32(CBED_TDSCounts.Text); } this.cancellationTokenSource = new CancellationTokenSource(); var cancellationToken = this.cancellationTokenSource.Token; var progressReporter = new ProgressReporter(); // Pull options from dialog Single.TryParse(SliceDz.Text, out dz); Int32.TryParse(Full3DIntegrals.Text, out integrals); CancelButton.IsEnabled = false; var task = Task.Factory.StartNew(() => { Thread.CurrentThread.Priority = ThreadPriority.Normal; var timer = new Stopwatch(); // Upload Simulation Parameters to c++ class mCL.setCTEMParams(ImagingParameters.df, ImagingParameters.astigmag, ImagingParameters.astigang, ImagingParameters.kilovoltage, ImagingParameters.spherical, ImagingParameters.beta, ImagingParameters.delta, ImagingParameters.aperturemrad, ImagingParameters.astig2mag, ImagingParameters.astig2ang, ImagingParameters.b2mag, ImagingParameters.b2ang); mCL.setSTEMParams(ProbeParameters.df, ProbeParameters.astigmag, ProbeParameters.astigang, ProbeParameters.kilovoltage, ProbeParameters.spherical, ProbeParameters.beta, ProbeParameters.delta, ProbeParameters.aperturemrad); SimulationMethod(select_TEM, select_STEM, select_CBED, TDSruns, ref progressReporter, ref timer, ref cancellationToken); }, cancellationToken); // This runs on UI Thread so can access UI, probably better way of doing image though. //SimWorker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args) progressReporter.RegisterContinuation(task, () => { CancelButton.IsEnabled = false; ProgressBar1.Value = 100; ProgressBar2.Value = 100; if (select_STEM) { if (LockedDetectors.Count == 0) { SimulateEWButton.IsEnabled = true; return; } foreach (var i in LockedDetectors) { UpdateDetectorImage(i); } // just select the first tab for convenience LockedDetectors[0].Tab.IsSelected = true; SaveImageButton.IsEnabled = true; } else if (select_CBED) { UpdateTDSImage(); SaveImageButton2.IsEnabled = true; } else { UpdateEWImage(); EWDisplay.Tab.IsSelected = true; UpdateDiffractionImage(); SaveImageButton.IsEnabled = true; SaveImageButton2.IsEnabled = true; SimulateImageButton.IsEnabled = true; } Application.Current.Resources["Accent"] = Application.Current.Resources["AccentOrig"]; SimulateEWButton.IsEnabled = true; }); }
private void ImportStructureButton(object sender, RoutedEventArgs e) { var openDialog = new Microsoft.Win32.OpenFileDialog { FileName = "file name", DefaultExt = ".xyz", Filter = "XYZ Coordinates (.xyz)|*.xyz" }; // Set defaults for file dialog. var result = openDialog.ShowDialog(); if (result == true) { var fName = openDialog.FileName; fileNameLabel.Text = System.IO.Path.GetFileName(fName); fileNameLabel.ToolTip = fName; // Now pass filename through to unmanaged where atoms can be imported inside structure class... mCL.importStructure(openDialog.FileName); mCL.uploadParameterisation(); // Update some dialogs if everything went OK. var Len = 0; float MinX = 0; float MinY = 0; float MinZ = 0; float MaxX = 0; float MaxY = 0; float MaxZ = 0; mCL.getStructureDetails(ref Len, ref MinX, ref MinY, ref MinZ, ref MaxX, ref MaxY, ref MaxZ); HaveStructure = true; WidthLabel.Content = (MaxX - MinX).ToString("f2") + " Å"; HeightLabel.Content = (MaxY - MinY).ToString("f2") + " Å"; DepthLabel.Content = (MaxZ - MinZ).ToString("f2") + " Å"; AtomNoLabel.Content = Len.ToString(); if (!userSTEMarea) { STEMRegion.xFinish = Convert.ToSingle((MaxX - MinX).ToString("f2")); STEMRegion.yFinish = Convert.ToSingle((MaxY - MinY).ToString("f2")); } if (!userSIMarea) { SimRegion.xFinish = Convert.ToSingle((MaxX - MinX).ToString("f2")); SimRegion.yFinish = Convert.ToSingle((MaxY - MinY).ToString("f2")); } UpdatePx(); // Now we want to sorting the atoms ready for the simulation process do this in a background worker... this.cancellationTokenSource = new CancellationTokenSource(); var cancellationToken = this.cancellationTokenSource.Token; var progressReporter = new ProgressReporter(); var task = Task.Factory.StartNew(() => { // This is where we start sorting the atoms in the background ready to be processed later... mCL.sortStructure(false); return(0); }, cancellationToken); // This runs on UI Thread so can access UI, probably better way of doing image though. progressReporter.RegisterContinuation(task, () => { IsSorted = true; }); } }