Você está na página 1de 104

ObjectARX Bsico

Pgina 1 de 104

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

ObjectARX For AutoCAD Release 14


Apostila do Desenvolvedor Reviso Abril/98
1a Edio Editor
Jos Ricardo Queiroz Franco

Autores
Alexandra Htner Fernando Poinho Malard Jacqueline Maria Flor

Juliana Mascarenhas

ndice Analtico Usando a Plataforma ARX


Introduo

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

ObjectARX Bsico

Pgina 2 de 104

ObjectARX o ambiente de programao do AutoCAD Runtime Extension. Este ambiente inclui bibliotecas da linguagem C++, que permitem o desenvolvimento de aplicativos especficos de classes e protocolos no AutoCAD extendidos, e cria novos comandos que operam da mesma maneira que os comandos intrnsecos do AutoCAD. A utilizao da linguagem C++ orientada a objetos pelo ObjectARX, faz com que se tenha um desenvolvimento 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, ao contrrio 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 uso das ferramentas de linguagem. Apesar de o ObjectARX j ter sido implementado na verso 13 do AutoCAD, recomendvel pela sua confiabilidade, a utilizao do AutoCAD release 14 for Windows. 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 que torna o trabalho ainda mais imediato.

I. Viso Geral

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

Ambiente ARX
O ambiente ARX fornece uma interface para a aplicao da linguagem orientada a objetos C++ que habilita desenvolvedores usar, customizar, e automatizar o AutoCAD. O ARX de extrema versatilidade na utilizao do seu banco de dados, no sistema grfico, e na definio dos seus comandos nativos. O ambiente ARX difere do ADS e do AutoLISP de enumeras formas. O AutoLISP uma linguagem interpretada pelo AutoCAD, uma simples forma de apenas adicionar comandos. Sua coneco com o AutoCAD feita atravs de um interprocesso de comunicao (IPC). Dessa mesma forma tambm o ADS que escrito em C e compilado antes de ser carregado via IPC pelo AutoLISP e s assim executado no AutoCAD. O ADS apenas uma traduo do AutoLISP.

Aplicativos ADS

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

ObjectARX Bsico

Pgina 3 de 104

IPC

AutoLISP
IPC

AutoCAD

Aplicativos ARX Bibliotecas ARX


Classe AcRx O AcRx fornece o nvel de classes para a inicializao DLL, linkagem e tambm registro e identificao das classes. A classe bsica AcRxObject. O AcRx tambm fornece um conjunto de macros em C++ para ajudar na criao de novas classes em ARX, que so derivadas do AcRxObject. Outra importante classe AcRxDictionary que um dicionrio de strings que aponta para outro objeto. O AcRx armazena classes, objetos e dicionrios. Classe hierrquica: AcRxObject AcRxClass AcRxDictionary AcRxDLinkerReactor AcRxDynamicLinker AcRxIterator AcRxDictionaryIterator AcRxService Classe AcEd O AcEd fornece classes para definio e registro de novos comandos (nativos) no AutoCAD que

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

ObjectARX Bsico

Pgina 4 de 104

operam da mesma maneira que os comandos internos do AutoCAD. Ambos comandos residem na mesma estrutura interna, AcEdCommandStack. Uma classe importante a AcEditorReactor, que monitora o editor do AutoCAD e notifica os eventos ocorridos. Classe hierrquica: AcRxObject AcEdCommandIterator AcEdCommandStack AcEditor AcEdJig AcEditorReactor AcTransaction AcTransactionManager AcTransactionReactor Classe AcDb O AcDb fornece classes que possibilitam o acesso na estrutura do banco de dados do AutoCAD. Este banco de dados armazena todas as informaes para os objetos grficos (entidades) e no grficos que compe 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 AcDbRecover AcDbRecoverCallBack AcDbHandle AcDbObjectId AcDbHardOwnershipId AcDbHardPointerId AcDbSoftOwnershipId AcDbSoftPointerId (Identificao do objeto)

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

ObjectARX Bsico

Pgina 5 de 104

AcDbIdMapping (Usado para deep clone) AcDbIdMappingIter AcDbIdPair AcDbSymbolTableIterator 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 (Iterators)

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

ObjectARX Bsico

Pgina 6 de 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

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

ObjectARX Bsico

Pgina 7 de 104

AcDbAlignedDimension AcDbDiametricDimension AcDbOrdinateDimension AcDbRadialDimension AcDbRotatedDimension AcDbFace AcDbFaceRecord AcDbFcf AcDbMline AcDbMText AcDbOleFrame AcDbPoint AcDbPolyFaceMesh AcDbPolygonMesh AcDbRegion AcDbSequenceEnd AcDbShape AcDbSolid AcDbText AcDbAttribute AcDbAttributeDefinition AcDbTrace AcDbVertex AcDb2dPolylineVertex AcDb3dPolylineVertex AcDbPolyFaceMeshVertex AcDbPolygonMeshVertex

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

ObjectARX Bsico

Pgina 8 de 104

AcDbViewport AcDbProxyEntity (AcRxObject) (AcDbObject) AcDbGroup AcDbMlineStyle AcDbSymbolTable AcDbBlockTable AcDbDimStyleTable AcDbLayerTable AcDbLinetypeTable AcDbRegAppTable AcDbTextStyleTable AcDbUCSTable AcDbAbstractViewTable AcDbViewportTable AcDbViewTable AcDbSymbolTableRecord (Symbol table records) AcDbAbstractViewTableRecord AcDbViewportTableRecord AcDbViewTableRecord AcDbBlockTableRecord AcDbDimStyleTableRecord AcDbLayerTableRecord AcDbLinetypeTableRecord AcDbRegAppTableRecord AcDbTextStyleTableRecord (Symbol tables)

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

ObjectARX Bsico

Pgina 9 de 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 funes membro 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 objeto AcGiWorldDraw fornece um API atravs do qual o AcDbEntity::worldDraw ( ) podeproduzir uma representao grfica em todos os viewports simultneamente. Similarmente, o objeto AcGiViewportDraw fornece um API atravs do qual o AcDbEntity::viewportDraw( ) pode produzir representaes grficas para cada viewport. Classe hierrquica: AcRxObject AcGiEdgeData AcGiFaceData AcGiSubEntityTraits AcGiTextStyle AcGiVertexData AcGiViewport AcGiViewportDraw AcGiViewportGeometry AcGiWorldDraw AcGiWorldGeometry Classe AcGe O AcGe usado pelo AcDb e fornece classes teis assim como vetores, pontos e matrizes (2D e 3D). Ela tambm disponibiliza objetos geomtricos simples como pontos, curvas e superfcies. Essas classes que compe AcGe podem ser usadas para operaes bsicas com vetores, pontos e matrizes. Os membros dessa classe devem ser declarados pblicos. Classe hierrquica: AcGePoint2d AcGeVector2d

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

ObjectARX Bsico

Pgina 10 de 104

AcGeMatrix2d AcGeScale2d AcGePoint2dArray AcGeVector2dArray AcGePoint3d AcGeVector3d AcGeMatrix3d AcGeScale3d AcGePoint3dArray AcGeVector3dArray AcGeTolerance AcGeInterval AcGeCurveBoundary AcGeDoubleArray AcGeKnotVector AcGeEntity2d AcGePointEnt2d AcGePosition2d AcGePointOnCurve2d AcGeCurve2d AcGeLinearEnt2d AcGeLine2d AcGeRay2d AcGeLineSeg2d AcGeCircArc2d AcGeEllipArc2d AcGeSplineEnt2d

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

ObjectARX Bsico

Pgina 11 de 104

AcGeCubicSpline2d AcGeNurbCurve2d AcGePolyLine2d AcGeExternalCurve2d AcGeEntity3d AcGePointEnt3d AcGePosition3d AcGePointOnCurve3d AcGePointOnSurface AcGeCurve3d AcGeLinearEnt3d AcGeLine3d AcGeRay3d AcGeLineSeg3d AcGeCircArc3d AcGeEllipArc3d AcGeExternalCurve3d AcGeSplineEnt3d AcGeCubicSpline3d AcGeNurbCurve3d AcGePolyLine3d AcGeAugPolyLine3d AcGeSurface AcGePlanarEnt AcGePlane AcGeBoundedPlane AcGeCylinder

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

ObjectARX Bsico

Pgina 12 de 104

AcGeCone AcGeSphere AcGeTorus AcGeNurbSurface AcGeExternalSurface AcGeOffsetSurface AcGeExternalBoundedSurface

Registrando comandos
No ARX pode-se adicionar novos comandos com a funo ads_defun() ou com a macro acedRegCmds(). Com a biblioteca de comandos ADS, os requisitos so antes passados pelo AutoLISP e depois para o aplicativo. Com o ARX, os comandos so adicionados diretamente ao conjunto de comandos do AutoCAD. Cada maneira de registrar os comandos afeta a forma de invoc-los. Se o comando de registro usado for o ads_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 funo ads_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 funo ads_command()

Entrada de pontos
ARX e ADS tem modelos diferentes para comunicar com o AutoCAD. Um aplicativo ADS consiste num loop infinito que espera pela requisio do AutoLISP. Um aplicativo ARX tem um entry point que usado para mensagens. Ento, quando um novo comando registrado, ele passa a ser um entry 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

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

ObjectARX Bsico

Pgina 13 de 104

O banco de dados do AutoCAD armazena os objetos e entidades que so feitas no desenho do AutoCAD. As entidades so objetos de desenho com representao grfica e so possudas pelo block table record que por sua vez armazenado no block table. O banco de dados constitudo por 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 de dados. Cada objeto no banco de dados tem um handle que uma identificao nica dentro do contexto 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 so containers de armazenamento de objetos. No caso do symbol table tem-se um conjunto fixo de elementos no banco de dados, cada um dos quais contem instncias de uma particular classe do

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

ObjectARX Bsico

Pgina 14 de 104

symbol table record. No permitido adicionar novos symbol table no banco de dados. Os dictionaries so objetos que mapeiam um symbol name para outro AcDb-objeto. Alm disso fornecem um container mais genrico para armazenamento de objetos, ele pode conter qualquer AcDbObject ou subclasse, e tambm, pode-se criar novos elementos de banco de dados e acrescentlos em um novo dictionary. Durante as sesses correntes do AutoCAD pode-se obter o banco de dados chamando a funo global acdbCurDwg( ). Mltiplos banco de dados podem ser carregados dentro de uma nica sesso do AutoCAD. Cada objeto na sesso tem um objeto ID, que um nico identificador para o objeto atravs de todos os banco de dados carregados. Em contraste, um objeto handle no garantido ser nico dentro de uma sesso do AutoCAD. Ele nico somente dentro de um escopo de um particular banco de dados. Objeto ID Com um objeto ID pode-se obter um ponteiro para o objeto do banco de dados atual, assim pode-se executar 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 iterator para 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 so adicionados para o block table record, e esses so adicionados para os symbol tables. Todos os outros 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 tables que incluem o block table (MODEL_SPACE e PAPER_SPACE ) e o layer table ( layer 0 ). Um named object dictionary que j contm p grupo dictionary e MLINE style dictionary ( STANDARD ).

Criando Objetos Exemplo: Criao de uma line e sua adio no model space block table record: AcDbObjectId createLine() { AcGePoint3d startPt(4.0, 2.0, 0.0);

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

ObjectARX Bsico

Pgina 15 de 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 circle e 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);

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

ObjectARX Bsico

Pgina 16 de 104

pBlockTableRecord->close(); pCirc->close(); return circleId; } Exemplo: Obtem o layer symbol table do banco de dados, cria um novo layer table record e o nomeia 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 esta fisicamente na memria quando ele necessita ser acionado. Antes de modificar um objeto ele precisa ser aberto: AcdbOpenObject( pObject, objId, AcDb::kForWrite ); O ltimo parmetro especifica se o objeto ser lido (read), escrito (write) ou notificado (notify). No caso de write ele pode ser modificado. Quando a modificao estiver acabada, deve-se fechar o objeto, mas nunca antes do objeto ser adicionado no banco de dados:

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

ObjectARX Bsico

Pgina 17 de 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();

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

ObjectARX Bsico

Pgina 18 de 104

III. Escrevendo uma aplicao em ARX

Essa sesso descreve como escrever e rodar uma aplicao em ARX. Ela lista as mensagens passadas pelo AutoCAD para aplicaes em ARX e mostra como essas aplicaes respondem as mensagens. Considera tambm o registro de novos comandos, como carregar e descarregar uma 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 com uma 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::AppMsgCode msg, void* pkt); msg pkt Representa a mensagem enviada Pacote de dados

AppRetCode Contem o status retornado do AutoCAD Dentro da definio do acrxEntryPoint ( ) deve-se escrever um switch para decifrar as mensagens do AutoCAD. O cdigo abaixo mostra o esqueleto: AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt) { switch(msg) { case AcRx::kInitAppMsg: break; case AcRx::kUnloadAppMsg: break; ...

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

ObjectARX Bsico

Pgina 19 de 104

default: break; } return AcRx::kRetOK; } Mensagens Enviadas do AutoCAD para as Aplicaes ARX kInitAppMsg . kUnloadAppMsg kOleUnloadAppMsg kLoadDwgMsg kUnloadDwgMsg kDependencyMsg kNoDependencyMsg kInvkSubrMsg kEndMsg kPreQuitMsg kQuitMsg kSaveMsg kCfgMsg kEndMsgkCfgMsgkQuitMsgkSaveMsg O processo das mensagens praticamente todo feito em uma s direo, do AutoCAD para o aplicativo em ARX.

Registrando Novos Comandos


Command Stack Os comandos do AutoCAD so armazenados em grupos no command stack, que definido pela classe AcEdCommandStack. O command stack criado para a sesso do AutoCAD e um comando nativo adicionado ao AutoCAD. A macro acedRegCommands ( ) da o acesso para o command stack.

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

ObjectARX Bsico

Pgina 20 de 104

Pode-se adicionar comandos com AcEdCommand::addCommand ( ) e remover grupos com AcEdCommand::removeGroup( ) ou remover comandos com AcEddCommandStack::removeCmd. Acad::ErrorStatus AcEdCommandStack::addCommand (const char* const char* const char* Adesk::Int32 cmdGroupName, cmdGlobalName, cmdLocalName, commandFlags,

AcRxFunctionPtr functionAddr); cmdGroupName Representao ASCII do grupo para adicionar o comando cmdGlobalName Representao ASCII do nome global do comando para adicionar cmdLocalName Representao ASCII do nome local do comando para adicionar command-Flags Flags 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 pelo command name dentro do group. Essa procura no feita em uma ordem lgica, porm o usurio, se quiser, pode ter controle sobre ela. Lookup Order Quando um comando invocado, o comando Stack procurado pelo nome do grupo e depois pelo nome 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 que desejamos que seja pesquisado, podemos usar o comando abaixo: AcEdCommandStack::popGroupToTop() Global versus Local

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

ObjectARX Bsico

Pgina 21 de 104

Caso no haja necessidade de traduzir o nome do comando local, o nome global pode ser usado para ambas 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 utilizando o prompt com outra ao. J o modal s pode se invocado quando no houver outro comando na linha de prompt. Querrying Commands A biblioteca AcEd oferece classes para iterao atravs do comando Stack e par procurar comandos especficos. Todavia esse questionamento executado pelo AutoCAD e ns usamos essas funes. Exemplo: Implementa funes que so chamadas quando a aplicao carregada (load) e descarregada (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

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

ObjectARX Bsico

Pgina 22 de 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 arxload do AutoLISP Usar a funo ads_arxload( ) do ARX ou ADS Comando ARX no prompt do AutoCAD

Descarregando uma Aplicao ARX


Mtodos para descarregar um aplicativo ARX: Utilizar AcRxDynamicLinker::unloadModule( ) Usar o quadro de dilogo APPLOAD definido no bonus loadapp.arx Usar a funo arxunload do AutoLISP Usar a funo ads_arxunload( ) do ARX ou ADS Comando ARX no prompt do 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 usar AcDbObject::new para criar um objeto e AcDbObject::delete para destru-lo.

IV. Operaes do Banco de Dados

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

ObjectARX Bsico

Pgina 23 de 104

Essa sesso descreve o protocolo bsico do banco de dados incluindo como criar um banco de dados, como ler em um arquivo de desenho, e como salvar o banco de dados. As funes wblock e 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 new para criar um banco de dados e delete para destru-lo. O construtor AcDbDatabase tem um argumento com default de Adesk::kTrue que cria o banco de dados populado com o objeto padro. Se o argumento for Adesk::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);

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

ObjectARX Bsico

Pgina 24 de 104

A Operao wblock
A classe AcDbDatabase contm 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 funes AcDbDatabase::insert( ) copiam um banco de dados para o banco de dados que invocou a funo, porm se alguns objetos tiverem um ponteiro do tipo ownership no named object dictionary, necessrio utilizar a funo de notificao AcEditorReactor.

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 variveis CECOLOR. Acad::ErrorStatus AcDbDatabase::setCecolor(const AcCmColor& color); AcCmColor AcDbDatabase::cecolor() const; Linetype

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

ObjectARX Bsico

Pgina 25 de 104

Acad::ErrorStatus AcDbDatabase::setCeltype(AcDbObjectId); AcDbObjectId AcDbDatabase::celtype() const; Linetype Scale Acad::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;

Layer Acad::ErrorStatus AcDbDatabase::setClayer(AcDbObjectId); AcDbObjectId AcDbDatabase::clayer() const;

Referncias Externas
Referncias externas (xrefs) so criadas exclusivamente pelo AutoCAD que cria um banco de dados contendo 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

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

ObjectARX Bsico

Pgina 26 de 104

void createDwg() { // Cria um novo banco de dados AcDbDatabase *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()

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

ObjectARX Bsico

Pgina 27 de 104

{ AcDbDatabase *pDb = new AcDbDatabase; pDb->readDwgFile("test1.dwg"); // abre o model space block table record AcDbBlockTable *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

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

ObjectARX Bsico

Pgina 28 de 104

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

Abrindo e Fechando Objetos


Cada objeto pode ser referenciado de trs formas: Pelo seu handle: enquanto o AutoCAD no salvo o desenho armazenado no DWG, assim os objetos so identificados pelos seus handles; Pelo seu object ID: depois que o desenho aberto as informaes do desenho esto armazenadas no AcDbDatabase, assim cada objeto tem no banco de dados um object ID. Esse object 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 e retornam 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,

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

ObjectARX Bsico

Pgina 29 de 104

AcDb::OpenMode mode, Adesk::Boolean openErasedObject = Adesk::kFalse) A funo para mapear um handle para um object ID : Acad::ErrorStatus getAcDbObjectId(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 um AcDbObjectId, 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 que precisa ser trocado para um AcDbObjectId e ser aberto: AcDbEntity* selectEntity(AcDbObjectId& eId, AcDb::OpenMode openMode) { ads_name en; ads_point pt; ads_entsel("\nSelect an entity: ", en, pt); // muda ads_name para um object Id acdbGetObjectId(eId, en); AcDbEntity * pEnt; acdbOpenObject(pEnt, eId, openMode); return pEnt;

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

ObjectARX Bsico

Pgina 30 de 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 estiver aberto.

Deletando Objetos
Quando se cria uma instncia de um AcDbObject com o intento de adicionar no banco de dados, deve se 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 se pode delet-lo. O AutoCAD administra a deleo de todos os objetos residentes no banco de dados.

Ownership
Com exceo dos objetos razes, symbol tables e named object dictionary, os demais objetos tm um dono: Block table records possui as entidades; Cada symbol table possui um particular tipo de symbol table record Um AcDbDictionary pode possuir um AcDbObject; Qualquer AcDbObject pode 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 Dictionary de qualquer objeto: pode conter um arbitrrio conjunto de objetos AcDbObject; Objetos customizados que podem guardar dados.

Apagando Objetos
Qualquer objeto no banco de dados pode ser apagado com a seguinte funo: Acad::ErrorStatus

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

ObjectARX Bsico

Pgina 31 de 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 e apagar um objeto com AcDbOpenObject(), se isso for feito haver uma mensagem de erro.Quando um 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 duas funes membros para arquivar internamente: dwgin() e dxfin(). Essas funes so chamadas pelo AutoCAD.

VI. Entidades

Descrio dos objetos com representao grfica denominados Entidades. Listando as propriedades 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 e PAPER_SPACE. Adicionais records so adicionados sempre que o usurio cria novos block records.

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

ObjectARX Bsico

Pgina 32 de 104

A estrutura ownership para entidades do banco de dados a seguinte: AcRxObject AcDbObject AcDbDictionary AcDbEntity AcDb3dSolid AcDbBlockBegin AcDbBlockEnd AcDbBlockReference AcDbMInsertBlock AcDbBody AcDbCurve AcDb2dPolyline AcDb3dPolyline AcDbArc AcDbCircle AcDbEllipse AcDbLeader AcDbLine AcDbRay AcDbSpline AcDbXline AcDbDimension AcDb2LineAngularDimension AcDb3PointAngularDimension AcDbAlignedDimension AcDbDiametricDimension

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

ObjectARX Bsico

Pgina 33 de 104

AcDbOrdinateDimension AcDbRadialDimension AcDbRotatedDimension AcDbFace AcDbFaceRecord AcDbFcf AcDbMline AcDbMText AcDbOleFrame AcDbPoint AcDbPolyFaceMesh AcDbPolygonMesh AcDbRegion AcDbSequenceEnd AcDbShape AcDbSolid AcDbText AcDbAttribute AcDbAttributeDefinition AcDbTrace AcDbVertex AcDb2dPolylineVertex AcDb3dPolylineVertex AcDbPolyFaceMeshVertex AcDbPolygonMeshVertex AcDbViewport AcDbProxyEntity

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

ObjectARX Bsico

Pgina 34 de 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: Nmero da cor 1 2 3 4 5 6 7 0 256 Nome da cor Vermelho Amarelo Verde Cinza Blue Magenta Branco ou Preto BYBLOCK BYLAYER

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 no banco 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

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

ObjectARX Bsico

Pgina 35 de 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;

Linetype Scale Quando uma entidade instanciada, sua linetype scale inicializada para um valor invlido. Quando a entidade adicionada no banco de dados, se no tiver sido especificado pela entidade, a linetype scale 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 e tambm do banco de dados global linetype scale.. Assim a linetype scale calculada da seguinte forma: effltscale = ent->linetypeScale() * ent->database()->ltscale(); Visibilidade Se for especificado que uma entidade invisvel ela ser independente do que foi estabelecido pelo banco de dados. Acad::ErrorStatus AcDbEntity::setVisibility(AcDb::Visibility newVal); AcDb::Visibility AcDbEntity::visibility() const;

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

ObjectARX Bsico

Pgina 36 de 104

Layer Pode-se especificar um layer para toda entidade, se isso no for feito ela ter o layer default 0. Cada layer tem uma srie de propriedades associadas frozen/thawed, on/off, locked/unlocked, color, linetype e viewport. As funes seguintes permitem que o layer seja estabelecido para uma entidade: Acad::ErrorStatus AcDbEntity::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 points e seu tipo; getGripPoints( ) : retorna o grip points que 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 LIST e 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 marker que 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 modos existentes so:

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

ObjectARX Bsico

Pgina 37 de 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 int gsSelectionMark, osnapMode,

const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& Funes de Transformao A classe AcDbEntity fornece duas funes de transformao: virtual Acad::ErrorStatus AcDbEntity::transformBy(const AcGeMatrix3d& xform); Essa funo chamada no Grip Move, ROTATE, SCALE e 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 uma entidade explodida e sofre uma escala no uniforme. Interseo por Pontos A funo intersectWith( ) retorna os pontos onde uma entidade intercepta outra no desenho. Os tipos de interseo podem ser: geomIds) const;

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

ObjectARX Bsico

Pgina 38 de 104

kOnBothOperands (entidade extendida) kExtendThis kExtendArg kExtendBoth A funo intersectWith( ) uma funo sobrecarregada com duas formas, sendo que a Segunda leva um 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 int virtual Acad::ErrorStatus AcDbEntity::intersectWith( const AcDbEntity* ent, AcDb::Intersect intType, thisGsMarker = 0, otherGsMarker = 0) const;

const AcGePlane& projPlane, AcGePoint3dArray& points, int int GS Markers e Subentidades Toda entidade para ser desenhada chama as primitivas grficas, assim como, lines, circles e etc que so contidas no AcGi library. Qualquer classe derivada do AcDbEntity pode associar um GS( sistema grfico) 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 funo explode( ) 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. thisGsMarker = 0, otherGsMarker = 0) const;

Criando Instancias de Entidades no AutoCAD

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

ObjectARX Bsico

Pgina 39 de 104

Criando uma Simples Entidade: criao de uma line e seu acrescimo no model space block table record 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 acrescimo no block table. void makeABlock() { // Cria e nomeia um novo block table record. AcDbBlockTableRecord *pBlockTableRec = new AcDbBlockTableRecord(); pBlockTableRec->setName("ASDK-NO-ATTR"); // Block table.

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

ObjectARX Bsico

Pgina 40 de 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;

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

ObjectARX Bsico

Pgina 41 de 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(); }

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

ObjectARX Bsico

Pgina 42 de 104

Acesso ao Sistema de Coordenadas


Funes das entidades setam os valores de suas coordenadas usando World Coordinate System . Temse 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: symbol tables, dictionaries, groups e xrecords. Mostra tambm como utiliz-los , interagi-los e como cri-los.

Comparao entre Symbol Tables e Dictionaries


Symbol tables e dictionaries executam essencialmente a mesma funo; eles contem entradas que so objetos de banco de dados que so acessados utilizando-se uma string chave. Pode-se adicionar outras entradas a esses objetos e tambm usar iterators para percorrer passos a passo as entradas e contedos. O AutoCAD contem um conjunto fixo de nove symbol tables, que no podem ser criados ou deletados. O que pode ser feito acrescentar ou mudar as entradas em um symbol tables (records). Sendo que cada symbol table contem somente um tipo particular de objetos. Os dictionaries fornecem um mecanismo similar para armazenamento e recuperao de objetos com nomes 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 seria adicionar um nico objeto no named object dictionary e a partir dele adicionar outros dictionaries. Tipicamente, o objeto possudo uma classe container assim como um dictionary. O dictionary, por default, contm dois dictionaries: ACAD_GROUP e ACAD_MLINESTYLE. A classe hierrquica para symbol tables, symbol tables records, dictionaries e iterators a seguinte: AcRxObject AcDbObject AcDbDictionary AcDbDictionaryIterator (AcRxObject) (AcDbObject)

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

ObjectARX Bsico

Pgina 43 de 104

AcDbSymbolTable AcDbBlockTable AcDbDimStyleTable AcDbLayerTable AcDbLinetypeTable AcDbRegAppTable AcDbTextStyleTable AcDbUCSTable AcDbAbstractViewTable AcDbViewportTable AcDbViewTable AcDbSymbolTableRecord AcDbBlockTableRecord AcDbDimStyleTableRecord AcDbLayerTableRecord AcDbLinetypeTableRecord AcDbRegAppTableRecord AcDbTextStyleTableRecord AcDbUCSTableRecord AcDbAbstractViewTableRecord AcDbViewportTableRecord AcDbViewTableRecord AcDbSymbolTableIterator AcDbBlockTableIterator AcDbBlockTableRecordIterator AcDbDimStyleTableIterator AcDbLayerTableIterator

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

ObjectARX Bsico

Pgina 44 de 104

AcDbLinetypeTableIterator AcDbRegAppTableIterator AcDbTextStyleTableIterator AcDbUCSTableIterator AcDbAbstractViewTableIterator AcDbViewTableIterator AcDbViewportTableIterator

Symbol Tables
O banco de dados do AutoCAD contem as seguintes symbol tables: Block table (AcDbBlockTable; BLOCK) Layer table (AcDbLayerTable; LAYER) Text style table (AcDbTextStyleTable; STYLE) Linetype table (AcDbLinetypeTable; LTYPE) View table (AcDbViewTable; VIEW) UCS table (AcDbUCSTable; UCS) Viewport table (AcDbViewportTable; VPORT) Registered applications table (AcDbRegAppTable) Dimension styles table (AcDbDimStyleTable; DIMSTYLE)

Cada classe symbol table fornece uma funo getAt( ) para procurar o record especificado pelo nome. Para sobrecarregar essa funo tem-se: Acad::ErrorStatus AcDb##BASE_NAME##Table::getAt(const char* pEntryName, AcDb::OpenMode mode, AcDb##BASE_NAME##TableRecord*& pRecord, Adesk::Boolean openErasedRecord = Adesk::kFalse) const; Acad::ErrorStatus AcDb##BASE_NAME##Table::getAt(const char* pEntryName, AcDbObjectId& recordId, Adesk::Boolean getErasedRecord = Adesk::kFalse) const;

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

ObjectARX Bsico

Pgina 45 de 104

Outra funes pra o symbol tables so: Adesk::Boolean AcDb##BASE_NAME##Table::has(const char* pName) const; Acad::ErrorStatus AcDb##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 table contem dois records como 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 de propriedades 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);

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

ObjectARX Bsico

Pgina 46 de 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 setar certos 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

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

ObjectARX Bsico

Pgina 47 de 104

pLayerTblRcd->setVPDFLT(0); // viewport default pLayerTblRcd->setIsLocked(0); // un-locked AcCmColor color; color.setColorIndex(1); // seta a cor para vermelho

pLayerTblRcd->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

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

ObjectARX Bsico

Pgina 48 de 104

Cada symbol table tem um iterator correspondente que pode ser criado com a funo AcDb##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::Boolean skipErased = Adesk::kTrue) const; A funo newIterator( ) cria um objeto que pode ser usado para percorrer atravs do contedo da table e estabelecer pIterator para apontar para o objeto iterator. possvel se criar um novo iterator, mas no se pode esquecer de delet-lo antes de fechar o symbol table. A classe AcDbBlockTableRecord retorna um objeto da classe AcDbBlockTableRecordIterator , que permite percorrer 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;

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

ObjectARX Bsico

Pgina 49 de 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 no banco de dados e registrar com o objeto. Quando isso acontece o dictionary automaticamente anexa um reactor para a entrada. Com a funo setAt( ) adiciona objetos para o dictionary e o banco de dados. 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 de dados, 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 for desapagada, os groups so novamente inseridos. Algumas funes podem ser usadas para os Groups e no necessrio setar cada elemento, por exemplo: setColor(), setLayer(), setLinetype(), setVisibility(), and setHighlight(). Os Groups devem ser armazenados no GROUP dictionary, que pode ser obtido da seguinte forma: AcDbDictionary* pGrpDict = acdbCurDwg()->getGroupDictionary( pGroupDict, AcDb::kForWrite);

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

ObjectARX Bsico

Pgina 50 de 104

Criando um Dictionary O exemplo cria um dictionary(ASDK_DICT) e adiciona para o named object dictionary. Ento ele cria dois novos objetos da classe customizada AsdkMyClass e 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();

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

ObjectARX Bsico

Pgina 51 de 104

} Interagindo sobre Entradas do Dictionary A classe iterator para dictionaries AcDbDictionaryIterator. O exemplo a seguir obtem um dictionary (ASDK_DICT) do named object dictionary e usa um iterador para percorrer as entradas do dictionary. 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();

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

ObjectARX Bsico

Pgina 52 de 104

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

Definindo Novas Classes


VIII. 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

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

ObjectARX Bsico

Pgina 53 de 104

AcDbArc AcDbBlockReference AcDbCircle AcDbFace AcDbLine 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

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

ObjectARX Bsico

Pgina 54 de 104

AcDbFaceRecord

Identificao de Classes Rotina


Toda classe na hierarquia ARX que derivada de AcRxObject tem uma classe de descrio do objeto, que uma instancia de AcRxClass que guarda informaes para o tipo de identificao. Essas classes so criadas na inicializao, quando classes so registradas 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
http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec... 14/4/2010

ObjectARX Bsico

Pgina 55 de 104

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 no deve ser instanciada. ACRX_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS, VERNO) Usa-se para classes transientes que podem ser instanciadas, mas no 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 descrio do objeto; Classe inicializao (funo); A funo desc( ) para a classe; A funo virtual isA( ) que a classe dever sobrecarregar.

Classe de Inicializao ( Funo de Inicializao)


A funo da classe de inicializao para cada classe rxInit( ). Uma aplicao que define uma classe customizada invoca essa funo durante a inicializao da rotina. Essa funo definida automaticamente por cada ACRX_XXX_DEFINE_MEMBERS( ) e executa as seguintes tarefas: Registra a classe customizada; Cria a classe que descreve o objeto e armazena no dicitonary; das tres macros

IX. Derivando de AcDbObject

Essa sesso descreve como derivar uma classe customizada de AcDbObject. Fornece detalhes sobre os arquivos, sobre os quatro tipos de objetos refernciados, sobre o undo e o redo.

Overview
Quando se utiliza subclasses de AcDbObject, h um nmero de funes virtuais que podem ser sobrecarregadas.

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

ObjectARX Bsico

Pgina 56 de 104

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

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

ObjectARX Bsico

Pgina 57 de 104

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

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

ObjectARX Bsico

Pgina 58 de 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();

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

ObjectARX Bsico

Pgina 59 de 104

virtual ULONG __stdcall Release(); AcDbEntity: Funes 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: Funes para Sobrecarregar Usualmente virtual void list() const; virtual Acad::ErrorStatus intersectWith( const AcDbEntity* ent, AcDb::Intersect intType,

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

ObjectARX Bsico

Pgina 60 de 104

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 getSubentPathsAtGsMarker(AcDb::SubentType type,

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

ObjectARX Bsico

Pgina 61 de 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;

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

ObjectARX Bsico

Pgina 62 de 104

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

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

ObjectARX Bsico

Pgina 63 de 104

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

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

ObjectARX Bsico

Pgina 64 de 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);

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

ObjectARX Bsico

Pgina 65 de 104

virtual Acad::ErrorStatus extend(Adesk::Boolean extendStart, const AcGePoint3d& toPoint); virtual Acad::ErrorStatus getArea(double&) const;

Implementando Funes Membro


Quando se define uma nova funo membro ou se sobrecarrega uma funo 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: Read returns aborts returns Write returns returns returns Notify returns aborts returns

assertReadEnabled( ) assertWriteEnabled( ) assertNotifyEnabled( )

Filing
A partir da derivao de uma nova classe de AcDbObject, necessrio adicionar aldumas informaes 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);

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

ObjectARX Bsico

Pgina 66 de 104

Cada funo leva um ponteiro para um arquivo como seu argumento primario. Um AcDbObject escreve e l dados para um arquivo. O FilerType permite 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. Com a derivao de AcDbObject, haver a necessidade de sobrecarregar algumas funes virtuais, que so usadas para armazenagem persistente de objetos, em operaes de cpia ou undo: dwgOutFields( ) dwgInFields( ) dxfOutFields( ) dxfInFields( )

Funo dwgOut( ) A funo dwgOut( ) que chama dwgOutFields( ), invocada pelos seguintes comandos: SAVE (usa kFileFiler) SAVEAS (usa kFileFiler) WBLOCK (usa kWblockCloneFiler e kIdXlateFiler) INSERT, XREF (usa kDeepCloneFiler e 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 chama dwgInFields( ), invocada pelos seguintes comandos: OPEN (usa kFileFiler) UNDO (usa kUndoFiler) INSERT, COPY, XREF (usa kDeepCloneFiler e kIdXlateFiler) WBLOCK (usa kWblockCloneFiler e kIdXlateFiler) Quando um objeto paginado para dentro(usa kPageFiler)

Funo dxfOut( )

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

ObjectARX Bsico

Pgina 67 de 104

A funo dxfOut( ) que chama dxfOutFields( ), invocada pelos seguintes comandos: DXFOUT ads_entget( )

Funo dxfIn( ) A funo dxfIn( ) que chama dxfInFields( ), 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 chamar primeiro as funes assertReadEnabled( ) e assertWriteEnabled( ) para garantir que o objeto foi aberto 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; }

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

ObjectARX Bsico

Pgina 68 de 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 chamar primeiro as funes assertReadEnabled( ) e assertWriteEnabled( ) para garantir que o objeto foi aberto corretamente.

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

ObjectARX Bsico

Pgina 69 de 104

Group DXF A representao DXF de um objeto composta de pares grupos de cdigos e dados, com cada grupo de cdigos mapeando para um especfico tipo de dado. Na verdade so, 100 grupos de cdigo seguidos por uma string que o nome da classe corrente. De 1 6 10 38 60 90 100 102 140 170 210 270 280 300 310 320 330 340 350 360 Para 4 9 17 59 79 99 100 102 149 179 219 279 289 309 319 329 339 349 359 369 Tipo de Dado texto texto Ponto ou vetor real 16-bit inteiro 32-bit inteiro Marca de subclasse texto real 16-bit inteiro 3 reais 16-bit inteiro 8-bit inteiro texto binrio handle soft pointer ID hard pointer ID soft owner ID hard owner ID

Objetos Referncia
Um objeto referncia pode ser hard ou soft, ou tambm referncia ownership ou referncia pointer: Referncia Hard: Indica que um objeto depende do objeto referenciado para sua prpria existncia; Referncia Soft: Indica que um objeto tem alguns tipos de relacionamento com o objeto referenciado, mas no depende dele para existir; Referncia Ownership: Indica como os objetos so armazenados. Considerando que apenas um objeto possui um outro, ento se o primeiro armazenado, ele leva o objeto possudo com ele. Essa referncia usada para escritas no redundantes no banco de dados; Referncia Pointer: usada para expressar qualquer referncia arbitrria entre AcDb Objetos, sendo usada para escritas redundantes no banco de dados.

Referncias Ownership
Para implementar uma hierarquia ownership necessrio fazer uma conexo entre o objeto possuidor

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

ObjectARX Bsico

Pgina 70 de 104

e o objeto possuido. Um objeto pode ter apenas um possuidor. Essa conexo usualmente feita em duas 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 table record como o possuidor da entidade: blockTableRecord->appendAcDbEntity( ...); Usos do Ownership Quando um objeto escrito para um arquivo DXF ou DWG, todos os objetos possuidos por ele so tambem copiados. A operao deep clone tambem faz com que todos os objetos possuidos pelo objeto clonado, sejam tambm clonados. Um hard ownership protege o objeto possuido de ser purgado. Tipos de Ownership Os owner podem ser de dois tipos: Hard Ownership

Um objeto de banco de dados um hard owner de seu extension dictionary; O block table um hard owner do model space e paper space block table records; Extension dictionaries so hard owners de seus elementos.

Soft Ownership

Symbol tables so soft owners de seus elementos ( com exceo do MODEL_SPACE, PAPER_SPACE e layer 0);

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

ObjectARX Bsico

Pgina 71 de 104

Dictionaries so soft owners de suas entradas.

Referncias Pointer
Um pointer um one-way link , ou seja, no h nenhuma informao no objeto referenciado que indique a origem do ponteiro. Um objeto pode apontar ou ser apontado por qualquer nmero de outros objetos. Hard Pointers Um hard pointer protege um objeto de ser purgado. Tem-se alguns exemplos de hard pointers: Uma entidade contm um hard pointer para um estilo de dimensionamento; Uma entidade texto contem um hard pointer como referncia para um estilo de texto; Uma entidade de dimensionamento contm um hard pointer refernciado para um estilo de dimensionamento; Uma entidade tem um hard pointer para um layer.

Soft Pointers Um soft pointer um simples ponteiro para um objeto. Ele no protege o objeto referenciado de um purge. Exemplos: Referncias Xdata so soft pointers; Persistent reactors so soft pointers.

Purge
O mecanismo purge permite apagar objetos no utilizados no banco de dados. Se um objeto tem um hard owner ou um pointer reference, ele no pode ser apagado. AcDbDatabase::purge(AcDbObjectIdArray &idArray); A funo purge( ) retorna o ID dos objetos que podem ser purgados, sendo assim existe um controle sobre os objetos que esto sendo apagados.

Undo e Redo
Existem dois caminhos bsicos para a aplicao de uma operao Undo. O mecanismo de Undo automtico, default, deixa o sistema copiar o estado completo do objeto chamando a funo dwgOutFields( ) 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

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

ObjectARX Bsico

Pgina 72 de 104

objeto registrado pelo undo. Quando a modificao do objeto esta completa e o objeto fechado, o conteudo do arquivo salvo para um arquivo undo. Quando o comando UNDO invocado e uma operao de auto undo executada, o AutoCAD invoca a funo dwgInFields( ) no objeto, que l o conteudo do arquivo undo. Undo Automtico A funo assertWriteEnabled( ) da seguinte forma: void assertWriteEnabled( Adesk::Boolean autoUndo = Adesk::kTrue, Adesk::Boolean recordModified = Adesk::kTrue); Quando uma funo de modificao chama assertWriteEnabled( ), ela checa se o parmetro recordModified kTrue, se for, ela analisa o parmetro autoUndo que especifica se o undo deve ser executado. Se ele for kTrue (default) o objeto automticamente escrito no arquivo do objeto undo. J se o parmetro recordModified kFalse ele no executa o undo. Parcial Undo O parcial undo uma alternativa de programao para ser implementado em algumas funes de modificao das classes. Se somente uma pequena poro do objeto tipicamente modificado em uma funo membro, o parcial undo pode executar alguns benefcios. Para gravar somente parte de um objeto, basta especificar kFalse para o parmetro autoUndo e ento usar a funo undoFiler::writeItem( ) para salvar a informao relevante de um arquivo undo. Se for especificado kFalse para o autoUndo, a funo applyPartialUndo( ) chamada quando o comando UNDO invocado. A funo applyPartialUndo( ) uma funo virtual do AcDbObject que garante que a classe executa as mudanas. undoFiler()->writeItem((long)NewClass::desc());

Redo
Quando se desfaz o undo, gravado tambm o estado corrente do desenho. Essa recuperao pelo redo requer um trabalho muito grande, porque ele usa o mesmo mecanismo de preenchimento como a operao do undo.

subErase, subOpen, subClose e subCancel


As funes erase( ), open( ), close( ), e cancel( ) tm funes virtuais correspondentes comeando com o prefixo sub. Elas podem ser sobrecarregadas para fornecer a novas classes derivadas mais funcionalidade. O sistema segue a seguinte forma, sendo que a funo erase( ) chama subErase( ): virtual Acad::ErrorStatus

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

ObjectARX Bsico

Pgina 73 de 104

subErase(Adesk::Boolean pErasing); Para sobrecarregar uma dessas funes, deve-se seguir alguns passos: Verificar as condies de dependncias dos objetos; Invocar Parent::subErase( ) e examinar os resultados; Executar a ao.

Exemplo de uma Classe Objeto Customizada


Arquivo de Cabealho class MyClass : public AcDbObject { public: ACRX_DECLARE_MEMBERS(MyClass); MyClass(): mIntval(0) {}; MyClass(const Adesk::Int16& val): mIntval(val) {}; Acad::ErrorStatus Acad::ErrorStatus getData setData (Adesk::Int16&); (Adesk::Int16);

virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler*); virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const; virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler*); virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const; private: Adesk::Int16 mIntval; }; Arquivo Fonte class MyClass : public AcDbObject // Utiliza-se funes para setar e pegar o dado inteiro { public:

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

ObjectARX Bsico

Pgina 74 de 104

ACRX_DECLARE_MEMBERS(MyClass); MyClass(): mIntval(0) {}; MyClass(const Adesk::Int16& val): mIntval(val) {}; Acad::ErrorStatus Acad::ErrorStatus getData setData (Adesk::Int16&); (Adesk::Int16);

virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler*); virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const; virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler*); virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const; private: Adesk::Int16 mIntval; }; ACRX_DXF_DEFINE_MEMBERS(MyClass, AcDbObject, 0, MYCLASS, SAMP2); MAKE_ACDBOPENOBJECT_FUNCTION(MyClass); // Pega os valores do dado inteiro Acad::ErrorStatus MyClass::getData(Adesk::Int16& val) { assertReadEnabled(); val = mIntval; return Acad::eOk; } // Seta os valores do dado inteiro Acad::ErrorStatus MyClass::setData(Adesk::Int16 val) { assertWriteEnabled();

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

ObjectARX Bsico

Pgina 75 de 104

mIntval = val; return Acad::eOk; } // Arquiva dados no DWG Acad::ErrorStatus MyClass::dwgInFields(AcDbDwgFiler* pFiler) { assertWriteEnabled(); AcDbObject::dwgInFields(pFiler); pFiler->readItem(&mIntval); return pFiler->filerStatus(); } // L os dados do arquivo DWG Acad::ErrorStatus MyClass::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); AcDbObject::dwgOutFields(pFiler); pFiler->writeItem(mIntval); return pFiler->filerStatus(); } // Arquivo DXF Acad::ErrorStatus MyClass::dxfInFields(AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es;

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

ObjectARX Bsico

Pgina 76 de 104

if ((es = AcDbObject::dxfInFields(pFiler))!= Acad::eOk) { return es; } if (!pFiler->atSubclassData("MyClass")) { return Acad::eBadDxfSequence; } struct resbuf inbuf; while (es == Acad::eOk) { if ((es = pFiler->readItem(&inbuf)) == Acad::eOk) { if (inbuf.restype == AcDb::kDxfInt16) { mIntval = inbuf.resval.rint; } } } return pFiler->filerStatus(); } // Arquivo DXF Acad::ErrorStatus MyClass::dxfOutFields(AcDbDxfFiler* pFiler) const { assertReadEnabled(); AcDbObject::dxfOutFields(pFiler); pFiler->writeItem(AcDb::kDxfSubclass, "MyClass"); pFiler->writeItem(AcDb::kDxfInt16, mIntval); return pFiler->filerStatus(); }

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

ObjectARX Bsico

Pgina 77 de 104

// Cria dois objetos da classe "MyClass" com dois inteiros //e adciona no dicionrio. void createDictionary() { AcDbDictionary *pNamedobj; acdbCurDwg()->getNamedObjectsDictionary(pNamedobj, AcDb::kForWrite); 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) { MyClass *pObj1 = new MyClass(1); MyClass *pObj2 = new MyClass(2); AcDbObjectId rId1, rId2; pDict->setAt("OBJ1", pObj1, rId1); pDict->setAt("OBJ2", pObj2, rId2); pObj1->close(); pObj2->close(); pDict->close(); } }

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

ObjectARX Bsico

Pgina 78 de 104

void iterateDictionary() { AcDbDictionary *pNamedobj; acdbCurDwg()->getNamedObjectsDictionary(pNamedobj, AcDb::kForRead); AcDbDictionary *pDict; pNamedobj->getAt("ASDK_DICT", (AcDbObject*&)pDict, AcDb::kForRead); pNamedobj->close(); AcDbDictionaryIterator* pDictIter= pDict->newIterator(); AsdkMyClass *pMyCl; Adesk::Int16 val; for (; !pDictIter->done(); pDictIter->next()) { pDictIter->getObject((AcDbObject*&)pMyCl, AcDb::kForRead); pMyCl->getData(val); pMyCl->close(); ads_printf("\nintval is: %d", val); } delete pDictIter; pDict->close(); } void initApp() { acedRegCmds->addCommand("ASDK_DICTIONARY_COMMANDS", "ASDK_CREATE", "CREATE", ACRX_CMD_MODAL, createDictionary); acedRegCmds->addCommand("ASDK_DICTIONARY_COMMANDS",

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

ObjectARX Bsico

Pgina 79 de 104

"ASDK_ITERATE", "ITERATE", ACRX_CMD_MODAL, iterateDictionary); MyClass::rxInit(); acrxBuildClassHierarchy(); } void unloadApp() { acedRegCmds->removeGroup("ASDK_DICTIONARY_COMMANDS"); deleteAcRxClass(AsdkMyClass::desc()); }

Suporte para Verses de Objetos


Vrios mecanismos podem ser usados para administrar as verses das classes de objetos customizados: Renomear as classes para cada nova verso; Manter o nmero da verso como o primeiro membro da classe; Manter o nmero da verso como dado extendido (xdata) ou uma extenso do dicionrio.

X. Derivando de AcDbEntity

Essa sesso demonstra como derivar uma classe customizada de AcDbEntity. A criao de uma classe de entidade customizada exige a utilizao da biblioteca AcGi, operaes com object osnap points, grip points e stretch points.

Mostrando a Entidade
Para acessar AcGi tem-se algumas funes dentro da classe bsica AcDbEntity: virtual Adesk::Boolean

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

ObjectARX Bsico

Pgina 80 de 104

AcDbEntity::worldDraw(AcGiWorldDraw *pWd); virtual void AcDbEntity::viewportDraw(AcGiViewportDraw *pVd); virtual void AcDbEntity::saveAs(AcGiWorldDraw *pWd, AcDb::SaveType saveType); O AutoCAD chama as funes worldDraw( ) e viewportDraw( ) para mostra a entidade. Em alguns casos o AutoCAD chama a funo saveAs( ), como na representao grfica do objeto proxy ou quando se salva o desenho para o AutoCAD 12. A funo worldDraw( ) deve ser sempre implementada para qualquer classe derivada de AcDbEntity, j as funes viewportDraw( ) e saveAs ( ) so opcionais. Sempre que o AutoCAD necessita regenerar um desenho para mostrar uma entidade, as funes worldDraw( ) e viewportDraw( ) so chamadas da seguinte maneira: if (!entity->worldDraw(pWd)) for (each relevant viewport) entity->viewportDraw(pVd); O objetivo da funo worldDraw( ) construir a parte grfica da entidade que pode ser especificada independentemente do contexto da visualizao. Se qualquer das entidades grficas tem sua visualizao dependente, o worldDraw( ) deve retornar kFalse e o viewportDraw( ) deve ser implementado. A funo viewportDraw( ) ento constroe a parte de visualizao dependente da entidade grfica. A funo AcDbEntity::worldDraw( ) leva um ponteiro para um objeto AcGiWorldDraw, que uma classe container para o AcGi e objetos como: Objeto AcGiWorldGeometry, faz o tratamento analtico vetorial do AutoCAD trabalhando com suas entidades primitivas: Circle Circular arc Polyline Polygon Mesh Shell Text Xline Ray

Objeto AcGiSubEntityTraits, trabalha com um conjunto de atributos grficos usando algumas funes:

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

ObjectARX Bsico

Pgina 81 de 104

Color Layer Linetype Polygon fill type Selection marker

A funo AcDbEntity::viewportDraw( ) leva um ponteiro para um objeto AcGiviewportDraw e constroe visualizaes para a representao grfica de uma entidade. O objeto AcGiviewportDraw tambm um objeto container para outros objetos como: Objeto AcGiViewportGeometry, faz o tratamento analtico vetorial do AutoCAD para a visualizao trabalhando com suas entidades primitivas: Circle Circular arc Polyline Polygon Mesh Shell Text Xline Ray polylineEye() polygonEye() polylineDc() polygonDc()

Objeto AcGiSubEntityTraits, trabalha com um conjunto de atributos grficos usando algumas funes:

Color Layer Linetype Polygon fill type Selection marker

Objeto AcGiViewport, fornece funes para trabalhar com visualizao baseada em matrizes e parmetros.

Sobrecarregando AcDbEntity::saveAs( ) Se a entidade customizada no sobrecarrega AcDbEntity::saveAs( ), o AutoCAD dever fazer com que a funo worldDraw( ) suporte a representao grfica ou arquivos DWG da verso release 12. A funo AcDbEntity::saveAs( ) simplesmente chama a funo worldDraw( ). possvel sobrecarregar saveAs( ) se for necessrio se ter uma representao grfica alternativa, ou para salvar entidades

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

ObjectARX Bsico

Pgina 82 de 104

grficas do tipo proxy, ou para arquivos DWG da verso 12, ou at mesmo para ambos os casos. Objetos AcGi Um objeto AcGi assim como o AcGiWorldDraw ou AcGiViewportDraw no deve ser armazenado como uma varivel global ou esttica, e tambm no deve se salvar cpias atravs das funes worldDraw( ) e viewportDraw( ). Tipos de Regenerao O tipo de regenerao viewport AcGiWorldDraw::regenType( ): dado pelo AutoCAD atravs da funo

kAcGiStandardDisplay o modo tpico de desenho e usado quando o usurio entra com o comando REGEN ou edita uma entrada; kAcGiHideOrShadeCommand indica que o comando HIDE ou SHADE foi emitido; kAcGiRenderCommand usado quando o usurio emite o comando RENDER.

Propriedades das Entidades Entidades: Se voc no atribui valores para cor, layer ou line type, sua entidade customizada dever receber valores prescritos pelo AutoCAD. Adicionalmente, sua aplicao pode chamar AcDbEntity a funo membro assim como AcDbEntity::setColorIndex() para atribuir valores para as propriedades das entidades, mas no de dentro do worldDraw(), viewportDraw(), and saveAs().

Subentidades: Pode-se atribuir valores para cor, layer ou line type chamando as funes AcGiSubEntityTraits das funes worldDraw(), viewportDraw(), and saveAs().

Subprimitiva: As funes primitivas mesh e shell possuem parmetros que levam voc a especificar um conjunto de propriedades. Esse mecanismo requer que voc atribua valores para todos os lados ou faces.

Propriedades das Subentidades As propriedades so: Color Layer Linetype Fill type GS marker

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

ObjectARX Bsico

Pgina 83 de 104

Antes de chamar o worldDraw() and viewportDraw(), o AutoCAD inicializa a cor, layer, e linetype das subentidades. O fill type corresponde ao tipo de regenerao, e o GS marker inicializado em zero. Fill Type Existem dois tipos de fill type: kAcGiFillAlways kAcGiFillNever Antes do AutoCAD chamas o worldDraw(), ele atribui o fill type de acordo com o tipo de regenerao. GS Markers Os GS markers so utilizados nas conjunes com as funes ADS ads_ssget() and ads_ssnamex(), permitindo sua aplicao editar ou operar nas sees arbitrrias da sua entidade customizada.

Primitivas
Mesh Uma mesh um eficiente caminho para armazenar uma grade retangular de vrtices. A geometria para uma mesh especificada como o nmero de linhas ou nmero de colunas e uma lista de vrtices. virtual Adesk::Boolean AcGiWorldGeometry::mesh(const Adesk::UInt32 rows, const Adesk::UInt32 columns, const AcGePoint3d* pVertexList, const AcGiEdgeData* pEdgeData = NULL, const AcGiFaceData* pFaceData = NULL, const AcGiVertexData* pVertexData = NULL) const = 0; Os trs ltimos parmetros da funo so opcionais. Shell Um shell uma lista de faces que podem ser conectadas e podem Ter tambm furos. O shell especificado pro uma lista de vrtices, um nmero de faces e uma lista das faces.

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

ObjectARX Bsico

Pgina 84 de 104

virtual Adesk::Boolean AcGiWorldGeometry::shell(const Adesk::UInt32 nbVertex, const AcGePoint3d* pVertexList, const Adesk::UInt32 faceListSize, const Adesk::Int32* pFaceList, const AcGiEdgeData* pEdgeData = NULL, const AcGiFaceData* pFaceData = NULL, const AcGiVertexData* pVertexData = NULL const struct resbuf* pResBuf = NULL) const = 0;

Um vertex negativo indica um furo. Os furos devem estar no mesmo plano das faces.
Arc A funo circularArc() possui duas formas: virtual Adesk::Boolean AcGiWorldGeometry::circularArc(const AcGePoint3d& center, const double radius, const AcGeVector3d& normal, const AcGeVector3d& startVector, const double sweepAngle, const AcGiArcType arcType = kAcGiArcSimple) const = 0; virtual Adesk::Boolean AcGiWorldGeometry::circularArc(const AcGePoint3d& start, const AcGePoint3d& point, const AcGePoint3d& end, const AcGiArcType arcType = kAcGiArcSimple) const = 0; Os tipos de arc podem ser trs, definidos pelos seguintes valores:

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

ObjectARX Bsico

Pgina 85 de 104

kAcGiArcSimple kAcGiArcSector kAcGiArcChord Polyline A funo pline() permite uma entidade customizada desenhar primitivas graficas usando um AcDbPolyline como um templante. Essa funo suportaq multisegmentos curvos ou retos. virtual Adesk::Boolean pline(const AcDbPolyline& lwBuf, Adesk::UInt32 fromIndex = 0, Adesk::UInt32 numSegs = 0) const; Text Um exemplo nesta seo mostra o uso da classe AcGiTextStyle. Ele desenha um retngulo em torno de um texto que pode ser orientado e localizado em qualquer lugar do espao. Adesk::Boolean AsdkTextStyleSamp::worldDraw(AcGiWorldDraw* pW) { AcGePoint3d pos(0.0, 0.0, 0.0); AcGeVector3d norm(0.0, 0.0, 1.0); AcGeVector3d dir(-1.0, -0.2, 0.0); char *pStr = "This is a percent, '%%%'."; int len = strlen(pStr); AcGiTextStyle style; AcGeVector3d vec = norm; vec = vec.crossProduct(dir); dir = vec.crossProduct(norm); style.setFileName("txt.shx"); style.setBigFontFileName(""); int status; if (!((status = style.loadStyleRec()) & 1))

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

ObjectARX Bsico

Pgina 86 de 104

pStr = "Font not found."; pW->geometry().text(pos, norm, dir, pStr, len, Adesk::kFalse, style); pos.y += 2.0; style.setTrackingPercent(80.0); style.setObliquingAngle(10.0); AcGePoint2d ext = style.extents(pStr, Adesk::kFalse, strlen(pStr), Adesk::kFalse); pW->geometry().text(pos, norm, dir, pStr, len, Adesk::kFalse, style); AcGeMatrix3d textMat; norm.normalize(); dir.normalize(); AcGeVector3d yAxis = norm; yAxis = yAxis.crossProduct(dir); yAxis.normalize(); textMat.setCoordSystem(AcGePoint3d(0.0, 0.0, 0.0), dir, yAxis, norm); double offset = ext.y / 2.0; AcGePoint3d verts[5]; verts[0] = verts[4] = AcGePoint3d(-offset, -offset, 0.0); verts[1] = AcGePoint3d(ext.x + offset, -offset, 0.0); verts[2] = AcGePoint3d(ext.x + offset, ext.y + offset, 0.0); verts[3] = AcGePoint3d(-offset, ext.y + offset, 0.0); for (int i = 0; i < 5; i++) { verts[i].transformBy(textMat); verts[i].x += pos.x; verts[i].y += pos.y; verts[i].z += pos.z; }

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

ObjectARX Bsico

Pgina 87 de 104

pW->geometry().polyline(5, verts); return Adesk::kTrue; } Tesselation Curvas e superfcies curvadas necessitam ser quebradas em linhas e poligonais. O grau de tessellation determina como a curva ser mostrada. As funes deviation() fornecidas pelas classes AcGiWorldDraw e AcGiViewportDraw retornam o desvio. virtual double AcGiWorldDraw::deviation(AcGiDeviationType, const AcGePoint3d&) const = 0; Os tipos de desvio so: KAcGiMaxDevForCircle kAcGiMaxDevForCurve kAcGiMaxDevForBoundary kAcGiMaxDevForIsoline kAcGiMaxDevForFacet Isolines Uma isoline usada para dar um visual para a shape de um objeto. A funo AcGiWorldDraw::isolines() permite uma entidade mostrar o mesmo nmero de isolines para uma superfcie como especificado pelo usurio (um valor interio entre 0 e 2047). Viewports O viewport definido por uma cmera que aponmtada para o espao, com um certo campo de viso. A classe AcGiViewport fornece funes para obter informaes sobre o viewpoint, assim como getCameraLocation() e getCameraUpVector(). Ele tambm fornece funes para obter as vrias transformaes. Transformaes As entidades podem sofrer trs tipos de transformaes: As transformaes de blocos de entidades A transformao da visualizao do viewport A transformao da perspectiva

Funes intrnsecas das entidades

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

ObjectARX Bsico

Pgina 88 de 104

Object Snap Points necessrio sobrecarregar a funo getOsnapPoints() para uma entidade customizada suportar o object snap modes. O AutoCAD invoca esta funo para adquirir os snap points para o modo corrente. O exemplo seguinte mostra como a classe AsdkPoly implementa a funo getOsnapPoints(): Acad::ErrorStatus AsdkPoly::getOsnapPoints( AcDb::OsnapMode int osnapMode,

gsSelectionMark, pickPoint, lastPoint,

const AcGePoint3d& const AcGePoint3d&

const AcGeMatrix3d& viewXform, AcGePoint3dArray& AcDbIntArray& { assertReadEnabled(); Acad::ErrorStatus es = Acad::eOk; if (gsSelectionMark == 0) return Acad::eOk; if ( osnapMode != AcDb::kOsModeEnd && osnapMode != AcDb::kOsModeMid && osnapMode != AcDb::kOsModeNear && osnapMode != AcDb::kOsModePerp && osnapMode != AcDb::kOsModeCen && osnapMode != AcDb::kOsModeIns) { return Acad::eOk; } snapPoints, /*geomIds*/) const

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

ObjectARX Bsico

Pgina 89 de 104

if (gsSelectionMark == (mNumSides + 1)) { if (osnapMode == AcDb::kOsModeIns) snapPoints.append(mCenter); else if (osnapMode == AcDb::kOsModeCen) snapPoints.append(mCenter); return es; } int startIndex = gsSelectionMark - 1; AcGePoint3dArray vertexArray; if ((es = getVertices(vertexArray)) != Acad::eOk) { return es; } AcGeLineSeg3d lnsg(vertexArray[startIndex], vertexArray[startIndex + 1]); AcGePoint3d pt; AcGeLine3d line, perpLine; AcGeVector3d vec; AcGeVector3d viewDir(viewXform(Z, 0), viewXform(Z, 1), viewXform(Z, 2)); switch (osnapMode) { case AcDb::kOsModeEnd: snapPoints.append(vertexArray[startIndex]); snapPoints.append(vertexArray[startIndex + 1]); break; case AcDb::kOsModeMid: pt.set( ((vertexArray[startIndex])[X]

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

ObjectARX Bsico

Pgina 90 de 104

+ (vertexArray[startIndex + 1])[X]) * 0.5, ((vertexArray[startIndex])[Y] + (vertexArray[startIndex + 1])[Y]) * 0.5, ((vertexArray[startIndex])[Z] + (vertexArray[startIndex + 1])[Z]) * 0.5); snapPoints.append(pt); break; case AcDb::kOsModeNear: pt = lnsg.projClosestPointTo(pickPoint, viewDir); snapPoints.append(pt); break; case AcDb::kOsModePerp: vec = vertexArray[startIndex + 1] - vertexArray[startIndex]; vec.normalize(); line.set(vertexArray[startIndex], vec); pt = line.closestPointTo(lastPoint); snapPoints.append(pt); break; case AcDb::kOsModeCen: snapPoints.append(mCenter); break; default: return Acad::eOk; } return es; }

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

ObjectARX Bsico

Pgina 91 de 104

Grip Points As entidades do AutoCAD possuem grip points que aparecem quando o usuriuo seleciona uma entidade. A funo getGripPoints() returna os grip points que foram definidos por uma entidade. virtual Acad::ErrorStatus AcDbEntity::getGripPoints( AcGePoint3dArray& gripPoints, AcDbIntArray& AcDbIntArray& osnapModes, geomIds) const;

virtual Acad::ErrorStatus AcDbEntity::moveGripPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset); Stretch Points O conjuntg de stretch points para uma entidade um subconjunto dos grip points. Quando o usurio invoca o comando STRETCH, a funo getStretchPoints() usada para retornar os stretch points definidos pela entidade selecionada. A implementao para AcDbEntity::getStretchPoints() e AcDbEntity::moveStretchPointsAt() para invocar seu getGripPoints() and moveGripPointsAt(). virtual Acad::ErrorStatus AcDbEntity::getStretchPoints( AcGePoint3dArray& stretchPoints) const; virtual Acad::ErrorStatus AcDbEntity::moveStretchPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset). Funes de Transformao A classe AcDbEntity oferece duas funes de transformao. A primeira, transformBy(), aplica uma matriz para uma entidade. A segunda, getTransformedCopy(), desabilita uma entidade para retornar uma cpia dela mesma com a transformao aplicada. Interseo com outras entidades Quando voc implementa intersectWith() para sua entidade customizada, assegure-se que esta funo no implementada para todas as entidades do AutoCAD Release 12.

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

ObjectARX Bsico

Pgina 92 de 104

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; A primeira forma do intersectWith() testa uma simples interseo de duas entidades. A Segunda forma calcula a interseo da projeo no plano. Interseo de uma Entidade Customizada com Outra Entidade O ARX uma arquitetura aberta onde aplicaes mltiplas podem implementar suas prprias entidades customizadas. possvel que aplicaes mltiplas sejam carregadas no mesmo momento da sesso do AutoCAD, onde o usurio seleciona sua entidade customizada em uma operao que involva sua interseo com outra entidade customizada na qual voc no est ciente. Os seguintes itens podero ajud-lo a implementar a funo intersectWith() de sua entidade customizada. Cada entidade customizada esperada para poder cruzar com uma entidade nativa. Se a funo intersectWith() da sua entidade customizada chamada com outra entidade no nativa, voc precisar explodir sua entidade customizada em entidades nativas.

Explodindo uma entidade Voc tem que sobrecarregar a funo explode() de uma entidade customizada para utilizar os comandos BHATCH e EXPLODE

Tpicos Especializados
XI. Objetos Proxy

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

ObjectARX Bsico

Pgina 93 de 104

Este captulo descreve objetos proxi e as condies de sua criao. Ele tambm discute encontro de usurio com PROXIES , o display de entidades proxy, e a edio de proxy entidades.

Objetos Proxy Definidos


O objeto proxy um objeto que o AutoCAD cria na memria como um portador de um conjunto de dados para um objeto customizado ARX. O AutoCAD cria automaticamente objetos proxy quando a aplicao que define o objeto no carregada. Proxies so criados por objetos e entidades. O AutoCAD utiliza objetos proxy para fornecer o acesso a leitura de dados em um objeto customizado derivado de AcDbObject ou AcDbEntity. Os objetos Proxy tambm fornecem o controle de edio para alguns dados, com o argumento da macro ACRX_DXF_DEFINE_MEMBERS no PROXY_FLAGS. A classe do objeto proxy AcDbProxyObject derivada de AcDbObject, e a classe de entidade proxy AcDbProxyEntity derivada de AcDbEntity. Ambas as classes so classes bsicas abstratas e no podem ser instansiadas e so incluidas no ARX API. Os objetos proxy convertem novamente para o objeto customizado original, sempre que a aplicao carregada. Em certas circunstncias, os proxies so escritos para arquivos, mas proxy objects usualmente existem na memoria. Os objetos proxy so criados pelo AutoCAD quando ele l um arquivo contendo objetos customizados que no podem ser instanciados, isto acontece quando a applicao no carregada. Porm, durante a sea de desenho do AutoCAD, a aplicao pode ser carregada e ento, o AutoCAD converte os objetos proxy em objetos customizados. O usurio notificado da criao do objeto proxy por uma mensagem do AutoCAD. Caso o usurio queira mais detalhes, basta emitir o comando List e clicar sobre a entidade. O usurio pode controlar o proxy quando a classe criada com a macro ACRX_DXF_DEFINE_MEMBERS. As opes para o PROXY_FLAGS, e seus valores associados so: kNoOperation 0 kEraseAllowed 0x1 kTransformAllowed 0x2 kColorChangeAllowed 0x4 kLayerChangeAllowed 0x8 kLinetypeChangeAllowed 0x10 kLinetypeScaleChangeAllowed 0x20

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

ObjectARX Bsico

Pgina 94 de 104

kVisibilityChangeAllowed 0x40 kAllAllowedBits 0x7F

XII. Notificao

Este captulo descreve como voc pode criar reatores que respondam para tipos diferentes de eventos e registrar os reatores com objetos apropriados para receber notificao.

Viso Geral
Quando um envento ocorre no sistema, certos objetos, chamados notificadores, automaticamente retransmitem o evento para outros objetos. Os objetos que recebem os eventos so chamados reatores. Um reator deve ser explicitamente adicionado para uma lista de reatores notificados antes que ele possa receber eventos do notificador. Um notificador dado pode Ter um nmero de reatores em sua lista de reatores. Uma definio da classe de reatores inclui vrias funes de notificao. Quando um evento ocorre, o notificador automaticamente invoca a funo de notificao correspondente de cada reator na sua lista de reatores. Para usar um reactor na sua aplicao, siga os seguintes passos gerais: 1. Derive uma nova classe de reatores e implemente as funes de notificao para os eventos em que o seu retator responder; 2. Instansie o reator; 3. Adicione o reator para a lista de reatores do notificador.

Quando voc terminar de usar o reator, siga os seguintes passos: 1. Remova o reator da lista de reatores; 2. Delete o reator.

Classes de Reatores
As classes de reatores so derivadas do AcRxObject, no AcDbObject. Pelo motivo destes reatores no serem objetos de objetos de banco de dados, eles no possuem object IDs. A hierarquia para as classes de reatores a seguinte: AcRxObject

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

ObjectARX Bsico

Pgina 95 de 104

AcRxDLinkerReactor AcEditorReactor AcDbDatabaseReactor AcTransactionReactor AcDbObjectReactor AcDbEntityReactor

Tipos de Objetos Reatores


Reator Transiente: usado somente para monitorar eventos que acontecem nos objetos de banco de dados. Eles podem tambm monitorar eventos no banco de dados, interao de usurios e outros sistemas de eventos.

Reatores Persistentes: usado ao involver um objeto de banco de dados como um reator, esses objetos podem receber assim como enviar notificaes.

Usando Reatores
Para utilizar um reator transiente, derive uma nova classe a partir de uma das seguintes classes basicas: AcRxDLinkerReactor AcEditorReactor AcDbDatabaseReactor AcTransactionReactor AcDbObjectReactor AcDbEntityReactor Cada classe parente contm um conjunto de funes de notificao virtual que pode ser implementada pela sua nova classe derivada. Como por exemplo, as funes da classe AcDbObjectReactor: cancelled() copied() erased()

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

ObjectARX Bsico

Pgina 96 de 104

goodbye() openedForModify() modified() subObjModified() modifyUndone() modifiedXData() unappended() reappended() objectClosed()

XIII. Administrando Transaes

Este captulo descreve o modelo de transaoque pode ser usado para operar nos objetos AcDb. Neste modelo, operaes mltiplas em objetos mltiplos so agrupados juntamente em uma operao chamada uma transao. As transaes podem ser aninhadas e podem ser finalizadas ou abortadas na atuao do usurio. Este modelo pode ser usado na conjuno com o regular abrir e fechar do objeto.

Viso Geral
O modelo de transao encapsula operaes mltiplas em objetos mltiplos definindo assim uma operao denominada transao. Dentro de uma transao, o usurio pode obter ponteiros de object IDs, que so vlidas at a transao ser finalizada ou abortada pelo usurio. Se a transao finalizada com sucesso, as operaes no objeto so realizadas. Se a transao abortada, as operaes do objeto so canceladas. Esse mecanismo bastante simplificado em relao ao mecanismo de abrir e fechar objetos, e ainda apresenta algumas vantagens. O mecanismo de abrir e fechar adequada para operaes simples em objetos ou em pequenos grupos de objetos. Contudo esse mecanismo apresenta algumas restries que podem levar a um conjunto de erros. Se um objeto aberto para leitura, o usurio no poder abr-lo para escrita ao mesmo tempo. Com isso o mecanismo de transio pode ser mais eficiente, permitindo a obteno do ponteiro do objeto a partir do object ID de uma forma particular. Outra desvantagem que ao abrir e fechar o mesmo objeto enumeras vezes, algumas operaes so associadas ao fechar o objeto aumento o arquivo undo e disparando uma srie de notificaes. Porm ao utilizar o mecanismo de transao essas operaes sero realizadas somente uma vez, ao finalizar a transao.

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

ObjectARX Bsico

Pgina 97 de 104

Administrador da Transao
O administrador de transao um objeto administrador global, similar a um editor, instancia de AcTransactionManager e mantido no registro do sistema e no pode ser deletado. O usurio pode obt-lo atravs da macro: #define actrTransactionManager \ AcTransactionManager::cast( acrxSysRegistry()->at(AC_TRANSACTION_MANAGER_OBJ)) O administrador deve ser usado para iniciar, finalizar ou abortar transaes. Ele pode tambm fornecer informaes assim como o nmero de transaes ativas em qualquer momento e uma lista de todos os objetos cujo os ponteiros foram obtidos em todas as transaes.

Aninhando Transaes
As transaes podem ser aninhadas, pode-se comear uma transao dentro de outra e finalizar ou abortar a transao recente. O administrador de transaes mantm as transaes em pilhas, com a mais recente transao no topo da pilha. Quando o usurio comea uma nova transao usando AcTransactionManager::startTransaction(), a nova transao adicionada no topo da pilha e um ponteiro retornado para ele. Quando chamado AcTransactionManager::endTransaction() ou AcTransactionManager::abortTransaction(), a transao do topo finalizada ou abortada. Se a transao mais externa for abortada, todas as operaes de todos os objetos so canceladas.

Os Limites das transaes


O limite de uma transao o tempo entre o incio e o final ou aborto da transao, o usurio responsvel por esses limites. Uma forma inteligente de utilizar uma transao dentro de uma funo que ser invocada por um comando registrado, porm se caos um comando for finalizado com uma transao aberta, o AutoCAD ir abortar. Alguns comandos no devem ser transacionados: ARX NEW QUIT SAVE UNDO DXFIN OPEN RECOVER SCRIPT XREF INSERT PURGE REDO U

Obtendo Ponteiros para Objetos na Transao


Ambas AcTransactionManager::getObject() e AcTransaction::getObject() podem ser usadas para

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

ObjectARX Bsico

Pgina 98 de 104

obter ponteiros para objetos a partir de object Ids, esses ponteiros so associados a mais recente transao. Ambas funes retornam um ponteiro para leitura, escrita ou notificao. Nesse caso nunca deve-se chamar close(), essa funo usada quando o ponteiro obtido atravs da funo acdbOpenObject() ou quando o objeto foi novamente criado. No recomendado introduzir o mecanismo de transao quando se est usando o mecanismo de abrir e fechar. Porm o contrrio perfeitamente possvel. Quando a mais recente transao finalizada, o administrador de trasaes dispara a notificao endCalledOnOutermostTransaction() e comea o processo de armazenamento das operaes no banco de dados.

Undo e as Transaes
O modelo de transao usa o mecanismo de Undo do AutoCAD e AcDbObject::cancel() na implementao de AcTransactionManager::abortTransaction(). Isso requer que nenhuma operao utilizando subcomandos do AutoCAD sejam utilizadas na transao, como por exemplo, PEDIT e SPLINEDIT.

Transaes e Gerao Grfica


Para desenhar entidades associadas com as AcTransactionManager::queueForGraphicsFlush() e transaes pode-se utilizar as funes

AcTransactionManager::flushGraphics(), antes de envi-las para o banco de dados do AutoCAD. Pode-se tambm usar a funo AcDbEntity::draw() para desenhar entidades individualmente.

Reatores da Transao
O administrador da transao tem uma lista de reatores atravs dos quais ele notifica o usurio dos relevantes eventos para a transao: virtual void transactionStarted (int& numTransactions); virtual void transactionEnded (int& numTransactions); virtual void transactionAborted (int& numTransactions); virtual void endCalledOnOutermostTransaction (int& numTransactions);

XIV. Deep Cloning

Este captulo descreve as funes deep clone, que copiam um objeto ou qualquer objeto possudo pelo objeto copiado.

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

ObjectARX Bsico

Pgina 99 de 104

Deep Clone bsico


A funo deep clone copia um objeto e suas referncias ownership. Qualquer apontador de referncias ignorado. A funo wblock clone copia hard owners e hard pointers e ignora as referncias soft. As relaes entre objetos so armazenadas no objeto como um dado membro de classe AcDbObjectId. Existem quatro tipos de relaes entre objetos que esto no quadro abaixo. Estas relaes caracterizam qual o tipo de comportamento seus dados iro seguir, isso ser devidamente guardado usando-se o object ID, dentro da classe AcDbObjectId.

Deep clone Hard owner Soft owner Hard pointer Soft pointer

Wblock clone

A funo AcRxObject::clone ( ) clona objetos simples. A funo AcDbObject::deepClone () clona o objeto e qualquer outro objeto possudo por esse objeto e tambm traduz as referncias do objeto clonado. Basicamente o processo de clonagem dos objetos feito de forma bastante simples. As operaes deep clone e wblock clone arquivam o objeto para clon-lo. Primeiramente um novo objeto criado, que vir a ser o clone. Depois o objeto original armazenado para a memria usando dwgOut ( ). Finalmente, o dado armazenado no novo objeto usando-se dwgIn ( ). O ID map um mecanismo para guardar o caminho de uma operao clone, ele consiste de pares de objetos ID: Key ID objeto de origem Value ID - objeto clonado ou objeto de destino

O ID map tambm contm pares de ID adicionais de objetos no clonados que so necessrios para traduo do ID. As operaes deep clone e wblock clone consistem de duas etapas: clonagem e traduo. O passo da clonagem acontece quando dwgOut ( ) e dwgIn ( ) so chamados e copiados. Nesse momento quando o deep clone ( ) chamado em um objeto, o AutoCAD averigua se o objeto clonado possui qualquer outro objeto. J o segundo passo o da traduo, que usa o ID map para linkar novamente todos os objetos com suas novas relaes.

Tpica utilizao do AcDbDatabase::deepCloneObjects ( )

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

ObjectARX Bsico

Pgina 100 de 104

void cloneSameOwnerObjects() { // Etapa 1: Obter os objetos para serem clonados ads_name sset; if (ads_ssget(NULL, NULL, NULL, NULL, sset) != RTNORM) { ads_printf("\nNothing selected"); return; } // Etapa 2: Adiciona os objetos IDs para uma lista de objetos para serem clonados long length; ads_sslength(sset, &length); AcDbObjectIdArray objList; AcDbObjectId ownerId = AcDbObjectId::kNull; for (int i = 0; i < length; i++) { ads_name ent; ads_ssname(sset, i, ent); AcDbObjectId objId; acdbGetObjectId(objId, ent); AcDbObject *pObj; acdbOpenObject(pObj, objId, AcDb::kForRead); if (pObj->ownerId() == ownerId) objList.append(objId); else if (i == 0) { ownerId = pObj->ownerId(); objList.append(objId);

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

ObjectARX Bsico

Pgina 101 de 104

} pObj->close(); } ads_ssfree(sset); // Etapa 3: Pega o objeto ID desejado para o objeto clonado // Model Space AcDbBlockTable *pBlockTable; acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead); AcDbObjectId modelSpaceId; pBlockTable->getAt(ACDB_MODEL_SPACE, modelSpaceId); pBlockTable->close(); // Etapa 4: Cria um novo map ID AcDbIdMapping idMap; // Etapa 5: Chama deepCloneObjects( ) acdbCurDwg()->deepCloneObjects(objList, modelSpaceId, idMap); // Etapa 6: Printando os objetos ID dos novos objetos clonados AcDbIdMappingIter iter(idMap); for (iter.start(); !iter.done(); iter.next()) { AcDbIdPair idPair; iter.getMap(idPair); if (!idPair.isCloned()) continue; ads_printf("\nObjectId is: %Ld", idPair.value().asOldId()); } }

Clonando objetos de diferentes donos

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

ObjectARX Bsico

Pgina 102 de 104

Para se clonar objetos de diferentes donos, deve-se dividir os objetos ID em grupos de cada dono e devem pertencer ao mesmo banco de dados.

Implementando deepClone ( ) para Classes Customizadas


As funes deepClone ( ) e wblockClone ( ) podem ser sobrecarregadas para objetos e entidades customizadas. Comandos do AutoCAD que usam as funes deepClone ( ) ou wblockClone ( ) COPY ARRAY MIRROR BLOCK INSERT WBLOCK XREF BIND XBIND EXPLODE

Named Object Dictionary


O Named Object Dictionary tem soft ownership nas suas entradas. Ento essas no so clonadas pelo wblockClone ( ). Tem-se aqui um caso especial de clonagem, no qual deve-se usar beginDeepCloneXlation ( ).

Sobrecarregando a Funo deepClone ( )


Tem-se dois estgios: Clonando: Pode ser sobrecarregado Criar um novo objeto do mesmo tipo do antigo Adicionar o novo objeto para seu objeto possuidor Chamar dwgOut ( ) no objeto original usando AcDbDeepCloneFiler Rever o arquivo e ento chamar dwgIn ( ) no novo objeto Chamar setObjectIdsInFlux ( ) em cada novo objeto antes de adicion-lo no objeto ID map Adicionar a nova informao para o idMap. Clona o objeto possudo

Traduzindo: Deve ser controlado apenas atravs do ID map

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

ObjectARX Bsico

Pgina 103 de 104

Sobrecarregando a Funo wblockClone ( )


Quando uma operao wblock executada, o AutoCAD constroe um banco de dados novo para o novo desenho, que contem o named object dictionary , todos os symbol tables, e as variveis. A funo wblockClone ( ) usa um arquivo da classe AcDbWblockCloneFiler, que retorna uma lista de hard pointer e hard owner conectados no objeto primrio. Antes deve-se chamar WblockClone ( ) nesses subobjetos. Todos os objetos possudos so clonados durante o WblockClone ( ). Insert A operao insert um especial caso do deep clone. O objeto no copiado para um banco de dados, em vez disso ele movido para um novo banco de dados. Funes de Notificao do Editor Reator A classe AcEditorReactor fornece quatro funes de notificao que retornam o controle para a aplicao de certos pontos na operao deep clone. As seguintes funes so chamadas durante todas as operaes de deep clone e wblock clone: beginDeepClone ( ) beginDeepCloneXlation ( ) abortDeepClone ( ) endDeepClone ( ) XV. Extenso do Protocolo

Usando o protocolo de extenso em ARX pode-se adicionar funcionalidade para as classes em tempo de execuo.

Definio
Protocolo extendido um mecanismo para adicionar funcionalidade as classes ARX, essa associao feita atravs das classes descritoras dos objetos. Essas classes descrevem a classe e incluem um array de ponteiros para qualquer objeto que extenda a funcionalidade desta classe. Uma classe ARX pode Ter qualquer nmero protocolos extendidos associados com ele.

Implementao
Existem dois passos bsicos para a implementao do protocolo extendido: Declarar e definir as classes do protocolo que incluem a funcionalidade adicional, utilizando a sintaxe do C++ para derivar novas classes. Para cada classe, pode-se implementar as funes que constituem o protocolo extendido.

Registrar as classes do protocolo com a aplicao, e associa-los com as classes ARX : Inicializar a nova classe aparente (protocolo) e adicionar para a classe hierrquica

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

ObjectARX Bsico

Pgina 104 de 104

AsdkEntTemperature::rxInit(); acrxBuildClassHierarchy(); Criar um objeto de cada classe e adicionar os objetos a classe descritora, com por exemplo:

pDefaultTemp = new AsdkDefaultTemperature(); pRegionTemp = new AsdkRegionTemperature(); pCircleTemp = new AsdkCircleTemperature(); AcDbEntity::desc()->addX(AsdkEntTemperature::desc(), pDefaultTemp); AcDbRegion::desc()->addX(AsdkEntTemperature::desc(), pRegionTemp); AcDbCircle::desc()->addX(AsdkEntTemperature::desc(), pCircleTemp); Descarregando o Aplicativo Quando a aplicao descarregada, voc necessita remover quaiquer comandos que foram adicionados na inicializao. Na adio, voc poder remover a classe do protocolo da classe ARX e deletar a classe descritora do objeto.

Centro de Apoio, Desenvolvimento Tecnolgico e Ensino da Computao Grfica


Escola de Engenharia da UFMG Departamento de Engenharia de Estruturas

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