Парам Cursor метода IFeatureRenderer_Draw

0 голосов
спросил 07 Июнь, 04 от the_crabolocker (160 баллов) в категории Программные продукты Esri

Прошу совета...

Подгружаю в ArcMap точечный слой и навешиваю на него собственный рендерер, реализованный в виде DLL. При отображении значков мне необходимо брать значения некоторых полей в шейпе, например, поле Type. В зависимости от значения этих полей знак по-разному отрисовывается. Но проблема в том, что в методе IFeatureRenderer_Draw, отвечающем за отрисовку всех знаков, параметр Cursor As IFeatureCursor считываемые значения полей атрибутов оказываются Empty.

Код метода  IFeatureRenderer_Draw приводится ниже.

Dim m_pSym as ISymbol
Dim m_Sym as MySymbol

Private Sub IFeatureRenderer_Draw
   (ByVal Cursor As esriCore.IFeatureCursor, _
    ByVal drawPhase As esriCore.esriDrawPhase, _
    ByVal Display As esriCore.IDisplay, _
    ByVal trackCancel As esriCore.ITrackCancel)

Dim pDisplayTrans As esriCore.IDisplayTransformation
   
Dim pFeature As esriCore.IFeature
   
Set pDisplayTrans = Display.DisplayTransformation
Set m_pSym = New MySymbol
Set m_Sym = m_pSym
   

Do
  Set pFeature = Cursor.NextFeature 
  m_Sym.Angle = CInt(pFeature.Value(2)) 'VALUE IS EMPTY
  If Not pFeature Is Nothing Then
    If Not pFeature.Shape Is Nothing Then
      m_pSym.SetupDC Display.hDC, pDisplayTrans
      m_pSym.Draw pFeature.Shape
      m_pSym.ResetDC
    End If
  End If
Loop Until pFeature Is Nothing
End Sub

3 Ответы

0 голосов
ответил 07 Июнь, 04 от Andranic (2,620 баллов)

А вы уверены что читаете нужное поле ?

Попробуйте использовать метод ICursor:FindField для начала.

0 голосов
ответил 07 Июнь, 04 от the_crabolocker (160 баллов)

Спасибо за отклик.  В одном из вариантов этого кода я пробовал брать значение поля через метод FindField, но результат был таким же.

И все-таки сегодня я нашел ответ. Надеюсь, это может быть полезно для многих.

По умолчанию, при навешивании своего рендерера в параметр Cursor передаются значения лишь поля Shape (название поля с геометрией). Если же в отрисовке символа участвуют и другие поля, то необходимо задействовать интерфейс IFeatureClassDraw и его свойство RequiedFieldsForDraw, определяющее список полей, необходимых для отрисовки. Реализацию данного интерфейса следует добавить в создаваемый класс рендерера. Кроме того, требуется реализация интерфейса IClassExtension.

Далее необходимо использовать метод IClassSchemaEdit::AlterClassExtensionCLSID для того, чтобы установить класс, реализующий рендерер, в качестве класса расширения указанного feature class

см. также пример: C:\arcgis\arcexe83\ArcObjects Developer Kit\Samples\ArcMap\Symbology\Renderers\FeatureClassDraw

0 голосов
ответил 07 Июнь, 04 от Andranic (2,620 баллов)
Ну вот и отлично. Хорошо что разобрались :).
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...