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.
3319 lines
150 KiB
3319 lines
150 KiB
using ESRI.ArcGIS.Carto; |
|
using ESRI.ArcGIS.Controls; |
|
using ESRI.ArcGIS.Display; |
|
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.Enum; |
|
using KGIS.Framework.Utils.ExtensionMethod; |
|
using KGIS.Framework.Utils.Helper; |
|
using KGIS.Framework.Utils.Model; |
|
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 ControlsEditingDrawDoubleLineTool : BaseToolCommand |
|
{ |
|
private IEngineSnapEnvironment snapEnv = null; |
|
|
|
#region 私有变量 |
|
//KOTilesLayer layer = null; |
|
private EngineEditorClass m_editor; |
|
private IHookHelper m_hookHelper; |
|
/// <summary> |
|
/// 平移工具 |
|
/// </summary> |
|
private ControlsMapPanToolClass panTool = new ControlsMapPanToolClass(); |
|
/// <summary> |
|
/// 中间线 |
|
/// </summary> |
|
private LineModel MiddleLine; |
|
/// <summary> |
|
/// 左边线 |
|
/// </summary> |
|
private LineModel LeftLine; |
|
/// <summary> |
|
/// 右边线 |
|
/// </summary> |
|
private LineModel RightLine; |
|
private bool _IsDrawing; |
|
/// <summary> |
|
/// 正在绘制 |
|
/// </summary> |
|
private bool IsDrawing |
|
{ |
|
get |
|
{ |
|
return _IsDrawing; |
|
} |
|
set |
|
{ |
|
_IsDrawing = value; |
|
if (_IsDrawing) |
|
{ |
|
(m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = false; |
|
(m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = false; |
|
} |
|
else |
|
{ |
|
(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 IsChangedWidth = false; |
|
/// <summary> |
|
/// 道路线最小点间距 |
|
/// </summary> |
|
private int MinPointDistance = 30; |
|
/// <summary> |
|
/// 道路线最大点间距 |
|
/// </summary> |
|
private int MaxPointDistance = 80; |
|
|
|
private 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 = new System.Windows.Forms.Timer(); |
|
/// <summary> |
|
/// 鼠标距离地图边界的距离(当小于指定值是开始漫游) |
|
/// </summary> |
|
private int MapBorderDistance = 10; |
|
#endregion |
|
#region 自动识别功能相关变量 |
|
/// <summary> |
|
/// 自动识别计时器(相隔一定时间,根据鼠标位置自动识别一次) |
|
/// </summary> |
|
private System.Windows.Forms.Timer autoDistinguishTimer = new System.Windows.Forms.Timer(); |
|
/// <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 |
|
#region 重写BaseCommand |
|
public override void OnCreate(object hook) |
|
{ |
|
try |
|
{ |
|
if (m_hookHelper == null) |
|
{ |
|
m_hookHelper = new HookHelper(); |
|
m_hookHelper.Hook = hook; |
|
} |
|
|
|
panTool.OnCreate(hook); |
|
base.OnCreate(hook); |
|
|
|
m_editor = new EngineEditorClass(); |
|
//m_editor.OnStopEditing += m_editor_OnStopEditing; |
|
//m_editor.OnTargetLayerChanged += m_editor_OnTargetLayerChanged; |
|
snapEnv = (IEngineSnapEnvironment)m_editor; |
|
} |
|
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 EngineSnapAgentClass m_SnapAgent = null; |
|
private IMapService _MapService; |
|
public override void OnClick() |
|
{ |
|
try |
|
{ |
|
//KGIS.Framework.Common.Utils.LicenseManager.License(); |
|
_MapService = MapsManager.Instance.MapService; |
|
if (m_editor.EditState != esriEngineEditState.esriEngineStateEditing) |
|
return; |
|
base.OnClick(); |
|
panTool.OnClick(); |
|
if (drawParam == null) |
|
{ |
|
drawParam = new DrawParam(); |
|
drawParam.DrawMode = DrawMode.LeftAndRight; |
|
drawParam.Width = 10; |
|
drawParam.ToloranceScale = 0.2; |
|
} |
|
if (paramFrm != null) |
|
{ |
|
paramFrm.Close(); |
|
} |
|
if (paramFrm == null) |
|
{ |
|
paramFrm = new FrmDrawDoublePolyline(drawParam); |
|
paramFrm.SetParam(true, false); |
|
paramFrm.Closed += paramFrm_Closed; |
|
//paramFrm.Title = this.Caption; |
|
//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 = false; |
|
if (_MapService != null) |
|
{ |
|
_MapService.MapContainerMouseWheel -= Platfrom_MapMouseWheel; |
|
_MapService.MapContainerMouseWheel += 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); |
|
this.MiddleLine.Init(); |
|
this.RightLine.Init(); |
|
this.LeftLine.Init(); |
|
IsDeactivate = false; |
|
IsSpaceDown = false; |
|
base.m_cursor = System.Windows.Forms.Cursors.Cross; |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("点击 画双线 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("点击 画双线 时异常信息结束"); |
|
|
|
MessageHelper.ShowError(ex.Message); |
|
//LogAPI.Debug(ex); |
|
} |
|
} |
|
/// <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(ex); |
|
|
|
LogAPI.Debug("画双线时 计时器标记漫游 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线时 计时器标记漫游 时异常信息结束"); |
|
} |
|
} |
|
|
|
void paramFrm_Closed(object sender, EventArgs e) |
|
{ |
|
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 |
|
{ |
|
m_editor = new EngineEditorClass(); |
|
if (m_editor.EditState == esriEngineEditState.esriEngineStateEditing && m_editor.TargetLayer != null) |
|
{ |
|
if (m_editor.TargetLayer is IFeatureLayer && (m_editor.TargetLayer as IFeatureLayer).FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline) |
|
{ |
|
return true; |
|
} |
|
else |
|
{ |
|
if (this.IsDrawing) |
|
{ |
|
this.Deactivate(); |
|
} |
|
return false; |
|
} |
|
} |
|
else |
|
{ |
|
if (this.IsDrawing) |
|
{ |
|
this.Deactivate(); |
|
} |
|
return false; |
|
} |
|
} |
|
} |
|
} |
|
#endregion |
|
IElement element = null; |
|
private int IsEnterClickNum = 0; |
|
private bool IsShiftDown = false; |
|
#region 重写BaseTool |
|
public override void OnKeyDown(int keyCode, int Shift) |
|
{ |
|
try |
|
{ |
|
base.OnKeyDown(keyCode, Shift); |
|
//键盘按下时不启用放大缩小功能 |
|
(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); |
|
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 && !IsChangedWidth) |
|
{ |
|
//如果识别到点,并且已经绘制了一个点,并且宽度没有手动调整过,则应用识别的宽度并修改第一个点的宽度 |
|
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(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) |
|
{ |
|
//KGIS.Common.Utility.LogAPI.Debug(ex); |
|
|
|
LogAPI.Debug("画双线时键盘按下 F8 后快捷键取点 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线时键盘按下 F8 后快捷键取点 时异常信息结束"); |
|
} |
|
} |
|
else if (keyCode == (int)ConsoleKey.F9 || keyCode == (int)ConsoleKey.Escape || keyCode == (int)ConsoleKey.Delete) |
|
{ |
|
try |
|
{ |
|
if (this.MiddleLine.Line.PointCount > 0 && this.IsDrawing == false) |
|
{ |
|
//删除点 |
|
#region 删除点 |
|
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; |
|
} |
|
#endregion |
|
} |
|
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();//.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); |
|
RightLine.FollowLine.Stop();//.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); |
|
MiddleLine.FollowLine.Stop();//.RemovePoints(0, MiddleLine.FollowLine.PointCount); |
|
//MiddleLine.DrawLine(); |
|
PointElement = new List<IElement>(); |
|
this.IsDrawing = 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(ex); |
|
|
|
LogAPI.Debug("画双线时键盘按下 F9/ESC(ESCAPE)/DEL(DELETE) 后删除/撤销点 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线时键盘按下 F9/ESC(ESCAPE)/DEL(DELETE) 后删除/撤销点 时异常信息结束"); |
|
} |
|
} |
|
else if (keyCode == (int)ConsoleKey.Backspace) |
|
{ |
|
try |
|
{ |
|
#region 清除绘制的图形 |
|
this.MiddleLine.Dissvoe(); |
|
this.MiddleLine.Init(); |
|
this.LeftLine.Dissvoe(); |
|
this.LeftLine.Init(); |
|
this.RightLine.Dissvoe(); |
|
this.RightLine.Init(); |
|
PointElement = new List<IElement>(); |
|
this.IsDrawing = false; |
|
#endregion |
|
} |
|
catch (Exception ex) |
|
{ |
|
//LogAPI.Debug(ex); |
|
|
|
LogAPI.Debug("画双线时键盘按下 BACKSPACE 后清除绘制的图形 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线时键盘按下 BACKSPACE 后清除绘制的图形 时异常信息结束"); |
|
} |
|
} |
|
else if (keyCode == (int)ConsoleKey.Spacebar) |
|
{ |
|
try |
|
{ |
|
#region 空格移动地图 |
|
if (!IsSpaceDown) |
|
{ |
|
base.Deactivate(); |
|
IsSpaceDown = true; |
|
} |
|
base.m_cursor = System.Windows.Forms.Cursors.Hand; |
|
//this.OnMouseMove(1, 0, MousePoint.X, MousePoint.Y); |
|
#endregion |
|
} |
|
catch (Exception ex) |
|
{ |
|
//LogAPI.Debug(ex); |
|
|
|
LogAPI.Debug("画双线时键盘按下 SPACEBAR 后移动地图 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线时键盘按下 SPACEBAR 后移动地图 时异常信息结束"); |
|
} |
|
} |
|
else if (keyCode == (int)ConsoleKey.D9) |
|
{ |
|
try |
|
{ |
|
#region 减小识别灵敏度 |
|
if (this.drawParam.ToloranceScale > 0.05) |
|
{ |
|
|
|
this.drawParam.ToloranceScale -= 0.05; |
|
autoDistinguishTimer.Stop(); |
|
autoDistinguishTimer.Start(); |
|
} |
|
else |
|
{ |
|
this.drawParam.ToloranceScale = 0.05; |
|
} |
|
#endregion |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("画双线时键盘按下 9 后减小识别灵敏度 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线时键盘按下 9 后减小识别灵敏度 时异常信息结束"); |
|
} |
|
} |
|
else if (keyCode == (int)ConsoleKey.D0) |
|
{ |
|
try |
|
{ |
|
#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 |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("画双线时键盘按下 0 后增加识别灵敏度 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线时键盘按下 0 后增加识别灵敏度 时异常信息结束"); |
|
} |
|
} |
|
else if (keyCode == 17) |
|
{ |
|
try |
|
{ |
|
#region Ctrl键调整双线宽度 |
|
if (!IsCtrlDown) |
|
{ |
|
(m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = false; |
|
(m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = false; |
|
|
|
DrawTextElement(point, ref TextElement); |
|
IsCtrlDown = true; |
|
} |
|
#endregion |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("画双线时键盘按下 Ctrl键后调整双线宽度 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线时键盘按下 Ctrl键后调整双线宽度 时异常信息结束"); |
|
} |
|
} |
|
else if (keyCode == 16) |
|
{ |
|
IsShiftDown = true; |
|
} |
|
else if (keyCode == (int)ConsoleKey.Enter) |
|
{ |
|
try |
|
{ |
|
#region 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; |
|
} |
|
} |
|
#endregion |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("画双线时键盘按下 ENTER 键后保存 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线时键盘按下 ENTER 键后保存 时异常信息结束"); |
|
} |
|
} |
|
else if (keyCode == (int)ConsoleKey.Insert) |
|
{ |
|
try |
|
{ |
|
//增加点 |
|
#region 增加点 |
|
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; |
|
} |
|
} |
|
#endregion |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("画双线时键盘按下 INS(INSERT) 键后增加点时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线时键盘按下 INS(INSERT) 键后增加点时异常信息结束"); |
|
} |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
//LogAPI.Debug(ex); |
|
|
|
LogAPI.Debug("画双线时键盘操作 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线时键盘操作 时异常信息结束"); |
|
} |
|
} |
|
public override void OnKeyUp(int keyCode, int Shift) |
|
{ |
|
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) |
|
{ |
|
if (!IsDrawing) |
|
{ |
|
(m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = true; |
|
(m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = true; |
|
} |
|
DelElement(ref TextElement); |
|
IsCtrlDown = false; |
|
} |
|
else if (keyCode == 16) |
|
{ |
|
IsShiftDown = false; |
|
} |
|
} |
|
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(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; |
|
} |
|
base.OnMouseMove(Button, Shift, 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("画双线时 鼠标移动期间 正在绘制时异常信息结束"); |
|
|
|
//KGIS.Common.Utility.LogAPI.Debug(ex); |
|
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; |
|
|
|
(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("画双线时 鼠标移动期间 未在绘制时异常信息结束"); |
|
|
|
//KGIS.Common.Utility.LogAPI.Debug(ex); |
|
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(ex); |
|
|
|
LogAPI.Debug("画双线时 鼠标移动时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线时 鼠标移动时异常信息结束"); |
|
} |
|
finally |
|
{ |
|
isRunning = false; |
|
} |
|
} |
|
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事件 |
|
} |
|
} |
|
} |
|
IPolyline StartLine = null; |
|
IPolyline EndLine = null; |
|
public void DrawComplete() |
|
{ |
|
m_editor.StartOperation(); |
|
try |
|
{ |
|
if (LeftLine.Line.PointCount < 2 || this.RightLine.Line.PointCount < 2) |
|
{ |
|
return; |
|
} |
|
IFeatureLayer layer = m_editor.TargetLayer as IFeatureLayer; |
|
if (layer == null) |
|
return; |
|
IFeatureClass fc = layer.FeatureClass; |
|
if (fc == 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(); |
|
} |
|
} |
|
////验证区域授权 |
|
//if (!base.ValidateAuthorize(LeftLine.Line as IGeometry) || !base.ValidateAuthorize(RightLine.Line as IGeometry)) |
|
//{ |
|
// MessageHelper.ShowError("绘制图形不在授权区域范围内!"); |
|
// 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.IsChangedWidth = false; |
|
// this.IsDrawing = false; |
|
// base.OnDblClick(); |
|
// return; |
|
//} |
|
IFeatureSelection featureSelection = layer as IFeatureSelection; |
|
featureSelection.Clear(); |
|
IFeature feature = fc.CreateFeature(); |
|
feature.Shape = LeftLine.Line as IGeometry; |
|
feature.Store(); |
|
//BUG12981 |
|
//------------- |
|
//featureSelection.Add(feature); |
|
m_hookHelper.ActiveView.FocusMap.SelectFeature(layer, feature); |
|
//------------- |
|
feature = fc.CreateFeature(); |
|
feature.Shape = RightLine.Line as IGeometry; |
|
feature.Store(); |
|
//BUG12981 |
|
//------------- |
|
//featureSelection.Add(feature); |
|
m_hookHelper.ActiveView.FocusMap.SelectFeature(layer, feature); |
|
//------------- |
|
if (drawParam.IsAutoClose) |
|
{ |
|
//自动封闭两端 |
|
IPointCollection line = new Polyline(); |
|
line.AddPoint((LeftLine.Line as IPolyline).FromPoint); |
|
line.AddPoint((RightLine.Line as IPolyline).FromPoint); |
|
feature = fc.CreateFeature(); |
|
feature.Shape = line as IGeometry; |
|
feature.Store(); |
|
//BUG12981 |
|
//------------- |
|
//featureSelection.Add(feature); |
|
m_hookHelper.ActiveView.FocusMap.SelectFeature(layer, feature); |
|
//------------- |
|
|
|
line = new Polyline(); |
|
line.AddPoint((LeftLine.Line as IPolyline).ToPoint); |
|
line.AddPoint((RightLine.Line as IPolyline).ToPoint); |
|
feature = fc.CreateFeature(); |
|
feature.Shape = line as IGeometry; |
|
feature.Store(); |
|
//BUG12981 |
|
//------------- |
|
//featureSelection.Add(feature); |
|
m_hookHelper.ActiveView.FocusMap.SelectFeature(layer, feature); |
|
//------------- |
|
} |
|
m_editor.StopOperation("画线物边界线"); |
|
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.IsChangedWidth = false; |
|
this.IsDrawing = false; |
|
base.OnDblClick(); |
|
|
|
if (ucZYQMagrHelper != null) |
|
{ |
|
ucZYQMagrHelper.AddMask(selectIdZYQ); |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("双线绘画完毕(执行函数DrawComplete)时 异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("双线绘画完毕(执行函数DrawComplete)时 异常信息结束"); |
|
|
|
m_editor.AbortOperation(); |
|
MessageHelper.ShowError(ex.Message); |
|
//LogAPI.Debug(ex); |
|
} |
|
} |
|
public override bool Deactivate() |
|
{ |
|
if (paramFrm != null) |
|
{ |
|
paramFrm.Close(); |
|
paramFrm = null; |
|
} |
|
this.MiddleLine.Dissvoe(); |
|
this.LeftLine.Dissvoe(); |
|
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); |
|
_MapService.MapContainerMouseWheel -= Platfrom_MapMouseWheel; |
|
timer.Tick -= timer_Tick; |
|
timer.Stop(); |
|
autoDistinguishTimer.Tick -= autoDistinguishTimer_Tick; |
|
autoDistinguishTimer.Stop(); |
|
PointElement = new List<IElement>(); |
|
this.IsDrawing = false; |
|
IsDeactivate = true; |
|
return base.Deactivate(); |
|
} |
|
|
|
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> |
|
|
|
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); |
|
} |
|
|
|
|
|
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> |
|
void Platfrom_MapMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) |
|
{ |
|
if (IsDeactivate) |
|
return; |
|
if (drawParam != null) |
|
{ |
|
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.IsChangedWidth = true; |
|
DrawTextElement(point, ref TextElement); |
|
//this.OnMouseMove(1, 0, MousePoint.X, MousePoint.Y); |
|
//宽度调整标识设置为true并传入Moveing()方法 |
|
Moveing(point, IsChangedWidth); |
|
} |
|
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 |
|
{ |
|
//添加滚轮放大缩小地图 |
|
(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> |
|
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); |
|
//获取工作区右下角的坐标对应的屏幕坐标//m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint; |
|
System.Drawing.Point rightBottomPoint = _MapService.PointToScreen(new System.Drawing.Point(x2, y2)); |
|
//获取工作区左上角的坐标对应的屏幕坐标 |
|
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 = GeometryOperations.GetPoint(p1, pWidth, 90 - angle); |
|
//第一次识别的点 |
|
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 将自动识别的点显示在地图上 |
|
if (this.drawParam.IsAutoStep) |
|
{ |
|
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; |
|
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 |
|
} |
|
if (n_p != null) |
|
{ |
|
int m_x = 0; |
|
int m_y = 0; |
|
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(n_p, out m_x, out m_y); |
|
System.Drawing.Point screenPoint = _MapService.PointToScreen(new System.Drawing.Point(m_x, m_y)); |
|
this.MousePoint.X = m_x; |
|
this.MousePoint.Y = m_y; |
|
|
|
//this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null, |
|
if (this.drawParam.IsAutoStep) |
|
{ |
|
SetCursorPos(screenPoint.X, screenPoint.Y); |
|
} |
|
if (this.drawParam.IsAutoTrack && IsAuto && this.drawParam.IsAutoStep) |
|
{ |
|
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY); |
|
this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p1, out nextX, out nextY); |
|
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); |
|
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); |
|
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 |
|
} |
|
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); |
|
//获取工作区右下角的坐标对应的屏幕坐标 |
|
System.Drawing.Point rightBottomPoint = _MapService.PointToScreen(new System.Drawing.Point(x2, y2)); |
|
//获取工作区左上角的坐标对应的屏幕坐标 |
|
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); |
|
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); |
|
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); |
|
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("画双线 自动追踪轨迹 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线 自动追踪轨迹 时异常信息结束"); |
|
|
|
throw ex; |
|
} |
|
} |
|
/// <summary> |
|
/// 定时进行自动识别影像 |
|
/// </summary> |
|
/// <param name="sender"></param> |
|
/// <param name="e"></param> |
|
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) |
|
if (this.LeftLine.Line.PointCount > 0 && this.RightLine.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) |
|
{ |
|
//KGIS.Common.Utility.LogAPI.Debug(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(ex); |
|
|
|
LogAPI.Debug("画双线期间 定时进行自动识别影像 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线期间 定时进行自动识别影像 时异常信息结束"); |
|
} |
|
} |
|
|
|
#region 捕捉 |
|
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(ex); |
|
|
|
LogAPI.Debug("画双线期间 图层中捕捉点 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线期间 图层中捕捉点 时异常信息结束"); |
|
} |
|
return result; |
|
} |
|
#endregion |
|
#region 获取所有可见图层 |
|
/// <summary> |
|
/// 获取当前地图中可见的矢量图层 |
|
/// </summary> |
|
/// <param name="pMap"></param> |
|
/// <returns></returns> |
|
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) |
|
{ |
|
//Common.Utility.LogAPI.Debug(ex); |
|
|
|
LogAPI.Debug("画双线期间 获取当前地图中可见的矢量图层 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线期间 获取当前地图中可见的矢量图层 时异常信息结束"); |
|
} |
|
return result; |
|
} |
|
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 绘制相关私有函数 |
|
|
|
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> |
|
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; |
|
//if (layer != null) |
|
//{ |
|
//获取鼠标点周围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; |
|
//根据范围获取影像图片 |
|
//TilesImage img = layer.GetImage(env); |
|
ImgDistinguish imgDis = new ImgDistinguish(); |
|
TilesImage img = imgDis.GetImg(env); |
|
//王欢 2018-11-02 未将对象引用设置到对象的实例 |
|
//if(img.Img == null || img.Origin == null) |
|
if (img == null || img.Img == null || img.Origin == 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 (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 (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> |
|
private IPointCollection AutoDistinguish2(IPoint pPoint, double angle, double pWidht) |
|
{ |
|
#region 自动识别道路中心线 |
|
IPoint point = pPoint; |
|
IPointCollection vertical = new Polyline(); |
|
vertical.AddPoint(point); |
|
vertical.AddPoint(point); |
|
//if (layer != null) |
|
//{ |
|
//获取鼠标点周围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); |
|
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 (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 (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> |
|
private void Drawing(IPoint pPoint) |
|
{ |
|
try |
|
{ |
|
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; |
|
} |
|
this.LeftLine.DrawLine(); |
|
this.MiddleLine.DrawLine(); |
|
this.RightLine.DrawLine(); |
|
} |
|
catch (Exception ex) |
|
{ |
|
//LogAPI.Debug(ex); |
|
|
|
LogAPI.Debug("画双线期间 绘制 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线期间 绘制 时异常信息结束"); |
|
} |
|
} |
|
/// <summary> |
|
/// 移动 |
|
/// </summary> |
|
/// <param name="pPoint"></param> |
|
/// <param name="IsAdjustWidth">宽度调整标识</param> |
|
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(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> |
|
private void DrawPointExe(IPoint pPoint, LineModel pMainLine, LineModel pExtLine1, LineModel pExtLine2, double pAngle = -1) |
|
{ |
|
try |
|
{ |
|
if (pExtLine1.Line.PointCount <= 0 || pExtLine2.Line.PointCount <= 0) |
|
{ |
|
if (pMainLine.Line.PointCount > 0) |
|
{ |
|
pMainLine.Line.RemovePoints(0, pMainLine.Line.PointCount); |
|
} |
|
} |
|
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; |
|
} |
|
//判断第一个点是否识别到已有要素边界 |
|
List<IFeature> IdentifyFeature = null; |
|
List<IGeometry> lineArray = null; |
|
if (pMainLine.Line.PointCount == 2) |
|
{ |
|
#region 起始端线 |
|
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) |
|
{ |
|
lineArray = new List<IGeometry>(); |
|
IPolyline line = null; |
|
if (m_editor.GeometryType == esriGeometryType.esriGeometryPolyline) |
|
{ |
|
foreach (IFeature item in IdentifyFeature) |
|
{ |
|
IPolyline tempLine = item.ShapeCopy as IPolyline; |
|
if (FeatureAPI.IsInterSect(pMainLine.Line.get_Point(0) as IGeometry, tempLine)) |
|
{ |
|
IPolyline twoPoint = new PolylineClass(); |
|
twoPoint.FromPoint = pExtLine1.Line.get_Point(0); |
|
twoPoint.ToPoint = pMainLine.Line.get_Point(0); |
|
IPolyline line1 = GetSubCurve(tempLine, pExtLine1.Line.get_Point(0), pMainLine.Line.get_Point(0)); |
|
if (Math.Round(line1.Length.ToDecimal(), 2, MidpointRounding.AwayFromZero) < Math.Round(twoPoint.Length.ToDecimal(), 2, MidpointRounding.AwayFromZero)) |
|
{ |
|
line1 = twoPoint; |
|
} |
|
lineArray.Add(line1); |
|
twoPoint = new PolylineClass(); |
|
twoPoint.FromPoint = pExtLine2.Line.get_Point(0); |
|
twoPoint.ToPoint = pMainLine.Line.get_Point(0); |
|
line1 = GetSubCurve(tempLine, pExtLine2.Line.get_Point(0), pMainLine.Line.get_Point(0)); |
|
if (Math.Round(line1.Length.ToDecimal(), 2, MidpointRounding.AwayFromZero) < Math.Round(twoPoint.Length.ToDecimal(), 2, MidpointRounding.AwayFromZero)) |
|
{ |
|
line1 = twoPoint; |
|
} |
|
lineArray.Add(line1); |
|
} |
|
} |
|
StartLine = FeatureAPI.MergeGeometry(lineArray) as IPolyline; |
|
} |
|
} |
|
#endregion |
|
} |
|
IdentifyFeature = KGIS.Framework.AE.FeatureAPI.Identify(pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1), m_editor.TargetLayer, 1); |
|
IdentifyFeature.AddRange(KGIS.Framework.AE.FeatureAPI.Identify(pExtLine1.Line.get_Point(pExtLine1.Line.PointCount - 1), m_editor.TargetLayer, 1)); |
|
IdentifyFeature.AddRange(KGIS.Framework.AE.FeatureAPI.Identify(pExtLine2.Line.get_Point(pExtLine2.Line.PointCount - 1), m_editor.TargetLayer, 1)); |
|
if (IdentifyFeature == null || IdentifyFeature.Count == 0) |
|
{ |
|
pExtLine1.Line.AddPoint(p1); |
|
pExtLine2.Line.AddPoint(p2); |
|
return; |
|
} |
|
#region 结束端线 |
|
lineArray = new List<IGeometry>(); if (m_editor.GeometryType == esriGeometryType.esriGeometryPolyline) |
|
{ |
|
foreach (IFeature item in IdentifyFeature) |
|
{ |
|
IPolyline tempLine = item.ShapeCopy as IPolyline; |
|
if (FeatureAPI.IsInterSect(pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1) as IGeometry, tempLine)) |
|
{ |
|
IPolyline twoPoint = new PolylineClass(); |
|
twoPoint.FromPoint = pExtLine1.Line.get_Point(pExtLine1.Line.PointCount - 1); |
|
twoPoint.ToPoint = pMainLine.Line.get_Point(pMainLine.Line.PointCount - 2); |
|
IPoint p4 = GetIntersectPoint(pExtLine1.Line.get_Point(pExtLine1.Line.PointCount - 1), p1, tempLine as IPolyline); |
|
if (p4 != null && !p4.IsEmpty) |
|
p1 = p4; |
|
IPolyline line1 = GetSubCurve(tempLine as IPolyline, p1, pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1)); |
|
if (Math.Round(line1.Length.ToDecimal(), 2, MidpointRounding.AwayFromZero) < Math.Round(twoPoint.Length.ToDecimal(), 2, MidpointRounding.AwayFromZero)) |
|
{ |
|
line1 = twoPoint; |
|
} |
|
lineArray.Add(line1); |
|
IPoint p3 = GetIntersectPoint(pExtLine2.Line.get_Point(pExtLine2.Line.PointCount - 1), p2, tempLine as IPolyline); |
|
if (p3 != null && !p3.IsEmpty) |
|
p2 = p3; |
|
line1 = GetSubCurve(tempLine as IPolyline, p2, pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1)); |
|
if (Math.Round(line1.Length.ToDecimal(), 2, MidpointRounding.AwayFromZero) < Math.Round(twoPoint.Length.ToDecimal(), 2, MidpointRounding.AwayFromZero)) |
|
{ |
|
line1 = twoPoint; |
|
} |
|
lineArray.Add(line1); |
|
} |
|
} |
|
EndLine = FeatureAPI.MergeGeometry(lineArray) as IPolyline; |
|
} |
|
pExtLine1.Line.AddPoint(p1); |
|
pExtLine2.Line.AddPoint(p2); |
|
if (EndLine != null && IsShiftDown) |
|
{ |
|
this.DrawComplete(); |
|
} |
|
#endregion |
|
} |
|
catch (Exception ex) |
|
{ |
|
//LogAPI.Debug(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> |
|
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; |
|
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(); |
|
IGeometry pGeometry = item.ShapeCopy; |
|
(pGeometry as ITopologicalOperator).Simplify(); |
|
line = topolog.Union(pGeometry) as IPolyline; |
|
//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) |
|
{ |
|
pExtLine1StartPoint = p; |
|
} |
|
IPoint p2 = GetIntersectPoint(pExtLine2EndPoint, pExtLine2StartPoint, line); |
|
if (p2 != null && !p2.IsEmpty) |
|
{ |
|
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); |
|
} |
|
|
|
//更新第一条线上的点 |
|
pExtLine1.Line.UpdatePoint(pExtLine1.Line.PointCount - 1, pExtLine1StartPoint); |
|
//更新第一条跟随线上的点 |
|
pExtLine1.FollowLine.Stop(); |
|
pExtLine1.FollowLine.Start(new PolylineClass() { FromPoint = pExtLine1StartPoint, ToPoint = pExtLine1StartPoint }, 0, pExtLine1StartPoint); |
|
pExtLine1.FollowLine.MoveTo(GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine1.Scale, -angle)); |
|
//pExtLine1.FollowLine.UpdatePoint(0, pExtLine1StartPoint); |
|
//pExtLine1.FollowLine.UpdatePoint(1, GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine1.Scale, -angle)); |
|
|
|
//更新第二条线上的点 |
|
pExtLine2.Line.UpdatePoint(pExtLine1.Line.PointCount - 1, pExtLine2StartPoint); |
|
//更新第二条跟随线上的点 |
|
pExtLine2.FollowLine.Stop(); |
|
pExtLine2.FollowLine.Start(new PolylineClass() { FromPoint = pExtLine2StartPoint, ToPoint = pExtLine2StartPoint }, 0, pExtLine2StartPoint); |
|
pExtLine2.FollowLine.MoveTo(GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine2.Scale, -angle)); |
|
//pExtLine2.FollowLine.UpdatePoint(0, pExtLine2StartPoint); |
|
//pExtLine2.FollowLine.UpdatePoint(1, GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine2.Scale, -angle)); |
|
|
|
//根据传入的布尔型参数IsAdjustWidth判断是否是宽度调整 |
|
if (!IsAdjustWidth) |
|
{ |
|
//更新主跟随线上的点 |
|
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)); |
|
pMainLine.FollowLine.MoveTo(pPoint); |
|
//pMainLine.FollowLine.UpdatePoint(0, pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1)); |
|
//pMainLine.FollowLine.UpdatePoint(1, pPoint); |
|
} |
|
|
|
} |
|
catch (Exception ex) |
|
{ |
|
//LogAPI.Debug(ex); |
|
|
|
LogAPI.Debug("画双线期间 移动现有的点 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线期间 移动现有的点 时异常信息结束"); |
|
} |
|
} |
|
|
|
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; |
|
} |
|
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="pLine">输入的线图形</param> |
|
/// <param name="p1">插入的其中第一个点</param> |
|
/// <param name="p2">插入的其中第一个点</param> |
|
/// <returns>这两点间的线段</returns> |
|
/// 创建人 : 懒羊羊 |
|
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; |
|
//比较一下插入第一点和第二点的节点次序 |
|
if (fIndex > sIndex) |
|
{ |
|
int temp = fIndex; |
|
fIndex = sIndex; |
|
sIndex = temp; |
|
} |
|
IPointCollection pPointCol = new PolylineClass(); |
|
object o = Type.Missing; |
|
//利用两点区间,获取线上区间所在的点,并将其转换为线 |
|
IPointCollection LineCol = pLine as IPointCollection; |
|
for (int i = fIndex; i <= sIndex; i++) |
|
{ |
|
pPointCol.AddPoint(LineCol.get_Point(i), ref o, ref o); |
|
} |
|
return pPointCol as IPolyline; |
|
} |
|
/// <summary> |
|
/// 绘制点对象到地图 |
|
/// </summary> |
|
/// <param name="pPoints"></param> |
|
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(ex); |
|
|
|
LogAPI.Debug("画双线期间 绘制点对象到地图 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线期间 绘制点对象到地图 时异常信息结束"); |
|
} |
|
} |
|
/// <summary> |
|
/// 绘制文本对象 |
|
/// </summary> |
|
/// <param name="geoDraw"></param> |
|
/// <param name="pElement"></param> |
|
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> |
|
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(ex); |
|
|
|
LogAPI.Debug("画双线期间 删除指定的Element 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线期间 删除指定的Element 时异常信息结束"); |
|
} |
|
} |
|
/// <summary> |
|
/// 捕捉Element上的点并返回点的索引 |
|
/// </summary> |
|
/// <param name="pPoint"></param> |
|
/// <returns></returns> |
|
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上的点并返回点的索引 时异常信息结束"); |
|
|
|
//LogAPI.Debug(ex); |
|
return -1; |
|
} |
|
return pointIndex; |
|
} |
|
|
|
/// <summary> |
|
/// 捕捉Element上的点并返回点的索引 |
|
/// </summary> |
|
/// <param name="pPoint"></param> |
|
/// <returns></returns> |
|
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) |
|
{ |
|
p = 0; |
|
//LogAPI.Debug(ex); |
|
|
|
LogAPI.Debug("画双线期间 捕捉Element上的点并返回点的索引 时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("画双线期间 捕捉Element上的点并返回点的索引 时异常信息结束"); |
|
|
|
return -1; |
|
} |
|
return pointIndex; |
|
} |
|
|
|
#endregion |
|
/// <summary> |
|
/// 设置鼠标的坐标 |
|
/// </summary> |
|
/// <param name="x">横坐标</param> |
|
/// <param name="y">纵坐标</param> |
|
[DllImport("User32")] |
|
public extern static void SetCursorPos(int x, int y); |
|
|
|
public override enumProductType AttachProductType |
|
{ |
|
get { return enumProductType.KDB | enumProductType.KAP; } |
|
} |
|
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); |
|
} |
|
|
|
|
|
} |
|
|
|
}
|
|
|