Table of Contents
A Brief Overview About TDK Graphics Service
Segue abaixo uma breve análise das classes existentes no Tdk responsáveis pela visualização / desenho de dados geográficos. Por último, é mostrado um exemplo de extensão e utilização.
TdkAbstractGraphicalService
- Método para desenho de uma vista;
Bascimente:
- Recebe a referência para um Canvas;
- Uma restrição por Box;
- Percorre os temas, desenhando…
virtual void drawView(TdkAbstractCanvasDraw* canvas, TeView* view, TdkGeometryList* geometryList, const TeBox& box = TeBox(), TeProgressBase* progress = 0, const double& angle = 0, const TeCoord2D& rotatePoint = TeCoord2D(), TeAbstractTheme* currentTheme = 0, TdkEventHandler* handler = 0, const bool& feedback = true);
- Métodos especializados para desenho de cada tipo de tema
TeTheme
,TeFileTheme
, …
- Método para desenho de diferentes tipos de geometrias (polígonos, linhas, pontos,
raster
)- Exemplo
virtual void drawPolygons(TeTheme* theme, TdkAbstractCanvasDraw* canvas, const TeBox& interestArea, const double& size_factor, TeProjection* proj, TdkGeometryList* geometryList, TeProgressBase* progress = 0, const double& angle = 0, const TeCoord2D& rotatePoint = TeCoord2D(), const bool& feedback = true);
Nota: O SELECT
é relizado neste nível.
// Request the polygons that intercepts the box (interest area) int numObjs = 0; TeDatabasePortal* portal = loadThemeGeometriesFromDatabase(theme, TePOLYGONS, interestArea, numObjs);
TdkAbstractCanvasDraw
TdkDisplay
É um handle que trata eventos relacionados a operações de desenho. Esta classe possui referência para um serviço gráfico e um canvas e ambos podem ser atualizados. O TdkDisplay manipula a visualização, gerenciando o cache pixmap para quando se executa um resize de tela, o evento de fechar o banco de dados, de maneira que os pixmaps necessitem um resize ou um desalocamento. Esta classe também tem uma ferramenta (TdkTool) associada.
TdkLayoutDisplay
É uma especialização do TdkLayoutDisplay para gerenciar a visualização dos dados quando em modo de layout de impressão. Seria interessante discutir o nível que teremos de especialização quando se trata da impressão, pois a impressão nada mais é uma visualização dos dados com um destino diferente da tela, mas que devido a particularidades apresentam codificações diferentes.
Cached Pixmaps
A Classe controladora dos pixmaps existentes durante a execução do sistema, por exemplo, para a tela principal temos um pixmap onde toda a vista é renderizada, mas para cada vista selecionada é adicionado um pixmap para renderizar, de modo que ao selecionar uma vista já renderizada esta é visualizada imediatamente chaveando o pixmap ativo na lista. Em outro caso, o modo de layout de impressão adiciona um pixmap próprio para visualização no modo de papel. Este pixmap somente é ativo durante o modo de layout, de maneira que N pixmaps podem ser adiconados também para fazer a visualização dos objetos de mapa dentro do layout. O conceito principal de um pixmap é manter todos os dados renderizados em memoria de modo que possa ser visualizado rapidamente durante um processo de atualizado. Nota Importante: Sempre o Tdk terá por default os seguintes “pixmaps” TdkAbstractCanvasDraw::cbrCache - Pixmap com os dados renderizados originais TdkAbstractCanvasDraw::cbrBack - Pixmap com os dados combinados com seleção, consultas TdkAbstractCanvasDraw::cbrFront - dispositivo de saída de tela TdkAbstractCanvasDraw::cbrPrinter - dispositivo de saída “Impressora/Ploter”
Exemplo de estensão e utilização do serviço gráfico
O Tdk fornece uma implementação default do serviço gráfico. Este serviço pode desenhar vistas e temas utilizando o estilo nativo da TerraLib 3 (TeVisual
). Porém, em algumas aplicações, é necessário que os mapas sejam representados utilizando-se estilos mais elaborados, complexos. Por exemplo, para produção de cartas topográficas. Dessa forma, foi criado um plugin chamando Estilos Complexos
.
Basicamente, este plugin provê uma implementação de um serviço gráfico capaz de recuperar e desenhar regras definidas na especificação Symbology Enconding da OGC http://www.opengeospatial.org/standards/symbol. A especialização foi feita a partir do serviço gráfico default do Tdk (TdkDefaultGraphicalService
) no nível dos métodos responsáveis pelo desenho dos diferentes tipos de geometria.
<color red> Na aplicação, utilizando o plugin, é possível modificar o serviço gráfico utilizado pelos Displays. Por exemplo, no caso do SIGDesktop, existem vários displays e cada um pode utilizar um serviço gráfico diferente e também diferentes implementações de canvas. </color>
// Gets the current display TdkDisplay* display = TdkAppControllerSingleton::instance().getDisplay(); // Creates a new graphical service TdkCSGraphicalService* csGS = new TdkCSGraphicalService(); display->setGraphicalService(csGS);
Exemplo: