CuraEngine(3)打印核心函数addLinesByOptimizer源码阅读

LayerPlan::addLinesByOptimizer的函数,它的主要功能是在给定的多边形集合(polygons)中按照最优顺序添加每个线条Line。函数使用了优化器类(LineOrderOptimizer)来对多边形进行排序,以便得到最优顺序。以下是该函数的详细步骤:

源码

这里涉及三个类LayerPlan(自己类)、Polygons(传参类)、LineOrderOptimizer (用到的优化器类)

void LayerPlan::addLinesByOptimizer(const Polygons& polygons, const GCodePathConfig& config, SpaceFillType space_fill_type, bool enable_travel_optimization, int wipe_dist, float flow_ratio, std::optional<Point> near_start_location, double fan_speed)
{Polygons boundary;if (enable_travel_optimization && comb_boundary_inside2.size() > 0){// use the combing boundary inflated so that all infill lines are inside the boundaryint dist = 0;if (layer_nr >= 0){// determine how much the skin/infill lines overlap the combing boundaryfor (const SliceMeshStorage& mesh : storage.meshes){const coord_t overlap = std::max(mesh.settings.get<coord_t>("skin_overlap_mm"), mesh.settings.get<coord_t>("infill_overlap_mm"));if (overlap > dist){dist = overlap;}}dist += 100; // ensure boundary is slightly outside all skin/infill lines}boundary.add(comb_boundary_inside2.offset(dist));// simplify boundary to cut down processing timeboundary.simplify(100, 100);}LineOrderOptimizer orderOptimizer(near_start_location.value_or(getLastPlannedPositionOrStartingPosition()), &boundary);for (unsigned int line_idx = 0; line_idx < polygons.size(); line_idx++){orderOptimizer.addPolygon(polygons[line_idx]);}orderOptimizer.optimize();for (unsigned int order_idx = 0; order_idx < orderOptimizer.polyOrder.size(); order_idx++){const unsigned int poly_idx = orderOptimizer.polyOrder[order_idx];ConstPolygonRef polygon = polygons[poly_idx];// const size_t start = orderOptimizer.polyStart[poly_idx];// const size_t end = 1 - start;// modified by zjn --20240410 fang ann 3size_t start = orderOptimizer.polyStart[poly_idx];size_t end = 1 - start;if (order_idx % 2 == 1 && layer_nr.value == 0){// std::swap(start, end);start = 1 - start;end = 1 -end;}// end modified by zjn --20240410 fang ann 3const Point& p0 = polygon[start];addTravel(p0);const Point& p1 = polygon[end];addExtrusionMove(p1, config, space_fill_type, flow_ratio, false, 1.0, fan_speed);// Wipeif (wipe_dist != 0){bool wipe = true;int line_width = config.getLineWidth();// Don't wipe is current extrusion is too smallif (vSize2(p1 - p0) <= line_width * line_width * 4){wipe = false;}// Don't wipe if next starting point is very nearif (wipe && (order_idx < orderOptimizer.polyOrder.size() - 1)){const unsigned int next_poly_idx = orderOptimizer.polyOrder[order_idx + 1];ConstPolygonRef next_polygon = polygons[next_poly_idx];const size_t next_start = orderOptimizer.polyStart[next_poly_idx];const Point& next_p0 = next_polygon[next_start];if (vSize2(next_p0 - p1) <= line_width * line_width * 4){wipe = false;}}if (wipe){addExtrusionMove(p1 + normal(p1-p0, wipe_dist), config, space_fill_type, 0.0, false, 1.0, fan_speed);}}}
}

流程

第一步、大if语句计算dist并添加入boundary:

  1. 初始化一个名为boundary的多边形对象。如果启用了旅行优化(enable_travel_optimization)并且comb_boundary_inside2的大小大于0,则使用comb_boundary_inside2的偏移量作为边界。

第二步、创建优化器并把传来的polygons传入优化器以进行对polygons的排序优化

  1. 创建一个名为orderOptimizerLineOrderOptimizer对象,用于对多边形进行排序。将near_start_location或起始位置作为参数传递给优化器。

  2. 遍历输入的多边形集合(polygons),将每个多边形添加到orderOptimizer中。

  3. 调用orderOptimizer.optimize()方法对多边形进行排序。

第三步、遍历已经优化好(排序好的)的polygons进行挤出打印

  1. 遍历排序后的多边形顺序(orderOptimizer.polyOrder),对于每个多边形:

    a. 获取多边形的起始和结束点(p0和p1)。

    b. 添加从当前位置到起始点的移动(addTravel(p0))。

    c. 添加从起始点到结束点的挤出移动(addExtrusionMove(p1, config, space_fill_type, flow_ratio, false, 1.0, fan_speed))。

    d. 如果设置了wipe_dist(擦拭距离),则根据一定的条件判断是否需要进行擦拭操作。如果满足条件,则添加一个擦拭移动(addExtrusionMove(p1 + normal(p1-p0, wipe_dist), config, space_fill_type, 0.0, false, 1.0, fan_speed))。

关于ExtrusionMove

这个函数LayerPlan::addExtrusionMove的功能是主要作用是在3D打印的层计划中添加一个新的挤出移动,包括移动到的位置、使用的配置、风扇速度等信息,并更新打印头的最后位置。这是3D打印切片和路径规划过程中的一个重要步骤,确保打印头能够按照预定的路径和参数进行挤出操作,从而完成打印任务。

void LayerPlan::addExtrusionMove(Point p, const GCodePathConfig& config, SpaceFillType space_fill_type, const Ratio& flow, bool spiralize, Ratio speed_factor, double fan_speed)
{GCodePath* path = getLatestPathWithConfig(config, space_fill_type, flow, spiralize, speed_factor);path->points.push_back(p);path->setFanSpeed(fan_speed);last_planned_position = p;
}

获取最新的路径:使用getLatestPathWithConfig函数,根据给定的配置(config)、空间填充类型(space_fill_type)、挤出率(flow)、是否螺旋化(spiralize)和速度因子(speed_factor)来获取或创建一个最新的GCodePath对象。这个对象通常代表了一个挤出路径,即打印头在打印层上移动以挤出材料的路径。
添加点到路径:将传入的点p添加到获取到的GCodePath对象的points列表中。这表示在打印过程中,打印头需要移动到点p的位置进行挤出操作。
设置风扇速度:调用setFanSpeed方法,为GCodePath对象设置风扇速度。这可以帮助在打印过程中控制冷却速度,确保打印质量。
更新最后计划的位置:将last_planned_position变量更新为当前添加的点p。这通常用于跟踪打印头在层计划中的最后位置,可能用于后续的路径规划或碰撞检测。

总结

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

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

相关文章

【二分查找】Leetcode 74. 搜索二维矩阵【中等】

搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c…

如何杜绝工厂产线人员的误操作?

工厂产线操作人员大部分教育程度不太高&#xff0c;在这里没有任何歧视的意思&#xff0c;工作中出现误操作的可能性比较大&#xff0c;在推行自动化过程中常常出现的问题&#xff0c;是软件开发人员所想不到的&#xff1b;单纯想利用软件规避所有的问题不太现实。 要杜绝工厂…

电磁场公式

矢量分析 梯度和方向倒数 标量场 φ \varphi φ 的梯度为 g r a d φ ∇ φ e x ⃗ ∂ φ ∂ x e y ⃗ ∂ φ ∂ y e z ⃗ ∂ φ ∂ z grad\varphi\nabla \varphi\vec{e_x}\frac{\partial \varphi}{\partial x}\vec{e_y}\frac{\partial \varphi}{\partial y}\vec{e_z}\f…

LeetCode 1.两数之和(HashMap.containsKey()、.get、.put操作)

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

深入掌握k8s核心概念--Pod(二)

详解Pod的配置管理与调度特性等剖析 Kubernetes 中 Pod 的配置管理&#xff08;ConfigMap&#xff09;、调度策略、回滚与扩缩容详解一、Pod 配置管理&#xff1a;ConfigMap创建 ConfigMap 示例使用 ConfigMap 的 Pod 示例 二、玩转 Pod 调度&#xff1a;Kubernetes 高级调度策…

1 GBDT:梯度提升决策树

1 前言 前面简单梳理的基本的决策树算法&#xff0c;那么如何更好的使用这个基础算法模型去优化我们的结果是本节要探索的主要内容。 梯度提升决策树&#xff08;Gradient Boosting Decision Trees&#xff09;是一种集成学习方法&#xff0c;通常用于解决回归和分类问题。它通…

DC/DC电源模块直流升压变换器电压控制输出5V12V24V转0-50V80V110V150V180V200V250V300V500V800V1000V

特点 效率高达 75%以上1*2英寸标准封装单电压输出可直接焊在PCB 上工作温度: -40℃~75℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好电压控制输出,输出电压随控制电压线性变化 应用 GRB 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、…

MySQL数据库——13.ORDER BY(排序) 语句

在 MySQL 中 ORDER BY 语句用于对查询结果进行排序。可以根据一个或多个列的值对结果集进行排序,可以指定升序(ASC)或降序(DESC)排序。 SELECT column1, column2, ... FROM table_name ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...; 在这个语法中,SELECT 查…

【ElasticSearch】安装

1.官网寻找合适版本下载 这里我选择的是8.11.1 2.解压并启动 然后在浏览器输入http://localhost:9200/&#xff0c;判断是否启动成功 如下所示&#xff0c;则表示启动成功 安装过程中遇到过几个bug&#xff0c;记录在这篇文章中 【ElasticSearch】安装&#xff08;bug篇&am…

六、OpenFeign服务接口调用

一、提问 已经有loadbalancer为什么还要学习OpenFeign? 两个都有道理的话&#xff0c;日常用那个&#xff1f; 二、是什么 OpenFeign是什么 官网翻译 Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用Feign创建一个接口并对其进行注释。它具有可…

一键生成绘画作品,国内提供的7款AI绘画软件推荐

随着人工智能的迅猛发展&#xff0c;给我们的工作和兴趣带来了极大的便利。尤其是在绘画领域&#xff0c;随着越来越多的AI绘画工具的问世&#xff0c;我们能够以惊人的速度创作出精美的插图和照片。因此&#xff0c;本文将为大家介绍7款备受推崇的AI绘画软件~ 1.爱制作AI 爱制…

连连看游戏页面网站源码,直接使用

可以上传自己喜欢的图片 游戏页面 通关页面 源码免费下载地址抄笔记 (chaobiji.cn)

Java面试题:2024面试全攻略+BTA内部密卷 视频教程+springboot

基础篇 1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象&#xff08;Java最重要的特性&#xff0c;让程序耦合度更低&#xff0c;内聚性更高&#xff09; 阿里内部资料 基本类型 大小&#xff08;字节&#xff09; 默认值 封装类 6、Java自动装箱与拆箱 装箱就是…

springboot运行原理

springboot运行原理 1、启动器 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency>​ springboot-boot-starter:就是springboot的场景启动器。springboot将所有的…

图像超分辨率—SRGAN训练及测试教程(Pytorch)

图像超分辨率—SRGAN训练及测试教程(Pytorch) 目录 图像超分辨率—SRGAN训练及测试教程(Pytorch)训练教程训练完整代码测试教程测试单张图片测试完整代码论文链接:Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Networ (CVPR2017) 代码…

ChatGPT 可以预测未来吗?

推荐 4月13日的一篇有趣的 paper&#xff0c;特来分享。 &#x1f449; 当前的大型语言模型&#xff08;LLMs&#xff09;具有强大的数据合成和推理能力&#xff0c;但它们在直接预测尚未发生事件的准确性上常常受到限制。传统的预测方法依赖于直接询问模型关于未来的问题。 …

算法思想总结:链表

一、链表的常见技巧总结 二、两数相加 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {//利用t来存进位信息int t0;ListNode*newheadnew ListNode(0);//创建一个哨兵节点&#xff0c;方便尾插List…

现在新开两融账户融资利率最低可以多少?5%~4.5%

两融是融资和融券的简称&#xff0c;是一种信用交易的方式&#xff0c;可以让投资者在股票市场上放大收益&#xff0c;也放大风险。融资是指投资者向证券公司借入资金&#xff0c;用于买入股票或其他证券&#xff0c;期待价格上涨后卖出&#xff0c;赚取差价&#xff0c;并在约…

记录Python链接mysql数据的增删改查方法

一、添加方法 db pymysql.connect(hostlocalhost,userroot,password123456,dbpython) cursor db.cursor() sql """insert into EMPLOYEEVALUES(3,张,天爱,35,F,8000) """ try:cursor.execute(sql)db.commit() #提交后&#xff0c;数据才会变 …

vue中的inject和provide

在Vue中&#xff0c;provide 和 inject 是用来实现祖先组件向子孙组件传递数据的一种高级组件通信方式。provide 可以在祖先组件中定义数据&#xff0c;而 inject 可以在子孙组件中接收这些数据。这种传递方式不受组件层级限制&#xff0c;非常适合于跨多层级的组件通信。 用法…