Тема: Список доступных команд в документе

Пытаюсь получить в .arx приложении список доступных для пользователя команд. Использую
AcEdCommandStack* pCommandStack = acedRegCmds;
AcEdCommandIterator* pCommandIterator = pCommandStack->iterator();
while {...const char* funcname = pCommandIterator->command()->globalName();...}
Все работает. Однако возвращает мне список функций в масштабе всего ПРИЛОЖЕНИЯ! А мне надо только конкретного документа.
Есть .lsp файлы, которые загружаются не под каждый документ. А у меня в списке команд получается, что команда видна, хотя .lsp не загружен! Ерунда такая.
Как получить список команд доступных именно в документе?

Re: Список доступных команд в документе

Установил интересную закономерность. Команда ARX->Commands выдает список команд, объединенных в группы. Если в AutoCAD загружено два чертежа, то команда даст две группы с префиксом *DOC, например: *DOC(0x0a10e4f0) и *DOC(0x09969cf0). Эти группы содержат команды и функции, определенные в LSP-файлах. Если в одном из чертежей загружен lsp-файл, а в другом нет, то команда будет присутствовать только в одной из групп. Проверял в AutoCAD 2006.
Копай в эту сторону.

Re: Список доступных команд в документе

Дополнение - шестнадцатиричное выражение в скобках - это адрес AcApDocument. Так что теперь осталось получить адрес AcApDocument для конкретного документа, преобразовать в hex и сравнить его с выражением в скобочках.
Надеюсь, что это именно то, что ты искал.

Re: Список доступных команд в документе

Еще одно дополнение. Следующая функция выводит список всех команд и групп команд, которые зарегистрированы и могут выполняться в активном документе.
Можно написать конечно и красивее, но смысл понятен. Кстати, это недокументированная возможность и соответственно в следующей версии AutoCAD ее может и не быть. :(

  static void ARXLIST(void)
  {
    // Add your code for command ARXLIST here
    AcApDocument *ap = acDocManager->mdiActiveDocument();
    DWORD ptrCurDoc = DWORD(ap);
    AcEdCommandIterator* pCmdItr;
    char cmdName[133], grpName[133];
    if(NULL != (pCmdItr = acedRegCmds->iterator())) {
      for(;!pCmdItr->done(); pCmdItr->next()) {
        strcpy(cmdName,pCmdItr->command()->localName());
        strcpy(grpName, pCmdItr->commandGroup());
        if (!strncmp(grpName,"*DOC(0x",7)) { //
          DWORD ptrCmdDoc; sscanf(grpName+8,"%08X",&ptrCmdDoc);
          if (ptrCurDoc == ptrCmdDoc) {
            acutPrintf("\nGroup name = %s, Command name = %s",grpName, cmdName);
          }
        } else {
          acutPrintf("\nGroup name = %s, Command name = %s",grpName, cmdName);
        }
      }  // for        
      //clean up
      delete pCmdItr;
    }// if
  }
} ;

Re: Список доступных команд в документе

Спасибо. Именно так и сделал!

Re: Список доступных команд в документе

Поднимаем из мертвых :)
Возникла потребность сделать подобное из c# модуля. Из всего что искал по этой теме, этот топик оказался наиболее информативным..) но недостаточным. Как то можно получить список команд на c#?.

Re: Список доступных команд в документе

> Anton Vishnyakov
Продолжим здесь.