首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

ArcEngine 开发自动完成多角形功能

2013-03-13 
ArcEngine 开发自动完成多边形功能ArcEngine 开发自动完成多边形功能using Systemusing System.Collectio

ArcEngine 开发自动完成多边形功能

ArcEngine 开发自动完成多边形功能

using System;using System.Collections.Generic;using System.Text;using GIS.ArcGIS.Commands.SelEx;using ESRI.ArcGIS.Controls;using Net.Resource;using ESRI.ArcGIS.Geometry;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geodatabase;using ESRI.ArcGIS.Display;using GIS.ArcGIS.Common;using GIS.ArcGIS.Carto;using GIS.ArcGIS.EditEx;using System.Windows.Forms;namespace GIS.ArcGIS.Commands.EditEx{    /// <summary>    /// ArcEngine 开发自动完成多边形功能    /// vp:hsg    /// create date:2012-07-20    /// modify date:2013-03-12    /// </summary>    public class EditAutoCompletePolygonTool : EditGisBaseTool, ILineSelect    {        private EngineEditorClass eedit = new EngineEditorClass();        public EditAutoCompletePolygonTool()        {        }        ~EditAutoCompletePolygonTool()        {            try            {                m_Cursor = null;            }            catch (Exception ee)            {            }        }        #region ICommand 成员        public override int Bitmap        {            get            {                return 0;            }        }        public  string Description        {            get { return "自动完成多边形功能"; }        }        public override string Caption        {            get { return this.Description; }        }        public override string Category        {            get { return "AutoCompletePolygon"; }        }        public override bool Checked        {            get { return false; }        }        public override bool Enabled        {            get            {                if (eedit.TargetLayer != null)                {                    return true;                }                return false;            }        }        public override int HelpContextID        {            get { return 0; }        }        public override string HelpFile        {            get { return ""; }        }        public override string Message        {            get { return this.Description; }        }        public override string Name        {            get { return this.Description; }        }        public override void OnClick()        {            if (m_Cursor == null)            {                m_Cursor = ResourceLib.getInstance().GetCursorResource("Net.Resource.Select.PointSelect.cur");            }            this.Step = 0;            this.IsUsed = false;            this.LineFeedback = null;        }        public override string Tooltip        {            get { return this.Description; }        }        #endregion        #region ITool 成员        private System.Windows.Forms.Cursor m_Cursor = null;        public override int Cursor        {            get            {                if (m_Cursor != null)                {                    return m_Cursor.Handle.ToInt32();                }                else                {                    return 0;                }            }        }        public override bool Deactivate()        {            return true;        }        public override bool OnContextMenu(int x, int y)        {            return false;        }        private void CreatePolygonsFromFeatures(IFeatureClass getpolygon_fc)        {            IDataset pDataset = getpolygon_fc as IDataset;            IWorkspace pWorkspace = pDataset.Workspace;            IWorkspaceEdit pWorkspaceEdit = pWorkspace as IWorkspaceEdit;            if (pWorkspaceEdit.IsBeingEdited() != true)            {                pWorkspaceEdit.StartEditing(true);                if (pWorkspaceEdit.IsBeingEdited() != true)                {                    return;                }                pWorkspaceEdit.StartEditOperation();            }            IFeatureConstruction pFeatureConstruction = new FeatureConstructionClass();            IMap pMap = this.HookHelper.FocusMap;// axMapControl1.Map;            IEnumFeature pEnumFeature = pMap.FeatureSelection as IEnumFeature;            IFeature pFeature = pEnumFeature.Next();            if (pFeature == null)            {                MessageBox.Show("pEnumFeature为空");                return;            }            pFeatureConstruction.ConstructPolygonsFromFeatures(null, getpolygon_fc, null, false, false, pEnumFeature, null, 0.01, null);            MessageBox.Show("转化结束");        }        /// <summary>        /// 双击 结束画        /// </summary>        public override void OnDblClick()        {            try            {                object objMiss = Type.Missing;                //                if (this.IsUsed == false) return;                if (this.LineFeedback == null) return;                if (this.Step > 1)                {                    IPolyline tpPolyline = this.LineFeedback.Stop();                    if (tpPolyline == null)                    {                        this.Step = 0;                        this.IsUsed = false;                        this.LineFeedback = null;                        return;                    }                    IGeometry tpLine = tpPolyline;                    //获取构面的线集合                    GeometryBagClass enumGeoLines = new GeometryBagClass();                    enumGeoLines.AddGeometry(tpLine, ref objMiss, ref objMiss);                                        //                    if (eedit.TargetLayer != null && eedit.TargetLayer is IFeatureLayer)                    {                        IFeatureLayer FeatLayer = eedit.TargetLayer as IFeatureLayer;                        FeatLayer.Selectable = true;                        IFeatureClass fc = FeatLayer.FeatureClass;                        IDataset pDataset = fc as IDataset;                        IWorkspace pWorkspace = pDataset.Workspace;                        //                        IGeoDataset geoDS = fc as IGeoDataset;                        IEnvelope processingBounds = geoDS.Extent;                        //                        IInvalidArea invalidArea = new InvalidAreaClass();                        //要素构造类                        IFeatureConstruction pfeatBuild = new FeatureConstructionClass();                        //从enumGeoLines集合中构面并保存到fc面图层中                        //pfeatBuild.ConstructPolygonsFromGeometries(null, fc, null, false, enumGeoLines, null, 0.0001);                        //开始自动完成构面并保存到fc面图层中                        IFeatureSelection featsel = FeatLayer as IFeatureSelection;                        ISelectionSet selSet = featsel.SelectionSet;                        pfeatBuild.AutoCompleteFromGeometries(fc, processingBounds, enumGeoLines, invalidArea, 0.0001, pWorkspace, out selSet);                        if (selSet != null)                        {                            MessageBox.Show(selSet.Count.ToString());                        }                        //                        this.HookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, this.HookHelper.ActiveView.Extent);                        //                    }                    else                    {                        System.Windows.Forms.MessageBox.Show("目标图层为空,请开启编辑会话", "提示");                    }                    this.Step = 0;                    this.IsUsed = false;                    this.LineFeedback = null;                }            }            catch (Exception ee)            {                MessageBox.Show(ee.Message, "提示");            }        }        public virtual IGeometry Erase(IGeometry source, IGeometry other)        {            ITopologicalOperator topoOper = source as ITopologicalOperator;            if (!topoOper.IsSimple)            {                topoOper.Simplify();            }            IGeometry geo = topoOper.Difference(other);            topoOper = geo as ITopologicalOperator;            if (!topoOper.IsSimple)            {                topoOper.Simplify();            }            return geo;        }        public override void OnKeyDown(int keyCode, int shift)        {        }        public override void OnKeyUp(int keyCode, int shift)        {        }        public override void OnMouseDown(int button, int shift, int x, int y)        {            if (this.HookHelper.ActiveView == null) return;            if (button == 1)//MouseDown左键 开始画点/连续画点            {                IPoint tpPoint = null;                if (this.Step <= 0)                {                    //开始画点                    tpPoint = this.HookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);                    this.LineFeedback = new NewLineFeedbackClass();                    this.LineFeedback.Start(tpPoint);                    this.Step += 1;                    this.LineFeedback.Display = this.HookHelper.ActiveView.ScreenDisplay;                    this.IsUsed = true;                }                else                {                    //连续画点                    tpPoint = this.HookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);                    this.Step += 1;                    this.LineFeedback.AddPoint(tpPoint);                }            }  //--            else   //MouseDown右键              {            }        }        public override void OnMouseMove(int button, int shift, int x, int y)        {            if (this.IsUsed == true)            {                IPoint mappoint = this.HookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);                this.LineFeedback.MoveTo(mappoint);            }        }        public override void OnMouseUp(int button, int shift, int x, int y)        {        }        public override void Refresh(int hdc)        {        }        #endregion        #region ILineSelect 成员        public esriSpatialRelEnum getSpatialRel(esriGeometryType geoType)        {            //System.Windows.Forms.MessageBox.Show(geoType.ToString());            esriSpatialRelEnum SpatialRelEnum = esriSpatialRelEnum.esriSpatialRelIntersects;            switch (geoType)            {                case esriGeometryType.esriGeometryPolygon: //面对面Polygon                    SpatialRelEnum = esriSpatialRelEnum.esriSpatialRelIntersects;                    break;                case esriGeometryType.esriGeometryPoint:   //面对点Point                    SpatialRelEnum = esriSpatialRelEnum.esriSpatialRelIntersects;                    break;                case esriGeometryType.esriGeometryPolyline: //面对线Polyline                       SpatialRelEnum = esriSpatialRelEnum.esriSpatialRelIntersects;                    break;                case esriGeometryType.esriGeometryLine: //面对线Line                    SpatialRelEnum = esriSpatialRelEnum.esriSpatialRelIntersects;                    break;                default:                    SpatialRelEnum = esriSpatialRelEnum.esriSpatialRelIntersects;                    break;            }            return SpatialRelEnum;        }        public ISymbol getSelectionSymbol(esriGeometryType geoType)        {            ISymbol symbol = null;            switch (geoType)            {                case esriGeometryType.esriGeometryPolygon: //点对面Polygon                    symbol = new SimpleFillSymbolClass();                    ISimpleFillSymbol fs = symbol as ISimpleFillSymbol;                    fs.Color = EnvironmentSelectionClass.getInstance.DefaultColor;                    fs.Outline.Color = EnvironmentSelectionClass.getInstance.DefaultColor;                    fs.Outline.Width = 1;                    fs.Style = esriSimpleFillStyle.esriSFSSolid;                    break;                case esriGeometryType.esriGeometryPoint:   //点对点Point                    symbol = new SimpleMarkerSymbolClass();                    (symbol as ISimpleMarkerSymbol).OutlineColor = EnvironmentSelectionClass.getInstance.DefaultColor;                    (symbol as ISimpleMarkerSymbol).Outline = true;                    (symbol as ISimpleMarkerSymbol).OutlineSize = 5;                    (symbol as ISimpleMarkerSymbol).Style = esriSimpleMarkerStyle.esriSMSCircle;                    break;                case esriGeometryType.esriGeometryPolyline: //点对线Polyline   //点作Buffer容差值                    symbol = new SimpleLineSymbolClass();                    (symbol as ISimpleLineSymbol).Color = EnvironmentSelectionClass.getInstance.DefaultColor;                    (symbol as ISimpleLineSymbol).Width = 1;                    (symbol as ISimpleLineSymbol).Style = esriSimpleLineStyle.esriSLSSolid;                    break;                case esriGeometryType.esriGeometryLine: //点对线Line                    symbol = new SimpleLineSymbolClass();                    (symbol as ISimpleLineSymbol).Color = EnvironmentSelectionClass.getInstance.DefaultColor;                    (symbol as ISimpleLineSymbol).Width = 1;                    (symbol as ISimpleLineSymbol).Style = esriSimpleLineStyle.esriSLSSolid;                    break;                default:                    symbol = new SimpleLineSymbolClass();                    (symbol as ISimpleLineSymbol).Color = EnvironmentSelectionClass.getInstance.DefaultColor;                    (symbol as ISimpleLineSymbol).Width = 1;                    (symbol as ISimpleLineSymbol).Style = esriSimpleLineStyle.esriSLSSolid;                    break;            }            return symbol;        }        private INewLineFeedback m_LineFeedback = null;        public INewLineFeedback LineFeedback        {            get { return m_LineFeedback; }            set { m_LineFeedback = value; }        }        private bool m_IsUsed = false;        public bool IsUsed        {            get            {                return m_IsUsed;            }            set            {                m_IsUsed = value;            }        }        private int m_Step = 0;        public int Step        {            get { return m_Step; }            set { m_Step = value; }        }        #endregion    }}


 

 

热点排行