一直想用AO接口实现要素的移动功能,但是ILineFeedback、IPointFeedback、IPolygonFeedback只能对单对像移动;IMoveGeometryFeedback 到是可以对多图层的多对像移动,但不能对INetWorkFeature的关联对像移动。后来,在arcgis的一些官方网站上查找,看到有人说,可以用IFeatureEdit的MOVE移动I多图层的多对像,同时也实现了移动NetWorkFeature的关联对象。试了下,基本可以实现我想要的功能。
代码如下:
1、定义类MoveFeature的数据成员
#region 数据成员
IEditor _editor = null;
IFeature _feature = null;
IFeatureEdit _featureEdit = null;
IInvalidArea _invalidArea = null;
ISet _moveSet = null;
IPoint _startPoint, _endPoint;
bool _isInOperation = false;
#endregion
2、构造
public MoveFeature(IApplication app):base(app)
{
_editor = LTGetCommand.GetEditor(app);
_invalidArea= new InvalidAreaClass();
}
3、鼠标事件
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
_startPoint = _editor.SelectionAnchor.Point;
IEnumFeature enumFeature = _editor.EditSelection;
_invalidArea.Display = _editor.Display;
_invalidArea.Add(enumFeature);
_moveSet = new SetClass();
enumFeature.Reset();
_feature = enumFeature.Next();
while (_feature != null)
{
_moveSet.Add(_feature);
_feature = enumFeature.Next();
}
_isInOperation = true;
_startPoint = _editor.Display.DisplayTransformation.ToMapPoint(X, Y);
}
public override void OnMouseUp(int Button, int Shift, int X, int Y)
{
_editor.StartOperation();
ILine line = new LineClass();
_endPoint = null;
_endPoint = _editor.Display.DisplayTransformation.ToMapPoint(X, Y);
line.PutCoords(_startPoint, _endPoint);
_moveSet.Reset();
_featureEdit = _moveSet.Next() as IFeatureEdit;
//while (_featureEdit != null)
//{
_featureEdit.MoveSet(_moveSet, line);
_featureEdit = _moveSet.Next() as IFeatureEdit;
//}
_editor.StopOperation("Move Selection");
_isInOperation = false;
_invalidArea.Invalidate((short)esriScreenCache.esriAllScreenCaches);
_editor.SelectionAnchor.MoveTo(_endPoint, _editor.Display);
}
public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
//Move(X, Y);
}
代码可以实现我要的功能(我主要是想实现网络关联对像的一起移动!)
可是MouseMove事件上有点问题,不能在MouseMove时出现Arcmap的那种移动时看到移动对像的移动效果。