zoukankan      html  css  js  c++  java
  • 自定义arcengine编辑条 (能够撤销和重做)

    http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=75611&extra=&page=1

    http://www.gisall.com/?uid-99501-mode-theme

    代码
    #region IEditStack
    interface IEditStack
    {
    bool IsEditing();
    bool HasEdited();
    void StartEditing();
    void SaveEditing(bool save);
    void StopEditing(bool save);
    bool HasRedo();
    bool HasUndo();
    void RodoEditing();
    void UndoEditing();
    }
    #endregion
    代码
    class Edit : IEditStack
    {
    protected bool isEditing;
    protected bool hasEditing;
    protected IFeatureLayer currentLayer; //当前编辑图层
    protected IWorkspaceEdit workspaceEdit;
    protected IMap map;
    protected List<IFeature> selectFeatures; //选择要素集,用于删除要素

    public Edit(IFeatureLayer editLayer, IMap map)
    {
    currentLayer
    = editLayer;
    this.map = map;
    }
    public Edit()
    {
    }

    #region 添加、选择、删除要素方法
    /// <summary>
    /// 在当前图层添加要素
    /// </summary>
    /// <param name="geometry">几何要素</param>
    public void AddFeature(IGeometry geometry)
    {
    if (currentLayer == null) return;
    IFeatureClass featureClass
    = currentLayer.FeatureClass;
    if (featureClass.ShapeType != geometry.GeometryType || geometry == null)
    return;

    if (!isEditing)
    {
    MessageBox.Show(
    "请先开启编辑");
    return;
    }
    try
    {
    workspaceEdit.StartEditOperation();
    IFeature feature;
    feature
    = featureClass.CreateFeature();
    feature.Shape
    = geometry;
    feature.Store();
    workspaceEdit.StopEditOperation();
    //高亮显示添加要素
    map.ClearSelection();
    map.SelectFeature(currentLayer
    as ILayer, feature);
    ((IActiveView)map).PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,
    null, null);
    hasEditing
    = true;
    }
    catch (Exception exc)
    {
    MessageBox.Show(exc.Message);
    }
    }
    /// <summary>
    /// 在当前图层上进行要素的选择,如果需要对所有FeatureLayer进行选择的话,可以使用IMap.SelectByShape()
    /// </summary>
    /// <param name="geometry"></param>
    public void SelectFeatures(IGeometry geometry)
    {
    if (geometry == null)
    return;

    ISpatialFilter spatialFilter
    = new SpatialFilterClass();
    spatialFilter.Geometry
    = geometry;
    spatialFilter.SpatialRel
    = esriSpatialRelEnum.esriSpatialRelIntersects;
    IFeatureCursor featureCursor
    = currentLayer.Search(spatialFilter, false);
    selectFeatures
    = new List<IFeature>();
    IFeature feature
    = featureCursor.NextFeature();
    map.ClearSelection();
    while (feature != null)
    {
    map.SelectFeature(currentLayer
    as ILayer, feature);
    selectFeatures.Add(feature);
    feature
    = featureCursor.NextFeature();
    }
    //System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);
    ((IActiveView)map).PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
    }
    /// <summary>
    /// 删除选择的要素
    /// </summary>
    public void DeleteSelectFeatures()
    {
    if (selectFeatures == null || !isEditing)
    return;
    //先清除选择集
    ClearSelection();
    //删除要素
    workspaceEdit.StartEditOperation();
    foreach (IFeature feature in selectFeatures)
    {
    feature.Delete();
    }
    workspaceEdit.StopEditOperation();
    hasEditing
    = true;
    selectFeatures
    = null;
    }
    /// <summary>
    /// 清除地图上显示的选择要素集
    /// </summary>
    public void ClearSelection()
    {
    ((IActiveView)map).PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,
    null, null);
    map.ClearSelection();
    ((IActiveView)map).PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,
    null, null);
    }
    #endregion



    #region IEditStack 成员

    public bool IsEditing()
    {
    return isEditing;
    }

    public bool HasEdited()
    {
    return hasEditing;
    }

    public void StartEditing()
    {
    IFeatureClass featureClass
    = currentLayer.FeatureClass;
    IWorkspace workspace
    = (featureClass as IDataset).Workspace;
    workspaceEdit
    = workspace as IWorkspaceEdit;
    if (workspaceEdit == null)
    return;
    if (!workspaceEdit.IsBeingEdited())
    {
    workspaceEdit.StartEditing(
    true);
    workspaceEdit.EnableUndoRedo();
    isEditing
    = true;
    }
    }

    public void SaveEditing(bool save)
    {
    if (!save)
    {
    workspaceEdit.StopEditing(
    false);
    }
    else if (save && hasEditing && isEditing)
    {
    workspaceEdit.StopEditing(
    true);
    }
    hasEditing
    = false;
    }

    public void StopEditing(bool save)
    {
    this.SaveEditing(save);
    isEditing
    = false;
    }

    public bool HasRedo()
    {
    bool hasRedo = false;
    if (isEditing && hasEditing)
    {
    workspaceEdit.HasRedos(
    ref hasRedo);
    }
    return hasRedo;
    }

    public bool HasUndo()
    {
    bool hasUndo = false;
    if (isEditing && hasEditing)
    {
    workspaceEdit.HasUndos(
    ref hasUndo);
    }
    return hasUndo;
    }

    public void RodoEditing()
    {
    if (!isEditing || !hasEditing)
    return;
    workspaceEdit.RedoEditOperation();
    }

    public void UndoEditing()
    {
    if (!isEditing || !hasEditing)
    return;
    //先清除选择集
    ClearSelection();
    workspaceEdit.UndoEditOperation();
    }

    #endregion
    }
    代码
    class Edit2 : Edit
    {
    private IFeatureDataset featureDataset; //当前编辑featuredataset

    //对featureDataset操作构造函数
    public Edit2(IFeatureDataset featureDataset, IMap map)
    {
    this.featureDataset = featureDataset;
    this.map = map;
    }
    //对单个图层操作构造函数
    public Edit2(IFeatureLayer featLyr, IMap map)
    :
    base(featLyr, map)
    {
    }
    public Edit2()
    {
    }
    public new void StartEditing()
    {
    if (featureDataset != null)
    {
    IFeatureWorkspace featureWorksapce
    = featureDataset.Workspace as IFeatureWorkspace;
    workspaceEdit
    = featureWorksapce as IWorkspaceEdit;
    if (!workspaceEdit.IsBeingEdited())
    {
    workspaceEdit.StartEditing(
    true);
    workspaceEdit.EnableUndoRedo();
    isEditing
    = true;
    }
    }
    else //单一图层的话调用基类开始编辑
    {
    base.StartEditing();
    }
    }

    //保存、停止、撤销、重做等编辑可直接使用基类函数

    //对featuredataset中单个featureclass进行添加和选择要素
    public void AddFeature(IFeatureLayer featurelayer, IGeometry geometry)
    {
    currentLayer
    = featurelayer;
    base.AddFeature(geometry);
    }
    public void SelectFeatures(IFeatureLayer featureLayer, IGeometry geometry)
    {
    currentLayer
    = featureLayer;
    base.SelectFeatures(geometry);
    }
    }
  • 相关阅读:
    第07组 Beta冲刺(1/5)
    软工实践个人总结
    SDN大作业
    第08组 Beta版本演示
    2019 SDN上机第7次作业
    第08组 Beta冲刺(5/5)
    第08组 Beta冲刺(4/5)
    第08组 Beta冲刺(3/5)
    第08组 Beta冲刺(2/5)
    2019 SDN上机第6次作业
  • 原文地址:https://www.cnblogs.com/wangzihao/p/1862522.html
Copyright © 2011-2022 走看看