在AE中,更新Mxd文档的比例尺,比较特殊。写代码以记录,更新比例尺代码如图所示:
[DllImport("User32.dll")] public static extern int GetDesktopWindow(); /// <summary> /// 更新比例尺 /// </summary> /// <param name="pNewMxdFile"></param> private void UpdataScale(string pNewMxdFile) { IMapDocument tMapDocument2 = new MapDocumentClass(); tMapDocument2.Open(pNewMxdFile); IPageLayout pageLayout = tMapDocument2.PageLayout; IActiveView activeView2 = (IActiveView)pageLayout; IMap map = activeView2.FocusMap; activeView2.Activate(GetDesktopWindow()); map.MapScale = _MapScale; activeView2.Refresh(); tMapDocument2.Save(true, false); tMapDocument2.Close(); }
注意事项:在这个方法中,好像只能用于更新比例尺的操作。除此之外,如果做其他操作,就会造成莫名奇妙的错误。例如:先让Map缩放到一个特性的Envelope中后,再更新一个比例尺,就有问题。Mxd打开图后,就看不见数据了。相当奇怪,不知道其他的操作会造成什么影响。主要怀疑是函数GetDesktopWindow在作怪。
所以一般把修改比例尺放到一个单独的函数中。如果Mxd中有多个Map,都要更新比例尺,则代码如下所示:
private void UpdataScale(string pNewMxdFile) { IMapDocument mapDocument = new MapDocumentClass(); mapDocument.Open(pNewMxdFile); IPageLayout pageLayout = mapDocument.PageLayout; IActiveView activeView = (IActiveView)pageLayout; IMap map = activeView.FocusMap; activeView = (IActiveView)mapDocument.PageLayout; activeView.Activate(GetDesktopWindow()); map.MapScale = _MapScale; activeView.Refresh(); pageLayout.FocusNextMapFrame(); pageLayout = mapDocument.PageLayout; activeView = (IActiveView)pageLayout; map = activeView.FocusMap; activeView = (IActiveView)mapDocument.PageLayout; activeView.Activate(GetDesktopWindow()); map.MapScale = _MapScale; activeView.Refresh(); mapDocument.Save(true, true); }
更新Mxd的范围代码如下:
/// <summary> /// 更新缩放范围 /// </summary> /// <param name="pNewMxdFile"></param> private void UpdataExtend(string pNewMxdFile,IEnvelope pEnvelope) { IMapDocument tMapDocument2 = new MapDocumentClass(); tMapDocument2.Open(pNewMxdFile); IPageLayout pageLayout = tMapDocument2.PageLayout; IActiveView activeView2 = (IActiveView)pageLayout; IEnvelope pEnv = activeView2.Extent; pEnv = pEnvelope; //pEnv.CenterAt(point) //指向中心点 activeView2.Extent = pEnv; activeView2.Refresh(); tMapDocument2.Save(true, false); tMapDocument2.Close(); }