spring código aberto · e herdam o seu sistema de projeção cartográfica. os dados originais...

36
Desenvolvendo Ferramentas com o SPRING Versão Windows, Linux e MAC SPRING Código Aberto Setembro de 2017 INPE

Upload: nguyenduong

Post on 19-Nov-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Desenvolvendo Ferramentas com o SPRING

Versão Windows, Linux e MAC

SPRING Código Aberto

Setembro de 2017 INPE

As informações contidas neste documento estão sujeitas a alterações e correções sem

prévio aviso. Esse documento pode ser utilizado para reprodução direta ou geração de

produtos derivados, desde que seja ressalvado o direito de propriedade intelectual do

INPE, através de declaração explícita no texto.

Sugestões ou correções podem ser enviadas através do endereço eletrônico:

[email protected]

INSTITUTO NACIONAL DE PESQUISAS ESPACIAIS

[email protected] 2

Exemplos de Funcionalidades

SPRING Código Aberto ............................................................................................................................................ 3

Definições da Arquitetura ......................................................................................................................................... 4

Modelo Conceitual.................................................................................................................................................. 4

Banco de Dados ....................................................................................................................................................... 5

Estrutura ................................................................................................................................................................ 5

Arquivos ................................................................................................................................................................ 7

Diretório do código fonte ...................................................................................................................................... 8

Ambiente de Desenvolvimento .............................................................................................................................. 10

Pré-requisitos .......................................................................................................................................................... 10

Compiladores ......................................................................................................................................................... 10

Gerenciamento de Janelas .................................................................................................................................. 10

Banco de Dados ..................................................................................................................................................... 12

Formatos de Arquivos .......................................................................................................................................... 12

Geo estatística ........................................................................................................................................................ 12

Compilando os aplicativos SPRING ............................................................................................................... 13

Ajustando os parâmetros ................................................................................................................................ 13

Compilar ............................................................................................................................................................. 15

Classes e Variáveis .................................................................................................................................................... 17

Classes ...................................................................................................................................................................... 17

Variáveis .................................................................................................................................................................. 22

Exemplos de Funcionalidades ................................................................................................................................ 23

Transformada Rápida de Fourier ...................................................................................................................... 23

SPRING Código Aberto

Este documento apresenta as características de arquitetura global, as definições da

estrutura de diretório, as necessidades e os procedimentos indispensáveis para a montagem do

ambiente de desenvolvimento, a compilação do conjunto de aplicativos SPRING.

Além disso, este documento demonstra a documentação básica de algumas classes e

variáveis junto com um exemplo de funcionalidade no qual se utilizará de algumas dessas classes

e variáveis apresentadas.

[email protected] 3

Exemplos de Funcionalidades

Definições da Arquitetura

Neste capítulo abordamos as definições do sistema, no qual apresentamos o modelo

conceitual, a estrutura do banco de dados, as descrições dos tipos de arquivos, a estrutura de

diretórios do código fonte.

Modelo Conceitual

O SPRING contém um modelo conceitual próprio de informações geográficas e através desse

modelo que os usuários manipulam e trabalham seus dados com os algoritmos implementados no

pacote de aplicativos SPRING. As entidades que formam o modelo conceitual são:

• Banco de Dados

Representa um repositório de informações que contém o modelo de organização dos dados

armazenados em SGDB's – Sistemas Gerenciadores de Banco de Dados – e inclui as informações

geográficas em arquivos locais.

• Projeto

Representa um conjunto de informações geográficas dentro de um retângulo envolvente definido

e herdam o seu sistema de projeção cartográfica. Os dados originais provenientes de outros

sistemas de projeção, serão sempre remapeados para a projeção do projeto durante o processo de

importação ou entrada de dados.

Por isso a importância de se definir um sistema adequado com a escala dos dados, prevendo-se

também os produtos cartográficos que serão gerados.

Um projeto corresponde fisicamente a um subdiretório debaixo do diretório do banco de dados ao

qual pertence.

• Projeção Cartográfica

Representa a referência geográfica da componente espacial das informações geográficas. As

projeções permitem projetar a superfície terrestre em uma superfície plana. Diferentes projeções

são utilizadas para minimizar as diferentes deformações inerentes ao processo de projeção de um

elipsóide em um plano.

• Retângulo Envolvente

Define uma área limite no qual apenas as informações geográficas consideradas serão as áreas internas

ao retângulo envolvente. Dados geográficos com limites maiores que a área do projeto serão limitados

pelas coordenadas do projeto no momento da importação ou da entrada dos dados.

• Modelo de Dados

Agrupa dados de mesma natureza no banco de dados, definindo uma categoria de dados. Cada

[email protected] 4

Exemplos de Funcionalidades

categoria é sempre associada a um único modelo de dados e poderá conter inúmeros Planos de

Informações em diferentes projetos no mesmo Banco de Dados. Apenas após a criação das

Categorias será possível a criação de Planos de Informações. No caso do modelo de dados Não-

Espacial o nome da tabela deve ser fornecido obrigatoriamente.

• Plano de Informação

Representa uma estrutura de agregação de um conjunto de informações espaciais que são

localizadas sobre uma região geográfica e compartilham um conjunto de atributos, ou seja, plano

de informação agrega coisas semelhantes. Como exemplos de plano de informação podem ser

citados os mapas temáticos, mapas cadastrais de objetos geográficos ou dados matriciais como

cenas de imagens de satélites ou aéreas.

• Representações

Simboliza o modelo de representação da componente espacial dos dados geográficos e

basicamente pode ser do tipo vetorial ou matricial. A representação vetorial são representações

formadas por pontos, linhas e áreas, mas essas representações podem ser ainda mais específicas

como amostras, isolinhas, linhas, tin, etc. A representação matricial são grades regulares

unidimensionais que podem ser de diversos tipos como imagem (pode ser combinada formando

uma imagem multi espectral), imagem sintética, imagem classificada, grades numéricas

(altimetria, batimetria, temperatura e outros) e matriz temática.

• Visual

Representa um conjunto de características de apresentação de primitivas geográficas. Por

exemplo, cores de preenchimento dos polígonos, espessura das linhas, cores dos pontos,

símbolos de pontos, estilos de linhas, etc.

Banco de Dados

O banco de dados do SPRING possui uma característica dual, uma parte do banco de dados

fica armazenado em um banco de dados no qual é responsável por armazenar e manipular as

informações globais do sistema como projetos, categorias, planos de informação, visual de

apresentação, coleções, tabelas de objetos e não espacial e outras informações.

A outra parte fica em arquivos locais no qual nesses arquivos armazenam as informações

das representações dos planos de informação, como por exemplo pontos, linhas, imagens,

polígonos e as demais representações.

Estrutura

Abaixo apresentamos os nomes e uma pequena descrição das tabelas que formam o banco

de dados do aplicativo SPRING.

• category

[email protected] 5

Exemplos de Funcionalidades

◦ Esta tabela armazena todas as categorias e classes criadas para um banco

de dados qualquer.

• NextIds5

◦ Esta tabela é um "contador" interno ao SPRING que controla a geração de

identificadores de qualquer elemento introduzido ao banco de dados. São

identificadores do próximo item que será criado.

• projecti

◦ Esta tabela contém as projeções (Projeção cartográfica e demais parâmetros

fornecidos pelo usuário) definidos para projetos presentes no banco de

dados.

• projects

◦ Esta tabela possui as características dos projetos do banco de dados.

• repres

◦ Esta tabela armazena as representações associadas a um plano de

informação.

• visual

◦ Esta tabela armazena o visual de apresentação dos dados do SPRING (Plano

de Informação, Classe Temática, Objeto, Amostras).

• infolaye

◦ Esta tabela armazena as definições de um plano de informação.

• GA000XXX

◦ Tabela e arquivo index das âncoras, onde 000XXX é o id da representação

na tabela repres. Esta tabela só é criada no momento que um objeto for

associado a uma representação gráfica em algum plano de informação do

modelo cadastral ou redes.

• OJ000XXX

◦ Tabelas dos objetos geográficos existentes em todo banco de dados, onde

000XXX é o id da categoria do objeto. Esta tabela só é criada no momento

que passar a existir um objeto em um projeto.

• CG000XXX

◦ Tabelas criados automaticamente pelo sistema, onde 000XXX é o id da

categoria do objeto. Estas tabelas são utilizadas pelo usuário para definir os

atributos alfanuméricos dos objetos.

• vgclass

◦ Esta tabela armazena a visibilidade das classes dos planos de informação. [email protected] 6

Exemplos de Funcionalidades

• collections

◦ Esta tabela armazena as coleções geradas no sistema.

• pictures

◦ Tabelas com as imagens, documentos, vídeos, etc associadas ao banco de

dados.

• metadata

◦ Esta tabela armazena os metadados de algumas informações da estrutura

do banco de dados.

• linktable

◦ Esta tabela armazena as ligações entre as tabelas de objetos e a tabela não

espacial.

• filevers

◦ Esta tabela armazena as versões dos formatos de arquivos.

Arquivos

Abaixo apresentamos as descrição genérica de cada um destes arquivos de representações

• Linhas

◦ *.lin – Armazena o cabeçalho das linhas

◦ *.blk – Armazena os blocos com os pontos que formam as linhas

◦ *.rtl - Armazena a estrutura da árvore de indexação das linhas

• Pontos

◦ *.p2d - Armazena as informações de pontos de planos de informação das

categorias temático e cadastral

◦ *.p3d - Armazena as informações de pontos de planos de informação da

categoria numérica

◦ *.kdt - Armazena a estrutura da árvore de indexação dos pontos

• Nós

◦ *.no1 – Armazena o cabeçalho e as informações dos nós

◦ *.no2 - Armazena a lista das linhas conectadas ao nó

• Polígonos

◦ *.po1 - Armazena o cabeçalho e algumas informações dos polígonos

◦ *.po2 – Armazena as lista que formam o polígono e a lista dos polígonos filhos

[email protected] 7

Exemplos de Funcionalidades

◦ *.rtp - Armazena a estrutura da árvore de indexação dos polígonos

• Âncoras

◦ *.an1 – Armazena o cabeçalho e informações das âncoras

◦ *.an2 – Armazena a lista de identificadores dos pontos, linhas e polígonos

associados

◦ *.rta – Armazena a estrutura da árvore de indexação das âncoras

• Textos

◦ *.itx - Armazena o identificador do texto

◦ *.txt – Armazena as informações do texto

◦ *.kde – Armazena a estrutura da árvore de indexação dos textos

• Imagens

◦ *.lut – Armazena os índices com os valores em RGB de imagens sintéticas e

classificadas ou as faixas de valores para visualização da grade como uma

imagem

◦ *.thm – Armazena os temas (código, valores RGB e nome) de uma imagem

classificada

◦ *.reg – Armazena os segmentos da imagem rotulada

◦ *.spg – Armazena valores de ponto de grade expresso no modo binário

◦ *.dsc – Armazena a descrição dos dados representados no arquivo spg, as

informações contidas nesse arquivo são variáveis, dependem do tipo de

imagem e processamento aplicados à esta

• Restrição

◦ *.turn – Armazena as informações dos arcos que possuem a restrição de direção

Diretório do código fonte

O SPRING possui uma estrutura de diretório bem definida e abaixo apresentamos a

estrutura base e alguns arquivos ou diretórios importantes:

• projetos – Contém os arquivos referente a geração dos projetos, cada pasta é

responsável pela definição de um projeto

• src – Contém o código fonte necessário para a compilação do pacote SPRING

• distribuicao – Diretório no qual é gerado as bibliotecas e aplicativos do pacote

SPRING na plataforma 32 bits

[email protected] 8

Exemplos de Funcionalidades

◦ linuxtargz.lua – Script de geração de distribuições Linux

◦ helpport – Contém os arquivos do Ajuda Online em português

◦ helpeng – Contém os arquivos do Ajuda Online em inglês

◦ helpspa – Contém os arquivos do Ajuda Online em espanhol

◦ versao – Contém arquivos necessários na distribuição do SPRING

▪ script-nsis-windows.nsi – Script básico para geração de instaladores

▪ springdb50 – Exemplo de banco de dados SPRING

◦ bitmaps e etc – Contém arquivos necessários para execução do SPRING

• distribuicaox64 – Diretório no qual é gerado as bibliotecas e aplicativos do

pacote SPRING na plataforma 64 bits

• Arquivos para o MAC • macos-configs.sh – responsável por armazenar as variáveis de configurações para

o ambiente macOS • macos-generate-dependencies.sh – responsável por baixar as dependências

(compiladas como GCC, gFortran e MySQL e compilar a Terralib 5) • macos-generate-bundle.sh – Gera o bundle final, e os instaladores para os 4 idiomas do Spring • macos-rpath-fix.py – arquivo utilizado no processo de criação do bundle, faz a correção dinâmica de RPATH de libs, frameworks e executáveis • macos-uninstall-deps.sh – Responsável pela remoção das dependências instaladas na raiz do sistema como GCC, gFortran e MySQL • Info.plist – Responsável por definir configurações como ícone e nome da aplicação que irá aparecer no dock do macOS

[email protected] 9

Exemplos de Funcionalidades

Ambiente de Desenvolvimento

Pré-requisitos

Algumas bibliotecas são requisitadas para a compilação do conjunto de aplicativos SPRING.

Essas dependências são principalmente bibliotecas de gerenciamento das janelas (Qt), banco de

dados (MySQL, PostgreSQL, Oracle) e formatos de arquivos (TIFF, JPEG, JPEG2000, GPS, SHAPEFILE,

DXF).

O SPRING contém algumas dessas bibliotecas externas em seu código fonte, mas ainda há

bibliotecas que são necessárias realizar o download e instalar.

Compiladores

Os compiladores testados para compilar o conjunto de aplicativos SPRING são:

• Ambiente Windows:

◦ Visual Studio 2013

▪ A versão Express, a mais simples, pode ser obtido gratuitamente no sitio

http://www.microsoft.com/exPress/

• Ambiente Linux

◦ GCC / G++

▪ Normalmente esse compilador já vem instalado nas distribuições Linux

• Ambiente Mac

◦ Xcode

▪ É obtido através da App Store

▪ O compilador utilizado é Apple LLVM

Gerenciamento de Janelas

Para os ambientes Windows/Linux/MAC é necessário a instalação do Framework Qt

responsável principalmente pelo gerenciamento das janelas. O Qt é disponibilizado pela Nokia e

possui uma licença livre e pode ser obtido no sitio de internet http://qt.nokia.com/.

Uma necessidade da biblioteca Qt é a compilação da mesma de forma estática e com suporte

OpenGL. Abaixo uma demostração da compilação da biblioteca Qt. Esse passo é bem demorado.

• Descompacte o arquivo baixado (qt-win-opensource-src-<versão>.zip)

• Abra um Prompt de Comando(Windows) ou Terminal(Linux/MAC) que contenha

as informações do compilador (Ex: Visual Studio 2013 Command Prompt)

• Entre no diretório, em que o Qt foi extraído [email protected] 10

Exemplos de Funcionalidades

◦ cd c:\Qt\qt-win-opensource-src-5.8

• Windows

◦ Execute o comando configure e siga os passos para configurar a biblioteca

do Qt

▪ configure

◦ Após configurado, compile e instale a biblioteca com o seguinte comando

▪ Visual Studio 2013

•nmake install

• Linux

◦ A compilação do Qt no ambiente Linux é um pouco mais complicada, é

necessário instalar uma série de bibliotecas antes de configurar a geração

do Qt. As bibliotecas são:

▪ OpenGl (mesa-libglu-devel)

▪ LibXext (libXext-devel)

▪ LibXinerama (libXinerama-devel)

▪ LibXcursor (libXcursor-devel)

▪ LibXfixes (libXfixes-devel)

▪ LibXrandr (libXrandr-devel)

▪ LibXrender (libXrender-devel)

▪ LibXi (libXi-devel)

▪ FontConfig (fontconfig-devel)

▪ LibJpeg (libjpeg-devel)

além das bibliotecas as suas dependências também precisam ser instaladas. Os nomes das

bibliotecas podem variar de acordo com a distribuição Linux.

Utilize o aplicativo “Instalar e Remover Programas” da distribuição Linux para instalar as

bibliotecas requisitadas pelo Qt.

◦ Execute o comando configure e siga os passos para configurar a biblioteca

do Qt

▪ configure

• Durante a configuração do Qt é apresentado uma lista de bibliotecas

que o Qt utilizará. Verifique se as bibliotecas citadas acima estão

com valores diferente de “no”.

◦ Após configurado, compile e instale a biblioteca com o seguinte comando

[email protected] 11

Exemplos de Funcionalidades

▪ GCC / G++

•sudo make install

• Pronto Qt, compilado e instalado

Banco de Dados

Para o ambiente Windows não é necessário instalar as bibliotecas dos bancos de dados, as

mesmas já se encontram no código fonte do SPRING, mas no ambiente Linux é necessário instalar

o pacote de desenvolvimento do MySQL e PostgreSQL.

As bibliotecas de banco de dados necessárias no ambiente Linux são mysql-devel e

postgresql-devel. Cada ambiente Linux possui uma maneira para instalar essas bibliotecas, utilize

a que melhor se adéqüe a sua distribuição Linux. Abaixo uma demostração de instalação no

ambiente Ubuntu e OpenSuse.

• Instalando as bibliotecas no Ubuntu 16.04

◦ apt-get install libmysqlclient16-dev

◦ apt-get install libpq-dev

• Instalando as bibliotecas no OpenSuse 11

◦ yast2 --install libmysqlclient-devel

◦ yast2 --install postgresql-devel

Formatos de Arquivos

No ambiente Linux é necessário ainda instalar a biblioteca de acesso USB, utilizada na

importação de dados via GPS. A biblioteca é “libusb-dev” e abaixo uma demostração da instalação

da mesma no ambiente Ubuntu e OpenSuse.

• Instalando as bibliotecas no Ubuntu 16.04

◦ apt-get install libusb-dev

• Instalando as bibliotecas no OpenSuse 11

◦ yast2 --install libusb-compat-devel

Geo estatística

Caso precise utilizar o módulo de geoestatística no ambiente Linux é necessário instalar o

compilador FORTRAN compatível com pacote de geoestatística. Para instalar o IFORT (compilador

[email protected] 12

Exemplos de Funcionalidades

desenvolvido pela INTEL), faça o download do mesmo no sitio de internet

http://software.intel.com/en-us/articles/non-commercial-software-download/ e escolha a opção

“Intel® Fortran Compiler Professional Edition for Linux” e siga os passos para fazer o download e

obter uma licença gratuita para o ifort.

Após realizar o download, faça os seguintes passos:

• descompacte o arquivo baixado

◦ tar -zxf l_cprof_p_11.0.081_ia32.tar.gz

• instale o compilador fortran

◦ cd l_cprof_p_11.0.081_ia32

◦ ./install.sh

◦ responda as questões da instalação e siga os passos requisitados

• adicione o ifort ao diretório /usr/bin, necessário logar como root

◦ su – digite a senha de root

◦ ln -sf /opt/intel/Compiler/11.0/081/bin/ia32/ifort /usr/bin/ifort

Compilando os aplicativos SPRING

Ajustando os parâmetros

Antes de tudo, é necessário ajustar alguns parâmetros para a compilação do pacote

SPRING. Esses parâmetros definem o ambiente de compilação (Windows ou Linux), a plataforma de

compilação (32 ou 64 bits), os caminhos das bibliotecas externas e outras definições.

Escolha o ambiente e a plataforma de compilação

• Edite o arquivo projetos/springplataform.pri

◦ Selecione a plataforma através da variável SPRINGPLATAFORM, os valores

possíveis são 32 ou 64

▪ Exemplo: SPRINGPLATAFORM = 32

◦ Selecione o ambiente através da variável SPRINGOPERATIONALS, os valores

possíveis são SPRING_WINDOWS, SPRING_LINUX ou SPRING_MACOS.

▪ Exemplo: SPRINGOPERATIONALS = SPRING_WINDOWS

No caso em que o ambiente de compilação é Linux, é necessário definir o caminho das

bibliotecas MySQL e PostgreSQL. Para isso faça os seguintes passos

• Edite o arquivo projetos/defaultdefines.pri

◦ A variável SPRING_MYSQL_INCLUDE indica o caminho dos arquivos que

constituem a biblioteca MySQL. Modifique essa variável de acordo com a [email protected] 13

Exemplos de Funcionalidades

instalação realizada

▪ Exemplo: SPRING_MYSQL_INCLUDE = /usr/include/mysql

◦ A variável SPRING_POSTGRESQL_INCLUDE indica o caminho dos arquivos que

constituem a biblioteca PostgreSQL. Modifique essa variável de acordo com

a instalação realizada

▪ Exemplo: SPRING_POSTGRESQL_INCLUDE = /usr/include/pgsql

[email protected] 14

Exemplos de Funcionalidades

Compilar

Após os ajustes realizados, vamos compilar o pacote SPRING de aplicativos. Cada

compilador possui uma característica própria, logo iremos apresentar a compilação em cada

compilador testado para os aplicativos SPRING.

GERAÇÃO DOS PROJETOS

Um passo anterior a compilação é a geração dos projetos, nessa etapa que criamos os

arquivos que de fato gerenciam a compilação das bibliotecas e aplicativos. Cada compilador se

utiliza de um tipo de arquivos para compilar os projetos, o Visual Studio utiliza os arquivos “.sln” e

“.vcproj”, enquanto o GCC/G++ utiliza o arquivo Makefile.

Para gerar os arquivos de projetos, utilizamos a ferramenta qmake, do framework Qt, no

qual essa ferramenta cria automaticamente esses diversos tipos de projetos dado a configuração

definida. Abaixo seguem os passos para gerar os arquivos de projetos do SPRING.

• Abra um Prompt de Comando(Windows) ou Terminal(Linux ou MAC)

• Defina na variável QTDIR o diretório de instalação do framework Qt

◦ Windows

▪ set QTDIR=C:\Qt\Qt5.8.0

◦ Linux

▪ export QTDIR=/usr/local/TrollTech/Qt-<versão>

◦ MAC

▪ No MAC não é necessário, pois essas configurações serão realizadas no

script seguinte.

• Defina o tipo de arquivo de projetos

◦ Windows Visual Studio

[email protected] 15

Exemplos de Funcionalidades

▪ set QMAKESPEC=win32-msvc2013

◦ Linux

▪ export QMAKESPEC=linux-g++

◦ MAC

Execute o script com: source ./macos-configs.sh

Esses passos estão exemplificados nos arquivos <vscmd-32-qt.bat>(Windows)

• Gerando os arquivos de projetos

◦ Windows e compilador Visual Studio

▪ Execute o script gerarvcproj.bat

◦ Linux

▪ Execute o script ./gerarmakefile.sh

◦ MAC

Execute o script $QT_BINARIES/qmake -makefile -recursive projetos.pro

Após esses passos o SPRING está pronto para ser compilado, para isso faça

• Windows Visual Studio

◦ Abra o arquivo projetos/projetos.sln

◦ Escolha entre a configuração Debug ou Release

◦ Dê um build nos projetos

◦ Execute o SPRING ou SPR2TLIB

• Linux GCC/G++

◦ Execute o comando make

• MAC GCC/G++ no Apple LLVM

◦ Execute o comando make

Os possíveis erros de compilação estarão relacionados aos caminhos das bibliotecas de banco de

dados MySQL ou PostgreSQL.

◦ Execute o SPRING ou SPR2TLIB Para executar os

aplicativos SPRING, execute o seguinte comando

▪ Linux 32 Bits

• export

LD_LIBRARY_PATH=”<diretorio_absoluto_spring>/distribuicao;<diretori

o_absoluto_spring>/src/terralib/terralibx/Oracle”

▪ Linux 64 Bits

• export

LD_LIBRARY_PATH=”<diretorio_absoluto_spring>/distribuicao;<diretori

o_absoluto_spring>/src/lib/oracleocci/libocci64”

[email protected] 16

Exemplos de Funcionalidades

Classes e Variáveis

Neste capítulo apresentaremos algumas classes e variáveis necessárias para a criação de

novas funcionalidades. Através dessas classes e variáveis será possível a manipulação de planos

de informação, categorias, dados e qualquer outra informação do SPRING.

Além desta descrição, a documentação das classes do SPRING estão divulgadas no sitio de

internet (www.spring-gis.org/doc), no qual contém toda a documentação de classes do SPRING.

Classes

• Database

Esta classe base define os protótipos para o acesso e manipulação do banco de dados

SPRING. A partir dessa classe que são criados os drivers dos banco de dados (SQLite,

MySQL, PostgreSQL, Oracle, Access).

Alguns métodos desta classe são:

Activate – Ativa o banco de dados

Create – Cria um banco de dados

CreateCategory – Cria uma categoria

DataHome – Retorna o diretório do banco de dados

Deactivate – Desativa o banco de dados

GetProject – Retorna a lista de projetos

GetSpringCategory – Retorna a lista de categoria, menos a de objetos e não espacial

GetSpringObjCategory – Retorna a lista de categoria de objetos e não espacial

LoadCategory – Carrega a lista de categorias

LoadInfoLayer – Carrega um plano de informação dado alguns parâmetros

LoadProject - Carrega um projeto dado alguns parâmetros

NewProject – Cria um novo projeto

NewInfoLayer – Cria um novo plano de informação

Select – Retorna a lista de banco de dados de um diretório

• Project

Esta classe define a área geográfica do estudo, a projeção e o diretório no qual os dados

são armazenados.

Alguns métodos desta classe são:

[email protected] 17

Exemplos de Funcionalidades

BoundingBox – Retorna o retângulo envolvente do projeto

GetInfoLayerList – Retorna a lista de planos de informação associadas ao projeto

Init – Inicializa o projeto

Insert – Insere um plano de informação ao projeto

LLBox - Retorna o retângulo envolvente do projeto em coordenadas geográficas

Projection – Retorna à projeção do projeto

Show – Desenha os planos de informações visíveis do projeto na área de desenho

passada como parâmetro

• Projections

Esta classe específica o modelo da terra (Datum) e os parâmetros das projeções que

representam uma superfície comum em termos de projeção de mapas convencionais.

As projeções implementadas no SPRING em ordem alfabética são: Albers, Bipolar,

CylinEquid, Gauss, General Lambert, Lambert, Lambert Million, LatLong, Mercator,

Miller, PolarStereo, Polyconic, Satellite, Sanosoidal e Utm.

Alguns métodos desta classe são:

Init – Inicializa uma projeção

LL2PC – Transforma coordenadas geodéticas (radiano) em coordenadas da

projeção(metros)

PC2LL – Transforma coordenadas da projeção (metros) em coordenadas

geodéticas(radiano)

• Category

Esta classe implementa as características de cada classe geográfica definida no modelo de

dados conceitual do sistema. Os categorias podem ser dos seguintes modelos

Imagem, Temático, Numérico, Cadastral, Rede, Objetos e Não Espacial.

Alguns métodos desta classe são:

GeoClasses – Retorna a lista de classes temáticas, caso o modelo seja Temático

GetVisual – Retorna o visual da categoria

Model – Retorna o identificador do modelo da categoria

Name – Retorna o nome da categoria

SetVisual – Define o visual da categoria

Table – Retorna o nome da tabela, no caso de modelos de Objetos e Não

Espacial Visible – Retorna a visibilidade da categoria

[email protected] 18

Exemplos de Funcionalidades

• Infolayer

Esta classe é a generalização dos planos de informações no qual seus membros

armazenam as informações sobre uma determinada área de um tempo específico.

Alguns métodos desta classe são:

BoundingBox – Retorna o retângulo envolvente do plano de informação

CatCode – Retorna o identificador da categoria que o plano de informação esta

contido

Get – Retorna as representações do plano de informação

GetDB – Retorna o banco de dados que o plano de informação está contido

InsertRepres – Adiciona uma representação ao plano de informação

Label – Retorna o nome do plano de informação

Model - Retorna o modelo do plano de informação

Priority - Retorna a prioridade de desenho do plano de informação

Projection - Retorna a projeção do plano de informação

RemoveRepres – Remove uma representação do plano de informação

ResolutionX - Retorna a resolução X do plano de informação

ResolutionY - Retorna a resolução Y do plano de informação

Show – Desenha o plano de informação na área de desenho fornecida como

parâmetro Visible – Retorna ou define a visibilidade do plano de informação

• Vector

Esta classe implementa as operações sobre as representações vetoriais, no qual pode ser

manipulados em memória ou armazenado e recuperado do disco.

Alguns métodos desta classe são:

Adjust – Ajusta a representação vetorial criando a lista de nós

Anchors – Retorna as âncoras associadas a representação do vetor

FindAnchors – Retorna as lista de âncoras associadas ao vetor dado um ponto e

uma tolerância como parâmetros

FindLine – Retorna a linha mais próxima a um ponto e uma certa tolerância

FindNode – Retorna o nó mais próximo a um ponto e uma certa tolerância

FindPoint2d – Retorna o ponto 2D mais próximo a um ponto e uma certa tolerância

[email protected] 19

Exemplos de Funcionalidades

FindPoint3d – Retorna o ponto 3D mais próximo a um ponto e uma certa tolerância

FindPolygon – Retorna o polígono próximo a um ponto e uma certa tolerância

GenerateTopology – Gera a topologia referente ao ajuste realizado sobre a

representação vetorial

GetInfolayer – Retorna o plano de informação da representação

Insert – Adiciona uma representação ao vetor

Lines – Retorna as representações de linhas

Load – Carrega as informações vetoriais

Nodes – Retorna os nós gerados pelo ajuste

Points2d – Retorna as representações de pontos 2D

Points3d – Retorna as representações de pontos 3D

Polygons – Retorna as representações de polígonos

Save – Salva as informações vetoriais em disco

• Image

Esta classe implementa o controle da representação matricial, incluindo armazenamento,

acesso e manipulação para os diversos tipos de imagem.

Clear – Finaliza o controle na imagem

computeHistogram – Calcula o histograma da imagem

Coord2Index – Retorna os índices linha e coluna da imagem de um ponto passado

como parâmetro

dummyValue – Retorna o valor dummy da imagem

histogram – Retorna o histograma da imagem

Index2Coord – Retorna as coordenadas X e Y fornecendo os índices de linha e coluna

Init – Inicializa a imagem, apenas após esse métodos os atribuitos da imagem estão

acessíveis

level – Retorna o valor da imagem dado os índíces e o canal

LikeMe – Retorna a igualdade entre duas imagens Max –

Retorna o valor máximo da imagem

Min – Retorna o valor mínimo da imagem

NumCol – Retorna o número de colunas da imagem

NumLin – Retorna o número de linhas da imagem

[email protected] 20

Exemplos de Funcionalidades

ResolutionX – Retorna a resolução X da imagem

ResolutionY – Retorna a resolução Y da imagem

SetLimits – Atualiza os valores de máximo e mínimo da imagem

Visible – Retorna a visibilidade da imagem

• SNewFrame

Esta classe define a parte visual das janelas do SPRING e implementa os controles dos

componentes de interface.

AddActionMenu – Adiciona uma ação ao menu definido no parâmetro

addActionImagemMenu – Adiciona uma ação ao menu Imagem

addActionCadastralMenu – Adiciona uma ação ao menu Cadastral

addActionTematicoMenu – Adiciona uma ação ao menu Temático

addActionMNTMenu – Adiciona uma ação ao menu MNT

addActionRedeMenu – Adiciona uma ação ao menu Rede

Footer – Apresenta uma mensagem na barra de status

idTabWidget – Retorna o identificador da janela

• SpringFloatTabWidget

Esta classe possui duas funções, apresentar as janelas do SPRING em abas e realizar o

gerenciamento de apresentação das janelas.

getMainWindow – Retorna o ponteiro da janela do identificador passado como

parâmetro

getSpringWindow – Retorna o ponteiro das informações da janela do identificador

passado como parâmetro

getTabActive – Retorna o identificador da janela ativa

getTotalCount – Retorna a quantidade de janelas criadas

• SpringWindow

Esta classe armazena as informações de cada janela do SPRING.

pcont – Ponteiro do painel de controle

SGscale – Escala de desenho da janela

SGscalemode – Tipo de escala do último desenho (Auto, Pleno, Escala)

[email protected] 21

Exemplos de Funcionalidades

SGbox – Retângulo envolvente de desenho

SGgvis – Lista de planos de informação visíveis da janela

Variáveis

• SGcatL – CategoryList - Lista das categorias do banco de dados ativo

• SGdb – Database - Banco de dados ativo

• SGdbL – DatabaseList – Lista dos banco de dados do diretório selecionado

• SGobjcatL – CategoryList – Lista de categorias dos modelos de Objetos e Não Espacial

do banco de dados ativo

• SGProj – Project – Projeto ativo

• SGProjL – ProjectList – Lista dos projetos do banco de dado ativo

• SGinfo – InfoLayer - Plano de informação ativo

• SGinfoL – InfoLayerList – Lista dos planos de informação do projeto ativo

• newspringTabWidget – SpringFloatTabWidget – Ponteiro para a estrutura de interfaces

do SPRING

[email protected] 22

Exemplos de Funcionalidades

Exemplos de Funcionalidades

Transformada Rápida de Fourier

O início de qualquer inclusão de funcionalidades está associada a inclusão dos arquivos de

desenvolvimento nos arquivos de projetos. Nesta funcionalidade em específico, 6 arquivos serão

adicionados:

• fft.h

• fft.cpp

• fftw3.h

• fftdlg.h

• fftdlg.cpp

• uifftdlg.ui

Os arquivos fft.h, fftw3.h e fft.cpp farão parte do projeto libspring e para incluí-los no

projeto, é necessário modificar o arquivo projetos/libspring/libspring.inc com as seguintes

alterações:

#inclusao da funcionalidade da transformada de Fourier

HEADERS += ../../src/lib/include/fft.h \

../../src/lib/include/fftw3.h

SOURCES += ../../src/lib/fft.cpp

Enquanto os demais arquivos serão incluídos no projeto spring, pois os mesmos estão

relacionados a interface da funcionalidade. As modificações abaixo devem ser feitas no arquivo

projetos/spring/imagem.inc, pois essa funcionalidade será executada em imagens.

#fftdlg

HEADERS += ../../src/springqt/include/fftdlg.h

INTERFACES += ../../src/springqt/ui/uifftdlg.ui

SOURCES += ../../src/springqt/fftdlg.cpp

Observação, a macro “HEADERS +=” adiciona arquivos de definição ao projeto, a macro

“SOURCES +=” adiciona arquivos de implementação ao projeto e a macro “INTERFACES +=” inclui

arquivos de interface ao projeto.

Além dos arquivos é necessário adicionar a biblioteca que contém a implementação da

transformada de Fourier, FFTW (http://www.fftw.org/), para adicioná-la ao SPRING, faça os

seguintes passos:

[email protected] 23

Exemplos de Funcionalidades

• Windows

◦ Altere o arquivo projetos/libspring/libspring.pro adicionando as seguintes

linhas ao final do arquivo:

contains(SPRINGOPERATIONALS,SPRING_WINDOWS){

LIBS += $${DESTDIR}/libfftw.lib }

• Linux

◦ Instale a biblioteca fftw através do seguinte comando (obrigatório ser

usuário root):

▪ Ubuntu

• apt-get install fftw3

▪ OpenSuse

• yast2 –-install fftw3

◦ Altere o arquivo projetos/spring/spring.pro adicionando as seguintes linhas

ao final do arquivo:

contains(SPRINGOPERATIONALS,SPRING_LINUX){

LIBS += -lfftw3

}

Após a inclusão dos arquivos nos arquivos de projetos e da biblioteca FFTW é estritamente

necessário regerar os projetos.

• Abra um Prompt de Comando(Windows) ou Terminal(Linux)

• Defina na variável QTDIR o diretório de instalação do framework Qt

◦ Windows

▪ set QTDIR=C:\Qt\4.6.2

◦ Linux

▪ set QTDIR=/usr/local/TrollTech/Qt-4.6.2

• Defina o tipo de arquivo de projetos

◦ Windows Visual Studio

▪ set QMAKESPEC=win32-msvc2008

◦ Linux

▪ set QMAKESPEC=linux-g++

Esses passos estão exemplificados nos arquivos <vscmd-32-qt.bat>(Windows)

[email protected] 24

Exemplos de Funcionalidades

• Gerando os arquivos de projetos

◦ Windows (Visual Studio)

▪ Execute o script gerarvcproj.bat

◦ Linux

▪ Execute o script ./gerarmakefile.sh

◦ Escolha o ambiente de compilação

Após esses passos o SPRING está pronto para ser compilado novamente, para isso faça

• Windows Visual Studio

◦ Abra o arquivo projetos/projetos.sln

• Linux GCC/G++

◦ Execute o comando make -f MakefileSpring

A partir desse ponto o SPRING está preparado para executar a funcionalidade da

Transformada Rápida de Fourier.

Analisaremos a implementação da funcionalidade da transformada rápida de Fourier

apresentando os métodos e as particularidades no desenvolvimento de operações para o SPRING.

Nos métodos presentes no arquivo fftdlg.cpp encontramos diversos usos de classes do SPRING,

que manipulam banco de dados, projetos, planos de informação e a representação imagem.

O código abaixo é responsável por executar a transformada rápida de Fourier, esse método

é executado quando o botão executar é pressionado.

void QTfft::slotTransformFFT()

{

//Representação Imagem

Image* srcImage;

//Retorna verdadeiro se o plano possui uma representação imagem e caso possua atribue a variável srcImage

if (SGinfo->Get(srcImage))

{

//Obtém os valores presentes nos campos de texto da interface relacionados ao nome dos planos

de informação de saída

QString realName = ui.reallayerLed->text();

QString imagName = ui.imaglayerLed->text();

int rows = FastFourierTransformation::max_pow2(srcImage->NumLin());

int cols = FastFourierTransformation::max_pow2(srcImage->NumCol());

//Cria um plano de informação com uma representação imagem no banco de dados SGdb, no projeto

SGProj, na categoria Sginfo->GetCategory() e nome realName [email protected] 25

Exemplos de Funcionalidades

//A representação imagem possuirá rows linhas e cols colunas, será de 32 bits e tipo REAL4

InfoLayer* dstReal = createInfoLayer(SGdb,SGProj,SGinfo->GetCategory(),realName,rows,cols,32,"REAL4");

if (!dstReal)

{

//Retorna caso o plano de informação não tenha sido criado

SMessageBox::Show(MBINFORMATION,NULL,QObject::tr("Fast Fourier"),QObject::tr("Plano de Informação

%1 não foi criado!").arg(realName));

return;

}

realName += "-Freq";

InfoLayer* dstRealFeq = createInfoLayer(SGdb,SGProj,SGinfo->GetCategory(),realName,rows,cols,32,"REAL4");

if (!dstRealFeq)

{

SMessageBox::Show(MBINFORMATION,NULL,QObject::tr("Fast Fourier"),QObject::tr("Plano de Informação %1

não foi criado!").arg(realName));

return;

}

InfoLayer* dstImag = createInfoLayer(SGdb,SGProj,SGinfo->GetCategory(),imagName,rows,cols,32,"REAL4");

if (!dstImag)

{

SMessageBox::Show(MBINFORMATION,NULL,QObject::tr("Fast Fourier"),QObject::tr("Plano de Informação %1

não foi criado!").arg(realName));

return;

}

imagName += "-Freq";

InfoLayer* dstImagFeq = createInfoLayer( Sgdb, SGProj ,Sginfo->GetCategory(), imagName, rows, cols, 32, "REAL4");

if (!dstImagFeq)

{

SMessageBox::Show(MBINFORMATION,NULL,QObject::tr("Fast Fourier"),QObject::tr("Plano de Informação

%1 não foi criado!").arg(realName));

return;

}

//Representação Imagem

[email protected] 26

Exemplos de Funcionalidades

Image* dstReali;

Image* dstImagi;

Image* dstRealf;

Image* dstImagf;

//Obtém as representações imagem de todos os planos de informação criados anteriormente

if (dstReal->Get(dstReali) && dstImag->Get(dstImagi) && dstRealFeq->Get(dstRealf) && dstImagFeq-

>Get(dstImagf))

{

//Executa a transformada rápida de Fourier, o dado de entrada é a representação imagem srcImage do

plano ativo

//E as informações de saída são as representações imagem dstReali,dstImagi,dstRealf,dstImagf

FastFourierTransformation fftransf;

fftransf.transform(srcImage,dstReali,dstImagi,dstRealf,dstImagf);

}

}

}

O código abaixo é responsável por criar um plano de informação com uma representação

imagem.

InfoLayer* QTfft::createInfoLayer( DataBase* bancoDados, Project* projeto, Category* ilCategory, QString layerName, int

nlin, int ncol, int numbits,string imgtype )

{

//Verifica se o banco de dados foi definido

if (!bancoDados)

{

SMessageBox::Show(MBINFORMATION,NULL,QObject::tr("Fast Fourier"),QObject::tr("Defina o banco de dados de saída!"));

return NULL;

}

//Verifica se o projeto foi definido

if (!projeto)

{

SMessageBox::Show(MBINFORMATION,NULL,QObject::tr("Fast Fourier"),QObject::tr("Defina o projeto de

saída!"));

return NULL;

}

[email protected] 27

Exemplos de Funcionalidades

//Verifica se a categoria foi definida

if (!ilCategory)

{

SMessageBox::Show(MBINFORMATION,NULL,QObject::tr("Fast Fourier"),QObject::tr("Defina a categoria de saída!"));

return NULL;

}

//Verifica se o nome foi definido

if (layerName.isNull() || layerName.isEmpty())

{

SMessageBox::Show(MBINFORMATION,NULL,QObject::tr("Fast Fourier"),QObject::tr("Defina o nome do plano de

informação!"));

return NULL;

}

//Verifica se já existe um plano de informação com este nome

InfoLayer* il = bancoDados->InfoLayerExists (layerName.toLatin1().data(), ilCategory);

if (il)

{

//Caso exista, é feita uma pergunta se deseja remover o existente e criar um novo

if (SMessageBox::Show (MBQUESTION, NULL, QObject::tr("Fast Fourier"), QObject::tr("Plano de Informação %1 já

existe. Deseja remover?").arg(layerName) ) == QMessageBox::No)

{

//Retorna que não quer sobreescrever

return NULL;

}

else

{

//Apaga o plano de informação

if (!bancoDados->DeleteInfoLayer(projeto, il))

{

SMessageBox::Show (MBINFORMATION,NULL, QObject::tr("Fast Fourier"), QObject::tr("Não

foi possível remover o Plano de Informação!") );

return NULL;

}

}

}

[email protected] 28

Exemplos de Funcionalidades

int cmodel = ilCategory->Model();

double scale = 25000.;

Box imgBox = SGinfo->BoundingBox();

Box prjBox = SGinfo->LLBox();

double rx = imgBox.Width() / (double)ncol;

double ry = imgBox.Height() / (double)nlin;

Stime tim;

//Cria um novo plano de informação

bancoDados->NewInfoLayer (il, projeto, ilCategory, layerName.toLatin1().data(), imgBox, prjBox, cmodel, scale, rx,

ry, tim, imgtype);

Image* digital;

//Cria uma nova representação imagem para o novo plano de informação

if(!bancoDados->NewImage(digital, il, IMAGE, numbits, imgtype)) {

SMessageBox::Show (MBINFORMATION,NULL, QObject::tr("Fast Fourier"), QObject::tr("Erro ao criar a

imagem!"));

return NULL;

}

//Atualiza a representação no banco de dados

bancoDados->UpdateRepresentation( digital );

//Abre e fecha a representação imagem confirmando sua criação

digital->Init();

digital->Clear();

//Retorna o novo plano de informação

return il;

}

Examinaremos abaixo o código presente no método transform do arquivo fft.cpp Este

método é a transformação direta que recebe uma imagem monocromática e gera quatro imagens:

a parte real e imaginária da transformação e a parte real e imaginária da transformação

normalizada por uma função logarítmica.

bool FastFourierTransformation::transform(Image* src, Image* dstReal, Image* dstImag, Image* dstRealFeq, Image*

dstImagFeq)

[email protected] 29

Exemplos de Funcionalidades

{

if (!src && !dstReal && !dstImag)

return false;

//inicializa a representação imagem

src->Init();

dstReal->Init();

dstImag->Init();

dstRealFeq->Init();

dstImagFeq->Init();

or = src->NumLin();

oc = src->NumCol();

rows = max_pow2(or);

cols = max_pow2(oc);

totsize = rows * cols;

double *data[2];

string itemWidth = "FourierWidth";

string valueWidth = QString("%1").arg(oc).toStdString();

string itemHeight = "FourierHeight";

string valueHeight = QString("%1").arg(or).toStdString();

DescriptorItem itemW(itemWidth,valueWidth);

DescriptorItem itemH(itemHeight,valueHeight);

dstImag->descriptor().addItem(itemW);

dstImag->descriptor().addItem(itemH);

dstImag->descriptor().save();

dstReal->descriptor().addItem(itemW);

dstReal->descriptor().addItem(itemH);

dstReal->descriptor().save();

// Alocando memoria para a estrutura de dados

[email protected] 30

Exemplos de Funcionalidades

data[0] = (double *) malloc((rows*cols)*sizeof(double));

data[1] = (double *) malloc((rows*cols)*sizeof(double));

if (data[0] == NULL || data[1] == NULL)

return false;

// Inicializando a parte real e complexa com

zero register double *dptr1, *dptr0 ;

dptr0=data[0] ;

dptr1=data[1] ;

for (int i=0; i<totsize; i++) {

*dptr0++ = *dptr1++ = 0.0 ;

}

//Lendo os valores da imagem

for (int i=0; i<or; i++) {

for (int j=0; j<oc; j++)

*(data[0]+(i*cols)+j) = (double) (*src)(i,j);

}

//Starting FFT...

fft(-1,data,totsize,cols,rows);

//FFT completed...

//Rotacionando os dados para melhor visualização

double temp;

for (int i=0; i<rows; i++) {

for (int j=0; j<cols/2; j++) {

temp = *(data[0]+i*cols+j);

*(data[0]+i*cols+j) = *(data[0]+i*cols+j+cols/2);

*(data[0]+i*cols+j+cols/2) = temp;

temp = *(data[1]+i*cols+j);

*(data[1]+i*cols+j) = *(data[1]+i*cols+j+cols/2);

*(data[1]+i*cols+j+cols/2) = temp;

}

}

for (int i=0; i<rows/2; i++) {

[email protected] 31

Exemplos de Funcionalidades

for (int j=0; j<cols; j++) {

temp = *(data[0]+i*cols+j);

*(data[0]+i*cols+j) = *(data[0]+(i+rows/2)*cols+j);

*(data[0]+(i+rows/2)*cols+j) = temp;

temp = *(data[1]+i*cols+j);

*(data[1]+i*cols+j) = *(data[1]+(i+rows/2)*cols+j);

*(data[1]+(i+rows/2)*cols+j) = temp;

}

}

double minimoTotal = 999999999999999.;

double maximoTotal = -999999999999999.;

//Obtendo os valores minimo e máximo

for (int i=0; i<or; i++) {

for (int j=0; j<oc; j++)

{

double valor = *(data[0]+(i*cols)+j);

if (valor > maximoTotal)

maximoTotal = valor;

if (valor < minimoTotal)

minimoTotal = valor;

valor = *(data[1]+(i*cols)+j);

if (valor > maximoTotal)

maximoTotal = valor;

if (valor < minimoTotal)

minimoTotal = valor;

}

}

double minimoR = 999999999999999.;

double maximoR = -999999999999999.;

double minimoI = 999999999999999.;

double maximoI = -999999999999999.;

//Atribuindo a estrutura real e complexa a imagem

[email protected] 32

Exemplos de Funcionalidades

{

register double *data0, *data1 ;

for (int i=0; i<rows; i++) {

data0 = data[0] + i * cols ;

data1 = data[1] + i * cols ;

for (int j=0; j<cols; j++) {

double valor = (int) (*data0++);

(*dstReal)(i,j) = valor;

if (valor > maximoR)

maximoR = valor;

if (valor < minimoR)

minimoR = valor;

valor = (int) (*data1++);

(*dstImag)(i,j) = valor;

if (valor > maximoI)

maximoI = valor;

if (valor < minimoI)

minimoI = valor;

}

}

}

dstReal->SetLimits(minimoR,maximoR);

dstImag->SetLimits(minimoI,maximoI);

minimoR = 999999999999999.;

maximoR = -999999999999999.;

minimoI = 999999999999999.;

maximoI = -999999999999999.;

//Atribuindo a estrutura real e complexa normalizada pelo Range e pela função logaritmica

double Range = 255;

double scale = (double)Range / log(1.0 + maximoTotal > -maximoTotal ? maximoTotal : -maximoTotal);

{ [email protected] 33

Exemplos de Funcionalidades

register double *data0, *data1 ;

for (int i=0; i<rows; i++) {

data0 = data[0] + i * cols ;

data1 = data[1] + i * cols ;

for (int j=0; j<cols; j++) {

double valor = (int) (log(1.0+fabs(*data0++)) * scale);

(*dstRealFeq)(i,j) = valor;

if (valor > maximoR)

maximoR = valor;

if (valor < minimoR)

minimoR = valor;

valor = (int) (log(1.0+fabs(*data1++)) * scale);

(*dstImagFeq)(i,j) = valor;

if (valor > maximoI)

maximoI = valor;

if (valor < minimoI)

minimoI = valor;

}

}

}

//Atualizando os valores de minimo e máximo das imagens de saída

dstRealFeq->SetLimits(minimoR,maximoR); dstImagFeq-

>SetLimits(minimoI,maximoI);

//Finalizando o uso das representações imagem

src->Clear();

dstReal->Clear();

dstImag->Clear();

dstRealFeq->Init();

dstImagFeq->Init();

//Liberando a estrutura

free(data[1]);

[email protected] 34

Exemplos de Funcionalidades

free(data[0]);

return true;

}

Após a interface e a funcionalidade adicionadas ao projeto do SPRING, é necessário

habilitar o acesso dessa para os usuários. Para isso o SPRING possui algumas operações que

auxiliam a inclusão de novas funcionalidades. Abaixo apresentamos a inclusão da operação da

Transformada Rápida de Fourier no menu Imagem do SPRING.

Primeiro deve-ser criar o método de criação da janela da nova funcionalidade. Como segue

o exemplo a baixo, implementado no arquivo fftdlg.cpp.

void fftdlg()

{

//Obtém as informações da janela ativa

QWidget* frame = newspringTabWidget->getMainWindow(SGcur);

if (!frame)

return;

//Caso a janela não tenha sido criada ou não foi encontrada na lista de Widget da

aplicação if((!fftFcFrame) || (!fftFcFrame->GetOpaque())) {

//caso a janela exista, remove a ultima referência

if(fftFcFrame)

{

windowLst.removeAll(fftFcFrame);

fftFcFrame = NULL;

}

//cria a janela

fftFcFrame = new Qtfft(frame);

windowLst.append(fftFcFrame);

}

//inicializa a janela, escondida e modal

if (fftFcFrame->Init(frame,frame->winId(),FALSE,TRUE))

{

}

[email protected] 35

Exemplos de Funcionalidades

}

Depois, é necessário adicionar a chamada da funcionalidade da Transformação Rápida de

Fourier, neste caso utilizaremos um método para realizar essa inclusão, implementado no arquivo

fftdlg.cpp.

void addFFTAction(SNewFrame* janela)

{

//Cria e adiciona uma ação ao menu imagem

janela->addActionImagemMenu(QObject::tr("Transformada Rápida de Fourier"),NULL,(ACTIONCALLFUNC)fftdlg);

}

Para finalizar e por fim utilizar sua nova funcionalidade, adicione a chamada da função

anterior na inicialização das janelas do SPRING no método newspring() do arquivo

newspring_ui.cpp. Neste caso a alteração deve ser feita conforme o exemplo abaixo.

void newspring (SNewFrame* frame)

{

SpringWindow* sp = newspringTabWidget->getSpringWindow(frame);

// Initialize the SButton object "springBZoom" sp-

>springBZoom.Init(frame,frame->newspringDlg.zoomBtn->winId());

// Initialize the SButton object "springBLink" sp-

>springBLink.Init(frame,frame->newspringDlg.linkBtn->winId());

void addFFTAction(SNewFrame*);

addFFTAction(frame);

}

[email protected] 36