12
INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS COM O SKETCHUP UM RESUMO Leitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco de lado a interface amigável do apontar-clicar e nos concentraremos nos comandos baseados em texto para o SketchUp. Um rápido exemplo: Inicie o SketchUp, abra o menu Janela e selecione a entrada Console Rubi. Vamos desenhar uma linha desde a origem, [0, 0, 0], a um ponto de coordenadas [5, 5, 5]. Copie e cole no Console: Sketchup.active_model.entities.add_line [0,0,0], [5,5,5] Os comandos do SketchUp são compostos de termos específicos do SketchUp, mas a linguagem subjacente é Ruby. O objetivo deste resumo é apresentar alguns fundamentos em Ruby para que você possa entender os objetos do SketchUp e como eles são usados nos códigos. Para o propósito da parametrização de scripts precisaremos apenas de números inteiros e valores de ponto-flutuante. Internamente, o SketchUp aloja valores de comprimento em polegadas, mesmo se você escolher um modelo baseado no sistema métrico. Para converter metros em polegadas, basta acrescentar .m à dimensão. O SketchUp não pode desenhar ou armazenar comprimentos inferiores a 0,001 polegadas. Os ângulos devem ser dados em radianos. Para converter graus em radianos, basta acrescentar .degrees à dimensão. Em Ruby, uma cadeia de caracteres, conhecida como string, pode ser colocada entre aspas simples ou duplas. Se uma string é colocada entre aspas, o interpretador Ruby reconhece seqüências de escape (por exemplo, \t para tabulação, \n para nova linha) e os apresenta em conformidade. Uma variável pode começar com um sublinhado ou com qualquer letra minúscula. Enquanto que uma constante é atribuída a um nome com uma letra maiúscula. Se o valor de uma constante é mudado, o Ruby produz um aviso. Uma matriz é cercada por colchetes e pode conter qualquer coisa, inclusive números, strings, variáveis, constantes e até mesmo outras matrizes. Dados e operações relacionados são agrupados em estruturas chamadas de objetos. A natureza dos dados e operações em um objeto é determinada pela classe do objeto, e as operações definidas em uma classe são chamadas de seus métodos.

INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

Embed Size (px)

Citation preview

Page 1: INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS COM O SKETCHUP UM RESUMO

Leitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by

Matthew Scarpino Deste momento em diante, deixaremos um pouco de lado a interface amigável do apontar-clicar e nos concentraremos nos comandos baseados em texto para o SketchUp. Um rápido exemplo: Inicie o SketchUp, abra o menu Janela e selecione a entrada Console Rubi. Vamos desenhar uma linha desde a origem, [0, 0, 0], a um ponto de coordenadas [5, 5, 5]. Copie e cole no Console: Sketchup.active_model.entities.add_line [0,0,0], [5,5,5] Os comandos do SketchUp são compostos de termos específicos do SketchUp, mas a linguagem subjacente é Ruby. O objetivo deste resumo é apresentar alguns fundamentos em Ruby para que você possa entender os objetos do SketchUp e como eles são usados nos códigos. Para o propósito da parametrização de scripts precisaremos apenas de números inteiros e valores de ponto-flutuante. Internamente, o SketchUp aloja valores de comprimento em polegadas, mesmo se você escolher um modelo baseado no sistema métrico. Para converter metros em polegadas, basta acrescentar .m à dimensão. O SketchUp não pode desenhar ou armazenar comprimentos inferiores a 0,001 polegadas. Os ângulos devem ser dados em radianos. Para converter graus em radianos, basta acrescentar .degrees à dimensão. Em Ruby, uma cadeia de caracteres, conhecida como string, pode ser colocada entre aspas simples ou duplas. Se uma string é colocada entre aspas, o interpretador Ruby reconhece seqüências de escape (por exemplo, \t para tabulação, \n para nova linha) e os apresenta em conformidade. Uma variável pode começar com um sublinhado ou com qualquer letra minúscula. Enquanto que uma constante é atribuída a um nome com uma letra maiúscula. Se o valor de uma constante é mudado, o Ruby produz um aviso. Uma matriz é cercada por colchetes e pode conter qualquer coisa, inclusive números, strings, variáveis, constantes e até mesmo outras matrizes. Dados e operações relacionados são agrupados em estruturas chamadas de objetos. A natureza dos dados e operações em um objeto é determinada pela classe do objeto, e as operações definidas em uma classe são chamadas de seus métodos.

Page 2: INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

Objetos são estruturas de dados hierárquicos em que se organizam características relacionadas. Um objeto pode ser acessado como uma variável, mas ao contrário de uma variável, um objeto contém vários valores relacionados. É importante distinguir objetos de matrizes. Dois objetos do mesmo tipo devem ter as mesmas características, mas não necessariamente os mesmos valores. Uma classe define a estrutura de um objeto. Existem centenas de classes disponíveis nas bibliotecas Ruby e na interface de programação de aplicativos (API) em SketchUp. Se você analisar o código de outra pessoa, o método class ajuda a determinar com precisão com que tipo de dados você está lidando. Exemplos:

5.class

Fixnum

3.14159.class

Float

"Hello, world".class

String

[5, 6, 7].class

Array Fixnum, Float, String, e Array são classes fornecidas pela biblioteca padrão do Ruby. Existem mais de oitenta classes disponíveis na API do SketchUp. As duas seguintes são particularmente importantes:

• Edge - um objeto criado a partir da classe Edge representa um segmento de linha em um projeto SketchUp;

• Face - um objeto criado a partir da classe Face representa uma superfície bidimensional em um projeto SketchUp Um método é um procedimento definido em uma classe que opera em dados do objeto. Ou seja, se um objeto representa alguma coisa, um método proporciona um meio de interagir com as características dessa coisa. Métodos são chamados usando notação de ponto: o objeto é seguido por um ponto e o nome do método. Muitos métodos requerem dados adicionais para funcionar. Estes dados adicionais, chamados de argumentos ou parâmetros, podem ser fornecidos com ou sem parênteses. Se um método requer vários argumentos, os argumentos devem ser separados por vírgulas. Métodos Ruby podem ser encadeados. Ou seja, se o metodo_B pode operar sobre o valor retornado pelo metodo_A, você pode chamar os dois métodos com metodo_A.metodo_B.

Page 3: INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

O Apêndice A do livro sugerido apresenta uma lista dos métodos em cada uma das categorias definidas na API SketchUp. Fundamentos de SketchUp Scripting - criação de formas do SketchUp a partir de códigos. Até agora, você entrou comandos no Console Ruby do SketchUp e viu os resultados. Mas com scripts, você pode armazenar os seus comandos em arquivos em vez de ter que digitá-los todas as vezes. Script é um arquivo que contém os comandos que controlam um programa em execução. Você pode escrever um script SketchUp em qualquer editor de texto que escolher. Quando executado no console, o comando load diz ao SketchUp para ler um script e executar cada um dos seus comandos em seqüência. Por exemplo, salve o arquivo dentro da pasta plugins do SketchUp e no console digite load “star.rb”. Se ele estiver numa sub-pasta, digite com o endereço correto, como por exemplo load “aula/star.rb”. Para incluir comentários no seu script inicie a linha com #. Comentários de várias linhas podem ser incluídos dentro de um ambiente do tipo: =begin comentário blablabla blabla bla =end

Será apresentada agora uma grande quantidade de informações, a partir de estruturas de dados básicas do SketchUp (o módulo Sketchup, a classe Model e a classe Entities) para os objetos que representam formas em um projeto. Serão discutidas as formas reais que compõem modelos do SketchUp: Edges, Arrays, Faces e figuras tridimensionais. As classes e seus métodos são fáceis de entender, mas pode ser difícil coordená-los para formar um projeto. Portanto, recomenda-se que você pratique a criação desses objetos em scripts: forme Faces a partir de Edges e use pushpull e followme para extrudar as Faces em figuras tridimensionais.

Quase todos os scripts do SketchUp começam acessando três estruturas de dados básicas: Sketchup, Model e Entities. Um módulo é uma coleção de métodos. Para ver todos os métodos fornecidos pelo módulo Sketchup, digite Sketchup.methods no Console de Ruby. O módulo Sketchup representa o aplicativo SketchUp inteiro. O método mais importante no módulo Sketchup é o active_model. Isso retorna o objeto Model correspondente ao modelo SketchUp aberto no momento. mod = Sketchup.active_model

Page 4: INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

Isso recupera o objeto do Model atual e, em seguida, define mod como sendo igual ao objeto Model. O objeto Model representa um único arquivo do SketchUp (*.skp), ou, mais precisamente, as informações de modelo contido no arquivo. No momento, tudo o que queremos fazer é desenhar formas básicas do Google SketchUp. Para começar, o primeiro passo é chamar o método entities da classe Model e acessar os objetos Entities do projeto atual:

mod = Sketchup.active_model ents = mod.entities Todo objeto geométrico em um design SketchUp é representado por uma entidade ou uma subclasse, incluindo linhas, faces, imagens, textos, grupos e componentes. O que se pode fazer:

1. Adicionar novos objetos Entity ao projeto SketchUp atual; 2. Mover, ampliar, girar e apagar objetos Entity no projeto; 3. Alojar objetos Entity em uma matriz que podem ser acessados pelos índices.

A classe Entities contém vários métodos que adicionam novos objetos Entity ao projeto atual (add_X).

• add_line - cria uma aresta (objeto Edge) a partir de dois pontos;

• add_edges - forma uma matriz de objetos Edge a partir de uma série de pontos;

• add_circle - forma uma matriz de objetos Edge que se combinam para formar um círculo;

• add_ngon - forma uma matriz de objetos Edge que se combinam para formar um polígono;

• add_face – cria um objeto Face a partir de arestas ou pontos; • add_text - adiciona um texto ao modelo em um dado ponto.

Quando você salva o projeto, as arestas e faces serão incluídas no objeto Model armazenado. Objetos Edge são criados com o método add_line da classe Entities, seguido pelas coordenadas dos pontos iniciais e finais da linha. Sketchup.active_model.entities.add_line [5, 0, 0], [10, 0, 0] Os métodos length e split. O primeiro retorna o comprimento do segmento de linha correspondente ao Edge. O segundo aceita um ponto na linha e cria um segundo objeto Edge. Depois que o split é chamado, o primeiro objeto Edge

Page 5: INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

continua apenas até o ponto dado e o segundo objeto Edge continua a partir do ponto dado até a extremidade da linha original. Os seguintes comandos mostram como esses métodos são chamados na prática:

line = Sketchup.active_model.entities.add_line [0, 0, 0], [6, 3, 0]

line.length

6.70820393249937

new_line = line.split [4, 2, 0]

line.length

4.47213595499958

line.start.position

Point3d(0, 0, 0)

line.end.position

Point3d(4, 2, 0)

new_line.length

2.23606797749979

new_line.start.position

Point3d(4, 2, 0) new_line.end.position

Point3d(6, 3, 0)

No SketchUp, os pontos finais de uma aresta são representados por objetos Vertex. O método add_circle cria um círculo com um dado centro, vetor normal e o raio. Esse método cria uma matriz de 24 objetos Edge. Você pode adicionar um quarto parâmetro para o método add_circle que personaliza o número de segmentos no círculo. circle = Sketchup.active_model.entities.add_circle [1, 2, 3], [4, 5, 6], 7, 72

Page 6: INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

Script Star.rb

Objetos Face são criados pelo método add_face da classe Entities. Esse é semelhante ao método descrito anteriormente add_curve: aceita uma série de pontos ou uma série de arestas que pode ser fornecida em uma lista separado por vírgulas ou em uma matriz. O vetor normal de uma Face determina a direção de extrusão.

A maioria dos métodos da classe Face fornece informações sobre a natureza de sua forma: o método edges retorna uma matriz de objetos Edge que formam a Face e o método vertices retorna uma matriz de objetos Vertex no contorno da Face. O método area retorna a área da face e o método normal retorna seu vetor normal.

# Este script cria uma forma de estrela no plano xy,

# centrada em torno da origem.

# Acessa o objeto Entities atual

ents = Sketchup.active_model.entities

=begin

Cria cinco pontos em três dimensões

Cada ponto é o vértice de uma estrela

=end

pt1 = [0, 1, 0]

pt2 = [0.588, -0.809, 0]

pt3 = [-0.951, 0.309, 0]

pt4 = [0.951, 0.309, 0]

pt5 = [-0.588, -0.809, 0]

# Desenha cinco linhas em um padrão de estrela

ents.add_line pt1, pt2

ents.add_line pt2, pt3

ents.add_line pt3, pt4

ents.add_line pt4, pt5

ents.add_line pt5, pt1

Page 7: INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

Script pentagon.rb

O método classify_point aceita um ponto e identifica onde o ponto está localizado em

relação à face. Isto é útil quando você precisa detectar interseções ou determinar sobre qual

superfície o usuário clicou. O método retorna um dos seis valores:

• 0 – o ponto é desconhecido;

• 1 – o ponto está dentro da Face;

• 2 – o ponto está em uma das bordas da Face;

• 4 – o ponto é um dos vértices da Face;

• 8 – o ponto está sobre o plano que contém a face, mas não sobre a face;

• 16 – o ponto não está no plano que contém a face.

Exemplo:

face = Sketchup.active_model.entities.add_face [-1, -1, 0], [-1, 1, 0],

[1, 1, 0], [1, -1, 0]

face.classify_point [0, 0, 0]

1

face.classify_point [1, 1, 0]

4

face.classify_point [1, 2, 0]

# Este script constrói uma face pentagonal de cinco pontos.

# Cria os cinco pontos do pentágono

pt1 = [0, 1, 0]

pt2 = [-0.951, 0.309, 0]

pt3 = [-0.588, -0.809, 0]

pt4 = [ 0.588, -0.809, 0]

pt5 = [ 0.951, 0.309, 0]

# Desenha a face

pent = Sketchup.active_model.entities.add_face pt1, pt2, pt3,

pt4, pt5

# Mostra os locais dos vértices armazenados

puts "Point 0: " + pent.vertices[0].position.to_s

puts "Point 1: " + pent.vertices[1].position.to_s

puts "Point 2: " + pent.vertices[2].position.to_s

puts "Point 3: " + pent.vertices[3].position.to_s

puts "Point 4: " + pent.vertices[4].position.to_s

Page 8: INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

8

face.classify_point [1, 1, 1]

16

Figuras em três dimensões.

Script cutbox.rb

=begin

Este script começa com uma face retangular e a

extruda de modo a formar uma caixa 3-D (pushpull). Em

seguida, ele desenha uma linha em todo o canto

superior direito e chama pushpull para remover o

canto da caixa.

=end

# Cria a caixa

ent = Sketchup.active_model.entities

main_face = ent.add_face [0,0,0], [6,0,0], [6,8,0],

[0,8,0]

main_face.reverse!

main_face.pushpull 5

# Desenha uma linha no canto superior direito

cut = ent.add_line [6,6,5], [4,8,5]

# Remove a nova face

cut.faces[1].pushpull -5

=begin

O último comando vale a pena examinar de perto. A

segunda face no canto não é explicitamente criada em

código. Em vez disso, ele é construído

automaticamente quando a novo Edge é desenhada em

todo o canto da face. Uma vez elaborada, essa margem

está ligada a duas faces: uma que representa a face

principal e uma representando a face de canto. A cada

aresta se pode acessar os objetos Face adjacentes, e

a nova face está no índice 1. Portanto, o comando

empurra a segunda face para baixo, removendo o volume

de canto a partir da figura. Experimente trocar o

índice 1 por 0 em cut.faces[1].pushpull -5

=end

Page 9: INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

Script followme.rb

=begin

Este script cria uma face circular e a extruda ao

longo de um caminho retangular.

Com followme, a extrusão ainda é realizada ao longo

de um vetor, mas agora você controla a direção do

vetor. Ou seja, você deve especificar o caminho da

extrusão .

=end

# Acessa as entidades

model = Sketchup.active_model

ent = model.entities

# Cria a face primária

circle = ent.add_circle [0,0,0], [0,0,1], 2

circle_face = ent.add_face circle

# Cria o caminho

path = ent.add_curve [10,0,0], [10,0,5], [10,5,5],

[10,5,0], [10,0,0]

# Extruda o círculo ao longo do caminho

circle_face.followme path

Page 10: INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

Script lathe.rb

=begin

Este script cria uma figura de revolução, girando a

Face torno de um eixo. Aqui, a face é construída a

partir da matriz de pontos retornados pelo método

add_curve.

=end

# Acessa as Entidades

model = Sketchup.active_model

ents = model.entities

# Cria a forma 2-D

curve = ents.add_curve [0, 0, 1.244209], [0.116554,

0, 1.238382],

[0.160261, 0, 1.217985], [0.186486, 0, 1.188846],

[0.1894, 0, 1.165536], [0.17483, 0,

1.145139],[0.142778, 0, 1.127656], [0.096157, 0,

1.118914],

[0.093243, 0, 1.063551], [0.175152, 0, 0.996269],

[0.175152, 0, 0.915269], [0.28237, 0, 0.871026],

[0.375392, 0, 0.801741], [0.448486, 0, 0.711683],

[0.497151, 0, 0.606398], [0.51839, 0, 0.492371],

[0.510894, 0, 0.376625], [0.475126, 0, 0.26629],

[0.413287, 0, 0.168161], [0.329188, 0, 0.088283],

[0.228007, 0, 0.031575], [0.115978, 0, 0.001531],

[0, 0, 0], [0, 0, 1.244209]

curve_face = ents.add_face curve

# Cria o caminho circular

path = ents.add_circle [0, 0, 0], [0, 0, 1], 2

# Cria a figura

curve_face.followme path

Page 11: INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

Script chamfer.rb

=begin

Este script cria uma caixa tridimensional e chama

followme para cortar bordas superiores da caixa.

=end

# Cria a caixa

ents = Sketchup.active_model.entities

main_face = ents.add_face [0,0,0], [5,0,0], [5,8,0],

[0,8,0]

main_face.reverse!

main_face.pushpull 6, true

=begin

o método pushpull é seguido por um segundo parâmetro

definido como true. Normalmente, o pushpull exclui a

face utilizada para a extrusão. Mas este argumento

opcional garante que a main_face permanecerá

acessível após pushpull ser chamado. Lembre-se disto

se você receber qualquer referência de erros a faces

excluídas em seus scripts.

=end

# Desenha uma linha no canto

cut = ents.add_line [5, 7, 6], [5, 8, 5]

# Cria o chanfro

cut.faces[0].followme main_face.edges

=begin

O caminho é obtido chamando o método edges na face

superior da caixa. Isso retorna o array de objetos

Edges conectados que limitam a face superior. Quando

você precisa aplicar followme a cada borda de uma

superfície, é mais fácil chamar o método de edges do

que localizar objetos edges individuais.

=end

Page 12: INTERFACE DE PROGRAMAÇÃO DE APLICATIVOS · PDF fileLeitura sugerida: Automatic SketchUp Creating 3-D Models in Ruby by Matthew Scarpino Deste momento em diante, deixaremos um pouco

Script sphere.rb

=begin

cria a face circular e o caminho circular, e em

seguida, chama followme para a extrusão da esfera.

Note-se que, embora ambos os círculos possuem o mesmo

centro, os seus vetores normais são perpendiculares

um ao outro.

=end

# Acessa as entidades

ents = Sketchup.active_model.entities

# Cria o círculo inicial

center = [0, 0, 0]

radius = 5

circle = ents.add_circle center, [0, 0, 1], radius

circle_face = ents.add_face circle

# Cria o caminho circular

path = ents.add_circle center, [0, 1, 0], radius + 1

# Cria a esfera

circle_face.followme path

# Remove o caminho

ents.erase_entities path

=begin

A última linha do script remove as arestas que formam

o caminho da extrusão. Esta é uma consideração

importante quando você usa o método followme.

=end