コード例 #1
0
        // 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;
            });
        }
コード例 #2
0
        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;
                });
            }
        }