iterateDictionary); MyClass::rxInit(); acrxBuildClassHierarchy(); } void unloadApp() { acedRegCmds->removeGroup("ASDK_DICTIONARY_COMMANDS"); deleteAcRxClass(AsdkMyClass::desc()); }
Suporte para Versões de Objetos
Vários mecanismos podem ser usados para administrar as versões das classes de objetos customizados:
Renomear as classes para cada nova versão;
Manter o número da versão como o primeiro membro da classe;
Manter o número da versão como dado extendido (xdata) ou uma extensão do dicionário.
X.
Derivando de AcDbEntity
Essa sessão demonstra como derivar uma classe customizada de AcDbEntity. A criação de uma classe de entidade customizada exige a utilização da biblioteca AcGi, operações com object osnap points, grip points e stretch points.
Mostrando a Entidade
Para acessar AcGi tem-se algumas funções dentro da classe básica AcDbEntity:
AcDbEntity::worldDraw(AcGiWorldDraw *pWd); virtual void
AcDbEntity::viewportDraw(AcGiViewportDraw *pVd); virtual void
AcDbEntity::saveAs(AcGiWorldDraw *pWd, AcDb::SaveType saveType);
O AutoCAD chama as funções worldDraw( ) e viewportDraw( ) para mostra a entidade. Em alguns casos o AutoCAD chama a função saveAs( ), como na representação gráfica do objeto proxy ou quando se salva o desenho para o AutoCAD 12. A função worldDraw( ) deve ser sempre implementada para qualquer classe derivada de AcDbEntity, já as funções viewportDraw( ) e saveAs
( ) são opcionais.
Sempre que o AutoCAD necessita regenerar um desenho para mostrar uma entidade, as funções
worldDraw( ) e viewportDraw( ) são chamadas da seguinte maneira: if (!entity->worldDraw(pWd))
for (each relevant viewport)
entity->viewportDraw(pVd);
O objetivo da função worldDraw( ) é construir a parte gráfica da entidade que pode ser especificada independentemente do contexto da visualização. Se qualquer das entidades gráficas tem sua visualização dependente, o worldDraw( ) deve retornar kFalse e o viewportDraw( ) deve ser implementado. A função viewportDraw( ) então constroe a parte de visualização dependente da entidade gráfica.
A função AcDbEntity::worldDraw( ) leva um ponteiro para um objeto AcGiWorldDraw, que é uma classe container para o AcGi e objetos como:
Objeto AcGiWorldGeometry, faz o tratamento analítico vetorial do AutoCAD trabalhando
com suas entidades primitivas:
Circle Circular arc Polyline Polygon Mesh Shell Text Xline Ray
Objeto AcGiSubEntityTraits, trabalha com um conjunto de atributos gráficos usando algumas
funções:
Color
Layer
Linetype
Polygon fill type Selection marker
A função AcDbEntity::viewportDraw( ) leva um ponteiro para um objeto AcGiviewportDraw e constroe visualizações para a representação gráfica de uma entidade. O objeto AcGiviewportDraw é também um objeto container para outros objetos como:
Objeto AcGiViewportGeometry, faz o tratamento analítico vetorial do AutoCAD para a
visualização trabalhando com suas entidades primitivas:
Circle Circular arc Polyline Polygon Mesh Shell Text Xline Ray polylineEye() polygonEye() polylineDc() polygonDc()
Objeto AcGiSubEntityTraits, trabalha com um conjunto de atributos gráficos usando algumas
funções:
Color
Layer
Linetype
Polygon fill type
Selection marker
Objeto AcGiViewport, fornece funções para trabalhar com visualização baseada em matrizes e
parâmetros.
Sobrecarregando AcDbEntity::saveAs( )
Se a entidade customizada não sobrecarrega AcDbEntity::saveAs( ), o AutoCAD deverá fazer com que a função worldDraw( ) suporte a representação gráfica ou arquivos DWG da versão release 12. A função AcDbEntity::saveAs( ) simplesmente chama a função worldDraw( ). É possível sobrecarregar
gráficas do tipo proxy, ou para arquivos DWG da versão 12, ou até mesmo para ambos os casos.
Objetos AcGi
Um objeto AcGi assim como o AcGiWorldDraw ou AcGiViewportDraw não deve ser armazenado como uma variável global ou estática, e também não deve se salvar cópias através das funções
worldDraw( ) e viewportDraw( ). Tipos de Regeneração
O tipo de regeneração viewport é dado pelo AutoCAD através da função
AcGiWorldDraw::regenType( ):
kAcGiStandardDisplay é o modo típico de desenho e é usado quando o usuário entra com o
comando REGEN ou edita uma entrada;
kAcGiHideOrShadeCommand indica que o comando HIDE ou SHADE foi emitido;
kAcGiRenderCommand é usado quando o usuário emite o comando RENDER.
Propriedades das Entidades
Entidades: Se você não atribui valores para cor, layer ou line type, sua entidade customizada
deverá receber valores prescritos pelo AutoCAD. Adicionalmente, sua aplicação pode chamar
AcDbEntity a função membro assim como AcDbEntity::setColorIndex() para atribuir valores
para as propriedades das entidades, mas não de dentro do worldDraw(), viewportDraw(), and
saveAs().
Subentidades: Pode-se atribuir valores para cor, layer ou line type chamando as funções
AcGiSubEntityTraits das funções worldDraw(), viewportDraw(), and saveAs().
Subprimitiva: As funções primitivas mesh e shell possuem parâmetros que levam você a
especificar um conjunto de propriedades. Esse mecanismo requer que você atribua valores para todos os lados ou faces.
Propriedades das Subentidades
As propriedades são: Color Layer Linetype Fill type GS marker
Antes de chamar o worldDraw() and viewportDraw(), o AutoCAD inicializa a cor, layer, e linetype das subentidades. O fill type corresponde ao tipo de regeneração, e o GS marker é inicializado em zero.
Fill Type
Existem dois tipos de fill type: kAcGiFillAlways
kAcGiFillNever
Antes do AutoCAD chamas o worldDraw(), ele atribui o fill type de acordo com o tipo de regeneração.
GS Markers
Os GS markers são utilizados nas conjunções com as funções ADS ads_ssget() and ads_ssnamex(), permitindo sua aplicação editar ou operar nas seções arbitrárias da sua entidade customizada.
Primitivas
MeshUma mesh é um eficiente caminho para armazenar uma grade retangular de vértices. A geometria para uma mesh é especificada como o número de linhas ou número de colunas e uma lista de vértices. virtual Adesk::Boolean
AcGiWorldGeometry::mesh(const Adesk::UInt32 rows, const Adesk::UInt32 columns,
const AcGePoint3d* pVertexList,
const AcGiEdgeData* pEdgeData = NULL, const AcGiFaceData* pFaceData = NULL,
const AcGiVertexData* pVertexData = NULL) const = 0; Os três últimos parâmetros da função são opcionais.
Shell
Um shell é uma lista de faces que podem ser conectadas e podem Ter também furos. O shell é especificado pro uma lista de vértices, um número de faces e uma lista das faces.
virtual Adesk::Boolean
AcGiWorldGeometry::shell(const Adesk::UInt32 nbVertex, const AcGePoint3d* pVertexList,
const Adesk::UInt32 faceListSize, const Adesk::Int32* pFaceList,
const AcGiEdgeData* pEdgeData = NULL, const AcGiFaceData* pFaceData = NULL, const AcGiVertexData* pVertexData = NULL
const struct resbuf* pResBuf = NULL) const = 0;