Тема: Повторный вызов функции acedSSGet для получения выбранных обьектов

Добрый день.
Использую в своем проекте дин. свойства для своего типа макрообъекта.
При вызове свойства-диалога мне необходимо получить массив выбранных объектов на чертеже.
Для этого использую функцию acedSSGet(_T("_:E"), NULL, NULL, NULL, ss), с первого раза функция работает нормально, однако при втором вызове функция просит пользователя самому выбрать объекты.
Как этого можно избежать?

1.Неправильно задан макрос _:E. Еще не успел изучить параметры функции acedSSGet...
2.Возможно после вызова функции acedSSGet, объекты каким то образом "развыделяются". Допустим для вывода диалога я переключаю ресурсы MFC (AfxSetResourceHandle(_hdllInstance);)
3.Возможно функция acedSSGet не подходит для моей задачи, то есть она как раз и предназначена для выбора обьектов самим пользователем.

Большое спасибо

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

Re: Повторный вызов функции acedSSGet для получения выбранных обьектов

1. Какие флаги установлены для твоей команды? Если хочешь, чтобы выделение сохранялось и ты мог получить в своей программе предварительно выбранные примитивы, должны быть установлены флаги: ACRX_CMD_USEPICKSET|ACRX_CMD_REDRAW
2. acedSSGet(_T("_:E"), NULL, NULL, NULL, ss) выбирает всё, что попадает в апертуру, т.е. зависит от положения курсора в момент вызова. Тебя именно это интересует? Или все-таки все выделенные пользователем объекты?
Ну и наверное нужен кусок кода.

Re: Повторный вызов функции acedSSGet для получения выбранных обьектов

Меня интересуют все выбранные в данный момент объекты на чертеже (то есть независимо от положения курсора, нужно получить список объектов)
Пытаюсь получить их следующим образом:

STDMETHOD  GetEditingMacros(CArray<CMacroBase*,CMacroBase*> &arObjectID)
{
    HRESULT hr = S_OK;
    ads_name ss,ent;
    if (acedSSGet(_T("_:E"), NULL, NULL, NULL, ss) != RTNORM)
        RETURN_ERROR(TL_E_FAILED_GET_EDITING_MACRO);
    long nSelectionSetLength = -1;
    if ((acedSSLength(ss, &nSelectionSetLength) != RTNORM)||(nSelectionSetLength < 0))
        RETURN_ERROR(TL_E_FAILED_GET_EDITING_MACRO);
    for (int i = 0;i < nSelectionSetLength;i++)
    {
        if ( acedSSName(ss,i,ent) != RTNORM )
            RETURN_ERROR(TL_E_FAILED_GET_EDITING_MACRO);
        CObjectID id;
        if (acdbGetObjectId(id, ent) != Acad::eOk)
            RETURN_ERROR(TL_E_FAILED_GET_EDITING_MACRO);    
            //Получаем текущий обьект
        CMacroBase* pMacro = NULL;
        CHECK_HRESULT(hr = GetMacro(id, pMacro));
        if (hr != S_OK)
            return hr;
        arObjectID.Add(pMacro);
    }
    return hr;
}

Re: Повторный вызов функции acedSSGet для получения выбранных обьектов

Олег Бевз пишет:

Меня интересуют все выбранные в данный момент объекты на чертеже (то есть независимо от положения курсора, нужно получить список объектов)

1. Тогда _T("_:E") ни к селу, ни к городу. Можно использовать или _T("_I"), или функцию acedSSGetFirst, или acedGetCurrentSelectionSet (прочитай внимательно описание этих функций).
2. Не увидел в коде вызова acedSSFree(ss); - всего наборов (SelectionSet) может быть 128, так что у тебя большие шансы превысить это количество и после этого для восстановления работоспособности AutoCAD потребуется его перезапуск.  :cry:

(изменено: Олег Бевз, 19 ноября 2010г. 13:42:36)

Re: Повторный вызов функции acedSSGet для получения выбранных обьектов

Большое спасибо.