giorgiosaints
8/17/2017 - 3:09 PM

Como desenvolver um plugin para o Sketchup

Como desenvolver um plugin para o Sketchup

Sketchup Plugin

De forma bem resumida, um plugin nada mais é que um arquivo de texto, contendo instruções que serão interpretadas por algum programa. Para que essas instruções sejam entendidas, é necessário que o texto esteja claro e em uma linguagem conhecida pelo programa. Simples assim!

Vamos começar

Requerimentos chave:

  • Registre uma instancia SketchupExtension no arquivo root .rb
  • Não carregue nada dentro além do registro da extensão no arquivo root .rb
  • Todo o código da extensão tem que ficar dentro do seu namespace (module). Isso quer dizer que nunca deveremos utilizar variáveis globais, variáveis constantes ou métodos globais. Isso também quer dizer que você não deverá modificar a API Ruby ou o Sketchup

Seguindo o padrão dos plugins existentes no Sketchup crie o arquivo principal do plugin su_NOME_DO_PLUGIN.rb com o seguinte código:

require 'sketchup.rb' # sketchup.rb é necessário para o 'file_loaded?' e 'file_loaded'.
require 'extensions.rb' # extensions.rb é necessario para a classe 'SketchupExtensions'.

# Eu recomendo um padrão similar a esse, por melhor flexibilidade:
module PublisherName
  module ExtensionName
    
    # O uso do 'file_loaded?' aqui é pra prevenir a extensão ser registrada multiplas vezes. Isso pode acontecer por inúmeras razões quando o arquivo é recarregado.
    # O '_FILE_' é uma constante "mágica" do ruby ela retorna uma string com o caminho deste arquivo.
    unless file_loaded?(__FILE__)
      extension = SketchupExtension.new('My Plugin name', 'su_nome_do_modulo/core')
      extension.version = '1.0'
      extension.copyright = 'Lorem Lorem'
      extension.creator = 'Lorem Lorem'
      extension.description = 'Lorem Lorem'
      
      # Aqui nós falamos para o Sketchup registrar essa extensão. Lembre-se de sempre setar o segundo argumento como true. Isso diz para o Sketchup carregar a extensão por padrão. 
      Sketchup.register_extension(extension, true)
  
      # Essa linha é necessária pois previne a extensão de ser carregada multiplas vezes.
      file_loaded(__FILE__)
    end
    
  end
end

Agora crie uma pasta com o nome do seu ruby module su_nome_do_modulo/, e dentro da pasta crie o arquivo su_nome_do_modulo/core.rb, com o seguinte código:

require 'sketchup.rb'
require 'extensions.rb'
require 'json'
require 'ostruct'

module NomeDoModulo::Core
  
  # Cria um HTML Dialog com o HTML que você irá criar
  def self.home_html_dialog
    dialog = UI::HtmlDialog.new(
      {
        :dialog_title => "Lorem Lorem",
        :preferences_key => "com.sample.plugin",
        :scrollable => true,
        :resizable => true,
        :width => 600,
        :height => 400,
        :left => 100,
        :top => 100,
        :min_width => 50,
        :min_height => 50,
        :max_width =>1000,
        :max_height => 1000,
        :style => UI::HtmlDialog::STYLE_UTILITY
      })
      dialog.set_url("algumarquivo.html")
      dialog.show
      
      # Método que o jquery irá chamar no HTML
      dialog.add_action_callback("getCurrentUser") { |action_context, email, password|
        puts "JavaScript getCurrentUser: #{email} and #{password}"
      }
  end
  
  # Um exemplo de um API Request
  def self.http_req
    request = Sketchup::Http::Request.new("https://reqres.in/api/users/2")

    request.start do |request, response|
      obj = JSON.parse(response.body, object_class: OpenStruct)

      UI.messagebox("body: #{obj.data}")
    end
  end
  
  # Exemplo de uma Toolbar no Sketchup
  def self.home_toolbar
    toolbar = UI::Toolbar.new "Lorem Lorem"

    cmd_study = UI::Command.new("Estudo") { self.home_html_dialog }
    cmd_study.small_icon = "images/study-icon.png"
    cmd_study.large_icon = "images/study-icon.png"
    toolbar.add_item cmd_study

    toolbar = toolbar.add_separator

    cmd_selected_study = UI::Command.new("Estudo Selecionado") { self.http_req }
    cmd_selected_study.small_icon = "images/study-selected-icon.png"
    cmd_selected_study.large_icon = "images/study-selected-icon.png"
    toolbar.add_item cmd_selected_study
    
    toolbar.show
    toolbar.each { | item |
      puts item
    }
  end
  
  # Método principal que cria um item no menu do sketchup
  unless file_loaded?(__FILE__)
    menu = UI.menu("Plugins")
    menu.add_item("Nome do Plugin") {
      self.home_toolbar
      self.home_html_dialog
    }
  end

  file_loaded(__FILE__)
end

Local da pasta

Estes arquivos devem ser colocados na seguinte pasta: Windows 8++: C:\Users\SEU_USUARIO\AppData\Roaming\SketchUp\SketchUp 2017\SketchUp\Plugins

Obs: Sempre que for instalar um plugin manualmente, reinicie o Sketchup para que as mudanças tenham efeito