三、OrcaSlicer预设显示

一、界面类

主框架使用的是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中。

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

  1. 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;