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.
249 lines
8.1 KiB
249 lines
8.1 KiB
using DevExpress.XtraBars; |
|
using ESRI.ArcGIS.ADF.BaseClasses; |
|
using ESRI.ArcGIS.Carto; |
|
using ESRI.ArcGIS.Controls; |
|
using KGIS.Framework.Menus; |
|
using KGIS.Framework.Utils; |
|
using System; |
|
using System.Runtime.InteropServices; |
|
|
|
namespace Kingo.Plugin.MapView.Commands |
|
{ |
|
public class ControlMapScaleListCommandClass : BaseCommand, ICombox |
|
{ |
|
private IHookHelper m_hookHelper; |
|
private EngineEditorClass editor = new EngineEditorClass(); |
|
private BarEditItem _baritem = null; |
|
private ControlsEditingEditTool editTool = null; |
|
private double scaleValue = 0; |
|
public object BarEditItem |
|
{ |
|
get |
|
{ |
|
return _baritem; |
|
} |
|
} |
|
|
|
public bool IsShowCaption |
|
{ |
|
get |
|
{ |
|
return true; |
|
} |
|
} |
|
public override string Caption |
|
{ |
|
get |
|
{ |
|
return "比例尺"; |
|
} |
|
} |
|
public override bool Enabled |
|
{ |
|
get |
|
{ |
|
return true; |
|
} |
|
} |
|
|
|
public override void OnClick() |
|
{ |
|
|
|
} |
|
|
|
DevExpress.XtraEditors.Repository.RepositoryItemComboBox comboxEdit = new DevExpress.XtraEditors.Repository.RepositoryItemComboBox(); |
|
public override void OnCreate(object hook) |
|
{ |
|
try |
|
{ |
|
if (m_hookHelper == null) |
|
{ |
|
m_hookHelper = new HookHelper(); |
|
m_hookHelper.Hook = hook; |
|
} |
|
if (m_hookHelper.Hook is IMapControl2) |
|
{ |
|
((ESRI.ArcGIS.Controls.IMapControlEvents2_Event)m_hookHelper.Hook).OnExtentUpdated += ControlsMapScaleZoomToolCommand_OnExtentUpdated; |
|
} |
|
CreateCombox(); |
|
|
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("初始化 比例尺 命令时异常,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("初始化 比例尺 命令时异常信息结束"); |
|
} |
|
} |
|
private void ControlsMapScaleZoomToolCommand_OnExtentUpdated(object displayTransformation, bool sizeChanged, object newEnvelope) |
|
{ |
|
if (this.m_hookHelper.ActiveView.FocusMap.SpatialReference == null) |
|
return; |
|
try |
|
{ |
|
#region 防止获取Map的MapScale异常 |
|
int hWnd = GetDesktopWindow().ToInt32(); |
|
IActiveView pAv = m_hookHelper.ActiveView; |
|
pAv.Activate(hWnd); |
|
#endregion |
|
SetComboxText(this.m_hookHelper.ActiveView.FocusMap.MapScale); |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug(" 执行 ControlsMapScaleZoomToolCommand_OnExtentUpdated 时候失败,异常原因: " + ex + " ; "); |
|
} |
|
} |
|
private void SetComboxText(double scale) |
|
{ |
|
this._baritem.EditValue = ConvertNumberToMapScale(scale); |
|
} |
|
|
|
private void CreateCombox() |
|
{ |
|
comboxEdit.SelectedIndexChanged += ComboxEdit_SelectedIndexChanged; |
|
comboxEdit.Leave += comboxEdit_Leave; |
|
comboxEdit.Items.Add("1:250"); |
|
comboxEdit.Items.Add("1:500"); |
|
comboxEdit.Items.Add("1:1000"); |
|
comboxEdit.Items.Add("1:5000"); |
|
comboxEdit.Items.Add("1:10000"); |
|
comboxEdit.Items.Add("1:24000"); |
|
comboxEdit.Items.Add("1:100000"); |
|
comboxEdit.Items.Add("1:250000"); |
|
comboxEdit.Items.Add("1:500000"); |
|
comboxEdit.Items.Add("1:750000"); |
|
comboxEdit.Items.Add("1:1500000"); |
|
} |
|
private void comboxEdit_Leave(object sender, EventArgs e) |
|
{ |
|
if ((sender as DevExpress.XtraEditors.ComboBoxEdit) != null && (sender as DevExpress.XtraEditors.ComboBoxEdit).EditValue != null) |
|
{ |
|
SetMapScale((sender as DevExpress.XtraEditors.ComboBoxEdit).EditValue.ToString()); |
|
} |
|
} |
|
|
|
private void SetMapScale(string scale) |
|
{ |
|
if (string.IsNullOrWhiteSpace(scale)) |
|
{ |
|
return; |
|
} |
|
double scaled = 0; |
|
if (ConvertMapScaleToNumber(scale, out scaled)) |
|
{ |
|
if (scaleValue == scaled) |
|
{ |
|
return; |
|
} |
|
scaleValue = scaled; |
|
this.m_hookHelper.ActiveView.FocusMap.MapScale = scaled; |
|
this.m_hookHelper.ActiveView.Refresh(); |
|
} |
|
} |
|
|
|
private bool ConvertMapScaleToNumber(string strInput, out double dblResult) |
|
{ |
|
//1.移除逗号 |
|
string strText = strInput.Replace(",", ""); |
|
//2.移除1: |
|
if (strText.StartsWith("1:")) |
|
{ |
|
strText = strText.Remove(0, 2); |
|
} |
|
double dblTemp; |
|
//3.判断是否数字 |
|
if (double.TryParse(strText, out dblTemp)) |
|
{ |
|
if (dblTemp < 0) |
|
{ |
|
dblResult = double.NaN; |
|
return false; |
|
} |
|
|
|
//在0和1之间不再四舍五入,但要保留3位精度 |
|
if ((dblTemp < 10) && (dblTemp > 0)) |
|
{ |
|
dblTemp = 1000 * dblTemp; |
|
dblTemp = (double)Math.Round(dblTemp); |
|
dblResult = dblTemp / 1000; |
|
} |
|
else |
|
{ |
|
dblResult = (double)Math.Round(dblTemp); |
|
} |
|
return true; |
|
} |
|
else |
|
{ |
|
dblResult = double.NaN; |
|
return false; |
|
} |
|
} |
|
|
|
private string ConvertNumberToMapScale(double num) |
|
{ |
|
if (num < 0) { return "1:0"; } |
|
double dblResult; |
|
//如果在0和10之间不再四舍五入,但要保留3位精度 |
|
if ((num < 10) && (num > 0)) |
|
{ |
|
double dblTemp = 1000 * num; |
|
dblTemp = (double)Math.Round(dblTemp); |
|
dblResult = dblTemp / 1000; |
|
} |
|
else |
|
{ |
|
dblResult = (double)Math.Round(num); |
|
} |
|
//小数点前每隔三位插入"," |
|
string strResult = dblResult.ToString(); |
|
int pointIndex = strResult.IndexOf("."); |
|
if (pointIndex < 0) { pointIndex = strResult.Length; } |
|
if (pointIndex > 3) |
|
{ |
|
for (int i = pointIndex; i > 3; i = i - 3) |
|
{ |
|
strResult = strResult.Insert(i - 3, ","); |
|
} |
|
} |
|
|
|
return "1:" + strResult; |
|
} |
|
private void ComboxEdit_SelectedIndexChanged(object sender, EventArgs e) |
|
{ |
|
try |
|
{ |
|
if (this._baritem.EditValue != null) |
|
{ |
|
SetMapScale(this._baritem.EditValue.ToString()); |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
//LogAPI.Debug("图层切换时工具切换失败:" + ex.Message); |
|
|
|
LogAPI.Debug("比例尺 切换失败,异常信息如下:"); |
|
LogAPI.Debug(ex); |
|
LogAPI.Debug("比例尺 切换失败异常信息结束"); |
|
} |
|
} |
|
|
|
public void SetBarEditItem(object barItem) |
|
{ |
|
if (barItem is BarEditItem) |
|
{ |
|
_baritem = barItem as BarEditItem; |
|
comboxEdit.AutoHeight = true; |
|
comboxEdit.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor; |
|
comboxEdit.DropDownRows = 20; |
|
comboxEdit.SelectedIndexChanged += ComboxEdit_SelectedIndexChanged; |
|
_baritem.EditWidth = 120; |
|
_baritem.Edit = comboxEdit; |
|
} |
|
} |
|
|
|
[DllImport("user32.dll", EntryPoint = "GetDesktopWindow")] |
|
protected static extern IntPtr GetDesktopWindow(); |
|
} |
|
|
|
}
|
|
|