objectarx.pdf
TRANSCRIPT
-
8/14/2019 ObjectARX.pdf
1/104
Esta a verso em html do arquivo http://www.cadtec.dees.ufmg.br/publico/Regina/ObjectARX%20B%C3%A1sico/ApostilaARX/ObjARX_Apostila.doc.Googlecria automaticamente verses em texto de documentos medida que vasculha a web.
ObjectARX
For AutoCAD Release 14
Apostila do Desenvolvedor
Reviso Abril/98
1aEdio
Editor
Jos Ricardo Queiroz Franco
Autores
Alexandra Htner
Fernando Poinho Malard
Jacqueline Maria Flor
Juliana Mascarenhas
ndice Analtico
Usando a Plataforma ARXIntroduo
Pgina 1 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
2/104
ObjectARX o ambiente de programao do AutoCAD Runtime Extension. Este ambiente incluibibliotecas da linguagem C++, que permitem o desenvolvimento de aplicativos especficos de classese protocolos no AutoCAD extendidos, e cria novos comandos que operam da mesma maneira que oscomandos intrnsecos do AutoCAD.
A utilizao da linguagem C++ orientada a objetos pelo ObjectARX, faz com que se tenha umdesenvolvimento performtico bastante superior aos j existentes. Na anlise Orientada a Objetos,dados e procedimentos fazem parte de um s elemento bsico ( objeto ou classe ). Esses elementos
bsicos, ao estabelecer comunicao entre si, caracterizam a execuo do programa. Assim, aocontrrio da filosofia estruturada, onde dados e procedimentos so entidades dissociadas, no
paradigma da orientao a objetos os dados e procedimentos esto encapsulados em um s elemento.
Em termos tcnicos, o desenvolvimento exige alguns Softwares para que se possa fazer o devido usodas ferramentas de linguagem. Apesar de o ObjectARX j ter sido implementado na verso 13 doAutoCAD, recomendvel pela sua confiabilidade, a utilizao do AutoCAD release 14 forWindows. Da mesma forma recomenda-se o Visual C++ 4.1a e ainda mais eficiente, o Visual C++5.0. A Autodesk envia aos seus desenvolvedores um CD de consulta on line chamado ObjectARX quetorna o trabalho ainda mais imediato.
I. Viso Geral
Uma aplicao ARX uma biblioteca de vnculo dinmico (dynamic link library _ DLL) quecompartilha o espao no mesmo endereo do AutoCAD e chama funes diretamente doAutoCAD. As bibliotecas do ARX incluem macros para facilitar a definio de novas classes eoferecer a habilidade para adicionar funcionalidade s classes existentes. O ARX pode serusado juntamente com o AutoCAD Development System (ADefS) e tambm com aplicativos emAutoLISP.
Ambiente ARX
O ambiente ARXfornece uma interface para a aplicao da linguagem orientada a objetos C++ quehabilita desenvolvedores usar, customizar, e automatizar o AutoCAD. O ARX de extremaversatilidade na utilizao do seu banco de dados, no sistema grfico, e na definio dos seuscomandos nativos.
O ambiente ARXdifere do ADS e do AutoLISP de enumeras formas. O AutoLISP uma linguageminterpretada pelo AutoCAD, uma simples forma de apenas adicionar comandos. Sua coneco com oAutoCAD feita atravs de um interprocesso de comunicao (IPC). Dessa mesma forma tambm oADS que escrito em C e compilado antes de ser carregado via IPC pelo AutoLISP e s assimexecutado no AutoCAD. O ADS apenas uma traduo do AutoLISP.
Aplicativos ADS
Pgina 2 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
3/104
IPC
AutoLISP
IPC
AutoCAD
Aplicativos ARXBibliotecas ARX
ClasseAcRx
O AcRx fornece o nvel de classes para a inicializao DLL, linkagem e tambm registro eidentificao das classes. A classe bsica AcRxObject.
OAcRxtambm fornece um conjunto de macros em C++ para ajudar na criao de novas classes emARX, que so derivadas doAcRxObject.
Outra importante classe AcRxDictionary que um dicionrio de strings que aponta para outroobjeto. OAcRxarmazena classes, objetos e dicionrios.
Classe hierrquica: AcRxObject
AcRxClass
AcRxDictionary
AcRxDLinkerReactor
AcRxDynamicLinker
AcRxIterator
AcRxDictionaryIterator
AcRxService
Classe AcEd
O AcEdfornece classes para definio e registro de novos comandos (nativos) no AutoCAD que
Pgina 3 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
4/104
operam da mesma maneira que os comandos internos do AutoCAD. Ambos comandos residem namesma estrutura interna, AcEdCommandStack. Uma classe importante a AcEditorReactor, quemonitora o editor do AutoCAD e notifica os eventos ocorridos.
Classe hierrquica: AcRxObject
AcEdCommandIteratorAcEdCommandStack
AcEditor
AcEdJig
AcEditorReactor
AcTransaction
AcTransactionManager
AcTransactionReactor
Classe AcDb
OAcDbfornece classes que possibilitam o acesso na estrutura do banco de dados do AutoCAD. Estebanco de dados armazena todas as informaes para os objetos grficos (entidades) e no grficos quecompe um desenho do AutoCAD.
O banco de dados do AutoCAD contm: Um conjunto de nove symbol tables Um named object dictionary( class AcDbDictionary) que contm uma tabela de
contedos para o AutoCAD que pode ser facilmente alterada Um conjunto fixo de 200 variveis de cabealho definidas pelo AutoCAD
Classe hierrquica: AcDbAuditInfo
AcDbRecoverAcDbRecoverCallBack
AcDbHandle (Identificao do objeto)
AcDbObjectId
AcDbHardOwnershipId
AcDbHardPointerId
AcDbSoftOwnershipId
AcDbSoftPointerId
Pgina 4 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
5/104
AcDbIdMapping (Usado para deep clone)
AcDbIdMappingIter
AcDbIdPair
AcDbSymbolTableIterator (Iterators)AcDbBlockTableIterator
AcDbBlockTableRecordIterator
AcDbDimStyleTableIterator
AcDbLayerTableIterator
AcDbLinetypeTableIterator
AcDbRegAppTableIterator
AcDbTextStyleTableIterator
AcDbUCSTableIterator
AcDbAbstractViewTableIterator
AcDbViewTableIterator
AcDbViewportTableIterator
AcDbGroup Iterator
AcDbExtents
AcDbDate
AcDbIntArray
AcDbObjectIdArray
AcDbVoidPtrArray
AcRxObject
AcDbDatabase (AutoCAD banco de dados)
AcDbDictionaryIterator
AcDbDwgFiler (Arquivos)
AcDbDwgCopyFiler
AcDbDeepCloneFiler
Pgina 5 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
6/104
AcDbWblockCloneFiler
AcDbDwgUndoFiler
AcDbDxfFiler
(AcRxObject)AcDbObject (Classe mais importante)
AcDbDictionary
AcDbEntity (AutoCAD entidades)
AcDb3dSolid
AcDbBlockBegin
AcDbBlockEnd
AcDbBlockReference
AcDbMInsertBlock
AcDbBody
AcDbCurve
AcDb2dPolyline
AcDb3dPolyline
AcDbArc
AcDbCircle
AcDbEllipse
AcDbLeader
AcDbLine
AcDbRay
AcDbSpline
AcDbXline
AcDbDimension
AcDb2LineAngularDimension
AcDb3PointAngularDimension
Pgina 6 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
7/104
AcDbAlignedDimension
AcDbDiametricDimension
AcDbOrdinateDimension
AcDbRadialDimensionAcDbRotatedDimension
AcDbFace
AcDbFaceRecord
AcDbFcf
AcDbMline
AcDbMText
AcDbOleFrame
AcDbPoint
AcDbPolyFaceMesh
AcDbPolygonMesh
AcDbRegion
AcDbSequenceEnd
AcDbShape
AcDbSolid
AcDbText
AcDbAttribute
AcDbAttributeDefinition
AcDbTrace
AcDbVertex
AcDb2dPolylineVertex
AcDb3dPolylineVertex
AcDbPolyFaceMeshVertex
AcDbPolygonMeshVertex
Pgina 7 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
8/104
AcDbViewport
AcDbProxyEntity
(AcRxObject)
(AcDbObject)
AcDbGroup
AcDbMlineStyle
AcDbSymbolTable (Symbol tables)
AcDbBlockTable
AcDbDimStyleTableAcDbLayerTable
AcDbLinetypeTable
AcDbRegAppTable
AcDbTextStyleTable
AcDbUCSTable
AcDbAbstractViewTable
AcDbViewportTable
AcDbViewTable
AcDbSymbolTableRecord (Symbol table records)
AcDbAbstractViewTableRecord
AcDbViewportTableRecord
AcDbViewTableRecord
AcDbBlockTableRecord
AcDbDimStyleTableRecord
AcDbLayerTableRecord
AcDbLinetypeTableRecord
AcDbRegAppTableRecord
AcDbTextStyleTableRecord
Pgina 8 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
9/104
AcDbUCSTableRecord
AcDbProxyObject
AcDbObjectIterator
AcDbObjectReactor (Notificao de eventos)AcDbEntityReactor
AcDbDatabaseReactor
Classe AcGi
O AcGi fornece a interface grfica usada para as entidades do AutoCAD. Ela usada pelas funesmembro do AcDbEntity como worldDraw( ), viewportDraw( ) e saveAs( ), que fazem parte do
protocolo padro da entidade. O worldDraw( ) deve ser definida para todas as classes de entidades
customizadas. O objetoAcGiWorldDrawfornece um API atravs do qual o AcDbEntity::worldDraw( )podeproduzir uma representao grfica em todos os viewports simultneamente. Similarmente, oobjeto AcGiViewportDraw fornece um API atravs do qual o AcDbEntity::viewportDraw( ) pode
produzir representaes grficas para cada viewport.
Classe hierrquica: AcRxObject
AcGiEdgeData
AcGiFaceData
AcGiSubEntityTraitsAcGiTextStyle
AcGiVertexData
AcGiViewport
AcGiViewportDraw
AcGiViewportGeometry
AcGiWorldDraw
AcGiWorldGeometry
Classe AcGe
OAcGe usado peloAcDb e fornece classes teis assim como vetores, pontos e matrizes (2D e 3D).Ela tambm disponibiliza objetos geomtricos simples como pontos, curvas e superfcies. Essasclasses que compeAcGepodem ser usadas para operaes bsicas com vetores, pontos e matrizes.Os membros dessa classe devem ser declarados pblicos.
Classe hierrquica: AcGePoint2d
AcGeVector2d
Pgina 9 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
10/104
AcGeMatrix2d
AcGeScale2d
AcGePoint2dArray
AcGeVector2dArrayAcGePoint3d
AcGeVector3d
AcGeMatrix3d
AcGeScale3d
AcGePoint3dArray
AcGeVector3dArray
AcGeTolerance
AcGeInterval
AcGeCurveBoundary
AcGeDoubleArray
AcGeKnotVector
AcGeEntity2d
AcGePointEnt2d
AcGePosition2d
AcGePointOnCurve2d
AcGeCurve2d
AcGeLinearEnt2d
AcGeLine2d
AcGeRay2d
AcGeLineSeg2d
AcGeCircArc2d
AcGeEllipArc2d
AcGeSplineEnt2d
Pgina 10 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
11/104
AcGeCubicSpline2d
AcGeNurbCurve2d
AcGePolyLine2d
AcGeExternalCurve2dAcGeEntity3d
AcGePointEnt3d
AcGePosition3d
AcGePointOnCurve3d
AcGePointOnSurface
AcGeCurve3d
AcGeLinearEnt3d
AcGeLine3d
AcGeRay3d
AcGeLineSeg3d
AcGeCircArc3d
AcGeEllipArc3d
AcGeExternalCurve3d
AcGeSplineEnt3d
AcGeCubicSpline3d
AcGeNurbCurve3d
AcGePolyLine3d
AcGeAugPolyLine3d
AcGeSurface
AcGePlanarEnt
AcGePlane
AcGeBoundedPlane
AcGeCylinder
Pgina 11 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
12/104
AcGeCone
AcGeSphere
AcGeTorus
AcGeNurbSurfaceAcGeExternalSurface
AcGeOffsetSurface
AcGeExternalBoundedSurface
Registrando comandos
No ARX pode-se adicionar novos comandos com a funo ads_defun() ou com a macroacedRegCmds().Com a biblioteca de comandos ADS, os requisitos so antes passados pelo AutoLISPe depois para o aplicativo. Com o ARX, os comandos so adicionados diretamente ao conjunto decomandos do AutoCAD.
Cada maneira de registrar os comandos afeta a forma de invoc-los. Se o comando de registrousado for oads_defun():
Os comandos podem ser evoludos atravs do AutoLISP ou das facilidades do ads_invoke()
Os comandos no podero ser invocados usando a funo command do AutoLISP ou a funoads_command().
Se for usada a macro acedRegCmds():
Os comandos no so reconhecidos pelo AutoLISP ou pelas facilidades do ads_invoke()
Os comandos podem ser invocados usando a funo command do AutolISP ou a funoads_command()
Entrada de pontos
ARX e ADS tem modelos diferentes para comunicar com o AutoCAD. Um aplicativo ADS consistenum loop infinito que espera pela requisio do AutoLISP. Um aplicativo ARX tem um entrypoint que usado para mensagens. Ento, quando um novo comando registrado, ele passa a ser umentry point adicional do aplicativo. Quando escrevemos funes virtuais para classes C++ nas
biliotecas ARX, elas passam a ser novos entry point no aplicativo.
II. Noes Bsicas do Banco de Dados
Pgina 12 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
13/104
O banco de dados do AutoCAD armazena os objetos e entidades que so feitas no desenho doAutoCAD. As entidades so objetos de desenho com representao grfica e so possudas peloblock table record que por sua vez armazenado no block table. O banco de dados constitudopor elementos de banco de dados: o named object dictionary e um conjunto de symbol tables,dentre eles esta o block table.
DATABASE
Symbol Table
Layer Table
NOD
Block Table
Layer Table
Record
Objetos
Symbol Table
Record
Entidades
Block Table
Record
Banco de Dados do AutoCAD
Um desenho de AutoCAD uma coleo de AcDb-objetos que so armazenados em um banco dedados. Cada objeto no banco de dados tem um handle que uma identificao nica dentro docontexto do desenho. J as entidades so objetos com uma representao grfica como, line, circle,etc.
Outros objetos de banco de dados importantes so os symbol tables e dictionaries, que socontainers de armazenamento de objetos. No caso do symbol table tem-se um conjunto fixo deelementos no banco de dados, cada um dos quais contem instncias de uma particular classe do
Pgina 13 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
14/104
symbol table record. No permitido adicionar novos symbol table no banco de dados. Osdictionaries so objetos que mapeiam um symbol name para outro AcDb-objeto. Alm dissofornecem um container mais genrico para armazenamento de objetos, ele pode conter qualquer
AcDbObjectou subclasse, e tambm, pode-se criar novos elementos de banco de dados e acrescent-los em um novo dictionary.
Durante as sesses correntes do AutoCAD pode-se obter o banco de dados chamando a funo globalacdbCurDwg( ). Mltiplos banco de dados podem ser carregados dentro de uma nica sesso doAutoCAD. Cada objeto na sesso tem um objeto ID, que um nico identificador para o objetoatravs de todos os banco de dados carregados. Em contraste, um objeto handleno garantido sernico dentro de uma sesso do AutoCAD. Ele nico somente dentro de um escopo de um particular
banco de dados.
Objeto ID
Com um objeto IDpode-se obter um ponteiro para o objeto do banco de dados atual, assim pode-seexecutar operaes com ele. Para obter o objetoID:
Criar um objeto e acrescentar ao banco de dados Usar o protocolo do banco de dados para obter o objeto ID dos objetos que so criados
automaticamente se um banco de dados criado Usar o protocolo de classes especficas para obter o objeto ID Usar um iteratorpara percorrer uma lista ou conjunto de objetos Selecionar um conjunto de objetos
Objetos Essenciais do Banco de Dados
Quando os objetos so criados, eles so armazenados em containers no banco de dados. Entidades soadicionados para o block table record, e esses so adicionados para os symbol tables. Todos osoutros objetos so adicionados para o named object dictionary ou para objetos que so seus
proprietrios.
O banco de dados tem inicialmente o seguinte aspecto:
Um conjunto de nove symbol tablesque incluem o block table(MODEL_SPACE ePAPER_SPACE ) e o layer table( layer 0 ).
Um named object dictionaryque j contm p grupo dictionarye MLINE style dictionary( STANDARD ).
Criando Objetos
Exemplo: Criao de uma linee sua adio no model space block table record:
AcDbObjectId
createLine()
{
AcGePoint3d startPt(4.0, 2.0, 0.0);
Pgina 14 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
15/104
AcGePoint3d endPt(10.0, 7.0, 0.0);
AcDbLine *pLine = new AcDbLine(startPt, endPt);
AcDbBlockTable *pBlockTable;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId lineId;
pBlockTableRecord->appendAcDbEntity(lineId, pLine);
pBlockTableRecord->close();
pLine->close();
return lineId;
}
Exemplo: Criao de um circlee sua adio no model space block table record:
AcDbObjectId
createCircle()
{
AcGePoint3d center(9.0, 3.0, 0.0);
AcGeVector3d normal(0.0, 0.0, 1.0);
AcDbCircle *pCirc = new AcDbCircle(center, normal, 2.0);
AcDbBlockTable *pBlockTable;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord, AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId circleId;
pBlockTableRecord->appendAcDbEntity(circleId, pCirc);
Pgina 15 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
16/104
pBlockTableRecord->close();
pCirc->close();
return circleId;
}Exemplo: Obtem o layer symbol table do banco de dados, cria um novo layer table record e onomeia de ASDK_MYLAYER. O layer table record adicionado para o layer table:
void
createNewLayer()
{
AcDbLayerTable *pLayerTable;acdbCurDwg()->getLayerTable(pLayerTable, AcDb::kForWrite);
AcDbLayerTableRecord *pLayerTableRecord = new AcDbLayerTableRecord;
pLayerTableRecord->setName("ASDK_MYLAYER");
AcDbLinetypeTable *pLinetypeTbl;
acdbCurDwg()->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);
AcDbObjectId ltypeObjId;
pLinetypeTbl->getAt("CONTINUOUS", ltypeObjId);
pLayerTableRecord->setLinetypeObjectId(ltypeObjId);
pLayerTable->add(pLayerTableRecord);
pLayerTable->close();
pLayerTableRecord->close();
}
Abrindo e Fechando Objetos
Todo objeto precisa ter o protocolo de abrir e ser fechado. Esse protocolo garante que o objeto estafisicamente na memria quando ele necessita ser acionado. Antes de modificar um objeto ele precisaser aberto:
AcdbOpenObject( pObject, objId, AcDb::kForWrite );
O ltimo parmetro especifica se o objeto ser lido (read), escrito (write) ou notificado (notify). Nocaso de write ele pode ser modificado. Quando a modificao estiver acabada, deve-se fechar oobjeto, mas nunca antes do objeto ser adicionado no banco de dados:
Pgina 16 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
17/104
PObject->close ( )
Exemplo: O exemplo a seguir muda a cor da entidade:
Acad::ErrorStatus
changeColor(AcDbObjectId entId, Adesk::UInt16 newColor){
AcDbEntity *pEntity;
acdbOpenObject(pEntity, entId, AcDb::kForWrite);
pEntity->setColorIndex(newColor);
pEntity->close();
return Acad::eOk;
}
Adicionando um Grupo para o Group Dictionary
Exemplo: Cria um group(pgroup) e coloca no group dictionary
void
createGroup(AcDbObjectIdArray& objIds, char* pGroupName)
{
AcDbGroup *pGroup = new AcDbGroup(pGroupName);
for (int i = 0; i < objIds.length(); i++)
{
pGroup->append(objIds[i]);
}
AcDbDictionary *pGroupDict;
acdbCurDwg()->getGroupDictionary(pGroupDict, AcDb::kForWrite);
AcDbObjectId pGroupId;
pGroupDict->setAt(pGroupName, pGroup, pGroupId);
pGroupDict->close();
pGroup->close();
Pgina 17 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
18/104
}
III. Escrevendo uma aplicao em ARX
Essa sesso descreve como escrever e rodar uma aplicao em ARX. Ela lista as mensagenspassadas pelo AutoCAD para aplicaes em ARX e mostra como essas aplicaes respondem asmensagens. Considera tambm o registro de novos comandos, como carregar e descarregaruma aplicao e algo mais.
Estrutura de uma Aplicao em ARX
O AutoCAD chama o ARX atravs do mdulo acrxEntryPoint ( ), que substitui o main do C ou ADS.
A funo acrxEntryPoint ( )serve no somente como a entrada de pontos para a comunicao comuma aplicao do ARX do AutoCAD, mas tambm como um caminho para aplicaes do ARX
passar mensagens e retornar status para o AutoCAD.
extern "C"
AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCodemsg, void*pkt);
msg Representa a mensagem enviada
pkt Pacote de dados
AppRetCode Contem o status retornado do AutoCAD
Dentro da definio do acrxEntryPoint ( )deve-se escrever um switchpara decifrar as mensagens doAutoCAD. O cdigo abaixo mostra o esqueleto:
AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
switch(msg) {
case AcRx::kInitAppMsg:
break;
case AcRx::kUnloadAppMsg:
break;
...
Pgina 18 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
19/104
default:
break;
}
return AcRx::kRetOK;}
Mensagens Enviadas do AutoCAD para as Aplicaes ARX
kInitAppMsg .
kUnloadAppMsg
kOleUnloadAppMsgkLoadDwgMsg
kUnloadDwgMsg
kDependencyMsg
kNoDependencyMsg
kInvkSubrMsg
kEndMsg
kPreQuitMsg
kQuitMsg
kSaveMsg
kCfgMsg
kEndMsgkCfgMsgkQuitMsgkSaveMsg
O processo das mensagens praticamente todo feito em uma s direo, do AutoCAD para oaplicativo em ARX.
Registrando Novos Comandos
Command Stack
Os comandos do AutoCAD so armazenados em grupos no command stack, que definido pelaclasseAcEdCommandStack. O command stack criado para a sesso do AutoCAD e um comandonativo adicionado ao AutoCAD. A macro acedRegCommands ( ) da o acesso para o command stack.
Pgina 19 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
20/104
Pode-se adicionar comandos com AcEdCommand::addCommand ( ) e remover grupos comAcEdCommand::removeGroup( ) ou remover comandos comAcEddCommandStack::removeCmd.
Acad::ErrorStatus
AcEdCommandStack::addCommand
(const char* cmdGroupName,
const char* cmdGlobalName,
const char* cmdLocalName,
Adesk::Int32 commandFlags,
AcRxFunctionPtr functionAddr);
cmdGroupName Representao ASCII do grupo para adicionar o comandocmdGlobalNameRepresentao ASCII do nome global do comando para adicionar
cmdLocalNameRepresentao ASCII do nome local do comando para adicionar
command-FlagsFlags associados com o comando
functionAddr Endereo da funo para sua execuo quando invocado pelo AutoCAD
virtual Acad::ErrorStatus
AcEdCommandStack::removeCmd
(const char* cmdGroupName, const char* cmdGlobalName) = 0;
virtual Acad::ErrorStatus
AcEdCommandStack::removeGroup
(const char* groupName);
Quando um comando invocado, o command stack procurado pelo group name e ento pelocommand namedentro do group. Essa procura no feita em uma ordem lgica, porm o usurio, sequiser, pode ter controle sobre ela.
Lookup Order
Quando um comando invocado, o comando Stack procurado pelo nome do grupo e depois pelonome do comando. Geralmente, o primeiro o primeiro grupo registrado ser o primeiro a ser
pesquisado, mas podemos saber qual orem ir seguir. Para especificarmos o primeiro grupo quedesejamos que seja pesquisado, podemos usar o comando abaixo:
AcEdCommandStack::popGroupToTop()
Global versus Local
Pgina 20 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
21/104
Caso no haja necessidade de traduzir o nome do comando local, o nome global pode ser usado paraambas situaes.
Comandos Transparentes
Um comando pode ser transparente (ACRX_CMD_TRANSPARENT) ou modal
(ACRX_CMD_MODAL). Um comando transparente pode ser invocado quando o usurio utilizandoopromptcom outra ao. J o modal s pode se invocado quando no houver outro comando na linhadeprompt.
Querrying Commands
A biblioteca AcEd oferece classes para iterao atravs do comando Stack e par procurar comandosespecficos. Todavia esse questionamento executado pelo AutoCAD e ns usamos essas funes.
Exemplo: Implementa funes que so chamadas quando a aplicao carregada (load) edescarregada (unload)
void
initApp()
{
acedRegCmds->addCommand("ASDK_DICTIONARY_COMMANDS",
"ASDK_CREATE", "CREATE", ACRX_CMD_MODAL, createDictionary);
acedRegCmds->addCommand("ASDK_DICTIONARY_COMMANDS","ASDK_ITERATE", "ITERATE", ACRX_CMD_MODAL, iterateDictionary);
AsdkMyClass::rxInit();
acrxBuildClassHierarchy();
}
void
unloadApp()
{
acedRegCmds->removeGroup("ASDK_DICTIONARY_COMMANDS");
deleteAcRxClass(AsdkMyClass::desc());
}
Carregando uma Aplicao ARX
Pgina 21 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
22/104
Mtodos para carregar um aplicativo ARX:
Fornecer o aplicativo com aspectos que permitam ser carregados pelo AutoCAD Especificar o aplicativo no arquivo inicial acad.rx Utilizar AcRxDynamicLinker::loadModule( ) Usar o quadro de dilogo APPLOAD definido no bonus loadapp.arx Usar a funo arxloaddo AutoLISP Usar a funo ads_arxload( )do ARX ou ADS Comando ARX nopromptdo AutoCAD
Descarregando uma Aplicao ARX
Mtodos para descarregar um aplicativo ARX:
UtilizarAcRxDynamicLinker::unloadModule( ) Usar o quadro de dilogo APPLOAD definido no bonus loadapp.arx Usar a funo arxunloaddo AutoLISP Usar a funo ads_arxunload( )do ARX ou ADS Comando ARX nopromptdo AutoCAD
Comando ARX
A partir do comando ARX na linha de comando, tem-se o seguinte na liha de prompt:
?/Load/Unload/Commands/Options : Entre uma opo ou pressione ENTER
?- Lista as aplicaes em ARX carregedas
Load- Carrega os arquivos .arx que foram especificados
Unload- Descarrega as aplicaes em ARX especificadas
Commands- Mostra todos os nomes de comandos e grupos registrados
Options- Apresenta o relatrio de alguns tens do programa
Controle de Memria
Os objetos criados devem ser devidamente liberados da memria. No caso do C++, deve-se usarAcDbObject::newpara criar um objeto eAcDbObject::deletepara destru-lo.
IV. Operaes do Banco de Dados
Pgina 22 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
23/104
Essa sesso descreve o protocolo bsico do banco de dados incluindo como criar um banco dedados, como ler em um arquivo de desenho, e como salvar o banco de dados. As funes wblocke insert so tambm descritas aqui.
Banco de Dados Inicial
Quando uma sesso do AutoCAD comea tem-se os seguintes elementos:
Um conjunto de sete symbol tables
Block table (AcDbBlockTable)
Dimension style table (AcDbDimStyleTable)
Layer table (AcDbLayerTable)
Linetype table (AcDbLinetypeTable)
Registered applications table (AcDbRegAppTable)
Text style table (AcDbTextStyleTable)
User coordinate system table (AcDbUCSTable)
Viewport table (AcDbViewportTable)
View table (AcDbViewTable)
Um named object dictionary Um conjunto fixo de variveis header
Criando e Populando um Banco de Dados
Usa-se newpara criar um banco de dados e deletepara destru-lo. O construtor AcDbDatabase tem
um argumento com default deAdesk::kTrue que cria o banco de dados populado com o objeto padro.Se o argumento forAdesk::kFalse, ento o banco de dados criado vazio e pode ser populado.
Salvando um Banco de Dados
Para salvar o banco de dados:
Acad::ErrorStatus
AcDbDatabase::saveAs(char* fileName);
Pgina 23 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
24/104
A Operao wblock
A classeAcDbDatabasecontm uma funo wblock( )sobrecarregada com trs formas:
Criando um novo banco de dados a partir de um j existente
Acad::ErrorStatus
AcDbDatabase::wblock(AcDbDatabase*& newDb);
Criando um novo banco de dados com entidades: Copiando um Named Block
Acad::ErrorStatus
AcDbDatabase::wblock(AcDbDatabase*& newDb, AcDbObjectId recordId);
Criando um novo banco de dados com entidades: Copiando um Array de Entidades
Acad::ErrorStatus
AcDbDatabase::wblock(AcDbDatabase*& newDb,
const AcDbObjectIdArray& idArray,
const AcGePoint3d* point);
Inserindo um Banco de Dados
As funesAcDbDatabase::insert( )copiam um banco de dados para o banco de dados que invocou afuno, porm se alguns objetos tiverem um ponteiro do tipo ownership no named objectdictionary, necessrio utilizar a funo de notificaoAcEditorReactor.
Setando os Valores do Banco de Dados Corrente
Color
Se a cor no especificada por uma entidade, o banco de dados armazena no sistema de variveisCECOLOR.
Acad::ErrorStatus
AcDbDatabase::setCecolor(const AcCmColor& color);
AcCmColor AcDbDatabase::cecolor() const;
Linetype
Pgina 24 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
25/104
Acad::ErrorStatus
AcDbDatabase::setCeltype(AcDbObjectId);
AcDbObjectId AcDbDatabase::celtype() const;
Linetype ScaleAcad::ErrorStatus
AcDbDatabase::setLtscale(double);
double AcDbDatabase::ltScale() const;
Acad::ErrorStatus
AcDbDatabase::setCeltscale(double);
double AcDbDatabase::celtscale() const;
Acad::ErrorStatus
AcDbDatabase::setPsltscale(Adesk::Boolean)
Adesk::Boolean AcDbDatabase::psltscale() const;
LayerAcad::ErrorStatus
AcDbDatabase::setClayer(AcDbObjectId);
AcDbObjectId AcDbDatabase::clayer() const;
Referncias Externas
Referncias externas (xrefs) so criadas exclusivamente pelo AutoCAD que cria um banco de dadoscontendo os xrefs. Para que se possa monitorar esse banco de dados deve-se usar as funes da classe
AcEditorReactor:
beginAttach( ) otherAttach( ) abortAttach( ) endAttach( ) redirected( ) comandeered( )
Exemplo de Operaes no Banco de Dados
Pgina 25 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
26/104
void
createDwg()
{
// Cria um novo banco de dadosAcDbDatabase *pDb = new AcDbDatabase;
// Obtem o model space block table record
AcDbBlockTable *pBtbl;
pDb->getBlockTable(pBtbl, AcDb::kForRead);
AcDbBlockTableRecord *pBtblRcd;
pBtbl->getAt(ACDB_MODEL_SPACE, pBtblRcd,
AcDb::kForWrite);
pBtbl->close();
// Cria dois circles e acrescenta no banco de dados
AcDbCircle *pCir1 = new AcDbCircle(AcGePoint3d(1,1,1),
AcGeVector3d(0,0,1), 1.0),
*pCir2 = new AcDbCircle(AcGePoint3d(4,4,4),
AcGeVector3d(0,0,1), 2.0);
pBtblRcd->appendAcDbEntity(pCir1);
pCir1->close();
pBtblRcd->appendAcDbEntity(pCir2);
pCir2->close();
pBtblRcd->close();
pDb->saveAs("test1.dwg");
delete pDb;
}
void
readDwg()
Pgina 26 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
27/104
{
AcDbDatabase *pDb = new AcDbDatabase;
pDb->readDwgFile("test1.dwg");
// abre o model space block table recordAcDbBlockTable *pBlkTbl;
pDb->getBlockTable(pBlkTbl, AcDb::kForRead);
AcDbBlockTableRecord *pBlkTblRcd;
pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,
AcDb::kForRead);
pBlkTbl->close();
AcDbBlockTableRecordIterator *pBlkTblRcdItr;
pBlkTblRcd->newIterator(pBlkTblRcdItr);
AcDbEntity *pEnt;
for (pBlkTblRcdItr->start(); !pBlkTblRcdItr->done();
pBlkTblRcdItr->step())
{
pBlkTblRcdItr->getEntity(pEnt, AcDb::kForRead);
ads_printf("classname: %s\n", (pEnt->isA())->name());
pEnt->close();
}
pBlkTblRcd->close();
delete pBlkTblRcdItr;
delete pDb;
}
V. Objetos Banco de Dados
Pgina 27 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
28/104
Essa sesso relata todos os objetos banco de dados do AutoCAD, entidades, symbol tablesrecords e dictionaries. Tambm inclui abrir e fechar comandos, administrar objetos namemria, objetos ownership, e extenso de um objeto ou extension dictionary.
Abrindo e Fechando Objetos
Cada objeto pode ser referenciado de trs formas:
Pelo seuhandle: enquanto o AutoCAD no salvo o desenho armazenado no DWG, assim osobjetos so identificados pelos seus handles;
Pelo seu object ID: depois que o desenho aberto as informaes do desenho estoarmazenadas no AcDbDatabase, assim cada objeto tem no banco de dados um object ID. Esseobject Id persiste durante a edio corrente, desde a criao at sua deleo;
Por um ponteiro em C++: As funes de abertura pegam o object ID como um argumento eretornam um ponteiro para um AcDbObject, esse ponteiro vlido at o objeto ser fechado.
DWG
Handle
Abre o Objeto
Abre o Objeto
AcDbDatabase
Object ID
C++
Pointer
SAVE WBLOCK
Fecha o Objeto
A funo para abrir um objeto :
Acad::ErrorStatus
AcDbDatabase::acdbOpenObject(AcDbObject*& obj,
AcDbObjectId id,
Pgina 28 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
29/104
AcDb::OpenMode mode,
Adesk::Boolean openErasedObject = Adesk::kFalse)
A funo para mapear um handle para um object ID :
Acad::ErrorStatusgetAcDbObjectId(AcDbObjectId& retId,
Adesk::Boolean createIfNotFound,
const AcDbHandle& objHandle,
Adesk::UInt32 xRefId=0);
A funo para abrir um objeto e requerer seu handle :
AcDbObject* pObject;
AcDbHandle handle;
pObject->getAcDbHandle(handle);
Um ads_name equivalente para umAcDbObjectId, pode-se mudar usando-se:
AcdbGetAdsName (ads_name& objName, AcDbObjectId objId);
AcdbGetObjectId (AcDbObjectId& objId, ads_name objName);
Geralmente, obtm-se um objeto atravs de uma seleo, e ento o retorno um ads_name queprecisa ser trocado para umAcDbObjectIde ser aberto:
AcDbEntity*
selectEntity(AcDbObjectId& eId, AcDb::OpenMode openMode)
{
ads_name en;
ads_point pt;
ads_entsel("\nSelect an entity: ", en, pt);
// muda ads_namepara um object Id
acdbGetObjectId(eId, en);
AcDbEntity * pEnt;
acdbOpenObject(pEnt, eId, openMode);
return pEnt;
Pgina 29 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
30/104
}
Pode-se abrir um objeto de trs modos:
kForRead; kForWrite; kForNotify
;Pode acontecer vrios erros se caso o objeto for aberto de uma forma errada ou se o objeto j estiveraberto.
Deletando Objetos
Quando se cria uma instncia de umAcDbObjectcom o intento de adicionar no banco de dados, devese usar AcDbObject::new. Quando um objeto primeiro criado e no foi adicionado no banco de
dados, pode-se delet-lo. Do contrrio, se o objeto j tiver sido adicionado no banco de dados, no sepode delet-lo. O AutoCAD administra a deleo de todos os objetos residentes no banco de dados.
Ownership
Com exceo dos objetos razes, symbol tablese named object dictionary, os demais objetos tmum dono:
Block table recordspossui as entidades; Cada symbol tablepossui um particular tipo de symbol table record UmAcDbDictionarypode possuir umAcDbObject; QualquerAcDbObjectpode ter um extension dictionary; um objeto possui seu extension
dictionary;
Adicionando Dados Especficos no Objeto
Pode-se utilizar das seguintes formas para adicionar dados em uma aplicao:
Dados extendidos: consiste numa lista linkada de resbufs usada pelo aplicativo. ; Xrecords; Extension Dictionaryde qualquer objeto: pode conter um arbitrrio conjunto de objetos
AcDbObject; Objetos customizadosque podem guardar dados.
Apagando Objetos
Qualquer objeto no banco de dados pode ser apagado com a seguinte funo:
Acad::ErrorStatus
Pgina 30 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
31/104
AcDbObject::erase(Adesk::Boolean Erasing = Adesk::kTrue);
Quando um objeto do banco de dados apagada, informaes sobre ele so removidas do dictionary.J quando uma entidade apagada, ela apagada no block table record.. No permitido abrir eapagar um objeto com AcDbOpenObject(), se isso for feito haver uma mensagem de erro.Quandoum objeto apagado ele no arquivado no arquivo DWG ou no DXF.
Objeto Filing
O Objeto Filing usado nos seguintes casos:
Escrevendo e lendo arquivos DWG e DXF; Na comunicao entre AutoCAD, AutoLISP, ADS e ARX; No UNDO, INSERT, XREF e COPY; Na paginao.
O AcDbObject tem duas funes membros para arquivar externamente: dwgout() e dxfout(), e duasfunes membros para arquivar internamente: dwgin() e dxfin(). Essas funes so chamadas peloAutoCAD.
VI. Entidades
Descrio dos objetos com representao grfica denominados Entidades. Listando aspropriedades comuns das entidades.
Definio de Entidades
Uma entidade um objeto que possui um banco de dados e tambm, uma representao grfica como,lines, circles, text e outros. Um usurio pode ver uma entidade no desenho e manipul-la
Ownership
Entidades no banco de dados normalmente pertencem a um AcDbBlockTableRecord. O block table
quando recm criado pelo banco de dados tem dois predefinidos records, MODEL_SPACE ePAPER_SPACE. Adicionais records so adicionados sempre que o usurio cria novos blockrecords.
Pgina 31 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
32/104
A estrutura ownershippara entidades do banco de dados a seguinte:
AcRxObject
AcDbObject
AcDbDictionaryAcDbEntity
AcDb3dSolid
AcDbBlockBegin
AcDbBlockEnd
AcDbBlockReference
AcDbMInsertBlock
AcDbBody
AcDbCurve
AcDb2dPolyline
AcDb3dPolyline
AcDbArc
AcDbCircle
AcDbEllipse
AcDbLeader
AcDbLine
AcDbRay
AcDbSpline
AcDbXline
AcDbDimension
AcDb2LineAngularDimension
AcDb3PointAngularDimension
AcDbAlignedDimension
AcDbDiametricDimension
Pgina 32 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
33/104
AcDbOrdinateDimension
AcDbRadialDimension
AcDbRotatedDimension
AcDbFaceAcDbFaceRecord
AcDbFcf
AcDbMline
AcDbMText
AcDbOleFrame
AcDbPoint
AcDbPolyFaceMesh
AcDbPolygonMesh
AcDbRegion
AcDbSequenceEnd
AcDbShape
AcDbSolid
AcDbText
AcDbAttribute
AcDbAttributeDefinition
AcDbTrace
AcDbVertex
AcDb2dPolylineVertex
AcDb3dPolylineVertex
AcDbPolyFaceMeshVertex
AcDbPolygonMeshVertex
AcDbViewport
AcDbProxyEntity
Pgina 33 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
34/104
Propriedades Comuns das Entidades
Todas as entidades tm propriedades comuns que quando se adiciona para o block table record,automaticamente o AutoCAD (AcDbEntity::setDatabaseDefaults()) define os valores default, isso se
a definio no estiver explcita em seu cdigo:
Color
A cor das entidades pode ser um valor numrico de 0 at 256, sendo que as cores padro so:
A seguinte funo seta a cor da entidade e assim ignora o valor default:
virtual Acad::ErrorStatus
AcDbEntity::setColorIndex(Adesk::UInt16 color);
Adesk::UInt16
AcDbEntity::colorIndex() const;
Linetype
Quando uma entidade instanciada, sua linetype do tipo NULL. Quando a entidade adicionada nobanco de dados, se no tiver sido especificado pela entidade, a linetype setada no valor default que armazenado no sistema de variveis CELTYPE.
A funo seguinte permite estabelecer uma linetype para uma entidade:
virtual Acad::ErrorStatus
Nmero da cor Nome da cor1 Vermelho2 Amarelo3 Verde4 Cinza5 Blue6 Magenta7 Branco ou Preto
0 BYBLOCK 256 BYLAYER
Pgina 34 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
35/104
AcDbEntity::setLinetype(const char* newVal);
virtual Acad::ErrorStatus
AcDbEntity::setLinetype(AcDbObjectId newVal);
A funo retorna o nome da linetype corrente na entidade:char* AcDbEntity::linetype() const;
A funo retorna o object ID para o symbol table record especificando a linetype:
AcDbObjectId AcDbEntity::linetypeId() const;
LinetypeScale
Quando uma entidade instanciada, sua linetype scale inicializada para um valor invlido. Quandoa entidade adicionada no banco de dados, se no tiver sido especificado pela entidade, a linetypescale setada no valor default que armazenado no sistema de variveis CELTSCALE.
Linetype Scale Especificada pela Entidade
Acad::ErrorStatus
AcDbEntity::setLinetypeScale(double newVal);
double
AcDbEntity::linetypeScale() const;
Regenerando um Desenho
Quando uma entidade regenerada, sua linetype scale um produto da entidade linetype scale etambm do banco de dados global linetype scale.. Assim a linetype scale calculada da seguinteforma:
effltscale = ent->linetypeScale() *
ent->database()->ltscale();
Visibilidade
Se for especificado que uma entidade invisvel ela ser independente do que foi estabelecido pelobanco de dados.
Acad::ErrorStatus
AcDbEntity::setVisibility(AcDb::Visibility newVal);
AcDb::Visibility
AcDbEntity::visibility() const;
Pgina 35 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
36/104
Layer
Pode-se especificar um layer para toda entidade, se isso no for feito ela ter o layer default 0. Cadalayer tem uma srie de propriedades associadas frozen/thawed, on/off, locked/unlocked, color,linetypee viewport. As funes seguintes permitem que o layer seja estabelecido para uma entidade:
Acad::ErrorStatusAcDbEntity::setLayer(const char* newVal);
Acad::ErrorStatus
AcDbEntity::setLayer(AcDbObjectId newVal);
Essa funo retorna o nome do layer corrente da entidade:
char* AcDbEntity::layer() const;
Essa funo retorna o object ID do layer corrente:
AcDbObjectId AcDbEntity::layerId() const;
Funes Comuns das Entidades
intersectWith( ) : usada em operaes de interseo; transformBy( ): usada como uma matriz de transformao quando o objeto sofre certas
mudanas; getTransformedCopy( ): cria uma cpia e aplica uma transformao no objeto;
getOsnapPoints( ): retorna o osnap pointse seu tipo; getGripPoints( ) : retorna o grip pointsque um conjunto do stretch points getStretchPoints( ): defaults do para o getGripPoints( ) moveStretchPointsAt( ): usado pelo comando STRETCH para mover certos pontos e defaults
para transformBy( ); moveGripPointsAt( ): usado pelos grips para mover pontos especficos pontos e defaults para
transformBy( ); worldDraw( ): cria uma representao grfica independente da entidade; vuewportDraw( ): : cria uma representao grfica dependente da entidade; draw( ): desenha as entidades grficas; list( ): usada pelo comando LISTe produz um ads_printf( ); getGeomExtents ( ): retorna as esquinas de uma caixa fechada da entidade; explode( ): decompe uma entidade em um conjunto de entidades elementares; getSubentPathsAtGsMarker( ): retorna o caminho da subentidade que corresponde ao dado GS
marker; getGsMarkersAtSubentPath( ): retorna o GS markerque corresponde ao caminho da
subentidade; subentPtr( ): retorna um ponteiro para o caminho da subentidade; highlight ( ): torna as subentidades com uma representao na seleo do tipo highlight.
Object Snap
Para adquirir os snap points para os modos especficos usa-se a funo getOsnapPoints( ). Os modosexistentes so:
Pgina 36 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
37/104
kOsModeEnd Endpoint kOsModeMid Midpoint kOsModeCen Center kOsModeNode Node kOsModeQuad Quadrant kOsModeIns Insertion kOsModePerp Perpendicular kOsModeTan Tangent kOsModeNear Nearest
A funo da seguinte forma:
virtual Acad::ErrorStatus
AcDbEntity::getOsnapPoints( AcDb::OsnapMode osnapMode,
int gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const;Funes de Transformao
A classeAcDbEntityfornece duas funes de transformao:
virtual Acad::ErrorStatus
AcDbEntity::transformBy(const AcGeMatrix3d& xform);
Essa funo chamada no Grip Move, ROTATE, SCALEe MIRROR
virtual Acad::ErrorStatus
AcDbEntity::getTransformedCopy(const AcGeMatrix3d& xform,
AcDbEntity*& ent) const;
Essa funo chamada quando houver a necessidade de criar uma nova entidade, como quando umaentidade explodida e sofre uma escala no uniforme.
Interseo por Pontos
A funo intersectWith( ) retorna os pontos onde uma entidade intercepta outra no desenho. Os tiposde interseo podem ser:
Pgina 37 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
38/104
kOnBothOperands(entidade extendida) kExtendThis kExtendArg kExtendBoth
A funo intersectWith( ) uma funo sobrecarregada com duas formas, sendo que a Segunda levaum argumento adicional que o plano de projeo para determinar a aparente interseo:
virtual Acad::ErrorStatus
AcDbEntity::intersectWith( const AcDbEntity* ent,
AcDb::Intersect intType,
AcGePoint3dArray& points,
int thisGsMarker = 0,
int otherGsMarker = 0) const;
virtual Acad::ErrorStatus
AcDbEntity::intersectWith( const AcDbEntity* ent,
AcDb::Intersect intType,
const AcGePlane& projPlane,
AcGePoint3dArray& points,int thisGsMarker = 0,
int otherGsMarker = 0) const;
GS Markers e Subentidades
Toda entidade para ser desenhada chama as primitivas grficas, assim como, lines, circles e etc queso contidas noAcGilibrary. Qualquer classe derivada doAcDbEntitypode associar um GS( sistemagrfico) marker e cada subclasse da entidade controla onde inserir seu GS markers. Onde um usurio
seleciona uma entidade, o GS marker usado para identificar qual parte da entidade foi selecionada.Explodindo Entidades
Algumas entidades podem ser explodidas em um conjunto de simples elementos, pois a funoexplode( ) cria um array de objetos derivados de AcDbEntity. Quando um entidade explodida:
A aparencia visual constante; A entidade explodida apagada do banco de dados; Uma ou mais entidades so criadas e adicionadas ao banco de dados.
Criando Instancias de Entidades no AutoCAD
Pgina 38 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
39/104
Criando uma Simples Entidade: criao de uma line e seu acrescimo no model space block tablerecord
AcDbObjectId
createLine()
{
AcGePoint3d startPt(4.0, 2.0, 0.0);
AcGePoint3d endPt(10.0, 7.0, 0.0);
AcDbLine *pLine = new AcDbLine(startPt, endPt);
AcDbBlockTable *pBlockTable;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord, AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId lineId;
pBlockTableRecord->appendAcDbEntity(lineId, pLine);
pBlockTableRecord->close();
pLine->close();
return lineId;
}
Criando um Simples Block Table Record: criao de um novo block table record e seu acrescimono block table.
void
makeABlock()
{
// Cria e nomeia um novo block table record.
AcDbBlockTableRecord *pBlockTableRec = new AcDbBlockTableRecord();
pBlockTableRec->setName("ASDK-NO-ATTR");
// Block table.
Pgina 39 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
40/104
AcDbBlockTable *pBlockTable = NULL;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForWrite);
// Adiciona o novo block table record para o block table.
AcDbObjectId blockTableRecordId;pBlockTable->add(blockTableRecordId, pBlockTableRec);
pBlockTable->close();
// Cria e adiciona uma line no block record.
AcDbLine *pLine = new AcDbLine();
AcDbObjectId lineId;
pLine->setStartPoint(AcGePoint3d(3, 3, 0));
pLine->setEndPoint(AcGePoint3d(6, 6, 0));
pLine->setColorIndex(3);
pBlockTableRec->appendAcDbEntity(lineId, pLine);
pLine->close();
pBlockTableRec->close();
}
Entidades Complexas
Criando uma Entidade Complexa
void
createPolyline()
{
// Seta 4 verteces para a pline
AcGePoint3dArray ptArr;
Pgina 40 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
41/104
ptArr.setLogicalLength(4);
for (int i = 0; i < 4; i++) {
ptArr[i].set((double)(i/2), (double)(i%2), 0.0);
}// Aloca dinamicamente um objeto AcDb2dPolyline,
// dando 4 elementos cujo a locao fornecida em
// ptArr. A polyline fechada e no curva.
AcDb2dPolyline *pNewPline = new AcDb2dPolyline(
AcDb::k2dSimplePoly, ptArr, 0.0, Adesk::kTrue);
pNewPline->setColorIndex(3);
// Ponteiro para um BlockTable Object
AcDbBlockTable *pBlockTable;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
// Ponteiro para MODEL_SPACE BlockTableRecord
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord, AcDb::kForWrite);
pBlockTable->close();
// Adiciona a pline para o banco de dados e obtem seu object ID
AcDbObjectId plineObjId;
pBlockTableRecord->appendAcDbEntity(plineObjId, pNewPline);
pBlockTableRecord->close();
// Layer "0"
pNewPline->setLayer("0");
pNewPline->close();
}
Pgina 41 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
42/104
Acesso ao Sistema de Coordenadas
Funes das entidades setam os valores de suas coordenadas usando World Coordinate System . Tem-se como exceo o caso da classe AcDb2dPolylineVextex, que usa o valor da Entity Coordinate
System.
VII. Objetos Container
Essa sesso descreve os objetos container usados no banco de dados do AutoCAD: symboltables, dictionaries, groups e xrecords. Mostra tambm como utiliz-los , interagi-los e comocri-los.
Comparao entre Symbol Tables e Dictionaries
Symbol tables e dictionariesexecutam essencialmente a mesma funo; eles contem entradas queso objetos de banco de dados que so acessados utilizando-se uma string chave. Pode-se adicionaroutras entradas a esses objetos e tambm usar iterators para percorrer passos a passo as entradas econtedos.
O AutoCAD contem um conjunto fixo de nove symbol tables, que no podem ser criados oudeletados. O que pode ser feito acrescentar ou mudar as entradas em um symboltables(records).Sendo que cada symboltablecontem somente um tipo particular de objetos.
Os dictionariesfornecem um mecanismo similar para armazenamento e recuperao de objetos comnomes chaves. O AutoCAD cria o named object dictionary sempre que cria um novo desenho, e a
partir desse pode se criar outro objetos e adicion-los no mesmo. Contudo, o mais prtico seriaadicionar um nico objeto no named object dictionarye a partir dele adicionar outros dictionaries.Tipicamente, o objeto possudo uma classe container assim como um dictionary. O dictionary, pordefault, contm dois dictionaries: ACAD_GROUPe ACAD_MLINESTYLE.
A classe hierrquica para symbol tables, symbol tables records, dictionaries e iterators aseguinte:
AcRxObject
AcDbObject
AcDbDictionary
AcDbDictionaryIterator
(AcRxObject)(AcDbObject)
Pgina 42 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
43/104
AcDbSymbolTable
AcDbBlockTable
AcDbDimStyleTable
AcDbLayerTableAcDbLinetypeTable
AcDbRegAppTable
AcDbTextStyleTable
AcDbUCSTable
AcDbAbstractViewTable
AcDbViewportTable
AcDbViewTable
AcDbSymbolTableRecord
AcDbBlockTableRecord
AcDbDimStyleTableRecord
AcDbLayerTableRecord
AcDbLinetypeTableRecord
AcDbRegAppTableRecord
AcDbTextStyleTableRecord
AcDbUCSTableRecord
AcDbAbstractViewTableRecord
AcDbViewportTableRecord
AcDbViewTableRecord
AcDbSymbolTableIterator
AcDbBlockTableIterator
AcDbBlockTableRecordIterator
AcDbDimStyleTableIterator
AcDbLayerTableIterator
Pgina 43 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
44/104
-
8/14/2019 ObjectARX.pdf
45/104
Outra funes pra o symbol tablesso:
Adesk::Boolean
AcDb##BASE_NAME##Table::has(const char* pName) const;
Acad::ErrorStatusAcDb##BASE_NAME##Table::add(AcDb##BASE_NAME##TableRecord*
pRecord);
Acad::ErrorStatus
AcDb##BASE_NAME##Table::add(AcDbObjectId& record Id,
AcDb##BASE_NAME##TableRecord*
pRecord);
Block Table
Entidades no banco de dados pertencem ao block table record. O block tablecontem dois recordscomo default, MODEL_SPACE e PAPER_SPACE, que correspondem a dois espaos de edio.
Layer Table
O layer table contem um layer, layer 0, por default. O usurio pode adicionar outros atravs do
comando LAYER.Propriedades do Layer
A classe AcDbLayerTableRecord contem funes membro para especificar o nmero depropriedades que afetaram a entidade.
Frozen/Thawed
void AcDbLayerTableRecord::setIsFrozen(Adesk::Boolean);
Adesk::Boolean
AcDbLayerTableRecord::isFrozen() const;
On/Off
void AcDbLayerTableRecord::setIsOff(Adesk::Boolean);
Adesk::Boolean
AcDbLayerTableRecord::isOff() const;
Viewport
void AcDbLayerTableRecord::setVPDFLT(Adesk::Boolean);
Pgina 45 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
46/104
Adesk::Boolean
AcDbLayerTableRecord::VPDFLT() const;
Locked/Unlocked
void AcDbLayerTableRecord::setIsLocked(Adesk::Boolean);Adesk::Boolean
AcDbLayerTableRecord::isLocked() const;
Color
void AcDbLayerTableRecord::setColor(const AcCmColor &color);
AcCmColor
AcDbLayerTableRecord::color() const;
Linetype
void AcDbLayerTableRecord::setLinetypeObjectId(AcDbObjectId);
AcDbObjectId
AcDbLayerTableRecord::linetypeObjectId() const;
Criando e Modificando um Layer Table Record
O exemplo mostra como criar um novo layer table record(AcDbLayerTableRecord) e setarcertos atributos do layer.
void
addLayer()
{
AcDbLayerTable *pLayerTbl;
acdbCurDwg()->getLayerTable(pLayerTbl, AcDb::kForWrite);
if (!pLayerTbl->has("testlayer")) {
AcDbLayerTableRecord *pLayerTblRcd
= new AcDbLayerTableRecord;
pLayerTblRcd->setName("ASDK_TESTLAYER");
pLayerTblRcd->setIsFrozen(0); // layer para THAWED
pLayerTblRcd->setIsOff(0); // layer para ON
Pgina 46 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
47/104
pLayerTblRcd->setVPDFLT(0); // viewport default
pLayerTblRcd->setIsLocked(0); // un-locked
AcCmColor color;
color.setColorIndex(1); // seta a cor para vermelhopLayerTblRcd->setColor(color);
// Para linetype necessrio fornecer o object id da
// linetype record
AcDbObjectId ltId;
acdbCurDwg()->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);
if ((pLinetypeTbl->getAt("DASHED", ltId))
!= Acad::eOk)
{
ads_printf("\nUnable to find DASHED"
" linetype. Using CONTINUOUS");
pLinetypeTbl->getAt("CONTINUOUS", ltId);
}
pLinetypeTbl->close();
pLayerTblRcd->setLinetypeObjectId(ltId);
pLayerTbl->add(pLayerTblRcd);
pLayerTblRcd->close();
pLayerTbl->close();
} else {
ads_printf("\nlayer already exists");
}
}
Iterators
Pgina 47 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
48/104
Cada symbol table tem um iterator correspondente que pode ser criado com a funoAcDb##BASE_NAME::newIterator( ).
AcDb##BASE_NAME##Table::newIterator() function.
Acad::ErrorStatus
AcDb##BASE_NAME##Table::newIterator(
AcDb##BASE_NAME##TableIterator*&
pIterator,
Adesk::Boolean
atBeginning = Adesk::kTrue,
Adesk::BooleanskipErased = Adesk::kTrue)
const;
A funo newIterator( ) cria um objeto que pode ser usado para percorrer atravs do contedo datable e estabelecer pIterator para apontar para o objeto iterator. possvel se criar um novoiterator, mas no se pode esquecer de delet-lo antes de fechar o symbol table. A classe
AcDbBlockTableRecord retorna um objeto da classe AcDbBlockTableRecordIterator , que permitepercorrer atravs das entidades contidas no block table record.
Interagindo sobre Tables
O exemplo cria um iterator que percorre pelo symbol table record na linetype table.
void
iterateLinetypes()
{
AcDbLinetypeTable *pLinetypeTbl;
acdbCurDwg()->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);
// Cria um novo iterator.
AcDbLinetypeTableIterator *pLtIterator;
pLinetypeTbl->newIterator(pLtIterator);
// Percorre a table
AcDbLinetypeTableRecord *pLtTableRcd;
Pgina 48 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
49/104
char *pLtName;
for (; !pLtIterator->done(); pLtIterator->step()) {
pLtIterator->getRecord(pLtTableRcd, AcDb::kForRead);
pLtTableRcd->getName(pLtName);pLtTableRcd->close();
ads_printf("\nLinetype name is: %s", pLtName);
free(pLtName);
}
delete pLtIterator;
pLinetypeTbl->close();
}
Dictionaries
Para criar um novo dictionary, necessrio criar uma instancia do AcDbDictionary, adicionar nobanco de dados e registrar com o objeto. Quando isso acontece o dictionaryautomaticamente anexaum reactor para a entrada. Com a funo setAt( )adiciona objetos para o dictionarye o banco dedados.
Acad::ErrorStatus
AcDbDictionary::setAt(const char* pSrchKey,
AcDbObject* pNewValue,
AcDbObjectId& retObjId);
Groups e o Group Dictionary
Um Group um objeto container que mantem uma coleo ordenada de entidades no banco dedados, porem ele no tem um ownership link para as entidades que contem. Quando uma entidade apagada , os groups que a contem so automaticamente removidos. Se a mesma entidade fordesapagada, os groupsso novamente inseridos.
Algumas funes podem ser usadas para os Groups e no necessrio setar cada elemento, porexemplo: setColor(), setLayer(), setLinetype(), setVisibility(), and setHighlight(). Os Groups devemser armazenados no GROUPdictionary, que pode ser obtido da seguinte forma:
AcDbDictionary* pGrpDict = acdbCurDwg()->getGroupDictionary(
pGroupDict, AcDb::kForWrite);
Pgina 49 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
50/104
Criando um Dictionary
O exemplo cria um dictionary(ASDK_DICT) e adiciona para o named object dictionary. Ento elecria dois novos objetos da classe customizadaAsdkMyClasse adiciona no dictionary.
void
createDictionary()
{
AcDbDictionary *pNamedobj;
acdbCurDwg()->getNamedObjectsDictionary(pNamedobj, AcDb::kForWrite);
// Checa a existencia do dictionary
AcDbDictionary *pDict;if (pNamedobj->getAt("ASDK_DICT", (AcDbObject*&) pDict,
AcDb::kForWrite) == Acad::eKeyNotFound)
{
pDict = new AcDbDictionary;
AcDbObjectId DictId;
pNamedobj->setAt("ASDK_DICT", pDict, DictId);
}
pNamedobj->close();
if (pDict) {
// Cria novos objects para adicionar para o novo dictionary,
AsdkMyClass *pObj1 = new AsdkMyClass(1);
AsdkMyClass *pObj2 = new AsdkMyClass(2);
AcDbObjectId rId1, rId2;
pDict->setAt("OBJ1", pObj1, rId1);
pDict->setAt("OBJ2", pObj2, rId2);
pObj1->close();
pObj2->close();
pDict->close();
Pgina 50 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
51/104
}
Interagindo sobre Entradas do Dictionary
A classe iterator para dictionaries AcDbDictionaryIterator. O exemplo a seguir obtem umdictionary(ASDK_DICT) do named object dictionarye usa um iteradorpara percorrer as entradas
dodictionary
.void
iterateDictionary()
{
AcDbDictionary *pNamedobj;
acdbCurDwg()->getNamedObjectsDictionary(pNamedobj, AcDb::kForRead);
// D o ponteiro para ASDK_DICT dictionary
AcDbDictionary *pDict;
pNamedobj->getAt("ASDK_DICT", (AcDbObject*&)pDict, AcDb::kForRead);
pNamedobj->close();
// D o iterador para ASDK_DICT dictionary
AcDbDictionaryIterator* pDictIter= pDict->newIterator();
AsdkMyClass *pMyCl;
Adesk::Int16 val;
for (; !pDictIter->done(); pDictIter->next()) {
// D o corrente record, o abre para ler
pDictIter->getObject((AcDbObject*&)pMyCl, AcDb::kForRead);
pMyCl->getData(val);
pMyCl->close();
ads_printf("\nintval is: %d", val);
}
delete pDictIter;
pDict->close();
Pgina 51 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
52/104
}
Xrecords
Xrecords permite a adio de dados especficos de forma arbitrria e limitada. Essa uma formaalternativa de guardar dados mais utilizada em ADS ou AutoLISP.
Definindo Novas ClassesIII. Derivando um Classe Customizada ARX
Nessa sesso tem-se como utilizar as macros em ARX derivando da classe customizada ARX.
Derivao da Classe Customizada
possvel derivar novas classes das classes j existentes na hierarquia ARX:
AcRxObject
AcRxService
AcDbObject
AcDbEntity
AcDbCurve
AcDbObjectReactor
AcDbDatabaseReactor
AcDbEntityReactor
AcTransactionReactor
AcEdJig
AcEditorReactor
Classes que no devem derivar:
AcDbAttribute
AcDbAttributeDefinition
Pgina 52 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
53/104
AcDbArc
AcDbBlockReference
AcDbCircle
AcDbFaceAcDbLine
AcDbMInsertBlock
AcDbPoint
AcDbShape
AcDbSolid
AcDbText
AcDbTrace
All AcDbXxxDimension classes
AcDbViewport
AcDbGroup
All classes derived from AcDbSymbolTable
All classes derived from AcDbSymbolTableRecord
AcDbBlockBegin
AcDbBlockEnd
AcDbSequenceEnd
AcDb2dPolyline
AcDb2dPolylineVertex
AcDb3dPolyline
AcDb3dPolylineVertex
AcDbPolygonMesh
AcDbPolygonMeshVertex
AcDbPolyFaceMesh
AcDbPolyFaceMeshVertex
Pgina 53 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
54/104
AcDbFaceRecord
Identificao de Classes Rotina
Toda classe na hierarquia ARX que derivada de AcRxObject tem uma classe dedescrio do objeto, que uma instancia de AcRxClass que guarda informaes para otipo de identificao. Essas classes so criadas na inicializao, quando classes soregistradas com ARX e so adicionadas no dictionary, acrxClassDictionary.
Macro:Classes de Declarao
As macros so usadas numa seo pblica das classes de declarao:
class myClass : public AcRxObject
{
public:
ACRX_DECLARE_MEMBERS(myClass);
...
};
Quando expandida:
virtual AcRxClass* isA() const;
static AcRxClass* gpDesc;
static AcRxClass* desc();
static AsdkPoly* cast(const AcRxObject* inPtr)
{
return ((inPtr == 0)
|| !inPtr->isKindOf(AsdkPoly::desc()))
? 0 : (AsdkPoly*)inPtr;
};
static void rxInit();
Macro:Classes de Implementao
Pgina 54 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
55/104
-
8/14/2019 ObjectARX.pdf
56/104
AcDbObject: Funes para Sobrecarregar Essencialmente
virtual Acad::ErrorStatus
dwgInFields(AcDbDwgFiler* filer);
virtual Acad::ErrorStatusdwgOutFields(AcDbDwgFiler* filer) const;
virtual Acad::ErrorStatus
dxfInFields(AcDbDxfFiler* filer);
virtual Acad::ErrorStatus
dxfOutFields(AcDbDxfFiler* filer) const;
AcDbObject: Funes para Sobrecarregar Frequentemente
virtual Acad::ErrorStatus
audit(AcDbAuditInfo*);
virtual Acad::ErrorStatus subClose();
virtual Acad::ErrorStatus
deepClone(AcDbObject* pOwnerObject,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary = Adesk::kTrue) const;
virtual Acad::ErrorStatus
wblockClone(AcRxObject* pOwnerObject,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary = Adesk::kTrue) const;
AcDbObject: Funes para Sobrecarregar Eventualmente
virtual Acad::ErrorStatus
Pgina 56 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
57/104
subErase(Adesk::Boolean erasing);
virtual Acad::ErrorStatus
subHandOverTo(AcDbObject* newObject);
virtual Acad::ErrorStatussubOpen(AcDb::OpenMode);
virtual Acad::ErrorStatus
subCancel();
virtual Acad::ErrorStatus
subSwapIdWith(AcDbObjectId otherId,
Adesk::Boolean swapXdata = Adesk::kFalse);
AcDbObject: Funes para Sobrecarregar Raramente
virtual Acad::ErrorStatus
setOwnerId(AcDbObjectId);
virtual resbuf*
xData(const char* regappName = NULL) const;
virtual Acad::ErrorStatus
setXData(const resbuf* xdata);
virtual void
addPersistentReactor(AcDbObjectId objId);
virtual Acad::ErrorStatus
removePersistentReactor(AcDbObjectId objId);
virtual void
cancelled(const AcDbObject* dbObj);
virtual void
copied(const AcDbObject* dbObj,
const AcDbObject* newObj);
virtual void
Pgina 57 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
58/104
erased(const AcDbObject* dbObj,
Adesk::Boolean pErasing = Adesk::kTrue);
virtual void
goodbye(const AcDbObject* dbObj);virtual void
openedForModify(const AcDbObject* dbObj);
virtual void
modified(const AcDbObject* dbObj);
virtual void
modifyUndone(const AcDbObject* dbObj);
virtual void
modifiedXData(const AcDbObject* dbObj);
virtual void
unappended(const AcDbObject* dbObj);
virtual void
objectClosed(const AcDbObjectId objId);
virtual void
modifiedGraphics(const AcDbEntity* dbEnt);
AcRxObject: Funes para Sobrecarregar Raramente
virtual AcRxObject*
clone() const;
virtual void
copyFrom(const AcRxObject* pSrc);
virtual HRESULT __stdcall
QueryInterface ( REFIID riid, void ** ppvObject );
virtual ULONG __stdcall
AddRef();
Pgina 58 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
59/104
virtual ULONG __stdcall
Release();
AcDbEntity: Funes para Sobrecarregar
virtual Adesk::BooleanworldDraw(AcGiWorldDraw* mode);
virtual void
viewportDraw(AcGiViewportDraw* mode);
virtual Acad::ErrorStatus
getGeomExtents(AcDbExtents& extents) const;
virtual Acad::ErrorStatus
transformBy(const AcGeMatrix3d& xform);
virtual Acad::ErrorStatus
getTransformedCopy(const AcGeMatrix3d& xform,
AcDbEntity*& ent) const;
virtual Acad::ErrorStatus
getGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus
moveGripPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset);
AcDbEntity: Funes para Sobrecarregar Usualmente
virtual void
list() const;
virtual Acad::ErrorStatus
intersectWith( const AcDbEntity* ent,
AcDb::Intersect intType,
Pgina 59 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
60/104
AcGePoint3dArray& points,
int thisGsMarker = 0,
int otherGsMarker = 0) const;
virtual Acad::ErrorStatusintersectWith( const AcDbEntity* ent,
AcDb::Intersect intType,
const AcGePlane& projPlane,
AcGePoint3dArray& points,
int thisGsMarker = 0,
int otherGsMarker = 0) const;
virtual Acad::ErrorStatus
getOsnapPoints(AcDb::OsnapMode osnapMode,
int gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus
getStretchPoints(AcGePoint3dArray&) const;
virtual Acad::ErrorStatus
moveStretchPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset);
virtual Acad::ErrorStatus
explode(AcDbVoidPtrArray& entitySet) const;
virtual Acad::ErrorStatus
getSubentPathsAtGsMarker(AcDb::SubentType type,
Pgina 60 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
61/104
int gsMark,
const AcGePoint3d& pickPoint,
const AcGeMatrix3d& viewXform,
int& numPaths,AcDbFullSubentPath* & subentPaths,
int numInserts = 0,
AcDbObjectId* entAndInsertStack =
NULL) const;
virtual Acad::ErrorStatus
applyPartialUndo(AcDbDwgFiler* undoFiler, AcRxClass* classObj);
virtual void
subSetDatabaseDefaults(AcDbDatabase* pDb);
virtual void
getEcs(AcGeMatrix3d& retVal) const;
virtual Acad::ErrorStatus
getGsMarkersAtSubentPath(const AcDbFullSubentPath& subPath,
AcDbIntArray& gsMarkers) const;
virtual Acad::ErrorStatus
highlight(const AcDbFullSubentPath& subId = kNullSubent) const;
virtual Acad::ErrorStatus
unhighlight(const AcDbFullSubentPath& subId = kNullSubent) const;
virtual AcDbEntity*
subentPtr(const AcDbFullSubentPath& id) const;
virtual void
saveAs(AcGiWorldDraw* mode, AcDb::SaveType st);
virtual Adesk::Boolean
saveImagesByDefault() const;
Pgina 61 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
62/104
AcDbEntity: Funes para Sobrecarregar Raramente
virtual Acad::ErrorStatus
setColor(const AcCmColor &color);
virtual Acad::ErrorStatussetColorIndex(Adesk::UInt16 color);
virtual Acad::ErrorStatus
setLinetype(const char* newVal);
virtual Acad::ErrorStatus
setLinetype(AcDbObjectId newVal);
AcDbCurve: Funes para Sobrecarregar
virtual Adesk::Boolean
isClosed () const;
virtual Adesk::Boolean
isPeriodic () const;
virtual Adesk::Boolean
isPlanar () const;
virtual Acad::ErrorStatus
getPlane (AcGePlane&, AcDb::Planarity&) const;
virtual Acad::ErrorStatus
getStartParam(double&) const;
virtual Acad::ErrorStatus
getEndParam (double&) const;
virtual Acad::ErrorStatus
getStartPoint(AcGePoint3d&) const;
virtual Acad::ErrorStatus
getEndPoint (AcGePoint3d&) const;
virtual Acad::ErrorStatus
Pgina 62 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
63/104
getPointAtParam(double, AcGePoint3d&) const;
virtual Acad::ErrorStatus
getParamAtPoint(const AcGePoint3d&, double&)const;
virtual Acad::ErrorStatusgetDistAtParam (double param, double& dist) const;
virtual Acad::ErrorStatus
getParamAtDist (double dist, double& param) const;
virtual Acad::ErrorStatus
getDistAtPoint (const AcGePoint3d&, double&)const;
virtual Acad::ErrorStatus
getPointAtDist (double, AcGePoint3d&) const;
virtual Acad::ErrorStatus
getFirstDeriv (double param,
AcGeVector3d& firstDeriv) const;
virtual Acad::ErrorStatus
getFirstDeriv (const AcGePoint3d&,
AcGeVector3d& firstDeriv) const;
virtual Acad::ErrorStatus
getSecondDeriv (double param,
AcGeVector3d& secDeriv) const;
virtual Acad::ErrorStatus
getSecondDeriv (const AcGePoint3d&,
AcGeVector3d& secDeriv) const;
virtual Acad::ErrorStatus
getClosestPointTo(const AcGePoint3d& givenPnt,
AcGePoint3d& pointOnCurve,
Adesk::Boolean extend
Pgina 63 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
64/104
= Adesk::kFalse) const;
virtual Acad::ErrorStatus
getClosestPointTo(const AcGePoint3d& givenPnt,
const AcGeVector3d& normal,AcGePoint3d& pointOnCurve,
Adesk::Boolean extend
= Adesk::kFalse) const;
virtual Acad::ErrorStatus
getOrthoProjectedCurve(const AcGePlane&,
AcDbCurve*& projCrv) const;
virtual Acad::ErrorStatus
getProjectedCurve(const AcGePlane&,
const AcGeVector3d& projDir,
AcDbCurve*& projCrv) const;
virtual Acad::ErrorStatus
getOffsetCurves(double offsetDist,
AcDbVoidPtrArray& offsetCurves) const;
virtual Acad::ErrorStatus
getSpline (AcDbSpline*& spline) const;
virtual Acad::ErrorStatus
getSplitCurves (const AcGeDoubleArray& params,
AcDbVoidPtrArray& curveSegments) const;
virtual Acad::ErrorStatus
getSplitCurves (const AcGePoint3dArray& points,
AcDbVoidPtrArray& curveSegments) const;
virtual Acad::ErrorStatus
extend(double newParam);
Pgina 64 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
65/104
virtual Acad::ErrorStatus
extend(Adesk::Boolean extendStart,
const AcGePoint3d& toPoint);
virtual Acad::ErrorStatusgetArea(double&) const;
Implementando Funes Membro
Quando se define uma nova funo membro ou se sobrecarrega uma funo j existente, a primeiraque usualmente deve-se chamar assertReadEnabled( ), assertWriteEnabled( ), ouassertNotifyEnabled( )para verificar se o objeto foi aberto da forma certa.
Objetos abrem para:
Filing
A partir da derivao de uma nova classe de AcDbObject, necessrio adicionar aldumasinformaes o mecanismo de armazenamento do AutoCAD. As quatro funes abaixo so utilizadas
para garantir esse armazenamento:
Acad::ErrorStatus
AcDbObject::dwgOut(AcDbDwgFiler* filer);
Acad::ErrorStatus
AcDbObject::dwgIn(AcDbDwgFiler* filer);
Acad::ErrorStatus
AcDbObject::dxfOut(AcDbDxfFiler* filer,
Adesk::Boolean allXdFlag,
Adesk::uchar* regAppTable) const);
Acad::ErrorStatus
AcDbObject::dxfIn(AcDbDxfFiler* filer);
Read Write Notify
assertReadEnabled( ) returns returns returnsassertWriteEnabled( ) aborts returns abortsassertNotifyEnabled( ) returns returns returns
Pgina 65 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
66/104
Cada funo leva um ponteiro para um arquivo como seu argumento primario. Um AcDbObjectescreve e l dados para um arquivo. O FilerTypepermite a checagem do tipo de arquivo.
kFileFiler (used for DWG and DXF files) kCopyFiler kUndoFiler kBagFiler (usado com ads_entmake(), ads_entmod(), e ads_entget()) kIdXlateFiler kPageFiler kDeepCloneFiler kWBlockCloneFiler kPurgeFiler
As funes dwgOut( )e o dwgIn( )chamam dwgOutFields( )e dwgInField( ), respectivamente. Coma derivao deAcDbObject, haver a necessidade de sobrecarregar algumas funes virtuais, que sousadas para armazenagem persistente de objetos, em operaes de cpia ou undo:
dwgOutFields( ) dwgInFields( ) dxfOutFields( ) dxfInFields( )
Funo dwgOut( )
A funo dwgOut( )que chamadwgOutFields( ), invocada pelos seguintes comandos:
SAVE(usa kFileFiler) SAVEAS(usa kFileFiler) WBLOCK(usa kWblockCloneFilere kIdXlateFiler) INSERT, XREF(usa kDeepCloneFilere kIdXlateFiler) COPY(usa os mesmos arquivos que INSERT) PURGE(usa um kPurgeFiler) Quando um objeto paginado para fora (uses a kPageFiler) Quando um objeto modificado (para undo; usa um kUndoFiler)
Funo dwgIn( )
A funo dwgInt( )que chamadwgInFields( ), invocada pelos seguintes comandos:
OPEN(usa kFileFiler) UNDO(usa kUndoFiler) INSERT, COPY, XREF(usa kDeepCloneFilere kIdXlateFiler) WBLOCK(usa kWblockCloneFilere kIdXlateFiler) Quando um objeto paginado para dentro(usa kPageFiler)
Funo dxfOut( )
Pgina 66 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
67/104
A funo dxfOut( )que chamadxfOutFields( ), invocada pelos seguintes comandos:
DXFOUT ads_entget( )
Funo dxfIn( )
A funo dxfIn( )que chamadxfInFields( ), invocada pelos seguintes comandos:
DXFIN ads_entmod( )ou ads_entmake( )
Implementando as Funes de Arquivamento DWG
Ao implementar as funes dwgOutFields( )e dwgInField( )para uma nova classe, deve-se chamarprimeiro as funes assertReadEnabled( ) e assertWriteEnabled( ) para garantir que o objeto foiaberto corretamente.
AcDbDerivedClass::dwgOutFields( ... );
{
assertReadEnabled()
myParent::dwgOutFields();}
Exemplo:
Acad::ErrorStatus
AsdkPoly::dwgOutFields(AcDbDwgFiler* filer) const
{
assertReadEnabled();
Acad::ErrorStatus es;
if ((es = AcDbCurve::dwgOutFields(filer))
!= Acad::eOk)
{
return es;
}
Pgina 67 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
68/104
filer->writeItem(mCenter);
filer->writeItem(mStartPoint);
filer->writeInt32(mNumSides);
filer->writeItem(mPlaneNormal);filer->writeItem(mpName);
filer->writeItem(mTextStyle);
return es;
Acad::ErrorStatus
AsdkPoly::dwgInFields(AcDbDwgFiler* filer)
{
assertWriteEnabled();
Acad::ErrorStatus es;
if ((es = AcDbCurve::dwgInFields(filer)) != Acad::eOk) {
return es;
}
filer->readItem(&mCenter);
filer->readItem(&mStartPoint);
filer->readInt32((long*) &mNumSides);
filer->readItem(&mPlaneNormal);
filer->readItem(&mpName);
filer->readItem(&mTextStyle);
return es;
}
Implementando as Funes de Arquivamento DXF
Ao implementar as funes dxfOutFields( ) e dxfInField( ) para uma nova classe, deve-se chamarprimeiro as funes assertReadEnabled( ) e assertWriteEnabled( ) para garantir que o objeto foi
aberto corretamente.
Pgina 68 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
69/104
-
8/14/2019 ObjectARX.pdf
70/104
e o objeto possuido. Um objeto pode ter apenas um possuidor. Essa conexo usualmente feita emduas fases:
Especificar o objeto possuidor; Especificar qual o objeto possuido.
O protocolo do AcDbObject sempre especifica o link do objeto possuidor para o possuido.// Setar pOwner para ser o possuidor de pOwned
void
makeOwner(OwnerDemo* pOwner, AcDbObject* pOwned)
{
pOwner->setIdData(pOwned->ojectId());
pOwned->setOwnerId(pOwner->objectId());
}
No caso de algumas classes containers essa relao j estabelecida. A funo seta o block tablerecord como o possuidor da entidade:
blockTableRecord->appendAcDbEntity( ...);
Usos do Ownership
Quando um objeto escrito para um arquivo DXFou DWG, todos os objetos possuidos por ele sotambem copiados. A operao deep clone tambem faz com que todos os objetos possuidos peloobjeto clonado, sejam tambm clonados. Um hard ownership protege o objeto possuido de ser
purgado.
Tipos de Ownership
Os ownerpodem ser de dois tipos:
Hard Ownership
Um objeto de banco de dados um hard ownerde seu extension dictionary; O block table um hardownerdo model space e paper space block table records; Extensiondictionariesso hard ownersde seus elementos.
Soft Ownership
Symbol tablesso soft ownersde seus elementos ( com exceo doMODEL_SPACE,PAPER_SPACEe layer 0);
Pgina 70 de 104ObjectARX Bsico
14/4/2010http://webcache.googleusercontent.com/search?q=cache:qGHSQZUGc-EJ:www.cadtec...
-
8/14/2019 ObjectARX.pdf
71/104
Dictionariesso soft ownersde suas entradas.
Referncias Pointer
Um pointer um one-way link , ou seja, no h nenhuma informao no objeto referenciado queindique a origem do ponteiro. Um objeto pode apontar ou ser apontado por qualquer nmero de outrosobjetos.
Hard Pointers
Um hard pointerprotege um objeto de ser purgado. Tem-se alguns exemplos de hard pointers:
Uma entidade contm um hard pointerpara um estilo de dimensionamento; Uma entidade texto contem um hard pointercomo referncia para um estilo de texto; Uma entidade de dimensionamento contm um hard pointerrefernciado para um estilo de
dimensionamento; Uma entidade tem um hard pointerpara um layer.
Soft Pointers
Um soft pointer um simples ponteiro para um objeto. Ele no protege o objeto referenciado de umpurge. Exemplos:
Referncias Xdataso soft pointers; Persistentreactorsso soft pointers.
Purge
O mecanismo purgepermite apagar objetos no utilizados no banco de dados. Se um objeto tem umhard owner ou um pointer reference, ele no pode ser apagado.
AcDbDatabase::purge(AcDbObjectIdArray &idArray);
A funopurge( ) retorna o ID dos objetos que podem ser purgados, sendo assim existe um controlesobre os objetos que esto sendo apagados.
Undo e Redo
Existem dois caminhos bsicos para a aplicao de uma operao Undo. O mecanismo de Undoautomtico, default, deixa o sistema copiar o estado completo do objeto chamando a funodwgOutFields( )com o arquivo Undo. Um mecanismo alternativo, o mecanismo de Undo parcial
que requer um maior esforo programacional, porm habilita uma maior interao com as mudanas.
Toda funo de modificao para a nova classe derivada, deve chamar a funo assertWriteEnabled( ), que checa se o objeto esta habilitado para ser escrito. Se o parmetro para o autoUndo kTrue, o