Как работать с IGPCompositeDataType

0 голосов
спросил 23 Окт, 08 от peterzb (8,120 баллов) в категории Программные продукты Esri
Пример использования IGPCompositeDataType есть в ArcToolbox в инструменте buffer_analysis. Это 3 параметр “Расстояние [значение или поле]”

Я хотел повторить но у меня получается только одно поле, а нужно как чтобы было как в buffer_analysis

Я делаю, так как здесь

Dim pGPCompType As IGPCompositeDataType
    Set pGPCompType = New esriGeoprocessing.GPCompositeDataType

Dim pGPDataType1 As IGPDataType
Dim pGPDataType2 As IGPDataType
    
    Set pGPDataType1 = New esriGeoprocessing.GPLongType
    Set pGPDataType2 = New esriGeoprocessing.GPStringType

    pGPCompType.AddDataType pGPDataType1
    pGPCompType.AddDataType pGPDataType2


    Set pInParameter = New esriGeoprocessing.GPParameter
        pInParameter.name = "CompositeDataTypeName1"
        pInParameter.DisplayName = "CompositeDataTypeDN1"
        pInParameter.Direction = esriGPParameterDirectionInput
     Set pInParameter.DataType = pGPCompType
        pInParameter.ParameterType = esriGPParameterTypeRequired
        pInParameter.Enabled = True

pParameters.Add pInParameter


Что здесь не так?
    

8 Ответы

0 голосов
ответил 27 Окт, 08 от peterzb (8,120 баллов)
Объявление параметра нужно делать так

Dim u As New UID
      u.Value = "esriGeoprocessingui.MdCompositeCtrl"

Set pInParameter = New esriGeoprocessing.GPParameter
    pInParameter.ControlCLSID = u
    pInParameter.name = "CompositeDataTypeName1"
    pInParameter.DisplayName = "CompositeDataTypeDN1"
    pInParameter.Direction = esriGPParameterDirectionInput
    Set pInParameter.DataType = pGPCompType
    pInParameter.ParameterType = esriGPParameterTypeRequired
    pInParameter.Enabled = True

pParameters.Add pInParameter

И почему это нельзя было указать в документации?image
0 голосов
ответил 05 Ноя, 08 от peterzb (8,120 баллов)
И у вас получается два параметра под названием:
Строка и Long

Как изменить название по умолчанию?
Как правильно работать с IGPCompositeDataType?
    
В Интернете я ничего не нашел. image
0 голосов
ответил 05 Ноя, 08 от Alexander1 (32,520 баллов)
Попробуй так:


// Create the GPCompositeDataType
IGPCompositeDataType compositeType = new GPCompositeDataTypeClass();

// Create the DataTypes that are permitted as input
IGPDataType dataType1 = new GPStringTypeClass();
IGPDataType dataType2 = new GPLongTypeClass();

// Add DataTypes
compositeType.AddDataType(dataType1);
compositeType.AddDataType(dataType2);

// Set the Input Parameter
IGPParameterEdit inputParameter = new GPParameterClass();
inputParameter.DataType = compositeType;
inputParameter.Value = new GPStringTypeClass();
......................................................
......................................................
......................................................
0 голосов
ответил 06 Ноя, 08 от peterzb (8,120 баллов)
Результат будет тот же самый, но все написано только на СИ. Вам предложат выбрать в параметре CompositeDataType два подпараметра: Long или Строка. Как на рисунке
http://www.rf-net.org/images/igpcompositedatatype.jpg

image



Как сделать, чтобы вместо названий по умолчанию "Long" или "Строка" были те названия которые нужно?

image image image image


Если использовать VBA, то можно сделать так
Option Explicit
Implements IGPDataType
Implements IGPStringType

Private m_GPDataType As IGPDataType

Private Sub Class_Initialize()
    Set m_GPDataType = New esriGeoprocessing.GPStringType
End Sub

Private Property Get IGPDatatype_ControlCLSID() As esriSystem.UID
   
   ‘Можно подключить свой собственный интерфейс   
     Dim u As New UID
       u.Value = "BioSAControl.myUserControl"
       
      Set IGPDatatype_ControlCLSID = u

Или уже существующий
        Set IGPDatatype_ControlCLSID = m_GPDataType.ControlCLSID

     
End Property


Далее

pGPCompType.AddDataType [ваш GPDatatypeClass]

В VBA проходит все, но если создать библиотеку в VB и подключить ее к ArcTooBox, то при открытии инструмента с собственным GPDatatypeClass ArcGIS виснет. Возможно в случае с VB нужно использовать IMdElementCtrl, но как?


Создается впечатление, что при инициализации интерфейса ArcGIS не читает содержимое IGPDatatype_ControlCLSID() а для работы использует CLSID класса
0 голосов
ответил 06 Ноя, 08 от Alexander1 (32,520 баллов)
А как насчёт:

IGPDataType.DisplayName Property

and

IGPParameter.DisplayName Property ?
    
...................................................
// Create the DataTypes that are permitted as input
IGPDataType dataType1 = new GPStringTypeClass();
dataType1.DisplayName = "My favorite String";
IGPDataType dataType2 = new GPLongTypeClass();
dataType2.DisplayName = "My favorite Number";
....................................................
0 голосов
ответил 07 Ноя, 08 от peterzb (8,120 баллов)
IGPDataType_DisplayName Property
Provides the descriptive, user-friendly name.
Read only.

Это свойство только, на чтение.
Чтобы туда записать что-либо, нужен редактор, наподобие IGPParameterEdit

0 голосов
ответил 07 Ноя, 08 от Alexander1 (32,520 баллов)
Только сейчас резкость навёл - а почему у тебя два подпараметра? Ведь должен быть только один параметр, с типом GPCompositeDataType, т.е., в твоём случае его значения могут быть либо GPStringType, либо GPLongType. Или я чего не понимаю?   image

Взял пример, изменил inputParameter.DataType = (IGPDataType)compositeType;
получается один параметр (одна строка ввода).

http://edndoc.esri.com/arcobjects/9.2/NET/914fc3ff-817b-4825-8f15-4df2d725c370.htm
    
0 голосов
ответил 10 Ноя, 08 от peterzb (8,120 баллов)
Это уж точно.
Пример реализации IGPCompositeDataType есть в ArcToolbox в инструменте buffer_analysis. Это 3 параметр "Расстояние [значение или поле]"   

Чтобы посмотреть что там, можно использовать VBA:

Dim pApp As IApplication
     Set pApp = Application

Dim pUID As New UID
     pUID = "esriGeoprocessingUI.ArcToolboxExtension"

Dim pATBExt As IArcToolboxExtension
     Set pATBExt = Application.FindExtensionByCLSID(pUID)

Dim pATb As IArcToolbox
     Set pATb = pATBExt.ArcToolbox

Dim pTool As IGPTool
Dim pGPFunct As IGPFunction
Dim pGPToolbox As IGPToolbox

     Set pTool = pATb.GetToolbyNameString("buffer_analysis")
     
     Set pGPToolbox = pTool.Toolbox
     


Dim pParams As IArray
Dim pParameter As IGPParameter
Dim pGPUtils As IGPUtilities
Dim pGPValue As IGPRasterLayer
     
     
     Set pParams = pTool.ParameterInfo
     Set pGPUtils = New esriGeoprocessing.GPUtilities
     Set pParameter = pParams.Element(2)
          
          
Dim pGPDataType As IGPDataType
Dim pGPCompType As IGPCompositeDataType

      Set pGPDataType = pParameter.DataType
                   
      If TypeOf pGPDataType Is IGPCompositeDataType Then
        VBA.MsgBox "pGPDataType Is IGPCompositeDataType"
      Else
        Exit Sub
      End If
       
      Set pGPCompType = pGPDataType
      
      With pGPCompType
        VBA.MsgBox "количество типов данных=" & VBA.CStr(pGPCompType.Count)
        VBA.MsgBox "Name первого: " & .DataType(0).name & " и его DisplayName: " & .DataType(0).DisplayName
        VBA.MsgBox "Name второго: " & .DataType(1).name & " и его DisplayName: " & .DataType(1).DisplayName
       
      End With
    
       
    
    
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...