Classe de Inicialização ( Função de Inicialização)
IX. Derivando de AcDbObject
Para implementar uma classe customizada, tem-se tres macros:
ACRX_NO_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS)
Usa-se para classes abstratas e qualquer outra classe que não deve ser instanciada.
ACRX_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS, VERNO)
Usa-se para classes transientes que podem ser instanciadas, mas não escritas em arquivo.
ACRX_DXF_DEFINE_MEMBERS(CLASS_NAME,PARENT_CLASS,
PROXY_FLAGS, DXF_NAME, APP)
Usa-se para classes que podem ser escritas, ou lidas de arquivos DWG e DXF. Cada uma dessas classes define:
Classe de descrição do objeto;
Classe inicialização (função);
A função desc( ) para a classe;
A função virtual isA( ) que a classe deverá sobrecarregar.
Classe de Inicialização ( Função de Inicialização)
A função da classe de inicialização para cada classe é rxInit( ). Uma aplicação que define uma classe customizada invoca essa função durante a inicialização da rotina.
Essa função é definida automaticamente por cada das tres macros
ACRX_XXX_DEFINE_MEMBERS( ) e executa as seguintes tarefas:
Registra a classe customizada;
Cria a classe que descreve o objeto e armazena no dicitonary;
IX.
Derivando de AcDbObject
Essa sessão descreve como derivar uma classe customizada de AcDbObject. Fornece detalhes sobre os arquivos, sobre os quatro tipos de objetos referênciados, sobre o undo e o redo.
Overview
Quando se utiliza subclasses de AcDbObject, há um número de funções virtuais que podem ser sobrecarregadas.
AcDbObject: Funções para Sobrecarregar Essencialmente
virtual Acad::ErrorStatus
dwgInFields(AcDbDwgFiler* filer); virtual Acad::ErrorStatus
dwgOutFields(AcDbDwgFiler* filer) const; virtual Acad::ErrorStatus
dxfInFields(AcDbDxfFiler* filer); virtual Acad::ErrorStatus
dxfOutFields(AcDbDxfFiler* filer) const;
<Destructor>
AcDbObject: Funções para Sobrecarregar Frequentemente
virtual Acad::ErrorStatus audit(AcDbAuditInfo*);
virtual Acad::ErrorStatus subClose(); virtual Acad::ErrorStatus
deepClone(AcDbObject* pOwnerObject, AcDbObject*& pClonedObject, AcDbIdMapping& idMap,
Adesk::Boolean isPrimary = Adesk::kTrue) const; virtual Acad::ErrorStatus
wblockClone(AcRxObject* pOwnerObject, AcDbObject*& pClonedObject, AcDbIdMapping& idMap,
Adesk::Boolean isPrimary = Adesk::kTrue) const;
AcDbObject: Funções para Sobrecarregar Eventualmente
subErase(Adesk::Boolean erasing); virtual Acad::ErrorStatus subHandOverTo(AcDbObject* newObject); virtual Acad::ErrorStatus subOpen(AcDb::OpenMode); virtual Acad::ErrorStatus subCancel(); virtual Acad::ErrorStatus subSwapIdWith(AcDbObjectId otherId,
Adesk::Boolean swapXdata = Adesk::kFalse);
AcDbObject: Funções para Sobrecarregar Raramente
virtual Acad::ErrorStatus setOwnerId(AcDbObjectId); virtual resbuf*
xData(const char* regappName = NULL) const; virtual Acad::ErrorStatus
setXData(const resbuf* xdata); virtual void
addPersistentReactor(AcDbObjectId objId); virtual Acad::ErrorStatus
removePersistentReactor(AcDbObjectId objId); virtual void
cancelled(const AcDbObject* dbObj); virtual void
copied(const AcDbObject* dbObj, const AcDbObject* newObj); virtual void
erased(const AcDbObject* dbObj,
Adesk::Boolean pErasing = Adesk::kTrue); virtual void
goodbye(const AcDbObject* dbObj); virtual void
openedForModify(const AcDbObject* dbObj); virtual void
modified(const AcDbObject* dbObj); virtual void
modifyUndone(const AcDbObject* dbObj); virtual void
modifiedXData(const AcDbObject* dbObj); virtual void
unappended(const AcDbObject* dbObj); virtual void
objectClosed(const AcDbObjectId objId); virtual void
modifiedGraphics(const AcDbEntity* dbEnt);
AcRxObject: Funções para Sobrecarregar Raramente
virtual AcRxObject* clone() const;
virtual void
copyFrom(const AcRxObject* pSrc); virtual HRESULT __stdcall
QueryInterface ( REFIID riid, void ** ppvObject ); virtual ULONG __stdcall
virtual ULONG __stdcall Release();
AcDbEntity: Funções para Sobrecarregar
virtual Adesk::Boolean
worldDraw(AcGiWorldDraw* mode); virtual void
viewportDraw(AcGiViewportDraw* mode); virtual Acad::ErrorStatus
getGeomExtents(AcDbExtents& extents) const; virtual Acad::ErrorStatus
transformBy(const AcGeMatrix3d& xform); virtual Acad::ErrorStatus
getTransformedCopy(const AcGeMatrix3d& xform, AcDbEntity*& ent) const; virtual Acad::ErrorStatus
getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const; virtual Acad::ErrorStatus
moveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset);
AcDbEntity: Funções para Sobrecarregar Usualmente
virtual void list() const;
virtual Acad::ErrorStatus
intersectWith( const AcDbEntity* ent, AcDb::Intersect intType,
AcGePoint3dArray& points, int thisGsMarker = 0,
int otherGsMarker = 0) const; virtual Acad::ErrorStatus
intersectWith( const AcDbEntity* ent, AcDb::Intersect intType, const AcGePlane& projPlane,
AcGePoint3dArray& points, int thisGsMarker = 0,
int otherGsMarker = 0) const; virtual Acad::ErrorStatus
getOsnapPoints(AcDb::OsnapMode osnapMode, int gsSelectionMark,
const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus
getStretchPoints(AcGePoint3dArray&) const; virtual Acad::ErrorStatus
moveStretchPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset);
virtual Acad::ErrorStatus
explode(AcDbVoidPtrArray& entitySet) const; virtual Acad::ErrorStatus
int gsMark,
const AcGePoint3d& pickPoint,
const AcGeMatrix3d& viewXform, int& numPaths,
AcDbFullSubentPath* & subentPaths, int numInserts = 0,
AcDbObjectId* entAndInsertStack = NULL) const;
virtual Acad::ErrorStatus
applyPartialUndo(AcDbDwgFiler* undoFiler, AcRxClass* classObj); virtual void
subSetDatabaseDefaults(AcDbDatabase* pDb); virtual void
getEcs(AcGeMatrix3d& retVal) const; virtual Acad::ErrorStatus
getGsMarkersAtSubentPath(const AcDbFullSubentPath& subPath, AcDbIntArray& gsMarkers) const;
virtual Acad::ErrorStatus
highlight(const AcDbFullSubentPath& subId = kNullSubent) const; virtual Acad::ErrorStatus
unhighlight(const AcDbFullSubentPath& subId = kNullSubent) const; virtual AcDbEntity*
subentPtr(const AcDbFullSubentPath& id) const; virtual void
saveAs(AcGiWorldDraw* mode, AcDb::SaveType st); virtual Adesk::Boolean
AcDbEntity: Funções para Sobrecarregar Raramente
virtual Acad::ErrorStatus
setColor(const AcCmColor &color); virtual Acad::ErrorStatus
setColorIndex(Adesk::UInt16 color); virtual Acad::ErrorStatus
setLinetype(const char* newVal); virtual Acad::ErrorStatus
setLinetype(AcDbObjectId newVal);
AcDbCurve: Funções para Sobrecarregar
virtual Adesk::Boolean isClosed () const; virtual Adesk::Boolean isPeriodic () const; virtual Adesk::Boolean isPlanar () const; virtual Acad::ErrorStatus
getPlane (AcGePlane&, AcDb::Planarity&) const; virtual Acad::ErrorStatus
getStartParam(double&) const; virtual Acad::ErrorStatus getEndParam (double&) const; virtual Acad::ErrorStatus
getStartPoint(AcGePoint3d&) const; virtual Acad::ErrorStatus
getEndPoint (AcGePoint3d&) const; virtual Acad::ErrorStatus
getPointAtParam(double, AcGePoint3d&) const; virtual Acad::ErrorStatus
getParamAtPoint(const AcGePoint3d&, double&)const; virtual Acad::ErrorStatus
getDistAtParam (double param, double& dist) const; virtual Acad::ErrorStatus
getParamAtDist (double dist, double& param) const; virtual Acad::ErrorStatus
getDistAtPoint (const AcGePoint3d&, double&)const; virtual Acad::ErrorStatus
getPointAtDist (double, AcGePoint3d&) const; virtual Acad::ErrorStatus
getFirstDeriv (double param,
AcGeVector3d& firstDeriv) const; virtual Acad::ErrorStatus
getFirstDeriv (const AcGePoint3d&,
AcGeVector3d& firstDeriv) const; virtual Acad::ErrorStatus
getSecondDeriv (double param,
AcGeVector3d& secDeriv) const; virtual Acad::ErrorStatus
getSecondDeriv (const AcGePoint3d&,
AcGeVector3d& secDeriv) const; virtual Acad::ErrorStatus
getClosestPointTo(const AcGePoint3d& givenPnt, AcGePoint3d& pointOnCurve, Adesk::Boolean extend
= Adesk::kFalse) const; virtual Acad::ErrorStatus
getClosestPointTo(const AcGePoint3d& givenPnt, const AcGeVector3d& normal, AcGePoint3d& pointOnCurve, Adesk::Boolean extend
= Adesk::kFalse) const; virtual Acad::ErrorStatus
getOrthoProjectedCurve(const AcGePlane&, AcDbCurve*& projCrv) const; virtual Acad::ErrorStatus
getProjectedCurve(const AcGePlane&,
const AcGeVector3d& projDir, AcDbCurve*& projCrv) const; virtual Acad::ErrorStatus
getOffsetCurves(double offsetDist,
AcDbVoidPtrArray& offsetCurves) const; virtual Acad::ErrorStatus
getSpline (AcDbSpline*& spline) const; virtual Acad::ErrorStatus
getSplitCurves (const AcGeDoubleArray& params, AcDbVoidPtrArray& curveSegments) const; virtual Acad::ErrorStatus
getSplitCurves (const AcGePoint3dArray& points, AcDbVoidPtrArray& curveSegments) const; virtual Acad::ErrorStatus
virtual Acad::ErrorStatus
extend(Adesk::Boolean extendStart, const AcGePoint3d& toPoint); virtual Acad::ErrorStatus
getArea(double&) const;
Implementando Funções Membro
Quando se define uma nova função membro ou se sobrecarrega uma função já existente, a primeira que usualmente deve-se chamar é assertReadEnabled( ), assertWriteEnabled( ), ou
assertNotifyEnabled( ) para verificar se o objeto foi aberto da forma certa.
Objetos abrem para:
Filing
A partir da derivação de uma nova classe de AcDbObject, é necessário adicionar aldumas informações o mecanismo de armazenamento do AutoCAD. As quatro funções abaixo são utilizadas para garantir esse armazenamento:
Acad::ErrorStatus AcDbObject::dwgOut(AcDbDwgFiler* filer); Acad::ErrorStatus AcDbObject::dwgIn(AcDbDwgFiler* filer); Acad::ErrorStatus AcDbObject::dxfOut(AcDbDxfFiler* filer, Adesk::Boolean allXdFlag,
Adesk::uchar* regAppTable) const); Acad::ErrorStatus
AcDbObject::dxfIn(AcDbDxfFiler* filer);
Read Write Notify
assertReadEnabled( ) returns returns returns
assertWriteEnabled( ) aborts returns aborts