一、界面類
主框架使用的是wxWidgets庫;3D模型的渲染區的控件,使用的是imgui庫。
1、Plater
? ? ? ? 此類在OrcaSlicer\src\slic3r\GUI\Plater.hpp文件中定義
1.1?Plater::priv
? ? ? ? 此結構體是Plater的數據類,各種數據的對象和指針保存在此結構體中。如Sidebar *sidebar。
2、Sidebar 邊欄(左側欄)類
? ? ? ? 此類在OrcaSlicer\src\slic3r\GUI\Plater.hpp文件中定義,此類是從wxPanel派生而來。
2.1 成員變量
? ? ? ? 1、struct Sidebar::priv
? ? ? ? ? ? ? ? 此結構體是Sidebar用來保存數據。申明為std::unique_ptr<priv> p,在構造函數中,通過new priv(parent)進行賦值。
2.1 成員函數
? ? ? ? 1、Sidebar::Sidebar(Plater *parent)
? ? ? ? ? ? ? ? 在構造函數中會創建:1)打印機下拉框(PlaterPresetComboBox類),new出來的對象指針保存在Sidebar::priv中,變量名為combo_printer;2)會創建耗材下拉框(PlaterPresetComboBox類),new出來的對象指針保存在Sidebar::priv中,變量名為combos_filament。3)工藝下拉框在ParamsPanel類中定義,此類的對象指針保存在MainFrame::m_param_panel中,此指針在MainFrame::init_tabpanel()函數中創建。
? ? ? ? ? ? ? ? Sidebar對象指針保存在Plater::priv中,指針的在priv構造函數中創建,Plater對象指針保存在MainFrame::m_plater中,此指針在MainFrame::init_tabpanel()函數中創建。
3、下拉框
3.1?ComboBox
? ? ? ? 此類在OrcaSlicer\src\slic3r\GUI\Widgets\ComboBox.hpp文件中定義。是從public wxWindowWithItems<TextInput, wxItemContainer>派生而來。
3.1.1 成員變量
? ? ? ? 1、std::vector<wxString> texts;下拉框中顯示的文本內容
? ? ? ? 2、std::vector<wxString> tips;下拉框中顯示行的提示內容
? ? ? ? 3、std::vector<wxBitmap> icons;下拉框顯示行的圖標
? ? ? ? 4、std::vector<void *> datas;下拉框顯示行的數據
? ? ? ? 5、std::vector<wxClientDataType> types;下拉框顯示行數據類型
? ? ? ? 6、DropDown drop; 點擊下拉時的彈窗
3.1.2 成員函數
? ? ? ? 1、int Append(const wxString &item, const wxBitmap &bitmap = wxNullBitmap);向下拉框中添加數據。
3.2?PresetComboBox
? ? ? ? 此類在OrcaSlicer\src\slic3r\GUI\PresetComboBoxs.hpp文件中定義。是從ComboBox派生而來。
3.2.1 成員變量
? ? ? ? 1、Preset::Type m_type;//TYPE_PRINTER打印機預設;TYPE_FILAMENT耗材預設;TYPE_PRINT工藝預設;
? ? ? ? 2、int m_last_selected; 最后一個選擇的行的下標。
3.2.2 成員函數
? ? ? ? 1、void update(std::string select_preset);
? ? ? ? ? ? ? ? 將collection中的用戶預設和系統預設,通過Append函數進行添加。
3.3?PlaterPresetComboBox
? ? ? ? 此類是從PresetComboBox派生而來。打印機預設下拉框和耗材預設下拉框,是由此類創建的對象。
3.3.1 成員函數
? ? ? ? 1、void update() override;
? ? ? ? ? ? ? ? 重寫update函數。循環collection中的presets,1)如果是default或system,則是系統預設;2)如果是is_project_embedded,則是項目預設;3)其他的是用戶預設。
? ? ? ? 2、void OnSelect(wxCommandEvent& evt) override;
? ? ? ? ? ? ? ? 重寫OnSelect函數。
3.3.2 切換打印機的流程
? ? ? ? 1、在Plater::priv::priv構造函數中,使用sidebar->Bind(wxEVT_COMBOBOX, &priv::on_combobox_select, this);將sidebar中的wxEVT_COMBOBOX消息綁定到on_combobox_select中。所在切換打印機預設時,會調用此函數。
二、文件的導入
1、3mf文件的導入
當點擊導入或拖入3mf文件時,會調用std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_files, LoadStrategy strategy, bool ask_multi)進行處理
1.1?_BBS_3MF_Importer
? ? ? ? 在load_bbs_3mf函數中會調用此類來進行3mf文件的解析。此類在OrcaSlicer\src\libslic3r\Format\bbs_3mf.cpp文件中定義
1.1.1 成員變量
? ? ? ? 1、關系文件數據
? ? ? ? ????????std::string m_start_part_path;
? ? ? ? ????????std::string m_thumbnail_path;
? ? ? ? ????????std::string m_thumbnail_middle;
? ? ? ? ????????std::string m_thumbnail_small;
? ? ? ? ????????std::vector<std::string> m_sub_model_paths;
????????????????std::vector<ObjectImporter*> m_object_importers;
? ? ? ? 2、3mf模型數據
????????????????std::map<Id, CurrentObject> m_current_objects;
????????
1.1.2 成員函數
? ? ? ? 1、_load_model_from_file
? ? ? ? ? ? ? ? 1)使用miniz庫對3mf文件zip包,進行解壓。先讀取_rels/.rels文件,使用expat庫對xml文件進行解析。在_handle_start_relationship函數中,將3dmodel文件路徑讀取出來,保存在m_start_part_path中,子模型路徑保存在m_sub_model_paths中。.png的略縮圖路徑保持在m_thumbnail_path、m_thumbnail_middle、m_thumbnail_small中。
? ? ? ? ? ? ? ? 2)從3D/_rels/3dmodel.model.rels(通過m_start_part_path解析來)文件中,讀取子模型路徑保存在m_sub_model_paths中。每一個model_path都對應一個ObjectImporter對象。保存在std::vector<ObjectImporter*> m_object_importers;變量中。
? ? ? ? ? ? ? ? 3)使用并行計算輪詢_BBS_3MF_Importer.m_object_importers數據,調用ObjectImporter.extract_object_model讀取模型文件數據到ObjectImporter.object_list中。
? ? ? ? ? ? ? ? 4)輪詢ObjectImporter.object_list,將數據移動到_BBS_3MF_Importer.m_current_objects中。
? ? ? ? ? ? ? ? 5)調用_extract_from_archive函數
? ? ? ? ? ? ? ? 6)輪詢其它文件
? ? ? ? ? ? ? ? ? ? ? ? a?[Content_Types].xml ;
? ? ? ? 2、_extract_from_archive
? ? ? ? ? ? ? ? 1)讀取3D/3dmodel.model文件,使用_extract_model_from_archive函數進行解析
? ? ? ? 3、_extract_model_from_archive
? ? ? ? ? ? ? ? 1)使用expat庫對xml進行解析,會調用_BBS_3MF_Importer._extract_model_from_archive對數據進行解析
? ? ? ? 4、_extract_model_from_archive
????????????????????????????????
1.2?ObjectImporter
1.2.1 成員變量
????????std::map<Id, CurrentObject> object_list;
????????Geometry geometry;
????????CurrentObject *current_object
????????std::string obj_curr_metadata_name;
? ? ? ??float object_unit_factor; 對象單位因子
1.2.2 成員函數
? ? ? ? 1、_extract_object_from_archive
? ? ? ? ? ? ? ? 在調用extract_object_model時,最后會調用此函數來進行model文件的讀取,.model文件是xml文件,使用expat庫對xml文件進行解析。會調用_handle_object_start_model_xml_element函數對字段進行解析。
? ? ? ? 2、_handle_object_start_model_xml_element
? ? ? ? ? ? ? ? 1) model:unit為millimeter時,object_unit_factor=1.0f
? ? ? ? ? ? ? ? 2) metadata: name屬性保存在obj_curr_metadata_name中
? ? ? ? ? ? ? ? 3) object: type屬性值為model,new一個CurrentObject對象,保存在current_object中
? ? ? ? ? ? ? ? 4) mesh: 重置CurrentObject.geometry的值。
? ? ? ? ? ? ? ? 5) vertices:清空Geometry.vertices數據
? ? ? ? ? ? ? ? 6) vertex: 將向量數據x,y,z乘以object_unit_factor后的數據,保存在geometry.vertices中。
? ? ? ? ? ? ? ? 7) triangles:清空Geometry.triangles數據
? ? ? ? ? ? ? ? 8)?triangle:將頂點數據v1,v2,v3保存在geometry.triangles中,paint_supports保存在geometry.custom_supports中,paint_seam保存在geometry.custom_seam中,paint_color保存在geometry.mmu_segmentation中,face_property保存在geometry.face_properties中。
? ? ? ? 3、_handle_object_end_object
? ? ? ? ? ? ? ? 在object節點結束后,會將文件名和屬性id的值組合成一個std::pair鍵值對,做為key值,ObjectImporter.current_object對象做為value,添加到ObjectImporter.object_list中。
1.3?CurrentObject
? ? ? ? 此結構體用來保存.model中的object節點數據
1.3.1 成員變量
? ? ? ? 1)int id;? ? ? ? ?//屬性id
? ? ? ? 2)??std::string uuid;? ? ? ? //屬性p:UUID
1.3.2 成員函數
1.4?Geometry
? ? ? ? 幾何數據放在此結構體中
1.4.1 成員變量
? ? ? ? 1)?std::vector<Vec3f> vertices;
? ? ? ? 2)?std::vector<Vec3i32> triangles;
? ? ? ? 3)std::vector<std::string> custom_supports;
? ? ? ? 4)std::vector<std::string> custom_seam;
? ? ? ? 5)std::vector<std::string> mmu_segmentation;
? ? ? ? 6)std::vector<std::string> face_properties;
????????????????