Layer, Group (Bài trước)
(Bài tiếp) Attributes

Giống như Group, Component trong SketchUp chứa các đối tượng Entity để có thể thi hành tác vụ trên nhiều Entity một lúc. Nhưng Component mạnh mẽ hơn, có thể điều khiển ứng sử của Component, tạo Component dễ dàng, một phiên bản copy của Component có ứng sử biến đổi giống nhau trong bản vẽ thiết kế. Có hai lớp làm việc với Component là: ComponentDefinition (có vai trò như class) và ComponentInstance (có vai trò như object).

Component - Trong giao diện SketchUp

Trước khi viết code tương tác với Component, hãy tìm hiểu về nó trong giao diện ứng dụng SketchUp

1 chọn menu Windows > Components, hộp thoại xuất hiện hiện thị các Component sử dụng trong SketchUp
2 bấm chọn biểu tượng Home, chọn mũi tên bên cạnh - đổ xuống menu chọn Components, từ danh sách chọn Component Sample - bấm chọn mục Bed
3 Kéo component chọn vào Model. Nếu bấm vào Icon Home, thì xuất hiện mục Bed, chuyển sang tab Edit bạn có thể biết Component nạp từ file .ksp, Tab Static cho biết số lượng các Entity trong Component.
4 Component đã kéo vào Model bạn có thể copy thành vài phiên bản, thực hiện scale, move ...
5 Nhấn phải chuột vào Component (hoặc nháy kép), từ context menu chọn Edit Component để vào chỉnh sửa trực tiếp Component. Khi chỉnh sửa component thì tất cả các bản copy của Component được chỉnh sửa theo.

Tạo Component bằng Code

Nếu trong cửa sổ SketchUp đơn giản tạo Component bằng cách chọn các hình và nhấn phải chuột chọn Make component ..., còn trong code cần quan tâm hai đối tượng gồm:

  1. Đối tượng lớp ComponentDefinition lưu thông tin về model của Component, đối tượng này có thể đọc và lưu ra file.
  2. Đối tượng lớp ComponentInstance là đối tượng triển khai trong thiết kế hiện tại

Có hai cách tạo component, thứ nhất nếu có Group, có thể chuyển nó thành một ComponentInstant bằng phương thức to_component, khi đó SketchUp cũng tự động tạo ra một ComponentDefinition. Thứ hai, có thể truy cập DefinitionList từ Mode, nó cung cấp phương thức add với tham số là tên ComponentDefinition. Ví dụ tạo ra ComponentDefinition mới và lưu ra file newcomp.skp

def_list = Sketchup.active_model.definitions
new_def  = def_list.add "NewComp"
new_def.save_as "newcomp.skp"

Ví dụ sau, tạo ComponentDefinition sau đó thêm các Entity vào nó, lưu ra file với đường dẫn đầy đủ

# 21.component.rb
# load "/Users/xuanthulab/Desktop/learn-ruby/sketchup/21.component.rb"
require 'sketchup.rb'
require 'extensions.rb'

def create_com
    # Tạo ComponentDefinition tên Cube
    list = Sketchup.active_model.definitions
    comp_def = list.add "Khối lập phương"
    comp_def.description = "Đây là component khối lập phương."
    # Thêm các Entity vào
    ents = comp_def.entities
    face = ents.add_face [0,0,0], [1,0,0], [1,1,0], [0,1,0]
    face.reverse!
    face.pushpull 1
    # Lưu ra file
    save_path = Sketchup.find_support_file "Components", ""
    comp_def.save_as(save_path + "/myshape.skp")
    puts "Path: " + comp_def.path
end

Nạp ComponentDefinition từ file

DefinitionList của Model có hai phương thức giúp nạp ComponentDefinition từ file

  1. load để nạp file skp từ máy cục bộ
  2. load_from_url nạp từ địa chỉ Url
# Nạp file cube.skp trong thư mục Components
dl = Sketchup.active_model.definitions
file_path = Sketchup.find_support_file "cube.skp", "Components"
comp_def = dl.load file_path

Component Behavior

Mỗi ComponentDefinition có một đối tượng Behavior liên kết với nó, nó xác định ứng xử của Component trong màn hình thiết kế, có 6 loại:

  1. always_face_camera Component quay quanh trục z để hướng theo hướng nhìn camera
  2. shadows_face_sun đổ bóng
  3. no_scale_mask hệ số tỷ lệ không hiệu lực (không thu phóng)
  4. is2d là loại 2D
  5. snapto
  6. cuts_opening
beh = comp_def.behavior
beh.no_scale_mask = 0b110
beh.always_face_camera = true

Tạo ComponentInstance

Khi đã có ComponentDefinition có thể tạo các ComponentInstance bằng phương thức add_instance của Entity. Chú ý điểm gốc chèn trong ComponentDefinition có thể xem bằng phương thức insertion_point của ComponentDefinition

ent = Sketchup.active_model.entities
t = Geom::Transformation.translation [3, 3, 0]
inst = ent.add_instance comp_def, t

Đăng ký nhận bài viết mới
Layer, Group (Bài trước)
(Bài tiếp) Attributes