文章目录

  • 零.cli文件简介
    • 0.0 cli文件说明文档
    • 0.1 下面是我们这使用的3D打印机的流程。
    • 0.2 cli文件格式
    • 0.3 cli文件结构
    • 0.4 几何数据部分详解
  • 一.matlab 程序实现

零.cli文件简介

0.0 cli文件说明文档

cli文件说明文档,网址:https://www.hmilch.net/downloads/cli_format.html

0.1 下面是我们这使用的3D打印机的流程。

#mermaid-svg-S6nLZle51ANcSKkD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-S6nLZle51ANcSKkD .error-icon{fill:#552222;}#mermaid-svg-S6nLZle51ANcSKkD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-S6nLZle51ANcSKkD .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-S6nLZle51ANcSKkD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-S6nLZle51ANcSKkD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-S6nLZle51ANcSKkD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-S6nLZle51ANcSKkD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-S6nLZle51ANcSKkD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-S6nLZle51ANcSKkD .marker.cross{stroke:#333333;}#mermaid-svg-S6nLZle51ANcSKkD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-S6nLZle51ANcSKkD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-S6nLZle51ANcSKkD .cluster-label text{fill:#333;}#mermaid-svg-S6nLZle51ANcSKkD .cluster-label span{color:#333;}#mermaid-svg-S6nLZle51ANcSKkD .label text,#mermaid-svg-S6nLZle51ANcSKkD span{fill:#333;color:#333;}#mermaid-svg-S6nLZle51ANcSKkD .node rect,#mermaid-svg-S6nLZle51ANcSKkD .node circle,#mermaid-svg-S6nLZle51ANcSKkD .node ellipse,#mermaid-svg-S6nLZle51ANcSKkD .node polygon,#mermaid-svg-S6nLZle51ANcSKkD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-S6nLZle51ANcSKkD .node .label{text-align:center;}#mermaid-svg-S6nLZle51ANcSKkD .node.clickable{cursor:pointer;}#mermaid-svg-S6nLZle51ANcSKkD .arrowheadPath{fill:#333333;}#mermaid-svg-S6nLZle51ANcSKkD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-S6nLZle51ANcSKkD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-S6nLZle51ANcSKkD .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-S6nLZle51ANcSKkD .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-S6nLZle51ANcSKkD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-S6nLZle51ANcSKkD .cluster text{fill:#333;}#mermaid-svg-S6nLZle51ANcSKkD .cluster span{color:#333;}#mermaid-svg-S6nLZle51ANcSKkD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-S6nLZle51ANcSKkD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

CAD软件导出
切片软件
三维模型
STL文件
.cli文件
3D打印机加工软件

.cli文件是切片软件将STL文件完成切片后的切片文件,里面保存了每层的切片轮廓等几何信息。

0.2 cli文件格式

cli文件主要分为两种:
i)ASCII码版本,里面几何数据由ASCII码保存,可以直接用记事本打开查看,占内存大,少见。如下图,里面的信息很容易读。

ii)二进制码版本,里面的几何数据由二进制码保存,可读性差,短小精悍,多见。如下图,几何数据部分都是乱码。

本文是二进制文件读取。

0.3 cli文件结构

如上图可见,里面分为两部分:
i)头文件部分:这部分使用ASCII码编写。头文件部分以’‘HEADERSTART’‘开始,每条指令用"$$"开头,中间每条指令结束有一个换行符,以’‘HEADEREND’'结束,后面之间接几何数据部分的二进制码,没有换行符。
ii)几何数据部分:这部分使用二进制码编写,可以在网上下载二进制读取软件查看。
如下图,读出来是这样的,左边是二进制码,中间转成16进制,右边是ASC码。

0.4 几何数据部分详解

几何部分数据格式:【指令+数据】
其中指令是两个字节十六位二进制数(unsigned integer)表示,数据有的是二字节十六位(unsigned int)有的是四字节三十二位(long int)。详见开头的说明文档。

我这里的几何数据部分主要是两个指令:
(这里面的二进制数据应该都是小字节序,两个字节颠倒顺序的)
(里面没有小数,都是整型,乘以头文件中的单位得到小数的坐标数据)

i)指令128:层高指令 格式【10000000 00000000 ZZZZZZZZ ZZZZZZZZ】

10000000 00000000代表指令128,后面两字节ZZZZZZZZ ZZZZZZZZ是层高数据。
这个指令应该是换层指令。

ii)指令129:轮廓指令 格式【10000001 00000000 IDIDIDID IDIDIDID didididi didididi nnnnnnnn nnnnnnnn x1x1x1x1 y1y1y1y1 x2x2x2x2 y2y2y2y2 …】
前面10000001 00000000代表指令129 ;后面两字节的ID数据(我也不知道有啥用,一般是1);后面是两字节的方向数据,0:顺时针 1:逆时针 2:开线。再后面是这条轮廓线中的点的个数n,再后面是坐标数据。

iii)除了这两条之外,还另有四条指令,还有填充线的指令,用于规划打印路径,详见开头的说明文档。

一.matlab 程序实现

本人编程水平奇差,下面程序仅作参考。
这个程序会读取cli文件,将其中每层轮廓画图,并保存。
cli文件地址和保存文件地址请自行修改。

3.18更新
上一个版本的代码有些错误导致读取某些文件会画图出错
又重新改了代码
仍然会有错误,请读者包涵。

clear all%清除工作空间
%%
%文件读取部分,打开文件读取到data中
%||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fid=fopen('长方体5-30-1_5.cli','rb');%打开文件,只读模式,二进制格式||
%||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||%找到头文件中第八行,存到lines中,里面包含层数信息用于后续提取
for i=1:8lines=fgets(fid);
endfrewind(fid);%文件指针回到开头
data=fread(fid,'uint16');%读取二进制文件内容,读取格式'uint16'是用小节字序表示的无符号整型二进制数
fclose(fid);%关闭文件%%
%数据定义部分pre=0.005;%坐标精度i=0;%操作循环
j=1;%操作循环
z=0;%操作层数
n=0;%操作点的个数
k=0;%操作循环
t=0;%操作循环
%n_numb(z,n) 第z层第n条轮廓线中的点数
%X(z,i)、Y(z,i)代表第z层第i个轮廓点的x、y的坐标
data_num=0;%整个文件的数据数
data_headnum=0;%头文件部分的数据数
%n_sum初始化每层点数
%layers层数,从头文件中读取%%
%前置处理部分
%寻找数据头的坐标
data_num=size(data);%data_num是整个文件的数据量(两个字节算一个数据)while i==0%先找到第一个指令128,它代表几何数据部分的开始if (data(j)==128)i=1;endj=j+1;%j-1代表第一个128指令的字节数
enddata_headnum=j-2;%data_headnum代表头文件的数据量(两个字节算一个数据)%下面找到头文件中的层数信并转换成数字格式存储到变量layers中
layers_txt=strcat(lines(12),lines(13),lines(14),lines(15));
layers=str2num(layers_txt);%%
%数据读取部分
n_sum=zeros(1,layers);%初始化每层点数
i=data_headnum+1;while (i<=data_num(1))%从几何部分第一个数据开始读取if data(i)==128%如果是指令128z=z+1;%那么层数加一k=0;if n~=0%在每层n_numb最后补一行0,方便后面画图n_numb(z-1,n)=0;endn=1;%每层的第几条轮廓线归1i=i+1;%补ielse %如果是指令129n_numb(z,n)=data(i+3);%那么129指令后第三个数据代表这个轮廓线中含有的点个数n_sum(z)=n_sum(z)+n_numb(z,n);%用于统计每层中的点数for j=k+1:n_sum(z)%读取坐标X(z,j)=data(i+4+2*t)*pre;Y(z,j)=data(i+5+2*t)*pre;t=t+1;endk=n_sum(z);i=i+2*n_numb(z,n)+3;%补it=0;n=n+1;%轮廓中点数上升endi=i+1;end%下面将坐标矩阵空余部分的0补成inf,防止画图的时候,0值显示在图上
m=max(n_sum);%寻找每层点数的最大值for i=1:layersfor j=n_sum(i)+1:mX(i,j)=inf;Y(i,j)=inf;end
end%%
%画图部分,画每层的图并保存在文件夹pic中col=1;%暂时不区分轮廓和填充for z=1:layerst=0;j=1;k=0;u=1;%——————————————————————————————————————%画线while n_numb(z,j)~=0%当线段点数矩阵元素不为0时进入以下循环k=k+n_numb(z,j);%k是折线段结束的点数hold on;%保持一个图像窗口不关闭,画多条线段if col==1%如果是轮廓线,用蓝颜色画,如果是填充线,用红颜色画for n=u:k-1%通过循环完成一条折线的绘制plot([X(z,n),X(z,n+1)],[Y(z,n),Y(z,n+1)],'b');endelse for n=u:k-1%通过循环完成一条折线的绘制plot([X(z,n),X(z,n+1)],[Y(z,n),Y(z,n+1)],'r');endendhold off;%不保持一个图像窗口不关闭u=u+n_numb(z,j);%u是折线段开始的点数j=j+1;endaxis equal;%坐标轴刻度相等%——————————————————————————————————————%命名及存储
% 图片地址及文件名,文件名格式:layers+层数
%|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||picname1='C:\Users\Layla\Desktop\read_file\pic\';%图片存储地址|||
%|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||picname2='layers';%名字picname3=num2str(z);picname4='.jpg';%格式为jpgpicname=strcat(picname1,picname2,picname3,picname4);saveas(gcf,picname);%保存文件,gcf是指当前图像的句柄fprintf('%d/%d\n',z,layers);%显示层数close(gcf);%关闭当前图像
end

[matlab编程实践].cli文件二进制格式读取【3D打印切片文件】相关推荐

  1. 河北大学生命科学学院期末Biopython编程实践。利用Biopython包读取新冠病毒(id:NC_045512.2)序列(GenBank格式NC_045512.2.gb),将其中FEATURE的类

    计算机高级语言编程实践报告 2021年1月 基本要求: 1 学习python的Biopython包的使用(Seq,SeqRecord,SeqFeature三个class和SeqIO模块).编写代码,完 ...

  2. python读取文件路径格式_Python学习笔记读写文件之文件与文件路径

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...

  3. h5如何上传文件二进制流_HTML5新特性之文件和二进制数据的操作

    http://www.cnblogs.com/jscode/archive/2013/04/27/3572239.html 历史上,JavaScript无法处理二进制数据.如果一定要处理的话,只能使用 ...

  4. python3 读取文件夹_python读取listPython3如何检查文件或文件夹是否存在?

    如何检查一个文件或者文件夹存在?有几种方法,Python2和Python3版本也有不同,这是在文件操作中常用到的方法,只有文件存在我们才可以继续对文件进行处理,下面总结了常用的检查文件是否存在的方法. ...

  5. python读取大文件-Python如何读取、拆分大文件

    简述 最近和第三方数据接触较多,数据量也开始陡增,从一开始的1KW行,最大到了1亿行,这让我这个常年处理"小数据'的人有点捉襟见肘.本来数据放在hive中也是可以操作的,但是有时候需求是做一 ...

  6. python输出csv文件-Python之读取与写入CSV文件

    原标题:Python之读取与写入CSV文件 本文作者:闫续文 文字编辑:张梦婷 技术总编:张学人 有问题,不要怕!访问 CSV(Comma-Separated Values)格式是电子表格和数据库最常 ...

  7. python读取txt文件写入-python 读取、写入txt文件的示例

    写入文件 使用open()函数和write()函数 但是有两种写法,分别是'a'和'w' 'a' 表示写入文件 若无该文件会直接创建一个 如果存在这个文件,会接着已有的内容的后面写入 with ope ...

  8. java ftp读取文件内容_java读取ftp中TXT文件的案例

    最近在开发关于java读取ftp中TXT文件,其中有些坑踩了一下,再次做个记录 1.读取文件时我会根据文件名称去生成数据库表,oracle数据库对于表名的长度是有限制的,最多30个字符 2.对于多个文 ...

  9. python读取多个文件夹_如何从python中的文件夹中读取多个NetCDF文件

    我试图绘制多年(1979-2014)的平均温度图,我唯一的问题是尝试从文件夹中读取多个NetCDF(.nc)文件.目前我的程序将绘制单个文件,但我不明白如何使其读取文件夹中的所有文件(每年一个).我想 ...

最新文章

  1. Python可视化(matplotlib)图像之误差可视化(Visualizing Errors)
  2. 《信息学奥赛一本通》 高精度减法。输入两个正整数,求它们的差。
  3. matlab 图像读取长宽_计算机视觉学习笔记1 图像读取显示和尺寸变换
  4. 【转】 C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计
  5. 个人用户可以向运营商申请短信接口吗?
  6. 读文献--《机器学习隐私保护研究综述》
  7. A 45nm 1.3GHz 16.7 double-precision GFLOPS/W RISC-V processor with vector accelerators
  8. 什么是CSR以及CSR的作用和生成方法
  9. 如果使用Vue3.0实现一个 Modal,你会怎么进行设计?
  10. AI崛起,阿里的科技孵化力
  11. Python Matplotlib教程
  12. 电竞专业与计算机专业,2021电竞专业的大学排名 电竞专业主要上什么课程
  13. 友情链接作用与方法详解
  14. blackberry work app for android,BlackBerry Work
  15. 外部字体引用、过渡效果
  16. python和python3联通_python2号和python3号的区别总结,差异
  17. 无源光网络(PON) VS有源光网络(AON)
  18. 嵌入式开发时出现:No rule to make target `***‘, needed by `****‘. Stop
  19. 计算机文件名是蓝颜色,为什么有些文件名是蓝色的?
  20. 小说《三体》为何“封神”?

热门文章

  1. 实战-完整代码答题系统
  2. 克隆Centos之后,ifconfig得不到ip地址,mac地址冲突
  3. win10 进不了修复服务器失败,win10系统电脑启动不了的修复方法
  4. 怎样将mpg格式的视频文件转换成mp4格式
  5. 用大疆雷达DIY的3D扫描仪器
  6. 宝塔面板 SSL 证书安装部署
  7. 区块链(Block Chain)结构解析
  8. 2020年二级计算机msoffice题库,2020年3月全国计算机等级考试《二级MS Office高级应用》题库...
  9. Xshell下载安装时报错can not find nslicense.dll
  10. js实现 todoList