Plugin, View, Toolbar (Bài trước)
(Bài tiếp) HtmlDialog

Lớp Tool SketchUp

Lớp Tool là giao diện để triển khai tạo công cụ trong SketchUp (các công cụ như Selection, Line, Circle ...), bạn cần định nghĩa lớp mới và triển khai các phương thức bắt các sự kiện tương ứng.

Vòng đời của công cụ Tool

Tại một thời điểm chỉ có một tool được kích hoạt, mặc định thì đó là công cụ Selection chọn đối tượng. Để kích hoạt một công cụ cần thi hành phương thức select_tool của lớp Model. Ví dụ, để kích hoạt my_tool (đối tượng) thì thi hành:

Sketchup.active_model.select_tool my_tool

Khi Tool hoàn thành tác vụ nó sẽ bất hoạt, nếu muốn bất hoạt trực tiếp thì gọi phương thức deactivate

Các Event Handler của Tool

Các Event Handler của Tool

Khi xây dựng lớp Tool, cần triển khai các phương thức theo giao diện như activate, draw và các phương thức bắt các sự kiện như onKeyUp, onMouseMove ... gọi là các Event Handler

Event Handler Mô tả
onCancel onCancel(reason, view) ⇒ Object
def onCancel(reason, view)
    puts "Hủy chọn tool ##{reason} trong view: #{view}"
end
Được gọi khi hủy chọn tool, tham số reason cho biết nguyên nhân theo giá trị: 0 do nhấn ESC, 1 do chọn tool khác, 2 người dùng undo trong khi tool đang kích hoạt
onKeyDown onKeyDown(key, repeat, flags, view) ⇒ Boolean
def onKeyDown(key, repeat, flags, view)
  puts "onKeyDown: key = #{key}"
  puts "        repeat = #{repeat}"
  puts "         flags = #{flags}"
  puts "          view = #{view}"
end

Người dùng nhấn bàn phím,

onKeyUp Người dùng nhả bàn phím
onLButtonDoubleClick onLButtonDoubleClick(flags, x, y, view) ⇒ Object
Nhấn kép chuột trái
onLButtonDown onLButtonDown(flags, x, y, view) ⇒ Object
Nhấn chuột trái
onLButtonUp onLButtonUp(flags, x, y, view) ⇒ Object
Nhả chuột trái
onLButtonUp onLButtonUp(flags, x, y, view) ⇒ Object
Nhả chuột trái
onMouseEnter onMouseEnter(view) ⇒ Object
Chuột đi vào view
onMouseLeave onMouseLeave(view) ⇒ Object
Chuột ra khỏi view
onReturn(view) Nhấn Enter
onSetCursor Khi muốn thiết lập cursor
onUserText onUserText(text, view) ⇒ Object Khi người dùng nhập dữ liệu vào VCB và nhấn Return
# 27.tool.rb
# load "/Users/xuanthulab/Desktop/learn-ruby/sketchup/27.tool.rb"
require 'sketchup.rb'
require 'extensions.rb'

## Công cụ vẽ Line
class MyLineTool
  # Gọi khi kích hoạt công cụ
  def activate
    puts 'Kích hoạt Tool'
    # InputPoint để nhấn chuột chọn các Entity
    @input  = Sketchup::InputPoint.new
    # @type [Sketchup::Point3d] điểm thứ nhất
    @point1 = nil
    # @type [Sketchup::Point3d] điểm thứ 2
    @point2 = nil
    # @type [Sketchup::Point3d] điểm chuột
    @pointmove = nil
    # Hiện thông báo VCB
    Sketchup.set_status_text "Nhập điểm 1", SB_VCB_LABEL
  end
  # Gọi khi hủy chọn công cụ
  def deactivate(view)
    puts "Bất hoạt tool: #{view}"
  end

  def onCancel(reason, view)
    puts "Hủy chọn tool ##{reason} trong view: #{view}"
  end
  # Vẽ thông tin trong View
  def draw(view)
    options = {
      :font => "Arial",
      :size => 20,
      :bold => true,
      :align => TextAlignRight
    }
    point = Geom::Point3d.new(200, 200, 0)
    view.draw_text(point, "Test - Đây là công cụ Line", options)



    view.drawing_color = Sketchup::Color.new(255, 0, 0, 64)
    if !@pointmove.nil?
        # Vẽ điểm tại chuột
        status = view.draw_points @pointmove, 10, 2, "red"
    end

    if !@pointmove.nil? && !@point1.nil?
        # Vẽ line trong View
        status = view.drawing_color="red"
        status = view.draw_lines @point1, @pointmove

    end
  end

  # Bắt sự kiện di chuyển chuột
    def onMouseMove(flags, x, y, view)
        # Hiện thị tọa độ trong VCB
        @input.pick view, x, y
        @pointmove = @input.position
        # Hiện thị tooltip điểm
        view.tooltip = @input.tooltip
        view.invalidate
    end

    # Bắt sự kiện nhấn chuột trái
    def onLButtonDown flags, x, y, view
        @input.pick view, x, y

        if !@point1.nil?
            @point2 = @input.position
        elsif
            @point1 = @input.position
            Sketchup.set_status_text "Nhập điểm 2", SB_VCB_LABEL
        end

        if !@point1.nil? && !@point2.nil?
            Sketchup.active_model.entities.add_line @point1, @point2
            Sketchup.active_model.select_tool nil
        end

    end

end

if( not file_loaded? "27.tool.rb" )
    # Tạo menu chọn công cụ
    simple_cmd = UI::Command.new("MyLineTool") {
        # Chọn công cụ
        Sketchup.active_model.select_tool MyLineTool.new
    }
    tool_menu = UI.menu "Tools"
    tool_menu.add_separator
    tool_menu.add_item simple_cmd
    file_loaded "27.tool.rb"
end

Đăng ký nhận bài viết mới
Plugin, View, Toolbar (Bài trước)
(Bài tiếp) HtmlDialog