objectarx.pdf

Upload: jerse-messias

Post on 04-Jun-2018

315 views

Category:

Documents


6 download

TRANSCRIPT

  • 8/14/2019 ObjectARX.pdf

    1/104

    Esta a verso em html do arquivo http://www.cadtec.dees.ufmg.br/publico/Regina/ObjectARX%20B%C3%A1sico/ApostilaARX/ObjARX_Apostila.doc.Googlecria automaticamente verses em texto de documentos medida que vasculha a web.

    ObjectARX

    For AutoCAD Release 14

    Apostila do Desenvolvedor

    Reviso Abril/98

    1aEdio

    Editor

    Jos Ricardo Queiroz Franco

    Autores

    Alexandra Htner

    Fernando Poinho Malard

    Jacqueline Maria Flor

    Juliana Mascarenhas

    ndice Analtico

    Usando a Plataforma ARXIntroduo

    Pgina 1 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    2/104

    ObjectARX o ambiente de programao do AutoCAD Runtime Extension. Este ambiente incluibibliotecas da linguagem C++, que permitem o desenvolvimento de aplicativos especficos de classese protocolos no AutoCAD extendidos, e cria novos comandos que operam da mesma maneira que oscomandos intrnsecos do AutoCAD.

    A utilizao da linguagem C++ orientada a objetos pelo ObjectARX, faz com que se tenha umdesenvolvimento performtico bastante superior aos j existentes. Na anlise Orientada a Objetos,dados e procedimentos fazem parte de um s elemento bsico ( objeto ou classe ). Esses elementos

    bsicos, ao estabelecer comunicao entre si, caracterizam a execuo do programa. Assim, aocontrrio da filosofia estruturada, onde dados e procedimentos so entidades dissociadas, no

    paradigma da orientao a objetos os dados e procedimentos esto encapsulados em um s elemento.

    Em termos tcnicos, o desenvolvimento exige alguns Softwares para que se possa fazer o devido usodas ferramentas de linguagem. Apesar de o ObjectARX j ter sido implementado na verso 13 doAutoCAD, recomendvel pela sua confiabilidade, a utilizao do AutoCAD release 14 forWindows. Da mesma forma recomenda-se o Visual C++ 4.1a e ainda mais eficiente, o Visual C++5.0. A Autodesk envia aos seus desenvolvedores um CD de consulta on line chamado ObjectARX quetorna o trabalho ainda mais imediato.

    I. Viso Geral

    Uma aplicao ARX uma biblioteca de vnculo dinmico (dynamic link library _ DLL) quecompartilha o espao no mesmo endereo do AutoCAD e chama funes diretamente doAutoCAD. As bibliotecas do ARX incluem macros para facilitar a definio de novas classes eoferecer a habilidade para adicionar funcionalidade s classes existentes. O ARX pode serusado juntamente com o AutoCAD Development System (ADefS) e tambm com aplicativos emAutoLISP.

    Ambiente ARX

    O ambiente ARXfornece uma interface para a aplicao da linguagem orientada a objetos C++ quehabilita desenvolvedores usar, customizar, e automatizar o AutoCAD. O ARX de extremaversatilidade na utilizao do seu banco de dados, no sistema grfico, e na definio dos seuscomandos nativos.

    O ambiente ARXdifere do ADS e do AutoLISP de enumeras formas. O AutoLISP uma linguageminterpretada pelo AutoCAD, uma simples forma de apenas adicionar comandos. Sua coneco com oAutoCAD feita atravs de um interprocesso de comunicao (IPC). Dessa mesma forma tambm oADS que escrito em C e compilado antes de ser carregado via IPC pelo AutoLISP e s assimexecutado no AutoCAD. O ADS apenas uma traduo do AutoLISP.

    Aplicativos ADS

    Pgina 2 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    3/104

    IPC

    AutoLISP

    IPC

    AutoCAD

    Aplicativos ARXBibliotecas ARX

    ClasseAcRx

    O AcRx fornece o nvel de classes para a inicializao DLL, linkagem e tambm registro eidentificao das classes. A classe bsica AcRxObject.

    OAcRxtambm fornece um conjunto de macros em C++ para ajudar na criao de novas classes emARX, que so derivadas doAcRxObject.

    Outra importante classe AcRxDictionary que um dicionrio de strings que aponta para outroobjeto. OAcRxarmazena classes, objetos e dicionrios.

    Classe hierrquica: AcRxObject

    AcRxClass

    AcRxDictionary

    AcRxDLinkerReactor

    AcRxDynamicLinker

    AcRxIterator

    AcRxDictionaryIterator

    AcRxService

    Classe AcEd

    O AcEdfornece classes para definio e registro de novos comandos (nativos) no AutoCAD que

    Pgina 3 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    4/104

    operam da mesma maneira que os comandos internos do AutoCAD. Ambos comandos residem namesma estrutura interna, AcEdCommandStack. Uma classe importante a AcEditorReactor, quemonitora o editor do AutoCAD e notifica os eventos ocorridos.

    Classe hierrquica: AcRxObject

    AcEdCommandIteratorAcEdCommandStack

    AcEditor

    AcEdJig

    AcEditorReactor

    AcTransaction

    AcTransactionManager

    AcTransactionReactor

    Classe AcDb

    OAcDbfornece classes que possibilitam o acesso na estrutura do banco de dados do AutoCAD. Estebanco de dados armazena todas as informaes para os objetos grficos (entidades) e no grficos quecompe um desenho do AutoCAD.

    O banco de dados do AutoCAD contm: Um conjunto de nove symbol tables Um named object dictionary( class AcDbDictionary) que contm uma tabela de

    contedos para o AutoCAD que pode ser facilmente alterada Um conjunto fixo de 200 variveis de cabealho definidas pelo AutoCAD

    Classe hierrquica: AcDbAuditInfo

    AcDbRecoverAcDbRecoverCallBack

    AcDbHandle (Identificao do objeto)

    AcDbObjectId

    AcDbHardOwnershipId

    AcDbHardPointerId

    AcDbSoftOwnershipId

    AcDbSoftPointerId

    Pgina 4 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    5/104

    AcDbIdMapping (Usado para deep clone)

    AcDbIdMappingIter

    AcDbIdPair

    AcDbSymbolTableIterator (Iterators)AcDbBlockTableIterator

    AcDbBlockTableRecordIterator

    AcDbDimStyleTableIterator

    AcDbLayerTableIterator

    AcDbLinetypeTableIterator

    AcDbRegAppTableIterator

    AcDbTextStyleTableIterator

    AcDbUCSTableIterator

    AcDbAbstractViewTableIterator

    AcDbViewTableIterator

    AcDbViewportTableIterator

    AcDbGroup Iterator

    AcDbExtents

    AcDbDate

    AcDbIntArray

    AcDbObjectIdArray

    AcDbVoidPtrArray

    AcRxObject

    AcDbDatabase (AutoCAD banco de dados)

    AcDbDictionaryIterator

    AcDbDwgFiler (Arquivos)

    AcDbDwgCopyFiler

    AcDbDeepCloneFiler

    Pgina 5 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    6/104

    AcDbWblockCloneFiler

    AcDbDwgUndoFiler

    AcDbDxfFiler

    (AcRxObject)AcDbObject (Classe mais importante)

    AcDbDictionary

    AcDbEntity (AutoCAD entidades)

    AcDb3dSolid

    AcDbBlockBegin

    AcDbBlockEnd

    AcDbBlockReference

    AcDbMInsertBlock

    AcDbBody

    AcDbCurve

    AcDb2dPolyline

    AcDb3dPolyline

    AcDbArc

    AcDbCircle

    AcDbEllipse

    AcDbLeader

    AcDbLine

    AcDbRay

    AcDbSpline

    AcDbXline

    AcDbDimension

    AcDb2LineAngularDimension

    AcDb3PointAngularDimension

    Pgina 6 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    7/104

    AcDbAlignedDimension

    AcDbDiametricDimension

    AcDbOrdinateDimension

    AcDbRadialDimensionAcDbRotatedDimension

    AcDbFace

    AcDbFaceRecord

    AcDbFcf

    AcDbMline

    AcDbMText

    AcDbOleFrame

    AcDbPoint

    AcDbPolyFaceMesh

    AcDbPolygonMesh

    AcDbRegion

    AcDbSequenceEnd

    AcDbShape

    AcDbSolid

    AcDbText

    AcDbAttribute

    AcDbAttributeDefinition

    AcDbTrace

    AcDbVertex

    AcDb2dPolylineVertex

    AcDb3dPolylineVertex

    AcDbPolyFaceMeshVertex

    AcDbPolygonMeshVertex

    Pgina 7 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    8/104

    AcDbViewport

    AcDbProxyEntity

    (AcRxObject)

    (AcDbObject)

    AcDbGroup

    AcDbMlineStyle

    AcDbSymbolTable (Symbol tables)

    AcDbBlockTable

    AcDbDimStyleTableAcDbLayerTable

    AcDbLinetypeTable

    AcDbRegAppTable

    AcDbTextStyleTable

    AcDbUCSTable

    AcDbAbstractViewTable

    AcDbViewportTable

    AcDbViewTable

    AcDbSymbolTableRecord (Symbol table records)

    AcDbAbstractViewTableRecord

    AcDbViewportTableRecord

    AcDbViewTableRecord

    AcDbBlockTableRecord

    AcDbDimStyleTableRecord

    AcDbLayerTableRecord

    AcDbLinetypeTableRecord

    AcDbRegAppTableRecord

    AcDbTextStyleTableRecord

    Pgina 8 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    9/104

    AcDbUCSTableRecord

    AcDbProxyObject

    AcDbObjectIterator

    AcDbObjectReactor (Notificao de eventos)AcDbEntityReactor

    AcDbDatabaseReactor

    Classe AcGi

    O AcGi fornece a interface grfica usada para as entidades do AutoCAD. Ela usada pelas funesmembro do AcDbEntity como worldDraw( ), viewportDraw( ) e saveAs( ), que fazem parte do

    protocolo padro da entidade. O worldDraw( ) deve ser definida para todas as classes de entidades

    customizadas. O objetoAcGiWorldDrawfornece um API atravs do qual o AcDbEntity::worldDraw( )podeproduzir uma representao grfica em todos os viewports simultneamente. Similarmente, oobjeto AcGiViewportDraw fornece um API atravs do qual o AcDbEntity::viewportDraw( ) pode

    produzir representaes grficas para cada viewport.

    Classe hierrquica: AcRxObject

    AcGiEdgeData

    AcGiFaceData

    AcGiSubEntityTraitsAcGiTextStyle

    AcGiVertexData

    AcGiViewport

    AcGiViewportDraw

    AcGiViewportGeometry

    AcGiWorldDraw

    AcGiWorldGeometry

    Classe AcGe

    OAcGe usado peloAcDb e fornece classes teis assim como vetores, pontos e matrizes (2D e 3D).Ela tambm disponibiliza objetos geomtricos simples como pontos, curvas e superfcies. Essasclasses que compeAcGepodem ser usadas para operaes bsicas com vetores, pontos e matrizes.Os membros dessa classe devem ser declarados pblicos.

    Classe hierrquica: AcGePoint2d

    AcGeVector2d

    Pgina 9 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    10/104

    AcGeMatrix2d

    AcGeScale2d

    AcGePoint2dArray

    AcGeVector2dArrayAcGePoint3d

    AcGeVector3d

    AcGeMatrix3d

    AcGeScale3d

    AcGePoint3dArray

    AcGeVector3dArray

    AcGeTolerance

    AcGeInterval

    AcGeCurveBoundary

    AcGeDoubleArray

    AcGeKnotVector

    AcGeEntity2d

    AcGePointEnt2d

    AcGePosition2d

    AcGePointOnCurve2d

    AcGeCurve2d

    AcGeLinearEnt2d

    AcGeLine2d

    AcGeRay2d

    AcGeLineSeg2d

    AcGeCircArc2d

    AcGeEllipArc2d

    AcGeSplineEnt2d

    Pgina 10 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    11/104

    AcGeCubicSpline2d

    AcGeNurbCurve2d

    AcGePolyLine2d

    AcGeExternalCurve2dAcGeEntity3d

    AcGePointEnt3d

    AcGePosition3d

    AcGePointOnCurve3d

    AcGePointOnSurface

    AcGeCurve3d

    AcGeLinearEnt3d

    AcGeLine3d

    AcGeRay3d

    AcGeLineSeg3d

    AcGeCircArc3d

    AcGeEllipArc3d

    AcGeExternalCurve3d

    AcGeSplineEnt3d

    AcGeCubicSpline3d

    AcGeNurbCurve3d

    AcGePolyLine3d

    AcGeAugPolyLine3d

    AcGeSurface

    AcGePlanarEnt

    AcGePlane

    AcGeBoundedPlane

    AcGeCylinder

    Pgina 11 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    12/104

    AcGeCone

    AcGeSphere

    AcGeTorus

    AcGeNurbSurfaceAcGeExternalSurface

    AcGeOffsetSurface

    AcGeExternalBoundedSurface

    Registrando comandos

    No ARX pode-se adicionar novos comandos com a funo ads_defun() ou com a macroacedRegCmds().Com a biblioteca de comandos ADS, os requisitos so antes passados pelo AutoLISPe depois para o aplicativo. Com o ARX, os comandos so adicionados diretamente ao conjunto decomandos do AutoCAD.

    Cada maneira de registrar os comandos afeta a forma de invoc-los. Se o comando de registrousado for oads_defun():

    Os comandos podem ser evoludos atravs do AutoLISP ou das facilidades do ads_invoke()

    Os comandos no podero ser invocados usando a funo command do AutoLISP ou a funoads_command().

    Se for usada a macro acedRegCmds():

    Os comandos no so reconhecidos pelo AutoLISP ou pelas facilidades do ads_invoke()

    Os comandos podem ser invocados usando a funo command do AutolISP ou a funoads_command()

    Entrada de pontos

    ARX e ADS tem modelos diferentes para comunicar com o AutoCAD. Um aplicativo ADS consistenum loop infinito que espera pela requisio do AutoLISP. Um aplicativo ARX tem um entrypoint que usado para mensagens. Ento, quando um novo comando registrado, ele passa a ser umentry point adicional do aplicativo. Quando escrevemos funes virtuais para classes C++ nas

    biliotecas ARX, elas passam a ser novos entry point no aplicativo.

    II. Noes Bsicas do Banco de Dados

    Pgina 12 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    13/104

    O banco de dados do AutoCAD armazena os objetos e entidades que so feitas no desenho doAutoCAD. As entidades so objetos de desenho com representao grfica e so possudas peloblock table record que por sua vez armazenado no block table. O banco de dados constitudopor elementos de banco de dados: o named object dictionary e um conjunto de symbol tables,dentre eles esta o block table.

    DATABASE

    Symbol Table

    Layer Table

    NOD

    Block Table

    Layer Table

    Record

    Objetos

    Symbol Table

    Record

    Entidades

    Block Table

    Record

    Banco de Dados do AutoCAD

    Um desenho de AutoCAD uma coleo de AcDb-objetos que so armazenados em um banco dedados. Cada objeto no banco de dados tem um handle que uma identificao nica dentro docontexto do desenho. J as entidades so objetos com uma representao grfica como, line, circle,etc.

    Outros objetos de banco de dados importantes so os symbol tables e dictionaries, que socontainers de armazenamento de objetos. No caso do symbol table tem-se um conjunto fixo deelementos no banco de dados, cada um dos quais contem instncias de uma particular classe do

    Pgina 13 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    14/104

    symbol table record. No permitido adicionar novos symbol table no banco de dados. Osdictionaries so objetos que mapeiam um symbol name para outro AcDb-objeto. Alm dissofornecem um container mais genrico para armazenamento de objetos, ele pode conter qualquer

    AcDbObjectou subclasse, e tambm, pode-se criar novos elementos de banco de dados e acrescent-los em um novo dictionary.

    Durante as sesses correntes do AutoCAD pode-se obter o banco de dados chamando a funo globalacdbCurDwg( ). Mltiplos banco de dados podem ser carregados dentro de uma nica sesso doAutoCAD. Cada objeto na sesso tem um objeto ID, que um nico identificador para o objetoatravs de todos os banco de dados carregados. Em contraste, um objeto handleno garantido sernico dentro de uma sesso do AutoCAD. Ele nico somente dentro de um escopo de um particular

    banco de dados.

    Objeto ID

    Com um objeto IDpode-se obter um ponteiro para o objeto do banco de dados atual, assim pode-seexecutar operaes com ele. Para obter o objetoID:

    Criar um objeto e acrescentar ao banco de dados Usar o protocolo do banco de dados para obter o objeto ID dos objetos que so criados

    automaticamente se um banco de dados criado Usar o protocolo de classes especficas para obter o objeto ID Usar um iteratorpara percorrer uma lista ou conjunto de objetos Selecionar um conjunto de objetos

    Objetos Essenciais do Banco de Dados

    Quando os objetos so criados, eles so armazenados em containers no banco de dados. Entidades soadicionados para o block table record, e esses so adicionados para os symbol tables. Todos osoutros objetos so adicionados para o named object dictionary ou para objetos que so seus

    proprietrios.

    O banco de dados tem inicialmente o seguinte aspecto:

    Um conjunto de nove symbol tablesque incluem o block table(MODEL_SPACE ePAPER_SPACE ) e o layer table( layer 0 ).

    Um named object dictionaryque j contm p grupo dictionarye MLINE style dictionary( STANDARD ).

    Criando Objetos

    Exemplo: Criao de uma linee sua adio no model space block table record:

    AcDbObjectId

    createLine()

    {

    AcGePoint3d startPt(4.0, 2.0, 0.0);

    Pgina 14 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    15/104

    AcGePoint3d endPt(10.0, 7.0, 0.0);

    AcDbLine *pLine = new AcDbLine(startPt, endPt);

    AcDbBlockTable *pBlockTable;

    acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);AcDbBlockTableRecord *pBlockTableRecord;

    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);

    pBlockTable->close();

    AcDbObjectId lineId;

    pBlockTableRecord->appendAcDbEntity(lineId, pLine);

    pBlockTableRecord->close();

    pLine->close();

    return lineId;

    }

    Exemplo: Criao de um circlee sua adio no model space block table record:

    AcDbObjectId

    createCircle()

    {

    AcGePoint3d center(9.0, 3.0, 0.0);

    AcGeVector3d normal(0.0, 0.0, 1.0);

    AcDbCircle *pCirc = new AcDbCircle(center, normal, 2.0);

    AcDbBlockTable *pBlockTable;

    acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);

    AcDbBlockTableRecord *pBlockTableRecord;

    pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord, AcDb::kForWrite);

    pBlockTable->close();

    AcDbObjectId circleId;

    pBlockTableRecord->appendAcDbEntity(circleId, pCirc);

    Pgina 15 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    16/104

    pBlockTableRecord->close();

    pCirc->close();

    return circleId;

    }Exemplo: Obtem o layer symbol table do banco de dados, cria um novo layer table record e onomeia de ASDK_MYLAYER. O layer table record adicionado para o layer table:

    void

    createNewLayer()

    {

    AcDbLayerTable *pLayerTable;acdbCurDwg()->getLayerTable(pLayerTable, AcDb::kForWrite);

    AcDbLayerTableRecord *pLayerTableRecord = new AcDbLayerTableRecord;

    pLayerTableRecord->setName("ASDK_MYLAYER");

    AcDbLinetypeTable *pLinetypeTbl;

    acdbCurDwg()->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);

    AcDbObjectId ltypeObjId;

    pLinetypeTbl->getAt("CONTINUOUS", ltypeObjId);

    pLayerTableRecord->setLinetypeObjectId(ltypeObjId);

    pLayerTable->add(pLayerTableRecord);

    pLayerTable->close();

    pLayerTableRecord->close();

    }

    Abrindo e Fechando Objetos

    Todo objeto precisa ter o protocolo de abrir e ser fechado. Esse protocolo garante que o objeto estafisicamente na memria quando ele necessita ser acionado. Antes de modificar um objeto ele precisaser aberto:

    AcdbOpenObject( pObject, objId, AcDb::kForWrite );

    O ltimo parmetro especifica se o objeto ser lido (read), escrito (write) ou notificado (notify). Nocaso de write ele pode ser modificado. Quando a modificao estiver acabada, deve-se fechar oobjeto, mas nunca antes do objeto ser adicionado no banco de dados:

    Pgina 16 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    17/104

    PObject->close ( )

    Exemplo: O exemplo a seguir muda a cor da entidade:

    Acad::ErrorStatus

    changeColor(AcDbObjectId entId, Adesk::UInt16 newColor){

    AcDbEntity *pEntity;

    acdbOpenObject(pEntity, entId, AcDb::kForWrite);

    pEntity->setColorIndex(newColor);

    pEntity->close();

    return Acad::eOk;

    }

    Adicionando um Grupo para o Group Dictionary

    Exemplo: Cria um group(pgroup) e coloca no group dictionary

    void

    createGroup(AcDbObjectIdArray& objIds, char* pGroupName)

    {

    AcDbGroup *pGroup = new AcDbGroup(pGroupName);

    for (int i = 0; i < objIds.length(); i++)

    {

    pGroup->append(objIds[i]);

    }

    AcDbDictionary *pGroupDict;

    acdbCurDwg()->getGroupDictionary(pGroupDict, AcDb::kForWrite);

    AcDbObjectId pGroupId;

    pGroupDict->setAt(pGroupName, pGroup, pGroupId);

    pGroupDict->close();

    pGroup->close();

    Pgina 17 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    18/104

    }

    III. Escrevendo uma aplicao em ARX

    Essa sesso descreve como escrever e rodar uma aplicao em ARX. Ela lista as mensagenspassadas pelo AutoCAD para aplicaes em ARX e mostra como essas aplicaes respondem asmensagens. Considera tambm o registro de novos comandos, como carregar e descarregaruma aplicao e algo mais.

    Estrutura de uma Aplicao em ARX

    O AutoCAD chama o ARX atravs do mdulo acrxEntryPoint ( ), que substitui o main do C ou ADS.

    A funo acrxEntryPoint ( )serve no somente como a entrada de pontos para a comunicao comuma aplicao do ARX do AutoCAD, mas tambm como um caminho para aplicaes do ARX

    passar mensagens e retornar status para o AutoCAD.

    extern "C"

    AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCodemsg, void*pkt);

    msg Representa a mensagem enviada

    pkt Pacote de dados

    AppRetCode Contem o status retornado do AutoCAD

    Dentro da definio do acrxEntryPoint ( )deve-se escrever um switchpara decifrar as mensagens doAutoCAD. O cdigo abaixo mostra o esqueleto:

    AcRx::AppRetCode

    acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)

    {

    switch(msg) {

    case AcRx::kInitAppMsg:

    break;

    case AcRx::kUnloadAppMsg:

    break;

    ...

    Pgina 18 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    19/104

    default:

    break;

    }

    return AcRx::kRetOK;}

    Mensagens Enviadas do AutoCAD para as Aplicaes ARX

    kInitAppMsg .

    kUnloadAppMsg

    kOleUnloadAppMsgkLoadDwgMsg

    kUnloadDwgMsg

    kDependencyMsg

    kNoDependencyMsg

    kInvkSubrMsg

    kEndMsg

    kPreQuitMsg

    kQuitMsg

    kSaveMsg

    kCfgMsg

    kEndMsgkCfgMsgkQuitMsgkSaveMsg

    O processo das mensagens praticamente todo feito em uma s direo, do AutoCAD para oaplicativo em ARX.

    Registrando Novos Comandos

    Command Stack

    Os comandos do AutoCAD so armazenados em grupos no command stack, que definido pelaclasseAcEdCommandStack. O command stack criado para a sesso do AutoCAD e um comandonativo adicionado ao AutoCAD. A macro acedRegCommands ( ) da o acesso para o command stack.

    Pgina 19 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    20/104

    Pode-se adicionar comandos com AcEdCommand::addCommand ( ) e remover grupos comAcEdCommand::removeGroup( ) ou remover comandos comAcEddCommandStack::removeCmd.

    Acad::ErrorStatus

    AcEdCommandStack::addCommand

    (const char* cmdGroupName,

    const char* cmdGlobalName,

    const char* cmdLocalName,

    Adesk::Int32 commandFlags,

    AcRxFunctionPtr functionAddr);

    cmdGroupName Representao ASCII do grupo para adicionar o comandocmdGlobalNameRepresentao ASCII do nome global do comando para adicionar

    cmdLocalNameRepresentao ASCII do nome local do comando para adicionar

    command-FlagsFlags associados com o comando

    functionAddr Endereo da funo para sua execuo quando invocado pelo AutoCAD

    virtual Acad::ErrorStatus

    AcEdCommandStack::removeCmd

    (const char* cmdGroupName, const char* cmdGlobalName) = 0;

    virtual Acad::ErrorStatus

    AcEdCommandStack::removeGroup

    (const char* groupName);

    Quando um comando invocado, o command stack procurado pelo group name e ento pelocommand namedentro do group. Essa procura no feita em uma ordem lgica, porm o usurio, sequiser, pode ter controle sobre ela.

    Lookup Order

    Quando um comando invocado, o comando Stack procurado pelo nome do grupo e depois pelonome do comando. Geralmente, o primeiro o primeiro grupo registrado ser o primeiro a ser

    pesquisado, mas podemos saber qual orem ir seguir. Para especificarmos o primeiro grupo quedesejamos que seja pesquisado, podemos usar o comando abaixo:

    AcEdCommandStack::popGroupToTop()

    Global versus Local

    Pgina 20 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    21/104

    Caso no haja necessidade de traduzir o nome do comando local, o nome global pode ser usado paraambas situaes.

    Comandos Transparentes

    Um comando pode ser transparente (ACRX_CMD_TRANSPARENT) ou modal

    (ACRX_CMD_MODAL). Um comando transparente pode ser invocado quando o usurio utilizandoopromptcom outra ao. J o modal s pode se invocado quando no houver outro comando na linhadeprompt.

    Querrying Commands

    A biblioteca AcEd oferece classes para iterao atravs do comando Stack e par procurar comandosespecficos. Todavia esse questionamento executado pelo AutoCAD e ns usamos essas funes.

    Exemplo: Implementa funes que so chamadas quando a aplicao carregada (load) edescarregada (unload)

    void

    initApp()

    {

    acedRegCmds->addCommand("ASDK_DICTIONARY_COMMANDS",

    "ASDK_CREATE", "CREATE", ACRX_CMD_MODAL, createDictionary);

    acedRegCmds->addCommand("ASDK_DICTIONARY_COMMANDS","ASDK_ITERATE", "ITERATE", ACRX_CMD_MODAL, iterateDictionary);

    AsdkMyClass::rxInit();

    acrxBuildClassHierarchy();

    }

    void

    unloadApp()

    {

    acedRegCmds->removeGroup("ASDK_DICTIONARY_COMMANDS");

    deleteAcRxClass(AsdkMyClass::desc());

    }

    Carregando uma Aplicao ARX

    Pgina 21 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    22/104

    Mtodos para carregar um aplicativo ARX:

    Fornecer o aplicativo com aspectos que permitam ser carregados pelo AutoCAD Especificar o aplicativo no arquivo inicial acad.rx Utilizar AcRxDynamicLinker::loadModule( ) Usar o quadro de dilogo APPLOAD definido no bonus loadapp.arx Usar a funo arxloaddo AutoLISP Usar a funo ads_arxload( )do ARX ou ADS Comando ARX nopromptdo AutoCAD

    Descarregando uma Aplicao ARX

    Mtodos para descarregar um aplicativo ARX:

    UtilizarAcRxDynamicLinker::unloadModule( ) Usar o quadro de dilogo APPLOAD definido no bonus loadapp.arx Usar a funo arxunloaddo AutoLISP Usar a funo ads_arxunload( )do ARX ou ADS Comando ARX nopromptdo AutoCAD

    Comando ARX

    A partir do comando ARX na linha de comando, tem-se o seguinte na liha de prompt:

    ?/Load/Unload/Commands/Options : Entre uma opo ou pressione ENTER

    ?- Lista as aplicaes em ARX carregedas

    Load- Carrega os arquivos .arx que foram especificados

    Unload- Descarrega as aplicaes em ARX especificadas

    Commands- Mostra todos os nomes de comandos e grupos registrados

    Options- Apresenta o relatrio de alguns tens do programa

    Controle de Memria

    Os objetos criados devem ser devidamente liberados da memria. No caso do C++, deve-se usarAcDbObject::newpara criar um objeto eAcDbObject::deletepara destru-lo.

    IV. Operaes do Banco de Dados

    Pgina 22 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    23/104

    Essa sesso descreve o protocolo bsico do banco de dados incluindo como criar um banco dedados, como ler em um arquivo de desenho, e como salvar o banco de dados. As funes wblocke insert so tambm descritas aqui.

    Banco de Dados Inicial

    Quando uma sesso do AutoCAD comea tem-se os seguintes elementos:

    Um conjunto de sete symbol tables

    Block table (AcDbBlockTable)

    Dimension style table (AcDbDimStyleTable)

    Layer table (AcDbLayerTable)

    Linetype table (AcDbLinetypeTable)

    Registered applications table (AcDbRegAppTable)

    Text style table (AcDbTextStyleTable)

    User coordinate system table (AcDbUCSTable)

    Viewport table (AcDbViewportTable)

    View table (AcDbViewTable)

    Um named object dictionary Um conjunto fixo de variveis header

    Criando e Populando um Banco de Dados

    Usa-se newpara criar um banco de dados e deletepara destru-lo. O construtor AcDbDatabase tem

    um argumento com default deAdesk::kTrue que cria o banco de dados populado com o objeto padro.Se o argumento forAdesk::kFalse, ento o banco de dados criado vazio e pode ser populado.

    Salvando um Banco de Dados

    Para salvar o banco de dados:

    Acad::ErrorStatus

    AcDbDatabase::saveAs(char* fileName);

    Pgina 23 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    24/104

    A Operao wblock

    A classeAcDbDatabasecontm uma funo wblock( )sobrecarregada com trs formas:

    Criando um novo banco de dados a partir de um j existente

    Acad::ErrorStatus

    AcDbDatabase::wblock(AcDbDatabase*& newDb);

    Criando um novo banco de dados com entidades: Copiando um Named Block

    Acad::ErrorStatus

    AcDbDatabase::wblock(AcDbDatabase*& newDb, AcDbObjectId recordId);

    Criando um novo banco de dados com entidades: Copiando um Array de Entidades

    Acad::ErrorStatus

    AcDbDatabase::wblock(AcDbDatabase*& newDb,

    const AcDbObjectIdArray& idArray,

    const AcGePoint3d* point);

    Inserindo um Banco de Dados

    As funesAcDbDatabase::insert( )copiam um banco de dados para o banco de dados que invocou afuno, porm se alguns objetos tiverem um ponteiro do tipo ownership no named objectdictionary, necessrio utilizar a funo de notificaoAcEditorReactor.

    Setando os Valores do Banco de Dados Corrente

    Color

    Se a cor no especificada por uma entidade, o banco de dados armazena no sistema de variveisCECOLOR.

    Acad::ErrorStatus

    AcDbDatabase::setCecolor(const AcCmColor& color);

    AcCmColor AcDbDatabase::cecolor() const;

    Linetype

    Pgina 24 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    25/104

    Acad::ErrorStatus

    AcDbDatabase::setCeltype(AcDbObjectId);

    AcDbObjectId AcDbDatabase::celtype() const;

    Linetype ScaleAcad::ErrorStatus

    AcDbDatabase::setLtscale(double);

    double AcDbDatabase::ltScale() const;

    Acad::ErrorStatus

    AcDbDatabase::setCeltscale(double);

    double AcDbDatabase::celtscale() const;

    Acad::ErrorStatus

    AcDbDatabase::setPsltscale(Adesk::Boolean)

    Adesk::Boolean AcDbDatabase::psltscale() const;

    LayerAcad::ErrorStatus

    AcDbDatabase::setClayer(AcDbObjectId);

    AcDbObjectId AcDbDatabase::clayer() const;

    Referncias Externas

    Referncias externas (xrefs) so criadas exclusivamente pelo AutoCAD que cria um banco de dadoscontendo os xrefs. Para que se possa monitorar esse banco de dados deve-se usar as funes da classe

    AcEditorReactor:

    beginAttach( ) otherAttach( ) abortAttach( ) endAttach( ) redirected( ) comandeered( )

    Exemplo de Operaes no Banco de Dados

    Pgina 25 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    26/104

    void

    createDwg()

    {

    // Cria um novo banco de dadosAcDbDatabase *pDb = new AcDbDatabase;

    // Obtem o model space block table record

    AcDbBlockTable *pBtbl;

    pDb->getBlockTable(pBtbl, AcDb::kForRead);

    AcDbBlockTableRecord *pBtblRcd;

    pBtbl->getAt(ACDB_MODEL_SPACE, pBtblRcd,

    AcDb::kForWrite);

    pBtbl->close();

    // Cria dois circles e acrescenta no banco de dados

    AcDbCircle *pCir1 = new AcDbCircle(AcGePoint3d(1,1,1),

    AcGeVector3d(0,0,1), 1.0),

    *pCir2 = new AcDbCircle(AcGePoint3d(4,4,4),

    AcGeVector3d(0,0,1), 2.0);

    pBtblRcd->appendAcDbEntity(pCir1);

    pCir1->close();

    pBtblRcd->appendAcDbEntity(pCir2);

    pCir2->close();

    pBtblRcd->close();

    pDb->saveAs("test1.dwg");

    delete pDb;

    }

    void

    readDwg()

    Pgina 26 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    27/104

    {

    AcDbDatabase *pDb = new AcDbDatabase;

    pDb->readDwgFile("test1.dwg");

    // abre o model space block table recordAcDbBlockTable *pBlkTbl;

    pDb->getBlockTable(pBlkTbl, AcDb::kForRead);

    AcDbBlockTableRecord *pBlkTblRcd;

    pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,

    AcDb::kForRead);

    pBlkTbl->close();

    AcDbBlockTableRecordIterator *pBlkTblRcdItr;

    pBlkTblRcd->newIterator(pBlkTblRcdItr);

    AcDbEntity *pEnt;

    for (pBlkTblRcdItr->start(); !pBlkTblRcdItr->done();

    pBlkTblRcdItr->step())

    {

    pBlkTblRcdItr->getEntity(pEnt, AcDb::kForRead);

    ads_printf("classname: %s\n", (pEnt->isA())->name());

    pEnt->close();

    }

    pBlkTblRcd->close();

    delete pBlkTblRcdItr;

    delete pDb;

    }

    V. Objetos Banco de Dados

    Pgina 27 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    28/104

    Essa sesso relata todos os objetos banco de dados do AutoCAD, entidades, symbol tablesrecords e dictionaries. Tambm inclui abrir e fechar comandos, administrar objetos namemria, objetos ownership, e extenso de um objeto ou extension dictionary.

    Abrindo e Fechando Objetos

    Cada objeto pode ser referenciado de trs formas:

    Pelo seuhandle: enquanto o AutoCAD no salvo o desenho armazenado no DWG, assim osobjetos so identificados pelos seus handles;

    Pelo seu object ID: depois que o desenho aberto as informaes do desenho estoarmazenadas no AcDbDatabase, assim cada objeto tem no banco de dados um object ID. Esseobject Id persiste durante a edio corrente, desde a criao at sua deleo;

    Por um ponteiro em C++: As funes de abertura pegam o object ID como um argumento eretornam um ponteiro para um AcDbObject, esse ponteiro vlido at o objeto ser fechado.

    DWG

    Handle

    Abre o Objeto

    Abre o Objeto

    AcDbDatabase

    Object ID

    C++

    Pointer

    SAVE WBLOCK

    Fecha o Objeto

    A funo para abrir um objeto :

    Acad::ErrorStatus

    AcDbDatabase::acdbOpenObject(AcDbObject*& obj,

    AcDbObjectId id,

    Pgina 28 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    29/104

    AcDb::OpenMode mode,

    Adesk::Boolean openErasedObject = Adesk::kFalse)

    A funo para mapear um handle para um object ID :

    Acad::ErrorStatusgetAcDbObjectId(AcDbObjectId& retId,

    Adesk::Boolean createIfNotFound,

    const AcDbHandle& objHandle,

    Adesk::UInt32 xRefId=0);

    A funo para abrir um objeto e requerer seu handle :

    AcDbObject* pObject;

    AcDbHandle handle;

    pObject->getAcDbHandle(handle);

    Um ads_name equivalente para umAcDbObjectId, pode-se mudar usando-se:

    AcdbGetAdsName (ads_name& objName, AcDbObjectId objId);

    AcdbGetObjectId (AcDbObjectId& objId, ads_name objName);

    Geralmente, obtm-se um objeto atravs de uma seleo, e ento o retorno um ads_name queprecisa ser trocado para umAcDbObjectIde ser aberto:

    AcDbEntity*

    selectEntity(AcDbObjectId& eId, AcDb::OpenMode openMode)

    {

    ads_name en;

    ads_point pt;

    ads_entsel("\nSelect an entity: ", en, pt);

    // muda ads_namepara um object Id

    acdbGetObjectId(eId, en);

    AcDbEntity * pEnt;

    acdbOpenObject(pEnt, eId, openMode);

    return pEnt;

    Pgina 29 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    30/104

    }

    Pode-se abrir um objeto de trs modos:

    kForRead; kForWrite; kForNotify

    ;Pode acontecer vrios erros se caso o objeto for aberto de uma forma errada ou se o objeto j estiveraberto.

    Deletando Objetos

    Quando se cria uma instncia de umAcDbObjectcom o intento de adicionar no banco de dados, devese usar AcDbObject::new. Quando um objeto primeiro criado e no foi adicionado no banco de

    dados, pode-se delet-lo. Do contrrio, se o objeto j tiver sido adicionado no banco de dados, no sepode delet-lo. O AutoCAD administra a deleo de todos os objetos residentes no banco de dados.

    Ownership

    Com exceo dos objetos razes, symbol tablese named object dictionary, os demais objetos tmum dono:

    Block table recordspossui as entidades; Cada symbol tablepossui um particular tipo de symbol table record UmAcDbDictionarypode possuir umAcDbObject; QualquerAcDbObjectpode ter um extension dictionary; um objeto possui seu extension

    dictionary;

    Adicionando Dados Especficos no Objeto

    Pode-se utilizar das seguintes formas para adicionar dados em uma aplicao:

    Dados extendidos: consiste numa lista linkada de resbufs usada pelo aplicativo. ; Xrecords; Extension Dictionaryde qualquer objeto: pode conter um arbitrrio conjunto de objetos

    AcDbObject; Objetos customizadosque podem guardar dados.

    Apagando Objetos

    Qualquer objeto no banco de dados pode ser apagado com a seguinte funo:

    Acad::ErrorStatus

    Pgina 30 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    31/104

    AcDbObject::erase(Adesk::Boolean Erasing = Adesk::kTrue);

    Quando um objeto do banco de dados apagada, informaes sobre ele so removidas do dictionary.J quando uma entidade apagada, ela apagada no block table record.. No permitido abrir eapagar um objeto com AcDbOpenObject(), se isso for feito haver uma mensagem de erro.Quandoum objeto apagado ele no arquivado no arquivo DWG ou no DXF.

    Objeto Filing

    O Objeto Filing usado nos seguintes casos:

    Escrevendo e lendo arquivos DWG e DXF; Na comunicao entre AutoCAD, AutoLISP, ADS e ARX; No UNDO, INSERT, XREF e COPY; Na paginao.

    O AcDbObject tem duas funes membros para arquivar externamente: dwgout() e dxfout(), e duasfunes membros para arquivar internamente: dwgin() e dxfin(). Essas funes so chamadas peloAutoCAD.

    VI. Entidades

    Descrio dos objetos com representao grfica denominados Entidades. Listando aspropriedades comuns das entidades.

    Definio de Entidades

    Uma entidade um objeto que possui um banco de dados e tambm, uma representao grfica como,lines, circles, text e outros. Um usurio pode ver uma entidade no desenho e manipul-la

    Ownership

    Entidades no banco de dados normalmente pertencem a um AcDbBlockTableRecord. O block table

    quando recm criado pelo banco de dados tem dois predefinidos records, MODEL_SPACE ePAPER_SPACE. Adicionais records so adicionados sempre que o usurio cria novos blockrecords.

    Pgina 31 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    32/104

    A estrutura ownershippara entidades do banco de dados a seguinte:

    AcRxObject

    AcDbObject

    AcDbDictionaryAcDbEntity

    AcDb3dSolid

    AcDbBlockBegin

    AcDbBlockEnd

    AcDbBlockReference

    AcDbMInsertBlock

    AcDbBody

    AcDbCurve

    AcDb2dPolyline

    AcDb3dPolyline

    AcDbArc

    AcDbCircle

    AcDbEllipse

    AcDbLeader

    AcDbLine

    AcDbRay

    AcDbSpline

    AcDbXline

    AcDbDimension

    AcDb2LineAngularDimension

    AcDb3PointAngularDimension

    AcDbAlignedDimension

    AcDbDiametricDimension

    Pgina 32 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    33/104

    AcDbOrdinateDimension

    AcDbRadialDimension

    AcDbRotatedDimension

    AcDbFaceAcDbFaceRecord

    AcDbFcf

    AcDbMline

    AcDbMText

    AcDbOleFrame

    AcDbPoint

    AcDbPolyFaceMesh

    AcDbPolygonMesh

    AcDbRegion

    AcDbSequenceEnd

    AcDbShape

    AcDbSolid

    AcDbText

    AcDbAttribute

    AcDbAttributeDefinition

    AcDbTrace

    AcDbVertex

    AcDb2dPolylineVertex

    AcDb3dPolylineVertex

    AcDbPolyFaceMeshVertex

    AcDbPolygonMeshVertex

    AcDbViewport

    AcDbProxyEntity

    Pgina 33 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    34/104

    Propriedades Comuns das Entidades

    Todas as entidades tm propriedades comuns que quando se adiciona para o block table record,automaticamente o AutoCAD (AcDbEntity::setDatabaseDefaults()) define os valores default, isso se

    a definio no estiver explcita em seu cdigo:

    Color

    A cor das entidades pode ser um valor numrico de 0 at 256, sendo que as cores padro so:

    A seguinte funo seta a cor da entidade e assim ignora o valor default:

    virtual Acad::ErrorStatus

    AcDbEntity::setColorIndex(Adesk::UInt16 color);

    Adesk::UInt16

    AcDbEntity::colorIndex() const;

    Linetype

    Quando uma entidade instanciada, sua linetype do tipo NULL. Quando a entidade adicionada nobanco de dados, se no tiver sido especificado pela entidade, a linetype setada no valor default que armazenado no sistema de variveis CELTYPE.

    A funo seguinte permite estabelecer uma linetype para uma entidade:

    virtual Acad::ErrorStatus

    Nmero da cor Nome da cor1 Vermelho2 Amarelo3 Verde4 Cinza5 Blue6 Magenta7 Branco ou Preto

    0 BYBLOCK 256 BYLAYER

    Pgina 34 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    35/104

    AcDbEntity::setLinetype(const char* newVal);

    virtual Acad::ErrorStatus

    AcDbEntity::setLinetype(AcDbObjectId newVal);

    A funo retorna o nome da linetype corrente na entidade:char* AcDbEntity::linetype() const;

    A funo retorna o object ID para o symbol table record especificando a linetype:

    AcDbObjectId AcDbEntity::linetypeId() const;

    LinetypeScale

    Quando uma entidade instanciada, sua linetype scale inicializada para um valor invlido. Quandoa entidade adicionada no banco de dados, se no tiver sido especificado pela entidade, a linetypescale setada no valor default que armazenado no sistema de variveis CELTSCALE.

    Linetype Scale Especificada pela Entidade

    Acad::ErrorStatus

    AcDbEntity::setLinetypeScale(double newVal);

    double

    AcDbEntity::linetypeScale() const;

    Regenerando um Desenho

    Quando uma entidade regenerada, sua linetype scale um produto da entidade linetype scale etambm do banco de dados global linetype scale.. Assim a linetype scale calculada da seguinteforma:

    effltscale = ent->linetypeScale() *

    ent->database()->ltscale();

    Visibilidade

    Se for especificado que uma entidade invisvel ela ser independente do que foi estabelecido pelobanco de dados.

    Acad::ErrorStatus

    AcDbEntity::setVisibility(AcDb::Visibility newVal);

    AcDb::Visibility

    AcDbEntity::visibility() const;

    Pgina 35 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    36/104

    Layer

    Pode-se especificar um layer para toda entidade, se isso no for feito ela ter o layer default 0. Cadalayer tem uma srie de propriedades associadas frozen/thawed, on/off, locked/unlocked, color,linetypee viewport. As funes seguintes permitem que o layer seja estabelecido para uma entidade:

    Acad::ErrorStatusAcDbEntity::setLayer(const char* newVal);

    Acad::ErrorStatus

    AcDbEntity::setLayer(AcDbObjectId newVal);

    Essa funo retorna o nome do layer corrente da entidade:

    char* AcDbEntity::layer() const;

    Essa funo retorna o object ID do layer corrente:

    AcDbObjectId AcDbEntity::layerId() const;

    Funes Comuns das Entidades

    intersectWith( ) : usada em operaes de interseo; transformBy( ): usada como uma matriz de transformao quando o objeto sofre certas

    mudanas; getTransformedCopy( ): cria uma cpia e aplica uma transformao no objeto;

    getOsnapPoints( ): retorna o osnap pointse seu tipo; getGripPoints( ) : retorna o grip pointsque um conjunto do stretch points getStretchPoints( ): defaults do para o getGripPoints( ) moveStretchPointsAt( ): usado pelo comando STRETCH para mover certos pontos e defaults

    para transformBy( ); moveGripPointsAt( ): usado pelos grips para mover pontos especficos pontos e defaults para

    transformBy( ); worldDraw( ): cria uma representao grfica independente da entidade; vuewportDraw( ): : cria uma representao grfica dependente da entidade; draw( ): desenha as entidades grficas; list( ): usada pelo comando LISTe produz um ads_printf( ); getGeomExtents ( ): retorna as esquinas de uma caixa fechada da entidade; explode( ): decompe uma entidade em um conjunto de entidades elementares; getSubentPathsAtGsMarker( ): retorna o caminho da subentidade que corresponde ao dado GS

    marker; getGsMarkersAtSubentPath( ): retorna o GS markerque corresponde ao caminho da

    subentidade; subentPtr( ): retorna um ponteiro para o caminho da subentidade; highlight ( ): torna as subentidades com uma representao na seleo do tipo highlight.

    Object Snap

    Para adquirir os snap points para os modos especficos usa-se a funo getOsnapPoints( ). Os modosexistentes so:

    Pgina 36 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    37/104

    kOsModeEnd Endpoint kOsModeMid Midpoint kOsModeCen Center kOsModeNode Node kOsModeQuad Quadrant kOsModeIns Insertion kOsModePerp Perpendicular kOsModeTan Tangent kOsModeNear Nearest

    A funo da seguinte forma:

    virtual Acad::ErrorStatus

    AcDbEntity::getOsnapPoints( AcDb::OsnapMode osnapMode,

    int gsSelectionMark,

    const AcGePoint3d& pickPoint,

    const AcGePoint3d& lastPoint,

    const AcGeMatrix3d& viewXform,

    AcGePoint3dArray& snapPoints,

    AcDbIntArray& geomIds) const;Funes de Transformao

    A classeAcDbEntityfornece duas funes de transformao:

    virtual Acad::ErrorStatus

    AcDbEntity::transformBy(const AcGeMatrix3d& xform);

    Essa funo chamada no Grip Move, ROTATE, SCALEe MIRROR

    virtual Acad::ErrorStatus

    AcDbEntity::getTransformedCopy(const AcGeMatrix3d& xform,

    AcDbEntity*& ent) const;

    Essa funo chamada quando houver a necessidade de criar uma nova entidade, como quando umaentidade explodida e sofre uma escala no uniforme.

    Interseo por Pontos

    A funo intersectWith( ) retorna os pontos onde uma entidade intercepta outra no desenho. Os tiposde interseo podem ser:

    Pgina 37 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    38/104

    kOnBothOperands(entidade extendida) kExtendThis kExtendArg kExtendBoth

    A funo intersectWith( ) uma funo sobrecarregada com duas formas, sendo que a Segunda levaum argumento adicional que o plano de projeo para determinar a aparente interseo:

    virtual Acad::ErrorStatus

    AcDbEntity::intersectWith( const AcDbEntity* ent,

    AcDb::Intersect intType,

    AcGePoint3dArray& points,

    int thisGsMarker = 0,

    int otherGsMarker = 0) const;

    virtual Acad::ErrorStatus

    AcDbEntity::intersectWith( const AcDbEntity* ent,

    AcDb::Intersect intType,

    const AcGePlane& projPlane,

    AcGePoint3dArray& points,int thisGsMarker = 0,

    int otherGsMarker = 0) const;

    GS Markers e Subentidades

    Toda entidade para ser desenhada chama as primitivas grficas, assim como, lines, circles e etc queso contidas noAcGilibrary. Qualquer classe derivada doAcDbEntitypode associar um GS( sistemagrfico) marker e cada subclasse da entidade controla onde inserir seu GS markers. Onde um usurio

    seleciona uma entidade, o GS marker usado para identificar qual parte da entidade foi selecionada.Explodindo Entidades

    Algumas entidades podem ser explodidas em um conjunto de simples elementos, pois a funoexplode( ) cria um array de objetos derivados de AcDbEntity. Quando um entidade explodida:

    A aparencia visual constante; A entidade explodida apagada do banco de dados; Uma ou mais entidades so criadas e adicionadas ao banco de dados.

    Criando Instancias de Entidades no AutoCAD

    Pgina 38 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    39/104

    Criando uma Simples Entidade: criao de uma line e seu acrescimo no model space block tablerecord

    AcDbObjectId

    createLine()

    {

    AcGePoint3d startPt(4.0, 2.0, 0.0);

    AcGePoint3d endPt(10.0, 7.0, 0.0);

    AcDbLine *pLine = new AcDbLine(startPt, endPt);

    AcDbBlockTable *pBlockTable;

    acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);AcDbBlockTableRecord *pBlockTableRecord;

    pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord, AcDb::kForWrite);

    pBlockTable->close();

    AcDbObjectId lineId;

    pBlockTableRecord->appendAcDbEntity(lineId, pLine);

    pBlockTableRecord->close();

    pLine->close();

    return lineId;

    }

    Criando um Simples Block Table Record: criao de um novo block table record e seu acrescimono block table.

    void

    makeABlock()

    {

    // Cria e nomeia um novo block table record.

    AcDbBlockTableRecord *pBlockTableRec = new AcDbBlockTableRecord();

    pBlockTableRec->setName("ASDK-NO-ATTR");

    // Block table.

    Pgina 39 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    40/104

    AcDbBlockTable *pBlockTable = NULL;

    acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForWrite);

    // Adiciona o novo block table record para o block table.

    AcDbObjectId blockTableRecordId;pBlockTable->add(blockTableRecordId, pBlockTableRec);

    pBlockTable->close();

    // Cria e adiciona uma line no block record.

    AcDbLine *pLine = new AcDbLine();

    AcDbObjectId lineId;

    pLine->setStartPoint(AcGePoint3d(3, 3, 0));

    pLine->setEndPoint(AcGePoint3d(6, 6, 0));

    pLine->setColorIndex(3);

    pBlockTableRec->appendAcDbEntity(lineId, pLine);

    pLine->close();

    pBlockTableRec->close();

    }

    Entidades Complexas

    Criando uma Entidade Complexa

    void

    createPolyline()

    {

    // Seta 4 verteces para a pline

    AcGePoint3dArray ptArr;

    Pgina 40 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    41/104

    ptArr.setLogicalLength(4);

    for (int i = 0; i < 4; i++) {

    ptArr[i].set((double)(i/2), (double)(i%2), 0.0);

    }// Aloca dinamicamente um objeto AcDb2dPolyline,

    // dando 4 elementos cujo a locao fornecida em

    // ptArr. A polyline fechada e no curva.

    AcDb2dPolyline *pNewPline = new AcDb2dPolyline(

    AcDb::k2dSimplePoly, ptArr, 0.0, Adesk::kTrue);

    pNewPline->setColorIndex(3);

    // Ponteiro para um BlockTable Object

    AcDbBlockTable *pBlockTable;

    acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);

    // Ponteiro para MODEL_SPACE BlockTableRecord

    AcDbBlockTableRecord *pBlockTableRecord;

    pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord, AcDb::kForWrite);

    pBlockTable->close();

    // Adiciona a pline para o banco de dados e obtem seu object ID

    AcDbObjectId plineObjId;

    pBlockTableRecord->appendAcDbEntity(plineObjId, pNewPline);

    pBlockTableRecord->close();

    // Layer "0"

    pNewPline->setLayer("0");

    pNewPline->close();

    }

    Pgina 41 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    42/104

    Acesso ao Sistema de Coordenadas

    Funes das entidades setam os valores de suas coordenadas usando World Coordinate System . Tem-se como exceo o caso da classe AcDb2dPolylineVextex, que usa o valor da Entity Coordinate

    System.

    VII. Objetos Container

    Essa sesso descreve os objetos container usados no banco de dados do AutoCAD: symboltables, dictionaries, groups e xrecords. Mostra tambm como utiliz-los , interagi-los e comocri-los.

    Comparao entre Symbol Tables e Dictionaries

    Symbol tables e dictionariesexecutam essencialmente a mesma funo; eles contem entradas queso objetos de banco de dados que so acessados utilizando-se uma string chave. Pode-se adicionaroutras entradas a esses objetos e tambm usar iterators para percorrer passos a passo as entradas econtedos.

    O AutoCAD contem um conjunto fixo de nove symbol tables, que no podem ser criados oudeletados. O que pode ser feito acrescentar ou mudar as entradas em um symboltables(records).Sendo que cada symboltablecontem somente um tipo particular de objetos.

    Os dictionariesfornecem um mecanismo similar para armazenamento e recuperao de objetos comnomes chaves. O AutoCAD cria o named object dictionary sempre que cria um novo desenho, e a

    partir desse pode se criar outro objetos e adicion-los no mesmo. Contudo, o mais prtico seriaadicionar um nico objeto no named object dictionarye a partir dele adicionar outros dictionaries.Tipicamente, o objeto possudo uma classe container assim como um dictionary. O dictionary, pordefault, contm dois dictionaries: ACAD_GROUPe ACAD_MLINESTYLE.

    A classe hierrquica para symbol tables, symbol tables records, dictionaries e iterators aseguinte:

    AcRxObject

    AcDbObject

    AcDbDictionary

    AcDbDictionaryIterator

    (AcRxObject)(AcDbObject)

    Pgina 42 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    43/104

    AcDbSymbolTable

    AcDbBlockTable

    AcDbDimStyleTable

    AcDbLayerTableAcDbLinetypeTable

    AcDbRegAppTable

    AcDbTextStyleTable

    AcDbUCSTable

    AcDbAbstractViewTable

    AcDbViewportTable

    AcDbViewTable

    AcDbSymbolTableRecord

    AcDbBlockTableRecord

    AcDbDimStyleTableRecord

    AcDbLayerTableRecord

    AcDbLinetypeTableRecord

    AcDbRegAppTableRecord

    AcDbTextStyleTableRecord

    AcDbUCSTableRecord

    AcDbAbstractViewTableRecord

    AcDbViewportTableRecord

    AcDbViewTableRecord

    AcDbSymbolTableIterator

    AcDbBlockTableIterator

    AcDbBlockTableRecordIterator

    AcDbDimStyleTableIterator

    AcDbLayerTableIterator

    Pgina 43 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    44/104

  • 8/14/2019 ObjectARX.pdf

    45/104

    Outra funes pra o symbol tablesso:

    Adesk::Boolean

    AcDb##BASE_NAME##Table::has(const char* pName) const;

    Acad::ErrorStatusAcDb##BASE_NAME##Table::add(AcDb##BASE_NAME##TableRecord*

    pRecord);

    Acad::ErrorStatus

    AcDb##BASE_NAME##Table::add(AcDbObjectId& record Id,

    AcDb##BASE_NAME##TableRecord*

    pRecord);

    Block Table

    Entidades no banco de dados pertencem ao block table record. O block tablecontem dois recordscomo default, MODEL_SPACE e PAPER_SPACE, que correspondem a dois espaos de edio.

    Layer Table

    O layer table contem um layer, layer 0, por default. O usurio pode adicionar outros atravs do

    comando LAYER.Propriedades do Layer

    A classe AcDbLayerTableRecord contem funes membro para especificar o nmero depropriedades que afetaram a entidade.

    Frozen/Thawed

    void AcDbLayerTableRecord::setIsFrozen(Adesk::Boolean);

    Adesk::Boolean

    AcDbLayerTableRecord::isFrozen() const;

    On/Off

    void AcDbLayerTableRecord::setIsOff(Adesk::Boolean);

    Adesk::Boolean

    AcDbLayerTableRecord::isOff() const;

    Viewport

    void AcDbLayerTableRecord::setVPDFLT(Adesk::Boolean);

    Pgina 45 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    46/104

    Adesk::Boolean

    AcDbLayerTableRecord::VPDFLT() const;

    Locked/Unlocked

    void AcDbLayerTableRecord::setIsLocked(Adesk::Boolean);Adesk::Boolean

    AcDbLayerTableRecord::isLocked() const;

    Color

    void AcDbLayerTableRecord::setColor(const AcCmColor &color);

    AcCmColor

    AcDbLayerTableRecord::color() const;

    Linetype

    void AcDbLayerTableRecord::setLinetypeObjectId(AcDbObjectId);

    AcDbObjectId

    AcDbLayerTableRecord::linetypeObjectId() const;

    Criando e Modificando um Layer Table Record

    O exemplo mostra como criar um novo layer table record(AcDbLayerTableRecord) e setarcertos atributos do layer.

    void

    addLayer()

    {

    AcDbLayerTable *pLayerTbl;

    acdbCurDwg()->getLayerTable(pLayerTbl, AcDb::kForWrite);

    if (!pLayerTbl->has("testlayer")) {

    AcDbLayerTableRecord *pLayerTblRcd

    = new AcDbLayerTableRecord;

    pLayerTblRcd->setName("ASDK_TESTLAYER");

    pLayerTblRcd->setIsFrozen(0); // layer para THAWED

    pLayerTblRcd->setIsOff(0); // layer para ON

    Pgina 46 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    47/104

    pLayerTblRcd->setVPDFLT(0); // viewport default

    pLayerTblRcd->setIsLocked(0); // un-locked

    AcCmColor color;

    color.setColorIndex(1); // seta a cor para vermelhopLayerTblRcd->setColor(color);

    // Para linetype necessrio fornecer o object id da

    // linetype record

    AcDbObjectId ltId;

    acdbCurDwg()->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);

    if ((pLinetypeTbl->getAt("DASHED", ltId))

    != Acad::eOk)

    {

    ads_printf("\nUnable to find DASHED"

    " linetype. Using CONTINUOUS");

    pLinetypeTbl->getAt("CONTINUOUS", ltId);

    }

    pLinetypeTbl->close();

    pLayerTblRcd->setLinetypeObjectId(ltId);

    pLayerTbl->add(pLayerTblRcd);

    pLayerTblRcd->close();

    pLayerTbl->close();

    } else {

    ads_printf("\nlayer already exists");

    }

    }

    Iterators

    Pgina 47 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    48/104

    Cada symbol table tem um iterator correspondente que pode ser criado com a funoAcDb##BASE_NAME::newIterator( ).

    AcDb##BASE_NAME##Table::newIterator() function.

    Acad::ErrorStatus

    AcDb##BASE_NAME##Table::newIterator(

    AcDb##BASE_NAME##TableIterator*&

    pIterator,

    Adesk::Boolean

    atBeginning = Adesk::kTrue,

    Adesk::BooleanskipErased = Adesk::kTrue)

    const;

    A funo newIterator( ) cria um objeto que pode ser usado para percorrer atravs do contedo datable e estabelecer pIterator para apontar para o objeto iterator. possvel se criar um novoiterator, mas no se pode esquecer de delet-lo antes de fechar o symbol table. A classe

    AcDbBlockTableRecord retorna um objeto da classe AcDbBlockTableRecordIterator , que permitepercorrer atravs das entidades contidas no block table record.

    Interagindo sobre Tables

    O exemplo cria um iterator que percorre pelo symbol table record na linetype table.

    void

    iterateLinetypes()

    {

    AcDbLinetypeTable *pLinetypeTbl;

    acdbCurDwg()->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);

    // Cria um novo iterator.

    AcDbLinetypeTableIterator *pLtIterator;

    pLinetypeTbl->newIterator(pLtIterator);

    // Percorre a table

    AcDbLinetypeTableRecord *pLtTableRcd;

    Pgina 48 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    49/104

    char *pLtName;

    for (; !pLtIterator->done(); pLtIterator->step()) {

    pLtIterator->getRecord(pLtTableRcd, AcDb::kForRead);

    pLtTableRcd->getName(pLtName);pLtTableRcd->close();

    ads_printf("\nLinetype name is: %s", pLtName);

    free(pLtName);

    }

    delete pLtIterator;

    pLinetypeTbl->close();

    }

    Dictionaries

    Para criar um novo dictionary, necessrio criar uma instancia do AcDbDictionary, adicionar nobanco de dados e registrar com o objeto. Quando isso acontece o dictionaryautomaticamente anexaum reactor para a entrada. Com a funo setAt( )adiciona objetos para o dictionarye o banco dedados.

    Acad::ErrorStatus

    AcDbDictionary::setAt(const char* pSrchKey,

    AcDbObject* pNewValue,

    AcDbObjectId& retObjId);

    Groups e o Group Dictionary

    Um Group um objeto container que mantem uma coleo ordenada de entidades no banco dedados, porem ele no tem um ownership link para as entidades que contem. Quando uma entidade apagada , os groups que a contem so automaticamente removidos. Se a mesma entidade fordesapagada, os groupsso novamente inseridos.

    Algumas funes podem ser usadas para os Groups e no necessrio setar cada elemento, porexemplo: setColor(), setLayer(), setLinetype(), setVisibility(), and setHighlight(). Os Groups devemser armazenados no GROUPdictionary, que pode ser obtido da seguinte forma:

    AcDbDictionary* pGrpDict = acdbCurDwg()->getGroupDictionary(

    pGroupDict, AcDb::kForWrite);

    Pgina 49 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    50/104

    Criando um Dictionary

    O exemplo cria um dictionary(ASDK_DICT) e adiciona para o named object dictionary. Ento elecria dois novos objetos da classe customizadaAsdkMyClasse adiciona no dictionary.

    void

    createDictionary()

    {

    AcDbDictionary *pNamedobj;

    acdbCurDwg()->getNamedObjectsDictionary(pNamedobj, AcDb::kForWrite);

    // Checa a existencia do dictionary

    AcDbDictionary *pDict;if (pNamedobj->getAt("ASDK_DICT", (AcDbObject*&) pDict,

    AcDb::kForWrite) == Acad::eKeyNotFound)

    {

    pDict = new AcDbDictionary;

    AcDbObjectId DictId;

    pNamedobj->setAt("ASDK_DICT", pDict, DictId);

    }

    pNamedobj->close();

    if (pDict) {

    // Cria novos objects para adicionar para o novo dictionary,

    AsdkMyClass *pObj1 = new AsdkMyClass(1);

    AsdkMyClass *pObj2 = new AsdkMyClass(2);

    AcDbObjectId rId1, rId2;

    pDict->setAt("OBJ1", pObj1, rId1);

    pDict->setAt("OBJ2", pObj2, rId2);

    pObj1->close();

    pObj2->close();

    pDict->close();

    Pgina 50 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    51/104

    }

    Interagindo sobre Entradas do Dictionary

    A classe iterator para dictionaries AcDbDictionaryIterator. O exemplo a seguir obtem umdictionary(ASDK_DICT) do named object dictionarye usa um iteradorpara percorrer as entradas

    dodictionary

    .void

    iterateDictionary()

    {

    AcDbDictionary *pNamedobj;

    acdbCurDwg()->getNamedObjectsDictionary(pNamedobj, AcDb::kForRead);

    // D o ponteiro para ASDK_DICT dictionary

    AcDbDictionary *pDict;

    pNamedobj->getAt("ASDK_DICT", (AcDbObject*&)pDict, AcDb::kForRead);

    pNamedobj->close();

    // D o iterador para ASDK_DICT dictionary

    AcDbDictionaryIterator* pDictIter= pDict->newIterator();

    AsdkMyClass *pMyCl;

    Adesk::Int16 val;

    for (; !pDictIter->done(); pDictIter->next()) {

    // D o corrente record, o abre para ler

    pDictIter->getObject((AcDbObject*&)pMyCl, AcDb::kForRead);

    pMyCl->getData(val);

    pMyCl->close();

    ads_printf("\nintval is: %d", val);

    }

    delete pDictIter;

    pDict->close();

    Pgina 51 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    52/104

    }

    Xrecords

    Xrecords permite a adio de dados especficos de forma arbitrria e limitada. Essa uma formaalternativa de guardar dados mais utilizada em ADS ou AutoLISP.

    Definindo Novas ClassesIII. Derivando um Classe Customizada ARX

    Nessa sesso tem-se como utilizar as macros em ARX derivando da classe customizada ARX.

    Derivao da Classe Customizada

    possvel derivar novas classes das classes j existentes na hierarquia ARX:

    AcRxObject

    AcRxService

    AcDbObject

    AcDbEntity

    AcDbCurve

    AcDbObjectReactor

    AcDbDatabaseReactor

    AcDbEntityReactor

    AcTransactionReactor

    AcEdJig

    AcEditorReactor

    Classes que no devem derivar:

    AcDbAttribute

    AcDbAttributeDefinition

    Pgina 52 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    53/104

    AcDbArc

    AcDbBlockReference

    AcDbCircle

    AcDbFaceAcDbLine

    AcDbMInsertBlock

    AcDbPoint

    AcDbShape

    AcDbSolid

    AcDbText

    AcDbTrace

    All AcDbXxxDimension classes

    AcDbViewport

    AcDbGroup

    All classes derived from AcDbSymbolTable

    All classes derived from AcDbSymbolTableRecord

    AcDbBlockBegin

    AcDbBlockEnd

    AcDbSequenceEnd

    AcDb2dPolyline

    AcDb2dPolylineVertex

    AcDb3dPolyline

    AcDb3dPolylineVertex

    AcDbPolygonMesh

    AcDbPolygonMeshVertex

    AcDbPolyFaceMesh

    AcDbPolyFaceMeshVertex

    Pgina 53 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    54/104

    AcDbFaceRecord

    Identificao de Classes Rotina

    Toda classe na hierarquia ARX que derivada de AcRxObject tem uma classe dedescrio do objeto, que uma instancia de AcRxClass que guarda informaes para otipo de identificao. Essas classes so criadas na inicializao, quando classes soregistradas com ARX e so adicionadas no dictionary, acrxClassDictionary.

    Macro:Classes de Declarao

    As macros so usadas numa seo pblica das classes de declarao:

    class myClass : public AcRxObject

    {

    public:

    ACRX_DECLARE_MEMBERS(myClass);

    ...

    };

    Quando expandida:

    virtual AcRxClass* isA() const;

    static AcRxClass* gpDesc;

    static AcRxClass* desc();

    static AsdkPoly* cast(const AcRxObject* inPtr)

    {

    return ((inPtr == 0)

    || !inPtr->isKindOf(AsdkPoly::desc()))

    ? 0 : (AsdkPoly*)inPtr;

    };

    static void rxInit();

    Macro:Classes de Implementao

    Pgina 54 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    55/104

  • 8/14/2019 ObjectARX.pdf

    56/104

    AcDbObject: Funes para Sobrecarregar Essencialmente

    virtual Acad::ErrorStatus

    dwgInFields(AcDbDwgFiler* filer);

    virtual Acad::ErrorStatusdwgOutFields(AcDbDwgFiler* filer) const;

    virtual Acad::ErrorStatus

    dxfInFields(AcDbDxfFiler* filer);

    virtual Acad::ErrorStatus

    dxfOutFields(AcDbDxfFiler* filer) const;

    AcDbObject: Funes 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: Funes para Sobrecarregar Eventualmente

    virtual Acad::ErrorStatus

    Pgina 56 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    57/104

    subErase(Adesk::Boolean erasing);

    virtual Acad::ErrorStatus

    subHandOverTo(AcDbObject* newObject);

    virtual Acad::ErrorStatussubOpen(AcDb::OpenMode);

    virtual Acad::ErrorStatus

    subCancel();

    virtual Acad::ErrorStatus

    subSwapIdWith(AcDbObjectId otherId,

    Adesk::Boolean swapXdata = Adesk::kFalse);

    AcDbObject: Funes 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

    Pgina 57 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    58/104

    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: Funes para Sobrecarregar Raramente

    virtual AcRxObject*

    clone() const;

    virtual void

    copyFrom(const AcRxObject* pSrc);

    virtual HRESULT __stdcall

    QueryInterface ( REFIID riid, void ** ppvObject );

    virtual ULONG __stdcall

    AddRef();

    Pgina 58 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    59/104

    virtual ULONG __stdcall

    Release();

    AcDbEntity: Funes para Sobrecarregar

    virtual Adesk::BooleanworldDraw(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: Funes para Sobrecarregar Usualmente

    virtual void

    list() const;

    virtual Acad::ErrorStatus

    intersectWith( const AcDbEntity* ent,

    AcDb::Intersect intType,

    Pgina 59 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    60/104

    AcGePoint3dArray& points,

    int thisGsMarker = 0,

    int otherGsMarker = 0) const;

    virtual Acad::ErrorStatusintersectWith( 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

    getSubentPathsAtGsMarker(AcDb::SubentType type,

    Pgina 60 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    61/104

    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

    saveImagesByDefault() const;

    Pgina 61 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    62/104

    AcDbEntity: Funes para Sobrecarregar Raramente

    virtual Acad::ErrorStatus

    setColor(const AcCmColor &color);

    virtual Acad::ErrorStatussetColorIndex(Adesk::UInt16 color);

    virtual Acad::ErrorStatus

    setLinetype(const char* newVal);

    virtual Acad::ErrorStatus

    setLinetype(AcDbObjectId newVal);

    AcDbCurve: Funes 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

    Pgina 62 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    63/104

    getPointAtParam(double, AcGePoint3d&) const;

    virtual Acad::ErrorStatus

    getParamAtPoint(const AcGePoint3d&, double&)const;

    virtual Acad::ErrorStatusgetDistAtParam (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

    Pgina 63 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    64/104

    = 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

    extend(double newParam);

    Pgina 64 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    65/104

    virtual Acad::ErrorStatus

    extend(Adesk::Boolean extendStart,

    const AcGePoint3d& toPoint);

    virtual Acad::ErrorStatusgetArea(double&) const;

    Implementando Funes Membro

    Quando se define uma nova funo membro ou se sobrecarrega uma funo j existente, a primeiraque usualmente deve-se chamar assertReadEnabled( ), assertWriteEnabled( ), ouassertNotifyEnabled( )para verificar se o objeto foi aberto da forma certa.

    Objetos abrem para:

    Filing

    A partir da derivao de uma nova classe de AcDbObject, necessrio adicionar aldumasinformaes o mecanismo de armazenamento do AutoCAD. As quatro funes abaixo so 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 returnsassertWriteEnabled( ) aborts returns abortsassertNotifyEnabled( ) returns returns returns

    Pgina 65 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    66/104

    Cada funo leva um ponteiro para um arquivo como seu argumento primario. Um AcDbObjectescreve e l dados para um arquivo. O FilerTypepermite a checagem do tipo de arquivo.

    kFileFiler (used for DWG and DXF files) kCopyFiler kUndoFiler kBagFiler (usado com ads_entmake(), ads_entmod(), e ads_entget()) kIdXlateFiler kPageFiler kDeepCloneFiler kWBlockCloneFiler kPurgeFiler

    As funes dwgOut( )e o dwgIn( )chamam dwgOutFields( )e dwgInField( ), respectivamente. Coma derivao deAcDbObject, haver a necessidade de sobrecarregar algumas funes virtuais, que sousadas para armazenagem persistente de objetos, em operaes de cpia ou undo:

    dwgOutFields( ) dwgInFields( ) dxfOutFields( ) dxfInFields( )

    Funo dwgOut( )

    A funo dwgOut( )que chamadwgOutFields( ), invocada pelos seguintes comandos:

    SAVE(usa kFileFiler) SAVEAS(usa kFileFiler) WBLOCK(usa kWblockCloneFilere kIdXlateFiler) INSERT, XREF(usa kDeepCloneFilere kIdXlateFiler) COPY(usa os mesmos arquivos que INSERT) PURGE(usa um kPurgeFiler) Quando um objeto paginado para fora (uses a kPageFiler) Quando um objeto modificado (para undo; usa um kUndoFiler)

    Funo dwgIn( )

    A funo dwgInt( )que chamadwgInFields( ), invocada pelos seguintes comandos:

    OPEN(usa kFileFiler) UNDO(usa kUndoFiler) INSERT, COPY, XREF(usa kDeepCloneFilere kIdXlateFiler) WBLOCK(usa kWblockCloneFilere kIdXlateFiler) Quando um objeto paginado para dentro(usa kPageFiler)

    Funo dxfOut( )

    Pgina 66 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    67/104

    A funo dxfOut( )que chamadxfOutFields( ), invocada pelos seguintes comandos:

    DXFOUT ads_entget( )

    Funo dxfIn( )

    A funo dxfIn( )que chamadxfInFields( ), invocada pelos seguintes comandos:

    DXFIN ads_entmod( )ou ads_entmake( )

    Implementando as Funes de Arquivamento DWG

    Ao implementar as funes dwgOutFields( )e dwgInField( )para uma nova classe, deve-se chamarprimeiro as funes assertReadEnabled( ) e assertWriteEnabled( ) para garantir que o objeto foiaberto corretamente.

    AcDbDerivedClass::dwgOutFields( ... );

    {

    assertReadEnabled()

    myParent::dwgOutFields();}

    Exemplo:

    Acad::ErrorStatus

    AsdkPoly::dwgOutFields(AcDbDwgFiler* filer) const

    {

    assertReadEnabled();

    Acad::ErrorStatus es;

    if ((es = AcDbCurve::dwgOutFields(filer))

    != Acad::eOk)

    {

    return es;

    }

    Pgina 67 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    68/104

    filer->writeItem(mCenter);

    filer->writeItem(mStartPoint);

    filer->writeInt32(mNumSides);

    filer->writeItem(mPlaneNormal);filer->writeItem(mpName);

    filer->writeItem(mTextStyle);

    return es;

    Acad::ErrorStatus

    AsdkPoly::dwgInFields(AcDbDwgFiler* filer)

    {

    assertWriteEnabled();

    Acad::ErrorStatus es;

    if ((es = AcDbCurve::dwgInFields(filer)) != Acad::eOk) {

    return es;

    }

    filer->readItem(&mCenter);

    filer->readItem(&mStartPoint);

    filer->readInt32((long*) &mNumSides);

    filer->readItem(&mPlaneNormal);

    filer->readItem(&mpName);

    filer->readItem(&mTextStyle);

    return es;

    }

    Implementando as Funes de Arquivamento DXF

    Ao implementar as funes dxfOutFields( ) e dxfInField( ) para uma nova classe, deve-se chamarprimeiro as funes assertReadEnabled( ) e assertWriteEnabled( ) para garantir que o objeto foi

    aberto corretamente.

    Pgina 68 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    69/104

  • 8/14/2019 ObjectARX.pdf

    70/104

    e o objeto possuido. Um objeto pode ter apenas um possuidor. Essa conexo usualmente feita emduas fases:

    Especificar o objeto possuidor; Especificar qual o objeto possuido.

    O protocolo do AcDbObject sempre especifica o link do objeto possuidor para o possuido.// Setar pOwner para ser o possuidor de pOwned

    void

    makeOwner(OwnerDemo* pOwner, AcDbObject* pOwned)

    {

    pOwner->setIdData(pOwned->ojectId());

    pOwned->setOwnerId(pOwner->objectId());

    }

    No caso de algumas classes containers essa relao j estabelecida. A funo seta o block tablerecord como o possuidor da entidade:

    blockTableRecord->appendAcDbEntity( ...);

    Usos do Ownership

    Quando um objeto escrito para um arquivo DXFou DWG, todos os objetos possuidos por ele sotambem copiados. A operao deep clone tambem faz com que todos os objetos possuidos peloobjeto clonado, sejam tambm clonados. Um hard ownership protege o objeto possuido de ser

    purgado.

    Tipos de Ownership

    Os ownerpodem ser de dois tipos:

    Hard Ownership

    Um objeto de banco de dados um hard ownerde seu extension dictionary; O block table um hardownerdo model space e paper space block table records; Extensiondictionariesso hard ownersde seus elementos.

    Soft Ownership

    Symbol tablesso soft ownersde seus elementos ( com exceo doMODEL_SPACE,PAPER_SPACEe layer 0);

    Pgina 70 de 104ObjectARX Bsico

    14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...

  • 8/14/2019 ObjectARX.pdf

    71/104

    Dictionariesso soft ownersde suas entradas.

    Referncias Pointer

    Um pointer um one-way link , ou seja, no h nenhuma informao no objeto referenciado queindique a origem do ponteiro. Um objeto pode apontar ou ser apontado por qualquer nmero de outrosobjetos.

    Hard Pointers

    Um hard pointerprotege um objeto de ser purgado. Tem-se alguns exemplos de hard pointers:

    Uma entidade contm um hard pointerpara um estilo de dimensionamento; Uma entidade texto contem um hard pointercomo referncia para um estilo de texto; Uma entidade de dimensionamento contm um hard pointerrefernciado para um estilo de

    dimensionamento; Uma entidade tem um hard pointerpara um layer.

    Soft Pointers

    Um soft pointer um simples ponteiro para um objeto. Ele no protege o objeto referenciado de umpurge. Exemplos:

    Referncias Xdataso soft pointers; Persistentreactorsso soft pointers.

    Purge

    O mecanismo purgepermite apagar objetos no utilizados no banco de dados. Se um objeto tem umhard owner ou um pointer reference, ele no pode ser apagado.

    AcDbDatabase::purge(AcDbObjectIdArray &idArray);

    A funopurge( ) retorna o ID dos objetos que podem ser purgados, sendo assim existe um controlesobre os objetos que esto sendo apagados.

    Undo e Redo

    Existem dois caminhos bsicos para a aplicao de uma operao Undo. O mecanismo de Undoautomtico, default, deixa o sistema copiar o estado completo do objeto chamando a funodwgOutFields( )com o arquivo Undo. Um mecanismo alternativo, o mecanismo de Undo parcial

    que requer um maior esforo programacional, porm habilita uma maior interao com as mudanas.

    Toda funo de modificao para a nova classe derivada, deve chamar a funo assertWriteEnabled( ), que checa se o objeto esta habilitado para ser escrito. Se o parmetro para o autoUndo kTrue, o