Этот пример расширения протокола разделен на три части:
§
Объявление и определение четырех классов расширения протокола: 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;