using Arction.Wpf.ChartingMVVM.Axes; using Arction.Wpf.ChartingMVVM.Views.ViewXY; using Arction.Wpf.ChartingMVVM; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Threading; using System.Windows; using Txgy.EWS.Client.PageModule.Models; using Txgy.Microseismic.BaseLib.Models; using Prism.Mvvm; using Prism.Events; using Txgy.EWS.Client.IBLL; using System.Windows.Input; using Txgy.EWS.Client.Common; using System.Windows.Media; using Unity; using Txgy.EWS.Client.Common.MessageEvents; using Txgy.EWS.Client.PageModule.Services; using Newtonsoft.Json.Linq; namespace Txgy.EWS.Client.PageModule.ViewModels { public class WaveformViewModel : BindableBase { #region variable Dispatcher _dispatcher; //private IRemoteDownloadDataBLL remoteDownloadDataBLL; private delegate void HandleDataGeneratedDelegate(string eventTime); /// /// Delegate for data generation. /// private HandleDataGeneratedDelegate _handleDataGenerated; /// /// 当前采样数 /// public int CurPoints; private DispatcherTimer _fitYTimer; private readonly IEventAggregator _ea; private readonly ISearchMsEventBLL _searchMsEventBLL; private int _selectResult = 0; public int SelectResult { get { return _selectResult; } set { SetProperty(ref _selectResult, value); } } int _channelCount = 60; // Channel count. double _samplingFrequency = 500; // Sampling frequency (Hz). double _xLength = 10; // X axis length. double _previousX = 0; // Latest X value on axis. long _now; // Latest time stamp. long _startTicks; // Controls timing. long _samplesOutput; // Generated samples quantity. // Constants const double YMin = 30000; // Minimal y-value. const double YMax = 33000; // Maximal y-value. private volatile bool _stop; // Stops thread work. internal bool IsRunning { get { return _thread != null; } } WavesModel _wavesModel; #endregion /// /// Thread. /// private Thread _thread; private Thread _threadWrite; private delegate void ChartUpdateFromThreadHandler(double[][] samples); private ChartUpdateFromThreadHandler _chartUpdate; private Random _rand = new Random((int)DateTime.Now.Ticks); #region "属性" private int _lChartCount = 1; /// /// 波形控件数量 /// public int LChartCount { get { return _lChartCount; } set { _lChartCount = value; } } public List WaveComList { get; set; } private ShareProperty _wavesCombination; /// /// 波形组合 /// public ShareProperty WavesCombination { get { return _wavesCombination; } set { _wavesCombination = value; SetWavesCombination(); //Console.WriteLine(_wavesCombination.Name); } } private DataSourcesEnum _dataSources; /// /// 数据来源 /// public DataSourcesEnum DataSources { get { return _dataSources; } set { _dataSources = value; } } private DataTypeEnum _wavesType; /// /// 波形类型 /// public DataTypeEnum WavesType { get { return _wavesType; } set { _wavesType = value; } } private DisplayModeEnum _displayMode; /// /// 显示模式 /// public DisplayModeEnum DisplayMode { get { return _displayMode; } set { _displayMode = value; } } private ScollModeEnum _scollMode; /// /// 滚动方式 /// public ScollModeEnum ScollMode { get { return _scollMode; } set { _scollMode = value; } } private DateTime _startTime; /// /// 开始时间 /// public DateTime StartTime { get { return _startTime; } set { _startTime = value; } } private DateTime _endTime; /// /// 开始时间 /// public DateTime EndTime { get { return _endTime; } set { _endTime = value; } } private int _sampling = 500; /// /// 采样频率 /// public int Sampling { get { return _sampling; } set { _sampling = value; } } /// /// 延时(min) /// public int DelayMin { get; set; } = 10; /// /// 文件数据位置 /// public string FileDataPath { get; set; } = @"D:\TaySystemPath\Downloads"; private string _cachePath; private int _cacheSize; /// /// 缓存大小 /// public int CacheSize { get { return _cacheSize; } set { _cacheSize = value; } } private ObservableCollection _stationList; /// /// 台站列表 /// public ObservableCollection StationList { get { return _stationList; } set { _stationList = value; } } private LightningChart _lChartAll; /// /// 所有波形 /// public LightningChart LChartALL { get { return _lChartAll; } set { _lChartAll = value; } } private LightningChart _lChartZ; /// /// Z通道波形 /// public LightningChart LChartZ { get { return _lChartZ; } set { _lChartZ = value; } } private LightningChart _lChartE; /// /// E通道波形 /// public LightningChart LChartE { get { return _lChartE; } set { _lChartE = value; } } private LightningChart _lChartN; /// /// N通道波形 /// public LightningChart LChartN { get { return _lChartN; } set { _lChartN = value; } } private FrameworkElement childContent; public FrameworkElement ChildContent { get { return childContent; } set { childContent = value; } } private Grid gridChart; public Grid GridChart { get { return gridChart; } set { gridChart = value; } } private string _btnContrlContent = "开始"; private int channelCount; public string BtnContrlContent { get { return _btnContrlContent; } set { _btnContrlContent = value; } } private ObservableCollection _showEvents; public ObservableCollection ShowEvents { get { return _showEvents; } set { SetProperty(ref _showEvents, value); } } StationWorkModel _stationWorker; public List smList; //public static readonly DependencyProperty XAxesProperty = //DependencyProperty.Register( // "xAxes", // typeof(AxisXCollection), // typeof(WavesViewModel) //); //public AxisXCollection xAxes //{ // get { return GetValue(XAxesProperty) as AxisXCollection; } // set { SetValue(XAxesProperty, value); } //} #endregion #region "Command" #endregion public WaveformViewModel(IUnityContainer unityContainer, IEventAggregator ea, ISearchMsEventBLL searchMsEventBLL) { this._ea = ea; this._searchMsEventBLL = searchMsEventBLL; _dispatcher = unityContainer.Resolve(); //this.remoteDownloadDataBLL = remoteDownloadDataBLL; SelectResult = 10; //this.SelectCommand = new CommandBase(); //this.SelectCommand.ExcuteAction = new Action(SelectEvent); //this.SelectCommand.CanExecuteFunc = new Func(() => true); var wcList = (WavesCombinationEnum[])Enum.GetValues(typeof(WavesCombinationEnum)); WaveComList = wcList.Select(value => new ShareProperty((int)value, value.ToString())).ToList(); WavesCombination = WaveComList.SingleOrDefault(wc => wc.ID == 0); _chartUpdate = new ChartUpdateFromThreadHandler(FeedNewDataToChartPingPu); _wavesModel = new WavesModel(); //_checkBoxWaveformScrollStabilizing = new DelegateCommand(WaveformScrollStabilizing); //_checkBoxPaletteColoring = new DelegateCommand(PaletteColoring); LChartALL.ViewXY.XAxes = new AxisXCollection(); LChartALL.ViewXY.XAxes.Add(_wavesModel.GetAxisX(10)); InitData(); //(Application.Current.w as UserControl).Loaded += ViewModel_Loaded; (Application.Current.MainWindow as System.Windows.Window).Closing += ApplicationClosingDispose; _handleDataGenerated = new HandleDataGeneratedDelegate(ShowWave); this._ea.GetEvent().Subscribe(i => { _dispatcher.Invoke(_handleDataGenerated, i); }); } private void CheckEvent(object obj) { //if (ShowEvents != null) //{ // int eventIndex = (int)obj; // if (ShowEvents[eventIndex] != null) // { // CheckEventShowWave(ShowEvents[eventIndex].EventTimeStr); // } //} //CheckEventShowWave() } //string str = "2022-04-10T04:00:52.488"; private void ShowWave(string obj) { //System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); //sw.Start(); string EventTimeStr = obj; string datePath = EventTimeStr.Substring(0, 4) + EventTimeStr.Substring(5, 2) + EventTimeStr.Substring(8, 2); string dataFilePath = GlobalConfig.ProjectConfig.MseedFilePath + "\\" + datePath + "\\"; string dataFileName = "HA." + EventTimeStr.Substring(0, 4) + EventTimeStr.Substring(5, 2) + EventTimeStr.Substring(8, 2) + EventTimeStr.Substring(10, 3) + EventTimeStr.Substring(14, 2) + EventTimeStr.Substring(17, 2) + ".01" + GlobalConfig.DataTypeString; string mseedStr = ".mseed"; string asciiSavePath = GlobalConfig.ProjectConfig.TxtFilePath + "\\" + datePath + "\\" + dataFileName + ".txt"; if (!Directory.Exists(dataFilePath)) { Directory.CreateDirectory(dataFilePath); } if (!Directory.Exists(Path.GetDirectoryName(asciiSavePath))) { Directory.CreateDirectory(Path.GetDirectoryName(asciiSavePath)); } if (!File.Exists(dataFilePath + dataFileName + mseedStr)) { TaskData taskData = new TaskData(); taskData.EventTimeStr = EventTimeStr; taskData.Tasks = new Task(() => { int res = new DownloadWavedata().Download(EventTimeStr, dataFilePath, dataFileName + mseedStr, GlobalConfig.UseWaveDataTable); if (res > -1) { MSeed2Asc(dataFilePath + dataFileName + mseedStr, asciiSavePath); } //Console.WriteLine(taskData.IsComplete); }); taskData.CallBack = (string res) => { _dispatcher.Invoke(() => { UpdateWavesFromTxt(asciiSavePath); _channelCount = smList.Count * 3; UpdateChart(); UpdateChartData(); }); }; TaskQueue.Instance.AddTaskAndRuning(taskData); //_searchMsEventBLL.DownLoadWavedata(downLoadStr, mseedPath, mseedStr, GlobalConfig.UseWaveDataTable); //if (!File.Exists(savePath)) //{ // if (!Directory.Exists(Path.GetDirectoryName(savePath))) // { // Directory.CreateDirectory(Path.GetDirectoryName(savePath)); // } // MSeed2Asc(mseedPath + mseedStr + ".mseed", savePath); //} //Dialog.Show(new TextDialog() { ShowText = mseedPath + mseedStr + ".mseed" + "下载完成!" }); } else { if (!File.Exists(asciiSavePath)) { MSeed2Asc(dataFilePath + dataFileName + mseedStr, asciiSavePath); } _dispatcher.Invoke(() => { UpdateWavesFromTxt(asciiSavePath); _channelCount = smList.Count * 3; UpdateChart(); UpdateChartData(); }); //Dialog.Show(new TextDialog() { ShowText = mseedPath + mseedStr + ".mseed" + "已存在!" }); } } private void UpdateChart() { //线程问题 LChartALL.ViewXY.YAxes = new AxisYCollection(); LChartALL.ViewXY.YAxes.Clear(); LChartALL.ViewXY.YAxes.AddRange(_wavesModel.CreateYAxisPingPu(smList, LChartALL)); for (int i = 0; i < LChartALL.ViewXY.YAxes.Count; i++) { LChartALL.ViewXY.YAxes[i].LabelsColor = Colors.Black; LChartALL.ViewXY.YAxes[i].AxisColor = Colors.Black; LChartALL.ViewXY.YAxes[i].GridStripColor = Colors.Black; LChartALL.ViewXY.YAxes[i].Title.Color = Colors.Black; LChartALL.ViewXY.YAxes[i].Title.Shadow.DropColor = Colors.Transparent; LChartALL.ViewXY.YAxes[i].Title.Shadow.ContrastColor = Colors.Transparent; } LChartALL.ViewXY.XAxes = new AxisXCollection(); LChartALL.ViewXY.XAxes.Add(_wavesModel.GetAxisX(CurPoints / Sampling)); LChartALL.ViewXY.XAxes[0].LabelsColor = Colors.Black; //LChartALL.ViewXY.XAxes[0].Title.Fill.Color = Colors.Black; //LChartALL.ViewXY.XAxes = new AxisXCollection(); //LChartALL.ViewXY.XAxes.Add(_wavesModel.GetAxisX(CurPoints / Sampling)); //LChartALL.ViewXY.XAxes[0].LabelsColor = Colors.Black; LChartALL.ViewXY.SampleDataSeries = new SampleDataSeriesCollection(); LChartALL.ViewXY.SampleDataSeries.AddRange( _wavesModel.GetSampleDataSeriesPingPu(smList, LChartALL, LChartALL.ViewXY.XAxes[0], LChartALL.ViewXY.YAxes, _samplingFrequency)); } private void UpdateChartData() { double yRange = YMax - YMin; double[][] multiChannelData = new double[smList.Count * 3][]; try { for (int channelIndex = 0; channelIndex < smList.Count; channelIndex++) { multiChannelData[channelIndex * 3] = smList[channelIndex].dz.ToArray(); multiChannelData[channelIndex * 3 + 1] = smList[channelIndex].dn.ToArray(); multiChannelData[channelIndex * 3 + 2] = smList[channelIndex].de.ToArray(); } // Invoke FeedNewDataToChart. _dispatcher.Invoke(_chartUpdate, System.Windows.Threading.DispatcherPriority.ContextIdle, multiChannelData as object); } catch (Exception ex) { throw ex; } } public void UpdateWavesFromTxt(string fn) { string allStr; string sn = "";//0 int points = 0;//1 int samp = 500;//2 string startTime = "";//3;4,5,6=null smList = new List(); using (StreamReader streamReader = new StreamReader(fn)) { allStr = streamReader.ReadToEnd(); } if (allStr.Length > 0) { string[] strLines = allStr.Trim().Split(new char[] { '\n' }); List strList = strLines.ToList(); int cnt = strList.Count; int num = 0; string[] snStr = strLines[0].Trim().Split(','); string tmpName = snStr[0].Substring(14, 3); CurPoints = int.Parse(snStr[1].Trim().Split(' ')[0]); StationModel station = new StationModel(); station.Name = tmpName; station.dz = new List(); station.dn = new List(); station.de = new List(); int channelFlag = 0; for (int i = 1; i < strLines.Length; i++) { string row = strLines[i].Trim(); if (strLines[i].Contains("HA")) { string[] rowStr = strLines[i].Split(','); string chnStr1 = rowStr[0].Substring(21, 3); if (chnStr1 == "SHZ") { //Console.WriteLine($"台站:{station.Name}\tZ:{station.dz.Count}" + // $"\tN:{station.dn.Count}\tE:{station.de.Count}"); smList.Add(station); station = new StationModel(); station.Name = rowStr[0].Substring(14, 3); channelFlag = 0;//Z } else if (chnStr1 == "SHN") { channelFlag = 1;//N } else { channelFlag = 2;//E } } else { switch (channelFlag) { case 0://Z station.dz.Add(double.Parse(row)); break; case 1://N station.dn.Add(double.Parse(row)); break; case 2://E station.de.Add(double.Parse(row)); break; } } } smList.Add(station); smList.Reverse(); } //while (num events = remoteSQL.GetDateEvent(StartTime, EndTime); //if (events != null) //{ // ShowEvents = new ObservableCollection(); // foreach (MmEvent e in events) // ShowEvents.Add(e); // SelectResult = ShowEvents.Count; // //UpdateEventOfDayPlot(events); // //UpdateEventOfML(events); // //CreateEventOfGrade(events); //} } private void ApplicationClosingDispose(object sender, CancelEventArgs e) { if (IsRunning == true) { // The thread is currently running so signal it to stop. // Dispose method will be called again after the thread stops. Stop(); } else { if (LChartALL != null) { LChartALL.Dispose(); LChartALL = null; } } } public void Dispose() { gridChart.Children.Clear(); if (LChartALL != null) { LChartALL.Dispose(); LChartALL = null; } //if (IsRunning == true) //{ // // The thread is currently running so signal it to stop. // // Dispose method will be called again after the thread stops. // Stop(); //} } public void SetWavesCombination() { switch (WavesCombination.Name) { case "平铺": LChartCount = 1; CreateGridChartPingPu(); break; case "叠加": LChartCount = 1; CreateGridChartDieJia(); break; case "分类": LChartCount = 3; CreateGridChartFenLei(); break; } } public void CreateGridChartPingPu() { if (LChartALL != null) { LChartALL = null; } LChartALL = new LightningChart(); LChartALL.Title.Text = "事件波形"; LChartALL.Title.Color = Colors.Black; LChartALL.Title.Shadow.DropColor = Colors.Transparent; LChartALL.Title.Shadow.ContrastColor = Colors.Transparent; LChartALL.Title.Font = new WpfFont("等线", 20); LChartALL.ViewXY.AxisLayout.YAxesLayout = YAxesLayout.Stacked; LChartALL.ViewXY.AxisLayout.SegmentsGap = 0; LChartALL.ViewXY.ZoomPanOptions.PanDirection = PanDirection.Horizontal; LChartALL.ViewXY.ZoomPanOptions.WheelZooming = WheelZooming.Horizontal; //背景颜色 LChartALL.ViewXY.GraphBackground.Color = Colors.White; LChartALL.ViewXY.GraphBackground.GradientFill = GradientFill.Solid; LChartALL.ViewXY.GraphBackground.GradientColor = Colors.White; LChartALL.ChartBackground.GradientFill = GradientFill.Solid; LChartALL.ChartBackground.Color = Color.FromArgb(0, 0, 0, 0); GridChart = new Grid(); GridChart.ColumnDefinitions.Add(new ColumnDefinition()); GridChart.Name = "chartGrid"; GridChart.Children.Add(LChartALL); this.ChildContent = GridChart; } public void CreateGridChartDieJia() { if (LChartALL != null) { LChartALL = null; } LChartALL = new LightningChart(); LChartALL.Title.Text = "叠加"; GridChart = new Grid(); GridChart.ColumnDefinitions.Add(new ColumnDefinition()); GridChart.Name = "chartGrid"; GridChart.Children.Add(LChartALL); this.ChildContent = GridChart; } public void CreateGridChartFenLei() { LChartZ = new LightningChart(); LChartALL.Title.Text = "Z"; LChartZ.SetValue(Grid.ColumnProperty, 0); LChartE = new LightningChart(); LChartALL.Title.Text = "E"; LChartE.SetValue(Grid.ColumnProperty, 1); LChartN = new LightningChart(); LChartALL.Title.Text = "N"; LChartN.SetValue(Grid.ColumnProperty, 2); GridChart = new Grid(); GridChart.ColumnDefinitions.Add(new ColumnDefinition()); GridChart.ColumnDefinitions.Add(new ColumnDefinition()); GridChart.ColumnDefinitions.Add(new ColumnDefinition()); GridChart.Name = "chartGrid"; GridChart.Children.Add(LChartZ); GridChart.Children.Add(LChartE); GridChart.Children.Add(LChartN); this.ChildContent = GridChart; } private void InitData() { LChartALL.ViewXY.YAxes = new AxisYCollection(); LChartALL.ViewXY.YAxes.Clear(); LChartALL.ViewXY.YAxes.AddRange(_wavesModel.CreateYAxisPingPu(GlobalConfig.ProjectConfig.StationDic, LChartALL)); for (int i = 0; i < LChartALL.ViewXY.YAxes.Count; i++) { LChartALL.ViewXY.YAxes[i].LabelsColor = Colors.Black; LChartALL.ViewXY.YAxes[i].AxisColor = Colors.Black; LChartALL.ViewXY.YAxes[i].GridStripColor = Colors.Black; LChartALL.ViewXY.YAxes[i].Title.Color = Colors.Black; LChartALL.ViewXY.YAxes[i].Title.Shadow.DropColor = Colors.Transparent; LChartALL.ViewXY.YAxes[i].Title.Shadow.ContrastColor = Colors.Transparent; LChartALL.ViewXY.YAxes[i].Title.Font = new WpfFont("Calibri", 12); } LChartALL.ViewXY.XAxes = new AxisXCollection(); LChartALL.ViewXY.XAxes.Add(_wavesModel.GetAxisX(CurPoints / Sampling)); LChartALL.ViewXY.XAxes[0].LabelsColor = Colors.Black; LChartALL.ViewXY.SampleDataSeries = new SampleDataSeriesCollection(); LChartALL.ViewXY.SampleDataSeries.AddRange( _wavesModel.GetSampleDataSeriesPingPu(GlobalConfig.ProjectConfig.StationDic, LChartALL, LChartALL.ViewXY.XAxes[0], LChartALL.ViewXY.YAxes, _samplingFrequency)); //string mseedPath = FileDataPath + "\\" + StartTime.Year.ToString("D2"); //Console.WriteLine(mseedPath); //Start(); } private void FeedNewDataToChartPingPu(double[][] data) { LChartALL.BeginUpdate(); for (int channelIndex = 0; channelIndex < _channelCount; channelIndex++) { LChartALL.ViewXY.SampleDataSeries[channelIndex].AddSamples(data[channelIndex], true); //LChartALL.ViewXY.YAxes[channelIndex].Minimum = data[channelIndex].Min(); //LChartALL.ViewXY.YAxes[channelIndex].Maximum = data[channelIndex].Max(); } _previousX = (double)_samplesOutput / _samplingFrequency; LChartALL.ViewXY.XAxes[0].ScrollPosition = _previousX; LChartALL.EndUpdate(); } private void ButtonStartStopMethod(object obj) { //if (_thread == null) //{ // //Start // BtnContrlContent = "Stop"; // //isEnableSampFreq = false; // //isEnableChannelCount = false; // //bool bWaveformScrollStabilizing = CheckBoxWaveformScrollStabilizing == true; // _previousX = 0; // //Read channel count // try // { // //_channelCount = int.Parse((Application.Current.MainWindow as View).ChannelCount.Text.ToString()); // } // catch // { // Dialog.Show("Invalid channel count text input"); // return; // } // //Read sampling frequency // try // { // //_samplingFrequency = double.Parse((Application.Current.MainWindow as View).SamplingFrequency.Text.ToString()); // } // catch // { // Dialog.Show("Invalid sampling frequency text input"); // return; // } // //Read X axis length // try // { // //_xLength = double.Parse((Application.Current.MainWindow as View).XLen.Text.ToString()); // } // catch // { // Dialog.Show("Invalid X-Axis length text input"); // return; // } // int newPointsCount = _channelCount * (int)_samplingFrequency; //Amount of new generated points per second // LChartALL.Title.Text = "Real-time data feeding from a thread, " + _channelCount.ToString() + " * " + _samplingFrequency.ToString("0") // + " Hz = " + newPointsCount.ToString() + " new data points per sec"; // //LChartALL.ViewXY.YAxes.Clear(); //Remove existing y-axes // //LChartALL.ViewXY.SampleDataSeries.Clear(); //Remove existing SampleDataSeries // ////Add Y axis and SampleDataSeries for each channel // //LChartALL.ViewXY.YAxes.AddRange(_wavesModel.CreateYAxisPingPu(PublicConfig.StationCount, LChartALL)); // //LChartALL.ViewXY.SampleDataSeries.AddRange(_wavesModel.GetSampleDataSeriesPingPu(PublicConfig.StationCount, // // LChartALL, LChartALL.ViewXY.XAxes[0] // // , LChartALL.ViewXY.YAxes, _samplingFrequency)); // //初始化数据读取 // _stationWorker = new StationWorkModel(); // //_stationWorker.Stations // _stationWorker.files = Directory.GetFiles(@"D:\datatmp", "*.txt"); // _stationWorker.InitWork(); // //ScrollMode(); // LChartALL.ViewXY.XAxes[0].SetRange(0, _xLength); // _samplesOutput = 0; // _startTicks = DateTime.Now.Ticks; // _stop = false; // _threadWrite = new Thread(new ThreadStart( // () => // { // while (_stop == false) // { // if (_stationWorker.Stations[0].cz.Count < 500) // { // _stationWorker.StartWriter(); // // Get the elapsed time as a TimeSpan value. // } // //_stationWorker.StartWriter(); // Thread.Sleep(100); // } // })); // _threadWrite.Start(); // //_fitYTimer = new DispatcherTimer(DispatcherPriority.Background); // //_fitYTimer.Interval = TimeSpan.FromMilliseconds(500); // //_fitYTimer.Tick += _fitYTimer_Tick; // //_fitYTimer.Start(); // Thread.Sleep(500); // //Thread.Sleep(5000); // _thread = new Thread(new ThreadStart(ThreadLoop)); // _thread.Start(); //} //else //{ // // Stop. // BtnContrlContent = "Start"; // //isEnableSampFreq = true; // //isEnableChannelCount = true; // //_fitYTimer.Stop(); // _stop = true; //} } private void _fitYTimer_Tick(object sender, EventArgs e) { FitY(null); } public void Start() { if (IsRunning == false) { //ButtonStartStopMethod(null); } } public void Stop() { if (IsRunning == true) { //ButtonStartStopMethod(null); } } private void ThreadLoop() { int sm = 0; while (_stop == false) { // Generate data for each channel. Use StopWatch to // investigate how many samples must be generated. //Stopwatch stopWatch = new Stopwatch(); //stopWatch.Start(); //if (_stationWorker.Stations[0].cz.Count < 500) //{ // _stationWorker.StartWriter(); // // Get the elapsed time as a TimeSpan value. //} _now = DateTime.Now.Ticks; //Get current time stamp. long currentSampleIndex = (long)(TimeSpan.FromTicks(_now - _startTicks).TotalSeconds * _samplingFrequency); int sampleBundleToGenerate = (int)(currentSampleIndex - _samplesOutput); //Console.WriteLine("currentSampleIndex:{0}\tsampleBundle:{1}", currentSampleIndex, sampleBundleToGenerate); _channelCount = _stationWorker.StationCnt; if (sampleBundleToGenerate > 0) { //YMax = tmps.Max(); double yRange = YMax - YMin; double[][] multiChannelData = new double[_channelCount][]; for (int channelIndex = 0; channelIndex < _channelCount; channelIndex++) { multiChannelData[channelIndex] = new double[sampleBundleToGenerate]; double[] tmps = _stationWorker.Reader(_stationWorker.Stations[channelIndex], sampleBundleToGenerate); //if (tmps.Min()<30000) //{ // Console.WriteLine($"{_stationWorker.Stations[channelIndex].Name}\t{tmps.Min()}"); //} //Console.WriteLine(tmps.Average()); //Generate random data for (int sampleIndex = 0; sampleIndex < sampleBundleToGenerate; sampleIndex++) { multiChannelData[channelIndex][sampleIndex] = tmps[sampleIndex]; } } _samplesOutput += sampleBundleToGenerate; // Invoke FeedNewDataToChart. _dispatcher.Invoke(_chartUpdate, System.Windows.Threading.DispatcherPriority.ContextIdle, multiChannelData as object); } // Sleep a little while so that UI stays responsive. Thread.Sleep(500); //stopWatch.Stop();//停止测量某个时间间隔的运行时间。 //TimeSpan ts = stopWatch.Elapsed; //获取当前实例测量得出的总运行时间。 //Console.WriteLine(ts.TotalMilliseconds); } _thread = null; #region "原程序" //while (_stop == false) //{ // // Generate data for each channel. Use StopWatch to // // investigate how many samples must be generated. // _now = DateTime.Now.Ticks; //Get current time stamp. // long currentSampleIndex = // (long)(TimeSpan.FromTicks(_now - _startTicks).TotalSeconds * _samplingFrequency); // int sampleBundleToGenerate = (int)(currentSampleIndex - _samplesOutput); // Console.WriteLine("currentSampleIndex:{0}\tsampleBundle:{1}", currentSampleIndex, sampleBundleToGenerate); // if (sampleBundleToGenerate > 0) // { // double yRange = YMax - YMin; // double[][] multiChannelData = new double[_channelCount][]; // for (int channelIndex = 0; channelIndex < _channelCount; channelIndex++) // { // multiChannelData[channelIndex] = new double[sampleBundleToGenerate]; // //Generate random data // for (int sampleIndex = 0; sampleIndex < sampleBundleToGenerate; sampleIndex++) // { // multiChannelData[channelIndex][sampleIndex] = YMin + _rand.NextDouble() * yRange; // } // } // _samplesOutput += sampleBundleToGenerate; // // Invoke FeedNewDataToChart. // Application.Current.Dispatcher.Invoke(_chartUpdate, System.Windows.Threading.DispatcherPriority.ContextIdle, // multiChannelData as object); // } // // Sleep a little while so that UI stays responsive. // Thread.Sleep(1); //} //_thread = null; #endregion } //private void FitY(object o) //{ // FitY(); //} private void FitY(object o) { if (LChartALL != null) { //Disable rendering, strongly recommended before updating chart properties LChartALL.BeginUpdate(); foreach (AxisY axisY in LChartALL.ViewXY.YAxes) { //Console.WriteLine($"min:{axisY.Minimum}\tmax:{axisY.Maximum}"); if (axisY.Minimum < 30000) { axisY.Minimum = 30000; } if (axisY.Maximum < 35000) { axisY.Maximum = 35000; } bool changed = false; axisY.Fit(0.0, out changed, true, false, 30000, 35000); } //Allow chart rendering LChartALL.EndUpdate(); } } public void ConvertWaves(object o) { Stopwatch sw = new Stopwatch(); string[] files = Directory.GetFiles(@"D:\BaiduNetdiskDownload\03\08\00", "*.mseed", SearchOption.AllDirectories); int taskNum = 0; bool isAllCompleted = false; int taskCnt = files.Length; Task[] tasks = new Task[taskCnt]; sw.Start(); foreach (var item in files) { tasks[taskNum] = Task.Factory.StartNew(() => { using (Process compiler = new Process()) { string sn = Path.GetFileNameWithoutExtension(item); compiler.StartInfo.FileName = "mseed2ascii.exe"; compiler.StartInfo.Arguments = item + " -o " + GlobalConfig.ProjectConfig.TxtFilePath + "\\" + sn + ".txt"; compiler.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; compiler.Start(); //compiler.WaitForExit(); //Console.WriteLine(taskNum); //string fileName = Path.GetFileNameWithoutExtension(item.filePath); //MoveFile(System.Environment.CurrentDirectory, fileName, "*" + item.txtTimeStr + "*.txt", movePath); //this.Dispatcher.BeginInvoke(new Action(() => listBoxConverts.Items.Add(item.filePath))); } }); taskNum++; } var moniCom = Task.Factory.StartNew(() => { while (!isAllCompleted) { int comTask = 0; foreach (var item in tasks) { //Console.WriteLine($"ID:{item.Id}\tCompleted:{item.Status.ToString()}"); if (item.IsCompleted) { comTask++; } } if (comTask >= taskCnt) { isAllCompleted = true; sw.Stop(); TimeSpan ts2 = sw.Elapsed; // Console.WriteLine("总共花费{0}ms.", ts2.TotalMilliseconds); //MessageBox.Show($"完成,共花费:{tsts2.TotalMilliseconds}ms!"); } Thread.Sleep(1); } }); // System.Diagnostics.Process.Start(@"D:\mseed2ascii.exe", @"d:\HA.N02-202203080000.mseed -o "+CachePath+"\\3.txt"); ////var tc = Task.Factory.StartNew(() => //{ // using (Process compiler = new Process()) // { // //ProcessStartInfo info = new ProcessStartInfo("mseed2ascii.exe"); // //info.WindowStyle = ProcessWindowStyle.Hidden; // //info.Arguments = "HA.20211023T044938.04.mseed"; // compiler.StartInfo.FileName = "mseed2ascii.exe"; // compiler.StartInfo.Arguments = "HA.N02-202203080000.mseed"; // //compiler.StartInfo.FileName = System.Environment.CurrentDirectory+"\\m2a\\mseed2ascii.exe"; // //compiler.StartInfo.Arguments = System.Environment.CurrentDirectory + "\\m2a\\HA.N02-202203080000.mseed"; // //compiler.StartInfo.UseShellExecute = false; // // compiler.StartInfo.RedirectStandardOutput = true; // compiler.StartInfo.WindowStyle = ProcessWindowStyle.Maximized; // compiler.Start(); // //Console.WriteLine(compiler.StandardOutput.ReadToEnd()); // compiler.WaitForExit(); // Console.WriteLine(); // //Application.Current.Dispatcher.BeginInvoke(new Action(() => listBoxConverts.Items.Add("mseed2ascii.exe"))); // } //} //sw.Stop(); //TimeSpan ts2 = sw.Elapsed; //Console.WriteLine("sw总共花费{0}ms.", ts2.TotalMilliseconds); } public void ReadTxtData(object o) { Stopwatch sw = new Stopwatch(); sw.Start(); ChannelModel cmZ = new ChannelModel(); cmZ.Name = "Z"; cmZ.ReadDataFromTxt(GlobalConfig.ProjectConfig.TxtFilePath + "\\HA.N02-202203080000.txt", 0); ChannelModel cmE = new ChannelModel(); cmE.Name = "E"; cmE.ReadDataFromTxt(GlobalConfig.ProjectConfig.TxtFilePath + "\\HA.N02-202203080000.txt", 1); ChannelModel cmN = new ChannelModel(); cmN.Name = "N"; cmN.ReadDataFromTxt(GlobalConfig.ProjectConfig.TxtFilePath + "\\HA.N02-202203080000.txt", 2); sw.Stop(); TimeSpan ts2 = sw.Elapsed; //Dialog.Show("总共花费" + ts2.TotalMilliseconds + "ms."); // Console.WriteLine("总共花费{0}ms.", ts2.TotalMilliseconds); } } /// /// 波形组合 /// public enum WavesCombinationEnum { 平铺 = 0, 叠加, 分类 } /// /// 波形类型 /// public enum DataTypeEnum { 原始数据 = 0, 事件数据 } /// /// 数据来源 /// public enum DataSourcesEnum { 文件 = 0, 数据库 } /// /// 显示模式 /// public enum DisplayModeEnum { 自动 = 0, 手动 } public enum ScollModeEnum { Scrolling = 0, Stepping } }