Спасибо за ссылки и код
Сделал тестовый пример для ввода, используя функцию acedCommandC
Функция работает, но только при ручном вводе.
void testcmd()
{
//функция вычерчивания линии
acedCommandC(&myCallbackFn, NULL,
RTSTR, _T("_Line"),
RTSTR, _T("0,0"),
RTSTR, _T("111,111"),
RTNONE);
}
//функция обратного вызова - продолжение ввода данных пользователем
int myCallbackFn(void * pData){
int nReturn = RTNONE;
if (isLineActive()) nReturn = acedCommandC(&myCallbackFn, NULL,
RTSTR, PAUSE, //ввод данных пользователем
RTNONE);
else { //Если функция успешно завершена
acutPrintf(_T("\nВвод данных завершен - выход из процедуры ввода\n"));
}
return nReturn;
}
//проверка состояния команды - активна или нет
Adesk::Boolean isLineActive()
{
struct resbuf rb;
acedGetVar(_T("CMDNAMES"), &rb);
if (_tcsstr(rb.resval.rstring, _T("LINE")))
return Adesk::kTrue;
return Adesk::kFalse;
}
На сколько я понял, для программного ввода данных, в функцию нужно передавать второй параметр
MyData,
acedCommandC(&myCallbackFn,
MyData, ...
где
MyData - указатель на структуру, содержащую массив данных и текущий индекс массива данных
При этом функция контроля состояния
isLineActive() ненужна. Мы сами контролируем ввод внутри функции
myCallbackFn()В функции myCallbackFn() нужно организовать ввод одного элемента массива и увеличить индекс (счетчик)
Функция myCallbackFn() будет вызывать сама себя, пока не введет весь массив данных.
По завершении массива, нужно ввести завершающую часть команды (выход из команды)
nReturn = acedCommandC(&myCallbackFn, NULL, RTSTR, _T(""), RTNONE);
При следующей итерации нужно просто выйти из функции (не вызывая acedCommandC)
вернув значение RTNONE
int nReturn = RTNONE;
...
return nReturn;
Разработчики существенно усложнили создание кода.
Теперь нужно будет создавать множество дополнительных функций обратного вызова
или думать как их можно унифицировать...