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

498 lines
19 KiB

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geodatabase;
using KGIS.Framework.Utils;
using Kingo.Plugin.EngineEditor.Common;
using KGIS.Framework.Utils.Helper;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Kingo.Plugin.EngineEditor.Views
{
public delegate void FeatureSelectEventHandler();
/// <summary>
/// FrmFeatureSelected.xaml 的交互逻辑
/// </summary>
public partial class FrmFeatureSelected : Window
{
public int OID;
EngineEditorClass m_editor = null;
ISelectionSet pSelectionSet = null;
//List<int> listSelectObjectID;
List<Bitmap> listSelectBitmap;
ImageList imageListSmall = new ImageList();//产生图像对象
private IHookHelper M_hookHelper = new HookHelper();
ILayer layer = null;
IFeatureLayer pFeatureLayer = null;
public bool bReturn = false;
public event FeatureSelectEventHandler featureHandler;
IGeoFeatureLayer GeoFeatureLayer;
IQueryFilter queryFilter = null;
IFeatureCursor pFeatureCursor = null;
IDictionary<int, string> pOid_DLBM = new Dictionary<int, string>();
IFeature pFeature = null;
BitmapScaleHelper pBitmapHelper = new BitmapScaleHelper();
public FrmFeatureSelected()
{
InitializeComponent();
bReturn = true;
if (m_editor == null)
{
m_editor = new EngineEditorClass();
}
Init();
}
/// <summary>
/// Edit Tool 左键 "数据切换"
/// </summary>
/// <param name="m_hookHelper"></param>
/// <param name="item"></param>
public FrmFeatureSelected(IHookHelper m_hookHelper, List<int> item)
{
InitializeComponent();
try
{
Init();
bReturn = true;
Bitmap bitmap = null;
int[] selected = new int[1];
if (m_editor == null)
{
m_editor = new EngineEditorClass();
}
this.Title = m_editor.TargetLayer.Name;
//取消当前列名
//this.nameFine.Header = Title;
M_hookHelper = m_hookHelper;
//this.listView1.View = item;
string where = null;
for (int i = 0; i < item.Count; i++)
{
//this.listView1.Items.Add(item[i]);
where += " OBJECTID=" + item[i] + " or";
}
layer = m_editor.TargetLayer;
pFeatureLayer = layer as IFeatureLayer;
pSelectionSet = (pFeatureLayer as IFeatureSelection).SelectionSet;
IEnumIDs enumIDs = pSelectionSet.IDs;
enumIDs.Reset();
int objectid = enumIDs.Next();
if (objectid > 0)
{
where = where.Substring(0, where.Length - 2);
queryFilter.WhereClause = where;
GeoFeatureLayer = layer as IGeoFeatureLayer;
pFeatureCursor = pFeatureLayer.Search(queryFilter, true);
if (!GetDLBMByOid(item.ToArray()))
{
LogAPI.Debug("要素转换器打开异常:GetDLBMByOid方法获取地类图斑失败");
return;
}
IDictionary<string, ISymbol> pDic = GetSymbol(GeoFeatureLayer, pFeatureCursor);
#region 注释
//方法1 缺点,存在相同的图斑报错,原因pDic是主键,不存相同图斑
//foreach (KeyValuePair<string, ISymbol> item1 in pDic)
//{
// bitmap = PreViewFillSymbol(item1.Value, 30, 30);
// selected[0] = 4;
// bitmap = PhotoScreenShot(bitmap, 3, 3, selected)[0];
// imageListSmall.Images.Add(bitmap);
//}
//for (int i = 0; i < item.Count; i++)
//{
// this.listView1.Items.Add(new FeatureConversion(item[i], (Bitmap)imageListSmall.Images[imageListSmall.Images.Count - i - 1]));
// if (item[i].ToString() == objectid.ToString())
// {
// this.listView1.SelectedIndex = i;
// }
//}
//
#endregion
//方法2
foreach (KeyValuePair<int, string> pair in pOid_DLBM)
{
if (bitmap != null)
{
bitmap.Dispose();
bitmap = null;
}
if (!string.IsNullOrWhiteSpace(pair.Value) && pDic.ContainsKey(pair.Value))
{
bitmap = pBitmapHelper.PreViewFillSymbol(pDic[pair.Value], 30, 30);
selected[0] = 4;
bitmap = pBitmapHelper.PhotoScreenShot(bitmap, 3, 3, selected)[0];
}
if (bitmap == null)
{
bitmap = new Bitmap(10, 10);
}
this.listView1.Items.Add(new FeatureConversion(pair.Key, bitmap));
if (pair.Key == objectid)
{
this.listView1.SelectedIndex = this.listView1.Items.Count - 1;
}
}
}
}
catch (Exception ex)
{
LogAPI.Debug("要素转换器打开异常:" + ex);
}
finally
{
if (pFeature != null)
{
Marshal.ReleaseComObject(pFeature);
}
if (pFeatureCursor != null)
{
Marshal.ReleaseComObject(pFeatureCursor);
}
GC.Collect();
}
}
public FrmFeatureSelected(IHookHelper m_hookHelper, Dictionary<string, List<int>> keyValuePairs)
{
InitializeComponent();
try
{
Init();
bReturn = true;
Bitmap bitmap = null;
if (m_editor == null)
m_editor = new EngineEditorClass();
M_hookHelper = m_hookHelper;
this.listView1.Items.Clear();
foreach (var item in keyValuePairs)
{
foreach (var itemOIDs in item.Value)
{
if (bitmap == null)
bitmap = new Bitmap(9, 9);
this.listView1.Items.Add(new FeatureConversion(item.Key, itemOIDs, bitmap));
}
}
}
catch (Exception ex)
{
LogAPI.Debug("要素转换器打开异常:" + ex);
}
finally
{
if (pFeature != null)
{
Marshal.ReleaseComObject(pFeature);
}
if (pFeatureCursor != null)
{
Marshal.ReleaseComObject(pFeatureCursor);
}
GC.Collect();
}
}
private IDictionary<string, ISymbol> GetSymbol(IGeoFeatureLayer pGeoFeatureLayer, IFeatureCursor pFeatureCursor)
{
IDictionary<string, ISymbol> pDic = new Dictionary<string, ISymbol>();
LabelAPI.GetSymbolInfos(pGeoFeatureLayer.Renderer, pFeatureCursor, pDic);
return pDic;
}
private void Init()
{
//是否展示“识别列表”
this.staPanel.Visibility = Visibility.Collapsed;
this.featureHandler += new FeatureSelectEventHandler(SelectChange);
if (listSelectBitmap == null)
{
listSelectBitmap = new List<Bitmap>();
}
if (queryFilter == null)
{
queryFilter = new QueryFilterClass();
}
}
private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//SelectChange();
if (featureHandler != null)
{
featureHandler();
}
}
/// <summary>
/// 根据OID获得DLBM
/// </summary>
/// <param name="item">oid数组</param>
/// <returns></returns>
public bool GetDLBMByOid(int[] item)
{
pOid_DLBM.Clear();
string DLBM = null;
if (pFeatureLayer == null)
{
return false;
}
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
for (int i = 0; i < item.Length; i++)
{
pFeature = pFeatureClass.GetFeature(item[i]);
for (int j = 0; j < pFeature.Fields.FieldCount; j++)
{
IField field = pFeature.Fields.get_Field(j);
if (field.Name.ToUpper() != "DLBM" || field.AliasName != "地类编码")
continue;
if (pFeature.get_Value(j) is DBNull || pFeature.get_Value(j) == null)
{
DLBM = null;
}
else
{
DLBM = pFeature.get_Value(j).ToString().Trim();
}
}
pOid_DLBM.Add(item[i], DLBM);
}
return true;
}
public void SelectChange(bool IsTest)
{
//先清除地图上所有选中要素,但目标图用来选中查询的图层选中图形不清除
ESRI.ArcGIS.Geometry.IGeometry gg = (m_editor as IEngineEditSketch).Geometry;
this.M_hookHelper.FocusMap.ClearSelection();
//获取用户选择的OBJECTID
FeatureConversion conversion = listView1.SelectedItem as FeatureConversion;
OID = conversion.OBJECTID;
//OID = listView1.SelectedItem;
pSelectionSet = (pFeatureLayer as IFeatureSelection).SelectionSet;
IFeatureClass pFeatureclass = pFeatureLayer.FeatureClass;
IQueryFilter pQuery = new QueryFilterClass();
pQuery.WhereClause = "OBJECTID=" + OID + "";
IFeatureCursor cursor = pFeatureclass.Search(pQuery, true);
IFeature pFeature = cursor.NextFeature();
if (pFeature != null)
{
(M_hookHelper.Hook as IMapControlDefault).Map.SelectFeature((pFeatureLayer as ILayer), pFeature);
//KGIS.Common.Utility.CommonAPI.MoveToCenterBySelectFeature(M_hookHelper.Hook as IMapControlDefault, (pFeatureLayer as ILayer), pFeature);
}
this.M_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, M_hookHelper.ActiveView.Extent);
//-------------------------------------
#region
//if (listSelectObjectID == null)
//{
// listSelectObjectID = new List<int>();
//}
//清除选集
//pSelectionSet.RemoveList(pSelectionSet.Count, ref listSelectObjectID.ToArray()[0]);
//listSelectObjectID.Clear();
//listSelectObjectID.Add(OID);
//先清除地图上所有选中要素,但目标图用来选中查询的图层选中图形不清除
//pSelectionSet.AddList(listSelectObjectID.Count, ref listSelectObjectID.ToArray()[0]);
//M_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, M_hookHelper.ActiveView.Extent);
//this.M_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, M_hookHelper.ActiveView.Extent);
//IFeatureClass pFeatureclass = pFeatureLayer.FeatureClass;
//IQueryFilter pQuery = new QueryFilterClass();
//pQuery.WhereClause = "OBJECTID=" + OID + "";
//IFeatureCursor cursor = pFeatureclass.Search(pQuery, true);
//IFeature pFeature = cursor.NextFeature();
//if (pFeature != null)
//{
// (m_editor as IEngineEditSketch).Geometry = pFeature.Shape;
//}
//IFeatureSelection pFeatureSele = M_hookHelper.ActiveView.FocusMap.FeatureSelection as IFeatureSelection;
//if (pFeatureSele != null)
//{
// pFeatureSele.Add();
//}
//IEnumFeature pEnumFeature1 = (M_hookHelper.ActiveView.FocusMap.FeatureSelection) as IEnumFeature;
//IEnumFeature pEnumFeature = (pSelectionSet as IFeatureSelection) as IEnumFeature;
//IFeature pFeature = pEnumFeature1.Next();
//if(pFeature!=null)
//{
// (m_editor as IEngineEditSketch).Geometry = pFeature.ShapeCopy;
//}
#endregion
}
public void SelectChange()
{
//先清除地图上所有选中要素,但目标图用来选中查询的图层选中图形不清除
ESRI.ArcGIS.Geometry.IGeometry gg = (m_editor as IEngineEditSketch).Geometry;
this.M_hookHelper.FocusMap.ClearSelection();
//获取用户选择的OBJECTID
FeatureConversion conversion = listView1.SelectedItem as FeatureConversion;
OID = conversion.OBJECTID;
pFeatureLayer = KGIS.Framework.Maps.MapsManager.Instance.MapService.GetFeatureLayerByName(conversion.LayerNameByOID);
IQueryFilter pQuery = new QueryFilterClass
{
WhereClause = "OBJECTID=" + OID + ""
};
IFeatureCursor cursor = pFeatureLayer.FeatureClass.Search(pQuery, true);
IFeature pFeature = cursor.NextFeature();
if (pFeature != null)
{
(M_hookHelper.Hook as IMapControlDefault).Map.SelectFeature((pFeatureLayer as ILayer), pFeature);
}
this.M_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, M_hookHelper.ActiveView.Extent);
}
private void form_closed(object sender, EventArgs e)
{
//this.DialogResult = true;
GC.Collect();
this.Close();
bReturn = false;
}
private void listView1_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
if (featureHandler != null)
{
featureHandler();
}
}
}
private void Button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
int currentOid = listView1.SelectedIndex;
if (currentOid > -1 && currentOid < listView1.Items.Count - 1)
{
++currentOid;
}
else if (currentOid == listView1.Items.Count - 1)
{
currentOid = 0;
}
listView1.SelectedIndex = currentOid;
}
private void Btnlist_Click(object sender, RoutedEventArgs e)
{
if (this.staPanel.Visibility == Visibility.Visible)
{
this.staPanel.Visibility = Visibility.Collapsed;
}
else if (this.staPanel.Visibility == Visibility.Collapsed)
{
this.staPanel.Visibility = Visibility.Visible;
}
}
public bool? ShowInMainForm(bool isModel = false)
{
this.ShowInTaskbar = false;
if (System.Windows.Application.Current != null)
{
this.Owner = System.Windows.Application.Current.MainWindow;
}
else
{
WindowInteropHelper helper = new WindowInteropHelper(this);
helper.Owner = ExtensionShowWindow.MainWinForm.Handle;
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(this);
}
if (isModel)
{
return this.ShowDialog();
}
else
{
this.Show();
return true;
}
}
}
public class FeatureConversion
{
private ImageSource img { get; set; }
private int objectid { get; set; }
private string layerNameByOID { get; set; }
public ImageSource IMG
{
get
{
return img;
}
}
public int OBJECTID
{
get
{
return objectid;
}
}
/// <summary>
/// 对应的图层名字
/// </summary>
public string LayerNameByOID
{
get
{
return layerNameByOID;
}
}
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
public static ImageSource ChangeBitmapToImageSource(Bitmap bitmap)
{
IntPtr hBitmap = bitmap.GetHbitmap();
ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
if (!DeleteObject(hBitmap))
{
if (hBitmap != null)
{
Marshal.FreeCoTaskMem(hBitmap);
}
else
throw new System.ComponentModel.Win32Exception();
}
return wpfBitmap;
}
public FeatureConversion(int oid, Bitmap img)
{
this.objectid = oid;
this.img = ChangeBitmapToImageSource(img);
}
public FeatureConversion(string layerNamebyOID, int oid, Bitmap img)
{
this.layerNameByOID = layerNamebyOID;
this.objectid = oid;
this.img = ChangeBitmapToImageSource(img);
}
public FeatureConversion(int oid, ImageSource img)
{
this.img = img;
this.objectid = oid;
}
}
}