return -1.0;
return retVal * 42.0;
}
// AsdkEntTemperature implementation for circles
//
class AsdkCircleTemperature : public AsdkEntTemperature
{
public:
virtual double reflectedEnergy(AcDbEntity* pEnt) const;
};
double
AsdkCircleTemperature::reflectedEnergy( AcDbEntity* pEnt) const
{
AcDbCircle *pCircle = AcDbCircle::cast(pEnt);
// Compute the reflected energy in a manner distinctly
// different than for AcDbRegion.
//
return pCircle->radius() * 6.21 * 42.0;
}
// This function has the user select an entity and then
// calls the reflectedEnergy() function in the protocol
// extension class attached to that entity’s class.
//
void
energy()
{
AcDbEntity *pEnt;
AcDbObjectId pEntId;
ads_name en;
ads_point pt;
if (acedEntSel("\nSelect an Entity: ", en, pt) != RTNORM)
{
acutPrintf("Nothing Selected\n");
return;
}
acdbGetObjectId(pEntId, en);
acdbOpenObject(pEnt, pEntId, AcDb::kForRead);
// call the protocol extension class’s method
//
double eTemp = ACRX_X_CALL(pEnt, AsdkEntTemperature)->reflectedEnergy(pEnt);
acutPrintf("\nEnergy == %f\n", eTemp);
pEnt->close();
}
// Pointers for protocol extension objects. These pointers
// are global so that they can be accessed during
// initialization and cleanup.
//
AsdkDefaultTemperature *pDefaultTemp;
AsdkRegionTemperature *pRegionTemp;
AsdkCircleTemperature *pCircleTemp;
// Initialization function called from acrxEntryPoint() during
// kInitAppMsg case. This function is used to add commands
// to the command stack and to add protocol extension
// objects to classes.
//
void
initApp()
{
acrxRegisterService("AsdkTemperature");
AsdkEntTemperature::rxInit();
acrxBuildClassHierarchy();
pDefaultTemp = new AsdkDefaultTemperature();
pRegionTemp = new AsdkRegionTemperature();
pCircleTemp = new AsdkCircleTemperature();
// Add the protocol extension objects to the appropriate
// AcRxClass objects.
//
AcDbEntity::desc()->addX(AsdkEntTemperature::desc(), pDefaultTemp);
AcDbRegion::desc()->addX(AsdkEntTemperature::desc(), pRegionTemp);
AcDbCircle::desc()->addX(AsdkEntTemperature::desc(), pCircleTemp);
acedRegCmds->addCommand("ASDK_TEMPERATURE_APP",
"ASDK_ENERGY", "ENERGY", ACRX_CMD_TRANSPARENT,
energy);
}
void
unloadApp()
{
delete acrxServiceDictionary->remove("AsdkTemperature");
acedRegCmds->removeGroup("ASDK_TEMPERATURE_APP");
// Remove protocol extension objects from the AcRxClass
// object tree. This must be done before removing the
// AsdkEntTemperature class from the ACRX runtime class
// hierarchy, so the AsdkEntTemperature::desc()
// still exists.
//
AcDbEntity::desc()->delX(AsdkEntTemperature::desc());
delete pDefaultTemp;
AcDbRegion::desc()->delX(AsdkEntTemperature::desc());
delete pRegionTemp;
AcDbCircle::desc()->delX(AsdkEntTemperature::desc());
delete pCircleTemp;
// Remove the AsdkEntTemperature class from the ARX
// runtime class hierarchy.
//
deleteAcRxClass(AsdkEntTemperature::desc());
}
AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
switch (msg) {
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(appId);
acrxDynamicLinker->registerAppMDIAware(appId);
initApp();
break;
case AcRx::kUnloadAppMsg:
unloadApp();
}
return AcRx::kRetOK;
}
Глава 20. Глобальные сервисные функции ObjectARX
Эта глава обсуждает некоторые общие характеристики ObjectARX глобальных сервисных функций. Для подробной информации относительно определенных функций, см. ObjectARX Ссылку.
§ Общие характеристики библиотечных функций ObjectARX
§ Переменные, Типы, и Значения, определенные в ObjectARX
§ Списки и Другие Динамически Размещенные Данные
§ Расширенные данные типы Исключительные Данные
§ Текстовые Строковые Проблемы Глобализации
Общие характеристики функций ObjectARX
Эта секция описывает некоторые общие характеристики глобальных функций в ObjectARX библиотеке. Большинство ObjectARX глобальные функции, которые работают на базе данных, переменных системы, и работе наборов выбора на текущем документе.
ОБРАТИТЕ ВНИМАНИЕ функции, описанные в этой главе были известны как функции ADS в предыдущих выпусках AutoCAD.
Сравнение вызовов глобальных функций ObjectARX и AutoLISP
Много ObjectARX глобальные функции уникален к ObjectARX среде программирования, но многие обеспечивают те же самые функциональные возможности как функции AutoLISP: они имеют то же самое имя как сопоставимая функция AutoLISP, если бы не префикс (aced, acut, и т. д.). Это подобие заставит это облегчить, чтобы преобразовать программы от AutoLISP до ObjectARX. Однако, имеются важные различия между интерпретирующей средой AutoLISP и откомпилированной средой C++.
Списки параметров в AutoLISP и C
Много встроенных функций AutoLISP принимают произвольное число параметров. Это естественно для среды LISP, но требовать, чтобы списки параметров переменной длины для каждой сопоставимой функции в ObjectARX библиотеке наложили бы бесполезную сложность. Чтобы избегать этой проблемы, простое правило применялось к библиотеке: функция ObjectARX, которая является аналогом функции AutoLISP, берет все параметры, которые функция AutoLISP берет. Где параметр необязательный в AutoLISP, в ObjectARX библиотеке специальное значение, обычно нулевой указатель, 0, или 1, можно проходить, чтобы указать, что опция не требуется.
Несколько ObjectARX библиотечные функции - исключения к этому правилу. AcutPrintf () функция подобен стандартной библиотеке для C printf () функция. Подобно стандартной версии, это осуществлено как функция variadic; то есть требуется список параметров переменной длины. AcedCommand () и acedCmd () функции более сложен. Функция команды AutoLISP не только принимает переменное число параметров различных типов, но это также принимает типы, определенные особенно для AutoCAD, типа наборов выбора и точек. Достигать той же самой гибкости в ObjectARX, acedCommand () берет список параметров переменной длины и кроме того берет параметры, чтобы определить тип значений, которые пропускают; acedCmd () требует подобного набора значений, но проходит как список связей. Поэтому, acedCommand () и acedCmd () параметры не соответствуют точно функции команды AutoLISP. Наконец, AutoLISP entget функция имеет необязательный параметр для etrieving расширенных данных. В ObjectARX, acdbEntGet () функция не имеет соответствующего параметра. Вместо этого, имеется дополнительная функция, acdbEntGetX (), если определенно для поиска расширенных данных.
Рассмотрение использования памяти
Требования памяти ObjectARX-приложения отличаются от таковых AutoLISP. С одной стороны, структуры данных, используемые программами C++ имеют тенденцию быть более компактными чем списки AutoLISP. С другой стороны, имеется довольно большой, установленный наверху для выполняющихся ObjectARX-приложений. Часть этого состоит из кода, который должен присутствовать в приложениях непосредственно; большая часть - ObjectARX библиотека.
Управление памятью
Некоторые ObjectARX глобальные функции размещают память автоматически. В большинстве случаев, приложение должно явно выпустить эту память, как будто само приложение разместило это. AutoLISP имеет автоматическую сборку "мусора", но ObjectARX делает нет.
ПРЕДУПРЕЖДЕНИЕ! Отказ делать это замедляет систему и может заставлять AutoCAD заканчиваться.
Возвращаемые значения против результатов функций
Несколько ObjectARX глобальные функции имеют пустой тип возвращения, и некоторые непосредственно возвращают их результатов, но больше всего имеют int, напечатают и возвращают целочисленный код состояния, который указывает, потерпел ли функциональный запрос, за которым следуют или неудачу.
Код RTNORM указывает, что функция преуспела; другие коды указывают неудачу или специальные условия. Библиотечные функции, которые возвращают код состояния, передают их фактических результатов (если любой) поддерживает к вызывающей программе через параметр, который пропускает ссылка.
ПРИМЕЧАНИЕ Не путает параметры результата библиотечной функции и значения с его возвращаемым значением. Функция возвращает целочисленный код состояния. Это размещает его результатов в параметры, прошел (ссылкой) назад к функции, которая вызывает это.
Рассмотрите следующие смоделированные объявления для нескольких типичных функций ObjectARX:
int acdbEntNext(ads_name ent, ads_name result);
int acedOsnap(ads_point pt, char *mode, ads_point result);
int acedGetInt(char *prompt, int *result);
Приложение могло вызывать эти функции со следующими инструкциями C++:
stat = acdbEntNext(ent, entres);
stat = acedOsnap(pt, mode, ptres);
stat = acedGetInt(prompt, &intres);
После того, как каждая функция вызвана, значение stat переменной указывает или успех (stat == RTNORM) или неудачу (stat == RTERROR или другой код ошибки, типа RTCAN для отмены). Последний параметр в каждом списке - параметр результата, который нужно пропустить ссылкой. Если успешно, acdbEntNext() возвращает имя примитива в его entres параметре, acedOsnap() возвращает точку в ptres, и acedGetInt() возвращается, целое число приводит к intres. (Типы ads_name и ads_point - типы массива, который является, почему entres и ptres параметры явно не появляются как указатели.)
ОБРАТИТЕ ВНИМАНИЕ В ObjectARX глобальных функциональных объявлениях параметры результата всегда следуют за параметрами, которые передают входные значения к функции.
Внешние Функции
Как только ObjectARX-приложение определило его внешние функции (вызыв acedDefun ()), функции могут быть вызваны пользователем AutoLISP и программами AutoLISP и функциями, как будто они были встроенные или определяемые пользователем функции AutoLISP. Внешняя функция может быть, пропускал значения AutoLISP и переменные, и может возвращать значение выражению AutoLISP, которое вызывает это.
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


