//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; } } } }
MovePointFeedback・MoveLineFeedback・MovePolygonFeedback の利用
2016/9/1 (木)