Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
Autores
Alexandra Htner Fernando Poinho Malard Jacqueline Maria Flor
Juliana Mascarenhas
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
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
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.
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
Layer Table Record Objetos Symbol Table Record Entidades Block Table Record
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
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.
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.
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()); }
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
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.
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.
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);
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;
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( )
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; }
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.
DWG Handle
Abre o Objeto Abre o Objeto
Fecha o Objeto
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;
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
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;
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
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.
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
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.
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.
Nessa sesso tem-se como utilizar as macros em ARX derivando da classe customizada ARX.
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
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.
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;
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
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.
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.
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()); }
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
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:
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
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,
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.
http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec... 14/4/2010
ObjectARX Bsico
Pgina 94 de 104
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
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
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.
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.
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);
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 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.
http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec... 14/4/2010
ObjectARX Bsico
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
} 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()); } }
http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec... 14/4/2010
ObjectARX Bsico
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.
http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec... 14/4/2010
ObjectARX Bsico
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
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.
http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec... 14/4/2010