<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog Geo.NET &#187; c++</title>
	<atom:link href="http://blog.geoprocessamento.net/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.geoprocessamento.net</link>
	<description>Geoprocessamento, SIG e Sensoriamento Remoto</description>
	<lastBuildDate>Wed, 21 Sep 2011 12:00:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>ArcObjects e Class Extensions #2</title>
		<link>http://blog.geoprocessamento.net/2011/02/arcobjects-e-class-extensions-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=arcobjects-e-class-extensions-2</link>
		<comments>http://blog.geoprocessamento.net/2011/02/arcobjects-e-class-extensions-2/#comments</comments>
		<pubDate>Sun, 06 Feb 2011 22:18:36 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[ArcObjects]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[ESRI]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/2011/02/arcobjects-e-class-extensions-2/</guid>
		<description><![CDATA[


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2011/07/cascading-class-extensions/' rel='bookmark' title='Permanent Link: Cascading Class Extensions'>Cascading Class Extensions</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/12/arcobjects-e-class-extensions-1/' rel='bookmark' title='Permanent Link: ArcObjects e Class Extensions #1'>ArcObjects e Class Extensions #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/03/padro-de-projeto-activerecord-e-arcobjects/' rel='bookmark' title='Permanent Link: Padr&atilde;o de Projeto ActiveRecord e ArcObjects'>Padr&atilde;o de Projeto ActiveRecord e ArcObjects</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p align="justify">Boa tarde pessoal,</p>
<p align="justify">Lembram do artigo #1 sobre as class extensions? Falei um pouco sobre como as <em>CEs</em> funcionam? Dê lida <a rel="nofollow" target="_blank" href="blog.geoprocessamento.net/2010/12/arcobjects-e-class-extensions-1/">aqui</a> antes de ler este aqui.</p>
<p align="justify">Bem, as <em>class extensions</em> são um pouco difíceis de se manter, pois elas geram muito código, são controladas de forma esotérica (através de <em>IPropertySet’s</em>) e podem controlar alguns eventos importantes, como <em>OnChange, OnCreate </em>e <em>OnDelete</em> bem como as validações de uma feição.</p>
<p align="justify">Portanto, qual é uma maneira um pouco mais sã de construí-las? Uma primeira tentativa que fiz, foi utilizar herança para construí-las. Uma classe base com algumas funcionalidades era herdada por classes mais “abaixo” na cadeia e ia herdando funcionalidade. Mas como dizem por aí, composição é melhor que herança para extensão de função.</p>
<p align="justify"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2011/02/ClassDiagram1.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Diagrama de classes (herança)" border="0" alt="Diagrama de classes (herança)" src="http://blog.geoprocessamento.net/wp-content/uploads/2011/02/ClassDiagram1_thumb.png" width="467" height="500" /></a> </p>
<p align="justify">Na figura acima, percebemos que toda a funcionalidade é herdada através de herança. Todas as operações em OldBaseClassExtension (a mãe de todas) são marcadas como <em>virtual</em>, dando a possibilidade de sobreescrevemos o método pela classe filha.</p>
<p align="justify">Em código temos algo assim:</p>
<pre class="c#" name="code">    public interface IOldClassExtension : IClassExtension, IObjectClassExtension, IObjectClassValidation, IObjectClassEvents
    {
        // aqui dizemos que todas as classes derivadas de IOldClassExtension
        // devem implementar os métodos das interfaces correspondentes.
    }

    public class OldBaseClassExtension:IOldClassExtension
    {
        public virtual void Init(IClassHelper ClassHelper, ESRI.ArcGIS.esriSystem.IPropertySet ExtensionProperties)
        {
            throw new NotImplementedException();
        }

        public virtual void Shutdown()
        {
            throw new NotImplementedException();
        }

        public virtual string ValidateField(IRow Row, string FieldName)
        {
            throw new NotImplementedException();
        }

        public virtual string ValidateRow(IRow Row)
        {
            throw new NotImplementedException();
        }

        public virtual void OnChange(IObject obj)
        {
            throw new NotImplementedException();
        }

        public virtual void OnCreate(IObject obj)
        {
            throw new NotImplementedException();
        }

        public virtual void OnDelete(IObject obj)
        {
            throw new NotImplementedException();
        }
    }

    public class OldConcreteClassExtensionA : OldBaseClassExtension
    {
        public override void Init(IClassHelper ClassHelper, ESRI.ArcGIS.esriSystem.IPropertySet ExtensionProperties)
        {
            base.Init(ClassHelper, ExtensionProperties);
            // nova funcionalidade customizada
        }

        public override void Shutdown()
        {
            base.Shutdown();
            // nova funcionalidade customizada
        }

        public override string ValidateField(IRow Row, string FieldName)
        {
            base.ValidateField(Row, FieldName);
            // nova funcionalidade customizada
            return &quot;resultado de nova validação de campo&quot;;
        }

        public override string ValidateRow(IRow Row)
        {
            base.ValidateRow(Row);
            // nova funcionalidade customizada
            return &quot;resultado de nova validação de linha&quot;;
        }

        public override void OnChange(IObject obj)
        {
            base.OnChange(obj);
            // nova funcionalidade customizada
        }

        public override void OnCreate(IObject obj)
        {
            base.OnCreate(obj);
            // nova funcionalidade customizada
        }

        public override void OnDelete(IObject obj)
        {
            base.OnDelete(obj);
            // nova funcionalidade customizada
        }
    }

    public class OldConcreteClassExtensionB : OldBaseClassExtension
    {
        public override void Init(IClassHelper ClassHelper, ESRI.ArcGIS.esriSystem.IPropertySet ExtensionProperties)
        {
            base.Init(ClassHelper, ExtensionProperties);
            // nova funcionalidade customizada
        }

        public override void Shutdown()
        {
            base.Shutdown();
            // nova funcionalidade customizada
        }

        public override string ValidateField(IRow Row, string FieldName)
        {
            base.ValidateField(Row, FieldName);
            // nova funcionalidade customizada
            return &quot;resultado de nova validação de campo&quot;;
        }

        public override string ValidateRow(IRow Row)
        {
            base.ValidateRow(Row);
            // nova funcionalidade customizada
            return &quot;resultado de nova validação de linha&quot;;
        }

        public override void OnChange(IObject obj)
        {
            base.OnChange(obj);
            // nova funcionalidade customizada
        }

        public override void OnCreate(IObject obj)
        {
            base.OnCreate(obj);
            // nova funcionalidade customizada
        }

        public override void OnDelete(IObject obj)
        {
            base.OnDelete(obj);
            // nova funcionalidade customizada
        }
    }

    public class OldConcreteClassExtensionC : OldConcreteClassExtensionA
    {
        public override void Init(IClassHelper ClassHelper, ESRI.ArcGIS.esriSystem.IPropertySet ExtensionProperties)
        {
            base.Init(ClassHelper, ExtensionProperties);
            // nova funcionalidade customizada
        }

        public override void Shutdown()
        {
            base.Shutdown();
            // nova funcionalidade customizada
        }

        public override string ValidateField(IRow Row, string FieldName)
        {
            base.ValidateField(Row, FieldName);
            // nova funcionalidade customizada
            return &quot;resultado de nova validação de campo&quot;;
        }

        public override string ValidateRow(IRow Row)
        {
            base.ValidateRow(Row);
            // nova funcionalidade customizada
            return &quot;resultado de nova validação de linha&quot;;
        }

        public override void OnChange(IObject obj)
        {
            base.OnChange(obj);
            // nova funcionalidade customizada
        }

        public override void OnCreate(IObject obj)
        {
            base.OnCreate(obj);
            // nova funcionalidade customizada
        }

        public override void OnDelete(IObject obj)
        {
            base.OnDelete(obj);
            // nova funcionalidade customizada
        }
    }</pre>
<p>&#160;</p>
<p align="justify">Perceba como determinamos a funcionalidade nas classes filhas: além de herdarmos e sobreescrevermos o método, chamamos também o método base, através de base.OnChange(obj), por exemplo.</p>
<p align="justify">Ok, funciona, mas quando temos algumas <em>Class Extensions</em> e uma hierarquia com dois ou três níveis já se torna impossível de manter e <em>debugar</em> o código. Demora-se muito para atingir um resultado razoável.</p>
<p align="justify">Como faríamos se usássemos composição? Bem, vamos imaginar o seguinte: temos algumas tabelas que descrevem as <em>class extensions </em>de <strong>acordo com sua funcionalidade básica </strong>(nem todas as <em>CEs</em> precisam implementar IObjectClassValidation, caso não às usem) e uma forma de ler e instanciar estas <em>CEs</em> de acordo com esta tabela. O diagrama de classes seria basicamente este aqui:</p>
<p><a href="http://blog.geoprocessamento.net/wp-content/uploads/2011/02/ClassDiagram2.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Diagrama de CEs utilizando composição" border="0" alt="Diagrama de CEs utilizando composição" src="http://blog.geoprocessamento.net/wp-content/uploads/2011/02/ClassDiagram2_thumb.png" width="529" height="500" /></a> </p>
<p align="justify">Desta maneira temos um código muito mais simples e nenhuma dependência entre cada <em>ClassExtension</em>. Todas as <em>CEs</em> implementariam ICustomClassExtension, pois esta dá visibilidade para todos os eventos / validações (poderíiamos até ter implementado IObjectInspector para dar formas diferentes de edição à cada <em>CE</em>) que precisamos e o sistema faria o restante, consultado o banco de dados (poderia esta dentro de um próprio FileGeodatabase/ArcSDE) e descobrindo à ordem e quais <em>CEs</em> devem ser instanciadas.</p>
<p align="justify">O esquema em SQL ficaria parecido com:</p>
<pre class="sql" name="code">CREATE TABLE ENTIDADES
(
  -- conterá uma lista de feature classes ou de tabelas do ArcGIS
  nome_entidade varchar(128) NOT NULL, -- Lote
  nome_feature_dataset varchar(128) NOT NULL DEFAULT '', -- nome do feature dataset, caso exista
  nome_feature_class varchar(128) NOT NULL, -- nome da feature class, ex: FLTE_LOTES
  CONSTRAINT entidades_pk PRIMARY KEY (nome_entidade)
)

CREATE TABLE CLASS_EXTENSIONS
(
  -- conterá uma lista das class extensions disponíveis em determinada assembly.
  nome_class_extension varchar(128) NOT NULL, -- Validar Geometria de Lote
  descricao_namespace varchar(128) NOT NULL, -- ValidateParcelGeometryExtensions
  CONSTRAINT class_extensions_pk PRIMARY KEY (nome_class_extension),
  CONSTRAINT descricao_namespace_un UNIQUE (descricao_namespace)
)

-- tabela de relacionamento entre entidades e class extensions
-- é um relacionamento M:N
CREATE TABLE ENTIDADE_POSSUI_CLASS_EXTENSION
(
  nome_entidade varchar(128) NOT NULL REFERENCES ENTIDADES on (nome_entidade),
  nome_class_extension varchar(128) NOT NULL REFERENCES CLASS_EXTENSIONS on (nome_class_extension),
  ordem_criacao integer NOT NULL DEFAULT 0,
  CONSTRAINT epc_pk PRIMARY KEY (nome_entidade,nome_class_extension,ordem_criacao)
)</pre>
<p align="justify">&#160;</p>
<p align="justify">Através de um pouco de código C#, podemos descobrir se a classe implementada está disponível, instanciá-la dinamicamente e adicioná-la à uma lista de ClassExtensions (propriedade extensions em ICustomClassExtension). Aqui segue um pouco de código para vocês verem a diferença. Dessa forma cada classe cuida só do que ela precisa e podemos compor dinamicamente <em>class extensions </em>poderosas, apenas alterando os registros presentes no banco de dados e contando que os campos manipulados por cada uma exista na <em>feature class</em>.</p>
<pre class="c#" name="code">    public interface ICustomClassExtension:IClassExtension,IObjectClassExtension,IObjectClassEvents,IObjectClassValidation
    {
        List<iclassextension> extensions { get; set; }
        void CreateExtensions();
    }

    // esta é a classe mais importante. ela provê toda a funcionalidade
    // básica de buscar o banco de dados e encontrar quem são as extensões para
    // cada feature class e como usá-las
    public class CustomClassExtension:ICustomClassExtension
    {
        public List<iclassextension> extensions
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }

        public void CreateExtensions()
        {
            // vá ao banco de dados e descubra quem são as class extensions aplicáveis à esta classe
            /*
             * foreach (Record r in Query)
             * {
             *      Type t = Type.GetType(r.ClassExtensionAssemblyName) // ValidateParcelGeometry
             *      extensions.Add(Activator.CreateInstance(t));
             * }
            */
        }

        public void Init(IClassHelper ClassHelper, ESRI.ArcGIS.esriSystem.IPropertySet ExtensionProperties)
        {
            foreach (IClassExtension classEx in this.extensions)
            {
                // todas as classes implementam init
                classEx.Init(ClassHelper,ExtensionProperties);
            }
        }

        public void Shutdown()
        {
            foreach (IClassExtension classEx in this.extensions)
            {
                classEx.Shutdown();
            }
        }

        public void OnChange(IObject obj)
        {
            // so vou conseguir iterar sobre as classes que implementam IObjectClassEvents
            foreach (IObjectClassEvents classEvents in this.extensions)
            {
                classEvents.OnChange(obj);
            }
        }

        public void OnCreate(IObject obj)
        {
            // so vou conseguir iterar sobre as classes que implementam IObjectClassEvents
            foreach (IObjectClassEvents classEvents in this.extensions)
            {
                classEvents.OnCreate(obj);
            }
        }

        public void OnDelete(IObject obj)
        {
            // so vou conseguir iterar sobre as classes que implementam IObjectClassEvents
            foreach (IObjectClassEvents classEvents in this.extensions)
            {
                classEvents.OnDelete(obj);
            }
        }

        public string ValidateField(IRow Row, string FieldName)
        {
            string result = String.Empty;
            // so vou conseguir iterar sobre as classes que implementam IObjectClassValidation
            foreach (IObjectClassValidation validation in this.extensions)
            {
                result += validation.ValidateField(Row, FieldName);
            }

            return result;
        }

        public string ValidateRow(IRow Row)
        {
            string result = String.Empty;
            // so vou conseguir iterar sobre as classes que implementam IObjectClassValidation
            foreach (IObjectClassValidation validation in this.extensions)
            {
                result += validation.ValidateRow(Row);
            }

            return result;
        }
    }

    public class ValidateParcelGeometryExtensions : IClassExtension, IObjectClassExtension, IObjectClassValidation
    {
        public void Init(IClassHelper ClassHelper, ESRI.ArcGIS.esriSystem.IPropertySet ExtensionProperties)
        {
            throw new NotImplementedException();
        }

        public void Shutdown()
        {
            throw new NotImplementedException();
        }

        public string ValidateField(IRow Row, string FieldName)
        {
            throw new NotImplementedException();
        }

        public string ValidateRow(IRow Row)
        {
            throw new NotImplementedException();
        }
    }

    public class OnParcelEvents : IClassExtension, IObjectClassExtension, IObjectClassEvents
    {
        public void Init(IClassHelper ClassHelper, ESRI.ArcGIS.esriSystem.IPropertySet ExtensionProperties)
        {
            throw new NotImplementedException();
        }

        public void Shutdown()
        {
            throw new NotImplementedException();
        }

        public void OnChange(IObject obj)
        {
            throw new NotImplementedException();
        }

        public void OnCreate(IObject obj)
        {
            throw new NotImplementedException();
        }

        public void OnDelete(IObject obj)
        {
            throw new NotImplementedException();
        }
    }

    public class ValidateDwgFile : IClassExtension, IObjectClassExtension, IObjectClassValidation
    {
        public void Init(IClassHelper ClassHelper, ESRI.ArcGIS.esriSystem.IPropertySet ExtensionProperties)
        {
            throw new NotImplementedException();
        }

        public void Shutdown()
        {
            throw new NotImplementedException();
        }

        public string ValidateField(IRow Row, string FieldName)
        {
            throw new NotImplementedException();
        }

        public string ValidateRow(IRow Row)
        {
            throw new NotImplementedException();
        }
    }</pre>
<p align="justify">As vantagens de algo assim são enormes do ponto de vista de manutenção. São três simples tabelas e uma mudança simples de estrutura de código que vai dar muito mais liberdade para os desenvolvedores e usuários. No momento em que construirmos uma nova extensão, se todos os usuários tiverem à mesma instalada no PC, é só associarmos a mesma à uma entidade que imediatamente deveria funcionar perfeitamente. <strong>Poderíamos até deixar à cargo do usuário ligar ou desligar as <em>class extensions</em> de seu interesse.</strong></p>
<p align="justify">Entendo que este post é um <em>ArcObjects</em> um pouco mais avançado, mas é muito divertido ver como simples mudanças de arquitetura facilitam a vida dos desenvolvedores e transformar a forma como o usuário se relaciona com o software.</p>
<p align="justify">O que acharam?</p>
<p align="justify">Um abraço pessoal,</p>
<p align="justify">George R. C. Silva</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2011/07/cascading-class-extensions/' rel='bookmark' title='Permanent Link: Cascading Class Extensions'>Cascading Class Extensions</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/12/arcobjects-e-class-extensions-1/' rel='bookmark' title='Permanent Link: ArcObjects e Class Extensions #1'>ArcObjects e Class Extensions #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/03/padro-de-projeto-activerecord-e-arcobjects/' rel='bookmark' title='Permanent Link: Padr&atilde;o de Projeto ActiveRecord e ArcObjects'>Padr&atilde;o de Projeto ActiveRecord e ArcObjects</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2011/02/arcobjects-e-class-extensions-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Configure o TerraLib no Visual Studio 2003</title>
		<link>http://blog.geoprocessamento.net/2010/06/configure-o-terralib-3-3-no-visual-studio-2003/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=configure-o-terralib-3-3-no-visual-studio-2003</link>
		<comments>http://blog.geoprocessamento.net/2010/06/configure-o-terralib-3-3-no-visual-studio-2003/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 03:50:18 +0000</pubDate>
		<dc:creator>João Tácio</dc:creator>
				<category><![CDATA[João Tácio Silva]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[TerraLib]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=835</guid>
		<description><![CDATA[Configure o TerraLib no Visual Studio 2003 Por: Joao Tacio Este é o primeiro post de uma série sobre como utilizar a biblioteca TerraLib para desenvolver suas próprias aplicações. Espero que gostem! O tutorial apresentado é um complemento da documentação disponibilizada pelo INPE , que ensina como configurar a biblioteca TerraLib 3.3.1 no Visual Studio [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/09/criar-plugin-para-terraview/' rel='bookmark' title='Permanent Link: Criar plugin para TerraView'>Criar plugin para TerraView</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects-2/' rel='bookmark' title='Permanent Link: Brincando com ArcObjects #2'>Brincando com ArcObjects #2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/02/hello-world-arcgis-style/' rel='bookmark' title='Permanent Link: Hello World, ArcGIS style!'>Hello World, ArcGIS style!</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<h1>Configure o TerraLib no Visual Studio 2003</h1>
<h5><span style="font-weight: normal"><span style="color: #888888"><em>Por: Joao Tacio</em></span></span></h5>
</div>
<p>Este é o primeiro post de uma série sobre como utilizar a biblioteca TerraLib para desenvolver suas próprias aplicações. Espero que gostem!</p>
<p style="text-align: justify">O tutorial apresentado é um complemento da documentação disponibilizada pelo INPE , que ensina como configurar a biblioteca TerraLib 3.3.1 no Visual Studio 2003.</p>
<h3>1 - Requisitos para executar os exemplos</h3>
<ul>
<li>Visual Studio C++ 2003;</li>
<li>MySQL Administrator 5.o;</li>
<li>Driver MySQL para Windows;</li>
<li>Banco de Dados MySQL 5.1;</li>
<li>Biblioteca TerraLib para Windows, 3.3 ou superior;</li>
</ul>
<h3 style="text-align: justify">2 - Instruções gerais de instalação</h3>
<p style="text-align: justify">O primeiro software a instalar é o Visual Studio 2003. Utilize a instalação personalizada e <strong>desmarque o suporte a todas as outras linguagens diferentes do C++,</strong> por exemplo: C# e VB. A seguir, instale o MySQL, Driver do MySQL e o MySQL Administrator.</p>
<p style="text-align: justify">Após instalar com sucesso os softwares descritos acima, crie uma pasta no disco C, por exemplo C:/TerraDir e descompacte todo o conteúdo do arquivo TerraLib_win_v_3_3_1.zip. Após descompactar, a árvore de pastas deve seguir o formato da figura 1.</p>
<div id="attachment_836" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/1.png"><img class="size-medium wp-image-836" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/1-300x80.png" alt="Árvore de pastas do TerraLib" width="300" height="80" /></a><p class="wp-caption-text">Árvore de pastas do TerraLib</p></div>
<h3 style="text-align: justify">3 - Compilando a biblioteca TerraLib</h3>
<p style="text-align: justify">O primeiro passo é compilar toda biblioteca TerrLib. Para isso, abra o Visual Studio, clique em File/Open Project / e escolha a solution, referente à biblioteca que será executada. No exemplo abaixo será compilado a solution createDatabase.sln.</p>
<p style="text-align: justify"><strong>1) File/Open project/ ou Ctrl+Shift+O</strong><br />
C:\TerraDir\examples\createDatabase\createDatabase.sln. Certifique-se que o arquivo escolhido possui a extensão.sln, porque na pasta createDatabase, também possui um arquivo chamado createDatabase.dsw.</p>
<p style="text-align: justify"><strong>2) Build/Build Solution ou Ctrl+Shitf+B</strong><br />
Build Sucessfull -&gt; Essa mensagem é indício que está indo tudo muito bem, parabéns!</p>
<p style="text-align: justify">Faça este mesmo procedimento para todas as bibliotecas abaixo na ordem que estão listadas.</p>
<ul>
<li>createLayer;</li>
<li>createTable;</li>
<li>importMIDMIF;</li>
<li>importShape;</li>
<li>importDBF;</li>
<li>importJPEG;</li>
<li>copyLayer;</li>
<li>importGeoTab;</li>
<li>convertCoordinates;</li>
<li>databaseQuery;</li>
<li>databaseSQLQuery;</li>
<li>spatialQuery;</li>
<li>addGeomRepresentation;</li>
<li>createTheme;</li>
<li>themeGrouping;</li>
<li>createSTElementSet;</li>
<li>mosaicTIFFImages;</li>
<li>importCSV;</li>
<li>importGridData;</li>
<li>rasterSlicing;</li>
<li>querierFromTheme;</li>
<li>proxMatrixAndSpatialStatistics;</li>
<li>spatialQueryAndBuffer;</li>
<li>querierFromLayer;</li>
<li>createSTElementSetFromLayer;</li>
<li>image_processing.</li>
</ul>
<p style="text-align: justify">Após compilar todas as bibliotecas acima sem erros, pode fechar o Visual Studio. A próxima etapa consiste em codificar alguns trechos de códigos para iniciar o aprendizado na biblioteca TerraLib. No tutorial do INPE  existem diversas páginas com trechos de código.</p>
<p style="text-align: justify"><strong>4 - Configurar o projeto</strong></p>
<p style="text-align: justify">Este tutorial ficará limitado em explicar detalhadamente apenas os passos necessários para criar um projeto.</p>
<p style="text-align: justify">O primeiro passo é criar um novo projeto, para isso abra o Visual Studio. Escolha File/New/Project, conforme a figura 2 e coloque o nome no projeto de Primeiro Exemplo.</p>
<div id="attachment_837" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/2.png"><img class="size-medium wp-image-837" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/2-300x236.png" alt="Criar um novo projeto" width="300" height="236" /></a><p class="wp-caption-text">Criar um novo projeto</p></div>
<p>Escolha o template Console Application (.NET), conforme imagem 3.</p>
<div id="attachment_838" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/3.png"><img class="size-medium wp-image-838" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/3-300x204.png" alt="Figura 3 - Escolher Template" width="300" height="204" /></a><p class="wp-caption-text">Figura 3 - Escolher Template</p></div>
<p style="text-align: justify">Após criar o projeto PrimeiroExemplo, é necessário várias configurações. A primeira é adicionar os projetos existentes do TerraLib. Para isso clique na solution e escolha add e selecione Existing Project. Veja nas figuras 4, 5 e 6 como adicionamos o projeto terralib.</p>
<div id="attachment_839" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/4.png"><img class="size-medium wp-image-839" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/4-300x263.png" alt="Figura 04  - Adicionar projeto existente" width="300" height="263" /></a><p class="wp-caption-text">Figura 04 - Adicionar projeto existente</p></div>
<div id="attachment_840" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/5.png"><img class="size-medium wp-image-840" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/5-300x193.png" alt="Figura 05 - Adicionar projeto existente  (2° passo)" width="300" height="193" /></a><p class="wp-caption-text">Figura 05 - Adicionar projeto existente (2° passo)</p></div>
<div id="attachment_841" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/6.png"><img class="size-medium wp-image-841" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/6-300x193.png" alt="Figura 06 - Adicionar projeto existente (3° passo)" width="300" height="193" /></a><p class="wp-caption-text">Figura 06 - Adicionar projeto existente (3° passo)</p></div>
<div id="attachment_842" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/7.png"><img class="size-medium wp-image-842" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/7-300x193.png" alt="Figura 07 - Adicionar projeto existente (4° passo)" width="300" height="193" /></a><p class="wp-caption-text">Figura 07 - Adicionar projeto existente (4° passo)</p></div>
<p style="text-align: justify">Além do projeto terralib, é necessário adicionar os projetos libjpeg e tiff, que estão respectivamente nos caminhos C:\TerraDir\terralibw\libjpeg  e C:\TerraDir\terralibw\tiff. Após adicionar os três projetos, faça um Build na solution.</p>
<p style="text-align: justify">Além desses três projetos que foram incorporados ao projeto PrimeiroExemplo, outros projetos do TerraLib poderão ser agregados conforme a necessidade.</p>
<p style="text-align: justify">O procedimento a seguir objetiva configurar o projeto PrimeiroExemplo. Clique nas propriedades do projeto, conforme na figura 08.</p>
<div id="attachment_843" class="wp-caption aligncenter" style="width: 224px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/8.png"><img class="size-medium wp-image-843" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/8-214x300.png" alt="Figura 08 - Propriedades do Projeto" width="214" height="300" /></a><p class="wp-caption-text">Figura 08 - Propriedades do Projeto</p></div>
<p style="text-align: justify">Insira o caminho para os diversos diretórios adicionais do projeto. Para realizar essa operação, copie e cole toda a linha a seguir no campo Additional Include Directories. A figura 09 detalha o que precisa ser feito.</p>
<blockquote><p>.;..\..\src\terralib\kernel;..\..\src\terralib\drivers\MySQL;..\..\src\terralib\drivers\MySQL\include</p></blockquote>
<div id="attachment_844" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/9.png"><img class="size-medium wp-image-844" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/9-300x201.png" alt="Figura 09 - Adicionar Diretórios Adicionais" width="300" height="201" /></a><p class="wp-caption-text">Figura 09 - Adicionar Diretórios Adicionais</p></div>
<p style="text-align: justify">Desabilite o Precompiled headers. Não feche a janela de propriedades. Configure o Linker do projeto PrimeiroExemplo. Esse procedimento é necessário para que o projeto criado consiga referenciar as classes do TerraLib. Inclua as dependências adicionais conforme ilustra a figura 10. Para isso copie as linhas abaixo e cole em Additional Dependencies.</p>
<div id="attachment_845" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/10.png"><img class="size-medium wp-image-845" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/10-300x201.png" alt="Figura 10 - Desabilite os precompiled headers" width="300" height="201" /></a><p class="wp-caption-text">Figura 10 - Desabilite os precompiled headers</p></div>
<div id="attachment_846" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/11.png"><img class="size-medium wp-image-846" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/11-300x201.png" alt="Figura 11 - Additional dependencies" width="300" height="201" /></a><p class="wp-caption-text">Figura 11 - Additional dependencies</p></div>
<blockquote><p>../../Debug/terralib/terralib.lib ../../Debug/libjpeg/libjpeg.lib ../../Debug/tiff/tiff.lib</p>
<p>../../terralibw/zlib/zlibdll.lib ../../terralibw/MySQL/libMySQL.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib imm32.lib winmm.lib wsock32.lib winspool.lib delayimp.lib</p></blockquote>
<p style="text-align: justify">Após realizar todos os procedimentos acima, faça um build do projeto. Caso ocorrer algum erro, tente remover e copiar novamente as linhas que foram inseridas nas propriedades do projeto. Atenção ao copiar essas linhas, espaços não podem ser retirados ou inseridos.</p>
<p style="text-align: justify">Os procedimentos abaixo consistem em adicionar itens existentes ao projeto. Para o projeto PrimeiroProjeto, será adicionado as bibliotecas TeMySQL.h e TeMySQL.cpp. As figuras de 12 14 demonstram como adicionar o item TeMySQL.cpp ao Source File do Projeto.</p>
<div id="attachment_847" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/12.png"><img class="size-medium wp-image-847" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/12-300x192.png" alt="Figura 12 - Adicionar itens existentes do 1° passo" width="300" height="192" /></a><p class="wp-caption-text">Figura 12 - Adicionar itens existentes do 1° passo</p></div>
<div id="attachment_848" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/13.png"><img class="size-medium wp-image-848" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/13-300x192.png" alt="Figura 13 - Adicionar Itens existentes (2° passo)" width="300" height="192" /></a><p class="wp-caption-text">Figura 13 - Adicionar Itens existentes (2° passo)</p></div>
<p>A figura 13 apresenta os dois arquivos da biblioteca TerraLib que deverão ser inseridos ao projeto. Inicialmente escolha apenas TeMySQL.cpp a selecione Open.</p>
<div id="attachment_849" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/14.png"><img class="size-medium wp-image-849" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/14-300x290.png" alt="Figura 14 - Arquivos existentes da biblioteca" width="300" height="290" /></a><p class="wp-caption-text">Figura 14 - Arquivos existentes da biblioteca</p></div>
<p style="text-align: justify">Para adicionar o arquivo TeMySQL.h ao projeto, click sobre Header Files do projeto PrimeiroProjeto. A figura 14 demonstra como fazer isso. Os próximos passos para adicionar TeMySQL.h são os mesmos das figuras 12 e 13, porém escolha TeMySQL.h e pressione open.</p>
<p style="text-align: justify">Ao final de todos esses procedimentos, realize um build de todo o projeto PrimeiroProjeto para certificarmos que todos as configurações estão corretas.</p>
<h3 style="text-align: justify">5 – Codificar o primeiro exemplo</h3>
<p style="text-align: justify">Para iniciar a codificação do primeiro exemplo, click duas vezes sobre a classe PrimeiroExemplo.cpp, conforme a imagem 15 e adicione as bibliotecas e os métodos criarBancoDeDados e conectar. Após a figura 15 tem o código completo da classe PrimeiroExemplo.cpp. Após codificar a classe, realize um build no projeto e execute-o.</p>
<div id="attachment_850" class="wp-caption aligncenter" style="width: 266px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/15.png"><img class="size-medium wp-image-850" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/15-256x300.png" alt="Figura 15 - Alterando a classe PrimeiroExemplo.cpp" width="256" height="300" /></a><p class="wp-caption-text">Figura 15 - Alterando a classe PrimeiroExemplo.cpp</p></div>
<pre>#include "stdafx.h"
#include "conio.h"

#include "TeMySQL.h"
#include "TeDriverMIDMIF.h"

#using 

using namespace System;

//Declaração dos métodos
int conectar();
int criarBancoDeDados();

int _tmain()
{
    // TODO: Please replace the sample code below with your own.
    Console::WriteLine(S"Hello World");
	conectar();
	criarBancoDeDados();
	getch();
	return 0;
}

int criarBancoDeDados ()
{
	// Parâmetros do servidor de bancos de dados
	string host = "localhost";
	string dbname = "TerraTeste";
	string user = "root";
	string password = ""; 

	// Cria um novo banco
	TeDatabase* db = new TeMySQL();
	if (!db-&gt;newDatabase(dbname,user, password, host))
	{
	cout &lt;&lt; "Erro: " &lt;&lt; db-&gt;errorMessage() &lt;&lt; endl;
	return 1;
	} 

	cout &lt;&lt; "O banco de dados \"" &lt;&lt; dbname;
	cout &lt;&lt;"\" foi criado com sucesso no servidor MySQL localizado em\""
		&lt;&lt; host;
	cout &lt;&lt; "\" para o usuario \"" &lt;&lt; user &lt;&lt; "\"!"  &lt;&lt; endl;  	// Fecha o banco de dados  	db-&gt;close();
	delete db;
	return 0;
}

int conectar()
{
	// Cria uma conexão a um servidor de banco de dados
	TeDatabase* db = new TeMySQL();
	// Parametros do servidor de bancos de dados
	string host ="localhost";
	string dbname = "TerraTeste";
	string user = "root";
	string password = "";
	if (!db-&gt;connect(host,user, password,dbname,0))
	{
	cout&lt;&lt; "Erro: " &lt;&lt; db-&gt;errorMessage() &lt;&lt; endl;
	return 0;
	}
	cout &lt;&lt; "Aberta conexão ao banco: " &lt;&lt; dbname;
             db-&gt;close();
	delete db;
  }</pre>
<p><span style="color: #ff0000">Se esse tutorial foi útil, deixe um comentário por favor. Obrigado</span></p>
<p>Joao Tacio/TerraLab/UFOP-MG</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/09/criar-plugin-para-terraview/' rel='bookmark' title='Permanent Link: Criar plugin para TerraView'>Criar plugin para TerraView</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects-2/' rel='bookmark' title='Permanent Link: Brincando com ArcObjects #2'>Brincando com ArcObjects #2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/02/hello-world-arcgis-style/' rel='bookmark' title='Permanent Link: Hello World, ArcGIS style!'>Hello World, ArcGIS style!</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/06/configure-o-terralib-3-3-no-visual-studio-2003/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

