Тема: Массив в Автокадовскую палитру свойств

Добрый день,
Есть массив, содержащий int,double,CString,enum. Как вывести этот массив в Автокадовскую палитру свойств? Хотел сделать также, как делается вывод точек, через IOPMPropertyExpander, но  так можно выводить только doubles.

(изменено: Александр Ривилис, 30 сентября 2010г. 12:42:58)

Re: Массив в Автокадовскую палитру свойств

Честно говоря не очень понятно что это за массив и каким образом AutoCAD будет понимать как отформатировать в строку его значение. Можно поиграться с GetCurrentValueType. Например, у меня сделано так:

STDMETHODIMP CCVolumeProps::GetCurrentValueType (VARTYPE *pVarType) {
  if ( pVarType == NULL )
    return (E_POINTER) ;
  // TODO: add your code here (and comment the line below)
  if (curDoc()->dat abase()->lunits() != 4)  *pVarType = VT_R8 ;
                  else                      *pVarType = VT_BSTR;

  return (S_OK) ;
}

STDMETHODIMP CCVolumeProps::GetCurrentValueData (IUnknown *pUnk, VARIANT *pVarData) {
  if ( pUnk == NULL )
    return (E_INVALIDARG) ;
  if ( pVarData == NULL )
    return (E_POINTER) ;
  
  double d =  scale * scale * scale;

  // TODO: add your code here (and comment the 3 lines below)
  ::VariantInit (pVarData) ;
  if (curDoc()->dat abase()->lunits() != 4)  {
    V_VT(pVarData) = VT_R8 ;
    V_R8(pVarData) = DocVars.docData().volume *d;
  } else {
    V_VT(pVarData) = VT_BSTR ;
    ACHAR buf1[512];  acdbRToS(DocVars.docData().volume*d,2,-1,buf1);
    ACHAR buf2[512];  acdbRToS(DocVars.docData().volume/1728.0*d,2,-1,buf2);
    CString v; v.Format(_T("%s cu. in. (%s cu. ft.)"),buf1,buf2);
    V_BSTR(pVarData) = v.AllocSysString();
  }

  return (S_OK) ;
}

(изменено: Андрей, 30 сентября 2010г. 16:18:16)

Re: Массив в Автокадовскую палитру свойств

Александр, спасибо, но применить не смог :(
Массив содержит что-то типа VARIANT. Требуется вывести в палитру свойств сразу все элементы этого массива.

Попробовал так:

STDMETHODIMP CDynProp::GetElementStrings( 
    /* [in] */ DISPID dispID,
    /* [in] */ IUnknown * pUnk,
    /* [out] */ OPMLPOLESTR __RPC_FAR *pCaStringsOut,
    /* [out] */ OPMDWORD __RPC_FAR *pCaCookiesOut)
{
    long size;
    size = 2;
    pCaStringsOut->pElems = (LPOLESTR *)::CoTaskMemAlloc(sizeof(LPOLESTR) * size);
    pCaCookiesOut->pElems = (DWORD *)::CoTaskMemAlloc(sizeof(DWORD) * size);
    for (long i=0;i<size;i++)
        pCaCookiesOut->pElems[i] = i;

    pCaStringsOut->cElems = size;
    pCaCookiesOut->cElems = size;
    pCaStringsOut->pElems[0] = ::SysAllocString(L"Наименование");           /// !!!!
    pCaStringsOut->pElems[1] = ::SysAllocString(L"Диаметр емкости");        /// !!!!

    return S_OK;
}

STDMETHODIMP CDynProp::GetElementValue(
    /* [in] */ DISPID dispID,
    /* [in] */ IUnknown * pUnk,
    /* [in] */ DWORD dwCookie,
    /* [out] */ VARIANT * pVarOut)
{
    if (pVarOut == NULL)
        return E_POINTER;
     ::VariantInit (pVarOut) ;
    switch (dwCookie)
    {
    case 0:
        {
        V_VT(pVarOut) = VT_BSTR ; 
        CString v(_T("Емкость на опорах"));           /// !!!!
        V_BSTR(pVarOut) = v.AllocSysString();
        break;
        }
    case 1:
        V_VT(pVarOut) = VT_R8; 
        V_R8(pVarOut) =  800;                        /// !!!!
        break;
    }
    return (S_OK);
}

но текст "Емкость на опорах" не выводится.

Как я понял, IOPMPropertyExpander хоть и позволяет в пределах одного свойства выводить несколько подсвоств, но все эти подсвоства будут double. 
Как вывести произвольное количество подсвоств разного типа? Или придется писать свой ActiveX control?

Re: Массив в Автокадовскую палитру свойств

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

Re: Массив в Автокадовскую палитру свойств

Как создавать простые свойства Я знаю, но это не подходит, т.к. в данном случае количество свойств и их тип может меняться в процессе работы.

например массив:

"Наименование";str;"Емкость на опорах"
"Диаметр емкости";double;800
"Количество опор";int;2
...
...
...
"Цвет";str;"Зеленый"

В приведенном примере, для наглядности, Я "выдернул" из массива 2 значения. Массив, будет заполняется пользователем и его размер будет изменяться в процессе работы. Этот массив и нужно вывести в палитру.