自定义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);
}
}

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(ArcEngine)