*es = pClonedObj->close();

if (*es!= Acad::eOk) {

delete pTsIter;

pTsTable->close();

return;

}

}

}

delete pTsIter;

*es = pTsTable->close();

}

}

Глава 19. Расширение Протокола

Все определения класса C++ установлены во времени компиляции.

При нормальных обстоятельствах, если Вы записываете транслятор файла или команду редактирования, которая работает в ряде существующего AutoCAD классов, Вы должны переопределить все существующие классы, чтобы включить новый транслятор или редактирующие функции. И Вы были бы должны перетранслировать вашу библиотеку также как все приложения, которые используют это.

Используя ObjectARX механизм расширения протокола, описанный в этой главе, Вы можете добавлять функциональные возможности к существующим классам ObjectARX во время выполнения, без любой модификации существующих классов и перетрансляции.

    Определенное Расширение Протокола Расширение Протокола Реализации Расширение Протокола для MATCH-команд Пример Расширения Протокола

Определение расширения протокола

Расширение протокола - механизм для добавления функциональных возможностей к существующим классам ObjectARX. Эти новые функциональные возможности воплощены в классах расширения протокола, связанных с существующим ObjectARX классом во время выполнения. Ассоциация ObjectARX класса с классами расширения протокола сделана посредством ObjectARX объекта описателя класса (описанной в главе 11, при Наследовании Заказного ObjectARX Класса. ”) объект описателя класса описывает класс и включает массив указателей на любые объекты, которые расширяют функциональные возможности того класса. ObjectARX класс может иметь любой номер протокола расширения, связанные с этим.

НЕ нашли? Не то? Что вы ищете?

Расширение протокола pеализации

Осуществлять расширение протокола

1 Объявляют и определяют классы расширения протокола, которые включают дополнительные функциональные возможности.

2 Регистрируют классы расширения протокола с приложением, и связывают их с классами ObjectARX, к которым они добавляют функциональные возможности.

Эти шаги описаны подробно в следующих двух подразделах. Дополнительная информация относительно проблем выполнения следует за этими секциями.

Объявление и определение классов расширения протокола

Пример, включенный в конце этой главы обеспечивает простую иллюстрацию расширения протокола. Это определяет “температурный” класс расширения протокола собственности. Заданное по умолчанию выполнение определено для AcDbEntity, и определенные выполнение определены для AcDbCircle и AcDbRegion.

Пример обслуживает как модель для более сложный (и реалистический) использования ObjectARX механизма расширения протокола. Базовый класс для этого расширения протокола, названного AsdkEntTemperature, получен из AcRxObject. Этот класс определяет виртуальные функции, которые будут унаследованы полученными классами расширения протокола, AsdkDefaultTemperature, AsdkCircleTemperature, и AsdkRegionTemperature. В этом примере, имеется только одна функция: reflectedEnergy().

Иерархия классов для классов расширения протокола показывается в следующем рисунке:

Первый шаг в использование расширения протокола должен объявлять и определить каждый из классов расширения протокола. Базовый класс, AsdkEntTemperature, является абстрактным классом, который определен, используя ACRX_NO_CONS_DEFINE_MEMBERS () макрокоманда. Этот класс будет в конечном счете зарегистрирован как часть ObjectARX иерархии классов.

Дочерние классы определены, используя стандартный синтаксис C++ для наследования новых классов. Эти классы не должны быть зарегистрированы в ObjectARX иерархии классов, так что Вы не должны использовать макрокоманды ObjectARX для них.

Для каждого класса, Вы осуществляете функции, которые составляют расширение протокола. В этом примере, каждый класс имеет только одну функцию, reflectedEnergy(), который вычисляет температуру для примитива.

Регистрация классов расширения протокола

Регистрировать расширение протокола классов с вашим приложением

1 Инициализируют ваш новый класс родителя расширения протокола и добавляют это к иерархии классов во время выполнения как показано в следующем примере:

AsdkEntTemperature:: rxInit ();

аcrxBuildClassHierarchy ();

Эта функция вызывает, требованы для любого нового ObjectARX класса, как описано в главе 11, при наследовании заказного ObjectARX Класса. ”

2 Создают объект каждого класса расширения протокола и добавляют объекты к соответствующим AcRxClass дескрипторным объектам, использующим addX () функция как показано в следующем примере:

pDefaultTemp = new AsdkDefaultTemperature();

pRegionTemp = new AsdkRegionTemperature();

pCircleTemp = new AsdkCircleTemperature();

// Добавить объекты расширения протокола к соответствующим объектам AcRxClass.

//

AcDbEntity::desc()->addX(AsdkEntTemperature::desc (), pDefaultTemp);

AcDbRegion::desc()->addX(AsdkEntTemperature::desc (), pRegionTemp);

AcDbCircle::desc()->addX(AsdkEntTemperature::desc (), pCircleTemp);

Во время выполнения, ObjectARX создает структуру объекта описателя класса, которая включает основную ObjectARX иерархию классов также как объекты расширения протокола, связанные с ObjectARX объектами описателя класса. Следующее рисунок показывает структуру объекта описателя класса для классов, которые касаются AsdkEntTemperature примера в этой главе:

Заданный по умолчанию Класс для Расширения Протокола

Рекомендуется, чтобы Вы осуществили заданный по умолчанию класс расширения протокола, как показано в примере в конце этой главы. Если не имеется никакой соответствующий объект расширения протокола для специфического класса, ObjectARX исследования иерархия классов и использует самый близкий, который это находит. Также рекомендуется, чтобы Вы связали заданный по умолчанию класс расширения протокола с AcRxObject или с некоторым другим классом наверху ObjectARX иерархии классов типа AcDbEntity (в этом примере) или AcDbObject.

Разгрузка Приложения

Когда приложение разгружено, Вы должны удалить любые команды, которые были добавлены при инициализации. Кроме того, Вы должны удалить ваш класс расширения протокола из ObjectARX словаря класса и удалять объект описателя класса для вашего класса расширения протокола.

Использование расширения протокола в приложении

Чтобы использовать функциональные возможности расширения протокола, Вы должны получить объект описателя класса для специфического класса. Как только Вы получили указатель на объект описателя класса, Вы можете вызывать любой из методов для того класса. Следующее - пример использования AsdkEntTemperature расширения протокола для класса AcDbEntity:

AcDbEntity *pEnt;

AsdkEntTemperature *pTemp;

pTemp = AsdkEntTemperature::cast ( pEnt->x(AsdkEntTemperature::desc()));

double eTemp = pTemp -> reflectedEnergy (pEnt);

Вы можете использовать макрокоманду ACRX_X_CALL, чтобы упростить этот код следующим образом:

double eTemp = ACRX_X_CALL(pEnt, AsdkEntTemperature)->reflectedEnergy(pEnt);

Расширение протокола для команды MATCH

AcDbMatchProperties - ObjectARX класс, определенно разработанный, чтобы служить как базовый класс расширения протокола, который обеспечивает поддержку примитива для команды MATCHPROP. (См. Ссылку Команды AutoCAD для информации относительно MATCHPROP.) заданный по умолчанию класс расширения протокола для AcDbEntity позволяет копировать цвета, уровня, linetype, и свойств масштаба linetype от одного примитива до другого. Это, однако, предпочтительно осуществить AcDbMatchProperties как класс расширения протокола для всех заказных объектов, полученных из AcDbEntity, обеспечивать полную поддержку для MATCHPROP. Если заданный по умолчанию класс расширения протокола перегружен с AcDbMatchProperties, это должно включить функции, чтобы копировать свойства базового класса также.

Пример расширения протокола

Этот пример расширения протокола разделен на три части:

§  Объявление и определение четырех классов расширения протокола: AsdkEntTemperature, AsdkDefaultTemperature, AsdkRegionTemperature и AsdkCircleTemperature.

§  выполнение energy() для команды ENERGY, которая позволяет пользователю выбирать примитив и затем, вычисляет температуру для того примитива.

§  ObjectARX модуль связывают с помощью интерфейса функции: initApp (), unloadApp () и acrxEntryPoint ().

// This is the AsdkEntTemperature protocol extension abstract base

// class. Notice that this is the lowest level that uses

// the ACRX macros.

//

class AsdkEntTemperature : public AcRxObject

{

public:

ACRX_DECLARE_MEMBERS(AsdkEntTemperature);

virtual double reflectedEnergy(AcDbEntity*) const = 0;

};

ACRX_NO_CONS_DEFINE_MEMBERS(AsdkEntTemperature, AcRxObject);

// This is the default implementation to be attached to AcDbEntity

// as a catch-all. This guarantees that this protocol extension will

// be found for any entity, so the search up the AcRxClass tree will

// not fail and abort AutoCAD.

//

class AsdkDefaultTemperature : public AsdkEntTemperature

{

public:

virtual double reflectedEnergy(AcDbEntity* pEnt) const;

};

double

AsdkDefaultTemperature::reflectedEnergy( AcDbEntity* pEnt) const

{

acutPrintf( "\nThis entity has no area, and no reflection.\n");

return -1.0;

}

// AsdkEntTemperature implementation for Regions

//

class AsdkRegionTemperature : public AsdkEntTemperature

{

public:

virtual double reflectedEnergy(AcDbEntity* pEnt) const;

};

double

AsdkRegionTemperature::reflectedEnergy( AcDbEntity* pEnt) const

{

AcDbRegion *pRegion = AcDbRegion::cast(pEnt);

if (pRegion == NULL)

acutPrintf("\nThe impossible has happened!");

// Compute the reflected energy as the region area multiplied

// by a dummy constant.

//

double retVal;

if (pRegion->getArea(retVal) != Acad::eOk)

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132