2017-03-16 51 views
0

我有一个使用ESRI AddIn按钮(ArcGIS 10.2和Windows 7)启动的窗体窗体。在我的表单中,我有一个按钮来从地图中选择一个点。我已经为项目添加了一个ESRI BaseTool类,该项目有一个OnMouseDown事件。在ArcGIS中从Windows窗体执行拾取点

问题是我无法使工具运行。请注意,该工具不在ArcGIS命令栏上(如按钮),但该工具仍由Find(uid)进程找到。

将工具添加到项目中时(使用ArcGIS Add BaseTool进程),它没有更新.esriaddinx文件。我必须手动执行此操作。

我的加载项文件是:

<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

好的。大东西。您不能将BaseTool添加到ESRI AddIn;这是一个COM对象。需要做的是:

  1. 创建一个新的ESRI Tool类。

  2. 向类中添加一个布尔变量以指示mousedown事件已经触发。

  3. 在OnUpdate方法中,将一些代码继续,直到mousedown事件触发。

  4. 通过开始键入protected void On ...和itellisense将允许您选择要跟踪的事件来创建OnMouseDown事件处理程序。

  5. 将要运行的代码放入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; 
     } 

这是对我工作的罚款,现在,该工具类是被调用,但OnMouseDown事件没有被触发。

如果你知道为什么我会很感激。