private TableHeader GetTableHeaderLine(TextDocument document, int offset, CurveInfo curveInfo)
        {
            var line = document.GetLineByOffset(offset)?.NextLine;

            while (line != null)
            {
                string tableHeader = document.GetText(line).Trim();
                if (IsEmptyOrCommentLine(tableHeader))
                {
                    line = line.NextLine;
                }
                else
                {
                    var tableRow     = ToRow(tableHeader);
                    int xColumnIndex = tableRow.IndexOf(curveInfo.XColumn);
                    int yColumnIndex = tableRow.IndexOf(curveInfo.YColumn);

                    if ((xColumnIndex >= 0) && (yColumnIndex >= 0))
                    {
                        return(new TableHeader
                        {
                            HeaderLine = line,
                            XColumn = xColumnIndex,
                            YColumn = yColumnIndex
                        });
                    }
                    return(null);
                }
            }

            return(null);
        }
        private CurveViewItem LoadCurveViewItem(TextDocument document, int offset, CurveInfo curveInfo)
        {
            var tableHeader = GetTableHeaderLine(document, offset, curveInfo);

            if (tableHeader == null)
            {
                return(null);
            }

            double        duration;
            List <GPoint> points = ExtractPoints(document, tableHeader, curveInfo.IsGeoCoordinate, out duration);

            if (points.Count < 3)
            {
                return(null);
            }

            string        key           = CurvePlotModel.MakeKey(document.FileName, points, curveInfo);
            CurveViewItem curveViewItem = m_CurveViewItems.FirstOrDefault(x => x.Key == key);

            if (curveViewItem == null)
            {
                var curveModel = new CurvePlotModel(document.FileName, points, ShowPlotMarker, curveInfo, m_CurveManeuverParameter, duration);
                curveViewItem = new CurveViewItem(curveModel);
                m_CurveViewItems.Insert(0, curveViewItem);
            }

            Util.Util.RemoveLastItems(m_CurveViewItems, max_num: CacheSize);

            return(curveViewItem);
        }
        public static string MakeKey(string featureFileName, List <GPoint> points, CurveInfo curveInfo)
        {
            double xValue = 0;
            double yValue = 0;

            for (int i = 0; i < points.Count; i++)
            {
                xValue += points[i].X * (i + 1);
                yValue += points[i].Y * (i + 1);
            }

            StringBuilder sb = new StringBuilder();

            sb.Append(featureFileName)
            .Append(curveInfo.IsGeoCoordinate.ToString())
            .Append(curveInfo.Option)
            .Append("_")
            .Append(curveInfo.Description)
            .Append("_")
            .Append(curveInfo.XColumn)
            .Append(curveInfo.YColumn)
            .Append(xValue)
            .Append(yValue);

            return(sb.ToString());
        }
        InlineObjectElement CreateUIElement(int length, int offset, CurveInfo curveInfo)
        {
            if (base.IsPrinting)
            {
                BitmapImage bitmap = CurveViewCache.Instance.LoadImage(Document, offset, curveInfo);
                if (bitmap != null)
                {
                    var image = new System.Windows.Controls.Image();
                    image.Source = bitmap;

                    image.Width  = bitmap.PixelWidth;
                    image.Height = bitmap.PixelHeight;
                    image.Cursor = Cursors.Arrow;
                    // Pass the length of the match to the 'documentLength' parameter
                    // of InlineObjectElement.
                    return(new InlineObjectElement(length, image));
                }
            }
            else
            {
                OxyPlot.Wpf.PlotView view = CurveViewCache.Instance.LoadPlotView(Document, offset, curveInfo);
                if (view != null)
                {
                    return(new InlineObjectElement(length, view));
                }
            }

            return(null);
        }
        private List <GPoint> ConvertCurvatureUnit(List <GPoint> points, CurveInfo curveInfo)
        {
            if (curveInfo.Option != "simplify_cm")
            {
                return(points);
            }

            List <GPoint> newPoints = new List <GPoint>(points.Count);

            points.ForEach(x => newPoints.Add(new GPoint(x.X, x.Y * 100.0)));
            return(newPoints);
        }
        protected override InlineObjectElement ConstructMainElement(int offset)
        {
            Match m = FindMatch(offset);

            // check whether there's a match exactly at offset
            if (m.Success && m.Index == 0)
            {
                CurveInfo curveInfo = new CurveInfo();
                curveInfo.IsGeoCoordinate = m.Groups[1].Value.Length > 0;
                curveInfo.Option          = m.Groups[2].Value;
                curveInfo.Description     = m.Groups[3].Value.Trim();
                curveInfo.XColumn         = m.Groups[4].Value.Trim();
                curveInfo.YColumn         = m.Groups[5].Value.Trim();

                return(CreateUIElement(m.Length, offset, curveInfo));
            }
            return(null);
        }
        public BitmapImage LoadImage(TextDocument document, int offset, CurveInfo curveInfo)
        {
            CurveViewItem curveViewItem = LoadCurveViewItem(document, offset, curveInfo);

            return(curveViewItem?.BitmapImage);
        }
        public OxyPlot.Wpf.PlotView LoadPlotView(TextDocument document, int offset, CurveInfo curveInfo)
        {
            CurveViewItem curveViewItem = LoadCurveViewItem(document, offset, curveInfo);

            return(curveViewItem?.PlotView);
        }
        public CurvePlotModel(string featureFileName,
                              List <GPoint> points,
                              bool showMarker,
                              CurveInfo curveInfo,
                              CurveManeuverParameter curveManeuverParameter,
                              double pointExtractionDuration)
        {
            this.ShowMarker                    = showMarker;
            this.CurveInfo                     = curveInfo;
            this.CurveManeuverParameter        = curveManeuverParameter;
            this.PointExtractionDurationTimeMS = pointExtractionDuration;

            Key = MakeKey(featureFileName, points, curveInfo);

            double curveLength = BezierCurveLength.LengthByQuadratic(points);

            base.PlotMargins = new OxyPlot.OxyThickness(60, 0, 0, 40);
            base.Title       = curveInfo.Title;

            List <GPoint> newPoint;

            switch (curveInfo.Option)
            {
            case "simplify":
                PlotOriginalCurve(points);
                PlotSimplifyCurvature(points);
                break;

            case "simplify_cm":
                newPoint = ConvertCurvatureUnit(points, curveInfo);
                PlotOriginalCurve(newPoint);
                PlotSimplifyCurvature(newPoint);
                break;

            case "bezier":
                PlotOriginalCurve(points);
                AddBezierByNURBS(points);
                PlotCurveManeuver(points, curveLength, points.Count - 1);
                break;

            case "bspline":
                PlotOriginalCurve(points);
                AddBSplineByNURBS(points, curveLength);
                PlotCurveManeuver(points, curveLength, SplineDegree(points));
                break;

            case "brcurvature":     // Raw curvature
                PlotBSplineRawCurvatureByNURBS(points, curveLength);
                break;

            case "bcurvature":      // Bezier curvature
            case "curvature":
                PlotBezierCurvatureByNURBS(points, curveLength);
                break;

            case "tangent":       // Tangent
                PlotTangent(points);
                break;

            case "degtangent":       // Tangent by degree of Bezier curve
                PlotBezierTangentByDegree(points);
                break;

            case "linreg":       // linear regression
                PlotOriginalCurve(points, useLinearSeries: false);
                PlotLinearRegression(points);
                break;

            default:
                PlotOriginalCurve(points);
                break;
            }
        }