Ruby 搭配 Sketchup 學習筆記(五)
前情提要
Sketchup 是一款在建築、都市計畫和遊戲開發都頗有名氣的 3D 建模軟體,而 Ruby 則是一個程式語言,它可以搭配 Sketchup 達成程式化 建模的任務,近期經由系主任引薦,要開發 Sketchup 的 Extension,雖然我寫過 Ruby,但 Sketchup 則是完全沒碰過,於是利用文章來記錄所學的一點一滴。
本篇內容
- 圖層 Layer
- 群組 Group
- 元件 Components
- 材料 Meterial
- 圖片
圖層 Layer
圖層(Layer)用來顯示或隱藏特定的圖形,以減少在作業中的干擾,在2021版的 Sketchup 被稱為標記(Tag),它位於視窗的工具列:
圖層是屬於 Model 類別之下,以下示範如何建立一個圖層:
# Default code, use or delete...
mod = Sketchup.active_model # Open model
layers = mod.layers # All entities in model
new_layer = layers.add "測試用圖層"
mod.active_layer = new_layer
這邊可以看到有兩個圖層,第一個是預設的,第二個則是我們剛剛新增的。
另外圖層也可以使用以下方法:
- visible=
- visible?
- name=
- name
群組 Group
假如我們在 Sketchup 中做一個圓柱體:
# Default code, use or delete...
mod = Sketchup.active_model # Open model
ent = mod.entities
circle = ent.add_circle [0, 0, 0], [0, 0, 1], 5
circle_face = ent.add_face circle
circle_face.pushpull -10
對我們來說,這是一整個物件,但對 Sketchup 來說並不是,因為在上方的程式碼中的
circle_face 僅是一個平面,而使用平台拉抬而成的部分並屬於同一個物件,如果使用轉形,就只有表面移動,因此假如要移動整個圓柱體,可以使用 circle_face.all_connected ,不過每次都要這麼打,似乎有點麻煩,因此我們可以使用群組功能將整個圓柱體定義為一個群組:
# Default code, use or delete...
mod = Sketchup.active_model # Open model
ent = mod.entities
circle = ent.add_circle [0, 0, 0], [0, 0, 1], 5
circle_face = ent.add_face circle
circle_face.pushpull -10
circle_group = ent.add_group circle_face.all_connected
t = Geom::Transformation.translation [0, 10, 0]
ent.transform_entities t, circle_group
群組提供了幾個方法:
- name=
- description=
- locked=:是否鎖定,鎖定後不能進行修改
- explode:將 Group 物件分解
- deleted?:是否被刪除
群組的特色
將一個或多個物體定義為群組後,可以使用幾個方便的功能對群組整體進行操作,功能如下:
- copy:複製
- move!:移動到特定位置
- transform!:轉形
元件 Components
元件與群組的最大差別在於元件可以跨不同的檔案,而群組只能在其建立的那個檔案。元件有點像 Class 經由定義完成後儲存成 .skp 檔案,要用到的時候在引入之後進行實體化(instance)
建立元件
建立元件有兩種方式。
群組產生元件
# Default code, use or delete...
mod = Sketchup.active_model # Open model
ent = mod.entities
circle = ent.add_circle [0, 0, 0], [0, 0, 1], 5
circle_face = ent.add_face circle
circle_face.pushpull -10
circle_group = ent.add_group circle_face.all_connected
circle_group.to_component
在上方工具列的視窗中可以查看元件,點擊後可以發現此群組已經變為元件了。
使用 DefinitionList 建立元件
DefinitionList 是 active_model 的其中一個方法,詳細做法看以下範例:
# Default code, use or delete...
mod = Sketchup.active_model # Open model
def_list = mod.definitions # 取得 DefinitionList
# 新增一個文件定義
new_def = def_list.add "測試元件"
new_def.description = "這是一個測試元件"
# 只用文件定義的 Entities 建立一個圓柱體
ent = new_def.entities
circle = ent.add_circle [0, 0, 0], [0, 0, 1], 5
circle_face = ent.add_face circle
circle_face.pushpull -10
# 儲存元件定義
save_path = Sketchup.find_support_file "components", ""
new_def.save_as(save_path+"/test.skp")
# Check
puts "已儲存到#{new_def.path}"
引入元件
開新的 Sketchup 專案,在 Ruby Console 中輸入以下內容:
def_list = Sketchup.active_model.definitions
file_path = Sketchup.find_support_file "test.skp", "Components"
load_def = def_list.load file_path
元件實體化
這邊來示範如何使用元件進行實體化
def_list = Sketchup.active_model.definitions
file_path = Sketchup.find_support_file "test.skp", "Components"
load_def = def_list.load file_path
ent = Sketchup.active_model.entities
t = Geom::Transformation.translation [0,0,0]
ent.add_instance load_def, t
材料
Sketchup 的材料並不具備物理資訊,其只負責呈現不同外觀,以下示範如何新增、使用材料:
新增材料
mod = Sketchup.active_model
mats = mod.materials
new_mat = mats.add "新材料"
使用材料
# Default code, use or delete...
mod = Sketchup.active_model # Open model
ent = mod.entities
mats = mod.materials
new_mat = mats.add "新材料"
circle = ent.add_circle [0, 0, 0], [0, 0, 1], 5
circle_face = ent.add_face circle
circle_face.material = new_mat
為材料新增顏色
# Default code, use or delete...
mod = Sketchup.active_model # Open model
ent = mod.entities
mats = mod.materials
new_mat = mats.add "新材料"
new_mat.color = [255,0,0]
circle = ent.add_circle [0, 0, 0], [0, 0, 1], 5
circle_face = ent.add_face circle
circle_face.material = new_mat
請注意!其會為表面塗色,但表面取決於向量。
為材料新增材質
材質與顏色類似,唯一不同點在於材質需要圖檔,看以下範例程式碼:
# Default code, use or delete...
mod = Sketchup.active_model # Open model
mats = mod.materials
ent = mod.entities
new_mat = mats.add "新材料"
texture_path = Sketchup.find_support_file "images/wood.jpeg", "Plugins"
new_mat.texture = texture_path
new_mat.color = [255,0,0]
circle = ent.add_circle [0, 0, 0], [0, 0, 1], 5
circle_face = ent.add_face circle
circle_face.material = new_mat
順帶一提,為材料新增材質的同時也可以新增顏色。
也可以將新增變更顏色的材質進行儲存:
mod = Sketchup.active_model # Open model
mats = mod.materials
ent = mod.entities
new_mat = mats.add "新材料"
new_mat.texture = Sketchup.find_support_file "images/wood.jpeg", "Plugins"
new_mat.color = [255,0,0]
circle = ent.add_circle [0, 0, 0], [0, 0, 1], 5
circle_face = ent.add_face circle
circle_face.material = new_mat
twriter = Sketchup.create_texture_writer
twriter.write circle_face, false, "texture.jpg"
圖片
以下範例程式碼示範如何展示圖片:
ent = Sketchup.active_model.entities
path = Sketchup.find_support_file "images/carton.jpeg", "Plugins"
img = ent.add_image path, [0, 0, 0], 100
t = Geom::Transformation.rotation [0,0,0],[1,0,0],90.degrees
ent.transform_entities t,img