Среда разработки GRX в GstarCAD. Пример разработки приложения.
- Среда разработки GRX позволяет проектировать приложения под САПР GstarCAD® на С++. Главная особенность этого интерфейса разработки в том, что он аналогичен по синтаксису с ObjectARX® (для AutoCAD® от компании Autodesk). В текущей версии API GRX определены основные типы данных, классы и внешние функции, позволяющие создать GRX-приложение полностью в стиле приложений разработанных с использованием ObjectARX®. Соответственно, разработчикам, имеющим опыт написания программ ObjectARX®, не составит труда приступить к разработке приложений для GstarCAD® или адаптировать готовые приложения.
- На данный момент объектный интерфейс GRX реализован на уровне ObjectARX® для AutoCAD® 2004. Впрочем, такого уровня вполне достаточно для создания приложений и сильно ущемленным себя не чувствуешь.
- Структура приложения для GstarCAD® соответствует структуре приложения с использованием ObjectARX®. Поэтому в плане построения и принципов разработки тут не приходится привыкать к чему-то новому. Необходимые для работы блоки: инициализация приложения, объявление команд, определение реакций на сообщения родительской программы (создание реакторов) и т. д., знакомы по программам с использованием ObjectARX® . Объявление возможностей программного интерфейса дает лишь надежду на доступность разработки, в следствии чего более эффективным методом демонстрации возможностей будет анализ кода работающего приложения.
- В качестве исследования и определения общности между указанными интерфейсами создадим небольшой проект. В качестве задачи данного проекта определим создание рамки для чертежа. Наша задача выявить действительность идентичности между GRX и ARX, поэтому методы и алгоритмы создания структуры для данного объекта опустим и рассмотрим только некоторые методы работы с GRX.
Иерархия классов
- #include
GRX предоставляет иерархию классов полностью по функционалу и синтаксису аналогичную ARX:
Классы управления документом: область AcAp;
Классы доступа к базе данных чертежа и представления объектов в базе чертежа — область AcDb;
Классы управления цветом : область AcCm;
Управление командами: область AcEd;
Классы управления геометрическими объектами : область AcGe;
Базовые классы для управления графическим отображением объектов : область AcGi;
Обеспечение доступа к графическим устройствам : область AcGs;
Базовые классы для создания приложений : область AcRx.
Доступ практически ко всем структурам обеспечивается включением одного заголовочного файла, указанного выше.
Инициализация приложения
- Как видно на приведенном ниже примере, объявление входной функции, инициализация приложения и регистрация команд в GRX по синтаксису аналогична ObjectARX® :
- extern "C" AcRx::AppRetCode acrxEntryPoint( AcRx::AppMsgCode msg, void* appId)
- switch( msg ) {
- case AcRx::kInitAppMsg:
- initApp();
- break;
- case AcRx::kUnloadAppMsg:
- unloadApp();
- break;
- case AcRx::kInitDialogMsg:
- break;
- default:
- break;
- return AcRx::kRetOK;
- Типы обрабатываемых сообщений соответствуют сообщениям в программах ObjectARX® :
Регистрация команд
В целом, как и следует ожидать, принцип регистрации собственных команд аналогичен ARX.
- static void initApp()
- acedRegCmds->addCommand(_T("DRAWPAGE_SERVICE"),
- _T("setpage"),
- _T("setpage"),
- ACRX_CMD_MODAL,
- createPageStamp,
- NULL,
- -1,
- DrawPageServiceDLL.ModuleResourceInstance());
- static void unloadApp()
- acedRegCmds->removeGroup(_T("DRAWPAGE_SERVICE"));
- В целом в GRX имеем доступ ко всему арсеналу области AcEd для управления командами приложения.
Обращение к базе чертежа и создание объекта
- Доступ к базе данных чертежа и пример создания объекта в ней можно рассмотреть в функции создания нового слоя.
- /* chName – имя создаваемого слоя */
- if(pDatabase != NULL)
- {
- err = pDatabase->getSymbolTable(pLayerTbl,AcDb::kForWrite);
- if(!pLayerTbl->has(chName))
- {
- AcDbLayerTableRecord *pLayerTblRcd = new AcDbLayerTableRecord();
- if(pLayerTblRcd != NULL)
- {
- pLayerTblRcd->setName(chName);
- pLayerTblRcd->setIsFrozen(0);
- pLayerTblRcd->setIsOff(0);
- pLayerTblRcd->setVPDFLT(0);
- pLayerTblRcd->setIsLocked(0);
- AcCmColor color;
- color.setColorIndex(::g_iLrColor);
- pLayerTblRcd->setColor(color);
- pLayerTbl->add(pLayerTblRcd);
- pLayerTblRcd->close();
- pLayerTbl->close();
- }
- }
- Приведенный выше пример кода ничем не отличается от примеров кода из руководства для ObjectARX®. Повторяя уже сказанное выше, ясно видна идентичность между объектами в GRX и ObjectARX®. Тот же синтаксис для классов работы с базой данных чертежа, те же глобальные функции и те же методы для создания и закрытия объектов.
- Этих двух небольших примеров достаточно для того, чтобы убедиться в идентичности кода для интерфейсов GRX и ObjectARX®. Не вдаваясь в подробности, можем лишь обобщить, что данное применимо и к другим модулям пользовательского приложения:
Создание объектов в чертеже
Создание графических элементов также не вызывает затруднений, приведенный ниже пример можно полностью интегрировать как в GRX, так и ARX.
- Icad::ErrorStatus err;
- AcDb2dPolyline* pLine = new AcDb2dPolyline();
- AcDb2dVertex* StartPoint = new AcDb2dVertex(pntStrt,0,Thick,Thick,0);
- AcDb2dVertex* EndPoint = new AcDb2dVertex(pntEnd,0,Thick,Thick,0);
- err = pLine->appendVertex(StartPoint);
- err = pLine->appendVertex(EndPoint);
- pLine->setThickness(Thick);
- if(Thick)
- {
- pLine->setLineWeight(kLnWt100);
- }
- err = StartPoint->close();
- err = EndPoint->close();
- err = pLine->close();
- return pLine;
- В связи с особенностями определений в интефейсе можно сделать комментарий, что названия глобальных именованных областей Icad и Acad вполне взаимозаменяемы, и могут использоваться оба наименования.
Использование реакторов
В интерфейсе программирования представлены классы для объявления нескольких типов реакторов:
Реакторы документов:
AcEditorReactor — отслеживание событий редактора (команды и т.п.);
AcDbDatabaseReactor - отслеживание событий создания, редактирования, удаления объектов в базе данных чертежа;
AcTransactionReactor — отслеживание событий в транзакциях;
AcDbObjectReactor — базовый класс реакторов, определяющий базовые методы для отслеживания действий над объектами;
AcDbEntityReactor — отслеживание событий редактирования графических элементов.
В данном приложении не было использовано реакторов, тем не менее, с уверенностью можно утверждать, что данный функционал работает и не имеет больших отличий от ARX приложений.
Создание собственных классов для графических объектов
Создание объектов возможно как в виде примитивов, в виде блоков, определенных на базе стандартных классов интерфейса программирования, так и в виде собственных объектов, наследников от стандартных классов.
В качестве примера в проекте был создан класс для управления динамическим перемещением объектов:
class PageBlockJig : public AcEdJig
{...};
Создание интерфейса пользователя
- Интерфейс пользователя создается с помощью классов Microsoft MFC, либо с помощью DCL. В конкретном примере использовались классы MFC. В данном случае расширение создается как библиотека MFC с использованием внутренних ресурсов модуля для хранения диалогов.
Результат
Исходный код созданного GRX-приложения для GstarCAD 2010 аналогичен тому, если бы данное приложение было написано с использованием ObjectARX.
- Гораздо более интересно выявить что отличает эти два интерфейса для разработчиков и каковы же все-таки полные возможности интерфейса разработки для GstarCAD®.
- К сожалению, в рамках данного примера выявить все особенности интерфейса программирования трудно, для этого необходим более крупный проект с использованием всех возможностей GRX.
- Возможности интерфейса разработки для GstarCAD® — как было уже сказано выше — вполне доступный и работоспособный интерфейс разработчика в стиле ObjectARX®. Более того, китайские разработчики GstarCAD® известны тем, что регулярно выпускают улучшения как платформы, так и интерфейсов проектирования приложений. В частности, в этом году планируется довести GRX до уровня ObjectARX® для AutoCAD® 2008.
- Данная статья не претендует на полноценный и глубокий обзор GRX и сравнение его с интерфейсом разработки от AutoCAD® - это было бы многостраничное руководство. Цель статьи — выявление общности между вышеуказанными интерфейсами разработки. Насколько достигнута цель можно судить по примеру проекта.
- Пример проекта: http://dwg.ru/dnl/8091
-
Комментарии
Авторизоваться