Тема: Вызов диалоговых окон AutoCAD из .arx приложения

Кто-нибудь сталкивался с необходимостью вызывать встроенные диалоговые окна AutoCAD (которые в стандартных .arx приложения Autodesk) из своих программ? Например, вызвать диалоговое окна Hatch, Inert Field, Layers и др. И желательно, чтобы результат вызова возвращался в программу (например, тип штриховки, масштаб и пр.) Есть типовой способ вызова?

Re: Вызов диалоговых окон AutoCAD из .arx приложения

Для вызова некоторых из них есть специальные. Например для вызова диалогового окна выбора текстового стиля:

void invokeTextStyleDialog(AcDbDatabase *db, CString *TextStyleName);
void TestinvokeTextStyleDialog(void)
{
    HINSTANCE hPrev = AfxGetResourceHandle();
    AfxSetResourceHandle(acedGetAcadResourceInstance());
    AcDbDatabase *db = curDoc()->database(); // Current Database
    AcDbObjectId Id = curDoc()->database()->textstyle(); // Current textstyle ID
    AcDbObjectPointer<AcDbTextStyleTableRecord> textstyleRec (Id, AcDb::kForRead);
    char *pName = NULL; textstyleRec->getName(pName); // Name of current textstyle
    CString s; s.Format("%s",pName); free(pName);
    acutPrintf("\nCurrent text style: %s",s);
    invokeTextStyleDialog(db, &s);
    AfxSetResourceHandle(hPrev);
}

Re: Вызов диалоговых окон AutoCAD из .arx приложения

> Alxd
Коллега! Вы задаете такие интересные вопросы, что хочется находить на них ответы. biggrin
Эврика!!! Есть возможность прямого вызова команд AutoCAD (без всяких acedCommand, sendStringToExecute и т.д. - через прямой вызов функции). Вот небольшой примерчик:

 static void ARXCOMMAND(void)
  {
    AcEdCommandStack* pCmdStack = acedRegCmds;
    AcEdCommand* pCmd = pCmdStack->lookupCmd("LAYER",true);
    if (pCmd && pCmd->functionAddr()) {
      AcRxFunctionPtr funcCommand = pCmd->functionAddr();
      funcCommand();
    } else {
      acutPrintf("\nNot found");
    }
  }

Эта функция напрямую вызывает диалог команды LAYER.

Re: Вызов диалоговых окон AutoCAD из .arx приложения

Действительно! Я ведь пользовался этими функциями, но не допер, что можно их в таком ракурсе использовать. Надо попробовать!
Спасибо!

Re: Вызов диалоговых окон AutoCAD из .arx приложения

Тут есть некоторые нюансы. Один из них - необъходимость загружать некоторые из arx-файлов, так как при стандартном вызове команд они загружаются по demand.

Re: Вызов диалоговых окон AutoCAD из .arx приложения

Что-то, по-моему, это слишком скользкий путь. Я когда-то хотел использовать эту идею, но к сожелению далеко не для всех команд и в далеко не во всех версиях это можно использовать. Так приведенный пример не будет работать в 2002, 2004, а если поменять "LAYER" на "LINE", то и в 2005.
Или я не знаю каких-то ньюансов?

Re: Вызов диалоговых окон AutoCAD из .arx приложения

> Michael
Отвечу по порядку:
1) Я разве говорил о возможности вызова всех команд? Нет. Да и уважаемый Alxd сделал очень конкретную постановку задачи:

(которые в стандартных .arx приложениях Autodesk)

И только для них!!!
2) Для встроенных в acad.exe команд этот алгоритм не подходит. Команду LINE так нельзя запустить и в AutoCAD 2006, и подозреваю ни в какой из будующих версий (да и не нужно).
3) По поводу скользкости этого пути - могу с Вами согласится. Это лишь одна из возможностей, которую нужно исследовать и понимать все последствия. Например, необходимость переключать ресурсы перед прямым вызовом, блокировать документы - в зависмости от флагов на команды - и т.д.
4) Прямые вызовы действительно зависят от версии AutoCAD, но это не проблема. В конце концов одно arx-приложение не работает и под AutoCAD 2002, и под 2004. Так кто мешает в версии, расчитанной на AutoCAD 2004-2006 делать ветвление в зависимости от версии и использовать возможности по максимуму?
5) К сожалению ничего лучше нам Autodesk предложить не может...