using System; using System.Collections.Generic; using System.Linq; using System.Text; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.SystemUI; using ESRI.ArcGIS.Geodatabase; using KGIS.Framework.Utils; namespace Kingo.Plugin.MapView.Commands { public class ControlsMapFullExtent : ICommand { private IHookHelper m_hookHelper; //ControlsMapFullExtentCommandClass mapFull = new ControlsMapFullExtentCommandClass(); public void OnCreate(object hook) { if (m_hookHelper == null) { m_hookHelper = new HookHelperClass { Hook = hook }; } } public void OnClick() { //IEnvelope envelop = null; //mapFull.OnClick(); //for (int i = 0; i < m_hookHelper.FocusMap.LayerCount; i++) //{ // Common.Utility.LayerHelper.GetIEnvelope(m_hookHelper.FocusMap.get_Layer(i), ref envelop); //} //if (envelop != null) //{ // (m_hookHelper.FocusMap as IActiveView).Extent = envelop; //} m_hookHelper = new HookHelperClass { Hook = KGIS.Framework.Maps.MapsManager.Instance.MapService.getAxMapControl().Object }; RoomToMap(m_hookHelper.FocusMap); } #region public bool RoomToMap(IMap pMap) { try { if (pMap == null) { return false; } IActiveView pActiveView = pMap as IActiveView; double minValue = double.MinValue; double maxValue = double.MaxValue; double dlYMax = double.MinValue; double dlYMin = double.MaxValue; ILayer pLayer = null; //IFeatureLayer layer2 = null; for (int i = 0; i < pMap.LayerCount; i++) { pLayer = pMap.get_Layer(i); //layer2 = pLayer as IFeatureLayer; //if ((layer2 != null) && (layer2.FeatureClass != null)) //{ // string str = TrimUserName((layer2.FeatureClass as IDataset).BrowseName); // if (((str == DBConst.TB_LSD) || (str == DBConst.TB_LSX)) || (str == DBConst.TB_LSM)) // { // continue; // } //} if (pLayer is ICompositeLayer) { GetCompositeLayerSideCoordinate(pLayer as ICompositeLayer, ref minValue, ref maxValue, ref dlYMax, ref dlYMin); } else { GetLayerSideCoordinate(pLayer, ref minValue, ref maxValue, ref dlYMax, ref dlYMin); } } if ((((minValue == double.MinValue) && (maxValue == double.MaxValue)) && (dlYMax == double.MinValue)) && (dlYMin == double.MaxValue)) { pActiveView.Extent = pActiveView.FullExtent; PartialRefresh(pActiveView); } else { IEnvelope pGeometry = new EnvelopeClass();//GetEnvByCoor(minValue, maxValue, dlYMax, dlYMin); pGeometry.XMax = minValue; pGeometry.XMin = maxValue; pGeometry.YMax = dlYMax; pGeometry.YMin = dlYMin; LocateGeometry(pActiveView, pGeometry, 0.2); } return true; } catch (Exception ex) { LogAPI.Debug(ex); return false; } finally { } } private bool GetCompositeLayerSideCoordinate(ICompositeLayer pCompositeLayer, ref double dlXMax, ref double dlXMin, ref double dlYMax, ref double dlYMin) { if (pCompositeLayer == null) { return false; } for (int i = 0; i < pCompositeLayer.Count; i++) { ILayer pLayer = pCompositeLayer.get_Layer(i); if (pLayer is ICompositeLayer) { if (!GetCompositeLayerSideCoordinate(pLayer as ICompositeLayer, ref dlXMax, ref dlXMin, ref dlYMax, ref dlYMin)) { return false; } } else if (!GetLayerSideCoordinate(pLayer, ref dlXMax, ref dlXMin, ref dlYMax, ref dlYMin)) { return false; } } return true; } private bool GetLayerSideCoordinate(ILayer pLayer, ref double dlXMax, ref double dlXMin, ref double dlYMax, ref double dlYMin) { if (pLayer == null || !pLayer.Valid) { return false; } if (pLayer.Name.ToUpper() == "DEFAULT") return true; if (pLayer is ITable) { try { if ((pLayer as ITable).RowCount(null) == 0) { return true; } } catch (Exception) { } } IEnvelope areaOfInterest = pLayer.AreaOfInterest; if (areaOfInterest != null) { dlXMax = Math.Max(dlXMax, areaOfInterest.XMax); dlXMin = Math.Min(dlXMin, areaOfInterest.XMin); dlYMax = Math.Max(dlYMax, areaOfInterest.YMax); dlYMin = Math.Min(dlYMin, areaOfInterest.YMin); } return true; } public bool LocateGeometry(IActiveView pActiveView, IGeometry pGeometry, double dblRatio) { try { if ((pGeometry == null) || (pActiveView == null)) { return false; } if (pGeometry.IsEmpty) { return false; } if ((pGeometry is IPoint) || (pGeometry is IMultipoint)) { ITopologicalOperator @operator = pGeometry as ITopologicalOperator; @operator.Simplify(); pGeometry = @operator.Buffer(100.0); } IEnvelope envelope = pGeometry.Envelope; IPoint p = new PointClass(); if (envelope != null) { p.X = (envelope.XMin + envelope.XMax) / 2.0; p.Y = (envelope.YMin + envelope.YMax) / 2.0; } double num = pActiveView.Extent.Width / pActiveView.Extent.Height; double num2 = envelope.Width / envelope.Height; if (num > num2) { envelope.Width = envelope.Height * num; } else { envelope.Height = envelope.Width / num; } envelope.Expand(1.0 + dblRatio, 1.0 + dblRatio, true); envelope.CenterAt(p); if (envelope.SpatialReference != pActiveView.FocusMap.SpatialReference) { envelope.Project(pActiveView.FocusMap.SpatialReference); } pActiveView.Extent = envelope; //pActiveView.Extent.PutCoords(envelope.XMin, envelope.YMin, envelope.XMax, envelope.YMax); PartialRefresh(pActiveView); pActiveView.ScreenDisplay.UpdateWindow(); return true; } catch (Exception) { return false; } } public bool PartialRefresh(IActiveView pActiveView) { if (pActiveView == null) { return false; } PartialRefresh(pActiveView, esriViewDrawPhase.esriViewForeground | esriViewDrawPhase.esriViewGraphicSelection | esriViewDrawPhase.esriViewGraphics | esriViewDrawPhase.esriViewGeoSelection | esriViewDrawPhase.esriViewGeography | esriViewDrawPhase.esriViewBackground); return true; } public bool PartialRefresh(IActiveView pActiveView, esriViewDrawPhase enumViewDrawPhase) { if (pActiveView == null) { return false; } pActiveView.PartialRefresh(enumViewDrawPhase, null, pActiveView.Extent); return true; } #endregion public int Bitmap { get; } public string Caption { get; } public string Category { get; } public bool Checked { get; } public bool Enabled { get { return true; } } public int HelpContextID { get; } public string HelpFile { get; } public string Message { get; } public string Name { get; } public string Tooltip { get; } } }