[matlab编程实践].cli文件二进制格式读取【3D打印切片文件】
文章目录
- 零.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打印机的流程。
.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打印切片文件】相关推荐
- 河北大学生命科学学院期末Biopython编程实践。利用Biopython包读取新冠病毒(id:NC_045512.2)序列(GenBank格式NC_045512.2.gb),将其中FEATURE的类
计算机高级语言编程实践报告 2021年1月 基本要求: 1 学习python的Biopython包的使用(Seq,SeqRecord,SeqFeature三个class和SeqIO模块).编写代码,完 ...
- python读取文件路径格式_Python学习笔记读写文件之文件与文件路径
随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...
- h5如何上传文件二进制流_HTML5新特性之文件和二进制数据的操作
http://www.cnblogs.com/jscode/archive/2013/04/27/3572239.html 历史上,JavaScript无法处理二进制数据.如果一定要处理的话,只能使用 ...
- python3 读取文件夹_python读取listPython3如何检查文件或文件夹是否存在?
如何检查一个文件或者文件夹存在?有几种方法,Python2和Python3版本也有不同,这是在文件操作中常用到的方法,只有文件存在我们才可以继续对文件进行处理,下面总结了常用的检查文件是否存在的方法. ...
- python读取大文件-Python如何读取、拆分大文件
简述 最近和第三方数据接触较多,数据量也开始陡增,从一开始的1KW行,最大到了1亿行,这让我这个常年处理"小数据'的人有点捉襟见肘.本来数据放在hive中也是可以操作的,但是有时候需求是做一 ...
- python输出csv文件-Python之读取与写入CSV文件
原标题:Python之读取与写入CSV文件 本文作者:闫续文 文字编辑:张梦婷 技术总编:张学人 有问题,不要怕!访问 CSV(Comma-Separated Values)格式是电子表格和数据库最常 ...
- python读取txt文件写入-python 读取、写入txt文件的示例
写入文件 使用open()函数和write()函数 但是有两种写法,分别是'a'和'w' 'a' 表示写入文件 若无该文件会直接创建一个 如果存在这个文件,会接着已有的内容的后面写入 with ope ...
- java ftp读取文件内容_java读取ftp中TXT文件的案例
最近在开发关于java读取ftp中TXT文件,其中有些坑踩了一下,再次做个记录 1.读取文件时我会根据文件名称去生成数据库表,oracle数据库对于表名的长度是有限制的,最多30个字符 2.对于多个文 ...
- python读取多个文件夹_如何从python中的文件夹中读取多个NetCDF文件
我试图绘制多年(1979-2014)的平均温度图,我唯一的问题是尝试从文件夹中读取多个NetCDF(.nc)文件.目前我的程序将绘制单个文件,但我不明白如何使其读取文件夹中的所有文件(每年一个).我想 ...
最新文章
- Python可视化(matplotlib)图像之误差可视化(Visualizing Errors)
- 《信息学奥赛一本通》 高精度减法。输入两个正整数,求它们的差。
- matlab 图像读取长宽_计算机视觉学习笔记1 图像读取显示和尺寸变换
- 【转】 C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计
- 个人用户可以向运营商申请短信接口吗?
- 读文献--《机器学习隐私保护研究综述》
- A 45nm 1.3GHz 16.7 double-precision GFLOPS/W RISC-V processor with vector accelerators
- 什么是CSR以及CSR的作用和生成方法
- 如果使用Vue3.0实现一个 Modal,你会怎么进行设计?
- AI崛起,阿里的科技孵化力
- Python Matplotlib教程
- 电竞专业与计算机专业,2021电竞专业的大学排名 电竞专业主要上什么课程
- 友情链接作用与方法详解
- blackberry work app for android,BlackBerry Work
- 外部字体引用、过渡效果
- python和python3联通_python2号和python3号的区别总结,差异
- 无源光网络(PON) VS有源光网络(AON)
- 嵌入式开发时出现:No rule to make target `***‘, needed by `****‘. Stop
- 计算机文件名是蓝颜色,为什么有些文件名是蓝色的?
- 小说《三体》为何“封神”?
热门文章
- 实战-完整代码答题系统
- 克隆Centos之后,ifconfig得不到ip地址,mac地址冲突
- win10 进不了修复服务器失败,win10系统电脑启动不了的修复方法
- 怎样将mpg格式的视频文件转换成mp4格式
- 用大疆雷达DIY的3D扫描仪器
- 宝塔面板 SSL 证书安装部署
- 区块链(Block Chain)结构解析
- 2020年二级计算机msoffice题库,2020年3月全国计算机等级考试《二级MS Office高级应用》题库...
- Xshell下载安装时报错can not find nslicense.dll
- js实现 todoList