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。

文件读取的实现:

  if (files.size() ==  && files[][] == '$')
{
const char *input_filename = files[].c_str();
model = new SimpleModel();
for(unsigned int n=; input_filename[n]; n++)
{
model->volumes.push_back(SimpleVolume());
SimpleVolume* volume = &model->volumes[model->volumes.size()-];
guiSocket.sendNr(GUI_CMD_REQUEST_MESH); int32_t vertexCount = guiSocket.recvNr();
int pNr = ;
cura::log("Reading mesh from socket with %i vertexes\n", vertexCount);
Point3 v[];
while(vertexCount)
{
float f[];
guiSocket.recvAll(f, * sizeof(float));
FPoint3 fp(f[], f[], f[]);
v[pNr++] = config.matrix.apply(fp);
if (pNr == )
{
volume->addFace(v[], v[], v[]);
pNr = ;
}
vertexCount--;
}
}
}else{
model = new SimpleModel();
for(unsigned int i=;i < files.size(); i++) {
if(files[i] == "-")
model->volumes.push_back(SimpleVolume());
else {
cura::log("Loading %s from disk...\n", files[i].c_str());
SimpleModel *test = loadModelFromFile(model,files[i].c_str(), config.matrix);
if(test == nullptr) { // error while reading occurred
cura::logError("Failed to load model: %s\n", files[i].c_str());
return false;
}
}
}
}

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

 SimpleModel* loadModelFromFile(SimpleModel *m,const char* filename, FMatrix3x3& matrix)
{
const char* ext = strrchr(filename, '.');
if (ext && stringcasecompare(ext, ".stl") == )
{
return loadModelSTL(m,filename, matrix);
}
if (filename[] == '#' && binaryMeshBlob != nullptr)
{
while(*filename == '#')
{
filename++; m->volumes.push_back(SimpleVolume());
SimpleVolume* vol = &m->volumes[m->volumes.size()-];
int32_t n, pNr = ;
if (fread(&n, , sizeof(int32_t), binaryMeshBlob) < )
return nullptr;
cura::log("Reading mesh from binary blob with %i vertexes\n", n);
Point3 v[];
while(n)
{
float f[];
if (fread(f, , sizeof(float), binaryMeshBlob) < )
return nullptr;
FPoint3 fp(f[], f[], f[]);
v[pNr++] = matrix.apply(fp);
if (pNr == )
{
vol->addFace(v[], v[], v[]);
pNr = ;
}
n--;
}
}
return m;
}
return nullptr;
}

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

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

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

 SimpleModel* loadModelSTL(SimpleModel *m,const char* filename, FMatrix3x3& matrix)
{
FILE* f = fopen(filename, "r");
char buffer[];
if (f == nullptr)
return nullptr; if (fread(buffer, , , f) != )
{
fclose(f);
return nullptr;
}
fclose(f); buffer[] = '\0';
if (stringcasecompare(buffer, "solid") == )
{
SimpleModel* asciiModel = loadModelSTL_ascii(m, filename, matrix);
if (!asciiModel)
return nullptr; // This logic is used to handle the case where the file starts with
// "solid" but is a binary file.
if (m->volumes[m->volumes.size()-].faces.size() < )
{
m->volumes.erase(m->volumes.end() - );
return loadModelSTL_binary(m, filename, matrix);
}
return asciiModel;
}
return loadModelSTL_binary(m, filename, matrix);
}

  此函数同样分两种情况(看来码农都喜欢二分)。很简单,读入开头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相关,这些都是贯穿整个程序的,以后详细学习。

  哦也。

cura-engine学习(1)的更多相关文章

  1. Google App Engine 学习和实践

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

  2. Google Earth Engine学习资源分享

    最近在学习Google Earth Engine的使用,发现这个平台确实是一个非常好用.非常强大的平台.在GEE官网上找到了一些中文的学习资料,现在搬运过来分享给大家共同学习.教程分为两个部分 教程一 ...

  3. Diligent Engine学习笔记初衷

    2020年过去一个月了,回首过去的一年,工作确实很忙,但是自己个人的技术也没得到什么成长,项目当中一些比较难搞的问题也没得到更深入的研究.思来想去,希望新的一年能改变自己的工作方式,将工作上的事物进一 ...

  4. QLoo graphql engine 学习三 架构

    一张官方的参考图 说明 Storage Layer API 参考了kubernetes 的设计 qloo 组成 qloo 有qloo 服务以及envoy proxy 组合而成,envoy proxy ...

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

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

  6. QLoo graphql engine 学习一 基本试用(docker&&docker-compose)

      说明:使用docker-compose 进行安装 代码框架 使用命令行工具创建 qlooctl install docker qloo-docker 运行qloo&&gloo 启动 ...

  7. CE学习记录1

    主题 春节放假终于有空学习下怎么制作外挂啦......学习写外挂大概是我一开始学习计算机的动力吧....只是一直似懂非懂..看教学视频各种不明白为什么....也没有专门的时间学习下怎么写....春节有 ...

  8. Gcode命令【转】

    https://www.jianshu.com/p/f8a328457a45 简述 研究过3D打印机的朋友,都会用到G-code文件.要使用3D打印机打印东西要经过几个步骤:        1.创建3 ...

  9. 收购公司、孵化(产品)和被收购的20个短篇故事-BI产品的历史

    原文地址: 20 short tales of acquiring companies, incubating (ideas into products) and being acquired. | ...

  10. SQLAlchemy 学习笔记(一):Engine 与 SQL 表达式语言

    个人笔记,如有错误烦请指正. SQLAlchemy 是一个用 Python 实现的 ORM (Object Relational Mapping)框架,它由多个组件构成,这些组件可以单独使用,也能独立 ...

随机推荐

  1. centos7 安装R和Rstudio客户端

    #官网下载R和Rstudio 我下载的是 R-3.2.1.tar.gz和rstudio-0.99.467-x86_64.rpm两个版本 rstudio没有看见有centos版的,下的这个RStudio ...

  2. Linux服务器开发/测试环境搭建-流程

    1.MariaDB yum 安装/初始化/授远程权限 yum安装 在MariaDB官网根据Linux系统查找您所需要的db版本:https://downloads.mariadb.org/mariad ...

  3. jquery.cookie实战用法详细解析

    Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是 ...

  4. Google Chrome调试js代码

    你 是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍微改进一点的方法是用 console.log() 在 JavaScript 控制台上输出内容.嗯~, ...

  5. 编译安装mysql-server5.6.32手记

    起因: CentOS内置源里面默认安装的Mysql-server太老旧,不支持一些新方法的调用,需要重新安装一个新版本 老版本里面有数据,不想卸载,想保留库和软件本身 机器上没有运行Docker,而且 ...

  6. 利用PHPCMS V9站群功能建立分站

    hosts文件就在C:\Windows\system32\drivers\etc\hosts下 用一套CMS软件系统,做多个网站,统一管理,用户可以互通,这就是所谓的站群功能.这对于运营和维护都能节省 ...

  7. spring mvc ajax请求

    jar包中增加 jackson-annotations-2.5.0.jar jackson-core-2.5.0.jar jackson-databind-2.5.0.jar springmvx.xm ...

  8. JDK源码分析-AtomicInteger

    AtomicInteger可以看做Integer类的原子操作工具类.在java.util.concurrent.atomic包下,在一些使用场合下可以取代加锁操作提高并发性.接下来就从几个方面来介绍: ...

  9. 将 ext_net 连接到 router - 每天5分钟玩转 OpenStack(145)

    上一节完我们创建了外部网络 ext_net,接下来需要将其连接到 Neutron 的虚拟路由器,这样 instance 才能访问外网. 点击菜单 Project -> Network -> ...

  10. ubuntu 下配置Web服务器

    ubuntu 下配置Web服务器 1.切换管理员身份 终端/文本界面输入命令: su 根据提示输入密码 注: 如果不能使用su 点击查看如何启用su2.安装MySQL5 apt-get install ...