ArcMap的Editor工具实现要素拖动编Word文件下载.docx
- 文档编号:18716710
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:12
- 大小:21.64KB
ArcMap的Editor工具实现要素拖动编Word文件下载.docx
《ArcMap的Editor工具实现要素拖动编Word文件下载.docx》由会员分享,可在线阅读,更多相关《ArcMap的Editor工具实现要素拖动编Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
//这个其实我这里没有用到,这个实在创建新要素时用到的
List<
IFeature>
m_SelectedFeature;
//这个存储鼠标点击下,击中的要素
IPoint
m_CurrentMousePosition;
//这个好像也没用到,记录当前鼠标的位置
IDisplayFeedback
m_FeedBack;
//这个就是当前屏幕(鼠标动作)的反馈信息
那我们就按照逻辑顺序来一一展示这个到底是怎么做的。
首先是,开始和结束编辑的代码:
///
<
summary>
开始编辑
/summary>
param
name="
bWithUndoRedo"
>
/param>
public
void
StartEditing(bool
bWithUndoRedo)
{
if
(m_SelectedLayer
==
null)
return;
IFeatureLayer
featureLayer
m_SelectedLayer
as
IFeatureLayer;
(featureLayer
IFeatureClass
featureClass
featureLayer.FeatureClass;
(featureClass
IDataset
dataset
IDataset;
IWorkspaceEdit
workspaceEdit
dataset.Workspace
IWorkspaceEdit;
try
workspaceEdit.StartEditing(bWithUndoRedo);
true;
}
catch
当然你可以直接传进来IWorkspace,这个可根据你具体的需求,我这里用当前图层获取工作空间。
结束编辑
bSave"
StopEditing(bool
bSave)
(m_IsEdited)
(workspaceEdit.IsBeingEdited())
workspaceEdit.StopEditing(bSave);
catch
workspaceEdit.AbortEditOperation();
开始编辑已经好了,然后就是鼠标点击要素时候,让其处于选中状态,我这里为了方便控制,我分成了两个函数写,给为看官也可以合并成一个:
GetFeatureOnMouseDown(int
x,
int
y)
m_SelectedFeature.Clear();
point
m_MapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x,
y);
IGeometry
geometry
IGeometry;
double
length
ConvertPixelsToMapUnits(4);
ITopologicalOperator
pTopo
ITopologicalOperator;
buffer
pTopo.Buffer(length);
buffer.Envelope
ISpatialFilter
spatialFilter
new
SpatialFilterClass();
spatialFilter.Geometry
geometry;
switch
(featureClass.ShapeType)
case
esriGeometryType.esriGeometryPoint:
spatialFilter.SpatialRel
esriSpatialRelEnum.esriSpatialRelContains;
break;
esriGeometryType.esriGeometryPolygon:
esriSpatialRelEnum.esriSpatialRelIntersects;
esriGeometryType.esriGeometryPolyline:
esriSpatialRelEnum.esriSpatialRelCrosses;
spatialFilter.GeometryField
featureClass.ShapeFieldName;
IQueryFilter
filter
IQueryFilter;
IFeatureCursor
cursor
featureClass.Search(filter,
false);
IFeature
pfeature
cursor.NextFeature();
while
(pfeature
!
null)
m_SelectedFeature.Add(pfeature);
根据鼠标点击位置使击中要素处于高亮显示状态
x"
y"
SelectOnMouseDown()
m_MapControl.Map.ClearSelection();
m_MapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,
null,
null);
foreach
(IFeature
feature
in
m_SelectedFeature.ToArray())
m_MapControl.Map.SelectFeature(m_SelectedLayer,
feature);
{
相信大家对第一个函数并不陌生吧?
对的,就是用的空间查询,把点击中的要素放进容器,再用第二个函数进行高亮显示。
这个地方注意,如果数据量比较多,强烈推荐用PartialRefresh而不要用Refresh,参数的含义请参考帮助。
这个只是开始编辑后,可以用鼠标点击选中要素,使其处于高亮状态,然而,ArcMap里面双击要素怎么出现节点用以编辑呢?
这个是要自己绘制到MapControl上面去的:
在要素上面绘制一个可拖拽的符号
geometry"
DrawEditSymbol(IGeometry
geometry,
IDisplay
display)
IEngineEditProperties
engineProperty
EngineEditorClass();
ISymbol
pointSymbol
engineProperty.SketchVertexSymbol
ISymbol;
sketchSymbol
engineProperty.SketchSymbol
sketchSymbol.SetupDC(display.hDC,
display.DisplayTransformation);
sketchSymbol.Draw(pTopo.Boundary);
IPointCollection
pointCol
IPointCollection;
for
(int
i
0;
pointCol.PointCount;
i++)
pointCol.get_Point(i);
pointSymbol.SetupDC(display.hDC,
pointSymbol.Draw(point);
pointSymbol.ResetDC();
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(sketchSymbol);
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pointSymbol);
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(engineProperty);
注意,这个函数是在MapControl的AfterDraw里面调用的,IDisplay参数,是AfterDraw事件的参数,我这里就没有画出来,类似ArcMap里面还有一个红色的节点,这里全是绿色的,因为红色对我的用处不大,也就没有必要了,当然各位看官可以自行修改,还有就是绘制符号的时候一定要记得释放内存哦~
现在,编辑状态做好了,但是现在只是雏形,因为它还没有响应任何鼠标事件,当鼠标悬停在绿色的节点上时并不会让你可以拖拽,所以我们还要做点工作。
那现在就开始如果鼠标悬停在绿色节点上时的代码吧:
SnapVertex(int
x,int
y,IGeometry
snapContainer,ref
vertexSnaped,ref
contained)
pHitPoint
null;
hitDist
-1,
tol
-1;
vertexIndex
partIndex
vertex
IHitTest
pHitTest
snapContainer
IHitTest;
bHit=pHitTest.HitTest(point,
tol,
esriGeometryHitPartType.esriGeometryPartVertex,
pHitPoint,
ref
hitDist,
partIndex,
vertexIndex,
vertex);
vertexSnaped
contained
(bHit)
m_MapControl.MousePointer
esriControlsMousePointer.esriPointerCrosshair;
else
IRelationalOperator
pRelOperator=null;
IPolygon
polygon
(snapContainer.GeometryType)
buffer=pTopo.Buffer(3);
IPolygon;
pRelOperator=polygon
IRelationalOperator;
pTopo.Buffer(3);
pRelOperator
default:
(pRelOperator
(pRelOperator.Contains(point))
esriControlsMousePointer.esriPointerSizeAll;
esriControlsMousePointer.esriPointerArrow;
这里就是根据鼠标悬停的位置,来改变鼠标样式,抱歉的很,我没有从AE里面找到和ArcMap一样的鼠标样式,只要用一些简单的替代了,当然你可以自己定义,也可以打电话、发Email质问ESRI客服,如果你知道了,一定要告诉我,否则我诅咒你找不到女朋友!
这个函数里面,我需要判断,鼠标是悬停在要素的节点上,还是悬停在要素内部了,这个对于后面处理是拽节点还是移动要素有很大的帮助。
这个根据鼠标悬停位置改变鼠标样式,还远远不够滴,当你悬停到绿色节点上时,按下鼠标时,就意味这拖拽开始,当鼠标左键按下并移动时,要出现像橡皮筋一样的连接线,当左键弹起时,就意味着拖拽结束,如果再按下左键,就意味着要素的编辑结束。
这个怎么做到呢,请看下面的代码:
EditFeature(int
geometry)
GetFeatureOnMouseDown(x,
SelectOnMouseDown();
if(m_SelectedFeature.Count<
1)return
(geometry
return
pHitPoint=null;
0,
vertexOffset
numVertices
vertex=false;
editedFeature
m_SelectedFeature[0];
//IGeometry
pGeo
editedFeature.Shape;
//m_EditingFeature
editedFeature;
(geometry.GeometryType)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ArcMap Editor 工具 实现 要素 拖动