YouTube | Facebook | X(Twitter) | RSS

MovePointFeedback・MoveLineFeedback・MovePolygonFeedback の利用

2016/9/1 (木)

//http://resources.esri.com/help/9.3/arcgisengine/arcobjects/esriDisplay/Moving_Feedback_Example.htm
//アドイン例
 
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
 
namespace ArcMapAddin1
{
    public class Tool1 : ESRI.ArcGIS.Desktop.AddIns.Tool
    {
        private IMxDocument m_mxDoc;
        private IActiveView m_activeView;
        private IScreenDisplay m_screenDisp;
        private IDisplayFeedback m_dispFeed;
        private IElement m_hitElem;
        private IGraphicsContainer m_graphicsCont;
 
 
        public Tool1()
        {
        }
 
        protected override void OnUpdate()
        {
            Enabled = ArcMap.Application != null;
        }
 
        protected override void  OnActivate()
        {
          m_mxDoc = (IMxDocument)ArcMap.Application.Document;
          m_activeView = m_mxDoc.ActiveView;
          m_screenDisp = m_activeView.ScreenDisplay;
        }
 
        protected override void  OnMouseDown(MouseEventArgs arg)
        {
            base.OnMouseDown(arg);
 
            IPoint point = null;
            IGeometry geomElem = null;
 
            // Get the current mouse location in Map Units
            point = m_screenDisp.DisplayTransformation.ToMapPoint(arg.X, arg.Y);
            // Use a function to return the first element at this point (if any)
            m_hitElem = GetHitElement(point);
 
            // If an element was returned then check what type of geometry it has (Point, Polyline, Envelope or Polygon)
            if (m_hitElem != null)
            {
                geomElem = m_hitElem.Geometry;
                //Point geometry
                if (geomElem is IPoint)
                {
                    // Create a MovePointFeedback object and set its display property (to the ActiveView's ScreenDisplay)
                    m_dispFeed = new MovePointFeedback();
                    m_dispFeed.Display = m_screenDisp;
                    // QI for the IMovePointFeedback interface
                    IMovePointFeedback mvPtFeed = (IMovePointFeedback)m_dispFeed;
                    //Start the feedback using the input (Point) geometry at the current mouse location
                    mvPtFeed.Start((IPoint)geomElem, point);
 
                    // Polyline geometry
                }
                else if (geomElem is ESRI.ArcGIS.Geometry.IPolyline)
                {
                    // Create a MoveLineFeedback object and set its display property (to the ActiveView's ScreenDisplay)
                    m_dispFeed = new MoveLineFeedback();
                    m_dispFeed.Display = m_screenDisp;
                    // QI for the IMoveLineFeedback interface
                    IMoveLineFeedback mvLnFeed = (IMoveLineFeedback)m_dispFeed;
                    //Start the feedback using the input (Polyline) geometry at the current mouse location
                    mvLnFeed.Start((IPolyline)geomElem, point);
 
                    // Rectangle (Envelope) geometry
                }
                else if (geomElem is IEnvelope)
                {
                    // Create a MoveEnvelopeFeedback object and set its display property (to the ActiveView's ScreenDisplay)
                    m_dispFeed = new MoveEnvelopeFeedback();
                    m_dispFeed.Display = m_screenDisp;
                    // QI for the IMoveEnvelopeFeedback interface
                    IMoveEnvelopeFeedback mvEnvFeed = (IMoveEnvelopeFeedback)m_dispFeed;
                    //Start the feedback using the input (Rectangle) geometry at the current mouse location
                    mvEnvFeed.Start((IEnvelope)geomElem, point);
 
                    // Polygon geometry
                }
                else if (geomElem is IPolygon)
                {
                    // Create a MovePolygonFeedback object and set its display property (to the ActiveView's ScreenDisplay)
                    m_dispFeed = new MovePolygonFeedback();
                    m_dispFeed.Display = m_screenDisp;
                    // QI for the IMovePolygonFeedback interface
                    IMovePolygonFeedback mvPolyFeed = (IMovePolygonFeedback)m_dispFeed;
                    //Start the feedback using the input (Polygon) geometry at the current mouse location
                    mvPolyFeed.Start((IPolygon)geomElem, point);
                }
            }
 
            }
 
            protected override void  OnMouseUp(MouseEventArgs arg)
            {
              IGeometry geomResult = null;
              IGeometry geomElem = null;
 
              // Check that the user is using the feedback
              if (m_hitElem != null)
              {
               // Get the geometry type for our element again
               geomElem = m_hitElem.Geometry;
 
               // Check what type of geometry the element has  (again)
               // Point geometry
               if (geomElem is IPoint)
               {
                // QI for the IMovePointFeedback interface and get the finished geometry
                IMovePointFeedback mvPtFeed = (IMovePointFeedback)m_dispFeed;
                geomResult = mvPtFeed.Stop();
               }
               else if (geomElem is IPolyline)
               {
                // QI for the IMoveLineFeedback interface and get the finished geometry
                IMoveLineFeedback mvLnFeed = (IMoveLineFeedback)m_dispFeed;
                geomResult = mvLnFeed.Stop();
               }
               else if (geomElem is IEnvelope)
               {
                // QI for the IMoveEnvelopeFeedback interface and get the finished geometry
                IMoveEnvelopeFeedback mvEnvFeed = (IMoveEnvelopeFeedback)m_dispFeed;
                geomResult = mvEnvFeed.Stop();
               }
               else if (geomElem is IPolygon)
               {
                // QI for the IMovePolygonFeedback interface and get the finished geometry
                IMovePolygonFeedback mvPolyFeed = (IMovePolygonFeedback)m_dispFeed;
                geomResult = mvPolyFeed.Stop();
               }
 
               // Set the geometry of the element and call update
               m_hitElem.Geometry = geomResult;
               m_graphicsCont.UpdateElement(m_hitElem);
 
               // Clear out the objects
               m_dispFeed = null;
               m_hitElem = null;
 
               // Refresh the ActiveView
               m_activeView.Refresh();
              }
            }
 
            protected override void  OnRefresh(int hDC)
            {
                base.OnRefresh(hDC);
 
                m_mxDoc = (IMxDocument)ArcMap.Application.Document;
                m_activeView = m_mxDoc.ActiveView;
                m_screenDisp = m_activeView.ScreenDisplay;
            }
 
        protected override void  OnMouseMove(MouseEventArgs arg)
        {
            if (m_dispFeed != null)
            {
 
            IPoint point = null;
            // Get the current mouse location in Map Units and move the feedback
            point = m_screenDisp.DisplayTransformation.ToMapPoint(arg.X, arg.Y);
            m_dispFeed.MoveTo(point);
            }
        }
 
 
        private IElement GetHitElement(IPoint pInPt)
        {
            // Takes an IPoint and returns the first element that is hit (if any) in the ActiveView's BasicGraphicsLayer
            IEnumElement enumElem = null;
            double dblSrchDis = 0;
 
            // QI for the IGraphicsContainer interface from the IActiveView, allows access to the BasicGraphicsLayer
            m_graphicsCont = (IGraphicsContainer)m_activeView;
 
            // Calculate the Search Distance (in MapUnits) based upon a portion of the ActiveView's width
            dblSrchDis = m_activeView.Extent.Width / 200;
 
            // Return an enumerator for those elements found within the search distance (in mapunits)
            enumElem = m_graphicsCont.LocateElements(pInPt, dblSrchDis);
 
            // If the enumerator is not empty then return the FIRST element found
            if (enumElem != null)
            {
            return enumElem.Next();
            }
            else
            {
                return  null;
            }
         
        }
 
    }
 
}
  • この記事を書いた人

羽田 康祐

伊達と酔狂のGISエンジニア。GIS上級技術者、Esri認定インストラクター、CompTIA CTT+ Classroom Trainer、潜水士、PADIダイブマスター、四アマ。WordPress は 2.1 からのユーザーで歴だけは長い。 代表著書『"地図リテラシー入門―地図の正しい読み方・描き方がわかる』 GIS を使った自己紹介はこちら。ESRIジャパン(株)所属、元青山学院大学非常勤講師を兼務。日本地図学会第31期常任委員。発言は個人の見解です。

-プログラミング, ArcGIS
-,