年度变更建库软件5.0版本
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3845 lines
173 KiB

6 months ago
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using KGIS.Framework.AE;
using KGIS.Framework.Maps;
using KGIS.Framework.Platform;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using Kingo.Plugin.EngineEditor.Common;
using Kingo.Plugin.EngineEditor.Model;
using Kingo.Plugin.EngineEditor.Views;
using Kingo.PluginServiceInterface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using UIShell.OSGi;
namespace Kingo.Plugin.EngineEditor.Commands.Tools
{
/// <summary>
/// 画线物面(线状地物面)工具
/// </summary>
public class ControlsEditingDrawLineToPolygonToolForKDB : BaseTool
{
//public KGIS.Common.Interface.IRegionAuthorize RegionAuthorize
//{
// get;
// set;
//}
public VerificationOfFeatureNodeDensity density
{
get;
set;
}
//RegionAuthorize RegionAuthorize = null;
private IEngineSnapEnvironment snapEnv = null;
#region 私有变量
//KOTilesLayer layer = null;
private EngineEditorClass m_editor;
private IHookHelper m_hookHelper;
/// <summary>
/// 平移工具
/// </summary>
private ControlsMapPanToolClass panTool = null;
/// <summary>
/// 中间线
/// </summary>
private LineModel MiddleLine;
/// <summary>
/// 左边线
/// </summary>
private LineModel LeftLine;
/// <summary>
/// 右边线
/// </summary>
private LineModel RightLine;
/// <summary>
/// 是否续画
/// </summary>
private bool IsContinueDraw = false;
/// <summary>
/// 续画左端点
/// </summary>
private IPoint ContinueDrawLeftPoint = null;
/// <summary>
/// 续画右端点
/// </summary>
private IPoint ContinueDrawRightPoint = null;
/// <summary>
/// 续画宽度
/// </summary>
private double ContinueDrawLength = 0.0;
private bool _IsDrawing;
/// <summary>
/// 正在绘制
/// </summary>
private bool IsDrawing
{
get
{
return _IsDrawing;
}
set
{
_IsDrawing = value;
if (_IsDrawing)
{
//替换Env改动
//Env.Instance.KMap.AxMapControl.AutoMouseWheel = false;
//Env.Instance.KMap.AxMapControl.AutoKeyboardScrolling = false;
(m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = false;
(m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = false;
}
else
{
//替换Env改动
//Env.Instance.KMap.AxMapControl.AutoMouseWheel = true;
//Env.Instance.KMap.AxMapControl.AutoKeyboardScrolling = true;
(m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = true;
(m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = true;
}
}
}
private Boolean IsSpaceDown = false;
private bool IsCtrlDown = false;
private IElement TextElement;
/// <summary>
/// 记录鼠标当前位置
/// </summary>
private System.Drawing.Point MousePoint = new System.Drawing.Point();
private bool IsChangedWidht = false;
/// <summary>
/// 道路线最小点间距
/// </summary>
private int MinPointDistance = 30;
/// <summary>
/// 道路线最大点间距
/// </summary>
private int MaxPointDistance = 80;
public DrawParam drawParam
{
get;
set;
}
FrmDrawDoublePolyline paramFrm = null;
private bool IsAutoTrackPoint
{
set
{
if (MiddleLine != null)
{
MiddleLine.IsAutoTrackPoint = value;
}
if (LeftLine != null)
{
LeftLine.IsAutoTrackPoint = value;
}
if (RightLine != null)
{
RightLine.IsAutoTrackPoint = value;
}
}
}
/// <summary>
/// 是否自动追踪
/// </summary>
private bool IsAuto = false;
#region 地图自动漫游相关变量
/// <summary>
/// 表示是否开启自动漫游功能
/// </summary>
private bool AllowMoveMap = false;
/// <summary>
/// 地图漫游计时器(表示多久移动一次地图)
/// </summary>
private System.Windows.Forms.Timer timer = null;
/// <summary>
/// 鼠标距离地图边界的距离(当小于指定值是开始漫游)
/// </summary>
private int MapBorderDistance = 10;
#endregion
#region 自动识别功能相关变量
/// <summary>
/// 自动识别计时器(相隔一定时间,根据鼠标位置自动识别一次)
/// </summary>
private System.Windows.Forms.Timer autoDistinguishTimer = null;
/// <summary>
/// 用于存放自动识别到的点元素集合
/// </summary>
private List<IElement> PointElement = new List<IElement>();
/// <summary>
/// 用于存放自动识别到的宽度
/// </summary>
private double TempWidht = 0;
/// <summary>
/// 用于临时存放自动识别到的中心点
/// </summary>
private IPoint TempCenterPoint = null;
#endregion
/// <summary>
/// 记录捕捉Element上点的索引
/// </summary>
private int SnapElementPointIndex = -1;
/// <summary>
/// 记录捕捉的点在哪条线上(0:中心线;1:左边线;-1:右边线)
/// </summary>
private int SnapElementPointLine = 0;
#endregion
/// <summary>
/// 初始化工具相关属性
/// </summary>
private void Init()
{
//初始化计时器
timer = new System.Windows.Forms.Timer();
timer.Interval = 100;
timer.Tick += timer_Tick;
autoDistinguishTimer = new System.Windows.Forms.Timer();
autoDistinguishTimer.Interval = 100;
autoDistinguishTimer.Tick += autoDistinguishTimer_Tick;
//初始化地图漫游工具
panTool = new ControlsMapPanToolClass();
panTool.OnCreate(m_hookHelper.Hook);
//初始化编辑对象
if (m_editor == null)
m_editor = new EngineEditorClass();// Env.Instance.KMap.EngEditor;
if (snapEnv == null)
snapEnv = m_editor;
//开启自动漫游功能
AllowMoveMap = false;
//注册鼠标滚轮事件
//替换Env改动
//Env.Instance.Platfrom.MapMouseWheel -= Platfrom_MapMouseWheel;
//Env.Instance.Platfrom.MapMouseWheel += Platfrom_MapMouseWheel;
if (_MapService != null)
{
_MapService.MapContainerMouseWheel -= Platfrom_MapMouseWheel;
_MapService.MapContainerMouseWheel += Platfrom_MapMouseWheel;
}
//白明雅 2020-04-07 用于激活键盘事件
MapsManager.Instance.MapService.getAxMapControl().Focus();
//初始化绘制模型
if (MiddleLine == null)
MiddleLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSDash, 0.5);
if (LeftLine == null)
LeftLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSSolid);
if (RightLine == null)
RightLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSSolid);
MiddleLine.Init();
LeftLine.Init();
RightLine.Init();
//设置鼠标样式
base.m_cursor = System.Windows.Forms.Cursors.Cross;
//初始化其他参数
IsSpaceDown = false;
IsDeactivate = false;
if (PointElement == null)
PointElement = new List<IElement>();
}
/// <summary>
/// 释放工具相关对象
/// </summary>
private void Dispose()
{
//销毁计时器
if (timer != null)
{
timer.Tick -= timer_Tick;
timer.Stop();
timer.Dispose();
}
if (autoDistinguishTimer != null)
{
autoDistinguishTimer.Tick -= autoDistinguishTimer_Tick;
autoDistinguishTimer.Stop();
autoDistinguishTimer.Dispose();
}
//销毁panTool工具
if (panTool != null)
{
panTool.Deactivate();
Marshal.ReleaseComObject(panTool);
panTool = null;
}
//取消事件注册
//替换Env改动
//Env.Instance.Platfrom.MapMouseWheel -= Platfrom_MapMouseWheel;
if (_MapService != null)
{
_MapService.MapContainerMouseWheel -= Platfrom_MapMouseWheel;
}
//销毁绘制模型
if (MiddleLine != null)
{
MiddleLine.Dissvoe();
MiddleLine = null;
}
if (LeftLine != null)
{
LeftLine.Dissvoe();
LeftLine = null;
}
if (RightLine != null)
{
RightLine.Dissvoe();
RightLine = null;
}
this.IsDrawing = false;
this.IsContinueDraw = false;
IsDeactivate = true;
this.m_checked = false;
if (PointElement != null)
PointElement.Clear();
}
#region 重写BaseCommand
public override void OnCreate(object hook)
{
try
{
if (m_hookHelper == null)
{
//替换Env改动
//m_hookHelper = Env.Instance.KMap.HookHelper;
m_hookHelper = new HookHelperClass();
m_hookHelper.Hook = hook;
}
//初始化编辑对象
if (m_editor == null)
m_editor = new EngineEditorClass();
//m_editor = new EngineEditorClass();
////m_editor.OnStopEditing += m_editor_OnStopEditing;
////m_editor.OnTargetLayerChanged += m_editor_OnTargetLayerChanged;
//snapEnv = (IEngineSnapEnvironment)m_editor;
if (drawParam == null)
{
drawParam = new DrawParam();
drawParam.DrawMode = DrawMode.LeftAndRight;
drawParam.Width = 10;
drawParam.ToloranceScale = 0.2;
drawParam.DLBM = "1003-公路用地";
}
if (density == null)
{
density = new VerificationOfFeatureNodeDensity(m_hookHelper);
}
}
catch (Exception ex)
{
LogAPI.Debug("初始化 画线物面(线状地物面)工具 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("初始化 画线物面(线状地物面)工具 时异常信息结束");
}
}
//void m_editor_OnTargetLayerChanged()
//{
// if (paramFrm != null)
// {
// paramFrm.Close();
// paramFrm = null;
// base.Deactivate();
// }
//}
//void m_editor_OnStopEditing(bool saveChanges)
//{
// if (paramFrm != null)
// {
// paramFrm.Close();
// paramFrm = null;
// base.Deactivate();
// }
//}
private bool IsDeactivate;
private IMapService _MapService;
public override void OnClick()
{
try
{
//KGIS.Framework.Common.Utils.LicenseManager.License();
_MapService = MapsManager.Instance.MapService;
Init();
panTool.OnClick();
base.OnClick();
if (paramFrm != null)
{
paramFrm.Close();
}
if (paramFrm == null)
{
paramFrm = new FrmDrawDoublePolyline(drawParam);
paramFrm.SetParam(true, true);
paramFrm.Closed += paramFrm_Closed;
paramFrm.Title = "画线物面";
paramFrm.Topmost = true;
paramFrm.ShowInTaskbar = false;
paramFrm.Top = 175;
paramFrm.Left = 235;
paramFrm.Show();
}
//timer.Interval = 100;
//timer.Tick += timer_Tick;
//autoDistinguishTimer.Interval = 100;
//autoDistinguishTimer.Tick += autoDistinguishTimer_Tick;
//AllowMoveMap = true;
//Env.Instance.Platfrom.MapMouseWheel -= Platfrom_MapMouseWheel;
//Env.Instance.Platfrom.MapMouseWheel += Platfrom_MapMouseWheel;
//MiddleLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSDash, 0.5);
//LeftLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSSolid);
//RightLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSSolid);
//IsSpaceDown = false; IsDeactivate = false;
//base.m_cursor = System.Windows.Forms.Cursors.Cross;
base.OnClick();
//layer = Common.Utility.LayerHelper.GetLayerByName<KOTilesLayer>(m_hookHelper.FocusMap, "YGYXT");
this.m_checked = true;
}
catch (Exception ex)
{
LogAPI.Debug("初始化 画线物面(线状地物面)工具 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("初始化 画线物面(线状地物面)工具 时异常信息结束");
MessageHelper.ShowError(ex.Message);
}
}
/// <summary>
/// 鼠标距离地图边界一定距离时,开始漫游
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void timer_Tick(object sender, EventArgs e)
{
try
{
IEnvelope extent = this.m_hookHelper.ActiveView.Extent;
int centerX = 0;
int centerY = 0;
int rX = 0;
int rY = 0;
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(new PointClass() { X = extent.XMax, Y = extent.YMin }, out rX, out rY);
IPoint centerPoint = new PointClass() { X = extent.XMin + (extent.XMax - extent.XMin) / 2, Y = extent.YMin + (extent.YMax - extent.YMin) / 2 };
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(centerPoint, out centerX, out centerY);
bool NeedPan = false;
if (!IsDrawing)
{
timer.Stop();
return;
}
if (MousePoint.X < MapBorderDistance)
{
NeedPan = true;
centerX -= 5;
}
if (MousePoint.Y < MapBorderDistance)
{
NeedPan = true;
centerY -= 5;
}
if (Math.Abs(rX - MousePoint.X) < MapBorderDistance)
{
NeedPan = true;
centerX += 5;
}
if (Math.Abs(rY - MousePoint.Y) < MapBorderDistance)
{
NeedPan = true;
centerY += 5;
}
if (NeedPan)
{
centerPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(centerX, centerY);
(this.m_hookHelper.Hook as IMapControl2).CenterAt(centerPoint);
}
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 鼠标距离地图边界一定距离时,开始漫游 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 鼠标距离地图边界一定距离时,开始漫游 时异常信息结束");
}
}
void paramFrm_Closed(object sender, EventArgs e)
{
if (paramFrm != null)
{
paramFrm.Closed -= paramFrm_Closed;
}
paramFrm = null;
}
public override bool Enabled
{
get
{
if (MapsManager.Instance == null) return false;
object pTemp = (MapsManager.Instance.CurrProjectInfo as ProjectInfo);
if (pTemp == null)
{
return false;
}
else
{
ILayer layer = m_editor.TargetLayer;//Env.Instance.KMap.EngEditor.TargetLayer;
if (m_editor.EditState == esriEngineEditState.esriEngineStateEditing && layer != null && (layer as ESRI.ArcGIS.Carto.IFeatureLayer).FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
{
return true;
}
else
{
return false;
}
}
}
}
#endregion
IElement element = null;
private int IsEnterClickNum = 0;
private bool IsShiftDown = false;
#region 重写BaseTool
//[LogWrite(Description = "")]
public override void OnKeyDown(int keyCode, int Shift)
{
try
{
//键盘按下时不启用放大缩小功能
//替换Env改动
//Env.Instance.KMap.AxMapControl.AutoMouseWheel = false;
//Env.Instance.KMap.AxMapControl.AutoKeyboardScrolling = false;
(m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = false;
(m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = false;
//----------------------
IPoint point = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(MousePoint.X, MousePoint.Y);//Env.Instance.MousePoint;
//替换Env改动
//Env.Instance.CurrentKeyDown = keyCode;
Platform.Instance.SetCurrentKeyDown(keyCode);
if (keyCode == (int)ConsoleKey.F7)
{
try
{
#region 自动识别
if (TempCenterPoint == null || TempWidht <= 0)
{
//如果没有识别到,调用手动取点
this.OnKeyDown((int)ConsoleKey.F8, Shift);
return;
}
this.IsAuto = true;
if (TempWidht > 0 && MiddleLine.Line.PointCount == 1 && !IsChangedWidht)
{
//如果识别到点,并且已经绘制了一个点,并且宽度没有手动调整过,则应用识别的宽度并修改第一个点的宽度
this.drawParam.Width = TempWidht;
this.OnMouseMove(1, Shift, MousePoint.X, MousePoint.Y);
//Moveing(point);
}
this.drawParam.Width = TempWidht;
///当前线上面最后一个点的X坐标
int endX = -1;
///当前线上面最后一个点的Y坐标
int endY = -1;
///下一个点的X坐标
int nextX = -1;
///下一个点的Y坐标
int nextY = -1;
if (MiddleLine.Line.PointCount > 0)
{
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1), out endX, out endY);
}
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY);
if (nextX != -1 && nextY != -1 && endX != -1 && endY != -1)
{
IPolyline line = new PolylineClass();
line.FromPoint = MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1);
line.ToPoint = TempCenterPoint;
//当两次取点距离小于30像素的时候,取消上一个点,以第二次的点为主
if (line.Length < 3)
{
//取消上一个点
this.OnKeyDown((int)ConsoleKey.F9, 0);
}
///以识别到的点进行绘制新的点
LeftClick(nextX, nextY);
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1), out nextX, out nextY);
//MoveMapExtent(nextX, nextY, 100);
}
TempCenterPoint = null;
#endregion
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 F7 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 F7 时异常信息结束");
}
}
else if (keyCode == (int)ConsoleKey.F8)
{
try
{
#region 快捷键取点
this.IsAuto = false;
///当前线上面最后一个点的X坐标
int endX = -1;
///当前线上面最后一个点的Y坐标
int endY = -1;
if (MiddleLine.Line.PointCount > 0)
{
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1), out endX, out endY);
}
//当两次取点距离小于30像素的时候,取消上一个点,以第二次的点为主
if (endX != -1 && endY != -1 && Math.Abs(MousePoint.X - endX) < 30 && Math.Abs(MousePoint.Y - endY) < 30)
{
//取消上一个点
this.OnKeyDown((int)ConsoleKey.F9, 0);
}
//绘制新的点
this.LeftClick(MousePoint.X, MousePoint.Y);
#endregion
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 F8 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 F8 时异常信息结束");
}
}
else if (keyCode == (int)ConsoleKey.F9 || keyCode == (int)ConsoleKey.Escape)
{
try
{
if (this.MiddleLine.Line.PointCount > 0 && this.IsDrawing == false)
{
//删除点
if (SnapElementPointIndex == -1)
{
SnapElementPointIndex = SnapElement(point, out SnapElementPointLine);
}
if (SnapElementPointIndex != -1 && SnapElementPointLine == 0)
{
MiddleLine.Line.RemovePoints(SnapElementPointIndex, 1);
LeftLine.Line.RemovePoints(SnapElementPointIndex, 1);
RightLine.Line.RemovePoints(SnapElementPointIndex, 1);
MiddleLine.RefreshPoint(SnapElementPointIndex);
LeftLine.RefreshPoint(SnapElementPointIndex);
RightLine.RefreshPoint(SnapElementPointIndex);
SnapElementPointIndex = -1;
SnapElementPointLine = int.MaxValue;
}
}
else
{
#region 撤销点
IPointCollection tempLine = new Polyline();
if (LeftLine.Line.PointCount > 1)
{
LeftLine.Line.RemovePoints(LeftLine.Line.PointCount - 1, 1);
tempLine.AddPoint(LeftLine.Line.get_Point(LeftLine.Line.PointCount - 1));
}
else if (LeftLine.Line.PointCount == 1)
{
LeftLine.Line.RemovePoints(LeftLine.Line.PointCount - 1, 1);
LeftLine.FollowLine.Stop();
//LeftLine.FollowLine.RemovePoints(0, LeftLine.FollowLine.PointCount);
//LeftLine.DrawLine();
}
if (RightLine.Line.PointCount > 1)
{
RightLine.Line.RemovePoints(RightLine.Line.PointCount - 1, 1);
tempLine.AddPoint(RightLine.Line.get_Point(RightLine.Line.PointCount - 1));
}
else if (RightLine.Line.PointCount == 1)
{
RightLine.Line.RemovePoints(RightLine.Line.PointCount - 1, 1);
LeftLine.FollowLine.Stop();
//RightLine.FollowLine.RemovePoints(0, RightLine.FollowLine.PointCount);
//RightLine.DrawLine();
}
if (MiddleLine.Line.PointCount > 1)
{
MiddleLine.Line.RemovePoints(MiddleLine.Line.PointCount - 1, 1);
IEnvelope extent = m_hookHelper.ActiveView.Extent;
IPoint p = MiddleLine.Line.Point[MiddleLine.Line.PointCount - 1];
if (extent.XMax < p.X || extent.XMin > p.X || extent.YMax < p.Y || extent.YMin > p.Y)
{
(this.m_hookHelper.Hook as IMapControl2).CenterAt(p);
}
}
else if (MiddleLine.Line.PointCount == 1)
{
MiddleLine.Line.RemovePoints(MiddleLine.Line.PointCount - 1, 1);
LeftLine.FollowLine.Stop();
//MiddleLine.FollowLine.RemovePoints(0, MiddleLine.FollowLine.PointCount);
//MiddleLine.DrawLine();
PointElement = new List<IElement>();
this.IsDrawing = false;
this.IsContinueDraw = false;
}
//计算前一个点时划线的宽度
//if (tempLine.PointCount == 2)
//{
// this.drawParam.Width = (tempLine as IPolyline).Length;
//}
LeftLine.DrawLine(LeftLine.Line.PointCount);
RightLine.DrawLine(LeftLine.Line.PointCount);
MiddleLine.DrawLine(LeftLine.Line.PointCount);
this.OnMouseMove(1, Shift, MousePoint.X, MousePoint.Y);
//Moveing(point);
#endregion
}
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 F9||ESC 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 F9||ESC 时异常信息结束");
}
}
else if (keyCode == (int)ConsoleKey.Backspace)
{
#region 清除绘制的图形
this.MiddleLine.Reset();
this.LeftLine.Reset();
this.RightLine.Reset();
PointElement = new List<IElement>();
this.IsDrawing = false;
this.IsContinueDraw = false;
#endregion
}
else if (keyCode == (int)ConsoleKey.Spacebar)
{
#region 空格移动地图
if (!IsSpaceDown)
{
base.Deactivate();
IsSpaceDown = true;
}
base.m_cursor = System.Windows.Forms.Cursors.Hand;
//this.OnMouseMove(1, 0, MousePoint.X, MousePoint.Y);
#endregion
}
else if (keyCode == (int)ConsoleKey.D9)
{
#region 减小识别灵敏度
if (this.drawParam.ToloranceScale > 0.05)
{
this.drawParam.ToloranceScale -= 0.05;
autoDistinguishTimer.Stop();
autoDistinguishTimer.Start();
}
else
{
this.drawParam.ToloranceScale = 0.05;
}
#endregion
}
else if (keyCode == (int)ConsoleKey.D0)
{
#region 增加识别灵敏度
if (this.drawParam.ToloranceScale < 0.5)
{
this.drawParam.ToloranceScale += 0.05;
autoDistinguishTimer.Stop();
autoDistinguishTimer.Start();
}
else
{
this.drawParam.ToloranceScale = 0.5;
autoDistinguishTimer.Stop();
autoDistinguishTimer.Start();
}
#endregion
}
else if (keyCode == 17)
{
#region Ctrl键调整双线宽度
if (!IsCtrlDown)
{
//替换Env改动
//Env.Instance.KMap.AxMapControl.AutoMouseWheel = false;
//Env.Instance.KMap.AxMapControl.AutoKeyboardScrolling = false;
(m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = false;
(m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = false;
DrawTextElement(point, ref TextElement);
IsCtrlDown = true;
}
#endregion
}
else if (keyCode == 16)
{
this.IsShiftDown = true;
}
else if (keyCode == (int)ConsoleKey.Enter)
{
if (this.MiddleLine.Line.PointCount > 1)
{
if (IsEnterClickNum == 0)
{
IsEnterClickNum++;
IsDrawing = false;
}
else if (IsEnterClickNum == 1)
{
this.DrawComplete();
IsEnterClickNum = 0;
SnapElementPointIndex = -1;
SnapElementPointLine = 0;
IsContinueDraw = false;
}
}
}
else if (keyCode == (int)ConsoleKey.Insert)
{
//增加点
if (SnapElementPointIndex == -1)
{
SnapElementPointIndex = SnapElement(point);
double a = GeometryOperations.getAngle(MiddleLine.Line.get_Point(0), MiddleLine.Line.get_Point(1));
if (SnapElementPointIndex != -1)
{
IPoint p = MiddleLine.Line.get_Point(SnapElementPointIndex);
double angle = GeometryOperations.getAngle(p, point);
if ((a > 0 && angle > 0) || (a < 0 && angle < 0))
{
SnapElementPointIndex++;
}
else
{
//if (a < 0 && angle < 0)
//{
// SnapElementPointIndex++;
//}
//if (a > 45 && a < 135)
//{
// if (angle > 0)
// {
// SnapElementPointIndex++;
// }
//}
}
IPointCollection newPoint = new Polyline();
newPoint.AddPoint(point);
MiddleLine.Line.InsertPointCollection(SnapElementPointIndex, newPoint);
LeftLine.Line.InsertPointCollection(SnapElementPointIndex, newPoint);
RightLine.Line.InsertPointCollection(SnapElementPointIndex, newPoint);
SnapElementPointLine = 0;
}
}
}
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 时异常信息结束");
}
}
//[LogWrite(Description = "")]
public override void OnKeyUp(int keyCode, int Shift)
{
//替换Env改动
//Env.Instance.CurrentKeyDown = -1;
Platform.Instance.SetCurrentKeyDown(-1);
base.OnKeyUp(keyCode, Shift);
if (keyCode == (int)ConsoleKey.Spacebar)
{
if (IsSpaceDown && IsDrawing)
{
m_hookHelper.ActiveView.Refresh();
base.OnClick();
IsSpaceDown = false;
base.m_cursor = System.Windows.Forms.Cursors.Cross;
//this.OnMouseMove(1, 0, MousePoint.X, MousePoint.Y);
}
}
if (keyCode == 17)
{
//替换Env改动
//Env.Instance.KMap.AxMapControl.AutoMouseWheel = true;
//Env.Instance.KMap.AxMapControl.AutoKeyboardScrolling = true;
(m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = true;
(m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = true;
DelElement(ref TextElement);
IsCtrlDown = false;
}
if (keyCode == 16)
{
this.IsShiftDown = false;
}
}
//[LogWrite(Description = "")]
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
try
{
IsAuto = false;
if (IsSpaceDown)
{
base.Deactivate();
panTool.OnMouseDown(1, Shift, X, Y);
return;
}
if (Button == 1)
{
//左键按下取点
IPoint point = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (snapEnv != null)
{
snapEnv.SnapPoint(point);
}
if (this.MiddleLine.Line.PointCount > 0 && IsDrawing == false)
{
#region 调整单个点的位置
if (SnapElementPointIndex == -1)
{
SnapElementPointIndex = SnapElement(point, out SnapElementPointLine);
//IsDrawing = true;
}
else
{
if (SnapElementPointLine == 0)
{
this.MiddleLine.Line.UpdatePoint(SnapElementPointIndex, point);
double angle = 0;
if (SnapElementPointIndex == 0)
{
angle = GeometryOperations.getAngle(point, this.MiddleLine.Line.get_Point(SnapElementPointIndex + 1));
}
else
{
angle = GeometryOperations.getAngle(this.MiddleLine.Line.get_Point(SnapElementPointIndex - 1), point);
}
this.LeftLine.Line.UpdatePoint(SnapElementPointIndex, GeometryOperations.GetPoint(point, this.drawParam.Width * 0.5, -angle));
this.RightLine.Line.UpdatePoint(SnapElementPointIndex, GeometryOperations.GetPoint(point, this.drawParam.Width * -0.5, -angle));
this.MiddleLine.RefreshPoint(SnapElementPointIndex);
this.LeftLine.RefreshPoint(SnapElementPointIndex);
this.RightLine.RefreshPoint(SnapElementPointIndex);
}
else if (SnapElementPointLine == 1)
{
this.LeftLine.Line.UpdatePoint(SnapElementPointIndex, point);
this.LeftLine.RefreshPoint(SnapElementPointIndex);
}
else if (SnapElementPointLine == -1)
{
this.RightLine.Line.UpdatePoint(SnapElementPointIndex, point);
this.RightLine.RefreshPoint(SnapElementPointIndex);
}
SnapElementPointIndex = -1;
IsDrawing = false;
}
#endregion
}
else
{
#region 绘制点
#region 根据道路宽度调整相关参数
if (TempWidht < 10)
{
MinPointDistance = 15;
MaxPointDistance = 40;
}
else if (TempWidht > 15)
{
MinPointDistance = 30;
MaxPointDistance = 80;
}
#endregion
if (this.MiddleLine.Line.PointCount > 0)
{
IPoint p = this.MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1);
if (p.X == point.X && p.Y == point.Y)
{
return;
}
IPolyline line = new PolylineClass();
line.FromPoint = point;
line.ToPoint = p;
if (line.Length < 3)
{
return;
}
}
if (TempWidht == -1)
{
TempWidht = 10;
}
Drawing(point);
if (this.MiddleLine.Line.PointCount > 0)
this.IsDrawing = true;
else
return;
if (this.MiddleLine.Line.PointCount > 1)
{
IPoint p2 = MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 2);
IPoint p1 = MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1);
double angle = GeometryOperations.getAngle(p2, p1);
//angle = 90 - angle;
IPolyline tempLine = new PolylineClass();
tempLine.FromPoint = p1;
tempLine.ToPoint = p2;
MoveMapExtent(X, Y, (int)Math.Floor(tempLine.Length));
if (this.drawParam.IsAutoTrack)
{
//this.OnMouseDown(2, Shift, MousePoint.X, MousePoint.Y);
}
}
else
{
MoveMapExtent(X, Y, 100);
}
#endregion
}
}
else if (Button == 2)
{
this.OnKeyDown((int)ConsoleKey.F7, Shift);
}
else if (Button == 4)
{
////鼠标滚轮按下
//base.Deactivate();
//panTool.OnMouseDown(Button, Shift, X, Y);
//this.OnKeyDown((int)ConsoleKey.Enter, Shift);
}
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 按下鼠标 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 按下鼠标 时异常信息结束");
}
}
private bool isRunning = false;
public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
if (isRunning)
return;
isRunning = true;
try
{
if (IsSpaceDown)
{
panTool.OnMouseMove(1, Shift, X, Y);
MousePoint.X = X;
MousePoint.Y = Y;
return;
}
var vT10 = m_hookHelper;
var vT12 = m_hookHelper.ActiveView;
var vT13 = m_hookHelper.ActiveView.ScreenDisplay;
var vT14 = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation;
var vT15 = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
IPoint point = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (snapEnv != null)
{
this.SnapPoint(m_hookHelper.ActiveView, point, snapEnv);
}
if (this.MiddleLine.Line.PointCount > 0)
{
if (this.IsDrawing)
{
Moveing(point);
if (MousePoint.X == X && MousePoint.Y == Y)
{
return;
}
else
{
MousePoint.X = X;
MousePoint.Y = Y;
}
autoDistinguishTimer.Stop();
autoDistinguishTimer.Dispose();
try
{
autoDistinguishTimer.Start();
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动鼠标后 正在绘制 期间 异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动鼠标后 正在绘制 期间 异常信息结束");
System.Windows.Forms.Application.DoEvents();
autoDistinguishTimer.Start();
}
System.Windows.Forms.Application.DoEvents();
#region 当鼠标移动到地图边界时,自动移动地图
if (AllowMoveMap)
{
IEnvelope extent = this.m_hookHelper.ActiveView.Extent;
int rX = 0;
int rY = 0;
//替换Env改动
//Env.Instance.KMap.AxMapControl.FromMapPoint(new PointClass() { X = extent.XMax, Y = extent.YMin }, ref rX, ref rY);
(m_hookHelper.Hook as IMapControlDefault).FromMapPoint(new PointClass() { X = extent.XMax, Y = extent.YMin }, ref rX, ref rY);
bool NeedPan = false;
System.Windows.Forms.Application.DoEvents();
if (X < MapBorderDistance)
{
if (!NeedPan)
{
timer.Start();
}
NeedPan = true;
}
if (Y < MapBorderDistance)
{
if (!NeedPan)
{
timer.Start();
}
NeedPan = true;
}
if (Math.Abs(rX - X) < MapBorderDistance)
{
if (!NeedPan)
{
timer.Start();
}
NeedPan = true;
}
if (Math.Abs(rY - Y) < MapBorderDistance)
{
if (!NeedPan)
{
timer.Start();
}
NeedPan = true;
}
if (!NeedPan)
{
timer.Stop();
NeedPan = false;
}
}
#endregion
}
else
{
MousePoint.X = X;
MousePoint.Y = Y;
if (SnapElementPointIndex != -1)
{
if (SnapElementPointLine == 0)
{
this.MiddleLine.Line.UpdatePoint(SnapElementPointIndex, point);
double angle = 0;
if (SnapElementPointIndex == 0)
{
angle = GeometryOperations.getAngle(point, this.MiddleLine.Line.get_Point(SnapElementPointIndex + 1));
}
else
{
angle = GeometryOperations.getAngle(this.MiddleLine.Line.get_Point(SnapElementPointIndex - 1), point);
}
this.LeftLine.Line.UpdatePoint(SnapElementPointIndex, GeometryOperations.GetPoint(point, this.drawParam.Width * 0.5, -angle));
this.RightLine.Line.UpdatePoint(SnapElementPointIndex, GeometryOperations.GetPoint(point, this.drawParam.Width * -0.5, -angle));
this.MiddleLine.RefreshPoint(SnapElementPointIndex);
this.LeftLine.RefreshPoint(SnapElementPointIndex);
this.RightLine.RefreshPoint(SnapElementPointIndex);
}
else if (SnapElementPointLine == 1)
{
this.LeftLine.Line.UpdatePoint(SnapElementPointIndex, point);
this.LeftLine.RefreshPoint(SnapElementPointIndex);
}
else if (SnapElementPointLine == -1)
{
this.RightLine.Line.UpdatePoint(SnapElementPointIndex, point);
this.RightLine.RefreshPoint(SnapElementPointIndex);
}
autoDistinguishTimer.Stop();
autoDistinguishTimer.Dispose();
try
{
autoDistinguishTimer.Start();
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动鼠标后 未在绘制 期间 异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动鼠标后 未在绘制 期间 异常信息结束");
System.Windows.Forms.Application.DoEvents();
autoDistinguishTimer.Start();
}
}
}
}
else if (Button == 4)
{
//鼠标滚轮按下
//panTool.OnMouseMove(Button, Shift, X, Y);
//MousePoint.X = X;
//MousePoint.Y = Y;
}
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动鼠标后 异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动鼠标后 期间 异常信息结束");
}
finally
{
isRunning = false;
}
}
//[LogWrite(Description = "")]
public override void OnMouseUp(int Button, int Shift, int X, int Y)
{
if (Button == 4)
{
//panTool.OnMouseUp(1, Shift, X, Y);
//m_hookHelper.ActiveView.Refresh();
//base.OnClick();
}
else
{
//base.OnMouseUp(button, shift, x, y);
//点击右键时,弹出编辑菜单
if (IsSpaceDown)
{
panTool.OnMouseUp(Button, Shift, X, Y);
}
else
{
base.OnMouseUp(Button, Shift, X, Y);//调用基类的OnMouseDown事件
}
}
}
IPoint m_SnapPoint = null;
bool m_isHasSnap;
//[LogWrite(Description = "")]
public void SnapPoint(IActiveView activeView, IPoint inPoint, IEngineSnapEnvironment m_editEnvironment)
{
if (this.m_isHasSnap && (this.m_SnapPoint != null))
{
this.DrawSnapPoint(activeView, this.m_SnapPoint);
}
this.m_isHasSnap = ((IEngineSnapEnvironment)m_editEnvironment).SnapPoint(inPoint);
if (this.m_isHasSnap)
{
this.m_SnapPoint = inPoint;
this.DrawSnapPoint(activeView, this.m_SnapPoint);
}
}
//[LogWrite(Description = "")]
private void DrawSnapPoint(IActiveView activeView, IPoint point)
{
IScreenDisplay screenDisplay = activeView.ScreenDisplay;
screenDisplay.StartDrawing(screenDisplay.hDC, -1);
IEngineEditProperties engProperties = new EngineEditorClass();
screenDisplay.SetSymbol((ISymbol)engProperties.SnapSymbol);
screenDisplay.DrawPoint(point);
screenDisplay.FinishDrawing();
screenDisplay = null;
}
//CheckAssistant dataCheckView = null;
IPolyline StartLine = null;
IPolyline EndLine = null;
//[LogWrite(Description = "")]
public void DrawComplete()
{
try
{
//if (!ss())
//{
// return;
//}
bool isSplit;
int splitIndex, segIndex;
if (LeftLine.Line.PointCount < 2 || this.RightLine.Line.PointCount < 2)
{
return;
}
IFeatureLayer layer = m_editor.TargetLayer as IFeatureLayer;
if (layer == null || layer.FeatureClass == null)
{
return;
}
int selectIdZYQ = 1;
IUcZYQMagrHelper ucZYQMagrHelper = null;
ProjectInfo ProInfo = MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo;
if (ProInfo != null && ProInfo.ProjType == EnumProjType.BHTBTQ && Platform.Instance.SystemType == SystemTypeEnum.BGFWCG)
{
ucZYQMagrHelper = BundleRuntime.Instance.GetFirstOrDefaultService<IUcZYQMagrHelper>();
if (ucZYQMagrHelper != null)
{
selectIdZYQ = ucZYQMagrHelper.GetCheckedID();
}
}
m_editor.StartOperation();
//if (StartLine == null)
//{
// StartLine = new PolylineClass();
// StartLine.FromPoint = LeftLine.Line.get_Point(0);
// StartLine.ToPoint = RightLine.Line.get_Point(0);
//}
//if (EndLine == null)
//{
// EndLine = new PolylineClass();
// EndLine.FromPoint = LeftLine.Line.get_Point(LeftLine.Line.PointCount - 1);
// EndLine.ToPoint = RightLine.Line.get_Point(LeftLine.Line.PointCount - 1);
//}
IPointCollection line1 = new Polyline();
line1.AddPoint((LeftLine.Line as IPolyline).FromPoint);
line1.AddPoint((RightLine.Line as IPolyline).FromPoint);
IGeometry geo1 = line1 as IGeometry;
IPointCollection line2 = new Polyline();
line2.AddPoint((LeftLine.Line as IPolyline).ToPoint);
line2.AddPoint((RightLine.Line as IPolyline).ToPoint);
IGeometry geo4 = line2 as IGeometry;
//IGeometry geo1 = StartLine;
IGeometry geo2 = LeftLine.Line as IGeometry;
IGeometry geo3 = RightLine.Line as IGeometry;
//IGeometry geo4 = EndLine;
ITopologicalOperator2 topo = geo1 as ITopologicalOperator2;
topo.Simplify();
ITopologicalOperator topo1 = geo2 as ITopologicalOperator;
topo1.Simplify();
topo = topo.Union(geo2) as ITopologicalOperator2;
topo.Simplify();
topo1 = geo3 as ITopologicalOperator;
topo1.Simplify();
topo = topo.Union(geo3) as ITopologicalOperator2;
topo1 = geo4 as ITopologicalOperator;
topo1.Simplify();
IPointCollection allPoint = topo.Union(geo4) as IPointCollection;
IFeatureSelection featureSelection = layer as IFeatureSelection;
featureSelection.Clear();
IPointCollection polygon = new PolygonClass();
polygon.AddPointCollection(allPoint);
IGeometry geo = (polygon as IGeometry);
geo.SpatialReference = m_hookHelper.FocusMap.SpatialReference;
//验证区域授权
//if (RegionAuthorize == null)
//{
// RegionAuthorize = new RegionAuthorize();
//}
//if (!RegionAuthorize.ValidateAuthorize(LeftLine.Line as IGeometry) || !RegionAuthorize.ValidateAuthorize(RightLine.Line as IGeometry))
//{
// MessageHelper.ShowError("绘制图形不在授权区域范围内!");
// return;
//}
if (density == null)
{
density = new VerificationOfFeatureNodeDensity(m_hookHelper);
}
geo = density.Verification(geo);
//白明雅 2020-04-01
//if (dataCheckService != null)
//{
// dataCheckService.GeometryCheck(geo, layer);
//}
DrawFeature(layer.FeatureClass, geo, featureSelection);
if (ucZYQMagrHelper != null)
{
ucZYQMagrHelper.AddMask(selectIdZYQ);
}
#region
//IFeatureLayer selectFeatureLayer = _MapService.GetFeatureLayerByName(Env.Instance.DefaultValue.ED_DLTB_TableName);
////if (selectFeatureLayer == null || selectFeatureLayer.FeatureClass == null)
////{
//// selectFeatureLayer = Env.Instance.KMap.GetFeatureLayerByName(this.m_hookHelper.ActiveView.FocusMap, Env.Instance.DefaultValue.DLTB_TableName) as IFeatureLayer;
////}
////按权属分割、合并图斑
//List<IGeometry> GeoList = null;
//if (selectFeatureLayer != null && selectFeatureLayer.FeatureClass != null)
//{
// GeoList = FeatureAPI.GenerateNewFeature(geo, selectFeatureLayer.FeatureClass);
//}
////else
////{
//// DrawFeature(layer.FeatureClass, geo, featureSelection);
////}
//if (GeoList == null || GeoList.Count <= 0)
//{
// GeoList = new List<IGeometry>() { geo };
// //DrawFeature(layer.FeatureClass, geo, featureSelection);
//}
//IIdentify identify = layer as IIdentify;
//List<IFeature> featureList = new List<IFeature>();
//for (int k = 0; k < GeoList.Count; k++)
//{
// IGeometry item = GeoList[k];
// if (item.IsEmpty)
// continue;
// ITopologicalOperator2 topologicalOperator2 = item as ITopologicalOperator2;
// IPolyline pPolyline = topologicalOperator2.Boundary as IPolyline;
// item.SpatialReference = this.m_hookHelper.FocusMap.SpatialReference;
// if (identify == null)
// {
// continue;
// }
// IArray iarray = identify.Identify(item);
// if (iarray == null)
// {
// continue;
// }
// for (int i = 0; i < iarray.Count; i++)
// {
// IFeatureIdentifyObj pFeatIdObj = iarray.get_Element(i) as IFeatureIdentifyObj;
// IRowIdentifyObject pRowObj = pFeatIdObj as IRowIdentifyObject;
// IFeature newFeature = pRowObj.Row as IFeature;
// newFeature.Shape.SpatialReference = this.m_hookHelper.FocusMap.SpatialReference;
// ITopologicalOperator topOper = newFeature.ShapeCopy as ITopologicalOperator;
// IGeometry geometryNew = topOper.Difference(item);
// if (geometryNew != null && !geometryNew.IsEmpty)
// {
// newFeature.Shape = geometryNew;
// }
// //属性继承
// //FeatureHelper.SetFeatureAttribute(newFeature);//以后待改回
// //if (!string.IsNullOrWhiteSpace(this.drawParam.DLBM))
// //{
// // string[] str = this.drawParam.DLBM.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries);
// // if (str.Length == 2)
// // {
// // int index = newFeature.Fields.FindField("DLBM");
// // if (index > -1)
// // {
// // newFeature.set_Value(index, str[0]);
// // }
// // index = newFeature.Fields.FindField("DLMC");
// // if (index > -1)
// // {
// // newFeature.set_Value(index, str[1]);
// // }
// // }
// //}
// newFeature.Store();
// KGIS.Framework.AE.FeatureAPI.SplitMultipartFeature(new List<IFeature>() { newFeature });
// IPointCollection pointCollection = geometryNew as IPointCollection;
// for (int j = 0; j < pointCollection.PointCount; j++)
// {
// if (KGIS.Framework.AE.FeatureAPI.IsInterSect(pointCollection.get_Point(j) as IGeometry, item))
// {
// pPolyline.SplitAtPoint(pointCollection.get_Point(j), false, false, out isSplit, out splitIndex, out segIndex);
// }
// }
// GeoList[k] = KGIS.Framework.AE.FeatureAPI.ConstructPolygonFromPolyline(pPolyline);
// }
//}
//featureSelection.Clear();
//foreach (IGeometry item in GeoList)
//{
// DrawFeature(layer.FeatureClass, item, featureSelection);
//}
//featureSelection.SelectionChanged();
#endregion
#region 打开数据检查助手
//if (dataCheckView == null)
//{
// dataCheckView = new CheckAssistant(m_hookHelper);
// dataCheckView.Width = 310;
// IPoint topRightPoint = new PointClass();
// topRightPoint.X = m_hookHelper.ActiveView.Extent.XMax;
// topRightPoint.Y = m_hookHelper.ActiveView.Extent.YMax;
// topRightPoint.SpatialReference = m_hookHelper.FocusMap.SpatialReference;
// int x2 = 0;
// int y2 = 0;
// //获取地图工作区右下角的坐标x2,y2,用于判断当前鼠标点是否在右边/下边边界处
// this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(topRightPoint, out x2, out y2);
// System.Drawing.Point screenPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(x2, y2));
// dataCheckView.Top = screenPoint.Y;
// dataCheckView.Left = screenPoint.X - 310;
// dataCheckView.Closed += dataCheckView_Closed;
// dataCheckView.ShowInMainForm();
//}
//dataCheckView.InitData(featureList);
#endregion
m_editor.StopOperation("画线物面");
//KGIS.Common.Utility.CustomLogAPI.WriteSystemOperationLog("数据新增", "画线物面");
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 执行 DrawComplete 异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 执行 DrawComplete 异常信息结束");
m_editor.AbortOperation();
MessageHelper.ShowError(ex.Message);
}
finally
{
DelElement(ref element);
PointElement = new List<IElement>();
this.LeftLine.Dissvoe();
this.RightLine.Dissvoe();
this.MiddleLine.Dissvoe();
this.MiddleLine.Init();
this.RightLine.Init();
this.LeftLine.Init();
this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, m_hookHelper.ActiveView.Extent);
this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, m_hookHelper.ActiveView.Extent);
this.TempWidht = -1;
this.TempCenterPoint = null;
this.IsChangedWidht = false;
this.IsDrawing = false;
this.IsContinueDraw = false;
}
}
/// <summary>
/// 绘制图形到图层上
/// </summary>
/// <param name="pFeatureClass"></param>
/// <param name="geometry"></param>
/// <param name="featureSelection"></param>
//[LogWrite(Description = "")]
private void DrawFeature(IFeatureClass pFeatureClass, IGeometry geometry, IFeatureSelection featureSelection)
{
//绘制出空图形问题
if (geometry == null || geometry.IsEmpty)
{
return;
}
IFeature feature = pFeatureClass.CreateFeature();
feature.Shape = geometry;
feature.Shape.SpatialReference = m_hookHelper.FocusMap.SpatialReference;
//属性继承
//FeatureHelper.SetFeatureAttribute(feature);//以后待改回
if (!string.IsNullOrWhiteSpace(this.drawParam.DLBM))
{
string[] str = this.drawParam.DLBM.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries);
if (str.Length == 2)
{
int index = feature.Fields.FindField("DLBM");
if (index > -1)
{
feature.set_Value(index, str[0]);
}
index = feature.Fields.FindField("DLMC");
if (index > -1)
{
feature.set_Value(index, str[1]);
}
}
}
feature.Store();
featureSelection.Add(feature);
}
//[LogWrite(Description = "")]
void dataCheckView_Closed(object sender, EventArgs e)
{
//dataCheckView = null;
}
//[LogWrite(Description = "")]
public override bool Deactivate()
{
int selectIdZYQ = 1;
IUcZYQMagrHelper ucZYQMagrHelper = null;
ProjectInfo ProInfo = MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo;
if (ProInfo != null && ProInfo.ProjType == EnumProjType.BHTBTQ && Platform.Instance.SystemType == SystemTypeEnum.BGFWCG)
{
ucZYQMagrHelper = BundleRuntime.Instance.GetFirstOrDefaultService<IUcZYQMagrHelper>();
if (ucZYQMagrHelper != null)
{
selectIdZYQ = ucZYQMagrHelper.GetCheckedID();
}
}
Dispose();
if (paramFrm != null)
{
paramFrm.Close();
paramFrm = null;
}
if (ucZYQMagrHelper != null)
{
ucZYQMagrHelper.AddMask(selectIdZYQ);
}
//if (this.MiddleLine != null)
//{
// this.MiddleLine.Dissvoe();
//}
//if (this.LeftLine != null)
//{
// this.LeftLine.Dissvoe();
//}
//if (this.RightLine != null)
//{
// this.RightLine.Dissvoe();
//}
//this.MiddleLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSDash, 0.5);
//this.LeftLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSSolid);
//this.RightLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSSolid);
//Env.Instance.Platfrom.MapMouseWheel -= Platfrom_MapMouseWheel;
//if (timer != null)
//{
// timer.Tick -= timer_Tick;
// timer.Stop();
//}
//autoDistinguishTimer.Tick -= autoDistinguishTimer_Tick;
//autoDistinguishTimer.Stop();
//PointElement = new List<IElement>();
//this.IsDrawing = false;
//IsDeactivate = true;
//this.m_checked = false;
return base.Deactivate();
}
//[LogWrite(Description = "")]
private void LeftClick(int X, int Y)
{
//左键按下取点
IPoint point = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (this.MiddleLine.Line.PointCount > 0 && IsDrawing == false)
{
#region 调整单个点的位置
if (SnapElementPointIndex == -1)
{
SnapElementPointIndex = SnapElement(point, out SnapElementPointLine);
//IsDrawing = true;
}
else
{
if (SnapElementPointLine == 0)
{
this.MiddleLine.Line.UpdatePoint(SnapElementPointIndex, point);
double angle = 0;
if (SnapElementPointIndex == 0)
{
angle = GeometryOperations.getAngle(point, this.MiddleLine.Line.get_Point(SnapElementPointIndex + 1));
}
else
{
angle = GeometryOperations.getAngle(this.MiddleLine.Line.get_Point(SnapElementPointIndex - 1), point);
}
this.LeftLine.Line.UpdatePoint(SnapElementPointIndex, GeometryOperations.GetPoint(point, this.drawParam.Width * 0.5, -angle));
this.RightLine.Line.UpdatePoint(SnapElementPointIndex, GeometryOperations.GetPoint(point, this.drawParam.Width * -0.5, -angle));
this.MiddleLine.RefreshPoint(SnapElementPointIndex);
this.LeftLine.RefreshPoint(SnapElementPointIndex);
this.RightLine.RefreshPoint(SnapElementPointIndex);
}
else if (SnapElementPointLine == 1)
{
this.LeftLine.Line.UpdatePoint(SnapElementPointIndex, point);
this.LeftLine.RefreshPoint(SnapElementPointIndex);
}
else if (SnapElementPointLine == -1)
{
this.RightLine.Line.UpdatePoint(SnapElementPointIndex, point);
this.RightLine.RefreshPoint(SnapElementPointIndex);
}
SnapElementPointIndex = -1;
IsDrawing = false;
}
#endregion
}
else
{
#region 绘制点
#region 根据道路宽度调整相关参数
if (TempWidht < 10)
{
MinPointDistance = 15;
MaxPointDistance = 40;
}
else if (TempWidht > 15)
{
MinPointDistance = 30;
MaxPointDistance = 80;
}
#endregion
if (this.MiddleLine.Line.PointCount > 0)
{
IPoint p = this.MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1);
if (p.X == point.X && p.Y == point.Y)
{
return;
}
IPolyline line = new PolylineClass();
line.FromPoint = point;
line.ToPoint = p;
if (line.Length < 3)
{
return;
}
}
if (TempWidht == -1)
{
TempWidht = 10;
}
Drawing(point);
if (this.MiddleLine.Line.PointCount > 0)
this.IsDrawing = true;
if (this.MiddleLine.Line.PointCount > 1)
{
IPoint p2 = MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 2);
IPoint p1 = MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1);
double angle = GeometryOperations.getAngle(p2, p1);
//angle = 90 - angle;
IPolyline tempLine = new PolylineClass();
tempLine.FromPoint = p1;
tempLine.ToPoint = p2;
MoveMapExtent(X, Y, (int)Math.Floor(tempLine.Length));
if (this.drawParam.IsAutoTrack)
{
//this.OnMouseDown(2, Shift, MousePoint.X, MousePoint.Y);
}
}
else
{
MoveMapExtent(X, Y, 100);
}
#endregion
}
}
#endregion
/// <summary>
/// 获取两条线段交点
/// </summary>
/// <param name="pointStart"></param>
/// <param name="pointEnd"></param>
/// <param name="targetGeo"></param>
/// <returns></returns>
//[LogWrite(Description = "")]
private IPoint GetIntersectPoint(IPoint pointStart, IPoint pointEnd, IGeometry targetGeo)
{
IPolyline newLine = new PolylineClass();
IPointCollection newLinepoint = newLine as IPointCollection;
if (pointStart.X == pointEnd.X)
{
double minY = targetGeo.Envelope.YMin;
newLinepoint.AddPoint(pointStart);
newLinepoint.AddPoint(new PointClass() { X = pointEnd.X, Y = minY });
}
else
{
double pointX = pointEnd.X > pointStart.X ? targetGeo.Envelope.XMax : targetGeo.Envelope.XMin;
double sourceLineK = (pointStart.Y - pointEnd.Y) / (pointStart.X - pointEnd.X);
double longPointY = pointStart.Y - ((pointStart.X - pointX) * sourceLineK);
newLinepoint.AddPoint(pointStart);
newLinepoint.AddPoint(new PointClass() { X = pointX, Y = longPointY });
}
ITopologicalOperator topOper = targetGeo as ITopologicalOperator;
IGeometry geometry = topOper.Intersect(newLine as IGeometry, esriGeometryDimension.esriGeometry0Dimension);
return GetMinDisPoint(geometry, pointEnd);
}
//[LogWrite(Description = "")]
private IPoint GetMinDisPoint(IGeometry geometry, IPoint pointEnd)
{
if (!geometry.IsEmpty)
{
IProximityOperator operatorPr = geometry as IProximityOperator;
return operatorPr.ReturnNearestPoint(pointEnd, esriSegmentExtension.esriExtendTangents);
}
return null;
}
/// <summary>
/// 滚动滚轮调整宽度
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
//[LogWrite(Description = "")]
void Platfrom_MapMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (IsDeactivate)
return;
if (drawParam != null)
{
//替换Env改动
//if (Env.Instance.CurrentKeyDown == 17)
if (Platform.Instance.GetCurrentKeyDown() == 17)
{
IPoint point = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(MousePoint.X, MousePoint.Y);
if (e.Delta > 0)
{
drawParam.Width = drawParam.Width + 0.5;
}
else if (e.Delta < 0 && drawParam.Width > 0)
{
drawParam.Width = drawParam.Width - 0.5;
}
int d = (int)Math.Abs(drawParam.Width);
if (d == 0)
return;
if (d < 10)
{
drawParam.ToloranceScale = 0.1;
}
if (d == 10)
{
drawParam.ToloranceScale = 0.15;
}
if (d > 10 && d < 20)
{
drawParam.ToloranceScale = 0.2;
}
if (d == 20)
{
drawParam.ToloranceScale = 0.25;
}
if (d > 20)
{
drawParam.ToloranceScale = 0.3;
}
if (d > 30)
{
drawParam.ToloranceScale = 0.4;
}
if (d > 40)
{
drawParam.ToloranceScale = 0.5;
}
this.IsChangedWidht = true;
DrawTextElement(point, ref TextElement);
//this.OnMouseMove(1, 0, MousePoint.X, MousePoint.Y);
//传入IsChangedWidht
Moveing(point, IsChangedWidht);
}
else
{
//shift+滚轮调节识别度
//if (IsDrawing)
if (IsShiftDown)
{
if (e.Delta > 0)
{
//drawParam.ToloranceScale += 0.05;
this.OnKeyDown((int)ConsoleKey.D0, 0);
}
if (e.Delta < 0)
{
//drawParam.ToloranceScale -= 0.05;
this.OnKeyDown((int)ConsoleKey.D9, 0);
}
this.OnKeyDown((int)ConsoleKey.P, 0);
}
else
{
//添加滚轮放大缩小地图
//替换Env改动
//Env.Instance.KMap.AxMapControl.AutoMouseWheel = true;
//Env.Instance.KMap.AxMapControl.AutoKeyboardScrolling = true;
(m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = true;
(m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = true;
//----------------
}
}
}
}
/// <summary>
/// 移动地图范围
/// </summary>
/// <param name="X">鼠标位置的X坐标</param>
/// <param name="Y">鼠标位置的Y坐标</param>
/// <param name="pWidth">鼠标位置距离地图边界的宽度</param>
//[LogWrite(Description = "")]
private void MoveMapExtent(int X, int Y, int pWidth)
{
//鼠标点击的点
IPoint point = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
#region 当鼠标点击屏幕边界时移动地图范围
//当前屏幕中心点坐标
IPoint centerPoint = new PointClass() { X = (this.m_hookHelper.ActiveView.Extent.XMax - this.m_hookHelper.ActiveView.Extent.Width / 2), Y = (this.m_hookHelper.ActiveView.Extent.YMax - this.m_hookHelper.ActiveView.Extent.Height / 2) };
//地图窗口右下角坐标
IPoint p = new PointClass() { X = this.m_hookHelper.ActiveView.Extent.XMax, Y = this.m_hookHelper.ActiveView.Extent.YMin };
//鼠标点击到边界时移动地图
int x2 = 0;
int y2 = 0;
//获取地图工作区右下角的坐标x2,y2,用于判断当前鼠标点是否在右边/下边边界处
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p, out x2, out y2);
//获取工作区右下角的坐标对应的屏幕坐标
//替换Env改动
//System.Drawing.Point rightBottomPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(x2, y2));
System.Drawing.Point rightBottomPoint = _MapService.PointToScreen(new System.Drawing.Point(x2, y2));
//获取工作区左上角的坐标对应的屏幕坐标
//替换Env改动
//System.Drawing.Point leftTopPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(0, 0));
System.Drawing.Point leftTopPoint = _MapService.PointToScreen(new System.Drawing.Point(0, 0));
IPoint CPoint = point;
double angle = 0;
if (MiddleLine.Line.PointCount > 1)
{
//计算当前道路线的方向
angle = GeometryOperations.getAngle(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 2), MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1));
}
//计算屏幕每像素代表实际横向距离
double d1 = this.m_hookHelper.ActiveView.Extent.Width / x2;
//计算屏幕每像素代表实际纵向距离
double d2 = this.m_hookHelper.ActiveView.Extent.Height / y2;
IPoint p1 = MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1);
//自动识别的下一个点的位置
IPoint n_p = null;
//第一次识别的点
IPoint n_p2 = null;
//第二次识别的点
IPoint n_p3 = null;
//记录自动识别下一点的宽度
IPolyline line = null;
//第一次识别的宽度
IPolyline line2 = null;
//第二次识别的宽度
IPolyline line3 = null;
IPolyline tempLine = new PolylineClass();
if (this.MiddleLine.Line.PointCount > 1)
{
double d = 0;
if (this.MiddleLine.Line.PointCount > 0)
{
tempLine.FromPoint = this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1);
tempLine.ToPoint = this.RightLine.Line.get_Point(this.RightLine.Line.PointCount - 1);
d = tempLine.Length;
}
n_p2 = GeometryOperations.GetPoint(p1, pWidth, 90 - angle);
line2 = (IPolyline)AutoDistinguish3(0, n_p2);
if (Math.Abs(line2.Length - d) > 4)
{
n_p3 = GeometryOperations.GetPoint(p1, pWidth + pWidth * 0.1, 90 - angle);
line3 = (IPolyline)AutoDistinguish3(0, n_p3);
if (Math.Abs(line2.Length - d) < Math.Abs(line3.Length - d))
{
n_p = n_p2;
line = line2;
}
else
{
n_p = n_p3;
line = line3;
}
}
else
{
n_p = n_p2;
line = line2;
}
#region 将自动识别的点显示在地图上
TempCenterPoint = new PointClass();
TempCenterPoint.X = line.FromPoint.X - (line.FromPoint.X - line.ToPoint.X) / 2;
TempCenterPoint.Y = line.FromPoint.Y - (line.FromPoint.Y - line.ToPoint.Y) / 2;
TempCenterPoint.SpatialReference = (line as IPolyline).SpatialReference;
IPointCollection newPoints = new Polyline();
newPoints.AddPoint(line.FromPoint);
newPoints.AddPoint(TempCenterPoint);
newPoints.AddPoint(line.ToPoint);
DrawPoint(newPoints);
#endregion
}
if (n_p != null)
{
//计算下一个点的坐标对应的地图工作区坐标位置
int nextX = 0;
int nextY = 0;
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(n_p, out nextX, out nextY);
if (nextX - 50 < 0 || nextX + 50 > x2)
{
#region 横向移动
double moveWidth = 0;
if (nextX - 50 < 0)
{
moveWidth = Math.Abs(nextX - 50) * d1;
}
else if (nextX + 50 > x2)
{
moveWidth = (nextX + 50 - x2) * d1;
}
if (moveWidth < this.m_hookHelper.ActiveView.Extent.Width / 2)
{
moveWidth = this.m_hookHelper.ActiveView.Extent.Width * 0.5;
}
if (angle != 0)
{
CPoint = GeometryOperations.GetPoint(centerPoint, moveWidth, 90 - angle);
(this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint);
}
else
{
(this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint);
this.OnMouseMove(1, 0, MousePoint.X + 1, MousePoint.Y + 1);
}
#endregion
}
if (nextY < 50 || nextY + 50 > y2)
{
#region 纵向移动
double moveWidth = 0;
if (nextY + 50 < 0)
{
moveWidth = Math.Abs(nextY - 50) * d2;
if (moveWidth < this.m_hookHelper.ActiveView.Extent.Height / 2)
{
moveWidth = this.m_hookHelper.ActiveView.Extent.Height * 0.5;
}
}
else if (nextY + 50 > y2)
{
moveWidth = (nextY + 50 - y2) * d2;
if (moveWidth < this.m_hookHelper.ActiveView.Extent.Height / 2)
{
moveWidth = this.m_hookHelper.ActiveView.Extent.Height * 0.5;
}
}
if (angle != 0)
{
CPoint = GeometryOperations.GetPoint(centerPoint, moveWidth, 90 - angle);
(this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint);
}
else
{
(this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint);
this.OnMouseMove(1, 0, MousePoint.X + 1, MousePoint.Y + 1);
}
#endregion
}
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY);
int m_x = 0;
int m_y = 0;
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(n_p, out m_x, out m_y);
//替换Env改动
//System.Drawing.Point screenPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(m_x, m_y));
System.Drawing.Point screenPoint = _MapService.PointToScreen(new System.Drawing.Point(m_x, m_y));
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p1, out nextX, out nextY);
this.MousePoint.X = m_x;
this.MousePoint.Y = m_y;
//SetCursorPos(screenPoint.X, screenPoint.Y);
if (this.drawParam.IsAutoStep)
{
SetCursorPos(screenPoint.X, screenPoint.Y);
}
//this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,
if (this.drawParam.IsAutoTrack && IsAuto)
{
double angle2 = GeometryOperations.getAngle(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1), TempCenterPoint);
ITopologicalOperator topo = TempCenterPoint as ITopologicalOperator;
IGeometry geo = topo.Buffer(line.Length / 2);
ImgDistinguish imgDis = new ImgDistinguish();
TilesImage img = imgDis.GetImg(geo.Envelope);
if (img == null)
return;
img.PixelCount = 9;
int gray1 = img.GetGrayValue(TempCenterPoint);
topo = MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1) as ITopologicalOperator;
geo = topo.Buffer(line.Length / 2);
img = imgDis.GetImg(geo.Envelope);
if (img == null)
return;
img.PixelCount = 9;
int gray2 = img.GetGrayValue(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1));
int w = pWidth / 3;
if (Math.Abs(Math.Abs(angle) - Math.Abs(angle2)) < 10)
{
if (Math.Abs(gray1 - gray2) < 25 && Math.Abs(line.Length - tempLine.Length) < tempLine.Length * 0.3)
{
IsAutoTrackPoint = true;
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY);
this.OnMouseDown(2, 0, nextX, nextY);
}
else
{
int i = 0;
while (pWidth - w >= 3)
{
i++;
w = w + pWidth / 3;
if (i > 3)
{
IsAutoTrackPoint = false;
break;
}
IPoint c_P = AutoTrack(X, Y, pWidth - w);
if (c_P != null)
{
TempCenterPoint = c_P;
IsAutoTrackPoint = true;
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY);
this.OnMouseDown(2, 0, nextX, nextY);
break;
}
else
{
IsAutoTrackPoint = false;
}
}
}
}
else
{
if (Math.Abs(gray1 - gray2) < 30 && Math.Abs(line.Length - tempLine.Length) < tempLine.Length * 0.3)
{
IsAutoTrackPoint = true;
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY);
this.OnMouseDown(2, 0, nextX, nextY);
}
else
{
int i = 0;
while (pWidth - w >= 3)
{
i++;
w = w + pWidth / 3;
if (i > 3)
{
IsAutoTrackPoint = false;
break;
}
IPoint c_P = AutoTrack(X, Y, pWidth - w);
if (c_P != null)
{
TempCenterPoint = c_P;
IsAutoTrackPoint = true;
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY);
this.OnMouseDown(2, 0, nextX, nextY);
break;
}
else
{
IsAutoTrackPoint = false;
}
}
//if (pWidth / 3 >= 3)
//{
// MoveMapExtent(X, Y, pWidth / 3);
//}
//else
//{
// IsAutoTrackPoint = false;
//}
}
}
}
}
#endregion
}
//[LogWrite(Description = "")]
private IPoint AutoTrack(int X, int Y, int pWidth)
{
IPoint result = null;
try
{
//鼠标点击的点
IPoint point = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
#region 当鼠标点击屏幕边界时移动地图范围
//当前屏幕中心点坐标
IPoint centerPoint = new PointClass() { X = (this.m_hookHelper.ActiveView.Extent.XMax - this.m_hookHelper.ActiveView.Extent.Width / 2), Y = (this.m_hookHelper.ActiveView.Extent.YMax - this.m_hookHelper.ActiveView.Extent.Height / 2) };
//地图窗口右下角坐标
IPoint p = new PointClass() { X = this.m_hookHelper.ActiveView.Extent.XMax, Y = this.m_hookHelper.ActiveView.Extent.YMin };
//鼠标点击到边界时移动地图
int x2 = 0;
int y2 = 0;
//获取地图工作区右下角的坐标x2,y2,用于判断当前鼠标点是否在右边/下边边界处
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p, out x2, out y2);
//获取工作区右下角的坐标对应的屏幕坐标
//替换Env改动
//System.Drawing.Point rightBottomPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(x2, y2));
System.Drawing.Point rightBottomPoint = _MapService.PointToScreen(new System.Drawing.Point(x2, y2));
//获取工作区左上角的坐标对应的屏幕坐标
//替换Env改动
//System.Drawing.Point leftTopPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(0, 0));
System.Drawing.Point leftTopPoint = _MapService.PointToScreen(new System.Drawing.Point(0, 0));
IPoint CPoint = point;
double angle = 0;
if (MiddleLine.Line.PointCount > 1)
{
//计算当前道路线的方向
angle = GeometryOperations.getAngle(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 2), MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1));
}
//计算屏幕每像素代表实际横向距离
double d1 = this.m_hookHelper.ActiveView.Extent.Width / x2;
//计算屏幕每像素代表实际纵向距离
double d2 = this.m_hookHelper.ActiveView.Extent.Height / y2;
IPoint p1 = MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1);
//自动识别的下一个点的位置
IPoint n_p = null;
//第一次识别的点
IPoint n_p2 = null;
//第二次识别的点
IPoint n_p3 = null;
//记录自动识别下一点的宽度
IPolyline line = null;
//第一次识别的宽度
IPolyline line2 = null;
//第二次识别的宽度
IPolyline line3 = null;
IPolyline tempLine = new PolylineClass();
if (this.MiddleLine.Line.PointCount > 1)
{
double d = 0;
if (this.MiddleLine.Line.PointCount > 0)
{
tempLine.FromPoint = this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1);
tempLine.ToPoint = this.RightLine.Line.get_Point(this.RightLine.Line.PointCount - 1);
d = tempLine.Length;
}
n_p2 = GeometryOperations.GetPoint(p1, pWidth, 90 - angle);
line2 = (IPolyline)AutoDistinguish3(0, n_p2);
if (Math.Abs(line2.Length - d) > 4)
{
n_p3 = GeometryOperations.GetPoint(p1, pWidth + pWidth * 0.1, 90 - angle);
line3 = (IPolyline)AutoDistinguish3(0, n_p3);
if (Math.Abs(line2.Length - d) < Math.Abs(line3.Length - d))
{
n_p = n_p2;
line = line2;
}
else
{
n_p = n_p3;
line = line3;
}
}
else
{
n_p = n_p2;
line = line2;
}
#region 将自动识别的点显示在地图上
TempCenterPoint = new PointClass();
TempCenterPoint.X = line.FromPoint.X - (line.FromPoint.X - line.ToPoint.X) / 2;
TempCenterPoint.Y = line.FromPoint.Y - (line.FromPoint.Y - line.ToPoint.Y) / 2;
TempCenterPoint.SpatialReference = (line as IPolyline).SpatialReference;
IPointCollection newPoints = new Polyline();
newPoints.AddPoint(line.FromPoint);
newPoints.AddPoint(TempCenterPoint);
newPoints.AddPoint(line.ToPoint);
DrawPoint(newPoints);
#endregion
}
//计算下一个点的坐标对应的地图工作区坐标位置
int nextX = 0;
int nextY = 0;
#region
//this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(n_p, out nextX, out nextY);
//if (nextX - 50 < 0 || nextX + 50 > x2)
//{
// #region 横向移动
// double moveWidth = 0;
// if (nextX - 50 < 0)
// {
// moveWidth = Math.Abs(nextX - 50) * d1;
// }
// else if (nextX + 50 > x2)
// {
// moveWidth = (nextX + 50 - x2) * d1;
// }
// if (angle != 0)
// {
// CPoint = GeometryOperations.GetPoint(centerPoint, moveWidth, 90 - angle);
// (this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint);
// }
// else
// {
// (this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint);
// this.OnMouseMove(1, 0, MousePoint.X + 1, MousePoint.Y + 1);
// }
// #endregion
//}
//if (nextY + 50 < 0 || nextY + 50 > y2)
//{
// #region 纵向移动
// double moveWidth = 0;
// if (nextY + 50 < 0)
// {
// moveWidth = Math.Abs(nextY - 50) * d2;
// }
// else if (nextY + 50 > y2)
// {
// moveWidth = -(nextY + 50 - x2) * d2;
// }
// if (angle != 0)
// {
// CPoint = GeometryOperations.GetPoint(centerPoint, moveWidth, 90 - angle);
// (this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint);
// }
// else
// {
// (this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint);
// this.OnMouseMove(1, 0, MousePoint.X + 1, MousePoint.Y + 1);
// }
// #endregion
//}
#endregion
if (n_p != null)
{
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY);
int m_x = 0;
int m_y = 0;
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(n_p, out m_x, out m_y);
//替换Env改动
//System.Drawing.Point screenPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(m_x, m_y));
System.Drawing.Point screenPoint = _MapService.PointToScreen(new System.Drawing.Point(m_x, m_y));
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p1, out nextX, out nextY);
this.MousePoint.X = m_x;
this.MousePoint.Y = m_y;
SetCursorPos(screenPoint.X, screenPoint.Y);
if (this.drawParam.IsAutoTrack)
{
double angle2 = GeometryOperations.getAngle(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1), TempCenterPoint);
ITopologicalOperator topo = TempCenterPoint as ITopologicalOperator;
IGeometry geo = topo.Buffer(line.Length / 2);
ImgDistinguish imgDis = new ImgDistinguish();
TilesImage img = imgDis.GetImg(geo.Envelope);
if (img == null)
return result;
img.PixelCount = 9;
int gray1 = img.GetGrayValue(TempCenterPoint);
topo = MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1) as ITopologicalOperator;
geo = topo.Buffer(line.Length / 2);
img = imgDis.GetImg(geo.Envelope);
if (img == null)
return result;
img.PixelCount = 9;
int gray2 = img.GetGrayValue(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1));
if (Math.Abs(Math.Abs(angle) - Math.Abs(angle2)) < 5 && Math.Abs(gray1 - gray2) < 25 && Math.Abs(line.Length - tempLine.Length) < tempLine.Length * 0.3)
{
//IsAutoTrackPoint = true;
//this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY);
//this.OnMouseDown(2, 0, nextX, nextY);
result = TempCenterPoint;
}
else
{
//IsAutoTrackPoint = false;
}
}
}
return result;
#endregion
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 执行 AutoTrack 异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 执行 AutoTrack 异常信息结束");
throw ex;
}
}
/// <summary>
/// 定时进行自动识别影像
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
//[LogWrite(Description = "")]
void autoDistinguishTimer_Tick(object sender, EventArgs e)
{
try
{
IPoint point = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(MousePoint.X, MousePoint.Y);
double angle = 0;
if (MiddleLine.Line.PointCount <= 0)
{
return;
#region
//IPolyline p1 = (IPolyline)AutoDistinguish(0);
//IPolyline p2 = (IPolyline)AutoDistinguish(90);
//if (p1.Length > p2.Length)
//{
// TempWidht = p2.Length;
// #region 将自动识别记过显示在地图上
// TempCenterPoint = new PointClass();
// TempCenterPoint.X = p2.FromPoint.X - (p2.FromPoint.X - p2.ToPoint.X) / 2;
// TempCenterPoint.Y = p2.FromPoint.Y - (p2.FromPoint.Y - p2.ToPoint.Y) / 2;
// TempCenterPoint.SpatialReference = (p2 as IPolyline).SpatialReference;
// IPointCollection newPoints = new Polyline();
// newPoints.AddPoint(p2.FromPoint);
// newPoints.AddPoint(TempCenterPoint);
// newPoints.AddPoint(p2.ToPoint);
// DrawPoint(newPoints);
// #endregion
//}
//else
//{
// TempWidht = p1.Length;
// #region 将自动识别记过显示在地图上
// TempCenterPoint = new PointClass();
// TempCenterPoint.X = p1.FromPoint.X - (p1.FromPoint.X - p1.ToPoint.X) / 2;
// TempCenterPoint.Y = p1.FromPoint.Y - (p1.FromPoint.Y - p1.ToPoint.Y) / 2;
// TempCenterPoint.SpatialReference = (p1 as IPolyline).SpatialReference;
// IPointCollection newPoints = new Polyline();
// newPoints.AddPoint(p1.FromPoint);
// newPoints.AddPoint(TempCenterPoint);
// newPoints.AddPoint(p1.ToPoint);
// DrawPoint(newPoints);
// #endregion
//}
#endregion
}
else
{
//LogAPI.Debug("开始时间:" + DateTime.Now.Subtract();
angle = GeometryOperations.getAngle(MiddleLine.Line.Point[MiddleLine.Line.PointCount - 1], point);
if (double.IsNaN(angle) && (MiddleLine.Line.PointCount - 2) > -1)
{
angle = GeometryOperations.getAngle(MiddleLine.Line.Point[MiddleLine.Line.PointCount - 2], point);
}
if (!Double.IsNaN(angle))
{
//DateTime t1 = DateTime.Now;
//Int32 d = t1.Minute * 60 * 1000 + t1.Second * 1000 + t1.Millisecond;
//LogAPI.Debug("开始时间:" + (t1.Minute * 60 * 1000 + t1.Second * 1000 + t1.Millisecond));
IPolyline polyline = (IPolyline)AutoDistinguish(angle);
this.drawParam.ToloranceScale += 0.05;
IPolyline polyline1 = (IPolyline)AutoDistinguish(angle);
this.drawParam.ToloranceScale -= 0.1;
IPolyline polyline2 = (IPolyline)AutoDistinguish(angle);
this.drawParam.ToloranceScale += 0.05;
double d = this.drawParam.Width;
if (this.MiddleLine.Line.PointCount > 0)
{
IPolyline tempLine = new PolylineClass();
tempLine.FromPoint = this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1);
tempLine.ToPoint = this.RightLine.Line.get_Point(this.RightLine.Line.PointCount - 1);
d = tempLine.Length;
}
if (Math.Abs(polyline.Length - d) < Math.Abs(polyline1.Length - d))
{
if (Math.Abs(polyline.Length - d) > Math.Abs(polyline2.Length - d))
{
polyline = polyline2;
}
}
else
{
if (Math.Abs(polyline1.Length - d) > Math.Abs(polyline2.Length - d))
{
polyline = polyline2;
}
else
{
polyline = polyline1;
}
}
TempWidht = polyline.Length;
if ((TempWidht > this.drawParam.Width + this.drawParam.Width * 0.5 || TempWidht < this.drawParam.Width - this.drawParam.Width * 0.5) && this.MiddleLine.Line.PointCount > 1)
{
TempWidht = -1;
TempCenterPoint = null;
try
{
if (PointElement.Count > 0)
{
foreach (IElement item in PointElement)
{
m_hookHelper.ActiveView.GraphicsContainer.DeleteElement(item);
}
PointElement = new List<IElement>();
m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, m_hookHelper.ActiveView.Extent);
}
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程 中 定时进行自动识别影像 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程 中 定时进行自动识别影像 异常信息结束");
}
}
else
{
#region 将自动识别的点显示在地图上
TempCenterPoint = new PointClass();
TempCenterPoint.X = polyline.FromPoint.X - (polyline.FromPoint.X - polyline.ToPoint.X) / 2;
TempCenterPoint.Y = polyline.FromPoint.Y - (polyline.FromPoint.Y - polyline.ToPoint.Y) / 2;
TempCenterPoint.SpatialReference = (polyline as IPolyline).SpatialReference;
IPointCollection newPoints = new Polyline();
newPoints.AddPoint(polyline.FromPoint);
newPoints.AddPoint(TempCenterPoint);
newPoints.AddPoint(polyline.ToPoint);
DrawPoint(newPoints);
#endregion
}
//DateTime t2 = DateTime.Now;
//Int32 d2 = t2.Minute * 60 * 1000 + t2.Second * 1000 + t2.Millisecond;
//LogAPI.Debug("识别结束:" + (t2.Minute * 60 * 1000 + t2.Second * 1000 + t2.Millisecond));
//LogAPI.Debug("识别结束:" + (d2 - d) + "毫秒");
}
}
autoDistinguishTimer.Stop();
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 定时进行自动识别影像 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 定时进行自动识别影像 时异常信息结束");
}
}
#region 捕捉
//[LogWrite(Description = "")]
private List<IFeature> Snapping(IPoint pPoint, List<IFeatureLayer> pLayers)
{
List<IFeature> result = new List<IFeature>();
try
{
if (pPoint != null && pLayers != null)
{
foreach (IFeatureLayer item in pLayers)
{
IIdentify identify = item as IIdentify;
if (identify == null)
continue;
ESRI.ArcGIS.esriSystem.IArray array = identify.Identify(pPoint);
if (array == null)
continue;
for (int i = 0; i < array.Count; i++)
{
IRowIdentifyObject row = (IRowIdentifyObject)array.get_Element(i);
if (row == null)
continue;
IFeature f = row.Row as IFeature;
result.Add(f);
}
}
}
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 捕捉 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 捕捉 时异常信息结束");
}
return result;
}
#endregion
#region 获取所有可见图层
/// <summary>
/// 获取当前地图中可见的矢量图层
/// </summary>
/// <param name="pMap"></param>
/// <returns></returns>
//[LogWrite(Description = "")]
private List<IFeatureLayer> GetVisibleLayer(IMap pMap, esriGeometryType geoType = esriGeometryType.esriGeometryAny)
{
List<IFeatureLayer> result = new List<IFeatureLayer>();
if (pMap == null)
return result;
try
{
for (int i = 0; i < pMap.LayerCount; i++)
{
ILayer layer = pMap.get_Layer(i);
if (layer is IFeatureLayer)
{
if ((layer as IFeatureLayer).Visible && (layer as IFeatureLayer).FeatureClass.ShapeType == geoType)
{
result.Add(layer as IFeatureLayer);
}
}
else if (layer is ICompositeLayer)
{
if ((layer as IGroupLayer).Visible)
{
result.AddRange(GetVisibleLayerByGroupLayer(layer as ICompositeLayer, geoType));
}
}
}
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 获取当前地图中可见的矢量图层 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 获取当前地图中可见的矢量图层 时异常信息结束");
}
return result;
}
//[LogWrite(Description = "")]
private List<IFeatureLayer> GetVisibleLayerByGroupLayer(ICompositeLayer pGroupLayer, esriGeometryType geoType = esriGeometryType.esriGeometryAny)
{
List<IFeatureLayer> result = new List<IFeatureLayer>();
if (pGroupLayer != null && pGroupLayer.Count > 0)
{
for (int i = 0; i < pGroupLayer.Count; i++)
{
ILayer layer = pGroupLayer.get_Layer(i);
if (layer is IAnnotationLayer)
{
}
else if (layer is IGroupLayer)
{
if ((layer as IGroupLayer).Visible)
{
result.AddRange(GetVisibleLayerByGroupLayer(layer as ICompositeLayer, geoType));
}
}
else
{
if (layer is IFeatureLayer)
{
if ((layer as IFeatureLayer).Visible && (layer as IFeatureLayer).FeatureClass.ShapeType == geoType)
{
result.Add((IFeatureLayer)layer);
}
}
}
}
}
return result;
}
#endregion
#region 绘制相关私有函数
//[LogWrite(Description = "")]
private IPointCollection AutoDistinguish3(double angle = 0, IPoint pPoint = null)
{
IPolyline polyline = (IPolyline)AutoDistinguish(angle, pPoint);
this.drawParam.ToloranceScale += 0.05;
IPolyline polyline1 = (IPolyline)AutoDistinguish(angle, pPoint);
this.drawParam.ToloranceScale -= 0.1;
IPolyline polyline2 = (IPolyline)AutoDistinguish(angle, pPoint);
this.drawParam.ToloranceScale += 0.05;
double d = this.drawParam.Width;
if (this.MiddleLine.Line.PointCount > 0)
{
IPolyline tempLine = new PolylineClass();
tempLine.FromPoint = this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1);
tempLine.ToPoint = this.RightLine.Line.get_Point(this.RightLine.Line.PointCount - 1);
d = tempLine.Length;
}
if (Math.Abs(polyline.Length - d) < Math.Abs(polyline1.Length - d))
{
if (Math.Abs(polyline.Length - d) > Math.Abs(polyline2.Length - d))
{
polyline = polyline2;
}
}
else
{
if (Math.Abs(polyline1.Length - d) > Math.Abs(polyline2.Length - d))
{
polyline = polyline2;
}
else
{
polyline = polyline1;
}
}
return polyline as IPointCollection;
}
/// <summary>
/// 自动识别中心点
/// </summary>
//[LogWrite(Description = "")]
private IPointCollection AutoDistinguish(double angle = 0, IPoint pPoint = null)
{
#region 自动识别道路中心线
IPoint point = pPoint;
if (point == null)
{
point = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(MousePoint.X, MousePoint.Y);
}
IPointCollection vertical = new Polyline();
vertical.AddPoint(point);
vertical.AddPoint(point);
//KOTilesLayer layer = Common.Utility.LayerHelper.GetLayerByName<KOTilesLayer>(m_hookHelper.FocusMap, "YGYXT");
double InitWidht = 50;
//获取鼠标点周围50米的范围
IEnvelope env = new EnvelopeClass();
//计算当前道路的角度
if (MiddleLine.Line.PointCount > 1)
{
env.XMax = point.X + this.drawParam.Width;
env.XMin = point.X - this.drawParam.Width;
env.YMax = point.Y + this.drawParam.Width;
env.YMin = point.Y - this.drawParam.Width;
InitWidht = drawParam.Width;
angle = GeometryOperations.getAngle(MiddleLine.Line.Point[MiddleLine.Line.PointCount - 1], point);
if (double.IsNaN(angle) && (MiddleLine.Line.PointCount - 2) > -1)
{
angle = GeometryOperations.getAngle(MiddleLine.Line.Point[MiddleLine.Line.PointCount - 2], point);
}
if (Double.IsNaN(angle))
return vertical;
}
else
{
env.XMax = point.X + InitWidht / 2;
env.XMin = point.X - InitWidht / 2;
env.YMax = point.Y + InitWidht / 2;
env.YMin = point.Y - InitWidht / 2;
}
env.SpatialReference = m_hookHelper.FocusMap.SpatialReference;
if (double.IsNaN(angle))
return vertical;
//根据范围获取影像图片
ImgDistinguish imgDis = new ImgDistinguish();
TilesImage img = imgDis.GetImg(env);
if (img == null)
return vertical;
img.PixelCount = 49;
//获取平均灰度值
int Gray = img.GetGrayValue(point);
//重新设置单次搜索像素个数
img.PixelCount = 1;
//计算单次搜索的实际距离
double distance = img.Resolution * Math.Sqrt(img.PixelCount);
//记录已经搜索的总距离
double sumDistance = distance;
//检索出在容差范围内的平均灰度值集合
List<int> grayValues = new List<int>();
grayValues.Add(Gray);
//记录参考点左边的错误像素个数
int leftBadPixelCount = 0;
//记录参考点右边的错误像素个数
int rightBadPixelCount = 0;
//记录容差范围内的灰度平均值
double tolerance = 0;
///容差比例
double toloranceScale = this.drawParam.ToloranceScale;
//容差半径(污点宽度)
double toloranceRadius = 2.5;
while (sumDistance < InitWidht)
{
#region 循环对比像素值
tolerance = Math.Floor((double)grayValues.Sum() / grayValues.Count);
if (leftBadPixelCount < toloranceRadius / distance)
{
IPoint leftPoint = GeometryOperations.GetPoint(point, sumDistance, -angle);
int grayvalue = img.GetGrayValue(leftPoint);
if (grayvalue == -1)
break;
if (Math.Abs(grayvalue - tolerance) < tolerance * toloranceScale)
{
leftBadPixelCount = 0;
grayValues.Add(grayvalue);
vertical.UpdatePoint(0, leftPoint);
}
else
{
leftBadPixelCount++;
if (leftBadPixelCount < toloranceRadius / distance / 5)
{
vertical.UpdatePoint(0, leftPoint);
}
}
}
if (rightBadPixelCount < toloranceRadius / distance)
{
IPoint rightPoint = GeometryOperations.GetPoint(point, -sumDistance, -angle);
int grayvalue = img.GetGrayValue(rightPoint);
if (grayvalue == -1)
break;
if (Math.Abs(grayvalue - tolerance) < tolerance * toloranceScale)
{
rightBadPixelCount = 0;
grayValues.Add(grayvalue);
vertical.UpdatePoint(1, rightPoint);
}
else
{
rightBadPixelCount++;
if (rightBadPixelCount < toloranceRadius / distance / 5)
{
vertical.UpdatePoint(1, rightPoint);
}
}
}
sumDistance += distance;
#endregion
}
return vertical;
#endregion
}
/// <summary>
/// 自动识别中心点
/// </summary>
//[LogWrite(Description = "")]
private IPointCollection AutoDistinguish2(IPoint pPoint, double angle, double pWidht)
{
#region 自动识别道路中心线
IPoint point = pPoint;
IPointCollection vertical = new Polyline();
vertical.AddPoint(point);
vertical.AddPoint(point);
//获取鼠标点周围50米的范围
IEnvelope env = new EnvelopeClass();
env.XMax = point.X + pWidht;
env.XMin = point.X - pWidht;
env.YMax = point.Y + pWidht;
env.YMin = point.Y - pWidht;
env.SpatialReference = m_hookHelper.FocusMap.SpatialReference;
if (double.IsNaN(angle))
return vertical;
//根据范围获取影像图片
ImgDistinguish imgDis = new ImgDistinguish();
TilesImage img = imgDis.GetImg(env);
if (img == null)
return vertical;
img.PixelCount = 49;
//获取平均灰度值
int Gray = img.GetGrayValue(point);
//重新设置单次搜索像素个数
img.PixelCount = 1;
//计算单次搜索的实际距离
double distance = img.Resolution * Math.Sqrt(img.PixelCount);
//记录已经搜索的总距离
double sumDistance = distance;
//检索出在容差范围内的平均灰度值集合
List<int> grayValues = new List<int>();
grayValues.Add(Gray);
//记录参考点左边的错误像素个数
int leftBadPixelCount = 0;
//记录参考点右边的错误像素个数
int rightBadPixelCount = 0;
//记录容差范围内的灰度平均值
double tolerance = 0;
///容差比例
double toloranceScale = this.drawParam.ToloranceScale;
//容差半径
double toloranceRadius = 2.5;
while (sumDistance < pWidht)
{
#region 循环对比像素值
tolerance = Math.Floor((double)grayValues.Sum() / grayValues.Count);
if (leftBadPixelCount < toloranceRadius / distance)
{
IPoint leftPoint = GeometryOperations.GetPoint(point, sumDistance, -angle);
int grayvalue = img.GetGrayValue(leftPoint);
if (grayvalue == -1)
break;
if (Math.Abs(grayvalue - tolerance) < tolerance * toloranceScale)
{
leftBadPixelCount = 0;
grayValues.Add(grayvalue);
vertical.UpdatePoint(0, leftPoint);
}
else
{
leftBadPixelCount++;
if (leftBadPixelCount < toloranceRadius / distance / 5)
{
vertical.UpdatePoint(0, leftPoint);
}
}
}
if (rightBadPixelCount < toloranceRadius / distance)
{
IPoint rightPoint = GeometryOperations.GetPoint(point, -sumDistance, -angle);
int grayvalue = img.GetGrayValue(rightPoint);
if (grayvalue == -1)
break;
if (Math.Abs(grayvalue - tolerance) < tolerance * toloranceScale)
{
rightBadPixelCount = 0;
grayValues.Add(grayvalue);
vertical.UpdatePoint(1, rightPoint);
}
else
{
rightBadPixelCount++;
if (rightBadPixelCount < toloranceRadius / distance / 5)
{
vertical.UpdatePoint(1, rightPoint);
}
}
}
sumDistance += distance;
#endregion
}
return vertical;
#endregion
}
/// <summary>
/// 绘制
/// </summary>
/// <param name="pPoint"></param>
//[LogWrite(Description = "")]
private void Drawing(IPoint pPoint)
{
try
{
if (!IsShiftDown || this.MiddleLine.Line.PointCount > 0)
{
switch (drawParam.DrawMode)
{
case DrawMode.Left:
this.MiddleLine.Scale = -0.5;
this.RightLine.Scale = -1;
DrawPointExe(pPoint, this.LeftLine, this.MiddleLine, this.RightLine);
break;
case DrawMode.Right:
this.LeftLine.Scale = 1;
this.MiddleLine.Scale = 0.5;
DrawPointExe(pPoint, this.RightLine, this.MiddleLine, this.LeftLine);
break;
case DrawMode.LeftAndRight:
this.RightLine.Scale = -0.5;
this.LeftLine.Scale = 0.5;
DrawPointExe(pPoint, this.MiddleLine, this.LeftLine, this.RightLine);
break;
default:
break;
}
}
else
{
IsContinueDraw = true;
IFeatureLayer pFeatureLayer = m_editor.TargetLayer as IFeatureLayer;
IIdentify pIdentify = pFeatureLayer as IIdentify;
IGeometry pGeometry = m_SnapPoint as IGeometry;
//获取鼠标点击的要素
IArray pArray = pIdentify.Identify(pGeometry);
if (pArray == null || pArray.Count <= 0)
{
return;
}
IFeatureIdentifyObj pFeatIdObj = pArray.get_Element(0) as IFeatureIdentifyObj;
IRowIdentifyObject pRowObj = pFeatIdObj as IRowIdentifyObject;
IFeature pFeature = pRowObj.Row as IFeature;
if (pFeature == null)
{
return;
}
IPoint clickedPt = m_SnapPoint;
double searchRadius = 3;
IHitTest hitShape = pFeature.ShapeCopy as IHitTest;
IPoint hitPoint = new PointClass();
double hitDistance = 0;
int hitPartIndex = 0;
int hitSegmentIndex = 0;
bool bRightSide = false;
esriGeometryHitPartType hitPartType = esriGeometryHitPartType.esriGeometryPartBoundary;
//获取鼠标点击的边的索引
hitShape.HitTest(clickedPt, searchRadius, hitPartType, hitPoint, ref hitDistance, ref hitPartIndex, ref hitSegmentIndex, ref bRightSide);
ISegmentCollection segmentCollection = pFeature.ShapeCopy as ISegmentCollection;
//获取点击的边
if (hitSegmentIndex < 0)
{
return;
}
ISegment segment = segmentCollection.get_Segment(hitSegmentIndex);
//将点击边的端点和宽度作为新绘制线物面的起始点和宽度
ContinueDrawLeftPoint = segment.FromPoint;
ContinueDrawRightPoint = segment.ToPoint;
ContinueDrawLength = segment.Length;
drawParam.Width = segment.Length;
IPoint segmentMiddlePoint = new PointClass();
segment.QueryPoint(esriSegmentExtension.esriNoExtension, segment.Length / 2, false, segmentMiddlePoint);
MiddleLine.Line.AddPoint(segmentMiddlePoint);
LeftLine.Line.AddPoint(ContinueDrawLeftPoint);
RightLine.Line.AddPoint(ContinueDrawRightPoint);
}
this.LeftLine.DrawLine();
this.MiddleLine.DrawLine();
this.RightLine.DrawLine();
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 绘制 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 绘制 时异常信息结束");
}
}
/// <summary>
/// 移动
/// </summary>
/// <param name="pPoint"></param>
/// <param name="IsAdjustWidth">添加 宽度调整标识</param>
//[LogWrite(Description = "")]
private void Moveing(IPoint pPoint, bool IsAdjustWidth = false)
{
try
{
switch (drawParam.DrawMode)
{
case DrawMode.Left:
this.MiddleLine.Scale = -0.5;
this.RightLine.Scale = -1;
MovePointExe(pPoint, LeftLine, RightLine, MiddleLine, IsAdjustWidth);
break;
case DrawMode.Right:
this.LeftLine.Scale = 1;
this.MiddleLine.Scale = 0.5;
MovePointExe(pPoint, RightLine, LeftLine, MiddleLine, IsAdjustWidth);
break;
case DrawMode.LeftAndRight:
this.RightLine.Scale = -0.5;
this.LeftLine.Scale = 0.5;
MovePointExe(pPoint, MiddleLine, LeftLine, RightLine, IsAdjustWidth);
break;
default:
break;
}
LeftLine.DrawLine();
RightLine.DrawLine();
MiddleLine.DrawLine();
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动 时异常信息结束");
}
}
/// <summary>
/// 绘制新的点
/// </summary>
/// <param name="pPoint">点对象</param>
/// <param name="pMainLine">鼠标绘制的线对象</param>
/// <param name="pExtLine1">通过角度和距离计算出来的线对象1</param>
/// <param name="pExtLine2">通过角度和距离计算出来的线对象2</param>
//[LogWrite(Description = "")]
private void DrawPointExe(IPoint pPoint, LineModel pMainLine, LineModel pExtLine1, LineModel pExtLine2, double pAngle = -1)
{
try
{
pMainLine.Line.AddPoint(pPoint);
if (pMainLine.Line.PointCount > 1 && pAngle == -1)
{
pAngle = GeometryOperations.getAngle(pMainLine.Line.get_Point(pMainLine.Line.PointCount - 2), pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1));
}
if (pAngle == -1)
pAngle = 0;
IPoint p1 = GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine1.Scale, -pAngle);
if (p1 == null || p1.IsEmpty)
return;
IPoint p2 = GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine2.Scale, -pAngle);
if (p2 == null || p2.IsEmpty)
return;
if (pMainLine.Line.PointCount <= 1)
{
pExtLine1.Line.AddPoint(p1);
pExtLine2.Line.AddPoint(p2);
return;
}
//判断第一个点是否识别到已有要素边界
if (pMainLine.Line.PointCount == 2)
{
#region 起始端线
IPolyline line = null;
IPolyline leftLine = GeneratePolyline(pExtLine1.Line.get_Point(0));
if (leftLine != null && !leftLine.IsEmpty)
{ line = leftLine; }
IPolyline rightLine = GeneratePolyline(pExtLine2.Line.get_Point(0));
IPolyline mainLine = GeneratePolyline(pMainLine.Line.get_Point(0));
if (rightLine != null && !rightLine.IsEmpty)
{
if (line != null)
{
ITopologicalOperator topo = line as ITopologicalOperator;
line = topo.Union(rightLine) as IPolyline;
}
else
{
line = rightLine;
}
}
if (mainLine != null && !mainLine.IsEmpty)
{
if (line != null)
{
ITopologicalOperator topo = line as ITopologicalOperator;
line = topo.Union(mainLine) as IPolyline;
}
else
{
line = mainLine;
}
}
if (line != null && !line.IsEmpty)
{
StartLine = GetSubCurve(line, pExtLine1.Line.get_Point(0), pExtLine2.Line.get_Point(0));
}
#endregion
}
#region 结束端线
//优化效率,GeneratePolyline方法比较耗时
if (IsShiftDown)
{
IPolyline endLine = null;
IPolyline tempLine = GeneratePolyline(pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1));
if (tempLine != null && !tempLine.IsEmpty)
{
endLine = tempLine;
IPoint p4 = GetIntersectPoint(pExtLine1.Line.get_Point(pExtLine1.Line.PointCount - 1), p1, tempLine as IPolyline);
if (p4 != null && !p4.IsEmpty)
p1 = p4;
IPoint p3 = GetIntersectPoint(pExtLine2.Line.get_Point(pExtLine2.Line.PointCount - 1), p2, tempLine as IPolyline);
if (p3 != null && !p3.IsEmpty)
p2 = p3;
EndLine = GetSubCurve(endLine, p1, p2);
}
}
pExtLine1.Line.AddPoint(p1);
pExtLine2.Line.AddPoint(p2);
if (EndLine != null && IsShiftDown)
{
this.DrawComplete();
}
#endregion
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 绘制新的点 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 绘制新的点 时异常信息结束");
}
}
/// <summary>
/// 移动现有的点
/// </summary>
/// <param name="pPoint">目标点</param>
/// <param name="pMainLine">鼠标绘制的线对象</param>
/// <param name="pExtLine1">通过角度和距离计算出来的线对象1</param>
/// <param name="pExtLine2">通过角度和距离计算出来的线对象2</param>
/// <param name="IsAdjustWidth">添加 宽度调整标识</param>
//[LogWrite(Description = "")]
private void MovePointExe(IPoint pPoint, LineModel pMainLine, LineModel pExtLine1, LineModel pExtLine2, bool IsAdjustWidth = false)
{
try
{
if (pMainLine.Line.PointCount < 1 || pExtLine1.Line.PointCount < 1 || pExtLine1.Line.PointCount < 1)
return;
double angle = GeometryOperations.getAngle(pMainLine.Line.Point[pMainLine.Line.PointCount - 1], pPoint);
if (Double.IsNaN(angle))
return;
IPoint pExtLine1StartPoint = null;
IPoint pExtLine2StartPoint = null;
IPoint pExtLine1EndPoint = null;
IPoint pExtLine2EndPoint = null;
//获取鼠标跟随线上的第二个点
pExtLine1EndPoint = GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine1.Scale, -angle);
pExtLine2EndPoint = GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine2.Scale, -angle);
if (pMainLine.Line.PointCount == 1)
{
pExtLine1StartPoint = GeometryOperations.GetPoint(pMainLine.Line.get_Point(0), drawParam.Width * pExtLine1.Scale, -angle);
pExtLine2StartPoint = GeometryOperations.GetPoint(pMainLine.Line.get_Point(0), drawParam.Width * pExtLine2.Scale, -angle);
//判断第一个点是否识别到已有要素边界
List<IFeature> IdentifyFeature = KGIS.Framework.AE.FeatureAPI.Identify(pMainLine.Line.get_Point(0), m_editor.TargetLayer, 1);
IdentifyFeature.AddRange(KGIS.Framework.AE.FeatureAPI.Identify(pExtLine1.Line.get_Point(0), m_editor.TargetLayer, 1));
IdentifyFeature.AddRange(KGIS.Framework.AE.FeatureAPI.Identify(pExtLine2.Line.get_Point(0), m_editor.TargetLayer, 1));
if (IdentifyFeature != null && IdentifyFeature.Count > 0)
{
IPolyline line = null;
//IFeature f = IdentifyFeature[0];
if (m_editor.GeometryType == esriGeometryType.esriGeometryPolygon)
{
foreach (IFeature item in IdentifyFeature)
{
ITopologicalOperator topo = item.ShapeCopy as ITopologicalOperator;
if (line == null)
{
line = topo.Boundary as IPolyline;
}
else
{
ITopologicalOperator topolog = line as ITopologicalOperator;
topolog.Simplify();
line = topolog.Union(topo.Boundary) as IPolyline;
}
}
IGeometryCollection geoCollection = line as IGeometryCollection;
if (geoCollection != null)
{
for (int i = 0; i < geoCollection.GeometryCount; i++)
{
if (KGIS.Framework.AE.FeatureAPI.IsInterSect(pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1) as IGeometry, geoCollection.get_Geometry(i) as IPolyline))
{
line = geoCollection.get_Geometry(i) as IPolyline;
}
}
}
}
else if (m_editor.GeometryType == esriGeometryType.esriGeometryPolyline)
{
foreach (IFeature item in IdentifyFeature)
{
if (line == null)
{
line = item.ShapeCopy as IPolyline;
}
else
{
ITopologicalOperator topolog = line as ITopologicalOperator;
topolog.Simplify();
line = topolog.Union(item.ShapeCopy) as IPolyline;
}
}
}
if (line != null)
{
if (KGIS.Framework.AE.FeatureAPI.IsInterSect(pMainLine.Line.get_Point(0) as IGeometry, line))
{
ITopologicalOperator2 topo = line as ITopologicalOperator2;
IPoint p = GetIntersectPoint(pExtLine1EndPoint, pExtLine1StartPoint, line);
if (p != null && !p.IsEmpty && !IsContinueDraw)
{
pExtLine1StartPoint = p;
}
IPoint p2 = GetIntersectPoint(pExtLine2EndPoint, pExtLine2StartPoint, line);
if (p2 != null && !p2.IsEmpty && !IsContinueDraw)
{
pExtLine2StartPoint = p2;
}
}
}
}
}
else
{
pExtLine1StartPoint = GeometryOperations.getParallelPoint(pMainLine.Line.get_Point(pMainLine.Line.PointCount - 2), pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1), pPoint, drawParam.Width * pExtLine1.Scale);
pExtLine2StartPoint = GeometryOperations.getParallelPoint(pMainLine.Line.get_Point(pMainLine.Line.PointCount - 2), pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1), pPoint, drawParam.Width * pExtLine2.Scale);
}
if (!IsContinueDraw || pExtLine1.Line.PointCount > 1)
{
//更新第一条线上的点
pExtLine1.Line.UpdatePoint(pExtLine1.Line.PointCount - 1, pExtLine1StartPoint);
//更新第一条跟随线上的点
pExtLine1.FollowLine.Stop();
pExtLine1.FollowLine.Start(new PolylineClass() { FromPoint = pExtLine1StartPoint, ToPoint = pExtLine1StartPoint }, 0, pExtLine1StartPoint);
}
else
{
pExtLine1.FollowLine.Stop();
pExtLine1.FollowLine.Start(new PolylineClass() { FromPoint = pExtLine1.Line.get_Point(0), ToPoint = pExtLine1.Line.get_Point(0) }, 0, pExtLine1.Line.get_Point(0));
}
pExtLine1.FollowLine.MoveTo(GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine1.Scale, -angle));
if (!IsContinueDraw || pExtLine1.Line.PointCount > 1)
{
//更新第二条线上的点
pExtLine2.Line.UpdatePoint(pExtLine1.Line.PointCount - 1, pExtLine2StartPoint);
//更新第二条跟随线上的点
pExtLine2.FollowLine.Stop();
pExtLine2.FollowLine.Start(new PolylineClass() { FromPoint = pExtLine2StartPoint, ToPoint = pExtLine2StartPoint }, 0, pExtLine2StartPoint);
}
else
{
pExtLine2.FollowLine.Stop();
pExtLine2.FollowLine.Start(new PolylineClass() { FromPoint = pExtLine2.Line.get_Point(0), ToPoint = pExtLine2.Line.get_Point(0) }, 0, pExtLine2.Line.get_Point(0));
}
pExtLine2.FollowLine.MoveTo(GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine2.Scale, -angle));
//添加布尔型参数IsAdjustWidth使其为true时跳过刷新MainLine
if (IsAdjustWidth)
return;
if (!IsContinueDraw || pExtLine1.Line.PointCount > 1)
{
//更新主跟随线上的点
pMainLine.FollowLine.Stop();
pMainLine.FollowLine.Start(new PolylineClass() { FromPoint = pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1), ToPoint = pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1) }, 0, pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1));
}
else
{
pMainLine.FollowLine.Stop();
pMainLine.FollowLine.Start(new PolylineClass() { FromPoint = pMainLine.Line.get_Point(0), ToPoint = pMainLine.Line.get_Point(0) }, 0, pMainLine.Line.get_Point(0));
}
pMainLine.FollowLine.MoveTo(pPoint);
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动现有的点 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动现有的点 时异常信息结束");
}
}
/// <summary>
/// 创建区间线段
/// </summary>
/// <param name="pLine">输入的线图形</param>
/// <param name="p1">插入的其中第一个点</param>
/// <param name="p2">插入的其中第一个点</param>
/// <returns>这两点间的线段</returns>
//[LogWrite(Description = "")]
private IPolyline BuildLine(IPolyline pLine, IPoint p1, IPoint p2)
{
bool isSplit;
int splitIndex, segIndex;
//插入第一点,segIndex记录插入点的相对线的节点位置
pLine.SplitAtPoint(p1, true, false, out isSplit, out splitIndex, out segIndex);
int fIndex = segIndex;
//插入第二点
pLine.SplitAtPoint(p2, true, false, out isSplit, out splitIndex, out segIndex);
int sIndex = segIndex;
IPointCollection pPointCol = new PolylineClass();
IPointCollection pPointCol2 = new PolylineClass();
object o = Type.Missing;
//比较一下插入第一点和第二点的节点次序
if (fIndex > sIndex)
{
int temp = fIndex;
fIndex = sIndex;
sIndex = temp;
}
else if (fIndex == sIndex)
{
pPointCol.AddPoint(p1, ref o, ref o);
pPointCol.AddPoint(p2, ref o, ref o);
return pPointCol as IPolyline;
}
//利用两点区间,获取线上区间所在的点,并将其转换为线
IPointCollection LineCol = pLine as IPointCollection;
for (int i = fIndex; i <= sIndex; i++)
{
pPointCol.AddPoint(LineCol.get_Point(i), ref o, ref o);
}
//for (int i = 0; i < LineCol.PointCount; i++)
//{
// if (i < fIndex || i > sIndex)
// {
// pPointCol2.AddPoint(LineCol.get_Point(i), ref o, ref o);
// }
//}
return pPointCol as IPolyline;
}
//private IPolyline GetSubCurve(IPolyline inpolyLine, IPoint pnt1, IPoint pnt2)
//{
// double d1 = GetDistAlong(inpolyLine, pnt1);
// double d2 = GetDistAlong(inpolyLine, pnt2);
// var c = inpolyLine as ICurve;
// ICurve outCurve;
// c.GetSubcurve(d1, d2, false, out outCurve);
// if (c == null || c.IsEmpty)
// throw new Exception("aa");
// var outPolyline = outCurve as IPolyline;
// if (outPolyline == null)
// {
// outPolyline = new PolylineClass() as IPolyline;
// var sc = outPolyline as ISegmentCollection;
// sc.AddSegment((ISegment)outCurve);
// ((IGeometry)sc).SpatialReference = outCurve.SpatialReference;
// }
// return outPolyline;
//}
//[LogWrite(Description = "")]
private double GetDistAlong(IPolyline polyLine, IPoint pnt)
{
var outPnt = new PointClass() as IPoint;
double distAlong = double.NaN;
double distFrom = double.NaN;
bool bRight = false;
polyLine.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, pnt, false, outPnt,
ref distAlong, ref distFrom, ref bRight);
return distAlong;
}
/// <summary>
/// 绘制点对象到地图
/// </summary>
/// <param name="pPoints"></param>
//[LogWrite(Description = "")]
private void DrawPoint(IPointCollection pPoints)
{
try
{
if (pPoints == null || pPoints.PointCount == 0)
return;
// 获取IRGBColor接口
IRgbColor color = new RgbColor();
// 设置颜色属性
color.Red = 255;
color.Green = 0;
color.Blue = 0;
IMarkerSymbol symbol = new SimpleMarkerSymbolClass();
symbol.Color = color;
symbol.Size = 5;
IPointCollection pointList = new Polyline();
pointList.AddPoint(this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1));
pointList.AddPoint(this.MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1));
pointList.AddPoint(this.RightLine.Line.get_Point(this.RightLine.Line.PointCount - 1));
IPointCollection pointList2 = new Polyline();
pointList2.AddPoint(this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1));
pointList2.AddPoint(this.MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1));
pointList2.AddPoint(this.RightLine.Line.get_Point(this.RightLine.Line.PointCount - 1));
for (int i = 0; i < pPoints.PointCount; i++)
{
if (PointElement.Count == i)
{
IMarkerElement e = new MarkerElementClass();
e.Symbol = symbol;
PointElement.Add(e as IElement);
this.m_hookHelper.ActiveView.GraphicsContainer.AddElement(e as IElement, 0);
}
IElement element = PointElement[i];
pointList.AddPoint(element.Geometry as IPoint);
element.Geometry = pPoints.get_Point(i);
pointList2.AddPoint(pPoints.get_Point(i));
}
pointList.AddPoint(this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1));
IPolyline line = pointList as IPolyline;
if (line.Length <= 0 || line.Length.Equals(double.NaN))
{
return;
}
ITopologicalOperator topo = line as ITopologicalOperator;
IGeometry geo = topo.Buffer(10);
this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, this.m_hookHelper.ActiveView.Extent);
//this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, geo.Envelope);
//this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, (pointList2 as IPolyline).Envelope);
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 绘制点对象到地图 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 绘制点对象到地图 时异常信息结束");
}
}
/// <summary>
/// 绘制文本对象
/// </summary>
/// <param name="geoDraw"></param>
/// <param name="pElement"></param>
//[LogWrite(Description = "")]
public void DrawTextElement(ESRI.ArcGIS.Geometry.IGeometry geoDraw, ref IElement pElement)
{
if (pElement != null && geoDraw != null)
{
if (pElement is ITextElement)
{
(pElement as ITextElement).Text = string.Format("当前宽度 {0} 米", drawParam.Width);
}
pElement.Geometry = geoDraw;
m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, m_hookHelper.ActiveView.Extent);
return;
}
// 获取IRGBColor接口
IRgbColor color = new RgbColor();
// 设置颜色属性
color.Red = 0;
color.Green = 255;
color.Blue = 255;
//IFontDisp pFont = new StdFont()
//{
// Name = "宋体",
// Bold = true
//} as IFontDisp;
ITextSymbol pTextSymbol = new TextSymbolClass()
{
Color = color,
//Font = pFont,
Size = 12
};
ITextElement pTextElement = new TextElementClass()
{
Symbol = pTextSymbol,
ScaleText = true,
Text = string.Format("当前宽度 {0} 米", drawParam.Width)
};
IPoint point = geoDraw as IPoint;
point.X += 2;
point.Y -= 1;
if (pElement == null)
{
pElement = pTextElement as IElement;
pElement.Geometry = point;
m_hookHelper.ActiveView.GraphicsContainer.AddElement(pElement, 0);
}
m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, m_hookHelper.ActiveView.Extent);
}
/// <summary>
/// 删除指定的Element
/// </summary>
/// <param name="pElement"></param>
//[LogWrite(Description = "")]
public void DelElement(ref IElement pElement)
{
try
{
if (pElement != null)
{
m_hookHelper.ActiveView.GraphicsContainer.DeleteElement(pElement);
m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, m_hookHelper.ActiveView.Extent);
pElement = null;
}
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 删除指定的Element 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 删除指定的Element 时异常信息结束");
}
}
/// <summary>
/// 捕捉Element上的点并返回点的索引
/// </summary>
/// <param name="pPoint"></param>
/// <returns></returns>
//[LogWrite(Description = "")]
private int SnapElement(IPoint pPoint)
{
int pointIndex = -1;
try
{
//中心线距离
double len = -1;
for (int i = 0; i < MiddleLine.Line.PointCount; i++)
{
IPolyline line = new PolylineClass();
line.FromPoint = MiddleLine.Line.get_Point(i);
line.ToPoint = pPoint;
line.SpatialReference = pPoint.SpatialReference;
if (len == -1)
{
len = line.Length;
pointIndex = i;
}
else
{
if (len > line.Length)
{
len = line.Length;
pointIndex = i;
}
}
}
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 捕捉Element上的点并返回点的索引 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 捕捉Element上的点并返回点的索引 时异常信息结束");
return -1;
}
return pointIndex;
}
/// <summary>
/// 捕捉Element上的点并返回点的索引
/// </summary>
/// <param name="pPoint"></param>
/// <returns></returns>
//[LogWrite(Description = "")]
private int SnapElement(IPoint pPoint, out int p)
{
int pointIndex = -1;
try
{
double tempLen = -1;
//中心线距离
double len = -1;
//左边线距离
double len1 = -1;
//右边线距离
double len2 = -1;
//中心线索引
int m_index = -1;
//左边线索引
int l_index = -1;
//右边线索引
int r_index = -1;
for (int i = 0; i < MiddleLine.Line.PointCount; i++)
{
IPolyline line = new PolylineClass();
line.FromPoint = MiddleLine.Line.get_Point(i);
line.ToPoint = pPoint;
line.SpatialReference = pPoint.SpatialReference;
if (len == -1)
{
len = line.Length;
m_index = i;
}
else
{
if (len > line.Length)
{
len = line.Length;
m_index = i;
}
}
}
for (int i = 0; i < LeftLine.Line.PointCount; i++)
{
IPolyline line = new PolylineClass();
line.FromPoint = LeftLine.Line.get_Point(i);
line.ToPoint = pPoint;
line.SpatialReference = pPoint.SpatialReference;
if (len1 == -1)
{
len1 = line.Length;
l_index = i;
}
else
{
if (len1 > line.Length)
{
len1 = line.Length;
l_index = i;
}
}
}
for (int i = 0; i < RightLine.Line.PointCount; i++)
{
IPolyline line = new PolylineClass();
line.FromPoint = RightLine.Line.get_Point(i);
line.ToPoint = pPoint;
line.SpatialReference = pPoint.SpatialReference;
if (len2 == -1)
{
len2 = line.Length;
r_index = i;
}
else
{
if (len2 > line.Length)
{
len2 = line.Length;
r_index = i;
}
}
}
if (len > len1)
{
if (len1 > len2)
{
p = -1;
tempLen = len2;
pointIndex = r_index;
}
else
{
p = 1;
tempLen = len1;
pointIndex = l_index;
}
}
else
{
if (len > len2)
{
p = -1;
tempLen = len2;
pointIndex = r_index;
}
else
{
p = 0;
tempLen = len;
pointIndex = m_index;
}
}
if (tempLen > 3)
{
pointIndex = -1;
}
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 在捕捉Element上的点并返回点的索引 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 在捕捉Element上的点并返回点的索引 时异常信息结束");
p = 0;
return -1;
}
return pointIndex;
}
//[LogWrite(Description = "")]
private IPolyline GetSubCurve(IPolyline LineCurve, IPoint SplitePoint1, IPoint SplitePoint2)
{
IPolyline Lines = null;
bool isSplit;
int splitIndex, segStartIndex, segEndIndex, minIndex, maxIndex;
LineCurve.SplitAtPoint(SplitePoint1, true, false, out isSplit, out splitIndex, out segStartIndex);
LineCurve.SplitAtPoint(SplitePoint2, true, false, out isSplit, out splitIndex, out segEndIndex);
if (isSplit)
{
IPolyline newLine = new PolylineClass();
ISegmentCollection lineSegCol = (ISegmentCollection)LineCurve;
ISegmentCollection newSegCol = (ISegmentCollection)newLine;
object o = Type.Missing;
if (segStartIndex > segEndIndex)
{
minIndex = segEndIndex;
maxIndex = segStartIndex;
}
else
{
minIndex = segStartIndex;
maxIndex = segEndIndex;
}
for (int j = minIndex; j <= maxIndex; j++)
{
ISegment segment = lineSegCol.get_Segment(j);
//if ((Math.Round(segment.FromPoint.X, 4) == Math.Round(SplitePoint1.X, 4) && Math.Round(segment.FromPoint.Y, 4) == Math.Round(SplitePoint1.Y, 4) && Math.Round(segment.ToPoint.X, 4) == Math.Round(SplitePoint2.X, 4) && Math.Round(segment.ToPoint.Y, 4) == Math.Round(SplitePoint2.Y, 4))
// || (Math.Round(segment.ToPoint.X, 4) == Math.Round(SplitePoint1.X, 4) && Math.Round(segment.ToPoint.Y, 4) == Math.Round(SplitePoint1.Y, 4) && Math.Round(segment.FromPoint.X, 4) == Math.Round(SplitePoint2.X, 4) && Math.Round(segment.FromPoint.Y, 4) == Math.Round(SplitePoint2.Y, 4)))
//{
newSegCol.AddSegment(segment, ref o, ref o);
//Lines = newSegCol as IPolyline;
//break;
//}
}
Lines = newSegCol as IPolyline;
}
return Lines;
}
//[LogWrite(Description = "")]
public IPolyline GeneratePolyline(IPoint point)
{
IPolyline result = null;
if (point == null) return result;
try
{
List<IFeatureLayer> snapLayers = new List<IFeatureLayer>();
snapLayers.Add(m_editor.TargetLayer as IFeatureLayer);
//获取当前捕捉的要素多边形
List<IFeature> snapFeatures = FeatureAPI.Snapping(point, snapLayers, 10);
if (snapFeatures == null) return result;
foreach (IFeature feautre in snapFeatures)
{
//将多边形要素转成线要素
List<IGeometry> featureToLines = FeatureAPI.PolygonToLine(feautre.ShapeCopy);
if (featureToLines == null) continue;
IPolyline tempLine = null;
foreach (IGeometry f_line in featureToLines)
{
tempLine = f_line as IPolyline;
List<IFeature> LineInsertFeature = FeatureAPI.Snapping(tempLine, snapLayers, 0.0001);
foreach (IFeature item in LineInsertFeature)
{
if (item.OID == feautre.OID)
continue;
ITopologicalOperator topo = tempLine as ITopologicalOperator;
topo.Simplify();
IPolyline newline = topo.Intersect(item.ShapeCopy, esriGeometryDimension.esriGeometry1Dimension) as IPolyline;
//IPolyline obj = result.Values.FirstOrDefault(f => Math.Round(f.Length, 0) == Math.Round(newline.Length, 0));
if (FeatureAPI.IsInterSect(point as IGeometry, newline))
{
result = newline;
return result;
}
tempLine = topo.Difference(item.ShapeCopy) as IPolyline;
}
}
if (FeatureAPI.IsInterSect(point as IGeometry, tempLine))
{
result = tempLine;
break;
}
}
return result;
}
catch (Exception ex)
{
LogAPI.Debug("画线物面(线状地物面)工具 过程中 执行 GeneratePolyline 时异常,异常信息如下:");
LogAPI.Debug(ex);
LogAPI.Debug("画线物面(线状地物面)工具 过程中 执行 GeneratePolyline 时异常信息结束");
throw;
}
}
#endregion
/// <summary>
/// 设置鼠标的坐标
/// </summary>
/// <param name="x">横坐标</param>
/// <param name="y">纵坐标</param>
[DllImport("User32")]
public extern static void SetCursorPos(int x, int y);
//[LogWrite(Description = "")]
//private bool ss()
//{
// try
// {
// if (Env.Instance.KeyType != "F")//非本地授权 直接返回
// {
// return true;
// }
// RunIDHelper id = new RunIDHelper();
// return id.QCCheck();
// }
// catch
// {
// return false;
// }
//}
public override void Refresh(int hDC)
{
if (MiddleLine != null && MiddleLine.FollowLine != null)
MiddleLine.FollowLine.Refresh(hDC);
if (LeftLine != null && LeftLine.FollowLine != null)
LeftLine.FollowLine.Refresh(hDC);
if (RightLine != null && RightLine.FollowLine != null)
RightLine.FollowLine.Refresh(hDC);
base.Refresh(hDC);
}
}
}