Перейти к точке

0 голосов
спросил 13 Июль, 12 от Flash-Samara (840 баллов) в категории Программные продукты Esri
Добрый день! В ArcGIS есть инструмент "Перейти к точке XY"
С помощью какого интерфейса можно сделать нечто похожее, особенно интересует как "перейти к" и "подсветить".
Самому вот что удалось:

Dim pActiveViewe As IActiveView
Set pActiveViewe = pMxDocument.ActiveView

Dim pScreenDisplayZoom As IScreenDisplayZoom
Set pScreenDisplayZoom = pActiveViewe.ScreenDisplay
pScreenDisplayZoom.ZoomMoveTo pPoint

pActiveViewe.Refresh


Только почему то ничего не происходит при выполнении этого кода, но и ошибок не выдает!

10 Ответы

0 голосов
ответил 16 Июль, 12 от Flash-Samara (840 баллов)
Как приблизить к точке сам догнал:

Dim pMxDocument As IMxDocument
Set pMxDocument = ThisDocument

Dim pActiveViewe As IActiveView
Set pActiveViewe = pMxDocument.ActiveView

Dim pEnvelope As IEnvelope
Set pEnvelope = pActiveViewe.Extent

pEnvelope.CenterAt pPoint
pActiveViewe.Extent = pEnvelope
pActiveViewe.Refresh

А вот как сделать чтобы еще и подсветилась точка, как в инструменте "Перейти к точке XY"???
0 голосов
ответил 20 Июль, 12 от Flash-Samara (840 баллов)
Удалось сделать что то вроде подсветки путем создания Маркера через IScreenDisplay:

Dim pMxDocument As IMxDocument
Set pMxDocument = ThisDocument
Dim pActiveViewe As IActiveView
Set pActiveViewe = pMxDocument.ActiveView
Dim pEnvelope As IEnvelope
Set pEnvelope = pActiveViewe.Extent
pEnvelope.CenterAt pPoint
pActiveViewe.Extent = pEnvelope
pActiveViewe.Refresh
Dim pScreenDisplay As IScreenDisplay
Set pScreenDisplay = pActiveViewe.ScreenDisplay
pScreenDisplay.StartDrawing pScreenDisplay.hDC, esriNoScreenCache
pScreenDisplay.SetSymbol New SimpleMarkerSymbol
pScreenDisplay.DrawPoint pPoint
pScreenDisplay.FinishDrawing


Маркер появляется и сразу исчезает, что не логично, по крайней мере для меня, ведь Refresh стоит раньше прорисовки маркера, если же вынести на отдельную кнопку создание маркера, тогда все норм прорисовывает и не исчезает... В принципе меня пока это устраивает, но может кто нить мне сможет прояснить почему исчезает маркер при выполнении этого кода? И как все таки осуществить подсветку точки как в инструменте "Перейти к точке XY"???
0 голосов
ответил 20 Июль, 12 от TDenis (42,620 баллов)
0 голосов
ответил 23 Июль, 12 от Flash-Samara (840 баллов)
Спасибо за подсказку, однако написал ниже представленный код, а он еще и параллельно точку создает в слое, и я понимаю почему он ее создает, но что то до меня никак не дойдет как убрать эту не нужную функцию правильно, я чот как уберу, у меня работать перестает или вообще какие то непонятные ошибки выдает...

Dim pMxDocument As IMxDocument
Set pMxDocument = ThisDocument

Dim pActiveViewe As IActiveView
Set pActiveViewe = pMxDocument.ActiveView

Dim pEnvelope As IEnvelope
Set pEnvelope = pActiveViewe.Extent
pEnvelope.CenterAt pPoint

pActiveViewe.Extent = pEnvelope
pActiveViewe.Refresh
pActiveViewe.ScreenDisplay.UpdateWindow

Dim pScreenDisplay As IScreenDisplay
Set pScreenDisplay = pActiveViewe.ScreenDisplay

Dim pMap As IMap
Set pMap = pMxDocument.FocusMap

Dim pFeatureLayer As IFeatureLayer
Set pFeatureLayer = pMap.Layer(2)

Dim pFeatureclass As IFeatureClass
Set pFeatureclass = pFeatureLayer.FeatureClass
Dim pFeature As IFeature
Set pFeature = pFeatureclass.CreateFeature
Set pFeature.Shape = pPoint
Dim pFeatureIdentifyObj As IFeatureIdentifyObj
Set pFeatureIdentifyObj = New FeatureIdentifyObject
pFeatureIdentifyObj.Feature = pFeature

Dim pIdentifyObj As IIdentifyObj
Set pIdentifyObj = pFeatureIdentifyObj

pIdentifyObj.Flash pScreenDisplay

0 голосов
ответил 23 Июль, 12 от TDenis (42,620 баллов)
Если закоментировать всё после UpdateWindow - не работает?
0 голосов
ответил 24 Июль, 12 от Flash-Samara (840 баллов)
Работает, но нет этого эффекта подсветки точки, а просто экран перемещается в место с координатами pPoint, я так понимаю эффект подсветки создается вот этой строкой:
pIdentifyObj.Flash pScreenDisplay
Мне не удается передать в pFeature точку pPoint не создав ее в слое...
0 голосов
ответил 24 Июль, 12 от Flash-Samara (840 баллов)
Спасибо TDenis что откликнулся, не без его помощи все таки получилось то что хотел:
Dim pMxDocument As IMxDocument
Set pMxDocument = ThisDocument

Dim pActiveViewe As IActiveView
Set pActiveViewe = pMxDocument.ActiveView

Dim pEnvelope As IEnvelope
Set pEnvelope = pActiveViewe.Extent
pEnvelope.CenterAt pPoint

pActiveViewe.Extent = pEnvelope
pActiveViewe.Refresh
pActiveViewe.ScreenDisplay.UpdateWindow

Dim pMap As IMap
Set pMap = pMxDocument.FocusMap
Dim pIdentify As IIdentify
Set pIdentify = pMap.Layer(2)

Dim pArray As IArray
Set pArray = pIdentify.Identify(pPoint)

Dim pScreenDisplay As IScreenDisplay
Set pScreenDisplay = pActiveViewe.ScreenDisplay

Dim pFeatureIdentifyObj As IFeatureIdentifyObj
Set pFeatureIdentifyObj = pArray.Element(0)

Dim pIdentifyObj As IIdentifyObj
Set pIdentifyObj = pFeatureIdentifyObj

pIdentifyObj.Flash pScreenDisplay


И точка мигает и в слой объект не добавляется, как это было раньше, в общем то что надо)
0 голосов
ответил 25 Июль, 12 от Flash-Samara (840 баллов)
Сорри, чот не то сделал, оно работает если только точка есть в указанном слое, но не работает если нет, т. е. iIdentify ищет в слое Layer(2) точку с указанными координатами и если она есть то мигает, а если нет выдает ошибку, тоже интересно и в будущем может пригодиться, а пока вопрос опять открыт...

0 голосов
ответил 25 Июль, 12 от TDenis (42,620 баллов)
Что ж столько времени мучаетесь-то.

http://help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/index.html#//004900000075000000

    public class PanToPoint : ESRI.ArcGIS.Desktop.AddIns.Button

    {
        protected override void OnClick()
        {
            var pPoint = new PointClass { X = 0, Y = 0 };
            var pActiveView = ArcMap.Document.ActiveView;

            PanToPoint(pActiveView, pPoint);

            RefreshScreen(pActiveView);

            var color = new RgbColorClass { Red = 255, Green = 0, Blue = 0 };
            var delayInMilliseconds = 500;
            FlashGeometry(pPoint, color, pActiveView.ScreenDisplay, delayInMilliseconds);
        }


        private void RefreshScreen(IActiveView pActiveView)
        {
            pActiveView.Refresh();
            pActiveView.ScreenDisplay.UpdateWindow();
        }

        private void PanToPoint(IActiveView pActiveView, PointClass pPoint)
        {
            var pExtent = pActiveView.Extent;
            pExtent.CenterAt(pPoint);
            pActiveView.Extent = pExtent;
        }

        ///<summary>Flash geometry on the display. The geometry type could be polygon, polyline, point, or multipoint.</summary>
        public void FlashGeometry(IGeometry geometry, IRgbColor color, IDisplay display, Int32 delay)
        {
            if (geometry == null || color == null || display == null)
            {
               return;
            }

            display.StartDrawing(display.hDC, (System.Int16)ESRI.ArcGIS.Display.esriScreenCache.esriNoScreenCache); // Explicit Cast

            switch (geometry.GeometryType)
            {
               case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon:
                    {
                        //Set the flash geometry's symbol.
                        ESRI.ArcGIS.Display.ISimpleFillSymbol simpleFillSymbol = new ESRI.ArcGIS.Display.SimpleFillSymbolClass();
                        simpleFillSymbol.Color = color;
                        ESRI.ArcGIS.Display.ISymbol symbol = simpleFillSymbol as ESRI.ArcGIS.Display.ISymbol; // Dynamic Cast
                        symbol.ROP2 = ESRI.ArcGIS.Display.esriRasterOpCode.esriROPNotXOrPen;

                        //Flash the input polygon geometry.
                        display.SetSymbol(symbol);
                        display.DrawPolygon(geometry);
                        System.Threading.Thread.Sleep(delay);
                        display.DrawPolygon(geometry);
                        break;
                    }

               case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline:
                    {
                        //Set the flash geometry's symbol.
                        ESRI.ArcGIS.Display.ISimpleLineSymbol simpleLineSymbol = new ESRI.ArcGIS.Display.SimpleLineSymbolClass();
                        simpleLineSymbol.Width = 4;
                        simpleLineSymbol.Color = color;
                        ESRI.ArcGIS.Display.ISymbol symbol = simpleLineSymbol as ESRI.ArcGIS.Display.ISymbol; // Dynamic Cast
                        symbol.ROP2 = ESRI.ArcGIS.Display.esriRasterOpCode.esriROPNotXOrPen;

                        //Flash the input polyline geometry.
                    &nbs
0 голосов
ответил 26 Июль, 12 от Flash-Samara (840 баллов)
ООО да, спасибо, перевел!!! Главное сначала перевел, а потом нашел его здесь:
http://support.esri.com/en/knowledgebase/techarticles/detail/20500
Вот код какой получился у меня:

Dim pScreenDisplay As IScreenDisplay
Set pScreenDisplay = pActiveViewe.ScreenDisplay
pScreenDisplay.StartDrawing pScreenDisplay.hDC, esriNoScreenCache
Dim pSimpleMarkerSymbol As ISimpleMarkerSymbol
Set pSimpleMarkerSymbol = New SimpleMarkerSymbol
pSimpleMarkerSymbol.Style = esriSMSCircle
Dim pColor As IRgbColor
Set pColor = New RgbColor
pColor.Blue = 0
pColor.Green = 0
pColor.Red = 255
pSimpleMarkerSymbol.Color = pColor
pSimpleMarkerSymbol.size = 8
Dim pSymbol As ISymbol
Set pSymbol = pSimpleMarkerSymbol
pSymbol.ROP2 = esriROPNotXOrPen
pScreenDisplay.SetSymbol pSymbol
pScreenDisplay.DrawPoint pPoint
Sleep 500
pScreenDisplay.DrawPoint pPoint
pScreenDisplay.FinishDrawing


И чтобы Sleep работал в заголовке надо строку добавить:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

...