1、背景:ide
在PDF上畫一系列的塊,獲取該系列的塊,自動分組(自動判斷塊是否相交,相交則視爲一組,獨立的塊爲一組),返回各組塊的點集;窗體顯示點集路徑圖標。this
效果:支持 單塊、多塊(包含多異形塊)爲一個圖形spa
2、自動分組,返回組塊點集合。代碼以下:code
#region 一資源多區域錨點 /// <summary> /// 獲取錨點區域 支持1到多 /// </summary> /// <param name="annotPosInfo"></param> /// <returns></returns> public string GetResMultiRegionAnnotPointsInfo(string annotPosInfo) { string annotPointsInfo = string.Empty; //獲取全部錨點塊信息 List<AnnotPosModel> lstAnnotPosMdl = GetResAnnotPoses(annotPosInfo); if (lstAnnotPosMdl == null || lstAnnotPosMdl.Count <= 0) { return annotPointsInfo; } //待處理的錨點塊集 ( Y軸、X軸遞增排序) List<AnnotPosModel> dealAnnotPosMdls = new List<AnnotPosModel>(); var sortAnnotPosMdls = lstAnnotPosMdl.OrderBy(mdl => mdl.Top).OrderBy(mdl => mdl.Left); dealAnnotPosMdls.AddRange(sortAnnotPosMdls); //當前處理的錨點塊 AnnotPosModel curAnnotPosMdl = dealAnnotPosMdls.First(); dealAnnotPosMdls.Remove(curAnnotPosMdl); //相交錨點塊集 List<AnnotPosModel> relAnnotPosModels = new List<AnnotPosModel>(); relAnnotPosModels.Add(curAnnotPosMdl); annotPointsInfo = GetResMultiRegionAnnotPointsInfo(dealAnnotPosMdls, relAnnotPosModels, curAnnotPosMdl); return annotPointsInfo; } /// <summary> /// 獲取錨點區域 支持1到多 /// </summary> /// <param name="annotPosInfo"></param> /// <returns></returns> public List<string> GetResMultiRegionAnnotPointsInfo2(string annotPosInfo) { List<string> lstAnnotPointsInfo = new List<string>(); string annotPointsInfo = string.Empty; //獲取全部錨點塊信息 List<AnnotPosModel> lstAnnotPosMdl = GetResAnnotPoses(annotPosInfo); if (lstAnnotPosMdl == null || lstAnnotPosMdl.Count <= 0) { return lstAnnotPointsInfo; } //待處理的錨點塊集 ( Y軸、X軸遞增排序) List<AnnotPosModel> dealAnnotPosMdls = new List<AnnotPosModel>(); var sortAnnotPosMdls = lstAnnotPosMdl.OrderBy(mdl => mdl.Top).OrderBy(mdl => mdl.Left); dealAnnotPosMdls.AddRange(sortAnnotPosMdls); //當前處理的錨點塊 AnnotPosModel curAnnotPosMdl = dealAnnotPosMdls.First(); dealAnnotPosMdls.Remove(curAnnotPosMdl); //相交錨點塊集 List<AnnotPosModel> relAnnotPosModels = new List<AnnotPosModel>(); relAnnotPosModels.Add(curAnnotPosMdl); lstAnnotPointsInfo = this.GetResMultiRegionAnnotPointsInfo2(dealAnnotPosMdls, relAnnotPosModels, curAnnotPosMdl); return lstAnnotPointsInfo; } /// <summary> /// 獲取錨點區域 支持1到多 /// </summary> /// <param name="dealAnnotPosMdls"></param> /// <param name="relAnnotPosModels"></param> /// <param name="curAnnotPosMdl"></param> /// <returns></returns> private string GetResMultiRegionAnnotPointsInfo(List<AnnotPosModel> dealAnnotPosMdls , List<AnnotPosModel> relAnnotPosModels, AnnotPosModel curAnnotPosMdl) { string annotPointsInfo = string.Empty; if ((dealAnnotPosMdls == null ) || (relAnnotPosModels == null) || (curAnnotPosMdl == null)) { LogHelper.Instance.Error("獲取一資源多錨點區域點集合失敗(GetResMultiRegionAnnotPointsInfo)。" ); return annotPointsInfo; } //設置當前錨點相交區域內的錨點塊集 this.SetAnnotRelRegionAnnotPoints(dealAnnotPosMdls, relAnnotPosModels, curAnnotPosMdl); //仍存在待處理的錨點塊,則遍歷已相交的鏈表 while (dealAnnotPosMdls.Count > 0) { int curIndex = relAnnotPosModels.FindIndex(mdl => mdl == curAnnotPosMdl); int nextIndex = curIndex + 1; if (relAnnotPosModels.Count == nextIndex) //遍歷已相交的鏈表完畢 { if (!string.IsNullOrEmpty(annotPointsInfo)) { annotPointsInfo += "&&"; } //球場相交錨點點集合信息 annotPointsInfo += this.GetMergeAnnotPointsInfo(relAnnotPosModels); //設置下一塊相交區域 curAnnotPosMdl = dealAnnotPosMdls.First(); //相交錨點塊集 dealAnnotPosMdls.Remove(curAnnotPosMdl); relAnnotPosModels = new List<AnnotPosModel>(); relAnnotPosModels.Add(curAnnotPosMdl); //設置當前錨點相交區域內的錨點塊集 this.SetAnnotRelRegionAnnotPoints(dealAnnotPosMdls, relAnnotPosModels, curAnnotPosMdl); } else { curAnnotPosMdl = relAnnotPosModels[nextIndex]; ////設置當前錨點相交區域內的錨點塊集 this.SetAnnotRelRegionAnnotPoints(dealAnnotPosMdls, relAnnotPosModels, curAnnotPosMdl); } } //else { //輸出信息退出 if (!string.IsNullOrEmpty(annotPointsInfo)) { annotPointsInfo += "&&"; } annotPointsInfo += this.GetMergeAnnotPointsInfo(relAnnotPosModels); } return annotPointsInfo; } /// <summary> /// 獲取錨點區域 支持1到多 /// </summary> /// <param name="dealAnnotPosMdls"></param> /// <param name="relAnnotPosModels"></param> /// <param name="curAnnotPosMdl"></param> /// <returns></returns> private List<string> GetResMultiRegionAnnotPointsInfo2(List<AnnotPosModel> dealAnnotPosMdls, List<AnnotPosModel> relAnnotPosModels, AnnotPosModel curAnnotPosMdl) { List<string> lstAnnotPointsInfo = new List<string>(); if ((dealAnnotPosMdls == null) || (relAnnotPosModels == null) || (curAnnotPosMdl == null)) { LogHelper.Instance.Error("獲取一資源多錨點區域點集合失敗(GetResMultiRegionAnnotPointsInfo)。"); return null; } //設置當前錨點相交區域內的錨點塊集 this.SetAnnotRelRegionAnnotPoints(dealAnnotPosMdls, relAnnotPosModels, curAnnotPosMdl); //仍存在待處理的錨點塊,則遍歷已相交的鏈表 while (dealAnnotPosMdls.Count > 0) { int curIndex = relAnnotPosModels.FindIndex(mdl => mdl == curAnnotPosMdl); int nextIndex = curIndex + 1; if (relAnnotPosModels.Count == nextIndex) //遍歷已相交的鏈表完畢 { //求相交錨點點集合信息 string annotPointsInfo = this.GetMergeAnnotPointsInfo(relAnnotPosModels); if (!string.IsNullOrEmpty(annotPointsInfo)) { lstAnnotPointsInfo.Add(annotPointsInfo); } //設置下一塊相交區域 curAnnotPosMdl = dealAnnotPosMdls.First(); //相交錨點塊集 dealAnnotPosMdls.Remove(curAnnotPosMdl); relAnnotPosModels = new List<AnnotPosModel>(); relAnnotPosModels.Add(curAnnotPosMdl); //設置當前錨點相交區域內的錨點塊集 this.SetAnnotRelRegionAnnotPoints(dealAnnotPosMdls, relAnnotPosModels, curAnnotPosMdl); } else { curAnnotPosMdl = relAnnotPosModels[nextIndex]; ////設置當前錨點相交區域內的錨點塊集 this.SetAnnotRelRegionAnnotPoints(dealAnnotPosMdls, relAnnotPosModels, curAnnotPosMdl); } } //else { string annotPointsInfo = this.GetMergeAnnotPointsInfo(relAnnotPosModels); if (!string.IsNullOrEmpty(annotPointsInfo)) { lstAnnotPointsInfo.Add(annotPointsInfo); } } return lstAnnotPointsInfo; } /// <summary> /// 設置錨點相交的區域點塊集 /// </summary> /// <param name="dealAnnotPosMdls"></param> /// <param name="relAnnotPosModels"></param> /// <param name="curAnnotPosMdl"></param> private void SetAnnotRelRegionAnnotPoints(List<AnnotPosModel> dealAnnotPosMdls, List<AnnotPosModel> relAnnotPosModels, AnnotPosModel curAnnotPosMdl) { if((dealAnnotPosMdls == null ) || (relAnnotPosModels == null) || (curAnnotPosMdl == null)) { return; } //遍歷剩下待處理的全部錨點塊 foreach (AnnotPosModel annotPosMdl in dealAnnotPosMdls) { //檢查是否相交 if (AnnotsIsIntersect(curAnnotPosMdl, annotPosMdl)) { relAnnotPosModels.Add(annotPosMdl); } } //待處理的錨點塊集中移除相交的錨點塊 foreach (AnnotPosModel relAnnotPosMdl in relAnnotPosModels) { dealAnnotPosMdls.Remove(relAnnotPosMdl); } } /// <summary> /// 判斷兩個錨點塊是否相交 /// </summary> /// <param name="annotPosMdl1"></param> /// <param name="annotPosMdl2"></param> /// <returns></returns> public bool AnnotsIsIntersect(AnnotPosModel annotPosMdl1, AnnotPosModel annotPosMdl2) { bool isIntersect = false; //上下區分 AnnotPosModel topAnnotPosMdl = annotPosMdl1; AnnotPosModel downAnnotPosMdl = annotPosMdl2; if(topAnnotPosMdl.Top < downAnnotPosMdl.Top) { topAnnotPosMdl = annotPosMdl2; downAnnotPosMdl = annotPosMdl1; } //是否相交 if(downAnnotPosMdl.Top <= topAnnotPosMdl.Top && downAnnotPosMdl.Top >= topAnnotPosMdl.Bottom && ((downAnnotPosMdl.Left >= topAnnotPosMdl.Left &&downAnnotPosMdl.Left<=topAnnotPosMdl.Right) || (downAnnotPosMdl.Right >= topAnnotPosMdl.Left && downAnnotPosMdl.Right <= topAnnotPosMdl.Right) )) { isIntersect = true; } return isIntersect; } #endregion
輔助代碼:orm
#region 異形錨點位置 手動計算 /// <summary> /// 獲取異形錨點點集合信息 /// </summary> /// <param name="annotPosInfo">錨點位置信息</param> /// <returns></returns> public string GetResAnnotPointsInfo(string annotPosInfo) { string annotPointsInfo = string.Empty; List<AnnotPosModel> lstAnnotPosMdl = GetResAnnotPoses(annotPosInfo); annotPointsInfo = this.GetResAnnotPointsInfo(lstAnnotPosMdl); //3個如下手動計算獲得 //this.GetMergeAnnotPointsInfo(lstAnnotPosMdl); //直接經過C#程序處理多個錨點; return annotPointsInfo; } /// <summary> /// 獲取異形錨點點集合 /// </summary> /// <param name="lstAnnotPosMdl">錨點位置集</param> /// <returns></returns> public string GetResAnnotPointsInfo(List<AnnotPosModel> lstAnnotPosMdl) { string annotPointsInfo = string.Empty; int annotCount = lstAnnotPosMdl.Count; switch (annotCount) { case 0: return string.Empty; case 1: annotPointsInfo = this.GetAnnotPointsInfo(lstAnnotPosMdl[0]); break; case 2: annotPointsInfo = this.Get2AnnotMergePointsInfo(lstAnnotPosMdl[0], lstAnnotPosMdl[1]); break; case 3: //annotPointsInfo = this.Get3AnnotMergePointsInfo(lstAnnotPosMdl); annotPointsInfo = this.GetMergeAnnotPointsInfo(lstAnnotPosMdl); break; default: annotPointsInfo = this.GetMergeAnnotPointsInfo(lstAnnotPosMdl); //處理多個錨點 break; } return annotPointsInfo; } /// <summary> /// 獲取資源錨點位置集 /// </summary> /// <param name="annotPosInfo"></param> /// <returns></returns> public List<AnnotPosModel> GetResAnnotPoses(string annotPosInfo) { List<AnnotPosModel> lstAnnotPosMdl = new List<AnnotPosModel>(); string[] arryInfo = annotPosInfo.Split(','); int pageNum = 0; float left = 0.0f, top = 0.0f, right = 0.0f, bottom = 0.0f; if (arryInfo.Length < 6 || !int.TryParse(arryInfo[1], out pageNum) || !MathConverter.TryObjectToFloat(arryInfo[2], out left) //解決區域、語言變動引發的「識別不出小數點問題」如:轉換時「123.456」轉換時不認識"." || !MathConverter.TryObjectToFloat(arryInfo[3], out top) || !MathConverter.TryObjectToFloat(arryInfo[4], out right) || !MathConverter.TryObjectToFloat(arryInfo[5], out bottom)) { LogHelper.Instance.Error("錨點位置錯誤:" + annotPosInfo); return lstAnnotPosMdl; } //添加主錨點 AnnotPosModel annotPosMdl = new AnnotPosModel(); annotPosMdl.PageNum = pageNum; annotPosMdl.Left = left; annotPosMdl.Top = top; annotPosMdl.Right = right; annotPosMdl.Bottom = bottom; lstAnnotPosMdl.Add(annotPosMdl); //添加追加錨點 if (arryInfo.Length > 6) { int moreAnnots = (arryInfo.Length - 6) / 4; for (int i = 0; i < moreAnnots; i++) { int iposIndex = i * 4 + 6; //float left, top, right, bottom; if (!float.TryParse(arryInfo[iposIndex], out left) || !float.TryParse(arryInfo[iposIndex + 1], out top) || !float.TryParse(arryInfo[iposIndex + 2], out right) || !float.TryParse(arryInfo[iposIndex + 3], out bottom)) { continue; } annotPosMdl = new AnnotPosModel(); annotPosMdl.PageNum = pageNum; annotPosMdl.Left = left; annotPosMdl.Top = top; annotPosMdl.Right = right; annotPosMdl.Bottom = bottom; lstAnnotPosMdl.Add(annotPosMdl); } } return lstAnnotPosMdl; } /// <summary> /// 獲取錨點的點集合 /// </summary> /// <param name="annotPosMdl"></param> /// <returns></returns> public string GetAnnotPointsInfo(AnnotPosModel annotPosMdl) { string annotPointsInfo = string.Empty; float left = annotPosMdl.Left; float top = annotPosMdl.Top; float right = annotPosMdl.Right; float bottom = annotPosMdl.Bottom; annotPointsInfo = left + "," + top + ";" + right + "," + top + ";" + right + "," + bottom + ";" + left + "," + bottom + ";"; return annotPointsInfo; } /// <summary> /// 獲取錨點的點集合 /// </summary> /// <param name="topAnnotPosMdl"></param> /// <returns></returns> public string Get2AnnotMergePointsInfo(AnnotPosModel annotPosMdl1, AnnotPosModel annotPosMdl2) { AnnotPosModel topAnnotPosMdl = annotPosMdl1; AnnotPosModel bottomAnnotPosMdl = annotPosMdl2; if(annotPosMdl1.Top < annotPosMdl2.Top) { topAnnotPosMdl = annotPosMdl2; bottomAnnotPosMdl = annotPosMdl1; } string annotPointsInfo = string.Empty; float midle = (topAnnotPosMdl.Bottom + bottomAnnotPosMdl.Top) / 2.0f; float left1 = topAnnotPosMdl.Left; float top1 = topAnnotPosMdl.Top; float right1 = topAnnotPosMdl.Right; float bottom1 = topAnnotPosMdl.Bottom; float left2 = bottomAnnotPosMdl.Left; float top2 = bottomAnnotPosMdl.Top; float right2 = bottomAnnotPosMdl.Right; float bottom2 = bottomAnnotPosMdl.Bottom; if(topAnnotPosMdl.Bottom > bottomAnnotPosMdl.Top ) { bottom1 = midle; top2 = midle; } if (topAnnotPosMdl.Right > bottomAnnotPosMdl.Right) { annotPointsInfo = left1 + "," + top1 + ";" + right1 + "," + top1 + ";" + right1 + "," + bottom1 + ";" + right2 + "," + bottom1 + ";" + right2 + "," + bottom2 + ";" + left2 + "," + bottom2 + ";" + left2 + "," + top2 + ";" + left1 + "," + top2 + ";"; } else { annotPointsInfo = left1 + "," + top1 + ";" + right1 + "," + top1 + ";" + right1 + "," + top2 + ";" + right2 + "," + top2 + ";" + right2 + "," + bottom2 + ";" + left2 + "," + bottom2 + ";" + left2 + "," + bottom1 + ";" + left1 + "," + bottom1 + ";"; } return annotPointsInfo; } /// <summary> /// 獲取錨點的點集合 /// </summary> /// <param name="topAnnotPosMdl"></param> /// <returns></returns> private string Get3AnnotMergePointsInfo(List<AnnotPosModel> annotPosMdls) { string annotPointsInfo = string.Empty; if (annotPosMdls.Count < 3) { return annotPointsInfo; } List<AnnotPosModel> lstAnnotPosMdl = new List<AnnotPosModel>(); lstAnnotPosMdl.AddRange(annotPosMdls.OrderByDescending(obj => obj.Top)); //邊界 float left = 0.0f, top = 0.0f, right = 0.0f, bottom = 0.0f; foreach (var posMdl in lstAnnotPosMdl) { if (posMdl.Left < left || left == 0.0f) { left = posMdl.Left; } if (posMdl.Top > top || top == 0.0f) { top = posMdl.Top; } if (posMdl.Right > right || right == 0.0f) { right = posMdl.Right; } if (posMdl.Bottom < bottom || bottom == 0.0f) { bottom = posMdl.Bottom; } } float left1 = lstAnnotPosMdl[0].Left; float top1 = lstAnnotPosMdl[0].Top; float right1 = lstAnnotPosMdl[0].Right; float bottom1 = lstAnnotPosMdl[0].Bottom; float left2 = lstAnnotPosMdl[1].Left; float top2 = lstAnnotPosMdl[1].Top; float right2 = lstAnnotPosMdl[1].Right; float bottom2 = lstAnnotPosMdl[1].Bottom; float left3 = lstAnnotPosMdl[2].Left; float top3 = lstAnnotPosMdl[2].Top; float right3 = lstAnnotPosMdl[2].Right; float bottom3 = lstAnnotPosMdl[2].Bottom; annotPointsInfo = left1 + "," + top1 + ";" + right + "," + top1 + ";" + right + "," + bottom2 + ";" + right3 + "," + bottom2 + ";" + right3 + "," + bottom3 + ";" + left + "," + bottom3 + ";" + left + "," + top2 + ";" + left1 + "," + top2 + ";"; return annotPointsInfo; } /// <summary> /// 獲取合併錨點的點集合信息 /// </summary> /// <returns></returns> public List<Point> GetResAnnotPointsByPointsInfo(string annotPointsInfo) { List<Point> resAnnotPoints = new List<Point>(); string[] arrPointInfo = annotPointsInfo.Split(';'); foreach (var pointInfo in arrPointInfo) { if(string.IsNullOrEmpty(pointInfo)) { continue; } string[] arrPosInfo = pointInfo.Split(','); Point pt = new Point(); float x = 0f, y = 0f; if (arrPosInfo.Count() == 2 && float.TryParse(arrPosInfo[0], out x) && float.TryParse(arrPosInfo[1], out y)) { pt.X = x; pt.Y = y; } resAnnotPoints.Add(pt); } return resAnnotPoints; } /// <summary> /// 獲取合併錨點的點集合信息 /// </summary> /// <returns></returns> public List<Point> GetResAnnotPoints(string annotPosInfo) { string annotPointsInfo = GetResAnnotPointsInfo(annotPosInfo); return GetResAnnotPointsByPointsInfo(annotPointsInfo); } #endregion #region 合併錨點 調用合併方法自動合併 private Path GetMergeAnnotsPath(List<AnnotPosModel> lstAnnotPosMdl) { Path myPath = new Path(); if (lstAnnotPosMdl != null && lstAnnotPosMdl.Count > 0) { int annotsCount = lstAnnotPosMdl.Count; // Create a rectangle geometry to add to the Path PathGeometry pathGeom = new PathGeometry(); GeometryGroup myGeometryGroup = new GeometryGroup(); foreach (AnnotPosModel annotPosMdl in lstAnnotPosMdl) { RectangleGeometry myRectGeometry = new RectangleGeometry(); myRectGeometry.Rect = new Rect(annotPosMdl.Left, annotPosMdl.Bottom, annotPosMdl.Right - annotPosMdl.Left, annotPosMdl.Top - annotPosMdl.Bottom); pathGeom = GeometryGroup.Combine(pathGeom, myRectGeometry, GeometryCombineMode.Union, Transform.Identity); } //var pathExample = myGeometryGroup.GetFlattenedPathGeometry(); myPath.Data = pathGeom; } return myPath; } /// <summary> /// 獲取合併錨點的點集合 /// </summary> /// <param name="myPath"></param> private List<Point> GetMergeAnnotPoints(Path myPath) { List<Point> lstMergeAnnotPoints = new List<Point>(); PathGeometry g = myPath.Data.GetFlattenedPathGeometry(); foreach (var f in g.Figures) foreach (var s in f.Segments) if (s is PolyLineSegment) foreach (var pt in ((PolyLineSegment)s).Points) { lstMergeAnnotPoints.Add(pt); //Debug.WriteLine(pt); } return lstMergeAnnotPoints; } /// <summary> /// 獲取異形錨點點集合 /// </summary> /// <param name="annotPosInfo">錨點位置信息</param> /// <returns></returns> public List<Point> GetMergeAnnotPoints(string annotPosInfo) { string annotPointsInfo = string.Empty; List<AnnotPosModel> lstAnnotPosMdl = GetResAnnotPoses(annotPosInfo); return this.GetMergeAnnotPoints(lstAnnotPosMdl); } /// <summary> /// 獲取合併錨點的點集合 /// </summary> /// <param name="myPath"></param> public List<Point> GetMergeAnnotPoints(List<AnnotPosModel> lstAnnotPosMdl) { List<Point> rtnPoints = new List<Point>(); if (lstAnnotPosMdl != null) { Path myPath = GetMergeAnnotsPath(lstAnnotPosMdl); rtnPoints = GetMergeAnnotPoints(myPath); } return rtnPoints; } /// <summary> /// 獲取合併錨點的點集合信息 /// </summary> /// <returns></returns> public string GetMergeAnnotPointsInfo(List<Point> resAnnotPoints) { string annotPointsInfo = string.Empty; foreach (Point annotPoint in resAnnotPoints) { annotPointsInfo = annotPointsInfo + annotPoint.X + "," + annotPoint.Y + ";"; } return annotPointsInfo; } /// <summary> /// 獲取合併錨點的點集合信息 /// </summary> /// <returns></returns> public string GetMergeAnnotPointsInfo(List<AnnotPosModel> lstAnnotPosMdl) { List<Point> resAnnotPoints = this.GetMergeAnnotPoints(lstAnnotPosMdl); return this.GetMergeAnnotPointsInfo(resAnnotPoints); } #endregion
3、界面圖標顯示blog
private SDKPointHelper mSDKPointOper; private ReadingResModel mReadingResMdl; /// <summary> /// 福昕SDK /// </summary> private AxFoxitPDFSDK FoxitPDFSDK { get; set; } public WinAnnotOutline(ReadingResModel readingResMdl, AxFoxitPDFSDK foxitPDFSDK) { InitializeComponent(); mReadingResMdl = readingResMdl; mSDKPointOper = new SDKPointHelper(); mSDKPointOper.FoxitPDFSDK = foxitPDFSDK; } private void Window_Loaded(object sender, RoutedEventArgs e) { System.Drawing.Point ltPoint = mSDKPointOper.GetPageLeftTopScreenPoint(mReadingResMdl.PageIndex); this.Left = ltPoint.X; this.Top = ltPoint.Y; //System.Drawing.RectangleF pageRectangle = mSDKPointOper.GetPageRectangle(mReadingResMdl.PageIndex); System.Drawing.Point rbPoint = mSDKPointOper.GetPageRightBottomScreenPoint(mReadingResMdl.PageIndex); this.Height = (double)rbPoint.Y; this.Width = (double)rbPoint.X; //List<System.Drawing.Point> lstResAnnotPoints = mSDKPointOper.GetResAnnotsScreenPoints(mReadingResMdl.PageIndex,mReadingResMdl.OriTreePos); //this.ShowResAnnotsPath(lstResAnnotPoints); ////this.ShowResAnnotsPath2(lstResAnnotPoints); List<List<System.Drawing.Point>> lstResAnnotPoints = mSDKPointOper.GetMultiRegionResAnnotsScreenPoints(mReadingResMdl.PageIndex,mReadingResMdl.OriTreePos); this.ShowResMultiRegionAnnotsPath(lstResAnnotPoints); } private void ShowResAnnotsPath(List<System.Drawing.Point> lstResAnnotPoints) { PathGeometry pathGeometry = new PathGeometry(); Point lastPoint = new Point(0, 0); Point firstPoint = new Point(0, 0); LineGeometry line = new LineGeometry(); foreach (var annotPoint in lstResAnnotPoints) { Point pt = new Point(); pt.X = annotPoint.X - this.Left + 4; pt.Y = annotPoint.Y - this.Top + 4; if (lastPoint.X != 0 || lastPoint.Y != 0) { line.StartPoint = lastPoint; line.EndPoint = pt; pathGeometry.AddGeometry(line); } else { firstPoint = pt; } lastPoint = pt; } line.StartPoint = lastPoint; line.EndPoint = firstPoint; pathGeometry.AddGeometry(line); mResAnnotsPath.Data = pathGeometry; //SolidColorBrush mySolidColorBrush = new SolidColorBrush(); //mySolidColorBrush.Color = Color.FromArgb(255, 204, 204, 255); //mResAnnotsPath.Fill = mySolidColorBrush; } private void ShowResAnnotsPath2(List<System.Drawing.Point> lstResAnnotPoints) { // Create a Path to be drawn to the screen. Path myPath = new Path(); myPath.Stroke = Brushes.Black; myPath.StrokeThickness = 1; SolidColorBrush mySolidColorBrush = new SolidColorBrush(); mySolidColorBrush.Color = Color.FromArgb(255, 204, 204, 255); myPath.Fill = mySolidColorBrush; PathGeometry pathGeometry = new PathGeometry(); Point lastPoint = new Point(0, 0); Point firstPoint = new Point(0, 0); LineGeometry line = new LineGeometry(); foreach (var annotPoint in lstResAnnotPoints) { Point pt = new Point(); pt.X = annotPoint.X - this.Left; pt.Y = annotPoint.Y - this.Top; if (lastPoint.X != 0 || lastPoint.Y != 0) { line.StartPoint = lastPoint; line.EndPoint = pt; pathGeometry.AddGeometry(line); } else { firstPoint = pt; } lastPoint = pt; } line.StartPoint = lastPoint; line.EndPoint = firstPoint; pathGeometry.AddGeometry(line); myPath.Data = pathGeometry; // Add path shape to the UI. StackPanel mainPanel = new StackPanel(); mainPanel.Children.Add(myPath); this.Content = mainPanel; } private void ShowResMultiRegionAnnotsPath(List<List<System.Drawing.Point>> lstResAnnotPoints) { PathGeometry pathGeometry = new PathGeometry(); foreach (var lstResAnnotPoint in lstResAnnotPoints) { PathGeometry PartPathGeometry = GetPointPathGeometry(lstResAnnotPoint); pathGeometry.AddGeometry(PartPathGeometry); } mResAnnotsPath.Data = pathGeometry; } private PathGeometry GetPointPathGeometry(List<System.Drawing.Point> lstResAnnotPoint) { PathGeometry pathGeometry = new PathGeometry(); Point lastPoint = new Point(0, 0); Point firstPoint = new Point(0, 0); LineGeometry line = new LineGeometry(); foreach (var annotPoint in lstResAnnotPoint) { Point pt = new Point(); pt.X = annotPoint.X - this.Left + 4; pt.Y = annotPoint.Y - this.Top + 4; if (lastPoint.X != 0 || lastPoint.Y != 0) { line.StartPoint = lastPoint; line.EndPoint = pt; pathGeometry.AddGeometry(line); } else { firstPoint = pt; } lastPoint = pt; } line.StartPoint = lastPoint; line.EndPoint = firstPoint; pathGeometry.AddGeometry(line); return pathGeometry; }