//private static bool geoTrackIsUpdatingNow = false; private bool UpdateGeoTrack() { while (!Monitor.TryEnter(geoRenderer, 100)) { Application.DoEvents(); Thread.Sleep(100); } try { geoRenderer.listMarkers.Clear(); geoRenderer.listMarkers.Add(new Tuple <GPSdata, SequencesDrawingVariants, Bgr>(actualGPSdata, SequencesDrawingVariants.triangles, GeoTrackRenderer.tracksColor)); if (geoRenderer.mapFollowsActualGPSposition) { geoRenderer.gpsMapCenteredPoint = actualGPSdata.Clone(); } ThreadSafeOperations.SetLoadingCircleState(wcUpdatimgGeoTrack, true, true, wcUpdatimgGeoTrack.Color); //ThreadSafeOperations.UpdateImagePanel(imgPanelGeotrack, geoRenderer.RepresentTopo(imgPanelGeotrack.Size), cbNormalizeImage.Checked); //ThreadSafeOperations.UpdateImagePanel(imgPanelGeotrack, geoRenderer.RepresentTopo(new Size(0, 0)), cbNormalizeImage.Checked); ThreadSafeOperations.UpdatePictureBox(pbGeotrack, geoRenderer.RepresentTopo(new Size(0, 0)), cbNormalizeImage.Checked); ThreadSafeOperations.SetLoadingCircleState(wcUpdatimgGeoTrack, false, false, wcUpdatimgGeoTrack.Color); } finally { Monitor.Exit(geoRenderer); } return(true); }
private void LoadFieldData() { //if (tbFileName.Text != "") //{ // if (File.Exists(tbFileName.Text)) // { // currFileName = tbFileName.Text; // } //} //else //{ // OpenFileDialog d1 = new OpenFileDialog(); // d1.DefaultExt = "NetCDF files *.nc | *.nc"; // DialogResult res = d1.ShowDialog(); // if (res == System.Windows.Forms.DialogResult.Cancel) return; // if (res == System.Windows.Forms.DialogResult.OK) // { // ThreadSafeOperations.SetTextTB(tbFileName, d1.FileName, false); // currFileName = d1.FileName; // } //} // //dmLoadedData = NetCDFoperations.ReadDenseMatrixFromFile(currFileName, fieldVarName); currImgData = new imageConditionAndData(dmLoadedData, null); currImgData.currentColorSchemeRuler = new ColorSchemeRuler(currImgData.currentColorScheme); currImgData.UpdateColorSchemeRuler(); currImgData.currentColorSchemeRuler.IsMarginsFixed = false; currImgData.UpdateColorSchemeRuler(); currImage = new Image <Bgr, byte>(currImgData.dataRepresentingImageColored()); ThreadSafeOperations.UpdatePictureBox(pbCurrResult, currImage.Bitmap, true); sectionsList = new List <SectionDescription>(); currSectionPoints = new Tuple <PointD, PointD>(PointD.nullPointD(), PointD.nullPointD()); }
void bgwGraphsPresenter_DoWork(object sender, DoWorkEventArgs e) { Thread.CurrentThread.Priority = ThreadPriority.Lowest; graphImage = FillGraphImage(pbGraphs.Size); if (graphImage != null) { ThreadSafeOperations.UpdatePictureBox(pbGraphs, graphImage, false); } }
private void ShowGeoTrackOnce() { // пропишем в рисователь трека имена файлов, содержащих логи данных GPS ThreadSafeOperations.SetLoadingCircleState(wcUpdatimgGeoTrack, true, true, wcUpdatimgGeoTrack.Color); while (!Monitor.TryEnter(geoRenderer, 100)) { Application.DoEvents(); Thread.Sleep(0); } try { if ((geoRenderer.lTracksData.Count == 0) || (geoRenderer.lTracksData[0].tsGPSdata.Count == 0)) { DirectoryInfo dirInfo = new DirectoryInfo(Directory.GetCurrentDirectory() + "\\logs\\"); foreach (FileInfo fInfo in dirInfo.EnumerateFiles("*GPS*.nc", SearchOption.TopDirectoryOnly)) { geoRenderer.listGPSdataLogNetCDFFileNames.Add(fInfo.FullName); } geoRenderer.ReadGPSFiles(lblStatusString); } if ((geoRenderer.lTracksData[0].tsGPSdata.Count > 0)) { actualGPSdata = geoRenderer.lTracksData[0].tsGPSdata.DataValues.Last(); } else { actualGPSdata = new GPSdata(6000.0d, 0.0d); } geoRenderer.listMarkers.Clear(); geoRenderer.listMarkers.Add(new Tuple <GPSdata, SequencesDrawingVariants, Bgr>(actualGPSdata, SequencesDrawingVariants.triangles, GeoTrackRenderer.tracksColor)); if (geoRenderer.mapFollowsActualGPSposition) { geoRenderer.gpsMapCenteredPoint = actualGPSdata.Clone(); } // ThreadSafeOperations.UpdateImagePanel(imgPanelGeotrack, geoRenderer.RepresentTopo(imgPanelGeotrack.Size), cbNormalizeImage.Checked); //ThreadSafeOperations.UpdateImagePanel(imgPanelGeotrack, geoRenderer.RepresentTopo(new Size(0, 0)), cbNormalizeImage.Checked); //ThreadSafeOperations.UpdatePictureBox(pbGeotrack, geoRenderer.RepresentTopo(new Size(0, 0)), cbNormalizeImage.Checked); ThreadSafeOperations.UpdatePictureBox(pbGeotrack, geoRenderer.RepresentTopo(pbGeotrack.Size), cbNormalizeImage.Checked); } finally { Monitor.Exit(geoRenderer); } ThreadSafeOperations.SetLoadingCircleState(wcUpdatimgGeoTrack, false, false, wcUpdatimgGeoTrack.Color); }
private void MainForm_Paint(object sender, PaintEventArgs e) { if (currImage != null) { Image <Bgr, byte> currShowingImage = currImage.Copy(); foreach (SectionDescription sectionDescription in sectionsList) { currShowingImage.Draw( new LineSegment2DF(sectionDescription.p1.PointF(), sectionDescription.p2.PointF()), new Bgr(Color.Black), 2); } ThreadSafeOperations.UpdatePictureBox(pbCurrResult, currShowingImage.Bitmap, true); } }
private void Represent() { Dictionary <string, object> dictDataToShow = NetCDFoperations.ReadDataFromFile(strLogFilename); long[] arrDateTimeTicksValues = new long[] { 0 }; if (dictDataToShow.Keys.Contains("DateTime")) { arrDateTimeTicksValues = (long[])(dictDataToShow["DateTime"]); } else if (dictDataToShow.Keys.Contains("Datetime")) { arrDateTimeTicksValues = (long[])(dictDataToShow["Datetime"]); } else { MessageBox.Show("Couldn`t acces the DateTime field of the file " + strLogFilename, "", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } DenseVector dvSecondsVector = DenseVector.Create(arrDateTimeTicksValues.Length, i => { DateTime dateTime1 = new DateTime(arrDateTimeTicksValues[i]); TimeSpan dt = dateTime1 - dateTime1.Date; return(dt.TotalSeconds); }); dmAccData = (DenseMatrix)dictDataToShow["AccelerometerData"]; if (sensorsHistoryRepresentingScale < 86400) { double lastDateTimeSecondsValue = dvSecondsVector[dvSecondsVector.Count - 1]; int searchingIndex = dvSecondsVector.Count - 1; for (int idx = dvSecondsVector.Count - 1; idx >= 0; idx--) { if (lastDateTimeSecondsValue - dvSecondsVector[idx] >= sensorsHistoryRepresentingScale) { searchingIndex = idx; break; } } dvSecondsVector = (DenseVector)dvSecondsVector.SubVector(searchingIndex, dvSecondsVector.Count - searchingIndex); dmAccData = (DenseMatrix)dmAccData.SubMatrix(searchingIndex, dvSecondsVector.Count, 0, dmAccData.ColumnCount); } #region filter input data noise List <DenseVector> dmAccDataFiltered = new List <DenseVector>(); Dictionary <string, DenseVector> dictCurrColumnFilteredData = new Dictionary <string, DenseVector>(); for (int col = 0; col < dmAccData.ColumnCount; col++) { DenseVector dvVectToFilter = (DenseVector)dmAccData.Column(col); dictCurrColumnFilteredData = DataAnalysis.SavGolFilter(dvVectToFilter, dvSecondsVector, 6, 6, 0, 6); dmAccDataFiltered.Add(dictCurrColumnFilteredData["values"]); //dmAccData.SetColumn(col, dictCurrColumnFilteredData["values"]); //dvSecondsVector = dictCurrColumnFilteredData["time"]; } dvSecondsVector = dictCurrColumnFilteredData["time"]; dmAccData = (DenseMatrix)DenseMatrix.OfColumns(dvSecondsVector.Count, dmAccData.ColumnCount, dmAccDataFiltered); #endregion filter input data noise // надо рассчитать углы отклонения отдельно - по сглаженным данным и по данным гироскопа DenseVector dvDataToShowDevAngleValue = (DenseVector)dmAccData.Column(6); if (cbFilterData.Checked) { List <double> ac = new List <double>(); } if (accDeviationAngleRenderer == null) { accDeviationAngleRenderer = new MultipleScatterAndFunctionsRepresentation(pbRepresentingDevAngle.Size); accDeviationAngleRenderer.dvScatterXSpace.Add(dvSecondsVector); accDeviationAngleRenderer.dvScatterFuncValues.Add(dvDataToShowDevAngleValue); accDeviationAngleRenderer.scatterLineColors.Add(new Bgr(Color.Blue)); accDeviationAngleRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); } else { if (accDeviationAngleRenderer.xSpaceMin != dvSecondsVector.Max() - sensorsHistoryRepresentingScale) { accDeviationAngleRenderer.xSpaceMin = dvSecondsVector.Max() - sensorsHistoryRepresentingScale; accDeviationAngleRenderer.dvScatterXSpace.Clear(); accDeviationAngleRenderer.dvScatterFuncValues.Clear(); accDeviationAngleRenderer.scatterLineColors.Clear(); accDeviationAngleRenderer.scatterDrawingVariants.Clear(); accDeviationAngleRenderer.dvScatterXSpace.Add(dvSecondsVector); accDeviationAngleRenderer.dvScatterFuncValues.Add(dvDataToShowDevAngleValue); accDeviationAngleRenderer.scatterLineColors.Add(new Bgr(Color.Blue)); accDeviationAngleRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); } } accDeviationAngleRenderer.xSpaceMin = dvSecondsVector.Max() - sensorsHistoryRepresentingScale; accDeviationAngleRenderer.Represent(); ThreadSafeOperations.UpdatePictureBox(pbRepresentingDevAngle, accDeviationAngleRenderer.TheImage.Bitmap); DenseVector dvDataToShowAccMagnitudeDev = DenseVector.Create(dmAccData.RowCount, i => { AccelerometerData currAccData = new AccelerometerData(dmAccData[i, 0], dmAccData[i, 1], dmAccData[i, 2]); AccelerometerData calibrationAccData = new AccelerometerData(dmAccData[i, 3], dmAccData[i, 4], dmAccData[i, 5]); return(currAccData.AccMagnitude - calibrationAccData.AccMagnitude); }); if (accDeviationMagnitudeRenderer == null) { accDeviationMagnitudeRenderer = new MultipleScatterAndFunctionsRepresentation(pbRepresentingDevMagnitude.Size); accDeviationMagnitudeRenderer.dvScatterXSpace.Add(dvSecondsVector); accDeviationMagnitudeRenderer.dvScatterFuncValues.Add(dvDataToShowAccMagnitudeDev); accDeviationMagnitudeRenderer.scatterLineColors.Add(new Bgr(Color.Blue)); accDeviationMagnitudeRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); } else { if (accDeviationMagnitudeRenderer.xSpaceMin != dvSecondsVector.Max() - sensorsHistoryRepresentingScale) { accDeviationMagnitudeRenderer.xSpaceMin = dvSecondsVector.Max() - sensorsHistoryRepresentingScale; accDeviationMagnitudeRenderer.dvScatterXSpace.Clear(); accDeviationMagnitudeRenderer.dvScatterFuncValues.Clear(); accDeviationMagnitudeRenderer.scatterLineColors.Clear(); accDeviationMagnitudeRenderer.scatterDrawingVariants.Clear(); accDeviationMagnitudeRenderer.dvScatterXSpace.Add(dvSecondsVector); accDeviationMagnitudeRenderer.dvScatterFuncValues.Add(dvDataToShowAccMagnitudeDev); accDeviationMagnitudeRenderer.scatterLineColors.Add(new Bgr(Color.Blue)); accDeviationMagnitudeRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); } } accDeviationMagnitudeRenderer.xSpaceMin = dvSecondsVector.Max() - sensorsHistoryRepresentingScale; accDeviationMagnitudeRenderer.Represent(); ThreadSafeOperations.UpdatePictureBox(pbRepresentingDevMagnitude, accDeviationMagnitudeRenderer.TheImage.Bitmap); AccelerometerData accCalibratedData = new AccelerometerData(dmAccData[0, 3], dmAccData[0, 4], dmAccData[0, 5]); double phiAngle = Math.Asin(accCalibratedData.xyProjectionMagnitude() / accCalibratedData.AccMagnitude); double tmpL = accCalibratedData.AccMagnitude * Math.Sin(phiAngle) * Math.Cos(phiAngle); double tmpLz = tmpL * Math.Sin(phiAngle); double tmpLx = tmpL * Math.Cos(phiAngle) * Math.Sqrt(1 + accCalibratedData.AccY * accCalibratedData.AccY / (accCalibratedData.AccX * accCalibratedData.AccX)); double tmpLy = tmpLx * accCalibratedData.AccY / accCalibratedData.AccX; AccelerometerData unitaryAccVectorZeroAngle = new AccelerometerData(tmpLx, tmpLy, tmpLz); unitaryAccVectorZeroAngle = unitaryAccVectorZeroAngle / unitaryAccVectorZeroAngle.AccMagnitude; AccelerometerData unitaryAccVectorCalibratedAcceleration = accCalibratedData / (accCalibratedData.AccMagnitude); DenseVector dvDataToShowAccDevDirection = DenseVector.Create(dmAccData.RowCount, i => { AccelerometerData currAccData = new AccelerometerData(dmAccData[i, 0], dmAccData[i, 1], dmAccData[i, 2]); AccelerometerData currAccDataProjectionPerpendicularToCalibratedAcc = currAccData - unitaryAccVectorCalibratedAcceleration * (currAccData * accCalibratedData / accCalibratedData.AccMagnitude); double retAngle = Math.Acos(currAccDataProjectionPerpendicularToCalibratedAcc * unitaryAccVectorZeroAngle / currAccDataProjectionPerpendicularToCalibratedAcc.AccMagnitude); AccelerometerData vectProduct = unitaryAccVectorZeroAngle ^ currAccDataProjectionPerpendicularToCalibratedAcc; if (vectProduct * unitaryAccVectorCalibratedAcceleration > 0) { //значит угол лежит в пределах от 0 до PI - ничего не делаем retAngle = retAngle + 0.0d; } else { //векторное произведение противоположно по направлению g0 - значит, угол лежит в диапазоне от Pi до 2Pi или от -PI до PI retAngle = -retAngle; } return(retAngle); }); if (accDeviationDirectionRenderer == null) { accDeviationDirectionRenderer = new MultipleScatterAndFunctionsRepresentation(pbRepresentingDevDirection.Size); accDeviationDirectionRenderer.dvScatterXSpace.Add(dvSecondsVector); accDeviationDirectionRenderer.dvScatterFuncValues.Add(dvDataToShowAccDevDirection); accDeviationDirectionRenderer.scatterLineColors.Add(new Bgr(Color.Blue)); accDeviationDirectionRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); } else { if (accDeviationDirectionRenderer.xSpaceMin != dvSecondsVector.Max() - sensorsHistoryRepresentingScale) { accDeviationDirectionRenderer.xSpaceMin = dvSecondsVector.Max() - sensorsHistoryRepresentingScale; accDeviationDirectionRenderer.dvScatterXSpace.Clear(); accDeviationDirectionRenderer.dvScatterFuncValues.Clear(); accDeviationDirectionRenderer.scatterLineColors.Clear(); accDeviationDirectionRenderer.scatterDrawingVariants.Clear(); accDeviationDirectionRenderer.dvScatterXSpace.Add(dvSecondsVector); accDeviationDirectionRenderer.dvScatterFuncValues.Add(dvDataToShowAccDevDirection); accDeviationDirectionRenderer.scatterLineColors.Add(new Bgr(Color.Blue)); accDeviationDirectionRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); } } accDeviationDirectionRenderer.xSpaceMin = dvSecondsVector.Max() - sensorsHistoryRepresentingScale; accDeviationDirectionRenderer.Represent(); ThreadSafeOperations.UpdatePictureBox(pbRepresentingDevDirection, accDeviationDirectionRenderer.TheImage.Bitmap); }
private void button1_Click(object sender, EventArgs e) { if (bgwPlayingPresenter != null && bgwPlayingPresenter.IsBusy) { bgwPlayingPresenter.CancelAsync(); return; } if (accDeviationMagnitudeRenderer.verticalMarkersIndexesUsingXSpace.Count == 0) { return; } int currentDateTimeIndex = accDeviationMagnitudeRenderer.verticalMarkersIndexesUsingXSpace[0]; ThreadSafeOperations.ToggleButtonState(btnPlayStopAccAnimation, true, "STOP", true); DoWorkEventHandler currDoWorkHandler = delegate(object currBGWsender, DoWorkEventArgs args) { BackgroundWorker selfworker = currBGWsender as BackgroundWorker; SimpleVectorGraphics2D frontViewRenderer = new SimpleVectorGraphics2D(pbAccSideVisualization.Size); frontViewRenderer.presentAxes = false; frontViewRenderer.ptLeftTopSpaceCorner = new PointD(-5.0d, 0.0d); frontViewRenderer.ptRightBottomSpaceCorner = new PointD(5.0d, -10.0d); //frontViewRenderer.listVectorsToDraw.Add(DenseVector.OfEnumerable(new double[] {1.0d, -9.0d})); //frontViewRenderer.listVectorsShift.Add(DenseVector.OfEnumerable(new double[] {0.0d, 0.0d})); //frontViewRenderer.listVectColors.Add(new Bgr(Color.Blue)); //frontViewRenderer.Represent(); //ThreadSafeOperations.UpdatePictureBox(pbAccSideVisualization, frontViewRenderer.TheImage.Bitmap, false); for (int i = currentDateTimeIndex; i < accDeviationMagnitudeRenderer.dvScatterXSpace[0].Count - 1; i++) { if (selfworker.CancellationPending) { break; } DateTime dtStartCalculate = DateTime.Now; accDeviationMagnitudeRenderer.verticalMarkersList.Clear(); accDeviationMagnitudeRenderer.verticalMarkersList.Add(accDeviationMagnitudeRenderer.dvScatterXSpace[0][i]); accDeviationMagnitudeRenderer.verticalMarkersIndexesUsingXSpace.Clear(); accDeviationMagnitudeRenderer.verticalMarkersIndexesUsingXSpace.Add(i); accDeviationMagnitudeRenderer.RepresentMarkers(); ThreadSafeOperations.UpdatePictureBox(pbRepresentingDevMagnitude, accDeviationMagnitudeRenderer.TheImage.Bitmap, false); accDeviationAngleRenderer.verticalMarkersList.Clear(); accDeviationAngleRenderer.verticalMarkersList.Add(accDeviationAngleRenderer.dvScatterXSpace[0][i]); accDeviationAngleRenderer.verticalMarkersIndexesUsingXSpace.Clear(); accDeviationAngleRenderer.verticalMarkersIndexesUsingXSpace.Add(i); accDeviationAngleRenderer.RepresentMarkers(); ThreadSafeOperations.UpdatePictureBox(pbRepresentingDevAngle, accDeviationAngleRenderer.TheImage.Bitmap, false); accDeviationDirectionRenderer.verticalMarkersList.Clear(); accDeviationDirectionRenderer.verticalMarkersList.Add(accDeviationDirectionRenderer.dvScatterXSpace[0][i]); accDeviationDirectionRenderer.verticalMarkersIndexesUsingXSpace.Clear(); accDeviationDirectionRenderer.verticalMarkersIndexesUsingXSpace.Add(i); accDeviationDirectionRenderer.RepresentMarkers(); ThreadSafeOperations.UpdatePictureBox(pbRepresentingDevDirection, accDeviationDirectionRenderer.TheImage.Bitmap, false); frontViewRenderer.listVectorsToDraw.Clear(); frontViewRenderer.listVectorsShift.Clear(); frontViewRenderer.listVectColors.Clear(); //int globalArrayIndex = sensorsHistoryRepresentingScale + i-1; DenseVector zeroValuesVect = DenseVector.OfEnumerable(new double[] { 0.0d, 0.0d }); DenseVector dvAccCalibrated = DenseVector.Create(3, idx => dmAccData[i, idx + 3]); DenseVector dvAccCurrent = DenseVector.Create(3, idx => dmAccData[i, idx]); AccelerometerData accCalibrated = new AccelerometerData(dvAccCalibrated); accCalibrated.AccDoubleZ = -accCalibrated.AccDoubleZ; AccelerometerData currAcc = new AccelerometerData(dvAccCurrent); currAcc.AccDoubleZ = -currAcc.AccDoubleZ; double koeffToRealGravity = 9.81d / accCalibrated.AccMagnitude; accCalibrated = accCalibrated * koeffToRealGravity; currAcc = currAcc * koeffToRealGravity; AccelerometerData dAccCalibration = accCalibrated - (new AccelerometerData(0.0d, 0.0d, -9.81d)); currAcc = currAcc - dAccCalibration; accCalibrated = accCalibrated - dAccCalibration; frontViewRenderer.listVectorsToDraw.Add(DenseVector.OfEnumerable(new double[] { accCalibrated.xyProjectionMagnitude(), accCalibrated.AccDoubleZ })); frontViewRenderer.listVectorsShift.Add(zeroValuesVect); frontViewRenderer.listVectColors.Add(new Bgr(Color.Blue)); frontViewRenderer.listVectorsToDraw.Add(DenseVector.OfEnumerable(new double[] { currAcc.xyProjectionMagnitude(), currAcc.AccDoubleZ })); frontViewRenderer.listVectorsShift.Add(zeroValuesVect); frontViewRenderer.listVectColors.Add(new Bgr(Color.Red)); frontViewRenderer.Represent(); ThreadSafeOperations.UpdatePictureBox(pbAccSideVisualization, frontViewRenderer.TheImage.Bitmap, false); TimeSpan dtCalculationTime = DateTime.Now - dtStartCalculate; double timeToWait = (accDeviationDirectionRenderer.dvScatterXSpace[0][i + 1] - accDeviationDirectionRenderer.dvScatterXSpace[0][i]) * 1000.0d - (double)(dtCalculationTime.TotalMilliseconds); if (timeToWait > 0) { //System.Windows.Forms.Application.DoEvents(); Thread.Sleep(Convert.ToInt32(timeToWait)); } } }; RunWorkerCompletedEventHandler currWorkCompletedHandler = delegate(object currBGWCompletedSender, RunWorkerCompletedEventArgs args) { ThreadSafeOperations.ToggleButtonState(btnPlayStopAccAnimation, true, "PLAY", true); }; bgwPlayingPresenter = new BackgroundWorker(); bgwPlayingPresenter.WorkerSupportsCancellation = true; bgwPlayingPresenter.DoWork += currDoWorkHandler; bgwPlayingPresenter.RunWorkerCompleted += currWorkCompletedHandler; object[] BGWargs = new object[] { "", "" }; bgwPlayingPresenter.RunWorkerAsync(BGWargs); }
private void ShowImageForm_Resize(object sender, EventArgs e) { int[] SetImageSize = ThreadSafeOperations.UpdatePictureBox(pictureBox1, LocalBitmap2show, true); SetImageWidth = SetImageSize[0]; SetImageHeight = SetImageSize[1]; }