///////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2002-2016, Open Design Alliance (the "Alliance").
// All rights reserved.
//
// This software and its documentation and related materials are owned by
// the Alliance. The software may only be incorporated into application
// programs owned by members of the Alliance, subject to a signed
// Membership Agreement and Supplemental Software License Agreement with the
// Alliance. The structure and organization of this software are the valuable
// trade secrets of the Alliance and its suppliers. The software is also
// protected by copyright law and international treaty provisions. Application
// programs incorporating this software must include the following statement
// with their copyright notices:
//
// This application incorporates Teigha(R) software pursuant to a license
// agreement with Open Design Alliance.
// Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance.
// All rights reserved.
//
// By use of this software, its documentation or related materials, you
// acknowledge and accept the above terms.
///////////////////////////////////////////////////////////////////////////////
#ifndef _ODRXOBJECT_INCLUDED_
#define _ODRXOBJECT_INCLUDED_ /* { Secret } *//
#include "TD_PackPush.h"
#include "RootExport.h"
#include "OdHeap.h"
#include "OdArrayPreDef.h"
#include "OdString.h"
#include "BaseObjectPtr.h"
class OdRxClass;
class OdRxModule;
/** \details
Callback function providing ability for custom class to alter its application name
depending on file format version drawing is saved to.
\remarks
Effects only application name saved to file.
*/
typedef void (*AppNameChangeFuncPtr)(const OdRxClass* classObj, OdString& newAppName, int saveVer);
/** \details
Suppresses the incrementing of the reference counter.
\remarks
The option is used for creating of smart pointers that refer to the classes derived from OdRxObject.
The option can be specified as an argument for the constructor of the OdSmartPtr class or OdRxObjectPtr class.
\sa
*/
enum OdRxObjMod { kOdRxObjAttach };
#define ODRX_DECLARE_MEMBERS_GENERIC(ClassType, ClassName)\
public: \
\
/** Casts the specified pointer to an ClassName SmartPointer. **/ \
static OdSmartPtr cast(const OdRxObject* pObj) \
{ \
if (pObj) \
return OdSmartPtr(((ClassName*)pObj->queryX(ClassName::desc())), kOdRxObjAttach); \
return (ClassName*)0; \
} \
\
static ClassType* g_pDesc; \
\
/** Returns the static ClassType description object associated with this object. **/ \
/** This function is for use only when the class type of this object is known. **/ \
/** If the class type of this object is unknown, use instead isA(). **/ \
static ClassType* desc(); \
\
/** Returns the ClassType description instance associated with this object. **/ \
/** This function is for use only when the class type of this object is unknown. **/ \
/** If the class type of this object is known, use instead desc(). **/ \
virtual ClassType* isA() const; \
\
/** Returns the Protocol Extension object for this object. **/ \
/** Return null if there is no Protocol Extension object is found. **/ \
virtual OdRxObject* queryX(const OdRxClass* protocolClass) const; \
\
/** Creates a new instance of this object type. **/ \
/** Returns a SmartPointer to the new instance. **/ \
static OdRxObjectPtr pseudoConstructor(); \
\
/** Creates a new instance of this object type. **/ \
/** Returns a SmartPointer to the new instance. **/ \
static OdSmartPtr createObject() \
{ if (!desc()) throw OdError(eNotInitializedYet); return desc()->create(); } \
\
/** Registers ClassName with Teigha. **/ \
static void rxInit(); \
static void rxInit(AppNameChangeFuncPtr appNameChangeFunc); \
\
/* Unregisters ClassName with Teigha. **/ \
static void rxUninit()
/** \details
Declares the RunTime Type Identification methods required by OdRxObject objects.
\remarks
Any class derived from OdRxObject should include this macro in its class declarations,
passing its own name.
\sa
*/
#define ODRX_DECLARE_MEMBERS(ClassName)\
ODRX_DECLARE_MEMBERS_GENERIC(OdRxClass, ClassName)
/** \details
Defines the /empty constructor/ and casts a null pointer for the specified class.
\sa
*/
#define EMPTY_CONSTR(ClassName)(ClassName*)0
/** \details
Defines the /pseudo-constructor/ for the specified class that creates a new instance, creates a smart pointer to it,
does not increment its reference counter, and returns a smart pointer to the instance.
\remarks
The reference counter of a new instance is set to a default value.
\sa
*/
#define NEWOBJ_CONSTR(ClassName) OdSmartPtr(new ClassName, kOdRxObjAttach)
#define ODRX_DEFINE_RTTI_MEMBERS_GENERIC(ClassType, ClassName, ParentClass) \
\
ClassType* ClassName::g_pDesc = 0; \
ClassType* ClassName::desc() { return g_pDesc; } \
ClassType* ClassName::isA() const { return g_pDesc; } \
\
OdRxObject* ClassName::queryX(const OdRxClass* pClass) const { \
return ::odQueryXImpl(this, pClass); \
}
/** \details
Defines Runtime Type Identification functions for OdRxObject objects.
\sa
*/
#define ODRX_DEFINE_RTTI_MEMBERS(ClassName, ParentClass) \
ODRX_DEFINE_RTTI_MEMBERS_GENERIC(OdRxClass, ClassName, ParentClass)
#define ODRX_DEFINE_INIT_MEMBERS_GENERIC(ClassName, CREATE_CLASS_INSTANCE, CREATE_CLASS_INSTANCE2) \
\
/* Registers this class with Teigha. */ \
void ClassName::rxInit() \
{ \
if (!ClassName::g_pDesc) { \
ClassName::g_pDesc = CREATE_CLASS_INSTANCE; \
} else { \
ODA_ASSERT(("Class ["#ClassName"] is already initialized.",0)); \
throw OdError(eExtendedError); \
} \
} \
void ClassName::rxInit(AppNameChangeFuncPtr pAppNameChangeCallback) \
{ \
if (!ClassName::g_pDesc) { \
ClassName::g_pDesc = CREATE_CLASS_INSTANCE2; \
} else { \
ODA_ASSERT(("Class ["#ClassName"] is already initialized.",0)); \
throw OdError(eExtendedError); \
} \
} \
\
/* Unregisters this class with Teigha. */ \
void ClassName::rxUninit() \
{ \
if (ClassName::g_pDesc) { \
::deleteOdRxClass(ClassName::g_pDesc); \
ClassName::g_pDesc = 0; \
} else { \
ODA_ASSERT(("Class ["#ClassName"] is not initialized yet.",0)); \
throw OdError(eNotInitializedYet); \
} \
}
/** \details
Defines the registering and unregistering functions.
\sa
*/
#define ODRX_DEFINE_INIT_MEMBERS(ClassName, ParentClass, pseudoConsFn, DwgVer, \
MaintVer, nProxyFlags, szDWGClassName, \
szDxfName, szAppName, nCustomFlags) \
ODRX_DEFINE_INIT_MEMBERS_GENERIC( \
ClassName, \
(::newOdRxClass(szDWGClassName, ParentClass::desc(), pseudoConsFn, DwgVer, \
MaintVer, nProxyFlags, szDxfName, szAppName, NULL, nCustomFlags)), \
(::newOdRxClass(szDWGClassName, ParentClass::desc(), pseudoConsFn, DwgVer, \
MaintVer, nProxyFlags, szDxfName, szAppName, pAppNameChangeCallback, nCustomFlags)))
/** \details
Defines a /pseudo-constructor/ for the specified /class name/.
\sa
*/
#define ODRX_DEFINE_PSEUDOCONSTRUCTOR(ClassName,DOCREATE) \
\
OdRxObjectPtr ClassName::pseudoConstructor() { return OdRxObjectPtr(DOCREATE(ClassName)); }
/** \details
Defines Runtime Type Identification and initialization functions for OdRxObject objects.
\sa
*/
#define ODRX_DEFINE_MEMBERS2(ClassName,ParentClass,pseudoConsFn,DwgVer,MaintVer,nProxyFlags,szDWGClassName,szDxfName,szAppName,nCustomFlags) \
\
ODRX_DEFINE_RTTI_MEMBERS(ClassName,ParentClass) \
\
ODRX_DEFINE_INIT_MEMBERS(ClassName,ParentClass,pseudoConsFn, \
DwgVer,MaintVer,nProxyFlags,szDWGClassName,szDxfName,szAppName,nCustomFlags)
#define ODRX_DEFINE_MEMBERS(ClassName,ParentClass,DOCREATE,DwgVer,MaintVer,nProxyFlags,szDWGClassName,szDxfName,szAppName)\
\
ODRX_DEFINE_MEMBERS2(ClassName,ParentClass,ClassName::pseudoConstructor, \
DwgVer,MaintVer,nProxyFlags,szDWGClassName,szDxfName,szAppName,0) \
\
ODRX_DEFINE_PSEUDOCONSTRUCTOR(ClassName,DOCREATE)
#define ODRX_DEFINE_MEMBERS_EX(ClassName,ParentClass,DOCREATE,DwgVer,MaintVer,nProxyFlags,szDWGClassName,szDxfName,szAppName,nCustomFlags)\
\
ODRX_DEFINE_MEMBERS2(ClassName,ParentClass,ClassName::pseudoConstructor, \
DwgVer,MaintVer,nProxyFlags,szDWGClassName,szDxfName,szAppName,nCustomFlags) \
\
ODRX_DEFINE_PSEUDOCONSTRUCTOR(ClassName,DOCREATE)
#define ODRX_NO_CONS_DEFINE_MEMBERS_ALTNAME(ClassName,ParentClass,szClassName) \
\
ODRX_DEFINE_MEMBERS2(ClassName,ParentClass,0,0,0,0,szClassName,OdString::kEmpty,OdString::kEmpty,0) \
\
ODRX_DEFINE_PSEUDOCONSTRUCTOR(ClassName,EMPTY_CONSTR)
#define ODRX_NO_CONS_DEFINE_MEMBERS(ClassName,ParentClass) \
\
ODRX_NO_CONS_DEFINE_MEMBERS_ALTNAME(ClassName,ParentClass,OD_T(#ClassName))
#define ODRX_CONS_DEFINE_MEMBERS_ALTNAME(ClassName,ParentClass,szClassName,DOCREATE) \
\
ODRX_DEFINE_MEMBERS2(ClassName,ParentClass,ClassName::pseudoConstructor,0,0,0,szClassName,OdString::kEmpty,OdString::kEmpty,0) \
\
ODRX_DEFINE_PSEUDOCONSTRUCTOR(ClassName,DOCREATE)
#define ODRX_CONS_DEFINE_MEMBERS(ClassName,ParentClass,DOCREATE) \
\
ODRX_CONS_DEFINE_MEMBERS_ALTNAME(ClassName,ParentClass,OD_T(#ClassName),DOCREATE)
#define ODRX_DXF_DEFINE_MEMBERS(ClassName,ParentClass,DOCREATE,DwgVer,MaintVer, nProxyFlags,DxfName,AppName) \
\
ODRX_DEFINE_MEMBERS(ClassName,ParentClass,DOCREATE, \
DwgVer,MaintVer,nProxyFlags,OD_T(#ClassName),OD_T(#DxfName),OD_T(#AppName))
#define ODRX_DXF_CONS_DEFINE_MEMBERS(ClassName,ParentClass,DwgVer,MaintVer,nProxyFlags,DxfName,AppName) \
\
ODRX_DEFINE_MEMBERS2(ClassName,ParentClass,ClassName::pseudoConstructor, \
DwgVer,MaintVer,nProxyFlags,OD_T(#ClassName),OD_T(#DxfName),OD_T(#AppName),0) \
\
ODRX_DEFINE_PSEUDOCONSTRUCTOR(ClassName,NEWOBJ_CONSTR)
/** \details
*/
namespace OdRx
{
enum Ordering
{
kLessThan =-1, // This object < Specified Object
kEqual = 0, // This object == Specified Object
kGreaterThan = 1, // This object > Specified Object
kNotOrderable = 2 // These objects cannot be ordered.
};
enum MTSupport
{
kMTRender = 0x01, // worldDraw() or viewportDraw() calls from different threads are allowed
// for highest level (MS or PS), elsewhere they should always happen
// in one dedicated thread.
kMTRenderInBlock = 0x02, // Calls to worldDraw() or viewportDraw() methods from different threads are allowed
// if the drawable is located inside a block (compound object).
kMTRenderNested = 0x04, // worldDraw() or viewportDraw() from different threads are allowed for
// nested drawables of this compound object.
kMTRenderReserved = 0x08, // Reserved for future use.
kMTRenderMask = 0x0f, // Combination of all MTRender-dependent flags.
kMTLoading = 0x80, // Multithread loading is supported for this object.
kHistoryAware = 0x100 // The information written by the object to the undo filer can be saved in the history file (is valid between sessions)
};
}
/** \details
This class provides the non-typified implementation of smart pointers for instances of classes derived from the OdRxObject class.
\sa
TD_Db
\remarks
SmartPointers relieve the programmer of having to determine when objects are no longer needed, or having to delete
them at that time.
Each object referenced by a SmartPointer (henceforth 'referenced object')
maintains a reference count; i.e., how many SmartPointers are referencing it.
When the reference counter reaches zero, the referenced object is deleted.
\sa
\sa
The OdSmartPtr class
*/
class OdRxObjectPtr : public OdBaseObjectPtr
{
/** \details
Increments the reference counter of the referenced object.
*/
inline void internalAddRef();
/** \details
Assigns the pointer of the specifed object to the smart pointer.
\remarks
The reference counter of the specified object is incremented.
If this SmartPointer is currently referencing another object, that object
is released prior to the assignment.
\param pObject [in] Pointer to the specified object to be assigned.
*/
void assign(
const OdRxObject* pObject)
{
if (m_pObject != pObject) // To prevent reference counter dec/inc which
{ // may cause object destruction or subClose
release();
m_pObject = (OdRxObject*)pObject;
internalAddRef();
}
}
public:
/** \details
Constructors for the non-typified smart pointer.
\param pSource [in] Pointer to the specified object to be assigned for the new SmartPointer object.
\remarks
If pSourceis specified, the smart pointer is set to the address of the specified object. If pSource is not specified, the smart pointer is set to a NULL.
\remarks
If OdRxObjMod is specified, the reference counter of the specified object
is *not* incremented.
*/
OdRxObjectPtr() : OdBaseObjectPtr() { }
OdRxObjectPtr(
const OdRxObject* pSource,
OdRxObjMod)
: OdBaseObjectPtr(pSource)
{
}
OdRxObjectPtr(
const OdRxObject* pSource)
: OdBaseObjectPtr(pSource)
{
internalAddRef();
}
OdRxObjectPtr(
const OdRxObjectPtr& pSource)
: OdBaseObjectPtr(pSource.get())
{
internalAddRef();
}
OdRxObjectPtr(
const OdBaseObjectPtr& pSource)
: OdBaseObjectPtr(pSource.get())
{
internalAddRef();
}
/** \details
Assigns the pointer of the specifed object to the smart pointer without incrementing its reference counter.
\param pObject [in] Pointer to the specified object to be assigned.
\remarks
The reference count of the specified object is not incremented.
If this SmartPointer is currently referencing another object, that object
is released prior to the assignment.
\sa
*/
void attach(
const OdRxObject* pObject) { release(); m_pObject = (OdRxObject*)pObject; }
/** \details
Destructor for the non-typified smart pointer.
\remarks
Decrements the reference counter of the referenced object. When the reference count reaches zero, the referenced object is deleted.
*/
~OdRxObjectPtr()
{
release();
}
/** \details
Releases the smart pointer reference to the referenced object.
\remarks
Decrements the reference counter of the referenced object. When the reference count reaches zero,
the referenced object is deleted. Smart pointer is set to a NULL.
\sa
*/
inline void release();
/** \details
Releases the smart pointer reference to the referenced object without decrementing of the reference counter.
\remarks
Returns the raw pointer to the referenced object. The reference counter is not modified
for the referenced object. Smart pointer is set to a NULL.
\sa
*/
OdRxObject* detach()
{
OdRxObject* res = m_pObject;
m_pObject = 0;
return res;
}
/** \remarks
The assignment operator increments the reference counter of the referenced object and saves its address in the smart pointer.
If the smart pointer is currently referencing to another object, that assignment operator releases the referenced object prior
to the assignment.
\sa
*/
OdRxObjectPtr& operator = (
const OdRxObjectPtr& source)
{ assign(source); return *this; }
OdRxObjectPtr& operator = (
const OdRxObject* source)
{ assign(source); return *this; }
OdRxObjectPtr& operator = (
const OdBaseObjectPtr& source)
{ assign(source.get()); return *this; }
/** \details
Returns the raw pointer to the referenced object.
\remarks
The smart pointer maintains its reference to the referenced object.
The reference counter of the referenced object is not changed.
\sa
*/
OdRxObject* get() { return m_pObject; }
const OdRxObject* get() const { return m_pObject; }
/** \details
Returns the raw pointer to the referenced object.
\remarks
The reference counter of the referenced object is not changed.
\sa
*/
OdRxObject* operator ->() { return m_pObject; }
const OdRxObject* operator ->() const { return m_pObject; }
#ifdef ODA_GCC_2_95
/** \details
Returns the raw pointer to the referenced object.
\remarks
The class maintains the reference to the referenced object.
The reference counter of the referenced object is not changed.
This non-standard form is used to eliminate a large number of compiler
warnings produced by GCC 2.95.X (GCC 3.X no longer produces these warnings).
*/
operator OdRxObject*() const { return m_pObject; }
#else
/** \details
Returns the raw pointer of the referenced object.
\remarks
The reference counter of the referenced object is not changed.
*/
operator OdRxObject*() { return m_pObject; }
operator const OdRxObject*() const { return m_pObject; }
#endif
bool operator==(
const OdRxObject* pObject) const { return (m_pObject==pObject); }
bool operator!=(
const OdRxObject* pObject) const { return (m_pObject!=pObject); }
};
/** \details
This class is the base class for all OdRxObject objects that
require Runtime Type Identification.
\sa
*/
class ODRX_ABSTRACT FIRSTDLL_EXPORT OdRxObject
{
/** \details
Constructor for this class that assigns another Rx-object.
*/
OdRxObject(const OdRxObject&);
/** \details
Assignment operator prohibited.
*/
OdRxObject& operator = (const OdRxObject&);
protected:
/** \details
Protects derived OdRxObject objects from direct use of new and delete operators.
*/
ODRX_HEAP_OPERATORS();
public:
/** \details
Default constructor for this class.
*/
OdRxObject() { }
/** \details
The virtual destructor for this class.
*/
virtual ~OdRxObject();
/** \details
Checks whether the object belongs to the specified class and returns a pointer to
this object if this object can be converted to the specified class.
\param pClass [in] /Raw pointer/ to the /class describing instance/ to which the object must be converted.
\remarks
If the object cannot be converted, the method returns a Null.
The program must /release/ this object, if the returned pointer is not Null.
\sa
\sa
*/
virtual OdRxObject* queryX(
const OdRxClass* pClass) const;
/** \details
Checks whether the object belongs to the specified class and returns a pointer to
this object if this object can be converted to the specified class, or throws an exception if it cannot.
\param pClass [in] /Raw pointer/ to the /class describing instance/ to which the object must be converted.
\remarks
This method generates the eNotThatKindOfClass exception when the object can be not converted to the specified class.
This method generates the eInvalidInput exception when the argument pClass is Null. This method uses the queryX() method.
\sa
\sa
*/
virtual OdRxObject* x(
const OdRxClass* pClass) const;
/** \details
Casts the specified /raw pointer/ to the /smart pointer/.
\param pointer [in] /Raw pointer/ to be cast.
*/
static OdRxObjectPtr cast(
const OdRxObject* pointer)
{
OdRxObjectPtr pRes;
if (pointer)
pRes.attach(pointer->queryX(desc()));
return pRes;
}
/** \details
Returns the /raw pointer/ to the /class describing instance/ statically associated with this object
as the OdRxClass object.
\remarks
This function is for use only when the class type of this object is known.
If the class type of this object is unknown, use isA() method instead.
\sa
\sa
*/
static OdRxClass* desc();
/** \details
Returns the /raw pointer/ to the /class describing instance/ dynamically associated with this object
as the OdRxClass object.
\remarks
This function is for use only when the class type of this object is unknown.
If the class type of this object is known, use desc() method instead.
\sa
\sa
*/
virtual OdRxClass* isA() const;
/** \details
Declares the method incrementing the reference counter in objects derived from this class.
\remarks
It is the pure virtual method that does not have an implementation. You must redefine it in the derived class.
\sa
*/
virtual void addRef() = 0;
/** \details
Declares the method decrementing the reference counter in objects derived from this class.
\remarks
It is the pure virtual method that does not have an implementation. You must redefine it in the derived class.
\sa
*/
virtual void release() = 0;
/** \details
Returns the value of the reference counter, that is, the number of references to an instance of this class.
\remarks
This method has the default implementation that returns 1. You shloud redefine it in the derived class.
\sa
*/
virtual long numRefs() const;
/** \details
Checks whether the object belongs to the specified class and
returns true if and only if this object is an instance of the specified class or
a subclass of the specified class.
\param pClass [in] /Raw pointer/ to the /class describing instance/ to be checked.
\sa
\sa
*/
bool isKindOf(
const OdRxClass* pClass) const
{
OdRxObjectPtr pRes;
pRes.attach(queryX(pClass));
return (!pRes.isNull());
}
/** \details
Creates a *clone* of this object, and returns a pointer to the *clone*.
*/
virtual OdRxObjectPtr clone() const;
/** details
Copies the contents of the specified object into this object.
\param pSource [in] Pointer to the source object.
\remarks
The default implementation of this function does nothing but throw an eNotApplicable exception.
Throws:
eNotApplicable Exception
*/
virtual void copyFrom(
const OdRxObject* pSource);
/** \details
Compares another object to this one in a some meaning.
\param pOther [in] /Raw pointer/ to the object to be compared.
\remarks
This method returns one of the following:
Name Value Description
_kLessThan_ -1 This object < Other Object.
_kEqual_ 0 This object = Other Object.
_kGreaterThan_ 1 This object > Other Object.
_kNotOrderable_ 2 This class is not orderable.
\remarks
The default implementation of this method returns _kNotOrderable_.
\sa
\sa
*/
virtual OdRx::Ordering comparedTo(
const OdRxObject* pOther) const;
/** \details
Returns true if and only if the specified object is equal to this one in a some meaning.
\param pOther [in] /Raw pointer/ to the object to be compared.
\sa
\sa
*/
virtual bool isEqualTo(
const OdRxObject* pOther) const;
};
void OdRxObjectPtr::internalAddRef()
{
if(m_pObject) { m_pObject->addRef(); }
}
void OdRxObjectPtr::release()
{
if (m_pObject)
{
m_pObject->release();
m_pObject = NULL;
}
}
#include "SmartPtr.h"
/** \details
Defines OdPseudoConstructorType as a function pointer type.
\remarks
Functions pointed to by OdPseudoConstructorType
take no arguments and construct instances of
classes derived from OdRxObject;
hence the name PseudoConstructorType.
*/
typedef OdRxObjectPtr (*OdPseudoConstructorType)();
/** \details
Contains runtime information about a Rx-Object.
\remarks
A pointer to an OdRxClass instance can be obtained for an OdRxObject class by calling
the OdRxObject::desc() function.
\sa
*/
class ODRX_ABSTRACT FIRSTDLL_EXPORT OdRxClass : public OdRxObject
{
protected:
OdRxClass();
public:
ODRX_DECLARE_MEMBERS(OdRxClass);
/** \details
Creates the Protocol Extension for the specified OdRxClass.
\param pProtocolClass [in] Pointer to the Protocol Extension class.
\param pProtocolObject [in] Pointer to the Protocol Extension Object.
\remarks
Returns a SmartPointer to the Protocol Extension.
\note
The default implementation of this object does nothing but return a
null pointer, and asserts in debug mode. It will be
fully implemented in a future *release*.
*/
virtual OdRxObjectPtr addX(
OdRxClass* pProtocolClass,
OdRxObject* pProtocolObject);
/** \details
Returns the Protocol Extension for the specified
Protocol extension class.
\param pProtocolClass [in] Pointer to the Protocol Extension class.
\remarks
Returns a SmartPointer to the Protocol Extension.
\note
The default implementation of this object does nothing but
assert in debug mode, and return a null pointer.
It will be fully implemented in a future *release*.
*/
virtual OdRxObjectPtr getX(
const OdRxClass* pProtocolClass);
/** \details
Deletes the Protocol Extension for the specified Protocol Extension class.
\remarks
Returns the Protocol Extension Object.
\param pProtocolClass [in] Pointer to the Protocol Extension class.
\note
As currently implemented, this function does nothing but
assert in debug mode, and return a null pointer.
It will be fully implemented in a future *release*.
*/
virtual OdRxObjectPtr delX(
OdRxClass* pProtocolClass);
/** \details
Creates a new instance of the class associated with the /class describing instance/
using the /pseudo-constructor/ of the class.
\remarks
Returns a /smart pointer/ to the newly created instance.
\sa
\sa
*/
virtual OdRxObjectPtr create() const = 0;
/** \details
Returns the /application class name/ for the /class describing instance/ represented by this
OdRxClass object. Custom class can alter its application name depending on file format version
it's being saved to.
\sa
\sa
*/
virtual const OdString appName() const = 0;
/** \details
Returns a pointer to the callback function which is called when a drawing is to be saved and
the logical /application class name/ represented by the /class description instance/ to be written
out to file for the custom class, or NULL, if the callback function is not assigned.
\sa
*/
virtual AppNameChangeFuncPtr appNameCallbackPtr() const = 0;
/** \details
Returns the /DXF class name/ for the /class describing instance/ represented by this OdRxClass object.
\sa
\sa
*/
virtual const OdString dxfName() const = 0;
/** \details
Returns the /class name/ for the /class describing instance/ represented by this OdRxClass object.
\sa
\sa
*/
virtual const OdString name() const = 0;
/** \details
Returns the .dwg file version and maintenance version for the /class describing instance/
represented by this OdRxClass object.
\param pMaintReleaseVer [in] /Raw pointer/ to the variable in which the maintenance version number
must be saved. This variable must have the OdDb::MaintReleaseVer type.
\remarks
The .dwg file version number is returned value of the method that must have the OdDb::DwgVersion type.
This method returns the /maintenance release version/ if and only if its argument is not Null.
\sa
\sa
*/
virtual OdDb::DwgVersion getClassVersion(
OdDb::MaintReleaseVer* pMaintReleaseVer = 0) const = 0;
/** \details
Returns the /proxy flags/ for the /class describing instance/ represented by this OdRxClass object.
\sa
\sa
*/
virtual OdUInt32 proxyFlags() const = 0;
/** \details
Checks whether the /class/ defined by this /class describing instance/ belongs to or
derived from the specified class. The method returns true if and only if this object is
an instance of the specified class or a subclass of the specified class.
\param pClass [in] /Raw pointer/ to the /class describing instance/ to be checked.
\sa
\sa
*/
virtual bool isDerivedFrom(
const OdRxClass* pClass) const;
/** \details
Returns the /raw pointer/ to the /class describing instance/ which describes
the parent class for this class as the OdRxClass object.
\sa
\sa
*/
virtual OdRxClass* myParent() const = 0;
/** \details
Returns the OdRxModule object in which the class is resided.
\note
The default implementation of this function returns a Null pointer.
\sa
\sa
*/
virtual OdRxModule* module() const = 0;
/** \details
Returns the /raw pointer/ to the function that is the /pseudo-constructor/ for this class.
\sa
\sa
*/
virtual OdPseudoConstructorType constructor();
/** \details
Sets the user-defined function as the /pseudo-constructor/ for this class.
\param pseudoConstr [in] /Raw pointer/ to the user-defined function that does not have arguments
and returns the /smart pointer/ to a new instance of this class.
\sa
\sa
*/
virtual void setConstructor(
OdPseudoConstructorType psuedoConstr) = 0;
/** \details
Returns the /custom flags/ for the /class describing instance/ represented by this OdRxClass object.
\sa
\sa
*/
virtual OdUInt32 customFlags() const = 0;
};
/** \details
This template class is a specialization of the OdSmartPtr class template for OdRxClass object pointers.
\sa
*/
typedef OdSmartPtr OdRxClassPtr;
template
OdRxObject* odQueryXImpl(const Class* pThis, const OdRxClass* pClass)
{
ODA_ASSERT(pClass!=0); // if you get here, most likely requested class is not registred
OdRxObject* pObj = 0;
if(pClass == Class::desc())
{
pObj = (OdRxObject*)pThis;
pObj->addRef();
}
else
{
pObj = Class::desc()->getX(pClass).detach();
if(!pObj)
pObj = pThis->Parent::queryX(pClass);
}
return pObj;
}
/** \details
This external function creates a new instance of the class specified by the argument as a string
and returns a /non-typified smart pointer/ to it.
\param sClassName [in] /Custom class name/ as a string.
*/
FIRSTDLL_EXPORT OdRxObjectPtr odrxCreateObject(
const OdString& sClassName);
/** \details
This external function creates a new /class description instance/ with specified parameters and
returns a /raw pointer/ to it.
\param sClassName [in] /Custom class name/ as a string.
\param pBaseClass [in] A pointer to an existing /class description instance/ which is the parent class.
\param pConstr [in] A pointer to the pseudo-constructor function.
\param DwgVer [in] dwg-version number.
\param MaintVer [in] Maintain version number.
\param nProxyFlags [in] Mask of the proxy flags.
\param sDxfName [in] dxf-class name.
\param sAppName [in] Application class name.
\param fNameChangeFunc [in] A pointer to the callback function which is called when the registered object is to be saved.
\param nCustomFlags [in] Mask of the custom flags.
\sa
*/
FIRSTDLL_EXPORT OdRxClass* newOdRxClass(
const OdString& sClassName,
OdRxClass* pBaseClass,
OdPseudoConstructorType pConstr = 0,
int DwgVer = 0,
int MaintVer = 0,
int nProxyFlags = 0,
const OdString& sDxfName = OdString::kEmpty,
const OdString& sAppName = OdString::kEmpty,
AppNameChangeFuncPtr fNameChangeFunc = NULL,
int nCustomFlags = 0
);
/** \details
This external function deletes a class description instance.
\param pClass [in] /Raw pointer/ to an existing class description instance.
*/
FIRSTDLL_EXPORT void deleteOdRxClass(
OdRxClass* pClass);
/** \details
This template class is a specialization of the OdArray class template for OdRx object pointers.
*/
typedef OdArray OdRxObjectPtrArray;
/** \details
This registration allows you to catch the invoking of each RxObject destructor.
*/
typedef void (*ODRXOBJECT_CALLBACK)(const OdRxObject*);
FIRSTDLL_EXPORT void odrxRegisterDestructorCallback(const ODRXOBJECT_CALLBACK callbackFunc);
FIRSTDLL_EXPORT void odrxUnregisterDestructorCallback();
#include "TD_PackPop.h"
#endif //_ODRXOBJECT_INCLUDED_