Você está na página 1de 31

OBJECTARX PARA LEIGOS

Introduo ObjectARX uma extenso de tempo de execuo do AutoCAD. Com ObjectARX SDK voc pode criar aplicativos que permite estender os recursos do AutoCAD como comandos, caixas de dilogo, as entidades, objetos e muito mais. A aplicao ObjectARX uma DLL que carregada no ambiente do AutoCAD e permite que voc criar novos recursos, como mencionado acima. Para ser capaz de construir essas DLLs que voc precisa seguir algumas regras bsicas para o ambiente de instalao do Microsoft Visual Studio.NET . O desempenho desta aplicao ser o mesmo de funcionalidades nativas. Requisitos do usurio Os requisitos mnimos para aprender pelo menos ObjectARX bsicos so:

Visual Basic conceitos Studio.NET; Mdia C + + conhecimento; Conhecimentos avanados de AutoCAD; MFC (Microsoft Foundation Classes) conceitos; Tcnicas de Orientao a Objetos;

Como usar o SDK ObjectARX Depois de ter baixado a sua cpia do SDK e ObjectARX extrados para o disco rgido, voc vai encontrar as seguintes pastas dentro dela:
\ Arxlabs: Este diretrio composto por um conjunto de laboratrios que mostra alguns aspectos do ObjectARX. \ Classmap: Este diretrio contm um desenho do AutoCAD com a rvore de hierarquia de classe ObjectARX. \ Docs: Este diretrio contm os arquivos de ajuda ObjectARX online. \ Inc: o inc diretrio contm os arquivos de cabealho ObjectARX. \ Lib: / lib O diretrio contm os arquivos de biblioteca ObjectARX. \ Redistrib: Este diretrio contm as DLLs que podem ser necessrios para uma aplicao ObjectARX para executar.

\ Samples: Este diretrio contm exemplos de aplicaes ObjectARX. \ Utils: Este diretrio contm outras bibliotecas, como Brep para a representao de fronteira e ObjARXWiz para os assistentes ObjectARX.

Classes ObjectARX Naming Nomes das classes ObjectARX seguir os padres seguinte prefixo:
AcRx: Classes para a ligao de um aplicativo e de registro de classe em tempo de execuo e identificao. Aced: Classes para registrar comandos nativos do AutoCAD e AutoCAD para notificao de eventos. ACDB: Classes de banco de dados do AutoCAD. AcGi: Classes de Grficos para processamento entidades AutoCAD. ACGE: Classes utilitrias para lgebra linear comum e objetos geomtricos.

Dependendo de qual conjunto de recursos que voc usa em seus aplicativos voc precisar usar a biblioteca correspondente da seguinte forma:
AcRx: acad.lib, rxapi.lib, acdb16.lib Aced: acad.lib, rxapi.lib, acedapi.lib, acdb16.lib ACDB: acad.lib, rxapi.lib, acdb16.lib AcGi: acad.lib, rxapi.lib, acdb16.lib ACGE: acad.lib, rxapi.lib, acge16.lib, acdb16.lib

Classe 2 - Base de dados do AutoCAD


Introduo Cada desenho AutoCAD representa um banco de dados estruturado que armazena vrios tipos de objetos. Quando voc acaba de abrir um novo desenho, o AutoCAD cria nos bastidores um banco de dados organizado e eficiente. Este banco de dados tem um mnimo de dados que permite fazer desenhos bsicos. Estes dados mnimo representado basicamente por objetos como camadas, tipos de linha, estilos de texto, etc. Por que voc tem o layer 0, estilo de texto standard, tipo de linha contnua e outros. A partir do AutoCAD verso 2000, voc pode trabalhar com vrios desenhos ao mesmo tempo, esse ambiente chamado de MDI. Esta funcionalidade traz grande flexibilidade.

Como os dados so armazenados Este banco de dados mantm todos os tipos de objetos de um desenho. Esses objetos so armazenados em recipientes adequados, que so repositrios feitos para gerenciar objetos do mesmo tipo. Desta forma, temos mtodos e procedimentos adequados para armazenar entidades, camadas, estilos de texto, etc. Cada objeto armazenado em banco de dados recebe um identificador que chamado ObjectId. Esse identificador nico dentro da mesma sesso de AutoCAD e vlido durante o ciclo de vida de cada objeto. O ObjectId gerado pelo seu banco de dados e voc no precisa se preocupar com a forma de cri-lo. Dentro ObjectARX temos basicamente trs tipos de objetos:

Entidades: objetos com representao grfica (linhas, arcos, textos, ...); Contineres: Objetos especiais para armazenar e gerenciar colees (tabela camada, mesa tipo de linha, ...); Objetos: objetos, sem qualquer representao grfica (grupos, layouts, ...).

Base de dados estrutura AutoCAD

Criao de objetos Para criar um objeto atravs ObjectARX temos algum tipo de receita, dependendo do tipo de objeto e local de armazenamento. Basicamente, voc vai seguir esta seqncia: 1. 2. 3.
Declare um ponteiro para o tipo de objeto que voc gostaria de criar e chamar o seu novo operador; Com esse ponteiro, voc deve chamar os meios adequados para esse objeto para alterar as suas caractersticas; Obter um ponteiro para o banco de dados onde voc gostaria de criar o objeto (a maioria do tempo o banco de dados atual);

4. 5. 6. 7.

Abra o recipiente adequado, onde deve ser armazenado; Chamar o mtodo especfico para armazenar o objeto passando o ponteiro; Receber o seu ObjectId gerado automaticamente pelo seu recipiente; Concluir a operao de fechamento de todos os objetos abertos, incluindo recipientes e objeto que voc acabou de criar.

Obviamente, voc ir criar algumas classes teis para permitir a automatizao deste processo, porque eles so muito semelhantes e podem ser facilmente reutilizados. A idia principal criar uma espcie de funes utilitria de banco de dados como: AddLayer, AddLine, AddCircle, AddTextStyle, etc * muito importante no esquecer de fechar os objetos abertos, pois isso far com que o AutoCAD para finalizar. Exemplo de cdigo para criar uma linha (AcDbLine) Este cdigo demonstra como criar uma simples linha entre dois pontos. O processo simples e sem nenhuma verificao de erro feita. Este cdigo deve ser incorporado dentro de uma estrutura de aplicao ObjectARX para o trabalho. A idia principal mostrar-lhe os conceitos. Alm disso, vamos criar um cdigo de trabalho. Preste ateno ao despacho de abertura e fechamento das operaes.

/ / Primeiro precisamos declarar um par de pontos AcGePoint3d startPt (1,0, 1,0, 0,0); AcGePoint3d endPt (10.0, 10.0, 0.0); / / Agora ns precisamos instanciar um ponteiro AcDbLine / / Neste caso, o construtor me permite passar os 2 pontos AcDbLine pline * novo AcDbLine = (startPt, endPt); / / Agora precisamos abrir o recipiente apropriado que est dentro BlockTable AcDbBlockTable * pBlockTable = NULL; / / Primeiro, pegue o banco de dados atual e depois comear a BlockTable AcDbDatabase * APO = acdbHostApplicationServices() ->workingDatabase(); APO-> getSymbolTable(pBlockTable, ACDB:kForRead); / / Dentro BlockTable, abra o ModelSpace AcDbBlockTableRecord pBlockTableRecord * = NULL; -> GETAT pBlockTable (ACDB_MODEL_SPACE, pBlockTableRecord, ACDB:kForWrite); / / Depois de obter ModelSpace podemos fechar o BlockTable -> Close pBlockTable();

/ / Usando o ponteiro ModelSpace podemos acrescentar a nossa marca nova linha AcDbObjectId lineId = AcDbObjectId::kNull; pBlockTableRecord->appendAcDbEntity(lineId, pLine); / / Para concluir o processo preciso fechar ModelSpace ea entidade -> Close pBlockTableRecord(); -> Close pline();

Classe 3 - Viso geral da aplicao


Introduo Como mencionei antes, o ObjectARX uma DLL que pode ser ligada com ou sem extenses do MFC. Na maioria das vezes voc gostaria utilizar o MFC. Autodesk fornece um Assistente muito til para permitir que os usurios criem rapidamente aplicativos ObjectARX com mnimo esforo. Antes que possamos prosseguir, gostaria de esclarecer as principais diferenas entre aplicaes ObjectDBX e ObjectARX. A idia principal separar a interface e classes de objetos para permitir a chamada "Object Enablers". Esta no uma obrigatoriedade, mas uma boa prtica de programao e a Autodesk fez esta separao. Suponha que voc precise criar um aplicativo com um grupo de entidades e objetos personalizados. Os desenhos criados com esta aplicao ir conter esses objetos personalizados e se outros usurios tentem abrir este desenho dentro do AutoCAD sem suas eles vo ver s as entidades Proxy. Se voc gostaria de permitir que esses usurios para ver seu entidades personalizadas, mas no realizam qualquer comando sobre eles voc s precisa enviar DBX de parte do seu aplicativo. Desta forma o usurio ser capaz de ver suas entidades de costume e realizar algumas operaes limitadas. Quando o desenho salvo, o AutoCAD preservar as informaes da entidade personalizada usando o Proxy. Isso acontecer mesmo se o mdulo DBX no estiver disponvel. O Proxy entidades armazena os dados binrios de seu objeto. Por outro lado, o mdulo ARX de sua aplicao ser responsvel pela interface. L, voc dever registrar seus comandos, crie a sua dilogos, personalizar menus, etc Aplicao Estrutura

Ambos ARX e mdulos DBX deve implementar uma funo de ponto de entrada. Esta funo responsvel para executar troca de mensagens entre o AutoCAD e sua aplicao. Para aqueles que esto familiarizados com a linguagem C semelhante a funo main (). Esta funo ponto de entrada tem uma assinatura como a seguir:
extern "C" AcRx: acrxEntryPoint AppRetCode (AcRx: msg AppMsgCode,* pkt void);

A simples implementao desta funo :


extern "C" AcRx: AppRetCode acrxEntryPoint (AcRx: AppMsgCode msg, void * pkt) {

switch (msg) { caso AcRx: kInitAppMsg: break; caso AcRx: kUnloadAppMsg: break; default: break; } retorno AcRx: kRetOK;

Esta funo implementada automaticamente pelo Assistente, como voc ver mais tarde. O primeiro parmetro (msg) a mensagem enviada a partir do AutoCAD para a sua aplicao dizendo o que est acontecendo. Voc pode receber um "novo desenho" mensagem, um "init aplicativo" mensagem entre muitos outros. Essas mensagens so muito importantes para a sua aplicao para permitir que voc reaja a cada evento desejado. O segundo parmetro (PKT) um pacote de dados que pode ser til em algumas. Esta funo deve retornar um valor para o AutoCAD usando AppRetCode que pode ser kRetOK(valor comum) ou mesmo kRetError que ir forar o AutoCAD para descarregar a sua aplicao. O ponto mais relevante aqui para lembrar que esta funo muito importante e onde seu aplicativo comear a ser executado. Registrando os Comandos

Provavelmente, sua aplicao vai implementar vrios comandos.Voc pode registrar seus comandos a partir do acrxEntryPoint () quando receber a mensagem kInitAppMsg que representa o evento disparado pelo AutoCAD quando ele carrega sua aplicao (isso pode ser feito de vrias maneiras que discutiremos mais tarde). Uma vez que essa mensagem recebida, voc pode chamar os mtodos apropriados para registrar cada comando desejado. Comandos de registro deve ter um nome de grupo, um nome global, um nome local, alguns flags, um ponteiro de funo nula e, eventualmente, alguns outros parmetros. Basicamente, o comando ser registrado usando uma funo especifica. Esta funo deve ser uma funo nula sem quaisquer parmetros. Quando o usurio dentro do AutoCAD chamar de seu comando, o AutoCAD buscar sua pilha de comando, encontrar o seu comando e disparar a sua funo. isso a! muito importante que se iniciem os seus comandos com um 3 ou 4 cartas prefixo para evitar coliso de comando com outros aplicativos de terceiros. Quanto aos parmetros principais:

Nome do grupo: Permite que voc agrupe seus comandos comuns para facilitar a descarga e gerenci-los; Global Name: Seu nome no traduzido comando. Voc deve usar nomes de Ingls aqui que a lngua mais utilizada; Nome do Local: O nome do comando no idioma local, que representa o nome traduzido; Bandeiras: Pode ser uma combinao de vrios tipos. Os dois parmetros mais importantes so ACRX_CMD_TRANSPARENT e ACRX_CMD_MODAL. Eles estabelece o seu comportamento de comando que pode ser transparente (como o zoom) ou modal (como os comandos principais);

ponteiro void funo: Aqui voc passa o nome da funo de vazio que voc gostaria de ligao com o comando. Essa funo vai ser acionada pelo AutoCAD, quando o comando chamado.

Depois de registrar seus comandos que voc precisa, obviamente, cancelar o registro quando sair do AutoCAD ou quando o aplicativo descarregado. Isso pode ser feito facilmente, basta cancelar o registro de todos os comandos pelo nome do grupo. Quando voc receber a mensagem kUnloadAppMsg hora de remover seus comandos. Executando seu aplicativo Supondo que voc j compilou sua aplicao com sucesso, hora de carreg-lo dentro do AutoCAD e testar seus comandos. Meu mtodo prefervel para carregar / descarregar aplicaes ObjectARX atravs do comando APPLOAD. Ele abre um dilogo muito til que permite

que voc navegue para a aplicao e carreg-lo.

Classe 3 - Mnimo aplicativo usando ARXWizard


Desta vez, vamos usar a ferramenta ARXWizard que fornecido pela Autodesk atravs ObjectARX SDK. Se voc vai ao Utils \ pasta voc encontrar o programa de instalao. V em frente, instal-lo e permitir que o Live Update para ser executado no primeiro tempo. Faa isso com o Visual Studio. NET fechado. Depois de instal-lo, abra o Visual Studio.NET, abra o menu Arquivoe iniciar um novo projeto. O seguinte dilogo ir aparecer e voc encontrar um novo n dentro do Visual C + + pasta que se chama Autodesk. Selecione o n e o ObjectARX / DBX / OMF cone Projeto ir aparecer no lado direito da seguinte forma:

Preencha o campo Nome e especifique o local desejado para criar o novo projeto. Clique em OK para continuar. O dilogo a seguir ser exibida:

Esta janela apresenta as etapas para configurar o seu novo projeto.A primeira pgina, chamado de Sntese, mostra algumas informaes e dar-lhe a oportunidade de informar o seu RDS (Registered Developer Symbol). Este rtulo ser usado para prefixar qualquer coisa que o seu cdigo poderia executar e poderia entrar em conflito com outros aplicativos de terceiros. Para permitir que este prefixo para ser nico, a Autodesk oferece (atravs de subscries e) uma forma de registrar o prefixo e informar os outros e os membros.Mesmo que voc seja um membro E note que voc deve criar a sua prpria RDS. Use suas iniciais, o seu 3 chars primeiro nome ou qualquer outro nome que voc achar claras e teis. O prximo passo escolher o seu desejado Tipo de aplicativo. Como j mencionei antes, ARXWizard sugere a ARX DBX / tipos que so basicamente a separao de classes e interfaces personalizadas.Mais detalhes sobre as principais diferenas entre ARX e dbx pode ser encontrada na documentao ObjectARX. Desta vez, vamos escolher a opo ObjectARX como segue:

A prxima etapa de cerca de adicionais de suporte do SDK, que permite estender ObjectARX caractersticas bsicas para um Autodesk vertical especfico. Existem duas opes:

OMF Apoio: Esta a extenso do SDK para o Autodesk Architectural Desktop (aka ADT), que contm caractersticas especficas que poderiam ser usados se voc pretende desenvolver um aplicativo para ser executado dentro ObjectARX ADT; MAP da API: Esta a extenso do SDK para o Autodesk MAP, que contm recursos extras para ser usado se voc pretende desenvolver um mapa de aplicao ObjectARX.

No nosso caso, iremos desenvolver uma aplicao simples ObjectARX segmentao (ou baunilha) AutoCAD ento deixe ambos em branco.

O prximo passo especificar Suporte MFC. Como mencionei antes, vamos utilizar o tipo de projeto de extenso do MFC DLL. Este dilogo tambm oferece a opo de ativar o AutoCAD MFC Apoio Extenso que lhe permitir utilizar o AutoCAD controles especficos, como tipo de linha caixas de combinao, caixas de combinao de cores, dilogos Dockable, etc Isso muito til uma vez que os controles no so to simples de implementar a partir do zero .Selecione DLL de extenso e ativada AutoCAD Suporte MFC:

A ltima etapa dedicada COM coisas relacionadas. ObjectARX suporta implementaes COM em ambos os lados servidor e cliente. Como programao COM muito complexo e est alm deste mbito claro que eu no cobri-lo.

Deixar as opes no no um servidor COM e Nenhum. Clique em Concluir para continuar.

Agora voc pode abrir os arquivos do projeto e ver o que o ARXWizard tem feito por voc. Existem muitas diferenas entre o projeto que criamos na classe anterior e do presente projeto, pois ARXWizard usar diferentes implementaes usando classes acessvel. Ns vamos cobrir esses recursos vrias vezes com nossas amostras em breve sobre as classes que vem. Compilar e criar o projeto e tentar carregar o aplicativo resultante ObjectARX dentro do AutoCAD. Voc provavelmente ser capaz de carreg-lo com sucesso.

Classe 4 - Ciclo de Vida do Objeto


Agora voc capaz de criar um projeto ObjectARX mnimo, vamos continuar o curso com alguns conceitos adicionais. Como j mencionei antes, a base de dados do AutoCAD bem organizada para permitir a manipulao direta e simples dos seus objetos. Em geral, temos dois tipos bsicos: recipientes e objetos. Containers so objetos especiais que fornecem um mecanismo simples e eficiente para armazenar, editar e persistir objetos ou colees. Eles so otimizados para permitir o acesso rpido com o mnimo de sobrecarga. Cada tipo de objeto tem um recipiente adequado onde voc deve sempre guardar o objeto. Existem vrios recipientes dentro de banco de dados do AutoCAD, mas alguns dos mais comuns so: LayerTable, LinetypeTable e BlockTable. Cada classe de continer tem mtodos de acesso padro e a maioria delas tambm oferecem um companheiro de classe para percorrer seus itens. Toda vez que voc criar um objeto e gostaria de guard-lo dentro do banco de dados do AutoCAD voc precisa seguir seu protocolo de recipiente para armazenar e persistir assim.

Por outro lado, objetos (incluindo as entidades) so os tipos mais bsicos e representam cada elemento dentro do AutoCAD. Eles so implementados atravs de classes especficas com mtodos padronizados e especficos. Alguns deles poderiam ser derivados dentro do seu aplicativo para permitir a personalizao. Cada objeto de banco de dados residentes tem uma identificao exclusiva chamada ObjectId. Esta identificao o "nome" de cada objeto dentro do banco de dados e usado para fazer referncia, abrir e manipular objetos. Este poderia ser um conceito difcil para aqueles que so fluentes em C + + padro da linguagem porque dentro ObjectARX voc no excluir um ponteiro para um objeto de banco de dados residentes. O qu? Sim, isso

um pouco estranho, mas o AutoCAD tem vrios motivos para isso, incluindo o desempenho, gerenciamento de memria e outros aspectos. Ento, como posso manipular objetos? No entre em pnico. Voc s precisa ter em mente algumas regras bsicas, mas essenciais: 1) objetos residentes em banco de dados nunca devem ser excludos, mesmo que voc apagou-los! 2) Se voc tiver atribudo um objeto, mas no acrescentou ao banco de dados ainda, v em frente ... excluir o ponteiro! 3) Se voc precisa obter um ponteiro para um objeto para manipul-lo, adquirir o seu ObjectId e use o mtodo recipiente adequado para obter o ponteiro. isso? NO. Voc precisa fechar os objetos apenas depois que voc terminar de us-lo. Chame o mtodo close () ou terminar a sua operao para informar que o AutoCAD est pronto!(No se esquea isso, pois o AutoCAD ir terminar) A maioria dos bugs que voc ir enfrentar em sua primeira aplicao ser ter algo a ver com as regras acima. Confie em mim! Objeto Propriedade e Relacionamento Objetos podem se referir uns aos outros usando seus ObjectId. Isso pode ser uma relao de propriedade ou apenas um relacionamento. Se voc pensa sobre uma camada voc vai entender o que est envolvido com este conceito. O recipiente LayerTable possui seus registros, que so objetos (Layers no caso). Cada ObjectId camada chamada dentro de cada entidade. Precisamente devido que voc no pode remover uma camada de um arquivo DWG at que todas as entidades que usa essa camada sejam apagados ou tem a sua camada associada mudou. H vrios exemplos de posses e relacionamentos dentro do AutoCAD. Durante nosso curso voc ir obter este conceito facilmente quando temos de manipular objetos bsicos. Criando uma Camada Em aulas anteriores, apresentei alguns fragmento de cdigo para explicar como criar entidades simples. Agora vou apresentar um cdigo simples para criar uma camada s para permitir que voc se sinta como protocolo est envolvido em tal operao:
AcDbLayerTable pLayerTbl * = NULL; / / Pega o banco de dados atual AcDbDatabase * APO = acdbHostApplicationServices()->workingDatabase();

/ / Pega o LayerTable para escrever, porque ns vamos criar uma nova entrada PDB->getSymbolTable (pLayerTbl,: ACDB: kForWrite; / / Verificar se a camada j est l if (!-> pLayerTbl tem (_T ("myLayer"))) { / / Instanciar um novo objeto e definir suas propriedades * AcDbLayerTableRecord pLayerTblRcd = new AcDbLayerTableRecord; -> SetName pLayerTblRcd (_T ("myLayer")); pLayerTblRcd->setIsFrozen (0); / camada / conjunto de descongelado ->SetIsOff pLayerTblRcd (0); / camada / em ON pLayerTblRcd->setIsLocked (0); / camada / un bloqueado AcCmColor cor; color.setColorIndex (7); / / cor da camada definido como branco -> SetColor pLayerTblRcd (cor); / / Agora, adicionar a nova camada em sua embalagem pLayerTbl-> add (pLayerTblRcd); / / Fechar a nova camada (NO apag-lo) -> Close pLayerTblRcd (); / / Fechar o recipiente -> Close pLayerTbl (); Else {} / / Se a nossa camada j est l, basta fechar o recipiente e continuar -> Close pLayerTbl (); acutPrintf (_T ("\ nMYLAYER j existe")); }

Classe 5 - Object Management


Introduo Na aula anterior falamos sobre ciclo de vida do objeto. Nesta classe iremos mais informaes sobre como gerenciar os objetos do AutoCAD. Como j referi cada objeto tem sua prpria identificao chamado ObjectId. Esta a chave para a aquisio de seu ponteiro e realizar operaes de leitura ou gravao. O mtodo padro de acesso feito por uma operao de abertura (para escrever, para ler ou para a comunicao), algumas operaes e um mtodo CLOSE. Outra abordagem, muito mais eficiente atravs de transaes. Este mecanismo muito mais seguro e eficiente. Vamos falar sobre os dois mtodos.

Usando o padro OPEN / CLOSE mtodo Este o mtodo mais utilizado, mas, em contrapartida, o mais inseguro, porque voc pode esquecer de fechar o objeto e ento causar violaes de acesso ou at mesmo erros fatais que far com que o AutoCAD para finalizar. A funo padro global para abrir objetos chamada acdbOpenObject (). Essa funo abrir cada objeto derivado da classe AcDbObject e proporcionar-lhe um C + + ponteiro para acessar as propriedades do objeto e mtodos. Um deste assinaturas de funo o seguinte:
Acad inline: acdbOpenObject ErrorStatus (* AcDbObject & pObj, idAcDbObjectId, ACDB:: Modo openMode, bool openErased); pObj id Modo ponteiro para o objeto de sada aberta Entrada objeto de identificao do objeto para abrir O modo de entrada para abrir objeto

openErased Entrada booleano que indica se est tudo OK para abrir um objeto apagados

Esta funo recebe um ponteiro vazio para AcDbObject por referncia que ser preenchido pelo AutoCAD, se houver um objeto com a varivel de entrada desde id. Alm disso, voc precisar fornecer a sua inteno de ao sobre o objeto que pode ser escrever, ler ou NOTIFY. O ltimo parmetro indica se voc gostaria de abrir o objeto se ele estiver em estado apagado. Lembre-se que ter falado que os objetos permanecem dentro do banco de dados apagados AutoCAD at a prxima operao de salvamento. A inteno inicial muito importante, pois ir limitar ou no o que voc pode fazer com o objeto. Se voc abrir um objeto para leitura voc no ser capaz de chamar os mtodos que modificam o estado do objeto. Por outro lado, se voc abrir o objeto para o WRITE voc ser capaz de modificar e ler os dados do objeto. Ah, ento melhor abrir sempre o objeto para escrever? Definitivamente NO! Se a sua rotina abre vrios objetos e voc usar o sinalizador WRITE voc certamente vai perder desempenho. O mesmo objeto pode ser aberto para leitura de at 256 vezes, mas no recomendado. Voc deve sempre fechar o objeto o mais rapidamente possvel. Se um objeto aberto para gravao voc no pode abri-lo uma segunda vez para gravao. Basicamente, voc precisa seguir as seguintes regras:

Abertura objetos em diferentes modos Objeto aberto para: kForRead openedForRead openedForWrite openedForNotify wasNotifying Desfazer eAtMaxReaders kForWrite eWasOpenForRead kForNotify (Sucesso)

eWasOpenForWrite eWasOpenForWrite (Sucesso) eWasOpenForNotify eWasOpenForNotify eWasOpenForNotify (Sucesso) eWasNotifying eWasNotifying

eWasOpenForUndo eWasOpenForUndo (Sucesso)

Para um melhor desempenho recomendvel sempre a abrir o objeto para ler, analisar se ir modific-lo e somente aps esta anlise, atualizar sua operao de abertura de escrever usando o upgradeOpen() mtodo. Ir mudar o estado do objeto de LER para ESCREVER. Para voltar a usar o downgradeOpen LER () mtodo. Estes mtodos so muito teis. Uma operao simples de usar esses mtodos seriam:
changeColor void (id AcDbObjectId) { AcDbEntity reprimida * = NULL; if (acdbOpenObject(PENT, id, ACDB: kForRead) == Acad: EOK) { if (-> ColorIndex reprimida (!) = 3) { -> UpgradeOpen reprimida (); -> SetColorIndex reprimida (3); } else { acutPrintf (_T ("\ nEntity j tem color = 3")); } -> Close reprimida(); } }

Usando o mtodo de transaes Transaes so uma e muito mais eficiente mtodo de melhor gerenciar os objetos. Elas podem ser aninhadas e isso permite que voc execute operaes de longo sem a limitao de LER e ESCREVER os estados. Basicamente, voc precisa abrir uma transao, realizar as modificaes desejadas e, ao final, realizar um fim, ou operao de transao abortar. As transaes so muito bons para usar quando seu aplicativo usa caixas de dilogo que os objetos mudam. Na sua abertura de dilogo que voc iniciar uma nova transao e, dependendo do usurio clique no boto OK ou Cancelar, voc chama de fim ou mtodos de operao abortar.

Quando voc cancelar uma operao contidas modificao todo so cancelados. De fato, as modificaes so realmente aplicadas apenas quando voc finalizar uma transao. Outra grande caracterstica que voc pode abrir um objeto para ESCREVER vrias vezes, pode ser aberto para leitura, ao mesmo tempo. Voc no precisa fechar os objetos abertos atravs de uma transao. O fim do mtodo ou abortar ir fechar todos os objetos abertos e ir realizar as modificaes necessrias. No recomendvel misturar padro OPEN / CLOSE aproximao com transaes devido algumas limitaes do projeto. Voc pode ler mais detalhes sobre esta documentao SDK para dentro. Agora, vamos a ver a mesma operao que fizemos acima usando transaes:
changeColor void (id AcDbObjectId) { AcDbEntity reprimida * = NULL; -> StartTransaction acdbTransactionManager (); if (-> getObject acdbTransactionManager ((* & AcDbObject) PENT, id, ACDB: kForRead) == Acad: EOK) { if (-> ColorIndex reprimida (!) = 3) { -> UpgradeOpen reprimida (); -> SetColorIndex reprimida (3); } else { acutPrintf (_T ("\ nEntity j tem color = 3")); } } -> EndTransaction acdbTransactionManager(); }

Desta vez, voc abre o objeto usando a funo GetObject ()mtodo que muito parecido com acdbOpenObject (), mas voc NO precisa fechar o objeto. Todo o processo encerrado no endTransaction() chamada de mtodo. Naquela poca todas as operaes so aplicadas em uma nica operao.

Classe 6 - Entidades
Introduo Entidades so objetos que tem uma representao grfica. Eles podem ser simples ou complexa, dependendo de como muitas caractersticas e funcionalidades que implementam. Entidades so armazenados em objetos de recipiente BlockTableRecord. Cada um desses recipientes manter suas entidades, at que sejam apagados ou banco de dados destrudo. Como qualquer outro objeto de banco de dados residentes, cada entidade pode ser acessado atravs do

seu ObjectId nico. Utilizando o seu ObjectId podemos ento adquirir o ponteiro (para ler, escrever ou informar como vimos na aula anterior) e em seguida, executar operaes desejadas. Algumas entidades especial contm tambm outros objetos para simplificar a implementao e gesto. Um bom exemplo desta abordagem AcDb3dPolyline que tem uma coleo de objetosAcDb3dPolylineVertex que representa cada um de seus vrtices. Entidade Propriedades entidades AutoCAD possui vrias propriedades e algumas delas so comuns a todo o tipo de entidade. Essas propriedades so armazenados em base de classe de entidade chamada AcDbEntity. Esta classe, tambm derivado da AcDbObject implementa vrias funcionalidades comuns que sero utilizados por cada classe derivada e implementado entidade relacionada. Se criarmos um crculo (AcDbCircle), por exemplo, ele ir conter algumas propriedades que veio AcDbEntity. Essas propriedades so:

Cor Linetype escala Linetype Visibilidade Camada Linha de peso Lote nome do estilo

Estas propriedades tem mtodos de acesso especficos que lhe permitem ler ou modific-los acessando a classe base AcDbEntity. Ento, se chegarmos a nossa entidade AcDbCircle e gostaria de mudar a sua cor s precisamos abri-lo para gravar, acessar o mtodo adequado e, em seguida, fechar o crculo. Se ns precisamos construir uma aplicao que apenas o acesso dessas propriedades que ns realmente no precisamos saber que tipo de entidade estamos abrindo. Nesta situao, s precisamos abrir a nossa entidade, obter o seu ponteiro como um ponteiro AcDbEntity e acessar o mtodo desejado. Entidade Transformaes Cada entidade do AutoCAD colocado em um espao 3D. Voc j sabe que pode se mover, girar, dimensionar, alinhar e muitas outras modificaes de uma determinada entidade. ameaas

AutoCAD maioria dessas operaes usando lgebra geomtrica utilizando matrizes. Lembre-se que temos falado sobre as classes ObjectARX e, especialmente neste caso, sobre o prefixo classesACGE. As classes so classes ACGE geomtrica que lhe permitir realizar simples e complexas operaes geomtricas dentro do AutoCAD. Ento vamos supor que voc precisa para realizar uma rotao mais diversas entidades (crculos, polilinhas, linhas, etc) e precisam fazer isso com o mnimo de esforo e conhecimentos geomtricos bsicos. No grande coisa! Ns apenas precisamos de construir uma matriz de transformao e chamar o mtodo adequado, denominado transformBy() implementado pela classe AcDbEntity. Sim, cada entidade poderia ser potencialmente transformado! Esta funo recebe um objeto de AcGeMatrix3d classe que representa a matriz a ser aplicado para a entidade que ir executar algumas operaes geomtricas. Esta poderia ser uma matriz de transformao, uma matriz de rotao e assim por diante. Essa classe tem funes de utilidade maravilhosa que ir reduzir o seu trabalho muito! Entre essas funes que eu gostaria de citar o seguinte:

setToRotation: Voc passa no ngulo desejado (em radianos), o vetor do eixo de rotao eo ponto de rotao.Com estes parmetros desta funo ir preencher a AcGeMatrix3d com todos os elementos. Depois disso, basta ligar para entidade transformBy seu mtodo () passando este a matriz em; setToTranlation: Voc acabou de passar em um vetor 3D (AcGeVector3d), que representa a transformao que voc gostaria de realizar. Depois disso, faa a mesma operao, como mencionado acima; setToMirroring: Esta funo tem 3 verses que recebe umponto (AcGePoint3d), uma linha (AcGeLine3d) ou umplano (AcGePlane). Dependendo do tipo de parmetro que voc passar ir construir a matriz adequada para espelhar a sua entidade! Grande hum?

Entidade Interseco Outra importante funcionalidade implementada a nvel AcDbEntity interseco entidade. Provavelmente um de seus produtos no futuro tero de analisar cruzamentos entidades. O mtodo intersectWith() o responsvel para fazer este trabalho para voc.

A assinatura mais comuns deste mtodo recebe o ponteiro entidade argumento (a entidade que voc gostaria de testar com o seu), otipo de cruzamento, um conjunto de pontos 3D para ser preenchido por esta funo com pontos de interseo encontrados e, opcionalmente, GS marcador de ambas as entidades, que representa o ndice subentidade. O tipo de cruzamento deve ser um dos seguintes operandos:

kOnBothOperands: nem entidade prorrogado; kExtendThis: estender esta entidade; kExtendArg: entidade argumento estender; kExtendBoth: estender ambas as entidades.

Se essas duas entidades interceptar o outro (obviamente, dependendo do tipo de interseco que voc especificar), a matriz passada recebero os pontos de interseco. Esta funo muito til e usa o motor do ncleo geomtrico do AutoCAD que tornam fcil e confivel.

Classe 7 - Recipientes
Nesta classe eu vou apresentar os conceitos e as caractersticas dos objetos de recipiente ObjectARX. Falmos um pouco sobre eles antes, mas agora vamos entrar em detalhes. Introduo O objetivo objeto de recipiente para armazenar e gerenciar objetos do mesmo tipo ou classe. Existem dois tipos de recipientes: tabelas de smbolos e dicionrios. Cada tipo de recipiente tem algumas funcionalidades especficas que foram concebidas para permitir que os mtodos de acesso fcil e eficiente. Tabelas de smbolos Este tipo de recipiente projetado para armazenar os registros de chamadas. Cada smbolo do objeto Table armazenar seus registros usando um nome de entrada nica. Atravs desta entrada, possvel obter o ponteiro de registro e ler ou escrever informao. O recipiente tambm pode receber as novas entradas nem tem entradas removido (no caso, no so utilizados por outros objetos).

Para percorrer uma entrada no continer de objetos que voc ter que usar um iterador adequada que lhe permitir obter entradas e acessar seus objetos. AutoCAD tem algumas tabelas de smbolos para armazenar camadas, tipos de linha, estilos de texto e outros objetos. Como estes contentores trabalho quase da mesma maneira, h uma classe base comum para cada uma das tabelas de smbolos, seus registros e os iteradores adequada. A rvore smbolo de classe da tabela a seguinte:
AcDbSymbolTable

AcDbAbstractViewTable

AcDbViewportTable AcDbViewTable

AcDbBlockTable AcDbDimStyleTable AcDbLayerTable AcDbLinetypeTable AcDbRegAppTable AcDbTextStyleTable AcDbUCSTable

AcDbSymbolTableRecord

AcDbAbstractViewTableRecord

AcDbViewportTableRecord AcDbViewTableRecord

AcDbBlockTableRecord AcDbDimStyleTable Record AcDbLayerTable Record AcDbLinetypeTable Record AcDbRegAppTable AcDbTextStyleTable AcDbUCSTable

AcDbSymbolTableIterator

AcDbAbstractViewTableIterator

AcDbViewportTableIterator AcDbViewTableIterator

AcDbBlockTableIterator AcDbDimStyleTable Iterator AcDbLayerTable Iterator AcDbLinetypeTable Iterator AcDbRegAppTable Iterator AcDbTextStyleTable Iterator AcDbUCSTable Iterator

Assim, para criar uma camada, por exemplo, voc vai precisar:

Abrir banco de dados atual; Abra AcDbLayerTable (para gravar); Criar um AcDbLayerTableRecord (usando o operador novo); Configure o AcDbLayerTableRecord; Adicion-lo AcDbLayerTable que seu recipiente adequado; Fechar o registro; Fechar o recipiente.

createLayer void () {

AcDbLayerTable pLayerTbl * = NULL; acdbHostApplicationServices () -> workingDatabase () ->) GetSymbolTable (pLayerTbl,: ACDB: kForWrite;

if (!-> pLayerTbl tem (_T ("myLayer"))) {

* AcDbLayerTableRecord pLayerTblRcd = new AcDbLayerTableRecord; -> SetName pLayerTblRcd (_T ("myLayer"));

AcCmColor cor; color.setColorIndex (1); / vermelho -> SetColor pLayerTblRcd (cor); pLayerTbl-> add (pLayerTblRcd); -> Close pLayerTblRcd ();

AcutPrintf} else ("\ nLayer j existe"); -> Close pLayerTbl ();

} Para listar todas as camadas existentes:

Abrir banco de dados atual; Abra AcDbLayerTable (para leitura); Criar um AcDbLayerTableIterator; Executar um loop atravs de entradas recipiente; Obter o nome da chave para cada entrada; Fechar o recipiente.

iterateLayers void () {

AcDbLayerTable pLayerTbl * = NULL; acdbHostApplicationServices () -> workingDatabase () ->) GetSymbolTable (pLayerTbl,: ACDB: kForRead;

AcDbLayerTableIterator pLayerIterator *; -> NewIterator pLayerTbl (pLayerIterator);

AcDbLayerTableRecord * pLayerTblRcd; TCHAR nome_ling_proc *; for (;!-> pLayerIterator done ();-> etapa pLayerIterator ()) {

-> PLayerIterator GetRecord (pLayerTblRcd, ACDB: kForRead); -> GetName pLayerTblRcd (nome_ling_proc); -> Close pLayerTblRcd (); acutPrintf (_T ("nLayer \ nome:% s"), nome_ling_proc); acutDelString (nome_ling_proc);

} excluir pLayerIterator; -> Close pLayerTbl ();

} Dicionrios Este tipo de recipiente projetado para armazenar AcDbObject genrico objetos derivados da classe. Este recipiente muito til porque tambm podemos armazenar nossos objetos personalizados no seu interior. A estrutura do dicionrio muito parecida com uma estrutura de rvore, onde temos os ns e entradas. Dentro do

mesmo n, as entradas no pode repetir o seu nome porque precisa ser exclusivo dentro do mesmo nvel. Estes so os chamados Key entradas para cada entrada e pea ir mapear para um ponteiro AcDbObject que pode ser obtido diretamente ou atravs de um interator (AcDbDictionaryIterator). Para armazenar um objeto, precisamos criar uma entrada usando oSetAt () mtodo de passar tambm o ponteiro de objeto que j temos instanciado com o novo operador. Aps adicionar esse objeto preciso fechar () nele. recipiente AcDbDictionary retornar aAcDbObjectId indicados para cada entrada. Este recipiente tambm utilizado por alguns recursos do AutoCAD, como grupos de estilos e de vrias linhas. Ns cobriremos mais sobre dicionrios sobre o captulo de objetos personalizados.

Classe 8 - Define Seleo


Nesta classe, vamos cobrir as primeiras formas que podem interagir com o usurio para permitir que a nossa aplicao para obter informaes de desenho na tela Voc provavelmente vai precisar usar esse mtodo dentro do seu aplicativo. Introduo Esta uma das mais importantes formas de interao com o usurio, pois permite-lhe obter informaes do desenho na tela atravs de entidades selecionadas. Algumas vezes voc ir solicitar ao usurio selecionar as entidades individualmente e s vezes voc ir selecion-los atravs de um filtro. Um conjunto de seleo um grupo de entidades que esto atualmente selecionados por um usurio ou um aplicativo. O conceito mais importante envolvido na seleo de entidades de tela que o AutoCAD voltar seus nomes atravs de uma chamada ads_name tipo. Este tipo contm o nome da entidade (que vlida apenas na sesso actual) e que pode ser convertido para ObjectId usando o acdbGetObjectId () funo global:
Acad: acdbGetObjectId ErrorStatus (AcDbObjectId & objId, objnameads_name const);

Esta funo recebe o ads_name e convert-lo para umAcDbObjectId. A maioria das funes de seleco definidos ainda usar o ads_name como parmetros e teses dos casos, voc no precisa convert-lo. O ads_name pode armazenar vrias entidades ou apenas um. Isso vai depender de

como voc ou o usurio tenha realizado a seleo. A seleo feita utilizando uma funo chamada acedSSGet (), que ser aplicada uma seleo ou levar o usurio a fazer isso. A assinatura da funo :
acedSSGet int (Acar const str *, const void * pt1, pt2 const void *, const struct entmask * resbuf, ads_name ss);

Como usar Ele recebe uma opo de seleo, dois pontos, uma mscara e retorna o conjunto de seleo resultante. Aps o uso conjunto de seleo que precisa ser liberado e isso feito atravs doacedSSFree funo () A opo de seleo ir instruir interface AutoCAD para fazer um dos seguintes mtodos:
Cdigo de Seleo Descrio ponto nico de seleo (se for especificado pt1) NULL ou a seleo do usurio (se pt1 tambm NULL) # Nongeometric (todos, por ltimo, anterior) :$ Solicita fornecido . Usurio escolher :? Outros retornos de chamada A Todos B Box C Passagem CP Crossing Polygon :D Duplicatas em OK :E Tudo na abertura F Cerca G Grupos I Implcita :K callbacks Palavra L ltima M Mltiplas P Anterior :S Fora de seleo de objeto nico W Janela WP Window Polygon X Extenso de pesquisa (pesquisa de banco de dados inteiro)

Desta forma podemos realizar a seleo de vrias formas. Alguns exemplos so apresentados a seguir:
ads_point pt1, pt2; ssname ads_name; pt1 [X] = pt1 [Y] = pt1 [Z] = 0,0; pt2 [X] = pt2 [Y] = 5,0; pt2 [Z] = 0,0; / / Pega o PICKFIRST atual ou perguntar ao usurio para uma seleo acedSSGet (NULL, NULL, NULL, NULL, ssname); / / Pega o PICKFIRST atual definido acedSSGet (_T ("I"), NULL, NULL, NULL, ssname);

/ / Repetir a seleo anterior, estabelecido acedSSGet (_T ("P"), NULL, NULL, NULL, ssname); / / Seleciona a ltima entidade criada acedSSGet (_T ("L"), NULL, NULL, NULL, ssname); / / Seleciona a entidade que passa pelo ponto (5,5) acedSSGet (NULL, pt2, NULL, NULL, ssname); / / Seleciona entidades dentro da janela do ponto (0,0) para (5,5) acedSSGet (_T ("W"), pt1, pt2, NULL, ssname);

Uso de filtros de seleo Os filtros so uma maneira poderosa de acelerar os jogos de seleco e evitar operaes de tempo de execuo para verificar se as entidades. Voc pode usar filtros simples ou composto por filtros.Cada filtro especificado atravs de uma estrutura chamada resbuf.A resbuf uma lista encadeada que armazena vrios tipos de informao e pode conter vrios itens. Para utilizar um filtro preciso constru-lo e pass-lo como um dos parmetros acedSSGet () mtodo. A seleo realizada, mas cada entidade selecionada dever respeitar o filtro. H uma srie de filtros que podemos criar e documentao do SDK de todas elas. Os exemplos mais utilizados so apresentados a seguir:
struct resbuf EB1, EB2; TCHAR sbuf1 [10], sbuf2 [10]; ads_name ssname1, ssname2; eb1.restype = 0; / name Entidade / filtro _tcscpy (sbuf1, _T ("crculo")); eb1.resval.rstring = sbuf1; eb1.rbnext = NULL; / / Recuperar todos os crculos acedSSGet (_T ("X"), NULL, NULL, & EB1, ssname1); eb2.restype = 8; / / O nome da camada filtrante _tcscpy (sbuf2, _T ("0")); eb2.resval.rstring = sbuf2; eb2.rbnext = NULL; / / Recuperar todas as entidades na camada de 0 acedSSGet (_T ("X"), NULL, NULL, & EB2, ssname2);

Modificando as entidades atravs de uma seleco definida Para modificar entidades dentro de um grupo de seleo necessrio para percorrer itens de seleo, obter cada um, converter o ads_name a um ObjectId, abrir a entidade para escrever, modific-lo e fech-lo. Esta

operao tambm pode ser feito usando uma operao que , nas operaes de longo, muito melhor. Para mostrar a voc como andar atravs de uma seleco definida Vou apresentar um cdigo curto para selecionar todas as entidades crculo dentro do desenho e, em seguida, mudar sua cor para vermelho. A operao bastante simples e feito da seguinte forma:
/ / Construir o filtro struct resbuf EB1; TCHAR sbuf1 [10]; eb1.restype = 0; / name Entidade / _tcscpy (sbuf1, _T ("crculo")); eb1.resval.rstring = sbuf1; eb1.rbnext = NULL; / / Selecione todos os crculos ads_name ss; if (acedSSGet (_T ("X"), NULL, NULL, & EB1, ss)! = RTNORM) {
acutRelRb (e EB1); retorno;

} / / Livre resbuf o acutRelRb (e EB1); / / Obter o comprimento (como muitas entidades foram selecionadas) comprimento longo = 0; if ((acedSSLength (ss, e comprimento)! = RTNORM) (length == 0)) {
acedSSFree (ss); retorno;

} ent ads_name; AcDbObjectId id = AcDbObjectId: Knull; / / Caminhada atravs do conjunto de seleo aberto e cada entidade for (i = 0 tempo; comprimento i <; i + +) {
if ((ss, i, ent)! acedSSName RTNORM =) continue; ) Se acdbGetObjectId (id, ent) (! =: Acad: eok continuar; AcDbEntity reprimida * = NULL; if (acdbOpenAcDbEntity (PENT, id, ACDB: kForWrite): = Acad eok:) continuar;

/ / Alterar a cor -> SetColorIndex reprimida (1); -> Close reprimida ();

} / / Seleo livre acedSSFree (ss);

Usei algumas novas funes (como acdbOpenAcDbEntity) que tambm fazem parte do ObjectARX SDK. Preste ateno aos libera memria quanto aos tipos de conjunto de seleo e resbuf. Note que eu usei tambm uma funo chamada acedSSLength () para obter o comprimento do conjunto de seleo. O acedSSName () funo comear um no ndice passou. Se tivermos mais de uma entidade selecionada este ciclo vai ficar cada entidade nica para este conjunto de seleo.

Classe 9 - Interagir com o AutoCAD


Na ltima aula eu apresentei como executar conjuntos de seleo. Essa classe eu vou mostrar como voc pode interagir com o AutoCAD usando funes globais e aquisio de informaes, como nmeros, coordenadas, variveis do sistema e muito mais. Invocando Comandos ObjectARX nos fornecer duas funes globais que nos permite executar comandos registrados. Esta funcionalidade muito til e ajudar os usurios para executar operaes rpidas que no exigem procedimentos complexos. Mesmo que esse mtodo muito simples voc deve evitar uslo em operaes complexas e enormes. Este mtodo tambm pode criar problemas ao lidar com a manipulao de eventos. As duas funes so fornecidas acedCmd () e acedCommand ().O primeiro invoca o comando atravs de uma lista aprovada em resbuf que ir informar todos os parmetros de comando. A segunda funo receber um nmero varivel de parmetros que reproduzem a forma como voc acionar o comando a partir da interface de comandos. Abaixo esto esses assinatura funes:
acedCmd int (const struct * ead
resbuf);

acedCommand int (rtype int ... sem nome);

Para compilar a lista quando se utiliza resbuf acedCmd () existe uma funo

utilitrio chamado acutBuildList (), que constri essa lista ligada facilmente. Voc s precisa passar os valores emparelhados com os cdigos que descrevem os tipos e no final da lista com um 0 ou RTNONE valor. Outra boa prtica limpar o prompt de comando, chamando acedCommand (RTNONE), depois de emitido o comando. No se esquea de liberar a memria utilizada, quando se utiliza ponteiros resbuf, atravs da acutRelRb () funo de utilidade para evitar vazamentos de memria. Existem vrias maneiras de usar as funes teses e vou mostrar algumas delas abaixo: acedCmd (): a) Mover a ltima entidade criada com base em (0,0,0):

ads_point pt; pt [0] = pt [1] = pt [2] = 0,0; struct resbuf * MV; Mv acutBuildList = (RTSTR, _T ("_MOVE"), RTSTR, _T ("_Last"),RTSTR, _T (""), RTPOINT, pt, RTSTR PAUSE, 0); acedCmd (Mv); acedCommand (RTNONE); acutRelRb (Mv);

b) Chamar um "redesenho" native command:


r * cmdlist resbuf ruct; = AcutBuildList cmdlist (RTSTR, _T ("_REDRAW"), 0); acedCmd (cmdlist); acedCommand (RTNONE); acutRelRb (cmdlist);

acedCommand (): a) Chamar um comando ZOOM e uma pausa para a entrada do usurio:

acedCommand (RTSTR, _T ("Zoom"), RTSTR, PAUSE, RTNONE);

b) Criao de um crculo e duas entidades uma linha:

acedCommand (RTSTR, _T ("crculo"), RTSTR, _T ("10,10"), RTSTR, PAUSE, RTSTR, _T ("linha"), RTSTR, _T ("10,10"), RTSTR, _T ("20,20"), RTSTR, _T (""), 0);

Variveis de Sistema Sua aplicao provavelmente ter que acessar as variveis de sistema do AutoCAD que podem ser ler ou escrever. ObjectARX fornecer duas funes para lidar com essas variveis usando a estrutura resbuf para acesso e / ou modificar os valores. A funo so chamados acedGetVar () e acedSetVar () e abaixo esto as suas assinaturas:
acedGetVar int (* sym Acar const struct resultado resbuf *);

acedSetVar int (* sym Acar const, const struct * resbuf val);

O primeiro parmetro o nome da varivel do ponteiro do segundo resbuf para configurar / obter informaes. O exemplo a seguir mostra como alterar o raio do filete que armazenada por uma varivel do sistema:
struct rb resbuf, RB1; acedGetVar (_T ("FILLETRAD"), e rb); rb1.restype = RTREAL; rb1.resval.rreal = 1,0; acedSetVar (_T ("FILLETRAD"), e RB1);

muito importante que voc especifique o tipo correto de resbuf item adquirido. Neste caso, o raio do filete um nmero real que tipo RTREAL. Funes de Entrada do Usurio Existem outras funes globais para permitir a interao com os usurios atravs da interface de comandos. Cada uma dessas funes pode ser usado sozinho ou com outros. A tabela a seguir mostra o que cada funo faz:
acedGetInt acedGetReal acedGetDist acedGetAngle Obtm Obtm Obtm Obtm um valor inteiro um valor real a distncia um ngulo (orientado a 0 graus especificados pelo ANGBASE) um ngulo (orientado a 0 graus direita) um ponto o canto de um retngulo uma palavra-chave uma seqncia de

acedGetOrient Obtm acedGetPoint Obtm acedGetCorner Obtm acedGetKword Obtm acedGetString Obtm

Cada uma dessas funes retorna um nmero int como um cdigo de resultado que poderia ser um dos seguintes procedimentos:

RTNORM RTCAN RTNONE

Usurio digitou um valor vlido Usurio entrou CES

RTERROR A chamada de funo no Usurio entrou apenas ENTER AutoCAD rejeitou o pedido como invlido RTREJ RTKWORD Usurio entrou em um texto ou arbitrria palavra-chave

AutoCAD permite evitar valores invlidos quando o usurio responder entrada de suas funes. Este recurso pode ser feita atravs do acedInitGet () funo que pode receber um ou uma combinao dos seguintes valores:
RSG_NONULL No RSG_NOZERO No RSG_NONEG No RSG_NOLIM No Use RSG_DASH RSG_2D permitir a entrada nula permitir valores nulos permitir valores negativos verificar os limites de desenho, mesmo se estiver em LIMCHECK linhas tracejadas ao desenho de banda de borracha linha ou caixa

Ignorar Z coordenadas de pontos 3D (acedGetDist () apenas) RSG_OTHER Permitir arbitrria de entrada o que o usurio entra

O exemplo a seguir mostra como obter um valor maior que zero:


int idade = -1; acedInitGet (RSG_NONULL RSG_NOZERO RSG_NONEG, NULL); acedGetInt (_T ("Quantos anos voc tem?"), idade e);