我有一个使用ESRI AddIn按钮(ArcGIS 10.2和Windows 7)启动的窗体。在我的表格上,我有一个按钮从地图中选择一个点。我在项目中添加了一个ESRI BaseTool类,它有一个OnMouseDown事件。
问题是我无法运行工具。请注意,该工具不在ArcGIS命令栏上(如按钮所示),但查找(uid)过程仍可找到该工具。
当工具添加到项目中时(使用ArcGIS Add BaseTool进程),它不会更新.esriaddinx文件。我必须手动完成。
我的Addin文件是:
<AddIn language="CLR4.0" library="HVLR_Processing.dll" namespace="HVLR_Processing">
<ArcMap>
<Commands>
<Button id="RMS_HVLR_Processing_clsHVLR_Processing" class="clsHVLR_Processing" ...
<Tool id="HVLR_PickTool" class="clsMapPick" category="Add-In Controls" caption="" message="" tip="" image="" />
</Commands>
</ArcMap>
clsMapClick代码包含OnMouseDown事件。
为了开始这个过程,我尝试了很多方法。我可以检索工具但是当我执行它(或将它分配给CurrentTool)时没有任何反应。
UID pUID;
ICommandItem pCmdItem;
ICommand pCmd;
clsMapPick pPick;
ITool pTool;
try
{
this.WindowState = FormWindowState.Minimized;
m_pApp.CurrentTool = null;
pUID = new UIDClass();
pUID.Value = "HVLR_PickTool";
pCmdItem = m_pApp.Document.CommandBars.Find(pUID, false, false);
if (pCmdItem != null)
{
m_pApp.CurrentTool = pCmdItem; // Nothing happens
m_pApp.CurrentTool.Execute(); // Nothing happens
m_pApp.CurrentTool.Refresh();
}
}
catch (Exception ex)
有谁能告诉我如何让这个工具执行?
答案 0 :(得分:0)
行。大东西。您无法将BaseTool添加到ESRI AddIn;它是一个COM对象。必须做的是:
创建一个新的ESRI工具类。
在类中添加一个布尔变量,以指示mousedown事件已被触发。
在OnUpdate方法中,将一些代码继续,直到mousedown事件被触发为止。
通过开始输入protected void On ...来创建一个OnMouseDown事件处理程序,而itellisense将允许您选择要跟踪的事件。
将您想要运行的代码放在OnMouseDown事件处理程序中,并将布尔值设置为true。
代码:
public class clsMapPick : ESRI.ArcGIS.Desktop.AddIns.Tool
{
private bool m_bIsFinished = false;
private int m_iXPixel = -1;
private int m_iYPixel = -1;
//private string m_sError = "";
//private bool m_bSuccess = true;
public clsMapPick()
{
}
protected override void OnActivate()
{
base.OnActivate();
return;
}
protected override void OnUpdate()
{
if (m_bIsFinished)
{
m_bIsFinished = false;
frmHVLR.m_dX = m_iXPixel;
frmHVLR.m_dX = m_iYPixel;
}
}
protected override void OnMouseDown(MouseEventArgs arg)
{
base.OnMouseDown(arg);
m_iXPixel = arg.X;
m_iYPixel = arg.Y;
m_bIsFinished = true;
}
}
在触发点击地图按钮的表单中:
string sError = "";
dPickedX = 0;
dPickedY = 0;
UID pUID;
ICommandItem pCmdItem;
ICommandBars pCmdBars;
ICommand pCmd;
ITool pTool;
try
{
this.WindowState = FormWindowState.Minimized;
pCmdBars = m_pApp.Document.CommandBars;
pUID = new UIDClass();
pUID.Value = HVLR_Processing.ThisAddIn.IDs.clsMapPick;
pCmdItem = pCmdBars.Find(pUID);
if (pCmdItem != null)
{
m_pApp.CurrentTool = pCmdItem;
//pCmdItem.Execute();
dPickedX = m_pMxDoc.CurrentLocation.X;
dPickedY = m_pMxDoc.CurrentLocation.Y;
}
return sError;
}
现在这对我来说很好,正在调用Tool类但是没有触发OnMouseDown事件。
如果你知道我为什么欣赏它。