значения из таблицы

0 голосов
спросил 06 Июнь, 07 от WonkaK (320 баллов) в категории Программные продукты Esri
Здравствуйте. Задача состоит в следующем. На карте расположены некоторые точки. После их выделения, запускается нижеприведенный скрипт, нужно получить информацию из полей в таблице учитывая только выделенные записи.

Проблема состоит в том, что скрипт вместо значений соответсвующих полей возвращает пустое значение, т.е. пустую строку (значение подсвечено красным цветом).
Не смотря на это, индекс нужного поля определяется правильно.

Dim g_Map As Map
Dim mxDoc As IMxDocument
Dim index As Long
Dim activeView As IActiveView
Dim featureEnum As IEnumFeature
Dim feat As IFeature

    Set mxDoc = Application.Document
    Set g_Map = mxDoc.FocusMap
    Set activeView = g_Map
    
    Set featureEnum = activeView.Selection
    If featureEnum Is Nothing Then Exit Sub
    featureEnum.Reset 'ñáðîñ êóðñîðà
    Set feat = featureEnum.Next
    
    Do While Not feat Is Nothing
        index = feat.Fields.FindField("НАЗВАНИЕ ПОЛЯ")
        If index <> -1 Then
            MsgBox "index = '" & index & "' Value = '" & feat.Value(index) & "'"
        End If
        Set feat = featureEnum.Next
    Loop
    

12 Ответы

0 голосов
ответил 06 Июнь, 07 от Tatkis (2,420 баллов)
А если вручную выводить feat.Value(2) - например, то выдает правильное значение?
Значения начинаются с 0 (на всякий случай)
0 голосов
ответил 07 Июнь, 07 от sschainik (4,900 баллов)
была у меня такая проблема, когда выделено много объектов, то при обращении к полям получал нулевые значения хотя данные там были, точно не помню но кажется написал вот такую функцию возвращающую объекты по слою выделенные на карте
Public Function funGetSelectedFeatureCursorOfFeatureLayer(pIMap As IMap, pIFeatureLayer As IFeatureLayer) As IFeatureCursor
    If pIFeatureLayer Is Nothing Then
        Exit Function
    End If
    Dim pFeatureSelection As IFeatureSelection
    Dim pSelectionSet As ISelectionSet
    Set pFeatureSelection = pIFeatureLayer 'QI
    Set pSelectionSet = pFeatureSelection.SelectionSet
    pSelectionSet.Search Nothing, False, funGetSelectedFeatureCursorOfFeatureLayer
End Function
0 голосов
ответил 07 Июнь, 07 от sschainik (4,900 баллов)
точно! эта функция возвращает объеты из выделенных принадлежащие нужному слою
у меня там в коде лишнее уберите, машинально запихал
0 голосов
ответил 07 Июнь, 07 от WonkaK (320 баллов)
А если вручную выводить feat.Value(2) - например, то выдает правильное значение?
Значения начинаются с 0 (на всякий случай)

    Пробовал, все равно возвращает пустое значение.
0 голосов
ответил 07 Июнь, 07 от WonkaK (320 баллов)
точно! эта функция возвращает объеты из выделенных принадлежащие нужному слою
у меня там в коде лишнее уберите, машинально запихал

    Спасибо, попробую.
0 голосов
ответил 07 Июнь, 07 от WonkaK (320 баллов)
    Еще такая проблема, есть слой на котором расположены различные точки. Делается выборка нескольких точек, по некоему критерию. Требуется нарисовать прямые линии между точками. Т.е. например выбрали две точки, и между ними надо нарисовать прямую линию (соединить точки).
Эти линии надо просто отобразить на экране, т.е. не надо добавлять в слой и т.п.

В хелпе нашел некоторые примеры по отрисовке линий, но почему то у меня не работают.

Посоветуйте куда тут копать надо...
    
0 голосов
ответил 07 Июнь, 07 от sschainik (4,900 баллов)
есть метод не помню точно как, но что то типа
display->draw, поищите на форуме есть. только то что отрисовывает пропадает при обновлении
0 голосов
ответил 07 Июнь, 07 от WonkaK (320 баллов)
    Нашел в хелпе следующий пример:
Dim pMxDoc As IMxDocument
Dim pActiveView As IActiveView
Dim pScreenDisplay As IScreenDisplay
Dim pRubberLine As IRubberBand
Dim pLineSymbol As ISimpleLineSymbol
Dim pRgbColor As IRgbColor
Dim pPolyline As IPolyline


Set pMxDoc = Application.Document
Set pActiveView = pMxDoc.FocusMap
Set pScreenDisplay = pActiveView.ScreenDisplay
Set pRubberLine = New RubberLine

Set pLineSymbol = New SimpleLineSymbol
Set pRgbColor = New RgbColor
pRgbColor.Red = 255
pLineSymbol.Color = pRgbColor

Set pPolyline = pRubberLine.TrackNew(pScreenDisplay, pLineSymbol)

With pScreenDisplay
    .StartDrawing pScreenDisplay.hDC, esriNoScreenCache
    .SetSymbol pLineSymbol
    .DrawPolyline pPolyline
    .FinishDrawing
End With

Но насколько я понял, медот TrackNew используется для события MouseDown. Видимо мне надо проинициализировать переменную pPolyline для вывода нужной мне линии на дисплей (координаты и т.п.), но что то не могу понять как?

Не подскажите, что делать?

PS спасибо, ваш предыдуший совет очень помог.
0 голосов
ответил 08 Июнь, 07 от sschainik (4,900 баллов)
TrackNew используется для формирования полилинии
вам же нужен pScreenDisplay
Вот этот самый pScreenDisplay и имеет методы для отрисовки DrawPoint, DrawPolygon, DrawPolyline которым и подсовываются соответствующие геометрические фируры
метод SetSymbol устанавливает чтото типа свойств пера (толщина, цвет)
а для формирования полилиний или полигонов нада использовать ISegment и ISegmentCollection, в хелпе все есть, еще есть ILine и IPoint
0 голосов
ответил 08 Июнь, 07 от Alexander1 (32,520 баллов)
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...