Upload
hoangthien
View
222
Download
1
Embed Size (px)
Citation preview
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.
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.
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
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
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
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
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
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
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
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
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
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