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
使用元件實體化後的物件,假如元件被修改,該物件也會產生變化,如果要避免此情況可以使用 make_unique
,元件還有幾個方法如下:
- locked
- name=
- name
- explode
材料
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
materials 除了 add
外,還有其他方法:
- current
- current=
- name
- displat_name
- materialType
為材料新增顏色
# 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"
twriter.write 第二個參數決定正面還是背面,目前是背面
圖片
以下範例程式碼示範如何展示圖片:
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
輸出結果: