三、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中。

                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;

                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

00 QEMU源码中文注释与架构讲解

QEMU源码中文注释与架构讲解 先占坑&#xff1a;等后续完善后再更新此文章 注释作者将狼才鲸创建日期2025-05-30更新日期NULL CSDN阅读地址&#xff1a;00 QEMU源码中文注释与架构讲解Gitee源码仓库地址&#xff1a;才鲸嵌入式/qemu 一、前言 参考网址 QEMU 源码目录简介qe…

一、Sqoop历史发展及原理

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月30日 专栏&#xff1a;Sqoop教程 在大数据时代&#xff0c;数据往往分散存储在各种不同类型的系统中。其中&#xff0c;传统的关系型数据库 (RDBMS) 如 MySQL, Oracle, PostgreSQL 等&#xff0c;仍然承载着大量的关键业务…

【Halcon】图像分割中的 regiongrowing 与dyn_threshold 动态阈值 算法详解对比

图像分割中的 regiongrowing 与动态阈值算法详解对比 在使用 HALCON 进行图像处理时&#xff0c;图像分割是最常见也最关键的操作之一。本文将深入讲解 regiongrowing 算子的原理与使用方法&#xff0c;并与另一常见方法——动态阈值 (dyn_threshold) 进行详细对比&#xff0c…

Docker部署项目无法访问,登录超时完整排查攻略

项目背景&#xff1a;迁移前后端应用&#xff0c;prod环境要求保留443端口&#xff0c;开发环境37800端口&#xff0c;后端容器端口为8000&#xff0c;前端为80&#xff0c;fastAPI对外端口为41000 生产环境部署在VM01,开发环境部署在VM03&#xff0c;在VM01配置nginx转发 [r…

充电便捷,新能源汽车移动充电服务如何预约充电

随着新能源汽车的普及&#xff0c;充电便捷性成为影响用户体验的关键因素之一。传统的固定充电桩受限于地理位置和数量&#xff0c;难以完全满足用户需求&#xff0c;而移动充电服务的出现&#xff0c;为车主提供了更加灵活的补能方式。通过手机APP、小程序或在线平台&#xff…

探索C++标准模板库(STL):从容器到底层奥秘-全面解析String类高效技巧(上篇)

前引&#xff1a;在现代软件开发中&#xff0c;字符串处理是几乎所有程序的核心需求之一。无论是文本解析、网络通信&#xff0c;还是用户交互&#xff0c;高效且安全的字符串操作能力直接决定了代码的质量与可维护性。而C标准模板库&#xff08;Standard Template Library, ST…

Python爬虫实战:抓取百度15天天气预报数据

&#x1f310; 编程基础第一期《9-30》–使用python中的第三方模块requests&#xff0c;和三个内置模块(re、json、pprint)&#xff0c;实现百度地图的近15天天气信息抓取 记得安装 pip install requests&#x1f4d1; 项目介绍 网络爬虫是Python最受欢迎的应用场景之一&…

HTML常见事件详解:从入门到实战应用

前言 在Web开发中&#xff0c;事件是用户与网页交互的核心机制。HTML事件让我们能够响应用户的各种操作&#xff0c;如点击、鼠标移动、键盘输入等。掌握HTML事件是前端开发的基础技能之一&#xff0c;本文将深入探讨HTML中的常见事件类型及其实际应用。 HTML事件概览总结 H…

模具制造业数字化转型:精密模塑,以数字之力铸就制造基石

模具被誉为 “工业之母”&#xff0c;是制造业的重要基石&#xff0c;其精度直接决定了工业产品的质量与性能。在工业制造向高精度、智能化发展的当下&#xff0c;《模具制造业数字化转型&#xff1a;精密模塑&#xff0c;以数字之力铸就制造基石》这一主题&#xff0c;精准点明…

深度解读漏洞扫描:原理、类型与应用实践

在网络安全领域&#xff0c;漏洞就像隐藏在系统中的定时炸弹&#xff0c;随时可能被攻击者利用&#xff0c;导致数据泄露、服务瘫痪等严重后果。而漏洞扫描作为发现这些潜在威胁的 “侦察兵”&#xff0c;是保障网络安全的重要防线。本文将全面介绍漏洞扫描的相关知识&#xff…

[HNCTF 2022 Week1]silly_zip

下载附件 解压发现需要密码 用010打开看看&#xff0c;发现是伪加密 改成00点击保存 解压后得到图片 感觉图片看着怪怪的&#xff0c;修改一下高度看看有没有其他线索 把47改成78 最后得到flag

Facebook 的隐私保护措施是否足够?技术观点

在数字时代&#xff0c;隐私保护成为了公众关注的焦点&#xff0c;尤其是对于拥有数十亿用户的社交媒体巨头 Facebook 来说&#xff0c;其隐私保护措施的有效性更是备受瞩目。本文将从技术角度探讨 Facebook 的隐私保护措施是否足够。 数据收集与使用 Facebook 收集用户数据的…

cocosCreator 1.8 升级到 2.4

现在负责的一个运营中的商业项目&#xff0c;使用的是 cocosCreator1.8&#xff0c;之前没有做好设计&#xff0c;所以东西都是直接加载在内存中的&#xff0c;到了现在性能问题逐渐暴露出来&#xff0c;讨论之后想进行引擎升级&#xff0c;升级到cocosCreator 2.4。 官方的升…

ubuntu 制作 ssl 证书

安装 openssl sudo apt install openssl 生成 SSL 证书 # 生成私钥 (Private Key) openssl genrsa -out private.key 2048 在当前目录生成 private.key # 生成证书签名请求 (CSR - Certificate Signing Request) openssl req -new -key private.key -out certificate.csr -…

【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤

在Java开发的世界里&#xff0c;选择一个强大的集成开发环境&#xff08;IDE&#xff09;是迈向高效编程的第一步。而IntelliJ IDEA无疑是Java开发者中最受欢迎的选择之一。它以其强大的功能、智能的代码辅助和简洁的用户界面&#xff0c;帮助无数开发者快速构建和部署Java项目…

WEB3——什么是ABI

怎么获得ABI&#xff1f; 在编译完合约后&#xff0c;可以在左边下面点击复制ABI ABI&#xff08;Application Binary Interface&#xff0c;应用二进制接口&#xff09;是用来让前端或服务端 JavaScript 代码与智能合约进行交互的桥梁&#xff0c;它描述了合约的函数、事件和…

移动安全Android——客户端数据安全

本地文件权限配置 测试流程 &#xff08;1&#xff09;手机运行待测APP应用&#xff0c;adb执行命令找到APP包名 adb shell dumpsys activity top|findstr ACTIVITY &#xff08;2&#xff09;adb shell 进入设备&#xff0c;以Root权限进入/data/data/package包名目录下 c…

拉普拉斯噪声

1. 概念 拉普拉斯噪声是一种连续概率分布生成的随机噪声&#xff0c;其核心特点是符合拉普拉斯分布。这种噪声被特意添加到数据&#xff08;尤其是查询结果或统计量&#xff09;中&#xff0c;以实现差分隐私这一严格的隐私保护框架。 核心目的&#xff1a; 在保护数据集中的个…

django项目开启debug页面操作有数据操作记录

在项目的主文件中setting中配置 """ Django settings for ProjectPrictice project.Generated by django-admin startproject using Django 3.0.1.For more information on this file, see https://docs.djangoproject.com/en/3.0/topics/settings/For the ful…

【科研绘图系列】R语言绘制森林图(forest plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图系统信息介绍 本文介绍使用R语言绘制森林图(forest plot)的方法。首先加载必要的R包(grid、forestploter、openxlsx、stringr),导入并预处…