# Importação sem toque

### O que é a funcionalidade Sem toque?

A importação sem toque é um método simples de apontar e clicar para importar bibliotecas C#. O Dynamo lê os métodos públicos de um arquivo *.dll* e os converte em nós do Dynamo. É possível usar a funcionalidade Sem toque para desenvolver seus próprios nós e pacotes personalizados e para importar bibliotecas externas para o ambiente do Dynamo.

!

> 1. Arquivos .dll
> 2. Nós do Dynamo

Com a funcionalidade Sem toque, é possível importar de fato uma biblioteca que não foi necessariamente desenvolvida para o Dynamo e criar um conjunto de novos nós. A funcionalidade Sem toque atual demonstra a mentalidade do projeto do Dynamo entre plataformas.

Esta seção demonstra como usar a funcionalidade Sem toque para importar uma biblioteca de terceiros. Para obter informações sobre como desenvolver sua própria biblioteca sem toque, consulte a [página wiki do Dynamo](https://github.com/DynamoDS/Dynamo/wiki/Zero-Touch-Plugin-Development).

### Pacotes sem toque

Os pacotes sem toque são um bom complemento aos nós personalizados definidos pelo usuário. Alguns pacotes que usam bibliotecas C# são listados na tabela abaixo. Para obter informações mais detalhadas sobre os pacotes, consulte a [seção Pacotes ](/pt-br/a_appendix/a-3_packages.md)no Apêndice.

| **Logotipo/Imagem** | **Nome**                                                                                   |
| ------------------- | ------------------------------------------------------------------------------------------ |
|                     | [Kit de ferramentas de malha](https://github.com/DynamoDS/Dynamo/wiki/Dynamo-Mesh-Toolkit) |
|                     | [Dynamo Unfold](http://dynamobim.com/dynamounfold/)                                        |
|                     | [Rhynamo](http://www.case-inc.com/blog/what-is-rhynamo)                                    |
|                     | [Optimo](https://github.com/BPOpt/Optimo)                                                  |

## Estudo de caso – Importar o AForge

Neste estudo de caso, vamos mostrar como importar a biblioteca *.dll* externa [AForge](http://www.aforgenet.com). O AForge é uma biblioteca robusta que oferece uma variedade de funcionalidades de processamento de imagens para inteligência artificial. Vamos fazer referência à classe de imagens no AForge para fazer alguns exercício de processamento de imagens abaixo.

Vamos começar por fazer o download do AForge. Na [página de download do AForge](http://www.aforgenet.com/framework/downloads.html), selecione *\[Instalador de download]* e faça a instalação após a conclusão do download.

No Dynamo, crie um novo arquivo e selecione *Arquivo > Importar biblioteca...*

!

Em seguida, localize o arquivo dll.

!

> 1. Na janela pop-up, navegue até a pasta de lançamento na instalação do AForge. Provavelmente isso estará em uma pasta semelhante a esta: *C:\Arquivos de Programas (x86)\AForge.NET\Framework\Release*.
> 2. **AForge.Imaging.dll:** somente queremos usar esse arquivo da biblioteca do AForge para este estudo de caso. Selecione este arquivo *.dll* e clique em *“Abrir”*.

De volta ao Dynamo, você deve ver um grupo de nós do **AForge** adicionados à biblioteca. Agora, temos acesso à biblioteca de imagens do AForge do nosso programa visual.

!

### Exercício 1 – Detecção de bordas

> Faça o download do arquivo de exemplo clicando no link abaixo.
>
> É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.

Agora que a biblioteca foi importada, começaremos de forma simples com este primeiro exercício (*01-EdgeDetection.dyn*). Vamos fazer um processamento básico de imagens em uma imagem de amostra para mostrar como o AForge filtra as imagens. Usaremos o nó *“Inspeção de imagem”* para mostrar nossos resultados e aplicar filtros no Dynamo de forma similar aos do Photoshop.

Para importar uma imagem, adicione um nó **File Path** à tela e selecione “soapbubbles.jpg” na pasta de exercícios (créd. foto: [flickr](https://www.flickr.com/photos/wwworks/667298782)).

!

O nó File Path simplesmente fornece uma sequência de caracteres do caminho para a imagem que selecionamos. Em seguida, precisamos convertê-la em um arquivo de imagem usável no Dynamo.

!

> 1. Use **Arquivo do caminho** para converter o item do caminho do arquivo em uma imagem no ambiente do Dynamo.
> 2. Conecte o nó **Caminho do arquivo** ao nó **File.FromPath**.
> 3. Para converter esse arquivo em uma imagem, usaremos o nó **Image.ReadFromFile**.
> 4. Por último, vamos ver o resultado. Solte um nó **Inspeção de imagem** na tela e conecte-se a **Image.ReadFromFile**. Ainda não usamos o AForge, mas importamos com êxito uma imagem para o Dynamo.

Em AForge.Imaging.AForge.Imaging.Filters (no menu de navegação), você notará que há uma ampla gama de filtros disponíveis. Agora, vamos usar um desses filtros para diminuir a saturação de uma imagem com base nos valores-limite.

!

> 1. Solte três controles deslizantes na tela, altere seus intervalos para que fiquem de 0 a 1 e seus valores de nível para 0,01.
> 2. Adicione o nó **Grayscale.Grayscale** à tela. Esse é um filtro do AForge que aplica um filtro de escala de cinza a uma imagem. Conecte os três controles deslizantes da etapa 1 a cr, cg e cb. Altere os controles deslizantes superior e inferior para ter um valor de 1 e o controle deslizante do meio para ter um valor de 0.
> 3. Para aplicar o filtro escala de cinza, é necessário executar uma ação em nossa imagem. Para isso, usamos **BaseFilter.Apply**. Conecte a imagem à entrada de imagem e **Grayscale.Grayscale** à entrada baseFilter.
> 4. A conexão a um nó **Inspeção de imagem** permitirá obter uma imagem sem saturação.

Podemos ter controle sobre como diminuir a saturação dessa imagem com base nos valores-limite para vermelho, verde e azul. Esses valores são definidos pelas entradas para o nó **Grayscale.Grayscale**. Observe que a imagem parece muito escura, pois o valor verde está definido como 0 no controle deslizante.

!

> 1. Altere os controles deslizantes superior e inferior para ter um valor de 0 e o controle deslizante do meio para ter um valor de 1. Dessa forma, obtemos uma imagem sem saturação mais legível.

Vamos usar a imagem sem saturação e aplicar outro filtro. A imagem sem saturação tem algum contraste, por isso, vamos testar a detecção de bordas.

!

> 1. Adicione um nó **SobelEdgeDetector.SobelEdgeDetector** à tela.
> 2. Conecte-o a **BaseUsingCopyPartialFilter.Apply** e conecte a imagem sem saturação à entrada de imagem desse nó.
> 3. O Sobel Edge Detector realçou as bordas em uma nova imagem.

Aproximando o zoom, o detector de bordas destacou os contornos das bolhas com pixels. A biblioteca AForge tem ferramentas para obter resultados como este e criar a geometria do Dynamo. Vamos explorar isso no próximo exercício.

!

### Exercício 2 – Criação de retângulo

Agora que aprendemos alguns conceitos básicos do processamento de imagens, vamos usar uma imagem para determinar a geometria do Dynamo. Neste exercício, em um nível elementar, temos como objetivo fazer um *“Traço automático”* de uma imagem usando o AForge e o Dynamo. Vamos simplificar e extrair retângulos de uma imagem de referência, mas há ferramentas disponíveis no AForge para operações mais complexas. Vamos trabalhar com *02-RectangleCreation.dyn* dos arquivos de exercício que transferimos por download.

!

> 1. Com o nó File Path, navegue para grid.jpg na pasta de exercícios.
> 2. Conecte as séries restantes de nós acima para revelar um eixo paramétrico de curso.

Nesta próxima etapa, queremos fazer referência aos quadrados brancos na imagem e convertê-los em geometria real do Dynamo. O AForge tem muitas ferramentas eficazes de Pesquisa visual computacional e, aqui, vamos usar uma ferramenta particularmente importante para a biblioteca chamada [BlobCounter](http://www.aforgenet.com/framework/docs/html/d7d5c028-7a23-e27d-ffd0-5df57cbd31a6.htm).

!

> 1. Após adicionar BlobCounter à tela, precisamos de uma forma de processar a imagem (de modo semelhante à ferramenta **BaseFilter.Apply** no exercício anterior).

Infelizmente, o nó “Processar imagem” não está imediatamente visível na biblioteca do Dynamo. Isso acontece porque a função pode não estar visível no código fonte do AForge. Para corrigir isso, precisamos encontrar uma solução alternativa.

!

> 1. Adicione um nó Python à tela e adicione o seguinte código ao nó Python. Esse código importa a biblioteca AForge e, em seguida, processa a imagem importada.

```
import sys
import clr
clr.AddReference('AForge.Imaging')
from AForge.Imaging import *

bc= BlobCounter()
bc.ProcessImage(IN[0])
OUT=bc
```

Conectando a saída da imagem à entrada do nó Python, obtemos um resultado AForge.Imaging.BlobCounter do nó Python.

!

As próximas etapas abrangem alguns truques que demonstram familiaridade com a [API de imagem do AForge](http://www.aforgenet.com/framework/docs/html/d087503e-77da-dc47-0e33-788275035a90.htm). Não é necessário aprender tudo isso para trabalhar no Dynamo. Esta é mais uma demonstração de como trabalhar com bibliotecas externas dentro da flexibilidade do ambiente do Dynamo.

!

> 1. Conecte a saída do script Python a BlobCounterBase.GetObjectRectangles. Essa ação faz a leitura de objetos em uma imagem, com base em um valor-limite, e extrai retângulos quantificados do espaço de pixel.

!

> 1. Adicione outro nó Python à tela, conecte-se a GetObjectRectangles e insira o código abaixo. Isso criará uma lista de objetos do Dynamo organizada.

```
OUT = []
for rec in IN[0]:
	subOUT=[]
	subOUT.append(rec.X)
	subOUT.append(rec.Y)
	subOUT.append(rec.Width)
	subOUT.append(rec.Height)
	OUT.append(subOUT)
```

!

> 1. Transponha a saída do nó Python da etapa anterior. Isso cria quatro listas, cada uma representando X, Y, Largura e Altura para cada retângulo.
> 2. Usando o bloco de código, organizamos os dados em uma estrutura que acomoda o nó Rectangle.ByCornerPoints (código abaixo).

```
recData;
x0=List.GetItemAtIndex(recData,0);
y0=List.GetItemAtIndex(recData,1);
width=List.GetItemAtIndex(recData,2);
height=List.GetItemAtIndex(recData,3);
x1=x0+width;y1=y0+height;
p0=Autodesk.Point.ByCoordinates(x0,y0);
p1=Autodesk.Point.ByCoordinates(x0,y1);
p2=Autodesk.Point.ByCoordinates(x1,y1);
p3=Autodesk.Point.ByCoordinates(x1,y0);
```

Temos uma matriz de retângulos representando os quadrados brancos na imagem. Através da programação, fizemos algo (quase) similar a um traço automático no Illustrator.

No entanto, ainda precisamos fazer um pouco de limpeza. Aumentando o zoom, podemos ver que temos vários retângulos pequenos indesejados.

!

Em seguida, vamos escrever códigos para nos livrar de retângulos indesejados.

!

> 1. Insira um nó Python entre o nó GetObjectRetangles e outro nó Python. O código do nó está abaixo e remove todos os retângulos que estão abaixo de um determinado tamanho.

```
rectangles=IN[0]
OUT=[]
for rec in rectangles:
 if rec.Width>8 and rec.Height>8:
  OUT.append(rec)
```

Com os retângulos supérfluos removidos, apenas para testar, vamos criar uma superfície com base nesses retângulos e efetuar a extrusão deles por uma distância baseada em suas áreas.

!

Por último, altere a entrada both\_sides para false para obtemos uma extrusão em uma direção. Mergulhe a peça em resina para obter uma mesa supermoderna.

!

Esses são exemplos básicos, mas os conceitos descritos aqui também podem ser usados em aplicativos reais incríveis. É possível usar a pesquisa visual computacional para diversos processos. Para nomear apenas alguns: leitores de código de barras, correspondência de perspectiva, [mapeamento de projeção](https://www.youtube.com/watch?v=XSR0Xady02o) e [realidade aumentada](http://aforgenet.com/aforge/articles/gratf_ar/). Para obter informações sobre tópicos mais avançados com o AForge relacionados a este exercício, leia [este artigo](http://aforgenet.com/articles/shape_checker/).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://primer2.dynamobim.org/pt-br/6_custom_nodes_and_packages/6-2_packages/5-zero-touch.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
