67
UNIVERSIDADE REGIONAL DE BLUMENAU CENTRO DE CIÊNCIAS EXATAS E NATURAIS CURSO DE CIÊNCIAS DA COMPUTAÇÃO – BACHARELADO SISTEMA DE PROGRAMAÇÃO DE PRODUÇÃO COM REPRESENTAÇÃO GRÁFICA UTILIZANDO OPENGL EM JAVA JAQUES DOUGLAS CLAUDINO BLUMENAU 2007 2007/1-17

SISTEMA DE PROGRAMAÇÃO DE PRODUÇÃO COM …rodacki/tcc/329168_1_1.pdf · universidade regional de blumenau centro de ciÊncias exatas e naturais curso de ciÊncias da computaÇÃo

Embed Size (px)

Citation preview

UNIVERSIDADE REGIONAL DE BLUMENAU

CENTRO DE CIÊNCIAS EXATAS E NATURAIS

CURSO DE CIÊNCIAS DA COMPUTAÇÃO – BACHARELADO

SISTEMA DE PROGRAMAÇÃO DE PRODUÇÃO COM

REPRESENTAÇÃO GRÁFICA UTILIZANDO

OPENGL EM JAVA

JAQUES DOUGLAS CLAUDINO

BLUMENAU 2007

2007/1-17

JAQUES DOUGLAS CLAUDINO

SISTEMA DE PROGRAMAÇÃO DE PRODUÇÃO COM

REPRESENTAÇÃO GRÁFICA UTILIZANDO

OPENGL EM JAVA

Trabalho de Conclusão de Curso submetido à Universidade Regional de Blumenau para a obtenção dos créditos na disciplina Trabalho de Conclusão de Curso II do curso de Ciências da Computação — Bacharelado.

Prof. Paulo César Rodacki Gomes, Dr. - Orientador

BLUMENAU 2007

2007/1-17

SISTEMA DE PROGRAMAÇÃO DE PRODUÇÃO COM

REPRESENTAÇÃO GRÁFICA UTILIZANDO

OPENGL EM JAVA

Por

JAQUES DOUGLAS CLAUDINO

Trabalho aprovado para obtenção dos créditos na disciplina de Trabalho de Conclusão de Curso II, pela banca examinadora formada por:

______________________________________________________ Presidente: Prof. Paulo César Rodacki Gomes, Dr. – Orientador, FURB

______________________________________________________ Membro: Prof. Mauro Marcelo Mattos, Dr. – FURB

______________________________________________________ Membro: Prof. Dalton Solano dos Reis – FURB

Blumenau, 9 de julho de 2007

Dedico este trabalho a todos aqueles que me ajudaram diretamente na realização deste, em especial à minha família, meu orientador e meus amigos.

AGRADECIMENTOS

À minha família, que soube ensinar os valores de um bom trabalho.

À empresa Multitherm Sistemas e Automação, que forneceu a idéia de desenvolver

este trabalho.

Aos meus amigos, pelos empurrões e cobranças.

Ao meu orientador, Paulo César Rodacki Gomes, por ter mostrado os caminhos e

positivismo para a conclusão deste trabalho.

Nossas dúvidas são traidoras e nos fazem perder o bem que poderíamos conquistar se não fosse o medo de errar.

William Shakespeare

RESUMO

Este trabalho descreve o desenvolvimento de um sistema de programação de produção, onde as programações são representadas em um gráfico em escala de tempo. O sistema foi desenvolvido na linguagem de programação Java, utilizando a biblioteca gráfica OpenGL para o desenvolvimento do gráfico das programações. Para poder usar a OpenGL na linguagem Java, foi utilizado a biblioteca JOGL. Utilizou-se a biblioteca Swing para a construção das interfaces do sistema.

Palavras-chave: Computação gráfica. OpenGL. Programação de produção. PCP.

ABSTRACT

This work describes the development of a production programming system, where the programmed processes are represented in a time scale chart. The system was developed in Java programming language, using OpenGL graphic library to develop the programmed processes chart. For use OpenGL in Java language, was used JOGL library. To build graphics interfaces, was used Swing library.

Key-words: Computer graphics. OpenGL. Production programming. PCP.

LISTA DE ILUSTRAÇÕES

Figura 1 – Processo de transformação......................................................................................16

Figura 2 – Gráfico de Gantt......................................................................................................18

Figura 3 – OPs programadas aleatoriamente............................................................................19

Figura 4 – OPs programadas visando minimizar o tempo de fabricação .................................19

Figura 5 – Processo de comunicação da biblioteca JOGL com a OpenGL..............................22

Quadro 1 – Código fonte da janela principal............................................................................22

Quadro 2 – Código fonte da classe Listener ..........................................................................23

Figura 6 – Execução da aplicação Java utilizando a biblioteca JOGL.....................................24

Figura 7 – Exemplo de uma interface Swing utilizando o Look and Feel Metal .....................25

Figura 8 – Exemplo de uma interface Swing utilizando o Look and Feel Windows...............25

Figura 9 – Gráfico das programações do software Preactor.....................................................27

Figura 10 – Gráfico das programações do sistema de produção da empresa Multitherm........28

Figura 11 – Gráfico de programações hipotético .....................................................................29

Figura 12 – Diagrama de casos de uso .....................................................................................31

Figura 13 – Diagrama de atividades .........................................................................................32

Figura 14 – Diagrama de estados .............................................................................................33

Figura 15 – Diagrama de pacotes .............................................................................................33

Figura 16 – Diagrama de classes do pacote data.....................................................................34

Figura 17 – Diagrama de classes do pacote graficoprogramacao.........................................37

Figura 18 – Diagrama de entidade relacionamento ..................................................................38

Figura 19 – Tela principal do sistema ......................................................................................40

Figura 20 – Viewports utilizadas no gráfico das programações ...............................................43

Quadro 3 – Código fonte que define as windows, viewports e chama funções de desenho .....44

Figura 21 – Limite da programação pai na alteração de programação.....................................46

Figura 22 – Limite da programação filha na alteração de programação ..................................46

Figura 23 – Alteração automática de programações filhas.......................................................47

Figura 24 – Programações filhas alteradas automaticamente...................................................47

Figura 25 – Localização de programações de uma OP ............................................................48

Figura 26 – Programações sem intervalo .................................................................................49

Figura 27 – Programações com intervalos das 19:00h às 21:00h ............................................49

Figura 28 – Menu popup das programações.............................................................................50

Figura 29 – Recursos e programações com bordas arredondadas ............................................51

Figura 30 – Recursos e programação com recurso de antialiasing desabilitado......................52

Figura 31 – Utilização de transparência ...................................................................................52

Figura 32 – Utilização de texturas............................................................................................53

Quadro 4 – Rotinas usadas para desenhar os shapes com cantos arredondados ......................54

Figura 33 – Tela padrão de cadastro.........................................................................................55

Quadro 5 – Comparação de recursos do gráfico das programações.........................................59

Quadro 6 – Comparação de recursos do sistema......................................................................59

Figura 34 – Execução do sistema no Linux openSUSE 10.2 ...................................................59

LISTA DE TABELAS

Tabela 1 – Comparação de desempenho ..................................................................................58

LISTA DE SIGLAS

API – Application Program Interface

AWT – Abstract Window Toolkit

DAO – Data Access Object

DTO – Data Transfer Object

ERP – Enterprise Resource Planning

GUI – Graphic User Interface

JDBC – Java Database Connectivity

JNI – Java Native Interface

MRP – Material Requirements Planning

MRP II – Manufacturing Resource Planning II

OP – Ordem de Produção

OpenGL – Open Graphics Library

PCP – Planejamento e Controle da Produção

PERT-CPM – Program Evaluation and Review Technique - Critical Path Method

RF – Requisito Funcional

RNF – Requisito Não Funcional

SGBD – Sistema Gerenciador de Banco de Dados

SQL – Structured Query Language

UML – Unified Modeling Language

TO – Transfer Object

VO – Value Object

SUMÁRIO

1 INTRODUÇÃO..................................................................................................................13

1.1 OBJETIVOS DO TRABALHO ........................................................................................14

1.2 ESTRUTURA DO TRABALHO ......................................................................................15

2 FUNDAMENTAÇÃO TEÓRICA....................................................................................16

2.1 ADMINISTRAÇÃO DA PRODUÇÃO............................................................................16

2.2 PLANEJAMENTO E CONTROLE DA PRODUÇÃO (PCP) .........................................17

2.3 GRÁFICO DE GANTT.....................................................................................................18

2.4 OBJETIVOS DA PROGRAMAÇÃO DE PRODUÇÃO..................................................19

2.5 OPENGL ...........................................................................................................................20

2.5.1 OpenGL em Java.............................................................................................................21

2.5.2 Exemplo de uma aplicação utilizando JOGL..................................................................22

2.6 SWING..............................................................................................................................24

2.7 TRABALHOS CORRELATOS........................................................................................25

2.7.1 Preactor ...........................................................................................................................26

2.7.2 Sistema de produção da empresa Multitherm Sistemas e Automação Ltda. ..................27

3 DESENVOLVIMENTO DO SISTEMA..........................................................................29

3.1 REQUISITOS PRINCIPAIS .............................................................................................29

3.2 ESPECIFICAÇÃO ............................................................................................................31

3.2.1 Diagrama de casos de uso ...............................................................................................31

3.2.2 Diagrama de atividades ...................................................................................................32

3.2.3 Diagrama de estados .......................................................................................................32

3.2.4 Diagrama de pacotes .......................................................................................................33

3.2.5 Diagrama de classes do pacote data...............................................................................34

3.2.6 Diagrama de classes do pacote graficoprogramacao...................................................35

3.2.7 Diagrama de entidade relacionamento ............................................................................38

3.3 IMPLEMENTAÇÃO ........................................................................................................39

3.3.1 Tela principal do sistema ................................................................................................39

3.3.2 Técnicas e ferramentas utilizadas....................................................................................41

3.3.3 Gráfico das Programações...............................................................................................42

3.3.3.1 Definição dos universos OpenGL.................................................................................42

3.3.3.2 Adicionar programação ................................................................................................45

3.3.3.3 Excluir programação.....................................................................................................45

3.3.3.4 Validar programação ....................................................................................................45

3.3.3.5 Alterar programação .....................................................................................................45

3.3.3.6 Executar programação ..................................................................................................47

3.3.3.7 Finalizar programação ..................................................................................................47

3.3.3.8 Localizar programação .................................................................................................48

3.3.3.9 Intervalos não produtivos .............................................................................................49

3.3.3.10 Manipulação Interativa ...............................................................................................50

3.3.3.11 Alinhamento de programações ...................................................................................50

3.3.3.12 Zoom...........................................................................................................................51

3.3.3.13 Pan ..............................................................................................................................51

3.3.3.14 Técnicas de visualização ............................................................................................51

3.3.3.15 Otimizações de renderização ......................................................................................53

3.3.4 Sistema de programação de produção.............................................................................55

3.3.4.1 Cadastro de grupo de recursos ......................................................................................55

3.3.4.2 Cadastro de recursos .....................................................................................................56

3.3.4.3 Cadastro de etapas ........................................................................................................56

3.3.4.4 Cadastro de processos...................................................................................................56

3.3.4.5 Cadastro de intervalos não produtivos..........................................................................56

3.3.4.6 Geração de OP ..............................................................................................................57

3.3.4.7 Adicionar programação ................................................................................................57

3.3.4.8 Localizar programação .................................................................................................57

3.3.4.9 Importação de dados do Sistema de Produção da Empresa Multitherm.......................58

3.4 RESULTADOS E DISCUSSÃO ......................................................................................58

4 CONCLUSÕES..................................................................................................................60

4.1 EXTENSÕES ....................................................................................................................61

REFERÊNCIAS BIBLIOGRÁFICAS .................................................................................63

13

1 INTRODUÇÃO

Na corrida para atender à demanda do mercado, as indústrias buscam soluções que as

diferenciem e aumentem a sua competitividade. Uma dessas soluções é o Planejamento e

Controle da Produção (PCP), que também está entre os principais fatores que influenciam a

produtividade industrial. Segundo Burbidge (1988, p. 27) o PCP tem como objetivo alocar a

mão-de-obra e equipamentos com o máximo de aproveitamento, sempre com a preocupação

de que os produtos produzidos sejam entregues nas datas prometidas. Para atender a estas

necessidades são desenvolvidos sistemas de programação de produção. Segundo Brito (2000,

p. 79), estes sistemas aplicam-se a todas as empresas que precisem considerar o problema de

filas de espera e seqüenciamento de operações para o balanceamento entre ocupação e

capacidade de produção. Estão incluídas por exemplo, indústrias têxteis, metalúrgicas,

cerâmicas, etc.

Sendo assim, o sistema de programação de produção é o responsável por emitir as

ordens de produção1 (OPs) a serem produzidas e liberar as OPs já finalizadas pela produção.

Deve organizar em seqüência todas as OPs seguintes, distribuindo-as em todos os recursos da

produção2, de forma que o término da OP não ultrapasse a data de entrega previamente

estipulada.

Para atender a estas necessidades, desenvolveu-se neste trabalho um sistema de

programação de produção, onde as OPs programadas são representadas graficamente para o

usuário. A representação gráfica é semelhante a um gráfico de Gantt3, onde as OPs

programadas são representadas em escala de tempo, conforme o seu tempo estimado de

duração.

O sistema possibilita o cadastramento de recursos e processos. Um processo é uma

seqüência de tarefas que podem ser feitas em um ou mais recursos. A cada tarefa é possível

definir o seu tempo estimado de duração. Após efetuar o cadastro de recursos e processos, o

sistema permite alocar os processos em seus determinados recursos. Estes processos alocados

1 Ordens de produção são seqüências de atividades que transformam um determinado produto (NOGUEIRA, 2002, p. 1), ou seja, são processos programados para serem produzidos. Uma ordem de produção geralmente é representada por uma seqüência numérica. 2 Recursos da produção são equipamentos e mão-de-obra que a empresa dispõe. 3 Gráfico de Gantt é um tipo de gráfico de barras que representa as tarefas a serem feitas em uma escala temporal. Ele também ajuda a mostrar os relacionamentos entre as tarefas (DAVIS; AQUILANO; CHASE, 2001, p. 554).

14

são chamados de programações. O sistema também possui funções para excluir, alterar,

iniciar (emitir) e finalizar (liberar) programações. Estas funções podem ser acessadas

interativamente, através do gráfico das programações.

O desenvolvimento do sistema foi feito em Java utilizando a Open Graphics Library

(OpenGL) (OPENGL, 2006) para a geração e manipulação do gráfico das programações. A

OpenGL que pode ser definida como um uma “interface para hardware gráfico”, é uma

biblioteca de rotinas gráficas e de modelagem, bidimensional (2D) e tridimensional (3D),

extremamente portável e rápida (COHEN; MANSSOUR, 2006, p. 18).

Obteve-se com a OpenGL um bom desempenho na geração do gráfico das

programações. Este é um dos diferenciais, já que alguns sistemas de programação de

produção existentes, por utilizarem recursos gráficos menos eficientes, possuem problemas de

desempenho quando a fila de programações é muito grande. Também foi possível com a

OpenGL, desenvolver um ambiente mais amigável, como por exemplo aplicação de texturas

sobre as programações, localização e identificação de relacionamentos e efeito de zoom sobre

todo o gráfico, permitindo visualizar uma quantidade maior de OPs em um período maior.

1.1 OBJETIVOS DO TRABALHO

O objetivo deste trabalho é desenvolver um sistema de programação de produção

utilizando a OpenGL para geração do gráfico das programações.

Os objetivos específicos do trabalho são:

a) disponibilizar o cadastramento de processos e recursos da produção;

b) permitir a programação de OPs;

c) representar graficamente todas as OPs programadas, semelhante a um gráfico de

Gantt;

d) permitir através do gráfico das programações, a manipulação interativa das OPs

programadas.

15

1.2 ESTRUTURA DO TRABALHO

Este trabalho está divido em quatro capítulos. O primeiro traz uma introdução ao

assunto e do que se trata o trabalho. O segundo apresenta uma fundamentação teórica dos

conhecimentos necessários para a realização do trabalho. O terceiro descreve como foi

realizado o desenvolvimento. O quarto capítulo trata das conclusões e resultados obtidos.

16

2 FUNDAMENTAÇÃO TEÓRICA

No presente capítulo são apresentados alguns aspectos teóricos relacionados ao

trabalho. Na seção 2.1 é apresentado o conceito de administração da produção. Na seção 2.2

são apresentados conceitos e funções do Planejamento e Controle da Produção (PCP). Em

seguida, na seção 2.3 é apresentado o gráfico de Gantt, uma das primeiras ferramentas de

controle de produção. Na seção 2.4 são apresentados os objetivos e benefícios da

programação de produção. Na seção 2.5 é apresentada a biblioteca gráfica OpenGL e como é

feita a sua integração na linguagem Java. Na seção 2.6 é apresentado a biblioteca Swing,

usada para desenvolver interfaces gráficas em Java. Na última seção 2.7 são descritos alguns

trabalhos correlatos.

2.1 ADMINISTRAÇÃO DA PRODUÇÃO

A Administração da Produção é o coração dos processos produtivos. Ela tem o objetivo de planejar e controlar o processo de manufatura em todos os seus níveis, incluindo materiais, equipamentos, pessoas, fornecedores e distribuidores. É através da Administração da Produção que a organização garante que suas decisões operacionais sobre o que, quando, quanto e com o que produzir e comprar sejam adequados a suas necessidades estratégicas, que por sua vez são ditadas por seus objetivos e seu mercado. (RIBEIRO, 2005).

Davis, Aquilano e Chase (2001, p. 25), definem a administração da produção como

sendo a gestão do processo de conversão de insumos, em resultados na forma de produtos

acabados e serviços. Essa conversão de insumos é denominada processo de transformação. O

processo de transformação é composto por um conjunto de componentes, que podem ser

máquinas, pessoas, ferramentas ou um sistema gerencial. Um insumo pode ser uma matéria-

prima, uma pessoa ou um produto acabado de outro processo. A figura 1 ilustra o processo de

transformação.

Fonte: Davis, Aquilano e Chase (2001, p. 25).

Figura 1 – Processo de transformação

São exemplos de transformações: física, como na manufatura; de local, como no

17

transporte; de troca, como no varejo; de estocagem, como no armazenamento; fisiológica,

como nos programas de saúde; informacional, como nas telecomunicações.

2.2 PLANEJAMENTO E CONTROLE DA PRODUÇÃO (PCP)

O PCP é o setor da indústria responsável pelo planejamento e controle da produção.

No planejamento é definido como, por quem, com que recursos, onde e quando um

determinado processo pode ser feito. No controle da produção é verificado se o desempenho

da produção está de acordo com o planejado. Caso não esteja de acordo, o planejamento deve

ser alterado para assim atender seus objetivos.

Em um sistema de manufatura, toda vez que são formulados objetivos, é necessário formular planos de como atingi-lo, organizar recursos humanos e físicos necessários para a ação, dirigir a ação dos recursos humanos sobre os recursos físicos e controlar esta ação para a correção de eventuais desvios. No âmbito da administração da produção, este processo é realizado pela função de Planejamento e Controle da Produção (PCP). (MOURA JR, 1996).

Atualmente, o PCP é considerado uma importante ferramenta da produção. O PCP é

um conceito que casa uma filosofia de planejamento com um conjunto de ferramentas para

implementar a filosofia de modo a otimizar o processo (DAVIS; AQUILANO; CHASE,

2001, p. 549).

Russomano (2000, p. 55), define o PCP como sendo a função de apoio das atividades

de produção, visando que os programas acertados previamente possam ser atendidos com

eficiência. Segundo Russomano (2000, p. 52), o PCP exerce as seguintes funções:

a) gestão de estoques: cuida da disponibilidade dos materiais necessários à produção;

b) emissão de ordens de produção: toma providências para ter a tempo todos os itens

necessários à produção, tais como matérias-prima, peças compradas, peças

fabricadas e produtos acabados;

c) programação das ordens de produção: estabelece em que recursos e quando cada

etapa do processo deve ser executada;

d) movimentação das ordens de produção: registra, informa e transfere o material

fabricado;

e) acompanhamento da produção: compara o planejamento com a execução e controla

sua correção.

Atender os prazos de entrega e aumentar a capacidade de produção, são os principais

18

objetivos do PCP. Para atender estes objetivos, deve haver um planejamento e controle da

produção. No planejamento é definido a estratégia para programar as OPs, de forma que

sejam produzidas dentro de seu prazo de entrega, visando utilizar ao máximo os recursos da

produção. Quanto melhor forem utilizados os recursos, menor será o tempo de ociosidade e

conseqüentemente haverá um aumento na capacidade de produção. Além de planejar, é

necessário controlar a produção, verificando se o desempenho da produção está de acordo

com o planejado. Caso ocorram desvios, deve-se alterar o planejamento de forma que atenda

aos objetivos. Falta de mão-de-obra e equipamentos quebrados são exemplos de desvios que

podem ocorrer no planejamento da produção.

O PCP é um elemento decisivo na estratégia das empresas para enfrentar as crescentes

exigências dos consumidores por melhor qualidade, maior variação de modelos e entregas

mais confiáveis. Por isso, existe a necessidade de se buscar uma maior eficiência nos sistemas

de PCP.

2.3 GRÁFICO DE GANTT

O gráfico de Gantt foi desenvolvido em 1917 pelo engenheiro e cientista social Henry

L. Gantt, com o objetivo de ser uma ferramenta de controle de produção (AGUIAR, 2003). O

gráfico de Gantt é formado por um retângulo divido por uma série de linhas paralelas

horizontais e verticais, como ilustrado na figura 2. As linhas verticais dividem a escala

horizontal em unidade de tempo. Já as linhas horizontais dividem o gráfico em seções,

representando as tarefas a serem realizadas (BURBIDGE, 1988, p. 193).

Fonte: Burbidge (1988, p. 194).

Figura 2 – Gráfico de Gantt

As tarefas representadas no gráfico de Gantt possuem um tempo estimado de duração

19

conhecido. Essas tarefas podem ser produtos a serem montados, peças a serem feitas, ou

operações a serem realizadas ao longo da fabricação (BURBIDGE, 1988, p. 194). Também

pode ser facilmente identificado no gráfico de Gantt, o relacionamento entre as tarefas,

permitindo assim uma visualização clara de todo o fluxo de uma OP.

2.4 OBJETIVOS DA PROGRAMAÇÃO DE PRODUÇÃO

Segundo Burbidge (1988, p. 199), os principais objetivos da programação de produção

podem ser relacionados da seguinte maneira:

a) entrega dos produtos na data prevista: este é considerado o objetivo principal da

programação. A finalidade deve ser planejar a seqüência de trabalho de tal forma

que todos os produtos sejam concluídos na data prevista;

b) tempo de fabricação mínimo: tem como objetivo produzir as OPs no menor tempo

possível, possibilitando assim, oferecer prazos de entrega mais curtos. Na figura 3

é ilustrado um gráfico de Gantt representando as OPs programadas aleatoriamente,

enquanto na figura 4, as mesmas programações foram planejadas de forma que

minimizaram o tempo de fabricação. Além da redução do tempo de fabricação

também foram diminuídos os tempos ociosos entre as programações;

Fonte: Burbidge (1988, p. 200).

Figura 3 – OPs programadas aleatoriamente

Fonte: Burbidge (1988, p. 200).

Figura 4 – OPs programadas visando minimizar o tempo de fabricação

c) tempo ocioso mínimo (máquinas): este objetivo visa a máxima utilização do

equipamento, para assim gerar uma maior produtividade;

20

d) tempo ocioso mínimo (empregados): tem como objetivo programar o trabalho de

tal forma que os empregados estejam sempre ocupados, possibilitando assim, a

minimização do custo de salários;

e) tempo de preparação mínimo: tempo de preparação é o tempo que o recurso levará

para poder iniciar a sua tarefa. Um exemplo a ser utilizado em empresas de

tinturaria, são tingimentos de cores escuras e claras em uma mesma máquina. Após

efetuado um processo de tingimento de cor escura, para tingir uma cor clara,

primeiramente a máquina deverá sofrer um processo de lavação. Este processo será

caracterizado como um tempo de preparação. Para minimizar os tempos de

preparação neste exemplo, bastaria agrupar em seqüência todas as OPs de cores

claras ou escuras, possibilitando assim, evitar o processo de lavação da máquina

entre uma programação e outra.

2.5 OPENGL

Segundo Shreiner et al (2005, p. 13), a OpenGL (Open Graphics Library) é uma

biblioteca que faz a interface para o hardware gráfico. Esta interface consiste em

aproximadamente 150 comandos distintos que podem ser usados para especificar objetos e

operações para produzir aplicações interativas em duas ou três dimensões.

O desenvolvimento de aplicações gráficas de alto desempenho costumava ser exclusividade de instituições de pesquisa ou empresas que dispunham de hardware gráfico veloz e especificado, além de programadores experientes. Há alguns anos, essa situação modificou-se com o surgimento do mercado de placas gráficas para computadores pessoais e o desenvolvimento de bibliotecas gráficas que não exigiam conhecimentos extensivos de programação ou de hardware. Uma dessas bibliotecas, hoje o padrão da indústria para aplicações profissionais, é a OpenGL. (COHEN; MANSSOUR, 2006, p. 15).

Pode-se definir a OpenGL como uma especificação aberta e multiplataforma de uma

biblioteca de rotinas gráficas e de modelagem utilizada para o desenvolvimento de aplicações

de Computação Gráfica, tais como jogos ou sistemas de visualização. A maior vantagem da

OpenGL é a velocidade, uma vez que incorpora vários algoritmos otimizados, incluindo o

desenho de primitivas gráficas, o mapeamento de textura e outros efeitos especiais (COHEN;

MANSSOUR, 2006, p. 15). Segundo McReynolds e Blythe (2005, p. XXIV), a OpenGL pode

ser obtida gratuitamente para quase todas as arquiteturas hoje existentes: Apple Machintosh,

Microsoft Windows e praticamente todos Unix com algumas variantes incluindo Linux e

21

OS/2.

Na próxima seção é apresentada uma das formas para implementar aplicações

OpenGL, utilizando a linguagem de programação Java.

2.5.1 OpenGL em Java

Existe mais de uma alternativa para implementar aplicações OpenGL utilizando a

linguagem de programação Java. Entretanto, de acordo com a página oficial da API OpenGL,

o projeto JOGL é a implementação de referência de uma API que permite o desenvolvimento

de programas Java com OpenGL (COHEN; MANSSOUR, 2006, p. 364).

A JOGL não é uma nova implementação de uma interface OpenGL para acessar o

hardware gráfico, mas sim uma biblioteca que faz a ligação da linguagem Java com a

biblioteca OpenGL. Esta biblioteca OpenGL é encontrada em praticamente todos sistemas

operacionais e é ela que faz a comunicação com o hardware gráfico.

A biblioteca JOGL fornece o acesso completo à OpenGL 2.0 integrando-a com os

componentes gráficos Abstract Window Toolkit (AWT) (ZUKOWSKI, 1997) e Swing (SUN

MICROSYSTEMS, 2006). Segundo Collabnet Inc (2006a), a JOGL é open-source e seu

desenvolvimento foi iniciado em 2003 pelo Game Technology Group da Sun Microsystems.

Para poder utilizá-la, é necessário que a máquina virtual Java versão 1.4.2 (SUN

MICROSYSTEMS, 2003a) ou superior esteja instalada.

Segundo Collabnet Inc (2006b), a distribuição da JOGL para desenvolvedores contém

duas partes: uma biblioteca independente de plataforma que contém as classes em Java e outra

biblioteca que é dependente de plataforma e contém o código Java Native Interface (JNI) que

faz as chamadas às funções da OpenGL. A JNI é um padrão de programação que permite que

a máquina virtual da linguagem Java acesse bibliotecas construídas com o código nativo de

um sistema operacional (SUN MICROSYSTEMS, 2003b). No caso da JOGL, a JNI é usada

para acessar a biblioteca OpenGL, que possui código nativo.

A JOGL foi quase completamente escrita na linguagem Java. Apenas a biblioteca

dependente de plataforma foi escrita na linguagem C. Existem aproximadamente 150 linhas

desse código fonte que foram escritas a mão, sendo que 100 delas são usadas para corrigir

problemas na utilização de bibliotecas OpenGL mais antigas do sistema operacional

Windows. O restante desse código fonte foi gerado automaticamente durante o processo de

22

construção, por um utilitário chamado GlueGen (COLLABNET INC, 2006b).

A Figura 5 ilustra o processo de comunicação de uma aplicação Java com a OpenGL,

utilizando a JOGL. Como pode ser visto, a aplicação Java precisa apenas acessar a biblioteca

JOGL escrita em Java. Esta biblioteca se comunica com a biblioteca JOGL que é dependente

de plataforma. Por sua vez, esta biblioteca utiliza a JNI para se comunicar com a biblioteca

OpenGL, que também é dependente de plataforma.

Figura 5 – Processo de comunicação da biblioteca JOGL com a OpenGL

2.5.2 Exemplo de uma aplicação utilizando JOGL

Esta seção mostra um exemplo de uma aplicação utilizando a biblioteca JOGL. O

quadro 1 mostra o código fonte usado para gerar uma janela em Java. É inserido nesta janela

um componente GLCanvas. GLCanvas é um componente AWT que provê o suporte à

renderização OpenGL (SUN MICROSYSTEMS, 2005a). Há um outro componente Swing

chamado GLJPanel, mas ainda está em desenvolvimento e atualmente apresenta alguns

problemas (SUN MICROSYSTEMS, 2005b). É atribuído neste componente GLCanvas, uma

instância da classe Listener, que é apresentada no quadro 2.

import javax.media.opengl.GLCanvas;

import javax.swing.JFrame;

public class Main extends JFrame {

public Main() {

GLCanvas glCanvas = new GLCanvas(); //cria o componente de desenho

glCanvas.addGLEventListener(new Listener()); //seta nova instância da classe Listener

this.add(glCanvas);

this.setTitle("Exemplo JOGL");

this.setSize(300, 300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

public static void main(String[] args) {

new Main();

}

}

Quadro 1 – Código fonte da janela principal

23

A classe Listener implementa a interface GLEventListener que pertence à

biblioteca JOGL. Ela contém os métodos que implementam os eventos da OpenGL. São eles:

a) init: é chamado logo após inicializar a OpenGL. É usado para inicialização de

parâmetros. Neste exemplo (quadro 2), é definido a cor de fundo e definição do

universo OpenGL;

b) display: é através deste método que devem ser enviados os comandos OpenGL

para desenhar os objetos desejados. Neste exemplo, são enviados os comandos para

definir a cor de desenho e para desenhar um quadrado e o texto “Exemplo JOGL”;

c) reshape: é chamado toda vez que o componente de desenho é redimensionado;

d) displayChanged: é chamado ao alterar propriedades de vídeo do sistema

operacional, como resolução e quantidade de cores.

import com.sun.opengl.util.GLUT;

import javax.media.opengl.GL;

import javax.media.opengl.GLAutoDrawable;

import javax.media.opengl.GLEventListener;

import javax.media.opengl.glu.GLU;

public class Listener implements GLEventListener {

private GLU glu = new GLU();

private GLUT glut = new GLUT();

private int width, height; //atributos utilizados para definir o tamanho da viewport

public void init(GLAutoDrawable gLAutoDrawable) {

GL gl = gLAutoDrawable.getGL();

gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //define cor de fundo (branco)

gl.glViewport(0, 0, width, height); //define viewport

gl.glMatrixMode(GL.GL_PROJECTION);

gl.glLoadIdentity();

glu.gluOrtho2D(-10.0f, 10.0f, -10.0f, 10.0f); //define window

}

public void display(GLAutoDrawable gLAutoDrawable) {

GL gl = gLAutoDrawable.getGL();

gl.glClear(GL.GL_COLOR_BUFFER_BIT);

gl.glColor3f(0.0f, 0.0f, 0.0f); //define cor de pintura (preto)

gl.glBegin(GL.GL_LINE_LOOP); //desenha um quadrado

gl.glVertex2f(5.0f, 5.0f);

gl.glVertex2f(5.0f, -5.0f);

gl.glVertex2f(-5.0f, -5.0f);

gl.glVertex2f(-5.0f, 5.0f);

gl.glEnd();

gl.glPushMatrix(); //desenha o texto "Exemplo JOGL"

gl.glTranslatef(-5.0f, 6.0f, 0.0f);

gl.glScalef(0.011f, 0.011f, 0.0f);

glut.glutStrokeString(glut.STROKE_ROMAN, "Exemplo JOGL");

gl.glPopMatrix();

}

public void reshape(GLAutoDrawable gLAutoDrawable, int x, int y, int width, int height) {

this.width = width;

this.height = height;

}

public void displayChanged(GLAutoDrawable gLAutoDrawable, boolean b, boolean b0) {

}

}

Quadro 2 – Código fonte da classe Listener

24

A figura 6 ilustra a execução da aplicação Java utilizando a biblioteca JOGL.

Figura 6 – Execução da aplicação Java utilizando a biblioteca JOGL

2.6 SWING

Swing é uma biblioteca de classes para construir interfaces gráficas em ambientes

desktop, na linguagem de programação Java. Tecnicamente é chamada de Graphic User

Interface (GUI) toolkit. GUI toolkits são a base para a construção de interfaces gráficas. Elas

são compostas por componentes widgets, que podem ser janelas, menus, botões, tabelas,

caixas de texto, entre outros.

Nas primeiras versões do Java, a única forma de fazer programas gráficos era através

da Abstract Window Toolkit (AWT). A AWT é uma GUI composta por bibliotecas de baixo-

nível que dependem de código nativo da plataforma onde roda. Ela traz alguns problemas de

compatibilidade entre as plataformas, fazendo que nem sempre o programa tenha aparência

desejada em todos os sistemas operacionais, sendo também mais difícil de ser usada. Para

suprir as necessidades cada vez mais freqüentes de uma API mais estável e fácil de usar, o

Swing foi criado como uma extensão do Java a partir da versão 1.2. Swing fornece

componentes de mais alto nível, possibilitando assim uma melhor compatibilidade entre os

vários sistemas onde Java roda (STEIL, 2006).

Ao contrário da AWT, Swing não contém uma única linha de código nativo, e permite

que as aplicações tenham diferentes tipos de visuais, os chamados “Look and Feel”. Já com

AWT isso não é possível, tendo todos os programas a aparência da plataforma onde estão

rodando (STEIL, 2006). Nas figuras 7 e 8 são ilustradas duas imagens da mesma aplicação,

apenas mudando o seu “Look and Feel”. Na figura 7 a aplicação usa o “Look and Feel” Metal,

25

enquanto na figura 8 foi usado o “Look and Feel” Windows.

FONTE: Grouchnikov (2006).

Figura 7 – Exemplo de uma interface Swing utilizando o Look and Feel Metal

FONTE: Grouchnikov (2006).

Figura 8 – Exemplo de uma interface Swing utilizando o Look and Feel Windows

2.7 TRABALHOS CORRELATOS

Em Volkmann (1998), é apresentado um protótipo para auxiliar a programação de

produção. Este protótipo utiliza técnicas de Program Evaluation and Review Technique -

Critical Path Method (PERT-CPM) (VOLKMANN, 1998, p. 38) para programar a produção,

e técnicas de Manufacturing Resource Planning II (MRP II) (VOLKMANN, 1998, p. 17)

para planejar a produção. As técnicas de PERT-CPM são usadas para calcular a data de início

da primeira e a última tarefa de um processo. Já as técnicas de MRP II são usadas para

calcular a capacidade mensal dos recursos e para calcular a quantidade de dias com tarefas

alocadas (VOLKMANN, 1998, p. 66). A representação e manipulação das programações é

feita através de uma grade.

Em Loffi (1999), é apresentado um protótipo para controlar a utilização de recursos da

produção. Segundo Loffi (1999, p. 36), “o protótipo tem como finalidade demonstrar a

programação da produção para as indústrias de manufatura utilizando técnicas de PERT-

26

CPM.” A representação e manipulação das programações também é feita por uma grade. Há

uma função no sistema, que gera um gráfico de Gantt com todas as tarefas programadas

(LOFFI, 1999, p. 67). Não é possível manipular interativamente este gráfico. É apenas gerado

uma visualização para fins de consulta.

Nas duas seções seguintes serão apresentadas ferramentas existentes no mercado, que

desempenham papel semelhante ao trabalho proposto. Na seção 2.7.1 será apresentado o

sistema Preactor, e na seção 2.7.2 o sistema de produção da empresa Multitherm, onde o autor

deste trabalho atualmente exerce a função de desenvolvedor.

2.7.1 Preactor

O Preactor é um software especializado em programação da produção de bens e

serviços, que utiliza o conceito de seqüenciamento em capacidade finita. As programações

geradas pelo Preactor são altamente realistas e confiáveis porque respeitam a disponibilidade

efetiva dos recursos da produção, a existência de restrições operacionais, as condições de

demanda e as políticas de atendimento da empresa (PREACTOR, 2003).

O Preactor é desenvolvido pela Preactor International da Inglaterra e distribuído na

América do Sul pela empresa Tecmaran. É um sistema de programação de produção muito

completo, podendo fazer a integração com vários sistemas do tipo Enterprise Resource

Planning (ERP) e Material Requirements Planning (MRP). Segundo Preactor (2003), o

software Preactor é líder mundial em sua categoria com mais de 4.500 licenças

comercializadas para pequenas, médias e grandes empresas em todo o mundo.

Segundo Tecmaran (2004), o retorno do investimento no Preactor é medido em

semanas e os resultados chegam a:

a) 15% de aumento na produtividade;

b) 25% de redução dos estoques;

c) 40% de redução dos materiais em processo;

d) 60% de melhoria na performance de entrega.

Mesmo com todo o seu sucesso, o Preactor não utiliza recursos avançados para a

geração do gráfico das programações, que é semelhante a um gráfico de Gantt. A visualização

é composta por gráficos simples sem efeitos, o que o torna pouco amigável. A figura 9 mostra

o gráfico das programações do software Preactor. Nesta figura é apresentado um exemplo

27

aplicado a uma metalúrgica, onde pode-se verificar o nome dos recursos da produção sendo

representados verticalmente no lado esquerdo. Na área central da figura, são representadas

todas as programações de seus respectivos recursos.

Fonte: Tecmaran (2004).

Figura 9 – Gráfico das programações do software Preactor

2.7.2 Sistema de produção da empresa Multitherm Sistemas e Automação Ltda.

O sistema de produção da empresa Multitherm é um módulo do sistema de gestão

destinado ao mercado têxtil, chamado Gestum (MULTITHERM SISTEMAS E

AUTOMAÇÃO, 2006). Neste sistema de produção, além de ser possível programar as OPs, é

feita conexão a controladores de máquinas têxteis e coletores de dados, que emitem comandos

para as programações do sistema iniciarem e finalizarem. Este sistema também faz a

monitoração dos controladores das máquinas, onde os dados são informados ao usuário e

coletados para futura geração de relatórios e gráficos. Atualmente o sistema é utilizado em

lavanderias industriais, lavanderias de beneficiamento e tinturarias.

O gráfico das programações deste sistema também é semelhante a um gráfico de Gantt.

28

É possível fazer a manipulação interativa diretamente por este gráfico, como excluir, alterar,

iniciar e finalizar programações. Pode-se alterar a programação de seqüência ou de recursos,

apenas arrastando-a para a posição desejada. Este sistema é desenvolvido na linguagem

Delphi e utiliza recursos gráficos nativos, que são limitados e geram problema de desempenho

quando há uma grande quantidade de programações. Este gráfico das programações não

dispõe do recurso de zoom, o que dificulta a visualização das programações em um período

maior.

A técnica utilizada para desenvolver o gráfico das programações desse sistema não

possui um sistema de coordenadas, como existe na OpenGL. Todos os gráficos são

desenhados passando diretamente as coordenadas na tela, o que o torna complexo para

manutenção e implementação de novas técnicas, como por exemplo o recurso de zoom.

Também devido à técnica utilizada, o tempo para carregar e ajustar as programações na tela é

grande.

A figura 10 apresenta a tela principal do sistema de produção da empresa Multitherm.

Esta tela principal contém o gráfico das programações, com os recursos de produção listados à

esquerda e as OPs programadas sendo representadas na área central.

Fonte: Multitherm (2006).

Figura 10 – Gráfico das programações do sistema de produção da empresa Multitherm

29

3 DESENVOLVIMENTO DO SISTEMA

O presente capítulo descreve a especificação do projeto e detalha funcionalidades e

implementações do sistema desenvolvido.

3.1 REQUISITOS PRINCIPAIS

O sistema de programação de produção a ser implementado neste trabalho deverá:

a) ter um cadastro de recursos da produção (requisito funcional - RF);

b) ter um cadastro de processos (RF);

c) permitir a geração de OPs, sendo que cada OP deverá estar associada a um

processo (RF);

d) permitir a programação de OPs em seus determinados recursos (RF);

e) apresentar as programações graficamente, semelhante a um gráfico de Gantt. Este

gráfico será chamado de gráfico das programações. O tamanho da representação

horizontal de cada programação, deverá variar de acordo com o tempo estimado

cadastrado em seu processo. Cada linha do gráfico corresponderá a um recurso da

produção, contendo a sua descrição ao lado esquerdo de cada linha. É apresentado

na figura 11 um gráfico de programações hipotético. À esquerda da figura são

listados os recursos da produção. Ao lado de cada recurso estão representadas as

programações alocadas. No topo do gráfico há uma escala de tempo em horas.

Também são representados na figura 11 os tempos ociosos, que são os períodos em

que o recurso permanece sem produzir (RF);

Figura 11 – Gráfico de programações hipotético

f) permitir através do gráfico das programações, a manipulação interativa das OPs

30

programadas, como exclusão, alteração, emissão e liberação (RF);

g) possibilitar a aplicação de texturas sobre as OPs representadas no gráfico das

programações. Essa textura poderá ser definida ao gerar uma nova OP. Um

exemplo a ser usado em empresas têxteis, poderia ser uma imagem identificando

artigos jeans ou malha, com suas respectivas cores. Sendo assim, essa textura

poderá ser aplicada nas OPs programadas, facilitando a identificação dos processos

que estão sendo produzidos (RF);

h) identificar no gráfico das programações, as OPs que estão com a data de entrega

em atraso. Ao gerar uma nova OP, o usuário deverá fornecer a data de entrega

prevista. Após programar a OP, caso o término estimado ultrapasse a data de

entrega definida, as programações desta OP serão realçadas no gráfico. Sendo

assim, caso o usuário queira cumprir a data de entrega, ele deverá alterar as

programações para seqüências que atendam ao término estimado (RF);

i) ter o recurso de localizar OPs no gráfico das programações. Esta função realçará no

gráfico das programações, apenas as programações da OP informada. Todas as

demais programações deverão ficar com cores transparentes, para que a OP

localizada possa ser melhor visualizada. Também deverão ser apresentadas setas,

apontado os relacionamentos entre as programações da OP localizada (RF);

j) ter o recurso de zoom. Este recurso poderá ser aplicado em todo o gráfico das

programações, permitindo assim uma melhor visualização das OPs programadas

em um período maior (RF);

k) ter o recurso de pan. Este recurso permite a rolagem vertical e horizontal do gráfico

das programações (RF);

l) ser implementado na linguagem de programação Java (requisito não-funcional –

RNF);

m) utilizar a OpenGL para a geração e manipulação interativa do gráfico das

programações (RNF);

n) utilizar a biblioteca JOGL (COLLABNET INC, 2006a) para acesso às funções da

OpenGL (RNF);

o) utilizar a biblioteca Swing (SUN MICROSYSTEMS, 2006) para a criação de

interfaces (RNF);

p) ser portável (RNF).

31

3.2 ESPECIFICAÇÃO

Para especificação deste trabalho é utilizada a Unified Modeling Language (UML),

com auxílio da ferramenta Enterprise Architect (SPARX SYSTEMS, 2007), para gerar os

diagramas de casos de uso, de atividades, de estados e de classes. Para gerar o diagrama de

entidade relacionamento, foi utilizada a ferramenta PowerDesigner (SYBASE, 2007).

3.2.1 Diagrama de casos de uso

O diagrama de casos de uso ilustrado na figura 12 retrata todos os casos de uso

existentes entre o usuário e o sistema. No gráfico das programações o usuário dispõe das

funções para adicionar, excluir, validar, alterar, iniciar, finalizar e localizar programações.

Também poderá executar as operações de zoom e pan. No sistema que utiliza o gráfico das

programações, será possível cadastrar grupos de recursos, recursos, etapas, processos,

intervalos não produtivos e gerar OP.

Figura 12 – Diagrama de casos de uso

32

3.2.2 Diagrama de atividades

Na figura 13 é apresentado o diagrama de atividades do sistema. Ao abrir o sistema, o

usuário poderá executar operações de:

a) cadastros do sistema;

b) programação, onde poderá ser feito várias operações sobre elas;

c) gerar OP;

d) visualização do gráfico, onde poderá ser alterado zoom e pan;

e) fechamento do sistema.

Figura 13 – Diagrama de atividades

3.2.3 Diagrama de estados

Uma programação poderá ter um dos seguintes estados: programado, executando ou

produzido. Conforme pode ser visto na figura 14, o estado “programado” é atribuído ao

33

programar uma OP na produção. O estado “executando” é atribuído ao iniciar uma

programação na produção. Por fim, o estado “produzido” é atribuído ao finalizar uma

programação em estado “executando”, ou ao validar uma programação que está em estado

“programado”.

Figura 14 – Diagrama de estados

3.2.4 Diagrama de pacotes

Na figura 15 é ilustrado o diagrama de pacotes do sistema desenvolvido. O sistema foi

desenvolvido de forma que o gráfico das programações fosse totalmente independente da

aplicação. Todas as classes referentes ao gráfico das programações estão no pacote

graficoprogramacao, enquanto as classes do sistema estão no pacote producao. As classes

que podem ser vistas no pacote producao, são as interfaces do sistema. O pacote data contém

as classes que fazem recuperação e persistência no banco de dados. O pacote images contém

as imagens utilizadas nos botões das interfaces. E o pacote importacao contém as classes que

fazem a importação de dados do sistema de produção da empresa Multitherm. O pacote

graficoprogramacao e suas classes são apresentadas na seção 3.2.6.

Figura 15 – Diagrama de pacotes

34

3.2.5 Diagrama de classes do pacote data

O pacote data contém todas as classes necessárias para fazer recuperação e

persistência no banco de dados. A figura 16 ilustra o diagrama de classes do pacote data. A

classe DbConnection é utilizada para estabelecer uma conexão com o SGBD. Ela utiliza o

padrão de projeto Singleton (GAMMA, 1995, p. 127), para assim garantir uma única instância

e também neste caso, apenas uma única conexão com o SGBD. O pacote data contém outros

3 pacotes:

a) dao: as classes deste pacote utilizam o padrão de projeto Data Access Object

(DAO) (ALUR; CRUPI; MALKS, 2004, p. 416), com exceção da classe BaseDAO,

que herda todas as outras classes DAO. A classe BaseDAO contém funções que

facilitam a implementações das classes herdadas. Estas classes contém os métodos

que implementam os comandos SQL para recuperação e gravação de dados no

banco;

b) vo: as classes deste pacote utilizam o padrão de projeto Value Object (VO)

(FOWLER, 2003a). Estas classes não são herdadas de nenhuma outra classe e

contém apenas seus atributos e os métodos de recuperação e atribuição. Elas são

utilizadas na recuperação de dados do banco;

c) service: as classes deste pacote utilizam o padrão de projeto Session Facade

(ALUR; CRUPI; MALKS, 2004, p. 303). São nestas classes que são

implementadas as lógicas de negócio. No sistema desenvolvido, elas são usadas

para implementar a geração e programação de OPs.

Figura 16 – Diagrama de classes do pacote data

35

3.2.6 Diagrama de classes do pacote graficoprogramacao

A figura 17 ilustra o diagrama de classes do gráfico das programações. Neste diagrama

foram adicionados apenas os métodos e atributos relevantes para seu entendimento.

A classe GraficoProgramacao foi desenvolvida a fim de simplificar a utilização do

Gráfico das Programações. É através desta classe que são feitas as chamadas de funções para

acrescentar, excluir, validar programações, operações de zoom, pan, entre outras.

Basicamente, o sistema precisará instanciar apenas esta classe para manipular todo o gráfico

das programações.

GraficoProgListener, GraficoProgDrawer e GraficoProgOperation são as

principais classes do Gráfico das Programações. A classe GraficoProgListener implementa

as interfaces que contém os eventos da OpenGL, eventos de teclado, eventos de mouse e

também parte da manipulação interativa. Esta classe também possui os métodos para alteração

de zoom e pan. É no método display desta classe que devem ser enviados os comandos

OpenGL para a geração de desenhos desejados. Todas as rotinas que geram estes desenhos,

foram implementadas na classe GraficoProgDrawer. Estes desenhos são todos os gráficos

que podem ser vistos no gráfico das programações, como recursos de produção,

programações, escala de horas, etc. Parte do conteúdo a ser desenhado, como recursos da

produção e programações, precisam estar em alguma estrutura. Esta estrutura é acessada

através da classe GraficoProgOperation. Além de conter as estruturas, possui os métodos

para adicionar, excluir e alterar o seu conteúdo. Esta classe também possui instâncias de

outras classes que exercem diversas funções sobre o gráfico das programações. Estas classes e

suas respectivas funções são descritas a seguir.

A classe Shape possui as coordenadas e dimensões que são utilizadas para desenhar

uma barra horizontal no gráfico das programações. Esta classe é herdada por outras duas:

ShapeProg e ShapeIntervalo. ShapeProg é a representação gráfica de uma programação e

ShapeIntervalo é a representação gráfica de um intervalo de tempo não produtivo de um

recurso da produção. O tamanho horizontal de um ShapeProg é definido pelo tempo estimado

da programação. Este tempo estimado e demais informações da programação estão na classe

Programacao. Já o tamanho horizontal de um ShapeIntervalo é definido pelo seu tempo de

duração, que é encontrado na classe Intervalo. Sendo assim, todos os Shapes contidos no

gráfico das programações estarão em uma escala de tempo.

Pode-se imaginar a classe RecursoShapes como sendo uma linha horizontal do gráfico

36

das programações, onde cada linha possui um recurso da produção, uma lista de

programações e uma lista de intervalos não produtivos. É na classe Recurso que são

atribuídas informações como o seu código, descrição e índice a ser representado.

A classe LeftGenerator é uma classe muito importante utilizada pela

GraficoProgOperation. É nesta classe que é calculado a coordenada X de um Shape.

Também é usada na alteração de programação, para checar a seqüência correta na fila de

programações.

A classe ThreadAtualiza é utilizada para mover as programações que estão em

estado “executando”. A cada minuto as programações em execução são movidas para a

esquerda, respeitando assim o seu tempo de início em relação a escala de tempo.

Consequentemente, todas as programações posteriores às programações em execução também

deverão ser movidas para a esquerda.

A classe ThreadTooltip monitora a posição do mouse no gráfico das programações.

Caso o mouse permaneça posicionado mais de 500 milisegundos sobre uma programação,

então é disparado um evento para desenhar um tooltip. O tooltip contém informações da

programação, como número da OP, seqüência, tempo estimado, entre outros.

A classe HashShapeProg herda a classe HashMap e contém todos os ShapeProg

adicionados no gráfico. Ela é utilizada para facilitar a recuperação de objetos ShapeProg, já

que pode se recuperar um item através de uma chave. Neste caso, é utilizado como chave o

código da programação.

A classe LocalizaProgramacao é utilizada para auxiliar a localização de

programações no gráfico das programações. Ao localizar uma OP, são traçadas setas

indicando os relacionamentos das programações respectivas. O cálculo dos pontos necessários

para desenhar estas setas, é feito pela classe Arrow. A classe Arrow é uma adaptação do

código fonte de Coenen (2003). São passadas para a classe as coordenadas de início e fim do

segmento de reta e ela calcula as coordenadas da cabeça da seta. Sendo assim, estas

coordenadas são utilizadas para desenhar as setas que indicam o relacionamento entre as

programações.

Por fim, a classe GraficoProgTexture que é usada para carregar as texturas sobre as

programações. Texturas são imagens que poderão ser aplicadas sobre a representação gráfica

das programações. Esta classe utiliza três outras classes que estão no pacote texture:

BitmapLoader, TextureReader e ResourceRetriever. Estas três classes foram obtidas de

Eeckhoudt e Bezrati (2006) e fazem a leitura dos arquivos de textura.

37

Figura 17 – Diagrama de classes do pacote graficoprogramacao

38

3.2.7 Diagrama de entidade relacionamento

É ilustrado na figura 18, o diagrama de entidade relacionamento do banco de dados

utilizado no sistema desenvolvido. É neste banco de dados que são persistidos todos os dados

do sistema, como cadastro de recursos, etapas, processos, etc. Também são persistidas todas

as OPs geradas e programadas na produção.

Figura 18 – Diagrama de entidade relacionamento

Cada entidade ilustrada na figura 18, representa uma tabela no banco de dados. Estas

tabelas são:

a) recurso: contém todos recursos de produção cadastrados;

b) intervalo: contém todos os intervalos não produtivos cadastrados;

c) gruporecurso: contém todos os grupos de recurso cadastrados;

d) programacao: contém todas as programações do sistema, inclusive as finalizadas;

39

e) programacaopai: contém o código das programações antecessoras e sucessoras;

f) etapa: contém todas etapas cadastradas;

g) processo: contém todos processos cadastrados;

h) etapaprocesso: contém os dados que fazem a ligação da tabela etapa com a

tabela processo. Um processo pode conter várias etapas, assim como uma etapa

pode estar contida em vários processos;

i) op: contém todas as OPs geradas;

j) opetapa: contém os dados que fazem a ligação das tabelas op, etapa e

programacao. Os registros dessa tabela são inseridos ao gerar uma nova OP. A

tabela foi criada para manter a mesma ordem e quantidade de etapas pertencentes

ao processo, na situação em que é gerado a OP. Caso não fossem mantidas estas

informações, futuramente poderia ocorrer de o usuário alterar a ordem, ou inserir

novas etapas no processo. Sendo assim, perderia-se o histórico das etapas

executadas.

3.3 IMPLEMENTAÇÃO

Nas seções a seguir estão descritas as funcionalidades e implementações realizadas no

sistema.

3.3.1 Tela principal do sistema

A figura 19 ilustra a tela principal do sistema, utilizando o gráfico das programações.

As principais funções foram identificadas e numeradas na figura, sendo elas:

1) barra de menu: contém os menus Programação, Cadastro e Zoom. O menu

Programação contém as funções de manipulação das programações, sendo elas:

adicionar, excluir, validar, alterar e importar dados. O menu Cadastro contém os

itens que correspondem aos cadastros: grupo de recursos, recursos, etapa, processo

e intervalos. O menu Zoom contém os itens: Mais zoom, Menos zoom e Reset

zoom;

2) barra de botões: contém os botões das principais funções do sistema;

40

3) gráfico das programações: toda esta área abaixo da barra dos botões é desenhada

usando a OpenGL. Ela contém a lista de recursos da produção à esquerda e todas

as programações em sua área central;

4) hora atual: é representada por uma linha vermelha vertical e é atualizada a cada

minuto. Como pode ser visto, a hora atual no momento que foi gerada a figura 19,

era 18:00h;

5) escala de tempo: contém as horas e pontos a cada 15 minutos;

6) programação em estado “executando”;

7) localizar: deve ser informado uma OP na caixa de diálogo e pressionar a tecla enter

ou o botão Localizar para o sistema realçar todas as programações da OP

informada. Caso haja mais de uma programação, é possível navegar entre elas

pressionando novamente a tecla enter ou o botão Localizar para ir à próxima

programação. Também pode-se usar as teclas F5 a F8, que executam as respectivas

funções: primeira, anterior, próxima e última programação localizada;

8) programação em estado “produzido”;

9) recursos da produção: representa os equipamentos e mão-de-obra que a empresa

dispõe;

10) programações em estado “programado”.

Figura 19 – Tela principal do sistema

41

3.3.2 Técnicas e ferramentas utilizadas

O sistema desenvolvido neste trabalho foi implementado na linguagem Java. O gráfico

das programações utilizado no sistema, foi desenvolvido em OpenGL utilizando a biblioteca

JOGL para fazer a integração da linguagem Java com os drivers nativos da OpenGL. Para a

geração de interfaces gráficas foi utilizada a biblioteca Swing. Para a persistência dos dados

do sistema, foi utilizado o Sistema Gerenciador de Banco de Dados (SGBD) MySQL. Para o

desenvolvimento de todo o código fonte, foi utilizado o ambiente de desenvolvimento

Netbeans 5.5 (NETBEANS COMMUNITY, 2006).

Foram utilizados na implementação, os seguintes padrões de projeto:

a) Singleton (GAMMA, 1995, p. 127): utilizado na classe GraficoProgramacao,

para que a aplicação não precise criar várias instâncias, ou passar uma instância

para várias partes do sistema. Basta utilizar seu método getInstance para obter a

sua única instância;

b) Value Object (VO) (FOWLER, 2003a): também conhecido como Data Transfer

Object (DTO) (FOWLER, 2003b) ou Transfer Object (TO) (ALUR; CRUPI;

MALKS, 2004, p. 374), são classes que possuem apenas seus atributos e métodos

para atribuir e recuperar os valores dos atributos. No sistema desenvolvido, as

classes VO são utilizadas no retorno de métodos das classes DAO;

c) Data Access Object (DAO) (ALUR; CRUPI; MALKS, 2004, p. 416): é uma

camada que abstrai e encapsula o acesso a uma fonte dados, possibilitando assim,

ser feito a gravação e recuperação de dados apenas por classes DAO. No sistema

desenvolvido, as classes DAO possuem métodos que executam comandos SQL via

Java Database Connectivity (JDBC) para gravar e recuperar dados de um banco de

dados;

d) Facade (GAMMA, 1995, p. 185): classes facade tem a finalidade de abstrair

classes mais complexas. Uma classe que usa esse padrão no sistema desenvolvido,

é a GraficoProgramacao. Esta classe possui métodos que acessam métodos de

outras classes, a fim de facilitar a utilização do gráfico das programações no

sistema desenvolvido;

e) Session Facade (ALUR; CRUPI; MALKS, 2004, p. 303): é uma camada que

encapsula as regras de negócio. No sistema desenvolvido, as classes que utilizam

esse padrão são chamadas de Service.

42

3.3.3 Gráfico das Programações

O gráfico das programações é um conjunto de classes totalmente independente do

sistema desenvolvido. Para a sua utilização, o sistema apenas instancia um componente

chamado GLCanvas e uma classe chamada GraficoProgramacao, que foi apresentada na

especificação.

Nas próximas seções são apresentados detalhes da implementação do gráfico das

programações.

3.3.3.1 Definição dos universos OpenGL

Para poder criar uma área de desenho em OpenGL, deve-se que definir dois

parâmetros: window e viewport. Uma window é a definição do universo a ser trabalhado, ou

seja, a porção do plano cartesiano que será trabalhada. A viewport é a definição da área no

monitor, em que esta window será apresentada.

No desenvolvimento deste trabalho, optou-se usar 5 windows com suas respectivas

viewports. Conforme pode ser verificado na figura 20, são elas:

1) título das lista de recursos da produção, que contém apenas o texto “Recursos /

Hora”;

2) escala de tempo, que está no topo do gráfico;

3) tooltip das programações, também conhecido como hint, é uma caixa de

informações que é mostrada ao posicionar o cursor do mouse sobre uma

programação. Esta viewport é apresentada sobre a viewport da lista das

programações. Foi utilizada uma nova viewport porque o tooltip não deve mudar

de tamanho ao executar as operações de zoom in e zoom out no gráfico das

programações. O tooltip possuirá sempre as mesmas dimensões;

4) lista de recursos da produção, que está no lado esquerdo do gráfico das

programações;

5) lista das programações, que é toda a área central do gráfico, onde são representadas

as programações e é feito a manipulação interativa sobre elas.

43

Figura 20 – Viewports utilizadas no gráfico das programações

No quadro 3 é ilustrado o código fonte do método display da classe

GraficoProgramacaoListener. Neste método são definidas as windows, viewports e

chamados os métodos da classe GraficoProgramacaoDrawer que desenham os objetos na

tela.

44

public void display(GLAutoDrawable gLAutoDrawable) {

GL gl = gLAutoDrawable.getGL();

gl.glClear(GL.GL_COLOR_BUFFER_BIT);

this.gl = gl;

//glViewPort: define viewport

//glu.gluOrtho2D: define window

//Título Recursos

gl.glViewport(0, height-heightRegua, widthRecursos, heightRegua);

gl.glMatrixMode(GL.GL_PROJECTION);

gl.glLoadIdentity();

glu.gluOrtho2D(getRecursosLeft(),getRecursosRight(),getReguaBottom(),getReguaTop());

drawer.drawTituloRecursos(gl);

//Recursos

gl.glViewport(0, 0, widthRecursos, height-heightRegua);

gl.glMatrixMode(GL.GL_PROJECTION);

gl.glLoadIdentity();

glu.gluOrtho2D(getRecursosLeft(),getRecursosRight(),getWinBottom(),getWinTop());

drawer.drawRecursos(gl);

//Régua (escala de tempo)

gl.glViewport(widthRecursos, height-heightRegua, width-widthRecursos, heightRegua);

gl.glMatrixMode(GL.GL_PROJECTION);

gl.glLoadIdentity();

glu.gluOrtho2D(getWinLeft(),getWinRight(),-heightRegua, heightRegua);

drawer.drawRegua(gl);

//Programações

gl.glViewport(widthRecursos, 0, width-widthRecursos, height-heightRegua);

gl.glMatrixMode(GL.GL_PROJECTION);

gl.glLoadIdentity();

glu.gluOrtho2D(getWinLeft(),getWinRight(),getWinBottom(),getWinTop());

if (mousePress != null) {

double[] wcoords = getWindowCoordinatesByMouse(gl,mousePress);

drawer.getOperations().setShapeProgPressed(wcoords);

drawer.getOperations().setShapeProgDrag(wcoords);

}

drawer.drawDivRecursos(gl);

drawer.drawProgramacoes(gl);

drawer.drawIntervalos(gl);

drawer.drawArrowsLocaliza(gl);

drawer.drawLinhaHoraAtual(gl);

//Tooltip

if (showTooltip && (mouseMove != null) && (mousePress == null)) {

double[] wcoords = getWindowCoordinatesByMouse(gl,mouseMove);

int x=(int)wcoords[0],y=(int)wcoords[1];

ShapeProg shapeProg = drawer.getOperations().getShapeProg(x, y);

if (shapeProg != null) {

gl.glViewport(

mouseMove.getX(),

height-mouseMove.getY()-(int)drawer.getHeightTooltip(),

(int)drawer.getWidthTooltip(),

(int)drawer.getHeightTooltip());

gl.glMatrixMode(GL.GL_PROJECTION);

gl.glLoadIdentity();

glu.gluOrtho2D(

drawer.getLeftTooltip(),

drawer.getRightTooltip(),

drawer.getBottomTooltip(),

drawer.getTopTooltip());

drawer.drawShapeTooltip(gl, shapeProg);

}

}

}

Quadro 3 – Código fonte que define as windows, viewports e chama funções de desenho

45

3.3.3.2 Adicionar programação

A operação de adicionar programação é utilizada para adicionar uma nova

representação gráfica de uma programação. Para adicionar uma nova programação, deve ser

informado o recurso de produção e qual a seqüência na fila de programações. Esta seqüência

não poderá ser anterior às programações pai. Entende-se que programações pai são todas as

programações da OP, antecessoras à programação corrente.

3.3.3.3 Excluir programação

A exclusão de programações é utilizada para remover uma ou mais programações, para

que elas possam ser novamente acrescentadas em outra oportunidade. Ao excluir uma

programação, todas as programações filhas serão recursivamente excluídas. Entende-se que

programações filhas são todas as programações da OP, sucessoras à programação corrente.

3.3.3.4 Validar programação

A validação de programações consiste em remover uma ou mais programações, a fim

de informar ao sistema que a programação já foi iniciada e finalizada pela produção. Ao

validar uma programação, todas as programações pai serão recursivamente validadas.

3.3.3.5 Alterar programação

A alteração de programação consiste em alterar a programação de recurso e/ou de

seqüência na fila de programações. Portanto, ao alterar uma programação há algumas regras a

serem respeitadas:

a) uma programação só poderá ser alterada de recurso de produção, se o recurso de

destino pertencer ao mesmo grupo de recurso da posição de origem. A função do

grupo de recurso é detalhada na seção 3.3.4.1;

b) se alterar para uma seqüência menor e houver uma programação pai, então a

46

seqüência não poderá ser menor que a seqüência relacionada ao término da

programação pai. A figura 21 exemplifica esta situação, onde a programação

circulada não poderá ser alterada para uma seqüência anterior à linha que indica o

limite;

Figura 21 – Limite da programação pai na alteração de programação

c) se alterar para uma seqüência maior e tiver programações filhas no recurso de

destino, então a seqüência não poderá ser maior que da programação filha. A figura

22 exemplifica esta situação, onde a programação circulada não poderá ser alterada

para uma seqüência posterior à linha que indica o limite;

Figura 22 – Limite da programação filha na alteração de programação

d) se alterar para uma seqüência maior e não tiver programações filhas no recurso de

destino e tiver programações filhas em outros recursos que estão anteriores à

seqüência de destino, então estas programações deverão ser alteradas para

seqüências que estejam após a programação pai alterada. As figuras 23 e 24

exemplificam esta situação. A figura 23 identifica a programação a ser alterada e a

figura 24 ilustra a situação após ser feita a alteração da programação. Na figura 24

pode ser visualizado as programações filhas alteradas automaticamente. As setas

ilustram a seqüência de origem para destino.

47

Figura 23 – Alteração automática de programações filhas

Figura 24 – Programações filhas alteradas automaticamente

3.3.3.6 Executar programação

Consiste em alterar o estado da programação de “programado” para “executando”. Ao

executar uma programação, caso não esteja na primeira posição da fila, ela será alterada para

a primeira posição e então a cada minuto é atualizado a sua posição na tela. A sua posição de

início estará de acordo com a escala de tempo, que pode ser visualizada no topo do gráfico

das programações.

3.3.3.7 Finalizar programação

É a operação feita para finalizar uma programação que está executando. Ela deve ser

executada pelo sistema ao terminar uma etapa do processo no recurso. Ao finalizar a

programação, o seu tamanho não será mais ajustado, assim representando na escala de tempo

a hora que foi iniciada e finalizada.

48

3.3.3.8 Localizar programação

A localização de programações pode ser feita de duas formas: Localização por OP ou

por data de entrega em atraso. Na localização por OP, é informado o seu número e assim são

realçadas no gráfico todas suas respectivas programações. Também são traçadas setas que

representam os relacionamentos das programações. As setas oferecem uma visão clara do

fluxo da OP, ou seja, informa por quais recursos a OP passará e quais são as programações

sucessoras e antecessoras. A figura 25 ilustra a localização de programações de uma OP.

Neste exemplo são localizadas as programações da OP de número 3.

Figura 25 – Localização de programações de uma OP

Para fazer a localização por data de entrega em atraso, basta chamar seu respectivo

método. Serão realçadas no gráfico, todas as programações em que seu tempo estimado de

término ultrapasse a data de entrega fornecida ao gerar a OP. Assim é passado ao usuário uma

visão clara das programações que estão em atraso. Caso seja possível, o usuário poderá alterar

interativamente as programações, de forma que possa ser produzido dentro de seu prazo de

entrega.

49

3.3.3.9 Intervalos não produtivos

Os intervalos não produtivos são intervalos de tempo em que o recurso da produção

permanece sem executar processos. Na prática, este intervalo poderia ser um feriado, ou um

recurso em manutenção ou até mesmo um horário em que o recurso não é utilizado para

produção. Uma programação que estiver dentro de um intervalo não produtivo é

automaticamente alterado o seu tempo de término para a soma do tempo estimado de início,

com o tempo do intervalo. A figura 26 ilustra uma fila de programações sem intervalos,

enquanto na figura 27, foram adicionados intervalos para todos os recursos, das 19:00h às

21:00h. Os intervalos são representados em uma barra vertical, na cor amarelo transparente.

Pode-se ver que o tempo estimado de término das programações que possuem intervalo ficou

maior. Neste exemplo foram adicionados intervalos para todos os recursos, mas também é

possível adicionar intervalos individuais para cada recurso da produção.

Figura 26 – Programações sem intervalo

Figura 27 – Programações com intervalos das 19:00h às 21:00h

50

3.3.3.10 Manipulação Interativa

Manipulação interativa são as funções que podem ser aplicadas às programações

diretamente no gráfico das programações. As funções para excluir, validar, alterar, executar,

finalizar e localizar programações, podem ser feitas ao clicar com o botão direito sobre a

programação. Ao clicar com o botão direito é aberto um menu popup com as respectivas

funções, como pode ser verificado na figura 28.

Figura 28 – Menu popup das programações

Outro recurso de manipulação interativa é o arrasto de programações com o mouse,

também conhecido como drag & drop. Este recurso é utilizado para fazer a alteração de

programações. Para alterar uma programação, basta arrastá-la até a seqüência desejada ou

para o recurso de produção desejado. O gráfico somente deixará arrastar uma programação

para recursos pertencentes ao mesmo grupo de recurso da programação a ser alterada.

3.3.3.11 Alinhamento de programações

Alinhar uma programação significa não deixar que uma programação filha seja

representada antes do término de suas programações pai. Este alinhamento ocorre nos

seguintes casos:

a) ao abrir o sistema: todas as programações são carregadas e alinhadas;

b) após executar as operações: acrescentar, excluir, validar, executar e finalizar;

c) pela ThreadAtualiza: a cada minuto as programações em execução devem

mover-se para a esquerda, respeitando assim o seu tempo de início em relação a

escala de tempo. Como essa operação afeta as programações que estão atrás destas

programações que estão em execução, então deve-se alinhar todas estas

programações que foram afetadas.

51

3.3.3.12 Zoom

Uma operação de zoom consiste em visualizar um objeto ou conjunto de objetos mais

de perto (zoom in) ou mais afastado (zoom out). Essas operações de zoom foram

implementadas no gráfico das programações. Utilizando a operação zoom out pode-se

visualizar programações de um período maior sem precisar “rolar” a tela. Utilizando a

operação de zoom in pode-se voltar ao estado inicial, ou então ser ajustado conforme a

necessidade do usuário.

3.3.3.13 Pan

A operação de pan consiste em deslocar a janela de visualização de tal maneira que o

usuário consiga visualizar diferentes partes do universo. Ao deslocar o eixo X para mais ou

para menos, estamos respectivamente visualizando as programações posteriores ou anteriores.

Ao deslocar o eixo Y para mais ou para menos, conseguimos visualizar os primeiros ou

últimos recursos da produção cadastrados, com suas respectivas programações. No gráfico das

programações a operação de pan pode ser feita através das setas do teclado.

3.3.3.14 Técnicas de visualização

A fim de tornar o gráfico de programações uma interface amigável, foram utilizadas

algumas técnicas de visualização:

a) bordas arredondadas: conforme pode ser verificado na figura 29, foram traçados

quadrantes de círculo nas bordas dos recursos de produção e das programações;

Figura 29 – Recursos e programações com bordas arredondadas

b) antialiasing: é um recurso oferecido pela OpenGL, que suaviza linhas e polígonos.

52

Na figura 29 o recurso está habilitado, enquanto na figura 30 foi desabilitado o

recurso de antialiasing. Pode-se notar uma imperfeição no arrendamento das letras

e das bordas dos recursos e programações;

Figura 30 – Recursos e programação com recurso de antialiasing desabilitado

c) transparência: é um recurso oferecido pela OpenGL onde pode-se configurar o

nível de opacidade de linhas e polígonos. A figura 31 exemplifica a utilização de

transparência. Observa-se que as programações da OP 2 e o tooltip estão utilizando

transparência;

Figura 31 – Utilização de transparência

d) degradê: o efeito é utilizado na cor de fundo de vários componentes do gráfico,

como na pintura de fundo dos recursos da produção, no tooltip e nas programações;

e) texturas: o efeito é utilizado para aplicar uma imagem sobre a programação. Este

recurso facilita a identificação de programações. Um exemplo a ser usado em

indústrias de beneficiamento têxtil, poderia ser a identificação do tipo do tecido,

como malha ou jeans, com suas respectivas cores. A figura 32 ilustra um exemplo

de programações utilizando o recurso de textura.

53

Figura 32 – Utilização de texturas

3.3.3.15 Otimizações de renderização

Durante o desenvolvimento do trabalho, notou-se que o gráfico das programações

possuía uma lentidão ao renderizar objetos. O problema ocorria apenas quando haviam muitas

programações. A causa da lentidão era a quantidade de comandos que eram enviados para a

placa gráfica. Estavam sendo enviados os comandos para gerar todas as programações,

inclusive as que não eram visualizadas na tela. Para solucionar o problema, foram

desenvolvidas rotinas que checam se o objeto está dentro de sua window. Caso o objeto esteja

fora da window, ou seja, não é visualizado pelo usuário, então os comandos para gerar esse

objeto não são enviados para a placa gráfica. Com esta alteração, o problema foi resolvido.

Outra causa de lentidão foi o arredondamento dos cantos dos shapes que representam

as programações. Ao utilizar uma operação de zoom out serão feitos mais cálculos e enviados

mais coordenadas à placa gráfica. Ao executar muitas operações seguidas de zoom out, a

quantidade de cálculos para gerar o traçado dos quadrantes de círculo era grande, o que

causava lentidão. A solução encontrada foi otimizar o desenho do arredondamento do shape.

Foi definido um limite de quantidade de operações zoom out para traçar os quadrantes de

círculo nos shapes. A partir deste limite, não será mais traçado o quadrante de círculo, mas

sim apenas uma reta. Nestas situações de zoom out os gráficos estarão em um tamanho

pequeno, então a troca do arredondamento pela reta é praticamente imperceptível. O quadro 4

mostra o código fonte utilizado para geração do arredondamento dos shapes. A função

54

drawRoundBorderShape é utilizada para desenhar todos os shapes utilizados no gráfico das

programações. É utilizado a função drawCircleQuadrant para fazer os cantos arredondados

ou a função drawLine para substituir o arredondamento por uma reta. private void drawRoundBorderShape(GL gl, float left, float right, float top, float bottom, int vlRound,

boolean flRoundOtimized, float vlTransparency, float vlDegrade, float rgbIn[], float rgbBorder[], int

texture) {

gl.glColor4f(1.0f, 1.0f, 1.0f, vlTransparency);

float width = right-left;

float height = top-bottom;

for (int i=0; i<2; i++) { //0=interior / 1=borda

if (i == 0) {

if (texture != 0) {

gl.glBindTexture(GL.GL_TEXTURE_2D, texture);

gl.glEnable(GL.GL_TEXTURE_2D);

} else

gl.glColor4f(rgbIn[0], rgbIn[1], rgbIn[2], vlTransparency);

gl.glBegin(GL.GL_POLYGON); //interior

} else {

gl.glColor4f(rgbBorder[0], rgbBorder[1], rgbBorder[2], vlTransparency);

gl.glBegin(GL.GL_LINE_LOOP); //borda

}

//parte de cima do shape:

if (flRoundOtimized) { //substitui arredondanento por reta:

drawLine(gl, left, top-vlRound, left+vlRound, top, 0, 0);

drawLine(gl, right-vlRound, top, right, top-vlRound, width/widthTexture, 0);

} else { //cantos arredondados:

drawCircleQuadrant(gl, left, top, width, height, vlRound, 2);

drawCircleQuadrant(gl, right, top, width, height, vlRound, 1);

}

if ((i == 0) && (texture == 0)) //faz o degradê:

gl.glColor4f(rgbIn[0]-vlDegrade, rgbIn[1]-vlDegrade, rgbIn[2]-vlDegrade, vlTransparency);

//parte de baixo do shape: (deve ser feito assim por causa do degradê)

if (flRoundOtimized) { //substitui arredondanento por reta:

drawLine(gl, right, bottom+vlRound, right-vlRound, bottom,

width/widthTexture, height/heightTexture);

drawLine(gl, left+vlRound, bottom, left, bottom+vlRound, 0, height/heightTexture);

} else { //cantos arredondados:

drawCircleQuadrant(gl, right, bottom, width, height, vlRound, 4);

drawCircleQuadrant(gl, left, bottom, width, height, vlRound, 3);

}

gl.glEnd();

if ((i == 0) && (texture != 0))

gl.glDisable(GL.GL_TEXTURE_2D);

}

}

private void drawLine(GL gl, float x1, float y1, float x2, float y2, float xTexture, float yTexture) {

gl.glTexCoord2d(xTexture, yTexture); //coordenadas da textura

gl.glVertex2f(x1, y1); //coordenadas da linha

gl.glVertex2f(x2, y2);

}

private void drawCircleQuadrant(GL gl, float x, float y, float widthRect, float heightRect, int widthRaio,

int vlQuadrant) {

float rp, xp, yp; //point coords

float xRaio = x;

float yRaio = y;

int angIni = 90 * vlQuadrant;

int angFim = angIni - 90;

if ((vlQuadrant == 1) || (vlQuadrant == 2)) yRaio -= widthRaio;

if ((vlQuadrant == 1) || (vlQuadrant == 4)) xRaio -= widthRaio;

if ((vlQuadrant == 2) || (vlQuadrant == 3)) xRaio += widthRaio;

if ((vlQuadrant == 3) || (vlQuadrant == 4)) yRaio += widthRaio;

for (int ang = angIni; ang >= angFim; ang -= 30) {

rp = (ang * (float)Math.PI) / 180.0f;

xp = xRaio + (float)(widthRaio * Math.cos(rp));

yp = yRaio + (float)(widthRaio * Math.sin(rp));

gl.glTexCoord2d( //coordenadas da textura

getTextCoordX(x, xp, widthRect, vlQuadrant),

getTextCoordY(y, yp, heightRect, vlQuadrant));

gl.glVertex2d(xp,yp); //coordenadas do quadrante

}

}

Quadro 4 – Rotinas usadas para desenhar os shapes com cantos arredondados

55

3.3.4 Sistema de programação de produção

O sistema foi desenvolvido utilizando o gráfico das programações descrito

anteriormente. Neste sistema é possível criar processos, programá-los na produção, iniciar e

finalizar estas programações, podendo assim ser feito um planejamento e acompanhamento de

tudo o que está sendo produzido e o que ainda deve ser feito pela produção.

Todas as telas de cadastro do sistema são herdadas de uma tela padrão de cadastro.

Esta tela padrão é apresentada na figura 33. Na barra de botões pode ser visto os botões de

novo registro, salvar, excluir e desfazer.

Figura 33 – Tela padrão de cadastro

Nas próximas seções são descritas algumas das funcionalidades do sistema.

3.3.4.1 Cadastro de grupo de recursos

Os grupos de recursos são classificações para os recursos da produção. Esta

classificação é utilizada no cadastramento de etapas e na programação, para saber em quais

recursos as etapas poderão ser programadas. Exemplificando, uma lavanderia poderá ter

várias máquinas de lavar. Cada máquina é um recurso e todas poderão ser classificadas como

o grupo de recurso “Lavadoras”. Sendo assim, uma etapa cadastrada para o grupo

“Lavadoras” obviamente deverá ser programada para máquinas do grupo “Lavadoras”. Esta

mesma etapa jamais poderá ser programada em grupos “Centrífuga” ou “Secador”.

56

3.3.4.2 Cadastro de recursos

É o cadastro de todos os recursos da produção. Estes recursos poderão ser

equipamentos ou mão-de-obra. Exemplificando, em uma tinturaria os equipamentos poderiam

ser as máquinas de tingir, centrífugas, secadores, etc. Um dos recursos de mão-de-obra

poderia ser o controle de qualidade, que são pessoas que inspecionam se o tecido foi tingido

corretamente.

3.3.4.3 Cadastro de etapas

Uma etapa é parte de um processo a ser feito na produção. No sistema desenvolvido,

deve ser informado o grupo de recurso que a etapa pertence, o seu nome e seu tempo estimado

de duração.

3.3.4.4 Cadastro de processos

Um processo é um agrupamento de uma ou mais etapas a fim de produzir um

determinado produto. Um exemplo de processo de uma lavanderia, poderia ser composto

pelas seguintes etapas: lavar, centrifugar e secar. Para cadastrar um novo processo, dever ser

informado o seu nome e quais etapas compõem este processo.

3.3.4.5 Cadastro de intervalos não produtivos

É a interface onde são cadastrados os períodos de tempo em que os recursos ficarão

sem produzir. Para cadastrar um intervalo, deve ser informado o recurso, a hora de início e

hora de fim do intervalo.

57

3.3.4.6 Geração de OP

Uma OP é um processo a ser feito pela produção. No sistema desenvolvido, a OP é

representada por um número seqüencial. Para gerar uma nova OP, deve ser informado o

processo, sua data de entrega e a quantidade de itens a ser produzido. Opcionalmente, pode-se

informar uma cor ou uma imagem de textura. Esta cor ou textura será utilizada na

representação gráfica das OPs programadas.

3.3.4.7 Adicionar programação

É uma interface que lista todas as OPs geradas e ainda não programadas, tendo como

finalidade programar estas OPs. Ao selecionar uma OP, é listado seu processo e a primeira

respectiva etapa que ainda não foi programada. Para programar esta etapa, deve ser

selecionado o recurso da produção, a seqüência desejada na fila de programações e a

quantidade de itens a ser programado. Pode-se acrescentar várias programações dessa etapa,

até que atinja a quantidade de itens da OP. Esta função pode ser usada quando a quantidade de

itens da OP é muito grande para ser executada em um determinado recurso. Pode-se assim,

programar várias partes desta OP em um ou mais recursos.

3.3.4.8 Localizar programação

No sistema desenvolvido, as funções para localizar programações podem ser acessadas

das seguintes formas:

a) localização de programações de uma OP: pode ser acessada pela caixa de diálogo

da tela principal ou ao clicar com o botão direito sobre a programação, item

Localizar e item Programações desta OP;

b) localização de programações em atraso: deve ser clicado com o botão direito sobre

a programação, item Localizar e item Programações em atraso.

58

3.3.4.9 Importação de dados do Sistema de Produção da Empresa Multitherm

Foi implementada uma função que importa os recursos de produção e programações do

sistema de produção da Multitherm. Ao executar a função, são carregados no gráfico todos os

recursos de produção e programações do sistema da Multitherm. Com esta função, torna-se

mais fácil a comparação dos tempos de carregamento e alinhamento de programações dos

dois sistemas. Para fazer esta importação, basta informar o caminho, usuário e senha do banco

de dados do sistema da Multitherm. Esta função é acessada através da tela principal do

sistema, no menu Programação, item Importar e item Recursos e programações do

sistema de produção Multitherm.

Nesta versão do sistema, os dados importados não são persistidos no banco de dados.

São usados apenas para fins de consulta e para testar a manipulação interativa.

3.4 RESULTADOS E DISCUSSÃO

Foram executados testes de desempenho no sistema de produção da Multitherm e no

sistema desenvolvido neste trabalho. A tabela 1 contém o resultado de testes efetuados com

3000 programações. Os valores da tabela 1 são expressos em segundos. Conseguiu-se no

trabalho desenvolvido um melhor desempenho em relação ao sistema da Multitherm. Os

testes foram efetuados em um computador com 1 GB de memória RAM e processador AMD

Athlon XP 2500+ de 1833 MHz.

Tabela 1 – Comparação de desempenho

Desempenho Multitherm X TCC Multitherm TCC Carregamento Alinhamento Carregamento Alinhamento

Teste 1 38,687 s 7,847 s 1,688 s 0,031 s Teste 2 39,250 s 8,125 s 1,484 s 0,015 s Teste 3 38,954 s 7,685 s 1,453 s 0,016 s Média 38,963 s 7,885 s 1,541 s 0,020 s

É apresentado no quadro 5, a comparação de recursos e funções disponíveis no gráfico

das programações do sistema de produção da Multitherm e do sistema desenvolvido. Já no

quadro 6, é feito a comparação de funções gerais dos dois sistemas.

59

Multitherm X TCC Multitherm TCC

Pan Sim Sim Zoom Não Sim Transparência Não Sim Aplicação de cores Sim Sim Aplicação de textura Não Sim Manipulação interativa Sim Sim Localização de programações Sim Sim Setas na localização de programação Não Sim Intervalos não produtivos Sim Sim Barras de rolagem Sim Não

Quadro 5 – Comparação de recursos do gráfico das programações

Multitherm X TCC Multitherm TCC

Portável Não Sim Comunicação com controladores de processo Sim Não Comunicação com coletores de dados Sim Não

Quadro 6 – Comparação de recursos do sistema

O sistema desenvolvido mostrou-se portável, executando com facilidade nos seguintes

sistemas operacionais: Microsoft Windows XP SP2; Apple Mac OS X; Linux openSUSE

10.2. A figura 34 ilustra a execução do sistema no Linux openSUSE 10.2.

Figura 34 – Execução do sistema no Linux openSUSE 10.2

60

4 CONCLUSÕES

O aumento da competitividade das indústrias faz com que a responsabilidade dos

setores de PCP seja cada vez maior. É este o setor responsável por planejar uma boa

produtividade e cumprir as datas de entrega prometidas aos clientes. Produtividade e

comprometimento com a entrega dos produtos são fatores essenciais para o sucesso de

qualquer indústria. Torna-se assim indispensável para os setores de PCP, a utilização de um

sistema de programação de produção que possa auxiliá-los nestas tarefas.

O sistema de programação de produção desenvolvido, oferece os benefícios de

controlar as OPs para que sejam produzidas dentro de seu prazo estimado e a possibilidade de

diminuir tempos ociosos de recursos, aumentando assim a produtividade da empresa.

Benefícios estes, alcançados devido a clara representação das OPs programadas no gráfico das

programações desenvolvido.

Para a especificação do sistema, utilizou-se a ferramenta Enterprise Architect (SPARX

SYSTEMS, 2007), que mostrou-se objetiva e funcional. Para a implementação de todo código

fonte, foi utilizada a ferramenta Netbeans 5.5, que se mostrou estável e muito eficiente

durante o desenvolvimento dos códigos Java. Embora não tenham sido utilizados plugins para

a criação de interfaces, o Swing mostrou-se fácil de ser utilizado, ágil e com geração de bons

gráficos, o que ajuda no resultado de um ambiente amigável.

O foco principal do desenvolvimento do sistema, que foi a utilização da OpenGL,

mostrou-se uma poderosa API para o desenvolvimento de aplicações gráficas. Seus recursos

possibilitaram o desenvolvimento de uma interface com recursos superiores ao dos trabalhos

correlatos, além de permitir um grande ganho de desempenho em relação ao sistema da

Multitherm, conforme apresentado na seção 3.4. A expectativa inicial era de que apresentasse

resultados melhores em comparação ao sistema da Multitherm, implementado em Delphi, o

que foi confirmado ao final do trabalho.

Conseguiu-se com a OpenGL a geração de gráficos de melhor qualidade. Seus recursos

facilitaram a implementação de funções como pan, zoom, transparência, aplicação de texturas,

tudo isso combinado com um desempenho computacional favorável. Porém, cabe ressaltar

que para obtenção de uma melhor qualidade de desenho dos objetos em comparação com os

trabalhos correlatos, houve um grande esforço de desenvolvimento e conseqüentemente um

grande tempo dedicado, devido a OpenGL oferecer apenas um conjunto de primitivas

gráficas, como pontos, linhas e polígonos.

61

Em comparação com os sistemas de programação de produção estudados, pode-se

dizer que a representação gráfica do sistema desenvolvido é superior. O gráfico das

programações dos sistemas conhecidos são simples, possuindo poucos recursos de

visualização e manipulação tais como pan, zoom, drag & drop e outros, o que as tornam

interfaces pouco amigáveis. No sistema desenvolvido, o desempenho da geração do gráfico

das programações é extremamente rápido, já no sistema de produção da Multitherm, esta é

uma das suas grandes deficiências.

Também não são conhecidos sistemas de programação de produção multiplataforma.

Esta é uma das vantagens do sistema desenvolvido, podendo executar em diferentes tipos de

hardware, como da Apple ou em opções alternativas de sistema operacional, como o Linux e

o Mac OS X.

4.1 EXTENSÕES

O autor deste trabalho é o principal desenvolvedor do sistema de produção da empresa

Multitherm. Tendo em vista melhorar as deficiências deste sistema, optou-se neste trabalho

desenvolver um novo sistema visando solucionar estas deficiências, como desempenho,

interface amigável, operação de zoom, portabilidade, etc.

Pretende-se continuar desenvolvendo este sistema, a ponto de poder substituir o atual

sistema de produção da empresa Multitherm. Algumas modificações a serem feitas para que

esta migração se torne possível, são:

a) recuperação e persistência no banco de dados: deverá ser alterado para ler e gravar

dados no banco de dados do sistema da Multitherm;

b) comunicação com controladores de processo da Multitherm: os controladores de

processo são equipamentos que executam programas de lavação ou de tingimento.

São respectivamente utilizados por lavanderias industriais ou tinturarias. Um

exemplo simples de um programa de lavação poderia ser: carregar, encher,

adicionar produto detergente, ligar motor, tempo 10 minutos, soltar banho e

descarregar. Estes programas são criados por outro módulo do sistema da

Multitherm e enviados pelo sistema de produção. O sistema desenvolvido neste

trabalho, também deverá enviar estes programas para os controladores. Ao enviar

um programa para o controlador a programação é iniciada. Ao finalizar o programa

62

no controlador, o sistema é informado e assim finaliza a programação no gráfico

das programações;

c) comunicação com coletores de dados: os coletores de dados são utilizados para

informar o início e fim de programações em recursos da produção que não

possuem controladores de processo. São utilizados por exemplo em centrífugas,

secadores, controle de qualidade, etc. Ao iniciar uma programação no coletor de

dados, deverá comunicar com o sistema de programação de produção para iniciar a

programação no gráfico das programações, assim como é feito no atual sistema da

Multitherm. O mesmo procedimento é utilizado para informar a finalização de uma

programação.

63

REFERÊNCIAS BIBLIOGRÁFICAS

AGUIAR, Maurício. Gerenciando objetivamente os projetos com function points e PSM. [Rio de Janeiro], 2003. Disponível em: <http://www.metricas.com.br/Downloads/Apresentacao_PMI-Rio_2003-06-13.pdf>. Acesso em: 14 set. 2006.

ALUR, Deepak; CRUPI, John; MALKS, Dan. Core J2EE Patterns: as melhores práticas e estratégias de design. Tradução Altair Dias Caldas de Morais. 2. ed. Rio de Janeiro: Elsevier, 2004.

BRITO, Rodrigo G. F. A. Planejamento programação e controle da produção. 2. ed. São Paulo: Instituto IMAM, 2000.

BURBIDGE, John L. Planejamento e controle da produção. Tradução Luiz Henrique da Silva Cruz. 2. ed. São Paulo: Atlas, 1988.

COENEN, Franz. Line drawing applets. Liverpool, 2003. Disponível em: <http://www.csc.liv.ac.uk/~frans/COMP101/AdditionalStuff/Applets/moreApplets.html>. Acesso em: 20 mar. 2007.

COHEN, Marcelo; MANSSOUR, Isabel H. OpenGL: uma abordagem prática e objetiva. São Paulo: Novatec, 2006.

COLLABNET INC. Welcome to the JOGL API Project! [S.l.], 2006a. Disponível em: <https://jogl.dev.java.net>. Acesso em: 10 set. 2006.

______. Jogl: user's guide. [S.l.], [2006b?]. Disponível em: <https://jogl.dev.java.net/nonav/source/browse/*checkout*/jogl/doc/userguide/index.htm>. Acesso em: 26 out. 2006.

DAVIS, Mark M.; AQUILANO, Nicholas J.; CHASE, Richard B. Fundamentos da administração da produção. Tradução Eduardo D’Agord Schaan. 3. ed. Porto Alegre: Bookman, 2001.

EECKHOUDT, Pepijn V.; BEZRATI, Abdul. Pepe & Lizzie’s adventures: nehe Java ports. [S.l.], 2006. Disponível em: <http://pepijn.fab4.be/nehe/nehe-source.zip>. Acesso em: 17 abr. 2007.

FOWLER, Martin. Analysis pattern: value object. Chicago, [2003a?]. Disponível em: <http://www.martinfowler.com/ap2/valueObject.html>. Acesso em: 31 maio 2007.

64

______. P of EAA: data transfer object. Chicago, [2003b?]. Disponível em: <http://www.martinfowler.com/eaaCatalog/dataTransferObject.html>. Acesso em: 31 maio 2007.

GAMMA, Erich et al. Design patterns: Elements of reusable object-oriented software. [S.l.]: Addison-Wesley, 1995.

GROUCHNIKOV, Kirill. Proposal for common "feel" layer in look-and-feel libraries. [S.l.], 2006. Disponível em: <http://weblogs.java.net/blog/kirillcool/archive/2006/05/index.html>. Acesso em: 19 abr. 2007.

LOFFI, Marcelo. Protótipo de sistema de controle da utilização de recursos para produção das indústrias de manufatura. 1999. 70 f. Trabalho de Conclusão de Curso (Bacharelado em Ciências da Computação) - Centro de Ciências Exatas e Naturais, Universidade Regional de Blumenau, Blumenau.

MCREYNOLDS, Tom; BLYTHE, David. Advanced graphics programming using OpenGL. San Francisco: Elsevier, 2005.

MOURA JR, Armando N. C. Novas tecnologias e sistemas de administração da produção: análise do grau de integração e informatização nas empresas catarinenses. 1996. Não paginada. Dissertação (Mestrado em Engenharia de Produção e Sistemas) – Programa de Pós-graduação em Engenharia de Produção, Universidade Federal de Santa Catarina, Florianópolis. Disponível em: <http://www.eps.ufsc.br/disserta96/armando/cap3/cap3.htm>. Acesso em: 15 set. 2006.

MULTITHERM SISTEMAS E AUTOMAÇÃO. Soluções de gestão e automação Multitherm. Blumenau, 2006. Disponível em: <http://www.multitherm.com.br>. Acesso em: 10 set. 2006.

NETBEANS COMMUNITY. Welcome to NetBeans. [S.l.], 2006. Disponível em: <http://www.netbeans.org>. Acesso em: 10 set. 2006.

NOGUEIRA, Aliete M. G. S. Custeio por ordem na indústria. Rio de Janeiro, 2002. Disponível em: <http://www.estacio.br/graduacao/cienciascontabeis/resenhas/resenha_custos.doc>. Acesso em: 14 set. 2006.

OPENGL. OpenGL: the industry standard for high performance graphics. [S.l.], 2006. Disponível em: <http://www.opengl.org>. Acesso em: 10 set. 2006.

PREACTOR. Tecmaran: soluções avançadas em programação de produção com software APS. [S.l.], 2003. Disponível em: <http://www.preactor.com.br/p_produto.htm>. Acesso em: 9 set. 2006.

65

RIBEIRO, Roberto P. Estratégias de produção. Santa Maria, 2005. Disponível em: <http://www.robertor.pop.com.br/estrategias_producao.htm>. Acesso em: 15 abr. 2007.

RUSSOMANO, Victor H. PCP: planejamento e controle da produção. 6. ed. São Paulo: Pioneira, 2000.

SHREINER, Dave et al. OpenGL programming guide. 5th ed. [S.l.]: Addison-Wesley, 2005. Disponível em: <http://www.gamedev.net/download/redbook.pdf>. Acesso em: 14 set. 2006.

SPARX SYSTEMS. Enterprise Architect: UML design tools and UML CASE tools for software development. [Creswick], 2007. Disponível em: <http://www.sparxsystems.com/products/ea.html>. Acesso em: 26 maio 2007.

STEIL, Rafael. Introdução a programação gráfica em Java com Swing. [S.l.], 2006. Disponível em: <http://www.guj.com.br/java.tutorial.artigo.38.1.guj>. Acesso em: 19 abr. 2007.

SUN MICROSYSTEMS. Java 2 platform: standard edition (J2SE) 1.4.2. [Palo Alto], 2003a. Disponível em: <http://java.sun.com/j2se/1.4.2>. Acesso em: 10 set. 2006.

______. Introduction. [Palo Alto], 2003b. Disponível em: <http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/intro.html>. Acesso em: 26 out. 2006.

______. GLCanvas: JOGL API -- JSR-231 1.1.0 specification. [Palo Alto], 2005a. Disponível em: <http://download.java.net/media/jogl/builds/nightly/javadoc_public/javax/media/opengl/GLCanvas.html>. Acesso em: 23 abr. 2007.

______. GLJPanel: JOGL API -- JSR-231 1.1.0 Specification. [Palo Alto], 2005b. Disponível em: <http://download.java.net/media/jogl/builds/nightly/javadoc_public/javax/media/opengl/GLJPanel.html>. Acesso em: 23 abr. 2007.

______. Trail: creating a GUI with JFC/Swing. [Palo Alto], 2006. Disponível em: <http://java.sun.com/docs/books/tutorial/uiswing>. Acesso em: 26 out. 2006.

SYBASE. Business process modeling, application design, J2EE development: Sybase PowerDesigner – Sybase Inc. [S.l.], 2007. Disponível em: <http://www.sybase.com/products/modelingmetadata/powerdesigner>. Acesso em: 29 maio 2007.

TECMARAN. Preactor: the path to scheduling excellence. Vitória, [2004?]. Prospecto de divulgação do software.

66

VOLKMANN, Eduardo A. Um protótipo para auxiliar a programação de produção para indústrias têxteis. 1998. 115 f. Trabalho de Conclusão de Curso (Bacharelado em Ciências da Computação) - Centro de Ciências Exatas e Naturais, Universidade Regional de Blumenau, Blumenau.

ZUKOWSKI, John. Java AWT reference. [S.l.]: O’Reilly, 1997. Disponível em: <http://www.oreilly.com/catalog/javawt/book>. Acesso em: 26 out. 2006.