在ArcGIS中从Windows窗体执行拾取点

时间:2017-03-16 01:04:00

标签: arcobjects

我有一个使用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)

有谁能告诉我如何让这个工具执行?

1 个答案:

答案 0 :(得分:0)

行。大东西。您无法将BaseTool添加到ESRI AddIn;它是一个COM对象。必须做的是:

  1. 创建一个新的ESRI工具类。

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

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

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

  5. 将您想要运行的代码放在OnMouseDown事件处理程序中,并将布尔值设置为true。

  6. 代码:

    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事件。

    如果你知道我为什么欣赏它。