Пример разработки дополнения к GstarCAD

Добавлено: 20 Мая 2010
Пример создания проекта с использованием интерфейса GRX для GstartCAD 2010

 

Среда разработки 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


Комментарии

Комментарии 1-1 из 1
valentin.polukarov
, 20 января 2017 в 18:53
#1
подскажите насчет совместимости с форматами файлов ACAD 2008\2009? http://gstarcad.ru/
Комментарии могут оставлять только зарегистрированные участники
Авторизоваться
Размещение рекламы