资源描述
ArcMap扩展开发方法与步骤
吕志勇 2011-5-25
ArcMap扩展开发是指在直接通过编写插件,扩展ArcMap.exe的功能。下面以VS为例,说明如何进行ToolBar,Command,Tool,Menu的开发与扩展:
ToolBar
一、 新建项目,选择Class Library(ArcMap)(必须先安装desktop才可以出现此选择项:
二、 在建立的工程项目中的“资源管理器“中的项目上进行右键单击,选择”添加类“,如图所示:
三、 在添加的类中:选择“添加Base ToolBr“,并更改自己的类名
四、 选择ToolBar要添加在哪里:选择Desktop arcmap
五、 点“OK“之后,便会自己动产生台下代码:
详细代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.SystemUI;
namespace TestPlugToolBar
{
/// <summary>
/// Summary description for ArcGISToolbar1.
/// </summary>
[Guid("43e374c8-9468-48b2-9a72-bcbf0a3097d9")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("TestPlugToolBar.ArcGISToolbar1")]
public sealed class ArcGISToolbar1 : BaseToolbar
{
#region COM Registration Function(s)
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(Type registerType)
{
// Required for ArcGIS Component Category Registrar support
ArcGISCategoryRegistration(registerType);
//
// TODO: Add any COM registration code here
//
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(Type registerType)
{
// Required for ArcGIS Component Category Registrar support
ArcGISCategoryUnregistration(registerType);
//
// TODO: Add any COM unregistration code here
//
}
#region ArcGIS Component Category Registrar generated code
/// <summary>
/// Required method for ArcGIS Component Category registration -
/// Do not modify the contents of this method with the code editor.
/// </summary>
private static void ArcGISCategoryRegistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
MxCommandBars.Register(regKey);
}
/// <summary>
/// Required method for ArcGIS Component Category unregistration -
/// Do not modify the contents of this method with the code editor.
/// </summary>
private static void ArcGISCategoryUnregistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
MxCommandBars.Unregister(regKey);
}
#endregion
#endregion
public ArcGISToolbar1()
{
//
// TODO: Define your toolbar here by adding items
//
//AddItem("esriArcMapUI.ZoomInTool");
//BeginGroup(); //Separator
//AddItem("{FBF8C3FB-0480-11D2-8D21-080009EE4E51}", 1); //undo command
//AddItem(new Guid("FBF8C3FB-0480-11D2-8D21-080009EE4E51"), 2); //redo command
}
public override string Caption
{
get
{
//TODO: Replace bar caption
return "My C# Toolbar";
}
}
public override string Name
{
get
{
//TODO: Replace bar ID
return "ArcGISToolbar1";
}
}
以上代码的主要功能:对建立的ToolBar进行注册,对ToolBar的属性如:名称,名字属性设置。
Ø 运行程序,会在相应的debug/Release下产生一个:DLL文件。并且会自动启动arcmap.exe。(如果不用代码对产生的插件DLL进行注册,也可以手动注册,具体注册方法如下:
Ø 该阶段开发人员常常需要将组件编译成发布版,并将“dll”复制到其他机器上进行各种测试。
为满足这样的需求,开发人员可以在测试机器上使用“regasm.exe ”通过.Net 的“dll”
文件生成一个同名的“tlb ”类型库文件,这种“tlb ”文件就可以像COM 的“dll”一样加ArcGIS 使用。这样操作的前提条件是这台测试机器上至少安装有.Net Framework、ArcGIS Desktop 以及相应的补丁包。
具体的操作分为如下两步:
1、在“运行”中敲入“cmd”进入命令行
2、 转 到 “ regasm.exe” 文 件 所 在 目 录 下
(“C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322”)敲入“regasm PATH\*.dll /tlb: *tlb”,
例如“regasm D:\Program Files\ArcGIS\EditTools.dll /tlb:EditTools.tlb”。这样,系统会在与“dll”
相同的目录下生成一个“tlb ”文件并已自动注册。该操作正确执行结果就象COM 的“dll”
文件注册后一样,你可以在ArcGIS 相应的工具扩展中找到该工具了,如果未找到,也可以
通过“Add From File…”方法添加生成的“tlb ”文件添加该组件。
说明:
1、这种注册方法虽不需要“组件调试阶段”代码中的那些[ComRegisterFunction()]函数
也能顺利执行,但强烈建议保留这些函数,如果没有这些函数将导致“系统部署阶段”注册
失败。
2、建议开发人员将“C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322”路径加入系
统环境的“Path”中,这样就可以直接敲入“regasm”命令,而不用每次注册组件的时候都
要手动进入“regasm”路径下
3、敲入“regasm”和空格后,可以直接将有待注册的“dll”文件拖动到命令行窗口,
系统会自动加入命令行,而不用用户亲自敲入“dll”文件的路径和文件名
4、可通过“regasm –u PATH\*.dll /tlb: *tlb ”命令来注销该组件
5、建议不要在不同地方注册包含相同类的“dll”,否则很可能会产生类似于COM 的
“Dll Hell”的情况,导致ArcGIS 识别和使用的组件很可能不是用户所期望的组件,造成不 必要的麻烦。
六、 注册成功后,打开arcMap,工具栏出单击,就会显示出刚才所产生的toolbar:如图所示,对其进行勾选,工具栏就会显示在上面。
七、 到目前为止,一个名称(Caption)为“要素融合工具“的工具栏建立成功。下面就是如何开发Command,并添加到这个空栏中了!!
Command
Command与Tool的主要区别在于:Command可以产生人机交互,而tool才不能产生人机交互,因此:放大(zoomIn)则称为Tool,而若放大时放输入参,放大多少倍,刚是一个Command..产生Command前面建立工程的方法一样,只是在“添加类“时略有不同:
添加类时,选择“baseCommand“,如图所示:
并下一步,选择“Desktop ArcMap Command“:
确定之后,会自动产生如下代码:
以上代码主要功能为:注册DLL插件与设置此Command的Category分类归属,名称,标题,onClick事件所对应的操作等等;
public MyCommand()//构造函数
{
//
// TODO: Define values for the public properties
//
base.m_category = "MyCommands"; //分类
base.m_caption = "放大"; //对外显示的名字。
base.m_message = "对地图进行放大"; //消息
base.m_toolTip = "放大"; //提示
base.m_name = " MyCommands _ZoomIn"; //unique id, non-localizable (e.g. "MyCategory_ArcMapCommand")
try
{
//
// TODO: change bitmap name if necessary
//
string bitmapResourceName = GetType().Name + ".bmp";
base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
}
运行代码后,在工具栏处,右键选择customize,找到自己命名的“cagetory“名称,会显示自己在该归类下创建的命令。将其拖放到”我的工具条”上面,即完成命令添加到相应的工具条上面。
在自定义的工具条上的相应Command右键单击,可以对该命令进行相应的设置:
注意:插件的注册与反注册。
RegAsm TestPlugToolBar.dll /u
Pause
RegAsm TestPlugToolBar.dll /codebase
pause
展开阅读全文