cura-engine为开源3D打印软件cura的核心引擎代码,详细介绍参看github主页。现在学习的是一个简单版的https://github.com/repetier/CuraEngine,最新版https://github.com/Ultimaker/CuraEngine添加了很多功能,尤其通信部分有点难懂。本系列文章主要是为了保存本人阅读记忆,一面吃过就忘,所以完全按照阅读顺序编写,故稍有凌乱。下面直接进入学习。

  首先看fffProcessor.h中的读取STL文件部分:

函数ProsessFile:功能:STL文件读取prepareModel、生成切片数据processSliceData、生成Gcode writeGcode。(log函数现在滤去,单独研究)

函数prepareModel:功能:STL文件读取、优化STL文件、生成LayerParts。涉及到的类:class SimpleModel、class SimpleVolume、class OptimizedModel、cura class Slicer、cura class SupportStorage。

文件读取的实现:

 1  if (files.size() == 1 && files[0][0] == '$')
 2         {
 3             const char *input_filename = files[0].c_str();
 4             model = new SimpleModel();
 5             for(unsigned int n=0; input_filename[n]; n++)
 6             {
 7                 model->volumes.push_back(SimpleVolume());
 8                 SimpleVolume* volume = &model->volumes[model->volumes.size()-1];
 9                 guiSocket.sendNr(GUI_CMD_REQUEST_MESH);
10
11                 int32_t vertexCount = guiSocket.recvNr();
12                 int pNr = 0;
13                 cura::log("Reading mesh from socket with %i vertexes\n", vertexCount);
14                 Point3 v[3];
15                 while(vertexCount)
16                 {
17                     float f[3];
18                     guiSocket.recvAll(f, 3 * sizeof(float));
19                     FPoint3 fp(f[0], f[1], f[2]);
20                     v[pNr++] = config.matrix.apply(fp);
21                     if (pNr == 3)
22                     {
23                         volume->addFace(v[0], v[1], v[2]);
24                         pNr = 0;
25                     }
26                     vertexCount--;
27                 }
28             }
29         }else{
30             model = new SimpleModel();
31             for(unsigned int i=0;i < files.size(); i++) {
32                 if(files[i] == "-")
33                     model->volumes.push_back(SimpleVolume());
34                 else {
35                     cura::log("Loading %s from disk...\n", files[i].c_str());
36                     SimpleModel *test = loadModelFromFile(model,files[i].c_str(), config.matrix);
37                     if(test == nullptr) { // error while reading occurred
38                         cura::logError("Failed to load model: %s\n", files[i].c_str());
39                         return false;
40                     }
41                 }
42             }
43         }

  此处读入文件来源有两种,一是通过guiSocket从通信中接收的数据,二是从硬盘中读取STL文件,通信部分暂且不提,先学习后者。这就到了loadModelFromFile函数,此函数名字就已透露其作用-读文件。代码在文件modelFile.cpp中,如下:

 1 SimpleModel* loadModelFromFile(SimpleModel *m,const char* filename, FMatrix3x3& matrix)
 2 {
 3     const char* ext = strrchr(filename, '.');
 4     if (ext && stringcasecompare(ext, ".stl") == 0)
 5     {
 6         return loadModelSTL(m,filename, matrix);
 7     }
 8     if (filename[0] == '#' && binaryMeshBlob != nullptr)
 9     {
10         while(*filename == '#')
11         {
12             filename++;
13
14             m->volumes.push_back(SimpleVolume());
15             SimpleVolume* vol = &m->volumes[m->volumes.size()-1];
16             int32_t n, pNr = 0;
17             if (fread(&n, 1, sizeof(int32_t), binaryMeshBlob) < 1)
18                 return nullptr;
19             cura::log("Reading mesh from binary blob with %i vertexes\n", n);
20             Point3 v[3];
21             while(n)
22             {
23                 float f[3];
24                 if (fread(f, 3, sizeof(float), binaryMeshBlob) < 1)
25                     return nullptr;
26                 FPoint3 fp(f[0], f[1], f[2]);
27                 v[pNr++] = matrix.apply(fp);
28                 if (pNr == 3)
29                 {
30                     vol->addFace(v[0], v[1], v[2]);
31                     pNr = 0;
32                 }
33                 n--;
34             }
35         }
36         return m;
37     }
38     return nullptr;
39 }

  此处可以看出分两种情况,一是读取.stl后缀的STL文件,二是读取blob(binary large object)二进制大对象,blob同样来源与硬盘数据文件,至于到底是神马,还不知道。

1  m->volumes.push_back(SimpleVolume());
2             SimpleVolume* vol = &m->volumes[m->volumes.size()-1];

  代码作者超级喜欢这种先推入一个初始的几何体,然后在通过引用取出到vol,再赋值,貌似我一般都是相反的顺序,不知这种有何优势。下面还是看一看函数LoadModelSTL()吧,就在正上方。

 1 SimpleModel* loadModelSTL(SimpleModel *m,const char* filename, FMatrix3x3& matrix)
 2 {
 3     FILE* f = fopen(filename, "r");
 4     char buffer[6];
 5     if (f == nullptr)
 6         return nullptr;
 7
 8     if (fread(buffer, 5, 1, f) != 1)
 9     {
10         fclose(f);
11         return nullptr;
12     }
13     fclose(f);
14
15     buffer[5] = '\0';
16     if (stringcasecompare(buffer, "solid") == 0)
17     {
18         SimpleModel* asciiModel = loadModelSTL_ascii(m, filename, matrix);
19         if (!asciiModel)
20             return nullptr;
21
22         // This logic is used to handle the case where the file starts with
23         // "solid" but is a binary file.
24         if (m->volumes[m->volumes.size()-1].faces.size() < 1)
25         {
26             m->volumes.erase(m->volumes.end() - 1);
27             return loadModelSTL_binary(m, filename, matrix);
28         }
29         return asciiModel;
30     }
31     return loadModelSTL_binary(m, filename, matrix);
32 }

  此函数同样分两种情况(看来码农都喜欢二分)。很简单,读入开头5个字母,如果是solid,则按Ascii读入,否则按照二进制读入。然而作者心思谨慎,开头是solid时也有二进制情况,所以检查一下读入最后一个几何体如果一个面都没有,那就错了呗,滚回用二进制重新读。

  函数loadModelSTL_ascii(SimpleModel *m,const char* filename, FMatrix3x3& matrix)

   和loadModelSTL_binary(SimpleModel *m,const char* filename, FMatrix3x3& matrix)是我们这部分的最后一站,代码不是很难,但有个小小的问题,matrix到底是干什么用的。这个matrix来自最初的函数loadModelFromFile(model,files[i].c_str(), config.matrix);config据我目前所知是整个系统一些参数设置的一个汇总类class ConfigSettings。这里面保存了大量的参数设置。这个matrix是的用途就是每个读入的坐标与其相乘,结果再存入model->volume.faces,就是将几何体坐标根据需要做了个变换,至于变换的作用,现在还不清楚。

  至此,文件读入功能结束,文中还有一些问题没有解决,主要有log相关函数,socket相关函数和config相关,这些都是贯穿整个程序的,以后详细学习。

  哦也。

转载于:https://www.cnblogs.com/dama116/p/6425825.html

cura-engine学习(1)相关推荐

  1. Google Earth Engine 学习7---ASTER GED 地表发射率数据下载

    Google Earth Engine 学习7-ASTER GED 地表发射率数据下载 The Advanced Spaceborne Thermal Emission and Reflection ...

  2. Google App Engine 学习和实践

    这个周末玩了玩Google App Engine,随手写点东西,算是学习笔记吧.不当之处,请多多指正. 作者:liigo,2009/04/26夜,大连 原创链接:http://blog.csdn.ne ...

  3. ArcGIS Engine学习系列1 AE基础介绍

    1.ArcGIS软件体系结构 2.ArcObjects ArcObjects是ESRI公司ArcGIS系列产品的开发平台,它是基于Microsoft COM技术(基于微软COM技术,所以只能在这个环境 ...

  4. Flax Engine学习笔记(一)——综述

    2021SC@SDUSC 本学期根据课程要求,我们小组选择了Flax Engine这款游戏引擎来进行源码分析学习 Flax Engine是一款开源的轻量级游戏引擎,具备以下功能: 无缝的 C# 和 C ...

  5. Express engine 学习笔记 - app.engine 的使用方法

    看下面这段代码: server.engine('html',ngExpressEngine({bootstrap: AppServerModule,})); app.engine(ext, callb ...

  6. Google Earth Engine学习笔记(一)

    基于GEE平台的Landsat8.Sentinel2.MODIS"去云"处理及FUI水色指数运算 文章目录 基于GEE平台的Landsat8.Sentinel2.MODIS&quo ...

  7. Express engine 学习笔记 - 工作在反向代理背后的 Express 设置

    第22行的 express,返回的是一个 express Application 实例. 再看该实例的 set 方法: app.set(name, value) 将设置名称分配给值. 您可以存储您想要 ...

  8. QLoo graphql engine 学习二 基本试用(kubernetes)

    已经测试过docker&& docker-compose 的运行模式,下面测试下kubernetes的运行模式 kubernetes 我使用docker for mac qloo 安装 ...

  9. GEE(Google Earth Engine)学习——常用筛选器Filter操作

    目录 一.筛选器Filter (1)关系比较型筛选器 (2)差值筛选器 (3)字符筛选器 (4)详细时间筛选 (5)筛选器叠加筛选 二.Join配合Filter进行两数据集联合筛选 (1)仅保留左侧数 ...

  10. Unreal Engine学习(一些稀碎的知识)

    1,什么是组件? 继承于Uobject的为了给actor以及其他在场景中显示出来的类增加新的功能的一个东西 2,可以自己创建一个蓝图,然后将蓝图拖到场景中,也可以直接在c++ class中将蓝图拖到场 ...

最新文章

  1. 多表查询事务DCL权限管理
  2. 道路 [NOIP模拟]
  3. oracle中OEM证书失效怎么办,安全证书过期怎么办 网站安全证书失效处理【解决方法】...
  4. 敏捷开发人员结构_开发人员可以在敏捷外观方面发表意见的4种方法
  5. 关于excel表的生成
  6. python控制系统仿真_MATLABSimulink与控制系统仿真(第3版)
  7. Supervisor管理hive服务(metastore,hiveserver2),防止意外杀死Hive服务,导致任务中断
  8. Python中文数字对照表,学生成绩管理【笔记】
  9. python输入水果查询个数_Python练习题4.9查询水果价格
  10. eBay Android app 最新,ebay国际版app下载
  11. windows如何打开.key keynote文件
  12. html铺满整个页面_前端实践:怎么让一个HTML元素(标签)的区域铺满全屏?
  13. 操作系统 计算机操作系统教程笔记
  14. Final Cut Pro 10.4.9中文版
  15. keyshot怎么批量渲染_如何提高KeyShot的输出渲染速度
  16. YonBuilder移动开发平台功能大盘点
  17. 张朝阳的心境,搜狐的武器
  18. java判断是不是质数(素数)超短方法
  19. STM32F103 晶振问题详解
  20. 【源码】感应电动机直接转矩控制DTC仿真

热门文章

  1. windows环境下Oracle数据库冷备份和恢复
  2. 你必须掌握足够的知识来明确如何拥有自己的观点。同时,也要培养把自己的观点付诸现实的能力。...
  3. ScalaTest学习笔记(一)
  4. 关于Infobright的一个小TIPS
  5. 如何修改snmp的监听端口
  6. Android开发:程序目录结构详解:activity主要方法等
  7. android 如何监听应用前后台切换
  8. BLE工作模式: Central+Peripheral(Advertising+Connected)
  9. Native Client 资料
  10. iphone 系统文件夹