ANDRÉ MESQUITA RINCON Implementação de uma Ferramenta
Transcrição
ANDRÉ MESQUITA RINCON Implementação de uma Ferramenta
ANDRÉ MESQUITA RINCON Implementação de uma Ferramenta Gráfica para Construção de Hiperdocumentos Educacionais Baseados em Grafos Conceituais e sua Conversão para o Formato XML Palmas – TO 2004 ANDRÉ MESQUITA RINCON Implementação de uma Ferramenta Gráfica para Construção de Hiperdocumentos Educacionais Baseados em Grafos Conceituais e sua Conversão para o Formato XML “Monografia apresentada como requisito parcial da disciplina Prática de Sistemas de Informação II (TCC) do curso de Sistemas de Informação, sob orientação do Prof°. M.Sc. Fabiano Fagundes” Palmas – TO 2004 ANDRÉ MESQUITA RINCON Implementação de uma Ferramenta Gráfica para Construção de Hiperdocumentos Educacionais Baseados em Grafos Conceituais e sua Conversão para o Formato XML “Monografia apresentada como requisito parcial da disciplina Prática de Sistemas de Informação II (TCC) do curso de Sistemas de Informação, sob orientação do Prof°. M.Sc. Fabiano Fagundes” Aprovado em dezembro de 2004 BANCA EXAMINADORA _______________________________________________ Prof. M.Sc. Fabiano Fagundes Centro Universitário Luterano de Palmas _______________________________________________ Prof. Jackson Gomes de Souza Centro Universitário Luterano de Palmas _______________________________________________ Profª. M.Sc. Parcilene Fernandes Brito Centro Universitário Luterano de Palmas Palmas – TO 2004 SUMÁRIO 1 INTRODUÇÃO ........................................................................................... 7 2 REVISÃO DA LITERATURA ..................................................................10 2.1 2.1.1 Conceitos nos Grafos Conceituais.....................................................14 2.1.3 Ligações nos Grafos Conceituais ......................................................15 2.1.2 XML (EXTENSIBLE MARKUP LANGUAGE).................................................16 2.3 FLASH ...................................................................................................18 2.4 2.4.1 Flash e XML .....................................................................................18 PROJETO COGITANT.............................................................................19 BCGCT e CoGXML...........................................................................21 MATERIAL E MÉTODOS........................................................................26 3.1 LOCAL E PERÍODO ..................................................................................26 3.2 MATERIAIS ............................................................................................26 3.2.1 Hardware..........................................................................................26 3.2.3 Fontes Bibliográficas ........................................................................27 3.2.2 3.3 4 Relações nos Grafos Conceituais ......................................................14 2.2 2.3.1 3 GRAFOS CONCEITUAIS ...........................................................................10 Software............................................................................................27 METODOLOGIA ......................................................................................27 RESULTADOS E DISCUSSÃO.................................................................28 4.1 ARQUITETURA .......................................................................................28 4.2 MODELO XML ......................................................................................29 4.3 FERRAMENTA DESENVOLVIDA ................................................................31 4.3.1 Elementos da Interface......................................................................33 4.3.3 Exemplo de utilização da ferramenta.................................................44 4.3.2 Restrições dos Grafos Conceituais ....................................................39 5 CONCLUSÕES FINAIS E TRABALHOS FUTUROS.............................47 6 REFERENCIAS BIBLIOGRÁFICAS.......................................................49 ANEXOS .............................................................................................................51 LISTA DE FIGURAS Figura 1 – Exemplo de grafo conceitual utilizando a DF ..................................................11 Figura 2 - Exemplo de grafo conceitual utilizando a LF ...................................................12 Figura 3 – Exemplo de representação utilizando o CGIF ..................................................12 Figura 4 – Exemplo de representação utilizando o KIF.....................................................13 Figura 5 – Exemplo de uma DTD e de um arquivo XML válido.......................................17 Figura 6 – Tela da ferramenta desenvolvida usando a biblioteca do CoGITaNT ...............20 Figura 7 – Representação de Conceitos no BCGCT..........................................................22 Figura 8 – Representação de Relações no BCGCT ...........................................................23 Figura 9 – Representação de Conceitos no CoGXML.......................................................24 Figura 10 – Representação de Relações no CoGXML ......................................................25 Figura 11 – Arquitetura da ferramenta..............................................................................28 Figura 12 – DTD do modelo XML criado para ferramenta ...............................................29 Figura 13 – Exemplo de Grafo na Display Form com o código XML correspondente ......30 Figura 14 – Tela da ferramenta para construção de Grafos Conceituais ............................32 Figura 15 – Movieclips utilizados na ferramenta (Conceito e Relação) .............................33 Figura 16 – Movieclips utilizados na ferramenta (Ligação)...............................................34 Figura 17 – Função que desenha o corpo da Ligação........................................................34 Figura 18 – Exemplo da estrutura das classes implementadas...........................................35 Figura 19 – Buttons utilizados na ferramenta....................................................................35 Figura 20 – Função que instancia o objeto XML ..............................................................37 Figura 21 – Elementos do tipo Input text utilizados na implementação .............................38 Figura 22 – Elemento de interface do tipo listbox.............................................................39 Figura 23 – Restrições na criação de um Conceito............................................................40 Figura 24 – Restrições na criação de uma Relação ...........................................................41 Figura 25 – Restrição na criação de uma Ligação .............................................................42 Figura 26 – Restrições na criação do formato XML .........................................................43 Figura 27 – Exemplo de utilização da ferramenta .............................................................45 Figura 28 – Exemplo de GC no formato XML .................................................................46 LISTA DE ABREVIATURAS EHDM (Hyperdocument Educational Design Method) NCM (Nested Context Model) RMM (Relationship Management Methodology) OOHDM (Object-Oriented Hypermedia Design Model) XML (eXtensible Markup Language) GC (Grafos Conceituais) DF (display form) LF (linear form) CGIF (Conceptual Graph Interchange Form) KIF (Knowledge Interchange Format) W3C (World Wide Web Consortiun) SGML (Standard Generalized Markup Language) ISO (International Organization for Standardization) DTD (Document Type Definition) CoGITaNT (Conceptual Graphs Integrated Tools allowing Nested Typed graphs) BCGCT (Base de Connaissances Graphes Conceptuels Textuelle) CoGXML (Conceptual Graphs XML) LABMIDIA (Laboratório de Multimídia e Hipermídia) RESUMO O presente trabalho tem a finalidade de apresentar a implementação de uma parte da ferramenta para criação de hiperdocumentos educacionais baseados em Grados Conceituais. Visto que os hiperdocumentos educacionais têm alguns requisitos diferenciados dos hiperdocumentos tradicionais e que os Grafos Conceituais permitem a representação de conhecimento de forma gráfica em um formato logicamente preciso, a ferramenta se apresenta como um auxílio na modelagem das informações que vão compor estes documentos. Dado que a modelagem dos grafos pode ocorrer de várias formas (como, por exemplo: texto ou elementos gráficos), a ferramenta pode ser utilizada para comunicação entre ser humano e sistemas computacionais ou entre os próprios sistemas computacionais através de um formato que possa ser interpretado por eles. A ferramenta, implementada em Flash, permite a modelagem gráfica, por parte do usuário, e a traduz para o formato XML (eXtensible Markup Language) para sua interpretação por sistemas computacionais. Palavras chave: Grafos Conceituais, Flash MX, Hiperdocumentos Educacionais, XML. ABSTRACT The present work aims to present the partial implementation of a tool for creation of educational hyperdocuments hyperdocuments have some based in Conceptual requirements different Graphs. from Since those educational of traditional hyperdocuments and that Conceptual Graphs allow the visual representation of knowledge in a necessary logical format, the tool is an assistant in the modeling of information that compose these documents. The modeling of graphs can be made of many forms (for example: text or graphical elements), thus the tool can be used to communication between human and machines or between machines and machines through an interpretable format. The tool, implemented in Flash, allows the graphic modeling, made by the user, and translates it to XML for its interpretation by computational systems. Keywords: Conceptual Graphs, Flash MX, Educational Hyperdocuments, XML. 7 1 INTRODUÇÃO A Internet trouxe consigo uma nova forma de navegação, representação e transmissão das informações que se dá através de textos que podem ser acessados de maneira não linear, ou seja, não possui uma forma única de leitura do seu conteúdo. Estes são chamados de hipertextos. Quando se pensa em um conjunto de textos armazenados em um único documento, tem-se, então, um hiperdocumento que, além de possibilitar a ligação para outros hiperdocumentos, permite a ligação para partes do próprio documento. Em Díaz (1995) encontra-se que uma das novidades que se apresentam com os hiperdocumentos é a possibilidade de cada leitor navegar em um conjunto de informações de forma diferente, isso sendo feito através de âncoras para outras partes do texto dentro de um mesmo documento ou de outros documentos. Devido a isso, a autora acrescenta que aplicações que trabalham com hiperdocumentos necessitam de metodologias e ferramentas especiais que dão suporte ao desenvolvimento deste tipo de aplicações. Os hiperdocumentos, quando utilizados no âmbito educacional, recebem a denominação de hiperdocumentos educacionais. Atualmente, alguns esforços são realizados para permitir o ensino utilizando a Internet como, por exemplo: o EHDM (Hyperdocument Educational Design Method) que consiste em um método para elaboração de hiperdocumentos educacionais; o desenvolvimento de ambientes colaborativos para ensino à distância; entre outros. Além disso, existe uma preocupação no que diz respeito à modelagem de hiperdocumentos educacionais, pois esses documentos devem levar em consideração a coerência das informações e a sobrecarga cognitiva. “Uma das características essenciais do hipertexto é sua capacidade de ligação. O que são essas ligações, o que elas unem, que princípios regem estas ligações são, pois, conceitos importantes para a elaboração de hiperdocumentos coerentes” (Campos, 2001). Para que um hiperdocumento seja elaborado de forma coesa, deve-se levar em 8 consideração a disposição do conhecimento que se deseja apresentar, bem como das ligações dentro do hiperdocumento. A criação das ligações dentro de um hiperdocumento de forma a representar a navegação da maneira como o desenvolvedor deseja tem sido alvo de inúmeras pesquisas como, por exemplo, o NCM (Nested Context Model) (Casanova, 1991), o RMM (Relationship Management Methodology) (Isakowitz, 1995) e o OOHDM (ObjectOriented Hypermedia Design Model) (Schwabe, 1995). Algumas conclusões que essas pesquisas têm revelado indicam que ferramentas de auxílio à criação de ligações podem ser úteis na representação das informações. “A sobrecarga cognitiva presente em um hiperdocumento educacional diz respeito ao esforço e concentração necessários para manter várias tarefas ao mesmo tempo” (Conklin, 1987). O ser humano tem capacidade limitada de processamento de informação e um esforço adicional para leitura, principalmente no que diz respeito à navegação entre as informações, pode reduzir os recursos disponíveis para a compreensão. Baseado na necessidade de uma ferramenta para criação de ligações de forma automática para hiperdocumentos educacionais optou-se pelos Grafos Conceituais, pois permitem a representação lógica de proposições, além de permitir a representação de conhecimento em um formato que seja compreendido por humanos e por sistemas computacionais. A ferramenta será implementada em Macromedia Flash, pois é uma tecnologia que permite a implementação de elementos de interatividade com o usuário. Além disso, o Flash possui uma linguagem chamada ActionScript que pode ser utilizada para acesso aos objetos como por exemplo: movieClips (clipes de filme), buttons (botões), input text (caixas de texto), entre outros. Além disso, nessa linguagem, existe um objeto que permite a manipulação de documentos XML (eXtensible Markup Language). O texto está dividido em: revisão de literatura (na seção 2), onde são apresentados os estudos teóricos sobre Grafos Conceituais; a linguagem XML, a tecnologia Flash e o projeto CoGITaNT (Conceptual Graphs Integrated Tools allowing Nested Typed graphs); a seção 3 corresponde aos materiais e métodos utilizados, em outras palavras, apresenta elementos de hardwares, softwares, materiais bibliográficos e metodologias utilizadas neste trabalho; os resultados e discussões (apresentados na seção 4), tem como finalidade apresentar a DTD (Document Type Definition) que é utilizada para validação dos Grafos Conceituais transformados para o formato XML, bem como detalhes da implementação da 9 ferramenta em Flash; na seção 5 são apresentadas as conclusões obtidas com a realização deste, além de algumas sugestões de trabalhos futuros. 10 2 REVISÃO DA LITERATURA Para a implementação da ferramenta proposta, realizou-se um estudo sobre uma linguagem para criação do ambiente gráfico, do conhecimento do domínio de Grafos Conceituais e da linguagem de marcação que será utilizada para transformação do grafo construído em um arquivo que possa ser intercambiado e interpretado por sistemas computacionais. Nesta seção serão apresentados os elementos que foram estudados para implementação de uma ferramenta com as características citadas. 2.1 Grafos Conceituais O Grafo Conceitual (GC) consiste em uma forma de representação do conhecimento proposta por Sowa (2001a) que permite a representação lógica de proposições. A ferramenta proposta neste trabalho permite a representação de proposições, através de GC, utilizando três elementos: os Conceitos, que representam entidades do mundo real; as Relações, que permitem relacionar os Conceitos; e as Ligações, que tem a finalidade de ligar os elementos. A apresentação destes elementos será mais bem detalhada nas próximas seções. Outra característica dos Grafos Conceituais está na definição de que eles são definidos como grafos bipartidos. Tal denominação advém do fato de não serem possíveis ligações entre tipos iguais de nós (Conceitos e Relações). Em outras palavras, em um grafo conceitual válido não existirão ligações entre um Conceito e outro ou entre uma Relação e outra. Os Grafos Conceituais podem ser classificados, segundo Sowa (2001a) em: Vazio, em que o grafo não é composto por nenhum Conceito e nenhuma Relação, não expressando assim, nenhum significado; 11 Singular, que são representados apenas por um Conceito, ou seja, sem ligação com nenhuma Relação (por exemplo: o Conceito [Pessoa] sem ligação representa que existe pessoa); e Estrela, em que uma Relação está ligada a mais de um Conceito (por exemplo: [Pessoa]->(Na)->[Cadeira]). Para que a utilização de GC permita uma modelagem de conhecimento condizente com a realidade, Sowa (2001b) apresenta três características importantes: Grafos Conceituais são humanamente legíveis: um GC consiste na representação de um conhecimento que determinado indivíduo possui. Uma das formas de se fazer tal representação é utilizando os elementos gráficos do GC – essa representação é conhecida como display form (DF). A Figura 1, abaixo, apresenta um exemplo de grafo conceitual utilizando a DF. Figura 1 – Exemplo de grafo conceitual utilizando a DF Na DF, os Conceitos são representados por retângulos, as Relações por elipses e as Ligações pelas setas. No exemplo da Figura 1, acima, existem dois Conceitos (Pessoa e Cadeira), uma Relação (Na) e duas Ligações que são representadas pelas setas (uma que chega na relação e outra que sai da relação). A Figura acima representa o seguinte conhecimento “Pessoa Na Cadeira”. O fato de um GC permitir que um conhecimento seja representado graficamente e, posteriormente, ser interpretado por computador, consiste em um dos pontos que podem ser considerados como vantagem para escolha desse sistema como base da ferramenta desenvolvida. Grafos Conceituais são computacionalmente interpretáveis: GC possui uma notação chamada de forma linear ou linear form (LF). A LF consiste na representação do conhecimento em um formato computacionalmente interpretável. No caso da proposta de Sowa (2001a), o formato interpretável é em forma de String (Texto) como o exemplo da Figura 2. No caso da ferramenta proposta, o formato interpretável será XML (melhor explicado posteriormente na seção 2.2). 12 [Pessoa] -> (Na) -> [Cadeira] Figura 2 - Exemplo de grafo conceitual utilizando a LF Na LF, os Conceitos são representados por colchetes, as Relações por parênteses e as Ligações pelas setas montadas com os caracteres “-” seguidos de “>”. O exemplo da Figura 2 representa o mesmo conhecimento da Figura 1 (“Pessoa Na Cadeira”). Grafos conceituais permitem a representação de significado em um formato logicamente preciso: quando se cria um GC para representação do conhecimento através de seus elementos, utilizam-se formas que permitem essa representação em um formato logicamente preciso. Entre alguns desses formatos, encontram-se o conceptual graph interchange form (CGIF) e Knowledge Interchange Format (KIF) que são apresentados por Sowa (2001b). Em Sowa (2001b), encontra-se que a forma gráfica e a forma linear são para comunicação entre humanos ou entre humanos e máquinas, já o CGIF e o KIF podem ser utilizados permitir o intercâmbio do GC entre as próprias máquinas. Para representar a sintaxe do CGIF são usados os conference labels. Considera-se como um conference label cada nó do GC, por exemplo [Pessoa: *x] como exemplificado na Figura 3. A união dos conference labels, forma a sintaxe do CGIF. Forma Completa: [Pessoa: *x] [Cadeira: *y] (Na ?x ?y) Forma simplificada: (Na [Pessoa] [Cadeira]) Figura 3 – Exemplo de representação utilizando o CGIF A Figura 3 apresenta um exemplo das duas possíveis formas de se representar os Grafos Conceituais utilizando o CGIF segundo Sowa (2001b). Na primeira forma apresentada, chamada de forma completa, encontram-se outros dois elementos: os defining labels representados por “*x” e “*y” que recebem a denominação dos conceitos existentes no grafo; e os bound labels representados por “?x” e “?y” que são os Conceitos das extremidades de uma Relação. Na segunda forma, chamada de forma simplificada, o número de conference labels pode ser diminuído atribuindo os valores diretamente sem a necessidade dos bound e defining labels. 13 Outra forma de permitir o intercâmbio do GC entre as próprias máquinas é a lógica do Knowledge Interchange Format que, segundo Sowa (2001b), possui sua forma baseada no cálculo de predicados. Na Figura 4 é apresentado um exemplo. Forma KIF - (exists ((?x Pessoa) (?y Cadeira)) (Na ?x ?y)) Figura 4 – Exemplo de representação utilizando o KIF Na Figura 4 é apresentada a sintaxe KIF de representação de Grafos Conceituais que foi baseada no cálculo de predicados. Na forma KIF, primeiramente utiliza-se a palavra reservada exists para representar que existe o conceito Pessoa que é “guardado” na variável “x”, existe o conceito Cadeira que é “guardado” na variável “y” e existe a Relação Na que possui os conceitos atribuídos a x e y como extremidades. Ainda sobre os formatos de representação de Grafos Conceituas para comunicação entre máquinas, propostos por Sowa (2001a), vale comentar que apresentam complexidades maiores que as apresentadas nos exemplos acima. Tal complexidade referese à quantidade de Conceitos, Relações, Ligações e outros elementos presentes no modelo completo dos Grafos Conceituais como, por exemplo, negações, quantificadores existenciais, definição de proposições, definição de situações como pode ser encontrado em Sowa (2001c). No entanto, a ferramenta proposta tem a finalidade de permitir a criação e tradução de Grafos Conceituais no modelo básico (utilizando apenas Conceitos, Relações e Ligações). A construção de uma ferramenta que atenda a todas as restrições existentes no modelo de Grafos Conceituais será apresentada neste trabalho como um trabalho futuro na seção 5, visto que para a implementação dessa ferramenta é proposto um modelo XML simplificado (através de uma DTD), apresentando algumas restrições existentes no modelo GC. Nas próximas seções serão apresentados maiores detalhes sobre o modelo XML criado e sobre o estudo de outros modelos XML existentes. Além disso, Conceitos, Relações e suas Ligações serão mais bem explicados para permitir uma melhor compreensão da função deles dentro dos Grafos Conceituais. 14 2.1.1 Conceitos nos Grafos Conceituais O Conceito consiste em um dos elementos mais importantes dentro do Grafo Conceitual. Um exemplo dessa importância está na possibilidade de existir um grafo apenas com um Conceito. Geralmente quando se recorre a um sistema de GC o usuário está buscando uma forma de representar as ligações existentes no conhecimento que ele possui sobre vários conceitos do mundo real. Um Conceito tem a finalidade de representar alguma entidade do mundo real, como nos exemplos citados anteriormente, nos quais era necessário representar um conhecimento sobre as “Pessoas nas Cadeiras”. Identificou-se que existem dois Conceitos “Pessoas” e “Cadeiras”. Para outro conhecimento bastante semelhante ao anterior, “Pessoas estão sentadas nas Cadeiras”, podem-se identificar três conceitos, que são “Pessoas”, “Sentadas” e “Cadeiras”. O que se quer demonstrar é que um Conceito pode ser qualquer “coisa” do mundo real e para definir se ele fará parte ou não de um Grafo Conceitual, deve-se analisar o domínio e abstrair qual a relevância de tal entidade. O Conceito é dividido em Tipo do Conceito e Referente do Conceito. Essa divisão existe para permitir que um Conceito mais genérico possa ser mais especificado. Por exemplo: constatou-se que um GC possui a necessidade de dois Conceitos do tipo “Pessoa”. E é necessário que seja especificado que uma pessoa é “Canhota” e a outra é “Destra”. Assim, pode-se dizer que o tipo do conceito é “Pessoa” e os referentes são: “Canhota” e “Destra”. Então, os Conceitos serão chamados de [Pessoa: Canhota] e [Pessoa: Destra]. Nota-se que Canhota e Destra são tipos de pessoas que possuem características diferentes. 2.1.2 Relações nos Grafos Conceituais As Relações são outro tipo de entidade existente nos Grafos Conceituais. Como as restrições dos GC não permitem a ligação entre Conceitos, as Relações apresentam-se como entidades importantes na representação do relacionamento entre Conceitos. As Relações possuem três características importantes: Tipo da Relação, Valência da Relação e Assinatura da Relação. O Tipo da Relação consiste no nome que é dado à Relação. Uma boa prática de criação de GC, utilizada pelos usuários do sistema de Grafos Conceituais, consiste em 15 atribuir ao Tipo da Relação um nome que possa representar semântica para a Relação à qual ele foi atribuído. Por exemplo, para o seguinte conhecimento, “Pessoa na Cadeira”, não seria semanticamente adequado criar o seguinte Grafo: [Pessoa] -> (Atributo) -> [Cadeira], pois “atributo” pode não representar adequadamente o conhecimento que se propõe que é o fato da Pessoa se localizar em uma Cadeira. A Valência da Relação corresponde ao número de Conceitos que se ligam a ela. A valência se torna um elemento importante na medida em que, através dela, não se permite criar Relações com Tipos iguais e Valências diferentes, ou seja, se uma Relação com o Tipo “Atributo” e com Valência “dois” foi criada dentro do GC, sempre que outra Relação com este mesmo Tipo for criada, a Valência deverá possuir o mesmo valor. A criação de uma Relação com Tipos iguais e valências diferentes poderia acarretar uma maior dificuldade no entendimento de uma determinada Relação dentro do Grafo Conceitual. Vale salientar que, para cada GC, o número de valência de uma Relação deverá ser sempre constante para aquele GC. As valências recebem nomenclaturas especiais de acordo com seu valor: para o valor um, a valência é chamada de “monoadic”; para dois, a valência é chamada de “dyadic”; para o valor três, a valência é chamada de “triadic”; e para números maiores que quatro a denominação é “n-adic” (por exemplo: “quatroadic”, “cincoadic”, e assim por diante). A Assinatura da Relação armazena os tipos dos Conceitos os quais ela está ligada. Ela consiste em uma tupla composta pelos tipos dos Conceitos que estão ligados com a Relação. Este elemento pode ser importante para guardar a ordem de apresentação dos conceitos na interpretação do modelo por máquina. Não foi utilizada na implementação da ferramenta, pois essa restrição não foi inserida no modelo XML criado. (maiores detalhes na seção 2.2). 2.1.3 Ligações nos Grafos Conceituais As Ligações nos Grafos Conceituais têm a finalidade de representar a semântica existente entre um Conceito e uma Relação. Como foi apresentado anteriormente, quando se deseja criar um GC, devem-se identificar quais Conceitos e Relações farão parte dele. Por exemplo, para representar o conhecimento “Pessoa é Inteligente”, identificaram-se dois Conceitos (Pessoa e Inteligente) e uma Relação que pode ser denominada (Atributo). Assim, tem-se o Grafo [Pessoa] (Atributo) [inteligente]. No entanto, esse GC ainda não 16 está completo, pois não existe a forma de leitura que liga os elementos. Para permitir essa forma de leitura é que existem as Ligações. Nota-se que o exemplo acima, quando adicionadas suas Ligações, pode possuir mais de uma forma de leitura. Por exemplo, uma forma correta de construção do Grafo Conceitual acima, segundo a especificação de Sowa (2001a), seria [Pessoa] -> (Atributo) > [Inteligente]. As Ligações para este caso estão da seguinte maneira: uma chegando na Relação (Atributo) proveniente do Conceito [Pessoa] e outra partindo da Relação (Atributo) com destino ao Conceito [Inteligente]. A leitura correspondente é “Pessoa possui um Atributo que é Inteligente”. Agora será apresentado o seguinte Grafo Conceitual: [Inteligente] -> (Atributo) -> [Pessoa]. Nota-se que o GC ainda representa o mesmo conhecimento que o anterior, no entanto, a forma de leitura das Ligações sofreu uma pequena alteração: “Inteligente é um atributo que pertence à Pessoa”. Todos os elementos que foram apresentados nessa seção são fundamentais para construção de um Grafo Conceitual. Estes elementos estão presentes na ferramenta proposta. A ferramenta permite a criação de um Grafo Conceitual utilizando a display form e depois a transforma em um formato interpretável pela máquina. Neste caso, um arquivo XML. Na próxima seção será apresentada a linguagem XML. 2.2 XML (eXtensible Markup Language) O XML foi desenvolvido pela W3C (World Wide Web Consortiun) e, segundo Anderson (2001), consiste em uma linguagem de marcação que permite a criação de marcações específicas para cada domínio. A estrutura de um documento XML é criada em um formato de árvore, em que um documento se inicia através de um elemento raiz que, de acordo com a necessidade, pode ter elementos filhos vinculados a ele, mantendo assim, uma hierarquia. O XML tem como base o modelo do SGML (Standard Generalized Markup Language) que, em 1986, era o padrão de troca e armazenamento de dados pela ISO (International Organization for Standardization). O XML foi utilizado na implementação da ferramenta por apresentar algumas características que foram importantes na criação do modelo: Permite a criação de tags (marcações) específicas para cada domínio, no caso deste trabalho, possibilitou a criação de marcações específicas para o domínio de Grafos Conceituais; 17 Possibilita armazenar os dados sem a preocupação de como esses dados serão apresentados (para isso podem-se utilizar folhas de estilo ou objetos próprios para manipulação de XML, existentes em algumas linguagens programação); e, por fim, Permite a criação de algumas restrições que os arquivos XML devem possuir através do modelo definido em uma DTD (Document Type Definition). Para que um sistema computacional consiga interpretar e validar dados descritos em um arquivo XML é necessário que exista uma gramática que permita essa validação. Para Anderson (2001), uma forma de se criar essa gramática está na DTD. Em outras palavras, uma DTD pode ser utilizada para modelar um domínio e suas restrições. Na Figura 5 serão apresentados uma DTD e um arquivo XML válido. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: <?xml version="1.0"?> <!DOCTYPE graph [ <!ELEMENT graph (concept?)> <!ELEMENT concept EMPTY> <!ATTLIST concept idConcept ID #REQUIRED typeConcept CDATA #REQUIRED referring CDATA #IMPLIED> ]> <graph> <concept idConcept="Conceito1" typeConcept="Pessoa" /> </graph> Figura 5 – Exemplo de uma DTD e de um arquivo XML válido A Figura 5 apresenta uma parte da DTD e de um arquivo XML para o domínio de Grafos Conceituais. A linha 1 apresenta a especificação da versão XML utilizada, neste caso a versão é “1.0”. Nas linhas 2 a 8 tem-se a criação da DTD. Nesta DTD, a linha 2 traz a especificação do início da criação da DTD. A linha 3 apresenta a criação do elemento graph e, dentro dos parênteses, existe a restrição sobre a possibilidade de um grafo poder ter ou não um elemento concept. A linha 4 apresenta o elemento concept que é do tipo EMPTY (vazio). Nas linhas 5 a 7 são apresentados os atributos do elemento concept que são: idConcept do tipo identificador (ID) e obrigatório (REQUIRED); typeConcept que é composto por texto (CDATA) e também obrigatório; e, por fim, o atributo referring que também é composto por texto e é opcional (IMPLIED). Nas linhas 9 a 11 tem-se o arquivo XML em que a linha 9 apresenta o elemento raiz que inicia o arquivo. A linha 10 traz o elemento que é filho do elemento raiz e está em um nível inferior na árvore do documento. A linha 11 finaliza o arquivo XML com a marcação de fechamento do elemento raiz que foi aberto na linha 9. Nota-se que o elemento da linha 10 não necessitou de uma tag de fechamento, pois trata-se de um elemento vazio (EMPTY). 18 Para implementação da ferramenta, utilizou-se uma linguagem de programação que permite a manipulação de documentos XML, bem como sua validação por uma DTD. Uma linguagem que permite a criação de ambientes gráficos e a manipulação XML é o ActionScript do Flash. A próxima seção apresenta algumas características do Objeto XML disponibilizado pelo ActionScript, bem como da tecnologia Flash. 2.3 Flash O Flash consiste em uma tecnologia para criação de clipes de filmes dinâmicos que possuem grande número de interações com o usuário. O Flash utiliza imagens vetoriais, em que as imagens são construídas através de cálculos matemáticos das formas geométricas das figuras (os vetores) (Prestes, 2003). Como resultado da utilização da descrição geométrica das figuras tem-se um redimensionamento perfeito das imagens facilitando, assim, a sua portabilidade. Existem alguns elementos do Flash que foram utilizados neste trabalho que permitem a interação do usuário com o sistema e dinamicidade dos programas criados em Flash, entre eles: movieClips (clipes de filme) e buttons (botões). Além disso, vale apresentar outros conceitos do Flash como o palco do filme que consiste no espaço onde o clipe de filme será criado. Um clipe de filme, por sua vez, trabalha outros conceitos como scene (cena), onde cada cena pode ter várias camadas e uma camada pode possui vários níveis. Por fim, um nível é um número exclusivo que especifica o nível de profundidade no qual um filme especificado deve ser colocado. Para controlar a interação entre o usuário e o sistema ou entre os elementos do sistema, existe a linguagem do Flash chamada ActionScript. O ActionScript é a linguagem de script do Macromedia Flash MX que permite definir o comportamento que um programa Flash terá. Através do ActionScript, os elementos inseridos no palco do filme, bem como outros objetos instanciados (como o objeto XML), podem ser acessados. 2.3.1 Flash e XML Segundo o Manual Flash MX (2004), os métodos e as propriedades do objeto XML do Flash são usados para carregar, analisar, enviar, montar e manipular árvores de documento XML. Nessa seção serão apresentadas algumas propriedades que serão 19 utilizadas na implementação da ferramenta, bem como alguns métodos que irão acessar tais propriedades. Algumas das propriedades do objeto XML que serão utilizadas: XmlDecl: deve receber informações sobre a declaração de um documento XML (possui a seguinte sintaxe: objXML.xmlDecl = "<?xml version=\"1.0\" encoding = \"ISO-8859-1\"?>";); DocTypeDecl: retorna informações sobre a declaração doctype do documento XML (possui a seguinte sintaxe: objXML.docTypeDecl="<!DOCTYPE Grafo SYSTEM \"grafo.dtd\">";); Status: retorna um valor inteiro que indica o resultado da análise de um objeto XML (possui a seguinte sintaxe: S = objXML.status). Além das propriedades, serão utilizados alguns métodos como, por exemplo: sendAndLoad() que envia o objeto XML para uma URL passada por parâmetro e recebe o resultado do processamento. A sintaxe do método que envia e recebe o resultado do processamento e a seguinte: objXML.sendAndLoad(strURL,auxiliarXML,”POST”);. As propriedades e os métodos do objeto XML, em conjunto com as propriedades e eventos dos elementos do Flash, servem como introdução ao estudo completo dos elementos que deverão ser utilizados para implementação da ferramenta. Na seção de resultados e discussões serão apresentadas telas da ferramenta, o formato XML que é utilizado para validar os Grafos Conceituais criados e outros métodos do ActionScript utilizados na implementação. Na próxima seção será apresentado o estudo realizado durante este trabalho. Este estudo visou conhecer iniciativas na área de desenvolvimento de softwares que fossem utilizados para interpretação de Grafos Conceituais pos sistemas computacionais. O projeto que foi estudado é denominado de projeto CoGITaNT. 2.4 Projeto CoGITaNT O projeto CoGITaNT consiste em um projeto Francês encabeçado pela Équipe représentation de connaissances par des graphes desenvolvida dentro do LIRMM (Laboratoire d'Informatique, de Robotique et de Microélectronique de Montpellier). Os membros dessa equipe criaram uma biblioteca C++ que permite o desenvolvimento de softwares baseados em Grafos Conceituais (CoGITaNT, 2001). 20 A biblioteca fornece mecanismos de leitura e manipulação de Grafos Conceituais através de sistemas que possuem mecanismos de processamento de Grafos Conceituais (CoGITaNT, 2001). Para leitura e validação dos grafos, a biblioteca oferece mecanismos de criação e de leitura nos formatos BCGCT (formato nativo do CoGITaNT) que significa Base de Connaissances Graphes Conceptuels Textuelle, no formato CoGXML (Conceptual Graphs XML), formato CGIF e na forma linear (CoGITaNT, 2001). O formato BCGCT será explicado na seção 4.1, juntamente com o CoGXML que consiste na representação XML do BCGCT. A ferramenta desenvolvida com essa tecnologia pode ser adquirida gratuitamente no site do projeto CoGITaNT. Um exemplo de utilização dela pode ser visualizado na Figura 6. C A B D Figura 6 – Tela da ferramenta desenvolvida usando a biblioteca do CoGITaNT A Figura 6 apresenta a tela da ferramenta com as várias formas de visualização e de edição que ela possibilita. Em “A” tem-se a forma de Grafos Conceituais aninhados; nessa forma são permitidas as construções de elementos dentro uns dos outros. Exemplificando: uma possível forma de leitura do Grafo presente em “A” seria: existe um Conceito com o tipo Personne e com o Referente Pierre que é agent do Conceito 21 Penser (neste caso agent é uma Relação). O Conceito Penser possui a Relação objet e esta Relação está ligada a Tableau: A. A tableau contém uma représentation que é composta por uma scène que possui um attribut ligado ao Conceito Bucolique. A scène é descrita (através do description) como sendo um Couple (representando um par ou uma dupla) composta (composant) dos seguintes Grafos: Personne que é agent do Conceito Pêcher e Personne que é agent do Conceito Dormir. O Couple está ligado à Relação dans que possui o Conceito Barque que, por sua vez, está ligado à Relação sur que possui o Conceito Lac. Em um português coloquial, o que está sendo representado é o seguinte: “Pierre, que é uma pessoa, pensa em uma cena bucólica (fazendo referência a uma cena simples e/ou comum) onde uma pessoa pesca e dorme em um barco sobre um lago”. Ainda sobre a Figura 6, na parte marcada pela letra “B” apresenta-se a forma linear de uma parte do conhecimento explicado acima. Uma forma de leitura seria: “Pensar possui um agente que é uma pessoa que pesca dentro de um barco”. A parte representada pela letra “C” consiste no modelo BCGCT. Por fim, a parte referente à letra “D” consiste em uma representação, na display form, do mesmo conhecimento citado na forma linear. A interface apresentada acima permite a edição de Grafos Conceituais aninhados, além de permitir a manipulação na forma linear e utilizando o modelo BCGCT. Esses recursos estão disponíveis na ferramenta porque os desenvolvedores utilizaram todos as formas de criação de Grafos Conceituais que a biblioteca permite. Existe uma parte da ferramenta que permite a edição de Grafos Conceituais básicos na display form, assim, quando a ferramenta desenvolvida como parte desse trabalho for apresentada, será realizada também uma comparação entre elas. Como foi citado anteriormente, existe um modelo chamado CoGXML que foi desenvolvido a partir do modelo BCGCT, na próxima seção serão apresentados os modelos: BCGCT e o CoGXML. 2.4.1 BCGCT e CoGXML A proposta deste trabalho de se construir uma ferramenta para criação de Grafos Conceituais surgiu aliada à idéia de permitir que esses Grafos pudessem ser transformados para um formato interpretável por computador, e a forma escolhida para tal interpretação foi o modelo XML. Dentre os motivos dessa escolha tem-se a característica do XML de ser multiplataforma, permitindo que o arquivo seja transmitido para qualquer sistema 22 computacional. Além disso, o XML permite a construção de modelos específicos para o domínio de Grafos Conceituais e também permite a criação de algumas restrições através das DTD’s. Após a escolha do XML, verificou-se a necessidade de encontrar algum trabalho relacionado a este tema para que fossem feitas comparações com um modelo que estivesse em funcionamento. Foi assim que se conheceu o modelo CoGXML do projeto CoGITaNT. A partir deste modelo verificou-se que ele apresentava uma quantidade de elementos maior que a necessária para construção de Grafos Conceituais básicos (como se propõe a ferramenta desenvolvida neste trabalho). A partir daí seguiu-se com um estudo aprofundado sobre o projeto citado acima e verificou-se a existência de um modelo que deu origem ao CoGXML: o BCGCT. O BCGCT consiste em um formato textual para representação de Grafos Conceituais básicos e também para Grafos com formatos aninhados (como o exemplo da Figura 6 da seção anterior). Alguns exemplos que serão apresentados sobre essa forma de representação irão tratar da parte referente à criação de Conceitos, Relações e Ligações para permitir a comparação com o modelo XML criado para este trabalho. Na Figura 7 tem-se a representação de criação de Conceitos. 1.TConSet: 2. ConceptTypes: 3. Universal; 4. Action; 5. Attribute; 6. Entity; 7. Think; 8. Sleep; 9. Fish; 10. Lake; 11. Place; 12. EndConceptTypes; 13. Order: 14. Action < Universal; 15. Attribute < Universal; 16. Entity < Universal; 17. Think < Action; 18. Sleep < Action; 19. Fish < Action; 20. Lake < Place; 21. EndOrder; 22.EndTConSet; Figura 7 – Representação de Conceitos no BCGCT 23 A Figura 7 apresenta a forma de representação dos Conceitos de um Grafo Conceitual em BCGCT. A linha 1 possui a marcação TConSet que tem por finalidade iniciar a representação dos Conceitos e a sua ordem. Na linha 2 existe a marcação ConceptTypes que apresenta o início da especificação das nomenclaturas dos Conceitos, que vai da linha 3 até a linha 11, e é encerrada na linha 12 pela marcação EndConceptTypes que finaliza a especificação das nomenclaturas. A partir da linha 13, com a marcaão Order até a linha 21, com a marcação EndOrder, é que se define a ordem dos conceitos. A ordem consiste em uma novidade apresentada por essa forma de representação. No BCGCT, o usuário não informa o Tipo do Conceito e seu Referente separadamente. O que acontece nestes casos é o seguinte: o usuário cadastra apenas os Tipos dos Conceitos (como Lake, Sleep, Action e Place) e depois define a “ordem de existência” que eles seguem (como o mecanismo de herança em Orientação a Objeto). Exemplificando, na linha 18 e 20 aparecem os Conceitos Sleep, que é considerado um tipo de Action e Lake que é considerado um tipo de Place. Para a criação das Relações de um Grafo Conceitual nesta forma de representação segue-se a mesma lógica, como pode ser visto na Figura 8. 1.TRelSet: 2. RelationTypes: 3. attr{Signature:2,Entity,Attribute}; 4. in{Signature:2,Entity,Place}; 5. object{Signature:2,Action,Entity}; 6. EndRelationTypes; 7. Order: 8. EndOrder; 9.EndTRelSet; Figura 8 – Representação de Relações no BCGCT A Figura 8 apresenta a forma de representação das Relações de um Grafo Conceitual em BCGCT. A linha 1 possui a marcação TRelSet que tem por finalidade iniciar a representação das Relações e a sua ordem (esta marcação é finalizada na linha 9 com EndTRelSet). Na linha 2 existe a marcação que apresenta o início da especificação das nomenclaturas das Relações e dos Conceitos que ela relaciona, que vai da linha 3 até a linha 5, e é encerrada na linha 6 pela marcação que finaliza a especificação das nomenclaturas. Assim como nos Conceitos, também é possível definir a ordem entre as Relações, mas no exemplo da Figura 8 este recurso não foi utilizado, por isso a marcação 24 de ordem é aberta na linha 7 e encerrada na linha 8 sem conter elementos entre delas. Para exemplificar a criação de uma relação pode-se considerar a linha 4 em que é criada a Relação “in” que possui a valência “2” (representado por signature) e relaciona os Conceitos Entity e Place. Os elementos apresentados acima são algumas formas de representação do BCGCT que, como dito anteriormente, é um modelo de representação de Grafos Conceituais em forma de texto no qual o CoGXML foi baseado. O CoGXML possui características bastante semelhantes ao formato anterior. A maioria dos elementos do BCGCT possui sua respectiva representação no CoGXML. Na Figura 9 é apresentado um exemplo. 1.<conceptTypes> 2. <ctype id="c0" label="Universal"/> 3. <ctype id="c1" label="Action"/> 4. <ctype id="c2" label="Attribute"/> 5. <ctype id="c3" label="Entity"/> 6. <ctype id="c4" label="Think"/> 7. <ctype id="c5" label="Sleep"/> 8. <ctype id="c6" label="Fish"/> 9. <ctype id="c7" label="Lake"/> 10. <ctype id="c8" label="Place"/> 11. <order id1="c1" id2="c0"/> 12. <order id1="c2" id2="c0"/> 13. <order id1="c3" id2="c0"/> 14. <order id1="c4" id2="c1"/> 15. <order id1="c5" id2="c1"/> 16. <order id1="c6" id2="c1"/> 17. <order id1="c7" id2="c8"/> 18. </conceptTypes> Figura 9 – Representação de Conceitos no CoGXML A Figura 9 apresenta a forma de representação dos Conceitos de um Grafo Conceitual em CoGXML. A linha 1 possui a marcação que tem por finalidade iniciar a representação dos Conceitos e a sua ordem. Da linha 2 até a linha 10 tem-se a criação dos Conceitos. Para exemplificar será utilizada a linha 9 em que o Conceito possui o atributo id com valor “c7” e atributo label com o valor “Lake”. Após a criação dos Conceitos com seus atributos, é então dado início à criação da ordem (seguindo a mesma lógica do BCGCT). Por exemplo, na linha 17 ocorre a definição de que o Conceito com atributo id de valor “c7” é um subtipo do Conceito com atributo id “c8” de valor “Place”. A definição da ordem é realizada entre as linhas 11 e 17. Já na linha 18, existe a marcação </conceptTypes> que finaliza a definição dos Conceitos e a ordem entre eles. Após a 25 definição dos Conceitos, definem-se também as Relações. Um exemplo pode ser visualizado na Figura 10. 1.<relationTypes> 2. <rtype id="r0" label="attr" idSignature="c6 c2"/> 3. <rtype id="r1" label="in" idSignature="c6 c12"/> 4. <rtype id="r2" label="object" idSignature="c1 c6"/> 5.</relationTypes> Figura 10 – Representação de Relações no CoGXML A Figura 10 apresenta a forma de representação das Relações de um Grafo Conceitual em CoGXML. A linha 1 possui a marcação que tem por finalidade iniciar a representação das Relações e a sua ordem (esta marcação é finalizada na linha 5). Da linha 2 até a 3 apresentam-se as marcações que especificam as Relações e os Conceitos que elas relacionam. Para exemplificar a criação de uma relação pode-se considerar a linha 4. Nessa linha é criada a Relação com atributo id com valor “r2”, o atributo label com valor “object” e o atributo idSignature com o valor “c1 c6” (o último atributo contem o id dos Conceitos que ela relaciona). Estes foram alguns elementos necessários para composição de Grafos Conceituais em CoGXML. Tanto este modelo XML, quanto o modelo textual BCGCT, desenvolvidos pelo projeto CoGITaNT, possuem inúmeros elementos que permitem a criação de Grafos que dão suporte à Grafos aninhados (como foi citado anteriormente). Para construção deste tipo de Grafo, deve-se realizar um estudo mais completo sobre estes elementos, bem como da biblioteca C++ que permite a construção de softwares que dão suporte a estes elementos. Neste trabalho foi realizado apenas um estudo introdutório para auxiliar na proposta de um modelo XML para implementação da ferramenta em Flash. 26 3 MATERIAL E MÉTODOS Nesta seção serão apresentados os recursos utilizados durante o desenvolvimento do trabalho. Entre eles, têm-se pesquisas bibliográficas, recursos de hardware e de software. Os recursos utilizados de hardware e software foram disponibilizados pelos laboratórios de informática do curso de Sistemas de Informação do CEULP/ULBRA. 3.1 Local e período Monografia desenvolvida como requisito parcial da disciplina de Prática em Sistemas de Informação II cursada no oitavo período do Curso de Sistemas de Informação do CEULP/ULBRA no segundo semestre de 2004. Este trabalho foi desenvolvido como uma pesquisa assinada pelo LABMIDIA (Laboratório de Multimídia e Hipermídia) que disponibilizou recursos de hardware e software. 3.2 Materiais Os recursos de hardware e software utilizados neste trabalho estão disponíveis nos laboratórios de informática do curso Sistemas de Informação do CEULP/ULBRA, já os recursos bibliográficos foram adquiridos na Internet (exceto os livros disponíveis no LABMIDIA). Na subseção seguinte segue uma enumeração dos recursos utilizados. 3.2.1 Hardware Pentium III, 750 Mhz e 128 Mb de RAM (laboratórios de informática). 27 3.2.2 Software Microsoft Windows 2000 Professional; Internet Explorer 6.0; Microsoft Office XP; Acrobat Reader 6.0; Macromedia Flash MX; Macromedia Fireworks MX; Macromedia Dreamweaver MX. 3.2.3 Fontes Bibliográficas Teses de Mestrados; Artigos; 3.3 Trabalhos de Conclusão de Curso; Livros; Sites. Metodologia Primeiramente foi definido um modelo utilizando a DTD da linguagem XML para validar arquivos XML gerados a partir da interpretação dos Grafos Conceituais na forma gráfica. Depois deu-se início à implementação de uma ferramenta que pudesse permitir a criação de Grafos Conceituais básicos e permitisse a interpretação citada acima. A implementação foi realizada com ActionScript 1.0. A implementação iniciou-se através da programação estruturada, no entanto, verificou-se que a utilização do paradigma da Orientação a Objetos (através da implementação de classes) permitiria a recuperação das informações necessárias. 28 4 RESULTADOS E DISCUSSÃO Nesta seção serão apresentados alguns dos resultados obtidos com a realização deste trabalho. Dentre eles, a arquitetura da ferramenta desenvolvida, o modelo XML para interpretação de Grafos Conceituais básicos, bem como a própria ferramenta, seus elementos e sua implementação. 4.1 Arquitetura A visualização da arquitetura da ferramenta auxilia na compreensão da forma como os módulos foram implementados, permite um melhor entendimento dos passos que são realizados para o resultado que é gerado pela ferramenta e apresenta um elemento que se propõe como continuação do trabalho. A Figura 11 apresenta a arquitetura da ferramenta. A B C Figura 11 – Arquitetura da ferramenta A ferramenta gráfica para construção de hiperdocumentos educacionais pode ser dividida em três partes distintas no que diz respeito à implementação. A primeira parte, indicada pela letra “A” na Figura 11, consiste no espaço para edição dos Grafos Conceituais no modo gráfico, a segunda parte, indicada pela letra “B” na Figura 11, diz respeito à interpretação do modo gráfico para um Formato XML e a terceira parte, , 29 indicada pela letra “C” na Figura 11, refere-se à criação dos hiperdocumentos educacionais a partir do formato XML. No desenvolvimento deste trabalho, as partes implementadas estão marcadas por um retângulo pontilhado na Figura 11. Ou seja, a ferramenta permite a criação de Grafos Conceituais básicos em modo gráfico (possibilitando a criação de Conceitos, Relações e Ligações) e realiza a tradução para um formato XML. A terceira parte, referente à geração dos hiperdocumentos educacionais é apresentada como continuação deste, na seção 5. Na próxima seção será apresentado o modelo XML utilizado na interpretação dos Grafos Conceituais. 4.2 Modelo XML O modelo XML desenvolvido neste trabalho permite a criação e validação de Grafos Conceituais básicos (leia-se: Conceitos, Relações e Ligações). Para apresentar este modelo, deve-se primeiramente apresentar a DTD que valida os documentos para que se entenda o valor de cada elemento. Na Figura 12 tem-se a DTD do modelo XML. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: <!ELEMENT graph (concept*, relation*, link*)> <!ELEMENT concept EMPTY> <!ATTLIST concept idConcept ID #REQUIRED typeConcept CDATA #REQUIRED referring CDATA #IMPLIED> <!ELEMENT relation EMPTY> <!ATTLIST relation idRelation ID #REQUIRED typeRelation CDATA #REQUIRED valence CDATA #REQUIRED> <!ELEMENT link EMPTY> <!ATTLIST link idLink ID #REQUIRED cid IDREF #REQUIRED 13: rid IDREF #REQUIRED> Figura 12 – DTD do modelo XML criado para ferramenta A Figura 12 apresenta a DTD do modelo XML criado para validação dos Grafos Conceituais criados na ferramenta desenvolvida neste trabalho. A linha 1 apresenta a criação do elemento graph que possui: zero ou mais elementos concept, relation e link. A restrição de zero ou mais, que é representado pelo “*” ao lado direito de cada elementos (vide linha 1) se faz necessária, pois um Grafo Conceitual pode ser do tipo vazio (sem elementos) ou do tipo simples (com apenas um Conceito). 30 A linha 2 apresenta o elemento concept que é do tipo EMPTY (ou seja, elemento vazio). Nas linhas 3 a 5 são apresentados os atributos do elemento concept que são: idConcept do tipo identificador (ID) obrigatório (REQUIRED); typeConcept que é composto por texto (CDATA) e também obrigatório; e, por fim, o atributo referring que também é composto por texto e é opcional (IMPLIED). A linha 6 apresenta o elemento relation que é do tipo EMPTY (assim como o concept). Nas linhas 7 a 9 são apresentados os atributos do elemento relation que são: idRelation do tipo identificador (ID) obrigatório (REQUIRED); typeRelation que é composto por texto (CDATA) e também obrigatório; e, por fim, o atributo valence que também é composto por texto e é obrigatório. A linha 10 apresenta o elemento link que é do tipo EMPTY (assim como o concept e o relation). Nas linhas 11 a 13 são apresentados os atributos do elemento link que são: idLink do tipo identificador (ID) obrigatório (REQUIRED); cid e rid que são do tipo (IDREF) que fazem referencia a um elemento do tipo (ID) que esteja presente no documento XML. Na Figura 13 será apresentado um exemplo de Grafo Conceitual com seu documento XML correspondente. Figura 13 – Exemplo de Grafo na Display Form com o código XML correspondente O Grafo Conceitual apresentado na Figura 13 pode ser lido da seguinte forma: “Professor, que é um tipo de pessoa, está na Cadeira”. Existem dois Conceitos [Pessoa: Professor] e [Cadeira] e estes possuem a Relação (Na). Ainda na Figura 12 tem-se o código XML que representa o Grafo Conceitual. As linhas 1 e 2 apresentam marcações que 31 representam declarações do documento XML. A linha 3 apresenta a tag raiz que inicia o grafo (o grafo é finalizado na linha 9). A linha 4 apresenta o Conceito identificado pelo atributo idConcept com valor “Conceito1”. Além deste atributo identificador, ainda existem outros dois atributos que são typeConcept com valor “Pessoa” e referring com valor “Professor”. A linha 5 apresenta o outro Conceito presente no Grafo que é identificado pelo atributo idConcept com valor “Conceito2” e o outro atributo é typeConcept com valor “Cadeira” (nota-se que este Conceito não possui um referring atribuído. A linha 6 apresenta a Relação identificada pelo atributo idRelation com valor “Relacao1”. Além deste atributo identificador, ainda existem outros dois atributos que são typeRelation com valor “Na” e valence com valor “2”. A linha 7 apresenta a Ligação identificada pelo atributo idLink com valor “Ligacao1” que, além deste atributo identificador, ainda possui outros dois atributos que são cid com valor “Conceito1” e rid com valor “Relacao1” que fazem referência aos ID’s dos elementos que ela liga. A linha 8, analogamente à linha 7, apresenta a Ligação identificada pelo atributo idLink com valor “Ligacao2”. Além deste atributo identificador, ainda possui outros dois atributos que são cid com valor “Conceito2” e rid com valor “Relacao1” que fazem referência aos ID’s dos elementos que ela liga. A ferramenta, seus componentes e a sua implementação serão apresentados na próxima seção. 4.3 Ferramenta desenvolvida A ferramenta desenvolvida neste trabalho foi criada utilizando a tecnologia Flash e a linguagem ActionScript 1.0. O Flash permite a criação de ambientes gráficos para interação com o usuário através de seus elementos. A ferramenta permite a criação de Grafos Conceituais básicos (utilizando Conceitos, Relações e Ligações) e transforma este grafo para um formato XML. A Figura 14 representa a tela da ferramenta com um Grafo Conceitual criado. 32 A B C Figura 14 – Tela da ferramenta para construção de Grafos Conceituais A Figura 14 apresenta a tela da ferramenta para a construção de Grafos Conceituais. Antes de descrever alguns elementos de interface individualmente, além das restrições para construção de Grafos Conceituais que foram implementadas, será ilustrada nessa seção, a tela da ferramenta. A tela da ferramenta pode ser dividida em três partes de acordo com sua função. Por exemplo: a parte superior da ferramenta (Figura 14 – A) consiste no espaço destinado a abrigar as opções de construção do Grafo Conceitual, ou seja, caixas de texto para inserção de texto e botões para criação dos elementos dos Grafos Conceituais; na parte central da ferramenta (Figura 14 – B) o usuário poderá posicionar os elementos; e na parte inferior (Figura 14 – C) a ferramenta apresenta informações para usuário (como mensagens de erro ou confirmação de operação). 33 Para mostrar os elementos utilizados na implementação individualmente, esta seção será subdividida em: elementos gráficos do Flash (e estrutura da implementação) e restrições do GC que foram implementadas. 4.3.1 Elementos da Interface Os elementos de interface do Flash MX que foram utilizados são: movieclips para criação dos Conceitos, Relações e Ligações; buttons para criar os botões que inserem os elementos do Grafo Conceitual na ferramenta, além do botão para transformação do GC no formato XML; input text para permitir que o usuário digite valores como tipo do Conceito e tipo da Relação; combobox para escolha da valência da Relação; e listbox para representar a comunicação da ferramenta com o usuário (apresentando informações sobre restrições para determinadas tentativas de ações dos usuários). Nessa seção, será apresentado cada elemento de interface, bem como sua funcionalidade e seu código ActionScript correspondente. A Figura 15 apresenta alguns movieclips utilizados. Figura 15 – Movieclips utilizados na ferramenta (Conceito e Relação) A figura acima apresenta dois elementos utilizados na ferramenta que são do tipo movieclip. Para a definição dos Conceitos (Figura 15 – A) e das Relações (Figura 15 – B), o movieclip correspondente a cada um, foi desenhado com tamanho fixo e inserido na biblioteca do Flash. Assim, para que eles sejam inseridos no espaço de trabalho da ferramenta e fiquem visíveis ao usuário, é invocado o método que anexa o movieclip (a sintaxe deste método é a seguinte): attachMovie("NomeNaBiblioteca",Nome,profundidade);. Dentro dos movieclips Conceito e Relação existe um input text que recebe um valor digitado pelo usuário (o espaço para o usuário informar este valor será apresentado posteriormente). A Figura 16 apresenta os outros elementos do tipo movieclip que foram utilizados. 34 Figura 16 – Movieclips utilizados na ferramenta (Ligação) A Figura 16 apresenta os elementos movieclip que compõem a Ligação. Apesar de ser do tipo movielclip, como os da Figura 15, eles apresentam características diferentes. Para desenhar o corpo da Ligação (Figura 16 – A), utiliza-se o movieclip de outra forma como é apresentado na Figura 17 que representa a função que desenha o corpo da Ligação. 1: 2: 3: 4: 5: 6: function desenhaLigacao(){ var linha = createEmptyMovieClip("Ligacao", 2000+_global.numeroLigacao); linha.lineStyle(2, 0x000000, 100); linha.moveTo(_global.comecaX,_global.comecaY); linha.lineTo(_global.fimX, _global.fimY); } Figura 17 – Função que desenha o corpo da Ligação A Figura 17 que representa a codificação da função que desenha o corpo da Ligação através da API 2D do Macromedia Flash MX. A linha 1 apresenta a declaração da função. A linha 2 apresenta a declaração de uma variável que recebe o valor do método que cria um movieclip vazio para que seja desenhada uma linha, neste caso o corpo da Ligação (Figura 16 – A). A linha 3 possui valores atributos da linha como: espessura e cor. A linha 4 apresenta o método que irá marcar o ponto de início da linha; e a linha 5 apresenta o método que irá desenhar a linha até o ponto passado por parâmetro (entende-se como ponto uma coordenada X,Y no plano bidimensional). A ponta da Ligação (Figura 16 – B) é um elemento movieclip que possui características semelhantes aos da Figura 15 no que diz respeito à criação e forma de inserção na ferramenta. No entanto, quando o elemento é inserido (sempre no ponto final do corpo da Ligação), são realizados cálculos matemáticos que retornam o valor do ângulo que a ponta da Ligação deve ser rotacionado. Essa rotação tem a finalidade de acompanhar a inclinação do corpo da Ligação quando necessário (nos códigos em anexo tem-se a apresentação e explicação dos cálculos matemáticos para rotação da ponta da Ligação). A Figura 18 apresenta os buttons que foram utilizados na implementação da ferramenta. No entanto, para um melhor entendimento das instâncias das classes que são criadas com alguns dos buttons, vale apresentar a estrutura das classes utilizadas na 35 implementação. Foram criadas três classes (Conceito, Relacao e Ligacao) que são instanciadas dadas determinadas ações do usuário. Seguindo o paradigma da Orientação a Objetos (Meyer, 1989), as classes foram criadas sobre a estrutura apresentada na Figura 18. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. function nomeDaClasse(){ //Construtor //Atributos this.id = valor; this.getId = getId; } //Métodos function getId(){ return this.id; } Figura 18 – Exemplo da estrutura das classes implementadas A Figura 18 apresenta a estrutura básica das classes implementadas na ferramenta. Na linha 1 é criado o nome da classe. Nas linhas 2 a 5 tem-se o espaço reservado para o construtor. No exemplo, o construtor atribui um valor para o atributo id (linha 4) e cria outro atributo que receberá a implementação de um método (linha 5). Entre as linhas 7 a 10 existe a implementação do método que foi definido no construtor (linha5). Vale comentar que para cada classe existem atributos e métodos específicos que serão explicados à medida que os elementos de interface vão sendo demonstrados nessa seção. Sobre a declaração de classe da Figura 18, que representa a sintaxe da declaração de classe do ActionScript, pode-se dizer que ela possui uma sintaxe de declaração de classe diferenciada em relação à Orientação a Objetos no que diz respeito à sua estruturação, pois tal sintaxe é bastante semelhante à sintaxe do JavaScript que é baseada na ECMA-262 (1999). O código completo de cada classe não será apresentado devido ao seu tamanho, mas a codificação completa da ferramenta está disponível nos anexos deste trabalho. Na Figura 19, abaixo, são apresentados os buttons. A B C D Figura 19 – Buttons utilizados na ferramenta A Figura 19 apresenta os quatro elementos do tipo button que foram utilizados na ferramenta. Nessa seção, a funcionalidade de cada botão será explicada apenas 36 textualmente, já os códigos de ActionScript de cada botão serão apresentados e explicados separadamente na seção 4.3.2 que diz respeito às restrições de criação dos Grafos Conceituais. Na Figura 19 (A), o quadrado tem a finalidade de fazer algumas verificações das restrições sobre a criação dos Conceitos e depois instanciar um objeto da Classe Conceito. No construtor do Conceito, será atribuído valor aos seguintes atributos: idConceito receberá "Conceito"+_global.numeroConceito;. A parte de código representada por _global.numeroConceito consiste em uma variável global que controla o número de Conceitos criados. Essa variável tem a finalidade de fazer com que o idConceito sempre possua um valor único); os atributos tipoConceito e referente receberão valores informados pelo usuário; e o noConceito receberá seu valor em forma de um nó XML com os atributos que foram citados acima (por exemplo, "<concept idConcept=\""+idConceito+"\" typeConcept=\""+tipoConceito+"\"referring=\""+referente+"\"/> ";). A elipse (Figura 19 – B) tem a finalidade de fazer algumas verificações das restrições sobre a criação das Relações (tais restrições serão explicadas na próxima seção) e depois instanciar um objeto da Classe Relacao. No construtor da Relacao, será atribuído valor aos seguintes atributos: idRelacao receberá "Relacao"+_global.numeroRelacao. A variável (_global.numeroRelacao é uma variável global que controla o número de Relações criadas. Essa variável tem a finalidade fazer com que o idRelacao sempre possua um valor único); os atributos tipoRelacao e valencia receberão valores informados pelo usuário; e o noRelacao receberá seu valor em forma de um nó XML com os atributos citados acima (por exemplo, "<relation idRelation=\""+idRelacao+"\" typeRelation=\""+tipoRelacao+"\" valence=\""+valencia+"\" />";). O botão ligação (Figura 19 – C) possui um código que atribui à variável _global.botaoLigacao o valor true. Essa variável é global e tem a finalidade de representar que o botão ligação foi clicado, ou seja, a ferramenta está pronta para que uma Ligação seja criada (o processo de instanciação de um objeto da classe Ligação será apresentado posteriormente). 37 O botão XML (Figura 19 – D), assim como os botões conceito e relação, também realiza verificação de algumas restrições para criação do Grafo Conceitual e depois invoca uma função responsável pela instanciação do objeto XML (este objeto XML corresponde a interpretação do GC na forma gráfica para um formato XML interpretável por máquina). A função que instancia o objeto XML será apresentada na Figura 20. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: _global.criaXML = function(){ var strNos = "", i; for(i = 0; i < _global.vetorConceito.length; i++){ strNos = strNos + _global.vetorConceito[i].getNoConceito(); } for(i = 0; i < _global.vetorRelacao.length; i++){ strNos = strNos + _global.vetorRelacao[i].getNoRelacao(); } for(i = 0; i < _global.vetorLigacao.length; i++){ strNos = strNos + _global.vetorLigacao[i].getNoLigacao(); } var strURL = "http://skywalker/ImplCLASSE/default.asp"; objXML = new XML("<graph>" + strNos+ "</graph>"); objXML.docTypeDecl = "<!DOCTYPE graph SYSTEM \"grafoRincon.dtd\">"; objXML.xmlDecl="<?xml version=\"1.0\"encoding=\"ISO-8859-1\"?>"; if(objXML.status == 0){ var auxXML = new XML(); auxXML.onLoad = function(sucess){ if (sucess) _root.listBox.addItem("Informação: Formato XML criado com SUCESSO"); else _root.listBox.addItem("Erro: Servidor não encontrado"); } objXML.sendAndLoad(strURL, auxXML, "POST"); } else{ trace("Erro: Arquivo XML não é válido"); } } Figura 20 – Função que instancia o objeto XML A Figura 20 apresenta a instanciação do objeto XML, mas vale lembrar que existem verificações de restrições anteriores à chamada desta função que serão apresentadas próxima seção. Na linha 1 é definido o nome da função. A linha 2 apresenta a instanciação de algumas variáveis auxiliares dentro da função. Entre as linhas 3 à 11, é montada uma string com os valores dos nós de cada objeto das três classe (nota-se que essa string é montada através da varredura realizada nos vetores que guardam as instâncias das três classes). A linha 12 apresenta a declaração da variável que recebe a URL da página que irá salvar o objeto XML em um arquivo. 38 Na linha 13 instancia-se um objeto, do tipo XML, que recebe por parâmetro o documento que é formado com o elemento raiz, concatenado com a string que recebeu o valor de cada nó. As linhas 14 e 15 trazem as declarações de versão do XML que está sendo utilizada e do arquivo DTD que deve ser utilizada na validação. A linha 16 verifica se o status do arquivo é “0” (este valor corresponde a um XML bem formado) e na linha 27 tem-se o erro que informa se o documento XML não é válido. Entre as linhas 17 e 24 tem-se o trecho de código responsável pelo envio do objeto XML para um servidor e por obter a resposta sobre a criação do arquivo XML. Na próxima figura, a 21, serão apresentados os elementos do tipo input text e o elemento do tipo combobox. A B D C Figura 21 – Elementos do tipo Input text utilizados na implementação A Figura 21 apresenta os cinco elementos do tipo inuput text que são utilizados na ferramenta. Dos cinco, três elementos fazem parte da criação do Conceito e da Relação (Figura 21 – A). Eles possuem a função de permitir que o usuário informe um valor para os elementos. Para o Conceito, os valores a serem informados são Tipo e Referente e no caso da Relação, o Tipo. Os itens marcados como “B” e “C” na Figura 21 também são do tipo input text. No entanto, eles recebem os valores digitados pelo usuário em “A”. Para fazer a atribuição em “B” utiliza-se o seguinte código: eval(idConceito).textoConceito.text=_root.tipoConceito.text+" :"+_root.referenteConceito.text;. Nota-se que neste código existe a função eval, que acessa o movieclip pelo nome passado por parâmetro. Assim o input text da (Figura 21 – B) que está dentro do movieclip pode receber os valores digitados nos input text referentes à criação do Conceito (Figura 21 – A). 39 Para fazer a atribuição em “C”, faz-se uso do seguinte código que é bastante semelhante ao anterior (aquele que foi apresentado para a criação do Conceito): eval(idRelacao).textoRelacao.text=_root.tipoRelacao.text; onde também se utiliza a função eval, que acessa o movieclip pelo nome passado por parâmetro. Com isso o input text da (Figura 21 – B) que está dentro do movieclip pode receber os valores digitados nos campos referentes à criação da Relação (Figura 21 – A). O elemento combobox (Figura 21 – D) consiste em uma lista predefinida de valores que podem ser escolhidos para definir a valência da Relação. No caso desta ferramenta foram listados seis elementos: “monoadic”, “dyadic”, “tresadic”, “quatroadic”, “cincoadic” e “seisadic” (a valência não possui um limite, no entanto, para a ferramenta foi apresentado o limite “seis” para realização dos testes). Vale comentar que existem algumas restrições na atribuição destes valores descritos acima e que elas serão exemplificadas na próxima seção. A Figura 22, abaixo, apresenta o elemento de interface do tipo listbox. Figura 22 – Elemento de interface do tipo listbox A Figura 22 apresenta o elemento de interface do tipo listbox. Como foi dito anteriormente, ele tem a finalidade de apresentar algumas restrições sobre determinadas tentativas de ações dos usuários. Na Figura 22 existem alguns exemplos de erros que foram apresentados, erros referentes a algumas restrições de criação de um Grafo Conceitual e que serão explicados na próxima seção. 4.3.2 Restrições dos Grafos Conceituais Nessa seção serão apresentados os códigos de implementação que tem a finalidade de seguir as regras de criação de um Grafo Conceitual básico, propostas por Sowa (2001a), além das restrições do modelo XML apresentado na seção 4.1.1. A primeiras restrições a serem tratadas serão sobre: a necessidade de um Conceito necessitar de Tipo definido 40 (sendo que o Referente é opcional) e também sobre um Conceito não poder se repetir dentro de GC. Para isso apresenta-se a Figura 23. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: on(press){//Evento disparado quando botão conceito é pressionado if(textTipoConceito == undefined){ _root.listBox.addItem("Erro: Digite o tipo do conceito"); } else{ if(_global.existeConceito()){ _root.listBox.addItem("Erro: Esse conceito já existe"); } else{ _global.numeroConceito++; _global.vetorConceito.push(new classeConceito()); } } Figura 23 – Restrições na criação de um Conceito A Figura 23 apresenta as restrições que a ferramenta impõe para a criação de um Conceito. Essas restrições foram implementadas dentro do evento que é acionado quando o botão conceito é pressionado (como descrito na linha 1). Na linha 2 é realizada uma verificação sobre a existência de texto na variável textTipoConceito que foi definida como variável do input text tipoConceito. Se esta variável estiver vazia é adicionado um erro no listbox (linha 3). Caso exista algum valor digitado para o Tipo do Conceito, então é realizada uma nova verificação na linha 6. Essa verificação é feita através da chamada da função que varre o vetor procurando por um Conceito com os mesmos valores do que se está tentando criar. Caso a função encontre este Conceito (ou seja, igual ao que se está tentando criar), um erro é adicionado no listbox (linha 7). Caso a função não encontre um valor igual, então é instanciado um Conceito que é adicionado ao seu vetor correspondente (linha 11). Os códigos da Figura 24, abaixo, são referentes às restrições da criação de uma Relação. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: on(press){//Envento disparado quando o botão Relação é pressionado if((textTipoRelacao == undefined)){ _root.listBox.addItem("Erro: Digite o tipo da relação"); } else{ if(_global.existeRelacao()){ _root.listBox.addItem("Atenção: Essa relação já existe no grafo e para sua valência prevalecerá o valor anterior"); _global.numeroRelacao++; var novaRelacao = new classeRelacao(); novaRelacao.setValencia(_global.valenciaEncontrada); _global.vetorRelacao.push(novaRelacao); } else{ _global.numeroRelacao++; 41 15: 16: 17: 18: } } } _global.vetorRelacao.push(new classeRelacao()); Figura 24 – Restrições na criação de uma Relação A Figura 24 apresenta as restrições que a ferramenta impõe para a criação de uma Relação. Essas restrições foram implementadas dentro do evento que é acionado quando o botão Relação é pressionado (como descrito na linha 1). Na linha 2 é realizada uma verificação sobre a existência de texto na variável textTipoRelacao que foi definida como variável do input text tipoRelacao. Se esta variável estiver vazia é adicionado um erro no listbox (linha 3). Caso exista algum valor digitado para o Tipo da Relação, então é realizada uma nova verificação na linha 6. Essa verificação é feita através da chamada da função que varre o vetor procurando por uma Relação com o mesmo valor de Tipo do que se está tentando criar. Caso a função encontre uma Relação com o Tipo igual ao que se está tentando criar, uma mensagem de atenção é adicionada no listbox (linha 7). Independente do retorno da função, é instanciado um objeto da classe Relação que é adicionado ao seu vetor correspondente (linhas 11 e 15). A diferença está no fato de que, quando a função encontra uma Relação com o Tipo igual ao da que se está querendo criar, uma variável global recebe o valor da valência que a função encontrou e depois é repassado este valor para a Relação instanciada (linhas 9 e 10). Isso corresponde à restrição dos Grafos Conceituais que exige que uma Relação com o mesmo Tipo tenha sempre a valência igual dentro de um mesmo GC. Os códigos presentes na Figura 25, abaixo, são referentes às restrições da criação de uma Ligação. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: if(_global.botaoLigacao){ _global.cidAtual = this; _global.criandoLigacao = true; _global.botaoLigacao = false; } else{ if(_global.primeiroEscolhido){ if((_global.cidAtual.getIdConceito() == null) || _global.ridAtual.getIdRelacao() == null)){ _root.listBox.addItem("Erro:Ligação incorreta. Mesmo elemento"); } else{ if(criaLigacao(this,_global.ridAtual.getIdRelacao(),"Conceito")){ _root.listBox.addItem("Erro:Ligação incorreta.Elementos já ligados"); } else{ 42 16: 17: 18: 19: 20: 21: 22: 23: 24: _global.numeroLigacao++; _global.vetorLigacao.push(new classeLigacao()); desenhaLigacao(); _global.ridAtual.setLigacoesDaRelacao( _global.cidAtual.getIdConceito()); _global.cidAtual.setLigacoesDoConceito( _global.ridAtual.getIdRelacao()); } } } } Figura 25 – Restrição na criação de uma Ligação A Figura 25 apresenta a implementação de algumas restrições sobre a criação de uma Ligação. Esse código está presente no evento onPress do Conceito, mas neste mesmo evento da Relação existe um código semelhante. O código da Figura 25 pode ser descrito da seguinte forma. O código entra as linhas 1 a 5 é executado quando o Conceito é o elemento de qual a Ligação está partindo. A linha 1 verifica se o botão ligação foi clicado fazendo com que a sua variável correspondente receba true (como foi explicado anteriormente). A linha 2 atribui o próprio objeto a uma outra variável global. Esta variável é utilizada como uma variável auxiliar na criação da Ligação. A linha 3 atribui o valor true a uma outra variável global que, por sua vez, tem a finalidade de indicar que a Ligação está sendo criada e que o primeiro elemento já foi escolhido. A linha 4 atribui o valor false à variável que indica que o botão ligação foi clicado. Isso se faz necessário, pois, caso contrário, o programa executaria o primeiro bloco do código novamente quando chegar no evento do segundo elemento da Ligação. O código entra as linhas 7 e 23 é executado quando o Conceito é o elemento cuja Ligação está chegando. A linha 7 faz a verificação sobre a variável global que representa que uma ligação está sendo criada, sendo que o primeiro elemento já foi escolhido. A linha 8 verifica se os elementos que estão se ligando são do mesmo Tipo e, caso a verificação seja verdadeira, adiciona um erro ao listbox (linha 9) (vale lembrar que isso é uma restrição dos GC segundo Sowa (2001a)). A linha 12 verifica, através de uma função, se já existe Ligação entre os elementos que se está tentando ligar. A função realiza uma varredura no vetor de Ligações do Conceito (que é um atributo da classe), verificando se o Conceito já está ligado àquela Relação. Caso a função retorne true, é inserido um erro no list Box (linha 13). Caso nenhuma restrição seja encontrada, então é instanciado um objeto da classe Ligação que é adicionado ao seu vetor correspondente (linha 17). 43 Na linha 18 é invocada a função que desenha a Ligação (a codificação dessa função foi explicada na seção 4.2.1). E, por fim, nas linhas 19 e 20, são adicionados aos vetores de cada classe os identificadores dos elementos que foram ligados (neste caso, o vetor que é preenchido é o que foi declarado como atributo de cada classe). A diferença que este código possui, quando utilizado na classe Relação, está em uma verificação a mais, que é realizada com intuito de descobrir se a Relação já não fez todas as Ligações que sua valência permite. Isso é feito através de uma função que compara o número de vezes que o identificador de determinada Relação aparece dentro do vetor de Ligações e, caso seja igual à valência da Relação, não permite que o usuário crie mais Ligações que envolvam aquela Relação. A Figura 26, abaixo, apresenta as restrições existentes para criação do XML. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: on(press){ //Envento disparado quando o botão XML é pressionado if(_global.vetorConceito.length > 1){ if(_global.vetorLigacao.length > 0){ if(_global.verificaLigacao()){ _global.criaXML(); } else{ _root.listBox.addItem("XML não pode ser criado. Existem relações com ligações faltando"); } } else{ _root.listBox.addItem("XML não pode ser criado. Existem relações com ligações faltando"); } } else{ if((_global.vetorConceito.length == 0) or (_global.vetorConceito.length == 1)){ if(_global.vetorRelacao.length > 0){ if(_global.verificaLigacao()){ _global.criaXML(); } else{ _root.listBox.addItem("XML não pode ser criado. Existem relações com ligações faltando"); } } else{ _global.criaXML(); } } } } Figura 26 – Restrições na criação do formato XML 44 A Figura 26 tem a finalidade de representar o código implementado para as restrições da geração do GC no formato XML. Esse código está dentro de um evento do botão XML que é disparado quando ele é pressionado (linha 1). O trecho de código que está entre as linha 2 e 14 é executado quando o GC possui mais de um Conceito. Essa verificação na linha 2 faz-se necessária, pois, caso não existam elementos, deverá ser verificado se o Grafo é vazio (sem elementos) ou se o Grafo é simples (onde existe apenas um Conceito) como na linha 16. Considerando que o primeiro bloco de códigos será executado (linhas 2 à 14), a linha 3 realiza uma verificação sobre a existência de Ligações. Caso existam Ligações no GC, é necessário fazer uma outra verificação para saber se todas as Relações foram ligadas na quantidade informada em sua valência (linha 4). Se não existirem Ligações, então é adicionado um erro ao list Box na linha 12. A verificação a respeito da quantidade especificada na valência, para cada Relação, é realizada por uma função que varre os vetores de Relação e de Ligação, comparando a valência com a quantidade de vezes que a Relação foi ligada. Caso todas as Ligações tenham sido feitas corretamente, a função que cria o XML é invocada na linha 5 (vale lembrar que a codificação dessa função foi apresentada na seção 4.2.1), caso contrário, é adicionado um erro ao list Box na linha 8. O segundo bloco de código, entre as linhas 16 e 30, diz respeito à verificação se um GC é vazio ou simples. Caso seja constatado que existe apenas um Conceito, ou que não existe nenhum (linha 16), é realizada uma outra verificação para saber se existe Relação no GC (linha 17). Caso exista Relação, deve-se verificar se sua valência está sendo respeitada (linha 18), caso não exista Relação, o objeto XML é criado (linha 26). Se a verificação da valência estiver sendo respeitada (linha 18), então o objeto XML é criado (linha 19), do contrário, é adicionado um erro ao list Box na linha 22. Na próxima seção será apresentado um exemplo de utilização da ferramenta. 4.3.3 Exemplo de utilização da ferramenta Após apresentar alguns elementos de interface e as restrições que foram implementadas, será apresentado nessa seção um exemplo de utilização da ferramenta. Para este exemplo considera-se o seguinte conhecimento sobre Árvores da disciplina de Estruturas de Dados: o Conceito Est de Da (representando Estruturas de Dados) possui um 45 Tipo e esse Tipo é o Conceito Árvore. O Conceito Árvore, por sua vez possui PréRequisitos: Ponteiro e Recursividade. Além disso, o Conceito Árvore pode possuir um exemplo e este exemplo é Árvore Binária. O exemplo da construção deste conhecimento está na Figura 27. Figura 27 – Exemplo de utilização da ferramenta A Figura 27 consiste em um exemplo de utilização da ferramenta com os elementos gráficos e as restrições para criação de um Grafo Conceitual como foi apresentado na seção anterior. Na Figura 28, abaixo, é demonstrado o formato XML, correspondente ao GC criado acima. 46 Figura 28 – Exemplo de GC no formato XML A Figura 28 representa o GC ilustrado, no seu modo gráfico, pela Figura 27. A apresentação do formato XML no browser, foi criada para que o resultado do Grafo Conceitual que a ferramenta gera, possa ser visualizado, no entanto, vale comentar que este formato XML pode ser enviado para um servidor através dos códigos do flash. No servidor, ele pode ser acessado por alguma linguagem de programação para WEB, permitindo a criação dos hiperdocumentos educacionais. O servidor foi configurado com intuito de apresentar o resultado que é gerado pela ferramenta, ou seja, o documento XML correspondente ao Grafo Conceitual criado, mas não será mais bem explicado por não fazer parte do foco principal deste trabalho. No entanto, o processamento do documento XML pelo servidor, juntamente com a criação dos hiperdocumentos educacionais, consiste em um trabalho futuro (como será descrito na seção 5). 47 5 CONCLUSÕES FINAIS E TRABALHOS FUTUROS A utilização de Grafos Conceituais na representação de conhecimento e na comunicação entre sistemas computacionais vem sendo utilizada desde 2001 pela equipe francesa denominada de Équipe représentation de connaissances par des graphes. Esta equipe desenvolveu um projeto que, dentre outros resultados, disponibilizou uma biblioteca C++ para a implementação de ferramentas que dão suporte à criação e interpretação de Grafos Conceituais. Os Grafos Conceituais são utilizados, por esta equipe, na comunicação entre robôs. A utilização de Grafos Conceituais na comunicação entre robôs apresentou resultados satisfatórios e fez com que eles, além da biblioteca, desenvolvessem uma ferramenta que dá suporte a vários elementos dos Grafos Conceituais como, por exemplo: negação, criação de situações, criação de preposições, disjunções, entre outros. Vale comentar que a biblioteca permite a criação de Grafos Conceituais complexos ou básicos, sendo que, quem vai decidir sobre a quantidade de elementos que deseja-se implementar, é o desenvolvedor. Visto que eles trabalham com intuito de permitir a comunicação entre sistemas computacionais com suporte a todos os elementos de Grafos Conceituais propostos por Sowa (2001a), os modelos de interpretação de Grafos Conceituais por máquina, propostos por eles (o BCGCT e o seu correspondente em XML: o CoGXML), são bastantes complexos no que diz respeito à quantidade de elementos e de ligações entre eles. Devido a isso, o modelo completo utilizado por eles pode se tornar complexo para um usuário que venha a utilizar a ferramenta para criação de hiperdocumentos educacionais. Os Grafos Conceituais podem ser utilizados para representação do conhecimento através de hiperdocumentos educacionais, e a união desses dois elementos em uma só ferramenta, tornar-se-ia interessante na medida em que poderia ajudar usuários leigos no que diz respeito à criação de hiperdocumentos educacionais. 48 Pode-se concluir, através da implementação desta ferramenta, que a tecnologia Flash, aliada aos elementos da linguagem XML, permite a criação de ferramentas gráficas que atendem às necessidades de uma aplicação que dê suporte à criação de Grafos Conceituais básicos e, além disso, realize a interpretação deste GC para um formato XML. Através deste trabalho, entretanto, não é possível determinar se o modelo XML criado para implementação da ferramenta deste trabalho pode ser utilizado para especificação de conteúdo didático em hiperdocumentos educacionais, pois tais hiperdocumentos têm requisitos diferenciados em relação a hiperdocumentos tradicionais no que diz respeito à necessidade de coerência das informações ali presentes. Assim, seria necessário realizar a implementação do último módulo desta ferramenta que apresentaria a necessidade ou não de adicionar elementos ao modelo XML. A partir disso propõem-se alguns trabalhos futuros: Implementação do módulo que interpreta o modelo XML para criação dos hiperdocumentos educacionais; Caso julguem-se necessário, fazer alterações na DTD do modelo XML utilizado Realizar um estudo sobre a biblioteca C++ do projeto CoGITaNT para fazer pela ferramenta para tradução dos grafos; melhorias na implementação ou até mesmo para utilizá-la, se constatado que o flash não dá suporte aos outros elementos do Grafo Conceitual; Verificar a possibilidade de implementação da ferramenta utilizando API’s do JAVA que permitem a criação de interfaces gráficas a manipulação de arquivos XML caso seja constatado que o Flash e a biblioteca C++ do projeto CoGITaNT não sejam eficientes na construção da ferramenta; Aprofundar os estudos sobre outras formas de representação do conhecimento para construção de hiperdocumentos educacionais. A ferramenta desenvolvida neste trabalho é eficaz no que se propõe, ou seja, permite a criação de Grafos Conceituais básicos (utilizando Conceitos, Relações e Ligações) e a interpretação para um formato XML. 49 6 REFERENCIAS BIBLIOGRÁFICAS (ANDRESON, 2001) Anderson, Richard; et all. Professional XML. Ciência Moderna: Rio de Janeiro – RJ, 2001. (CAMPOS, 2001) Campos, M.L.A. A Organização de Unidades do Conhecimento em Hiperdocumentos: o modelo conceitual como um espaço comunicacional para a realização da autoria. Tese de Doutorado em Ciência da Informação. IBICT-UFRJ/ECO, Rio de Janeiro, 2001. (CASANOVA, 1991) Casanova, M. et al. The nested context model for hyperdocuments. Hypertext ’91 Proceedings, pp. 193–201. ACM, ACM Press, 1991 (COGITANT, 2001) CoGITaNT. Conceptual Graphs Integrated Tools allowing Nested Typed graphs. Équipe représentation de connaissances par des graphes. LIRMM (Laboratoire d'Informatique, de Robotique et de Microélectronique de Montpellier – França). Disponível em http://cogitant.sourceforge.net/docs/index.html. Acesso em 28/10/2004. (CONKLIN, 1987) Conklin, J. Hypertext: An Introduction and Survey. IEEE Computer, v.10, n.9, p 17-41,1987. (DÍAZ, 1995) Díaz, A. et al. RMC: A Tool to Design WWW Applications. Jornal da World Wide Web, 1a edição. Dezembro 1995. (ECMA-262, 1999) ECMA-262. ECMAScript Language Specification. 3a edição. Dezembro 1999. Disponível em http://www.ecmainternational.org/publications/standards/Ecma-262.htm. Acesso em 25/11/2004. (ISAKOWITZ, 1995) Isakowitz, T. et al. RMM: A Methodology for Structured Hypermedia Design. Communications of the ACM, Agosto 1995. 50 (MANUAL DO FLASH MX, 2004) Corporation Inc, 2004. Manual do Flash MX. Macromedia (MEYER, 1989) Meyer, Bertrand. Object Oriented Software Construction. Englewood Cliffs, NJ: Prentice Hall, 1989. (PRESTES, 2003) Álvaro Nunes Prestes. Implementação de uma Aplicação para Análise das Funcionalidades XML do FLASH. Palmas, 2003. Estágio (Bacharel em Sistemas de Informação) – Centro Universitário Luterano de Palmas, Tocantins, 2003. (SCHWABE, 1995) Schwabe, D. The Object-Oriented Hypermedia Design Model. Communications of the ACM, v.38, n.8, p.45-46, 1995. (SOWA, 2001a) Sowa, John F. Conceptual Graphs. Disponível em http://www.jfsowa.com/cg/. Acesso em: 25 de setembro de 2004. (SOWA, 2001b) Sowa, John F. Conceptual Graph Examples. Disponível em http://users.bestweb.net/~sowa/cg/cgexamp.htm#Ex_1. Acesso em: 30 de outubro de 2004. (SOWA, 2001c) Sowa, John F. Conceptual Graph Standard. Disponível em http://users.bestweb.net/~sowa/cg/cgstand.htm. Acesso em: 30 de outubro de 2004. 51 ANEXOS 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: CÓDIGO ACTIONSCRIPT DA IMPLEMENTAÇÃO DA FERRAMENTA //Frame Inicial - Camada Framework //Variáveis Globais //Restrição sobre valores nos input text(Letras A-Z e Números 0-9) _root.referenteConceito.restrict = "A-Z 0-9"; _root.tipoConceito.restrict = "A-Z 0-9"; _root.tipoRelacao.restrict = "A-Z 0-9"; //Variáveis auxiliares para criação da ligação _global.cidAtual = null; _global.ridAtual = null; /*Variável utilizada para criação da Relação quando existe uma do mesmo tipo*/ _global.valenciaEncontrada = null; //Variáveis para controle do número de elementos criados _global.numeroConceito = 0; _global.numeroRelacao = 0; _global.numeroLigacao = 0; //Variáveis para desenho do corpo da ligação _global.comecaX;//Ponto Inicial X _global.comecaY;//Ponto Inicial Y _global.fimX;//Ponto Final X _global.fimY;//Ponto Final Y //Variáveis que indicam quando a ligação está sendo criada _global.criandoLigacao = false; _global.botaoLigacao = false; _global.primeiroEscolhido = false; //Vetores que guardam os objetos correspondentes aos elementos _global.vetorConceito = new Array(); _global.vetorRelacao = new Array(); _global.vetorLigacao = new Array(); //Clase Ligação function classeLigacao(){ //Construtor //Atributos //Atributo identificador this.idLigacao = "Ligacao"+_global.numeroLigacao; //Identificador do Conceito this.cid = _global.cidAtual.getIdConceito(); //Identificador da Relação this.rid = _global.ridAtual.getIdRelacao(); //Atributo Nó XML da Ligação this.noLigacao = "<link idLink=\""+this.idLigacao+"\" cid=\""+this.cid+"\" rid=\""+this.rid+"\"/>"; //Métodos //Método que retorna o identificador this.getIdLigacao = getIdLigacao; //Método que retorna o id do Conceito this.getCid = getCid; //Método que retorna o id da Relação this.getRid = getRid; //Método que retorna o Nó XML this.getNoLigacao = getNoLigacao; } 52 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: //Implementação dos métodos function getIdLigacao(){//Nome return this.idLigacao;//Retorno } function getCid(){//Nome return this.cid;//Retorno } function getRid(){//Nome return this.rid;//Retorno } function getNoLigacao(){//Nome return this.noLigacao;//Retorno } //Classe Conceito function classeConceito(){ //Construtor //Atributos //Atributo Identificador this.idConceito = "Conceito"+_global.numeroConceito; //Atributo tipo this.tipoConceito = _root.tipoConceito.text; //Atributo referente this.referente = _root.referenteConceito.text; //Vetor de Relações ligadas this.ligacoesDoConceito = new Array(); //Atributo Nó XML do Conceito this.noConceito = null; if(textReferente == undefined){//Se NÃO exite Referente this.noConceito = "<concept idConcept=\""+this.idConceito+"\" typeConcept=\""+this.tipoConceito+"\"/>"; } else{//Se exite Referente this.noConceito = "<concept idConcept=\""+this.idConceito+"\" typeConcept=\""+this.tipoConceito+"\" referring=\""+this.referente+"\"/>"; } //Métodos //Método que retorna o identificador this.getIdConceito = getIdConceito; //Método que retorna o tipo this.getTipoConceito = getTipoConceito; //Método que retorna o referente this.getReferente = getReferente; //Método que retorna o Nó XML this.getNoConceito = getNoConceito; //Método que seta a Relação que se liga com o Conceito this.getLigacoesDoConceito = getLigacoesDoConceito; //Método que retorna o vetor de Relações que ligam com o Conceito this.setLigacoesDoConceito = setLigacoesDoConceito; //Método que retorna o objeto this.getObjetoConceito = getObjetoConceito; //Métodos do Moviel Clip - Referente a parte Gráfica //Atacha o elemento Conceito da biblioteca attachMovie("Conceito", this.idConceito, _global.numeroConceito); //Faz com que o elemento siga o movimento do mouse startDrag(this.idConceito,true,76,112,718,503); //Preenche o Input text dentro do Conceito if(textReferente == undefined){//Se NÃO existe Referente 53 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: eval(this.idConceito).textoConceito.text = _root.tipoConceito.text; } else{//Se existe Referente eval(this.idConceito).textoConceito.text = _root.tipoConceito.text+":"+_root.referenteConceito.text; } } //Implementação dos Métodos function getIdConceito(){//Nome return this.idConceito;//Retorno } function getTipoConceito(){//Nome return this.tipoConceito;//Retorno } function getReferente(){//Nome return this.referente;//Retorno } function getNoConceito(){//Nome return this.noConceito;//Retorno } function getObjetoConceito(){//Nome return this;//Retorno } function getLigacoesDoConceito(){//Nome return this.ligacoesDoConceito;//Retorno } function setLigacoesDoConceito(elemento){//Nome this.ligacoesDoConceito.push(elemento);//Atribuição } //Implementação dos Eventos que herdam de Movie Clip //Instanciação classeConceito.prototype = new MovieClip(); //Evento disparado quando o MovieClip recebe o click do mouse classeConceito.prototype.onPress = function(){ stopDrag();//O movie clip pára de seguir os movimentos do mouse if(_global.botaoLigacao){ //Objeto conceito atribuido à variável global auxiliar _global.cidAtual = this; //Atribuição de valores a variáveis globais auxiliares _global.criandoLigacao = true; _global.botaoLigacao = false; } else{//Se o botão Ligação NÃO foi pressionado //Criação da Ligação no Conceito if(_global.primeiroEscolhido){//Se o 1° elemento da Ligação já foi escolhido /*Se alguma variável auxiliar de criação da Ligação está como null é porque a Ligação está sendo feito entre elementos iguais*/ if((_global.cidAtual.getIdConceito() == null) || (_global.ridAtual.getIdRelacao() == null)){ //Erro adicionado ao list box _root.listBox.addItem("Erro: Ligação incorreta. Mesmo elemento"); } else{//Os elementos são diferentes //Se os elementos já estão ligados 54 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: if(criaLigacao(this, _global.ridAtual.getIdRelacao(),"Conceito")){ //Erro adicionado ao list box _root.listBox.addItem("Erro: Ligação incorreta. Elementos já ligados"); } else{//Se os elementos NÃO estão ligados //Incremento do número de Ligações _global.numeroLigacao++; //Cria a instância da Ligação e adiciona no vetor _global.vetorLigacao.push(new classeLigacao()); //Função que desenha a Ligação - Parte Gráfica desenhaLigacao(); //Seta o vetor Relação que o Conceito que está ligando _global.ridAtual.setLigacoesDaRelacao(_global.cidAtual.getIdConceit o()); 208: //Seta o vetor Conceito que a Relação que está ligando 209: _global.cidAtual.setLigacoesDoConceito(_global.ridAtual.getIdRelaca o()); 210: } 211: } 212: //Variáveis auxiliares recebem valores default 213: _global.primeiroEscolhido = false; 214: _global.cidAtual = null; 215: _global.ridAtual = null; 216: } 217: } 218: } 219: //Evento disparado quando o mouse sai de dentro do MovieClip 220: classeConceito.prototype.onRollOut = function(){ 221: if(_global.criandoLigacao){//Se o botão Ligação foi pressionado 222: //Ponto inicial do desenho da Ligação 223: _global.comecaX = _xmouse; 224: _global.comecaY = _ymouse; 225: //Atribuição de valores a variáveis globais auxiliares 226: _global.primeiroEscolhido = true; 227: _global.criandoLigacao = false; 228: } 229: } 230: //Evento disparado quando o mouse entra dentro do MovieClip 231: classeConceito.prototype.onRollOver = function() { 232: if(_global.primeiroEscolhido){//Se o primeiro elemento foi escolhido 233: //Ponto final do desenho da Ligação 234: _global.fimX = _xmouse; 235: _global.fimY = _ymouse; 236: //Atribuição de valores a variáveis globais auxiliares 237: _global.cidAtual = this; 238: } 239: } 240: 241: //Classe Relação 242: 55 243: function classeRelacao(){ 244: //Construtor 245: //Atributos 246: //Atributo identificador 247: this.idRelacao = "Relacao"+_global.numeroRelacao; 248: //Atributo do tipo 249: this.tipoRelacao = _root.tipoRelacao.text; 250: //Atributo valência 251: this.valencia = _root.comboBox.getValue() 252: //Atributo Nó XML da Relação 253: this.noRelacao = "<relation idRelation=\""+this.idRelacao+"\" typeRelation=\""+this.tipoRelacao+"\" valence=\""+this.valencia+"\" />"; 254: //Vetor de Conceitos Ligados 255: this.ligacoesDaRelacao = new Array(); 256: //Métodos 257: //Método que retorna o identificador 258: this.getIdRelacao = getIdRelacao; 259: //Método que retorna o tipo 260: this.getTipoRelacao = getTipoRelacao; 261: //Método que retorna a valência 262: this.getValencia = getValencia; 263: //Método que seta a valência 264: this.setValencia = setValencia; 265: //Método que retorna o Nó XML 266: this.getNoRelacao = getNoRelacao; 267: //Método que retorna o objeto 268: this.getObjetoRelacao = getObjetoRelacao; 269: //Método que seta o Conceito que se liga com a Relação 270: this.setLigacoesDaRelacao = setLigacoesDaRelacao; 271: //Método que retorna o vetor de Conceitos que ligam com a Relação 272: this.getLigacoesDaRelacao = getLigacoesDaRelacao; 273: //Métodos do Moviel Clip - Referente a parte Gráfica 274: //Atacha o elemento Relação da biblioteca 275: attachMovie("Relacao", this.idRelacao, 1000 + _global.numeroRelacao); 276: //Faz com que o elemento siga o movimento do mouse 277: startDrag(this.idRelacao,true,88,112,705,503); 278: //Preenche o Input text dentro da Relação 279: eval(this.idRelacao).textoRelacaoCriada.text = _root.tipoRelacao.text; 280: } 281: //Implementação dos Métodos 282: function getIdRelacao(){//Nome 283: return this.idRelacao;//Retorno 284: } 285: function getTipoRelacao(){//Nome 286: return this.tipoRelacao;//Retorno 287: } 288: function getValencia(){//Nome 289: return this.valencia;//Retorno 290: } 291: function getNoRelacao(){//Nome 292: return this.noRelacao;//Retorno 293: } 294: function getObjetoRelacao(){//Nome 295: return this;//Retorno 296: } 297: function getLigacoesDaRelacao(){//Nome 298: return this.ligacoesDaRelacao;//Retorno 56 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: } function setValencia(elemento){//Nome this.valencia = elemento;//Atribuição } function setLigacoesDaRelacao(elemento){//Nome this.ligacoesDaRelacao.push(elemento);//Atribuição } //Implementação dos Eventos que herdam de Movie Clip //Instanciação classeRelacao.prototype = new MovieClip(); //Evento disparado quando o MovieClip recebe o click do mouse classeRelacao.prototype.onPress = function(){ stopDrag();//O movie clip pára de seguir os movimentos do mouse if(_global.botaoLigacao){//se o botão Ligação foi clicado //Se a Relação ainda não fez o número máximo de Ligações permitidas if(this.getLigacoesDaRelacao().length < this.getValencia()){ //Objeto Relação atribuido à variável global auxiliar _global.ridAtual = this; //Atribuição de valores a variáveis globais auxiliares _global.criandoLigacao = true; _global.botaoLigacao = false; } else{//Se a Relação já fez o número de Ligações permitidas //Erro adicionado ao list box _root.listBox.addItem("Erro: Ligação incorreta. Relação possui as ligações possíveis"); } } else{//Se o botão Ligação NÃO foi pressionado //Criação da Ligação na Relação if(_global.primeiroEscolhido){//Se o 1° elemento da Ligação já foi escolhido /*Se alguma variável auxiliar de criação da Ligação está como null é porque a Ligação está sendo feito entre elementos iguais*/ if((_global.cidAtual.getIdConceito() == null) || (_global.ridAtual.getIdRelacao() == null)){ //Erro adicionado ao list box _root.listBox.addItem("Erro: Ligação incorreta. Mesmo elemento"); } else{//Os elementos são diferentes //Se os elementos já estão ligados if(criaLigacao(this, _global.cidAtual.getIdConceito(),"Relacao")){ //Erro adicionado ao list box _root.listBox.addItem("Erro: Ligação incorreta. Elementos já ligados"); } else{//Se os elementos NÃO estão ligados //Se a Relação ainda não fez o número máximo de Ligações permitidas if(this.getLigacoesDaRelacao().length < this.getValencia()){ //Incremento do número de Ligações _global.numeroLigacao++; //Cria a instância da Ligação e adiciona no vetor 57 347: 348: 349: 350: 351: classeLigacao()); Parte Gráfica que está ligando _global.vetorLigacao.push(new //Função que desenha a Ligação desenhaLigacao(); //Seta o vetor Relação que o Conceito _global.ridAtual.setLigacoesDaRelacao(_global.cidAtual.getIdConceit o()); 352: //Seta o vetor Conceito que a Relação que está ligando 353: _global.cidAtual.setLigacoesDoConceito(_global.ridAtual.getIdRelaca o()); 354: } 355: else{//Se a Relação já fez o número de Ligações permitidas 356: //Erro adicionado ao list box 357: _root.listBox.addItem("Erro: Ligação incorreta. Relação possui as ligações possíveis"); 358: } 359: } 360: } 361: //Variáveis auxiliares recebem valores default 362: _global.primeiroEscolhido = false; 363: _global.cidAtual = null; 364: _global.ridAtual = null; 365: } 366: } 367: } 368: //Evento disparado quando o mouse sai de dentro do MovieClip 369: classeRelacao.prototype.onRollOut = function() { 370: if(_global.criandoLigacao){//Se o botão Ligação foi pressionado 371: //Ponto inicial do desenho da Ligação 372: _global.comecaX = _xmouse; 373: _global.comecaY = _ymouse; 374: //Atribuição de valores a variáveis globais auxiliares 375: _global.primeiroEscolhido = true; 376: _global.criandoLigacao = false; 377: } 378: } 379: //Evento disparado quando o mouse entra dentro do MovieClip 380: classeRelacao.prototype.onRollOver = function(){ 381: if(_global.primeiroEscolhido){//Se o primeiro elemento foi escolhido 382: //Ponto final do desenho da Ligação 383: _global.fimX = _xmouse; 384: _global.fimY = _ymouse; 385: //Atribuição de valores a variáveis globais auxiliares 386: _global.ridAtual = this; 387: } 388: } 389: 390: //Registro das classes 391: 392: //Utilizados pra informações aos desenvolvedor em tempo de projeto 393: //Realiza o registro das três classes implementadas 394: //Apresenta a mensagem de registro com sucesso caso a classe seja registrada 58 395: //Apresenta a mensagem de erro caso exista algum problema com o registro 396: if(Object.registerClass("Conceito",classeConceito)==true){//Conceito 397: trace("Classe Conceito Registrada com sucesso"); 398: } 399: else{ 400: trace("Classe Conceito NÃO foi Registrada com sucesso."); 401: } 402: if(Object.registerClass("Relacao",classeRelacao)==true){//Relação 403: trace("Classe Relação Registrada com sucesso"); 404: } 405: else{ 406: trace("Classe RELAÇÃO NÃO foi Registrada com sucesso."); 407: } 408: if(Object.registerClass("Ligacao",classeLigacao)==true){//Ligação 409: trace("Classe Ligacao Registrada com sucesso"); 410: } 411: else{ 412: trace("Classe Ligacao NÃO foi Registrada com sucesso."); 413: } 414: 415: Funções 416: 417: //Função que verifica a existencia de Conceito no vetor 418: _global.existeConceito = function(){ 419: //variáveis usadas na função 420: var achou = false, i = 0, vazio = ""; 421: //Laço de repetição que percorre o vetor enquanto a informação não for encontrada 422: while((achou == false) and (i < _global.vetorConceito.length)){ 423: //Se o tipo digitado é igual ao tipo do objeto do vetor 424: if(textTipoConceito == _global.vetorConceito[i].getTipoConceito()){ 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: vazio){ vazio //Se NÃO foi digitado um referente pelo usuário if(textReferente == undefined){ //Se o referente do objeto do vetor está vazio if(_global.vetorConceito[i].getReferente() == //Conceito encontrado achou = true; } //Se o referente do objeto do vetor NÃO está else{ } digitado //Conceito NÃO encontrado achou = false; } //Se foi digitado um referente pelo usuário else{ //Se o referente do objeto do vetor é igual ao if(textReferente == _global.vetorConceito[i].getReferente()){ 442: //Conceito encontrado 443: achou = true; 444: } 59 445: 446: 447: ao digitado //Se o referente do objeto do vetor NÃO é igual else{ //Conceito NÃO encontrado 448: achou = false; 449: } 450: } 451: } 452: //Se o tipo digitado NÃO é igual ao tipo do objeto do vetor 453: else{ 454: //Conceito NÃO encontrado 455: achou = false; 456: } 457: //Incrementa o contador 458: i++; 459: } 460: return achou;//Retorno da função 461: } 462: 463: //Função que procura existencia de Relação 464: _global.existeRelacao = function(){ 465: //variáveis usadas na função 466: var achou = false, i = 0; 467: //Laço de repetição que percorre o vetor enquanto a informação não for encontrada 468: while((achou == false) and (i < _global.vetorRelacao.length)){ 469: //Se o tipo do objeto do vetor é igual ao digitado 470: if((textTipoRelacao == _global.vetorRelacao[i].getTipoRelacao())){ 471: //Relação encontrada 472: achou = true; 473: //Valência do objeto encontrado é atribuída à variável auxiliar 474: _global.valenciaEncontrada = _global.vetorRelacao[i].getValencia(); 475: } 476: //Se o tipo do objeto do vetor NÃO é igual ao digitado 477: else{ 478: //Relação NÃO encontrada 479: achou = false; 480: } 481: //Incrementa o contador 482: i++; 483: } 484: return achou;//Retorno da função 485: } 486: 487: //Função que verifica se a ligação pode ser criada 488: criaLigacao = function(classe, inserir, parametro){ 489: //variáveis usadas na função 490: var i = 0, achou = false, vet = new Array(); 491: //Se a função foi invocada pelo Conceito 492: if(parametro == "Conceito"){ 493: //Atribui o vetor de ligações do Conceito à variável auxiliar 494: vet = classe.getLigacoesDoConceito(); 495: } 496: //Se a função foi invocada pela Relação 497: else{ 498: //Atribui o vetor de ligações da Relação à variável auxiliar 60 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: vet = classe.getLigacoesDaRelacao(); } do{//Início do laço de repetição //Se o parâmetro foi encontrado no vetor if(inserir == vet[i]){ //Ligação encontrada achou = true; } //Se o parâmetro NÃO foi encontrado no vetor else{ //Ligação NÃO encontrada achou = false; } i++; //Laço de repetição que percorre o vetor enquanto a informação não for encontrada 514: }while((achou == false and i < vet.length)); 515: return achou;//retorno da função 516: } 517: 518: /*Função que verifica se as todas as ligações foram feitas de acordo 519: com a valência de cada Relação*/ 520: _global.verificaLigacao = function(){ 521: //variáveis usadas na função 522: var ok = false, i, cont; 523: //Laço de repetição que percorre o vetor de Relações 524: for(i = 0; i < _global.vetorRelacao.length; i++){ 525: //Inicia o contador 526: cont = 0; 527: //Laço de repetição que percorre o vetor de Ligações 528: for(j = 0; j < _global.vetorLigacao.length; j++){ 529: //Se o identificador da Relação é igual ao rid da Ligação 530: if(_global.vetorRelacao[i].getIdRelacao() == _global.vetorLigacao[j].getRid()){ 531: //Incrementa o contador 532: cont++; 533: } 534: } 535: //Se a valência da Relação é igual ao contador 536: if(cont == _global.vetorRelacao[i].getValencia()){ 537: //Ligações realizadas corretamente 538: ok = true; 539: } 540: //Se a valência da Relação NÃO é igual ao contador 541: else{ 542: //Ligações NÃO realizadas corretamente 543: ok = false; 544: } 545: } 546: return ok;//Retorno da função 547: } 548: 549: //Função que Cria XML e envia para o servidor 550: _global.criaXML = function(){ 551: //variáveis usadas na função 552: var strNos = "", i; 553: //Varre o vetor Conceito e concatena o atributo do Nó XML 554: for(i = 0; i < _global.vetorConceito.length; i++){ 555: strNos = strNos + _global.vetorConceito[i].getNoConceito(); 61 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: } //Varre o vetor Relação e concatena o atributo do Nó XML for(i = 0; i < _global.vetorRelacao.length; i++){ strNos = strNos + _global.vetorRelacao[i].getNoRelacao(); } //Varre o vetor Ligação e concatena o atributo do Nó XML for(i = 0; i < _global.vetorLigacao.length; i++){ strNos = strNos + _global.vetorLigacao[i].getNoLigacao(); } //Variável com a URL do servidor var strURL = "http://skywalker/ImplCLASSE/default.asp"; //Instanciação do objeto XML objXML = new XML("<graph>" + strNos+ "</graph>"); //Informa a declaração do docType objXML.docTypeDecl = "<!DOCTYPE graph SYSTEM \"grafoRincon.dtd\">"; //Informa a declaração da versão XML objXML.xmlDecl = "<?xml version=\"1.0\" encoding = \"ISO-88591\"?>"; if(objXML.status == 0){//Se o objeto XML é bem formado //Instanciação da variável XML que recebe o retorno do servidor var auxXML = new XML(); //Método utilizado quando o objeto é carregado auxXML.onLoad = function(sucess){ if (sucess)//Se a resposta do servidor foi ok //Adiciona informação no list box _root.listBox.addItem("Informação: Formato XML criado com SUCESSO"); else//Se a resposta do servidor NÃO foi ok //Adiciona erro no list box _root.listBox.addItem("Erro: Servidor não encontrado"); } /*Método que envia o objeto XML para o servidor utilizando o método POST e carrega no objeto XML auxiliar*/ objXML.sendAndLoad(strURL, auxXML, "POST"); } else{//Se o objeto XML NÃO é bem formado //Adiciona erro no list box trace("Erro: Arquivo XML não é válido"); } } 586: 587: 588: 589: 590: 591: 592: 593: 594: 595: //Função que desenha a ligação 596: function desenhaLigacao(){ 597: //Instanciação da variável que recebe o movie clip vazio 598: var linha = createEmptyMovieClip("Ligacao", 2000+_global.numeroLigacao); 599: //Altera propriedades da seta 600: linha.lineStyle(2, 0x000000, 100); 601: //Indica o ponto inicial do desenho da Ligação 602: linha.moveTo(_global.comecaX,_global.comecaY); 603: //Indica o ponto Final do desenho da Ligação 604: linha.lineTo(_global.fimX, _global.fimY); 605: //Função que rotaciona a seta de acordo com a inclinação da Linha 606: rotacionarSeta(); 607: } 608: 609: //Função que rotaciona a seta de acordo com a inclinação da Linha 62 610: rotacionarSeta = function(){ 611: //Atacha o elemento Ponta da biblioteca 612: var ponta = attachMovie("Ponta", Ponta+_global.numeroLigacao,4000+_global.numeroLigacao); 613: //Move o elemento para o ponto final do corpo da Ligação 614: ponta._x = _global.fimX; 615: ponta._y = _global.fimY; 616: //quadro inferior direito onde x e y aumentam 617: if((_global.fimX > _global.comecaX) and (_global.fimY > _global.comecaY)){ 618: //u = (c1-a1,c2-a2) 619: u1 = (_global.fimX - _global.comecaX); 620: u2 = (_global.fimY - _global.comecaY); 621: //v = (c1-b1,c2-b2) 622: v1 = (_global.fimX - _global.comecaX); 623: v2 = (_global.fimY - _global.fimY); 624: numerador = u1*v1+u2*v2; //u * v = u1*v1 + u2*v2 (multiplicação de vetores) 625: //denominador = modulo (u) * modulo (v) (multiplicação vetorial) 626: denominador = Math.sqrt((Math.pow(u1,2)+Math.pow(u2,2)))*Math.sqrt((Math.pow(v1,2) +Math.pow(v2,2))); 627: //angulo teta = u*v(multiplicação vetorial)/u*v(multiplicação vetorial em modulo) 628: teta = numerador/denominador; 629: //rotacionar = arc cos de teta em grau (a função retorna em radianos) 630: arccos = Math.acos(teta); 631: //regra de três pra transformar de radianos pra graus 632: rotacionar = 180*arccos/Math.PI; 633: //propriedade rotation do movie clip recebe o resultado da operação 634: ponta._rotation = rotacionar; 635: } 636: //quadro inferior esquerdo onde x diminui e y aumenta 637: if((_global.fimX < _global.comecaX) and (_global.fimY > _global.comecaY)){ 638: u1 = (_global.comecaX - _global.fimX); 639: u2 = (_global.comecaY - _global.fimY); 640: v1 = (_global.comecaX - _global.comecaX); 641: v2 = (_global.comecaY - _global.fimY); 642: numerador = u1*v1+u2*v2; 643: denominador = Math.sqrt((Math.pow(u1,2)+Math.pow(u2,2)))*Math.sqrt((Math.pow(v1,2) +Math.pow(v2,2))); 644: teta = numerador/denominador; 645: arccos = Math.acos(teta); 646: rotacionar = (180*arccos/Math.PI)+90; 647: ponta._rotation = rotacionar; 648: } 649: //quadro superior direito onde x aumenta e y diminue 650: if((_global.fimX > _global.comecaX) and (_global.fimY < _global.comecaY)){ 651: u1 = (_global.fimX - _global.comecaX); 652: u2 = (_global.fimY - _global.comecaY); 653: v1 = (_global.fimX - _global.fimX); 654: v2 = (_global.fimY - _global.comecaY); 655: numerador = u1*v1+u2*v2; 63 656: 657: 658: 659: 660: 661: 662: 663: 664: 665: 666: 667: 668: 669: 670: 671: 672: 673: 674: 675: 676: 677: 678: 679: 680: 681: 682: 683: 684: 685: 686: 687: 688: denominador = Math.sqrt((Math.pow(u1,2)+Math.pow(u2,2)))*Math.sqrt((Math.pow(v1,2) +Math.pow(v2,2))); teta = numerador/denominador; arccos = Math.acos(teta); rotacionar = (180*arccos/Math.PI)+270; ponta._rotation = rotacionar; } //quadro superior esquerdo onde x e y diminuem if((_global.fimX < _global.comecaX) and (_global.fimY < _global.comecaY)){ u1 = (_global.comecaX - _global.fimX); u2 = (_global.comecaY - _global.fimY); v1 = (_global.comecaX - _global.fimX); v2 = (_global.comecaY - _global.comecaY); numerador = u1*v1+u2*v2; denominador = Math.sqrt((Math.pow(u1,2)+Math.pow(u2,2)))*Math.sqrt((Math.pow(v1,2) +Math.pow(v2,2))); teta = numerador/denominador; arccos = Math.acos(teta); rotacionar = (180*arccos/Math.PI)+180; ponta._rotation = rotacionar; } //quando a ligação está em linha reta (apontando para o SUL) if((_global.fimX == _global.comecaX) and (_global.fimY > _global.comecaY)){ ponta._rotation = 90; } //quando a ligação está em linha reta (apontando para o NORTE) if((_global.fimX == _global.comecaX) and (_global.fimY < _global.comecaY)){ ponta._rotation = 270; } //quando a ligação está em linha reta (apontando para o OESTE) if((_global.fimX < _global.comecaX) and (_global.fimY == _global.comecaY)){ ponta._rotation = 180; } //quando a ligação está em linha reta (apontando para o LESTE) if((_global.fimX > _global.comecaX) and (_global.fimY == _global.comecaY)){ ponta._rotation = 0; } } 689: 690: 691: 692: 693: Botões 694: 695: //Evento disparado quando o botão Conceito é pressionado 696: on(press){ 697: //Criação da ligação é interrompida caso esteja acontecendo 698: _global.botaoLigacao = false; 699: _global.criandoLigacao = false; 700: if(textTipoConceito == undefined){//Se NÃO foi digitado um tipo 701: //Erro adicionado ao list box 702: _root.listBox.addItem("Erro: Digite o tipo do conceito"); 703: } 704: else{//Se foi digitado um tipo 705: if(_global.existeConceito()){//Se existe um Conceito com o valor digitado 64 706: //Erro adicionado ao list box 707: _root.listBox.addItem("Erro: Esse conceito já existe"); 708: } 709: else{//Se NÃO existe um Conceito com o valor digitado 710: //Incremento do número de Conceitos 711: _global.numeroConceito++; 712: //Cria a instância do Conceito e adiciona no vetor 713: _global.vetorConceito.push(new classeConceito()); 714: } 715: } 716: //Atribui valores default à variáveis auxiliares 717: textReferente = undefined; 718: textTipoConceito = undefined; 719: } 720: 721: //Evento disparado quando o botão Relação é pressionado 722: on(press){ 723: //Criação da ligação é interrompida caso esteja acontecendo 724: _global.botaoLigacao = false; 725: _global.criandoLigacao = false; 726: if((textTipoRelacao == undefined)){//Se NÃO foi digitado um tipo 727: //Erro adicionado ao list box 728: _root.listBox.addItem("Erro: Digite o tipo da relação"); 729: } 730: else{//Se foi digitado um tipo 731: //Se existe uma Relação com o valor digitado 732: if(_global.existeRelacao()){ 733: //Erro adicionado ao list box 734: _root.listBox.addItem("Atenção: Essa relação já existe no grafo e para sua valência prevalecerá o valor anterior"); 735: //Incremento do número de Relações 736: _global.numeroRelacao++; 737: //Cria a instância da Relação 738: var novaRelacao = new classeRelacao(); 739: //Recebe o valor da valência da variável auxiliar 740: novaRelacao.setValencia(_global.valenciaEncontrada); 741: //Adiciona no vetor 742: _global.vetorRelacao.push(novaRelacao); 743: } 744: //Se NÃO existe uma Relação com o valor digitado 745: else{ 746: //Incremento do número de Relações 747: _global.numeroRelacao++; 748: //Cria a instância da Relação e adiciona no vetor 749: _global.vetorRelacao.push(new classeRelacao()); 750: } 751: } 752: //Atribui valores default à variáveis auxiliares 753: textTipoRelacao = undefined; 754: textValencia = undefined; 755: } 756: 757: //Evento disparado quando o botão Ligação é pressionado 758: on(press){ 759: //Variável global que informa que uma Ligação pode ser criada 760: _global.botaoLigacao = true; 761: } 762: 763: //Evento disparado quando o botão XML é pressionado 764: on(press){ 65 765: 766: 767: 768: 769: 770: 771: 772: 773: 774: 775: 776: 777: 778: 779: 780: 781: 782: 783: 784: 785: 786: 787: 788: 789: 790: 791: 792: 793: 794: 795: 796: 797: 798: 799: //Se existe mais de um elemento no vetor de Conceitos if(_global.vetorConceito.length > 1){ //Se existe elemento no vetor de Ligações if(_global.vetorLigacao.length > 0){ //Se todas as Ligações foram realizadas segundo a valência if(_global.verificaLigacao()){ //Função que cria o arquivo XML _global.criaXML(); } //Se alguma das Ligações NÃO foram realizadas segundo a valência else{ //Erro adicionado ao list box _root.listBox.addItem("XML não pode ser criado. Existem relações com ligações faltando"); } } //Se NÃO existe elemento no vetor de Ligações else{ //Erro adicionado ao list box _root.listBox.addItem("XML não pode ser criado. Existem relações com ligações faltando"); } } else{ //Se existe 0 ou 1 elemento no vetor de Conceitos if((_global.vetorConceito.length == 0) or (_global.vetorConceito.length == 1)){ //Se existem elementos no vetor de Relações if(_global.vetorRelacao.length > 0){ //Se todas as Ligações foram realizadas segundo a valência if(_global.verificaLigacao()){ //Função que cria o arquivo XML _global.criaXML(); } //Se alguma das Ligações NÃO foram realizadas segundo a valência else{ //Erro adicionado ao list box _root.listBox.addItem("XML não pode ser criado. Existem relações com ligações faltando"); 800: 801: 802: 803: 804: 805: 806: 807: 808: } 809: } } } } //Se NÃO existem elementos no vetor de Relações else{ //Função que cria o arquivo XML _global.criaXML(); }