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:

  1. Recebe a referência para um Canvas;
  2. Uma restrição por Box;
  3. 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:


QR Code
QR Code wiki:designimplementation:maptools:tdk (generated for current page)