using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Geometry; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace KGIS.PlatformPlugin.Model { /// /// 线模型 /// public class TestLineModel { public List PointElements = new List(); /// /// 显示线元素 /// public IElement LineElement { get; set; } /// /// 显示跟随线元素 /// public IElement FollowLineElement { get; set; } /// /// 线对象 /// public IPointCollection Line { get; set; } /// /// 跟随线对象 /// public ILineMovePointFeedback FollowLine { get; set; } private IActiveView ActiveView { get; set; } /// /// 计算线上点的坐标所用到的宽度比例 /// //public double Scale { get; set; } /// /// 线样式 /// public ILineSymbol LineSymbol { get; private set; } /// /// 跟随线样式 /// public ILineSymbol FollowLineSymbol { get; private set; } public TestLineModel(IActiveView pActiveView, esriSimpleLineStyle pLineStyle, double pScale = 1) { this.ActiveView = pActiveView; //this.Scale = pScale; // 获取IRGBColor接口 IRgbColor color = new RgbColor(); // 设置颜色属性 color.Red = 0; color.Green = 255; color.Blue = 255; // 获取ILine符号接口 ILineSymbol outline = new SimpleLineSymbol(); // 设置线符号属 outline.Width = 1.5; outline.Color = color; (outline as SimpleLineSymbol).Style = pLineStyle; this.LineSymbol = outline; this.FollowLineSymbol = outline; } public void Init() { this.Line = new Polyline(); ActiveView.ScreenDisplay.SetSymbol(FollowLineSymbol as ISymbol); this.FollowLine = new LineMovePointFeedbackClass() { Symbol = FollowLineSymbol as ESRI.ArcGIS.Display.ISymbol, Display = ActiveView.ScreenDisplay }; this.FollowLine.Symbol.ROP2 = esriRasterOpCode.esriROPNotXOrPen; } /// /// 刷新线上的指定索引处的点 /// public void RefreshPoint(int pPointIndex) { if (this.Line.PointCount > pPointIndex) { this.DrawLine(pPointIndex); if (PointElements.Count > this.Line.PointCount) { IPoint endPointForElement = (IPoint)PointElements[PointElements.Count - 1].Geometry; IPoint endPointForLine = (this.Line as IPolyline).ToPoint; if (endPointForElement.X != endPointForLine.X || endPointForElement.Y != endPointForLine.Y) { IElement e = PointElements[pPointIndex]; ActiveView.GraphicsContainer.DeleteElement(e); PointElements.Remove(e); e = null; } } else if (PointElements.Count < this.Line.PointCount) { IPoint endPointForLine = (this.Line as IPolyline).ToPoint; IMarkerElement e = new MarkerElementClass(); // 获取IRGBColor接口 IRgbColor color = new RgbColor(); // 设置颜色属性 color.Red = 255; color.Green = 255; color.Blue = 0; IMarkerSymbol symbol = new SimpleMarkerSymbolClass(); symbol.Color = color; symbol.Size = 5; e.Symbol = symbol; (e as IElement).Geometry = endPointForLine; ActiveView.GraphicsContainer.AddElement(e as IElement, 0); PointElements.Insert(pPointIndex, e as IElement); } else if (pPointIndex > -1) { IPoint endPointForLine = this.Line.get_Point(pPointIndex); IElement e = PointElements[pPointIndex]; e.Geometry = endPointForLine; } IPointCollection newGeo = new Polyline(); int i = pPointIndex - 1; if (i >= 0) { newGeo.AddPoint(this.Line.get_Point(i)); } i = pPointIndex; if (i >= 0) { newGeo.AddPoint(this.Line.get_Point(i)); } i = pPointIndex + 1; if (i < this.Line.PointCount) { newGeo.AddPoint(this.Line.get_Point(i)); } if (newGeo.PointCount > 1) { ITopologicalOperator topo = newGeo as ITopologicalOperator; if (topo != null) { IGeometry geo = topo.Buffer(10); ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, geo.Envelope); } } } } /// /// 绘制线对象 /// public void DrawLine(int pIndex = -1) { if (this.Line == null || this.Line.PointCount == 0) { ActiveView.GraphicsContainer.DeleteAllElements(); ActiveView.Refresh(); this.PointElements.Clear(); this.LineElement = null; this.FollowLineElement = null; } else { if (PointElements.Count > this.Line.PointCount) { if (pIndex == -1) { pIndex = PointElements.Count - 1; } IPoint endPointForElement = (IPoint)PointElements[pIndex].Geometry; IPoint endPointForLine = (this.Line as IPolyline).ToPoint; if (endPointForElement.X != endPointForLine.X || endPointForElement.Y != endPointForLine.Y) { IElement e = PointElements[pIndex]; ActiveView.GraphicsContainer.DeleteElement(e); PointElements.Remove(e); e = null; } } else if (PointElements.Count < this.Line.PointCount) { if (pIndex == -1) { pIndex = PointElements.Count; } IPoint endPointForLine = (this.Line as IPolyline).ToPoint; IMarkerElement e = new MarkerElementClass(); // 获取IRGBColor接口 IRgbColor color = new RgbColor(); bool IsAutoTrackPoint = true;//是否自动跟随点 if (IsAutoTrackPoint) { // 设置颜色属性 color.Red = 100; color.Green = 0; color.Blue = 255; } else { // 设置颜色属性 color.Red = 255; color.Green = 255; color.Blue = 0; } IMarkerSymbol symbol = new SimpleMarkerSymbolClass(); symbol.Color = color; symbol.Size = 5; e.Symbol = symbol; (e as IElement).Geometry = endPointForLine; ActiveView.GraphicsContainer.AddElement(e as IElement, 0); PointElements.Insert(pIndex, e as IElement); } else { if (pIndex == -1) { pIndex = PointElements.Count - 1; } IPoint endPointForLine = (this.Line as IPolyline).ToPoint; IElement e = PointElements[pIndex]; e.Geometry = endPointForLine; } if (this.LineElement == null) { if (this.Line.PointCount >= 2) { #region 构造新的元素 ILineElement pFillShapeElement = new LineElementClass(); pFillShapeElement.Symbol = this.LineSymbol; this.LineElement = pFillShapeElement as IElement; this.LineElement.Geometry = this.Line as IGeometry; ActiveView.GraphicsContainer.AddElement(this.LineElement, 0); #endregion } } else { if (this.Line.PointCount < 2) { #region 当点集合小于2的时候,删除对应的元素 ActiveView.GraphicsContainer.DeleteElement(this.LineElement); this.LineElement = null; #endregion } else { #region 更新现有元素 this.LineElement.Geometry = this.Line as IGeometry; #endregion } } //DrawFollowLine(); IPointCollection newGeo = new Polyline(); if (this.Line.PointCount > 1) { newGeo.AddPoint(this.Line.get_Point(this.Line.PointCount - 2)); } newGeo.AddPoint(this.Line.get_Point(this.Line.PointCount - 1)); if (newGeo.PointCount > 1) { if ((newGeo as IGeometry).IsEmpty) return; ITopologicalOperator topo = newGeo as ITopologicalOperator; if (topo != null) { topo.Simplify(); //注释注释缓冲代码,解决在GIS10.2环境中绘制线物面卡顿问题 ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, (newGeo as IGeometry).Envelope); } } } } } }