一、界面类
主框架使用的是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;