private void MainWindow_Loaded(object sender, RoutedEventArgs e) { // Prepare data in arrays const int N = 100; double[] x = new double[N]; double[] y = new double[N]; for (int i = 0; i < N; i++) { x[i] = i * 0.1; y[i] = Math.Cos(x[i]); } // Add data sources: var yDataSource = new EnumerableDataSource<double>(y); yDataSource.SetYMapping(Y => Y); yDataSource.AddMapping(ShapeElementPointMarker.ToolTipTextProperty, Y => string.Format("Value is {0}", Y)); var xDataSource = new EnumerableDataSource<double>(x); xDataSource.SetXMapping(X => X); CompositeDataSource compositeDataSource = new CompositeDataSource(xDataSource, yDataSource); Matrix m = Matrix.Identity; m.RotateAt(45, 10, 10); line = new LineGraph { Stroke = Brushes.Green, StrokeThickness = 2, DataTransform = //new MatrixDataTransform(m) new RotateDataTransform(45.0.DegreesToRadians()) }; line.DataSource = compositeDataSource; line.AddToPlotter(plotter); plotter.Viewport.Constraints.Add(new PhysicalProportionsConstraint { ProportionRatio = 1 }); // adding graph to plotter plotter.AddLineGraph(compositeDataSource, new Pen(Brushes.Goldenrod, 3), new SampleMarker(), new PenDescription("Cosine")); //plotter.Viewport.FitToViewRestrictions.Add(new FollowDataWidthRestriction { Width = 1 }); plotter.PreviewKeyDown += plotter_KeyDown; }
private bool InitTimeTraceMeasurements() { #region SMU, rendering and save data configurations if (sourceDeviceConfiguration != null) { #region Chart rendering settings if (_TimeTraceLineGraph != null) { _experimentalTimeTraceDataSource.DetachPointReceiveEvent(); _TimeTraceLineGraph.Remove(); _CurrentTimeTrace.Clear(); } _CurrentTimeTrace = new List<PointD>(); _experimentalTimeTraceDataSource = new ExperimentalTimetraceDataSource(_CurrentTimeTrace); _experimentalTimeTraceDataSource.AttachPointReceiveEvent(); _TimeTraceLineGraph = new LineGraph(_experimentalTimeTraceDataSource); _TimeTraceLineGraph.AddToPlotter(chartTimeTrace); #endregion //Getting SMU device Device = sourceDeviceConfiguration.Keithley2602A_DeviceSettings.Device; #region Time trace measurement configuration var pAddress = sourceDeviceConfiguration.Keithley2602A_DeviceSettings.DeviceSettings.PrimaryAddress; var sAddress = sourceDeviceConfiguration.Keithley2602A_DeviceSettings.DeviceSettings.SecondaryAddress; var bNumber = sourceDeviceConfiguration.Keithley2602A_DeviceSettings.DeviceSettings.BoardNumber; var motor = new ORDINARY_MOTOR(pAddress, sAddress, bNumber); motor.FinalDestination = 0.0; Motor = motor; if (TimeTraceCurve != null) { TimeTraceCurve.Dispose(); } var ExperimentSettings = IV_And_TimeTraceViewModel.Instance; var valueThroughTheStructure = ExperimentSettings.TimeTraceMeasurementValueThrougtTheStructure; var isTimeTraceVoltageModeChecked = ExperimentSettings.IsTimeTraceMeasurementVoltageModeChecked; var isTimeTraceCurrentModeChecked = ExperimentSettings.IsTimeTraceMeasurementCurrentModeChecked; var selectedTimeTraceModeItem = (tabControlTimeTraceMeasurementParameters.SelectedItem as TabItem).Header.ToString(); switch (selectedTimeTraceModeItem) { case "Distance": { var motionStartPosition = ExperimentSettings.TimeTraceMeasurementMotionCurrentDestination; var motionFinalDestination = ExperimentSettings.TimeTraceMeasurementMotionFinalDestination; if (isTimeTraceVoltageModeChecked == true) TimeTraceCurve = new MeasureTimeTrace(Motor, motionStartPosition, motionFinalDestination, Device, KEITHLEY_2601A_SourceMode.Voltage, KEITHLEY_2601A_MeasureMode.Resistance, valueThroughTheStructure); else if (isTimeTraceCurrentModeChecked == true) TimeTraceCurve = new MeasureTimeTrace(Motor, motionStartPosition, motionFinalDestination, Device, KEITHLEY_2601A_SourceMode.Current, KEITHLEY_2601A_MeasureMode.Resistance, valueThroughTheStructure); } break; case "Distance (Repetitive)": { var motionRepetitiveStartPosition = ExperimentSettings.TimeTraceMeasurementDistanceRepetitiveStartPosition; var motionRepetitiveEndPosition = ExperimentSettings.TimeTraceMeasurementDistanceRepetitiveEndPosition; var numerCycles = ExperimentSettings.TimeTraceMeasurementDistanceRepetitiveNumberCycles; if (isTimeTraceVoltageModeChecked == true) TimeTraceCurve = new MeasureTimeTrace(Motor, motionRepetitiveStartPosition, motionRepetitiveEndPosition, Device, KEITHLEY_2601A_SourceMode.Voltage, KEITHLEY_2601A_MeasureMode.Resistance, valueThroughTheStructure); else if (isTimeTraceCurrentModeChecked == true) TimeTraceCurve = new MeasureTimeTrace(Motor, motionRepetitiveStartPosition, motionRepetitiveEndPosition, Device, KEITHLEY_2601A_SourceMode.Current, KEITHLEY_2601A_MeasureMode.Resistance, valueThroughTheStructure); } break; case "Time": { } break; case "Fixed R": { } break; default: break; } #endregion #region Saving Time Trace data into files var _TimeTraceFileNumber = String.Format("_{0}{1}{2}", (_TimeTraceFilesCounter / 100) % 10, (_TimeTraceFilesCounter / 10) % 10, _TimeTraceFilesCounter % 10); string newFileName = string.Empty; if (!string.IsNullOrEmpty(_SaveTimeTraceMeasuremrentFileName)) { _TimeTraceMeasurementLog = new TimeTraceMeasurementLog((new FileInfo(_SaveTimeTraceMeasuremrentFileName)).DirectoryName + "\\TimeTraceMeasurementLog.dat"); newFileName = _SaveTimeTraceMeasuremrentFileName.Insert(_SaveTimeTraceMeasuremrentFileName.LastIndexOf('.'), _TimeTraceFileNumber); ++_TimeTraceFilesCounter; } string sourceMode = string.Empty; if (!string.IsNullOrEmpty(_SaveTimeTraceMeasuremrentFileName)) { string fileName = (new FileInfo(newFileName)).Name; if (this.radioTimeTraceSourceVoltage.IsChecked == true) { sourceMode = "Source mode: Voltage"; } else if (this.radioTimeTraceSourceCurrent.IsChecked == true) { sourceMode = "SourceMode: Current"; } double micrometricBoltPosition = double.NaN; double.TryParse(this.textBoxTimeTraceMicrometricBoltPosition.Text, numberStyle, culture, out micrometricBoltPosition); string comment = this.textBoxTimeTraceComment.Text; _TimeTraceMeasurementLog.AddNewTimeTraceMeasurementLog(fileName, sourceMode, valueThroughTheStructure, comment); } SourceMode _sourceMode = SourceMode.Voltage; //Source mode is voltage by default if (sourceMode == "Source mode: Voltage") _sourceMode = SourceMode.Voltage; else if (sourceMode == "SourceMode: Current") _sourceMode = SourceMode.Current; if (_TimeTraceSingleMeasurement != null) _TimeTraceSingleMeasurement.Dispose(); _TimeTraceSingleMeasurement = new TimeTraceSingleMeasurement(newFileName, _sourceMode); #endregion return true; } else { return false; } #endregion }
/// <summary> /// Initializes the new I-V curve measurements /// </summary> /// <returns>true, if initialization succeed and false otherwise</returns> private bool InitIV_Measurements() { #region SMU, rendering and save data configurations //Checking the SMU settings if (sourceDeviceConfiguration != null) { #region Chart rendering settings //Initializing a new plot on I-V chart if (_IV_LineGraph != null) { //Detaching receive event from "old" data source _experimentalIV_DataSource.DetachPointReceiveEvent(); _IV_LineGraph.Remove(); } //Creating new plot and attaching it to the chart _CurrentIV_Curve = new List<PointD>(); _experimentalIV_DataSource = new ExperimentalIV_DataSource(_CurrentIV_Curve); _experimentalIV_DataSource.AttachPointReceiveEvent(); _IV_LineGraph = new LineGraph(_experimentalIV_DataSource); _IV_LineGraph.AddToPlotter(chartIV_Curves); #endregion //Getting SMU device Device = sourceDeviceConfiguration.Keithley2602A_DeviceSettings.Device; #region I-V measurement configuration var ExperimentSettings = IV_And_TimeTraceViewModel.Instance; var StartValue = ExperimentSettings.IV_MeasurementStartValue; var EndValue = ExperimentSettings.IV_MeasurementEndValue; var Step = ExperimentSettings.IV_MeasurementStep; var NumberOfAverages = ExperimentSettings.IV_MeasurementNumberOfAverages; var TimeDelay = ExperimentSettings.IV_MeasurementTimeDelay; SourceMode DeviceSourceMode = SourceMode.Voltage; if (this.radioIVSourceVoltage.IsChecked == true) { DeviceSourceMode = SourceMode.Voltage; } else if (this.radioIVSourceCurrent.IsChecked == true) { DeviceSourceMode = SourceMode.Current; } IV_Curve = new MeasureIV(StartValue, EndValue, Step, NumberOfAverages, TimeDelay, DeviceSourceMode, Device); #endregion #region Saving I-V data into files var _IV_FileNumber = String.Format("_{0}{1}{2}", (_IV_FilesCounter / 100) % 10, (_IV_FilesCounter / 10) % 10, _IV_FilesCounter % 10); string newFileName = string.Empty; if (!string.IsNullOrEmpty(_SaveIV_MeasuremrentFileName)) { _IV_MeasurementLog = new IV_MeasurementLog((new FileInfo(_SaveIV_MeasuremrentFileName)).DirectoryName + "\\IV_MeasurementLog.dat"); newFileName = _SaveIV_MeasuremrentFileName.Insert(_SaveIV_MeasuremrentFileName.LastIndexOf('.'), _IV_FileNumber); ++_IV_FilesCounter; } if (!string.IsNullOrEmpty(_SaveIV_MeasuremrentFileName)) { string fileName = (new FileInfo(newFileName)).Name; string sourceMode = string.Empty; if (this.radioIVSourceVoltage.IsChecked == true) { sourceMode = "Source mode: Voltage"; } else if (this.radioIVSourceCurrent.IsChecked == true) { sourceMode = "SourceMode: Current"; } double micrometricBoltPosition = double.NaN; double.TryParse(this.textBoxIV_MicrometricBoltPosition.Text, numberStyle, culture, out micrometricBoltPosition); string comment = this.textBoxIV_Comment.Text; _IV_MeasurementLog.AddNewIV_MeasurementLog(fileName, sourceMode, micrometricBoltPosition, comment); } if (_IV_SingleMeasurement != null) _IV_SingleMeasurement.Dispose(); _IV_SingleMeasurement = new IV_SingleMeasurement(newFileName); #endregion return true; } else { MessageBox.Show("The device is not initialized.", "Error!", MessageBoxButton.OK, MessageBoxImage.Error); return false; } #endregion }