微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何利用正则表达式提取出由三维软件导出的STL文件中的顶点数据

这篇文章主要为大家展示了“如何利用正则表达式提取出由三维软件导出的STL文件中的顶点数据”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何利用正则表达式提取出由三维软件导出的STL文件中的顶点数据”这篇文章吧。

先简单介绍matlab中的正则吧

(不全说,只讲我下面要用到的)

regexpi(String, pattern)   % 忽略大小写
这个将返回pattern在String中出现的所有位置,如果为空则表示String中没有patern

match = regexpi(String, pattern, 'match')   % 忽略大小写
这个将返回在String中出现的所有的pattern, 返回值是一个cell,
所有出现的pattern都作为单独的一个元素放在这个cell中了
如果没有匹配到pattern则match为空



下面说一下这个pattern

如果pattern = 'vertex',那么之后将在String中找和'vertex'一模一样的位置
也就是:如果pattern是一个已知的字符串(只有一种可能),那么就是在String中寻找这个已知的字符串

如果pattern是一个并不确定的字符串(有多种可能),那么就要自己定义这个模式了。
\+  表示'+'号
\-  表示'-'号
[]  表示一个字符集,[\+\-]表示这一个位置可以是'+'号也可以是'-'号,(只能表示一个字符)
\d  表示一个数字
*   表示'*'号前的那个字符可以重复任意次,\d* 表示任意长度的数字

好了只要知道以上这些就可以完成本篇推文中所需要的模式了

那么下面来分析一下要筛选出STL文件中的顶点坐标需要怎样的规则

stl文件如下:

如何利用正则表达式提取出由三维软件导出的STL文件中的顶点数据

1. 每一个顶点数据都是以vertex打头的(忽略空格)

2. 那么只要这一行中存在'vertex',那么就存在顶点坐标

3. 判断'vertex'是否存在在某行中可以用如下的方法

if ~isempty(regexpi(line, 'vertex'))

4. 那么接下来分析这个顶点坐标的字符串

每个方向的坐标值前要么是+号,要么是-号:

[\+\-]

加减号之后就是一串数字:

\d*

再之后就到点号了 '.'

\.

再之后又是一串数字

\d*

再之后到 'E'

E

再之后到+号或-号

[\+\-]

之后再到一串数字

\d*

5. 那么连起来就是:

'[\+\-]\d*\.\d*E[\+\-]\d*'

6. 通过regexpi来获取坐标点

xyz_str_cell = regexpi(line, '[\+\-]\d*\.\d*E[\+\-]\d*', 'match');

如何利用正则表达式提取出由三维软件导出的STL文件中的顶点数据

接下来就就好整了:

clc
clear

file = fopen('palne_stl.txt', 'r');

f = @(c) str2num(c);
vertexs = []; % 三列(x, y, z),n行,每三行作为一组
while ~feof(file)
    line = fgetl(file);
    if ~isempty(regexpi(line, 'vertex'))
        xyz_str_cell = regexpi(line, '[\+\-]\d*\.\d*E[\+\-]\d*', 'match');
        xyz_cell = cellfun(f, xyz_str_cell, 'UniformOutput', false);
        xyz = cell2mat(xyz_cell);
        vertexs = [vertexs; xyz];
    end
end
fclose(file)
% len = length(vertexs) 绝对是3的整数倍,不然就是文件有误

for i = 1 : length(vertexs)
    if ~rem(i, 3)
        point1 = vertexs(i-2, :);
        point2 = vertexs(i-1, :);
        point3 = vertexs(i, :);
        x = [point1(1), point2(1), point3(1)];
        y = [point1(2), point2(2), point3(2)];
        z = [point1(3), point2(3), point3(3)];
        patch(x, y, z, 'r')
    end
end

xyz_str_cell中的每一个元素都是一个数字字符串,所以需要用str2num来转换一下,为了避免循环,采用cellfun。

经过cellfun转换后,虽然由字符串变成了数字,但是整个还是一个cell,所以用cell2mat转换一下。

fopen配合fgetl一次可以获取文件中的一行。

这样顶点数据就保存起来了

之后就利用patch把每一片给画出来,每三组顶点为一片。

最后整个就完成了,即有了stl2matlab的功能,同时也能直接画出原模型

可以修改patch的属性达到你自己想要的结果。我在上面没有进行修改

可以把这个脚本封装成一个函数,取个名字,添加到路径,以后就能直接用了。

最后附上最后的模型把:

如何利用正则表达式提取出由三维软件导出的STL文件中的顶点数据

以上是“如何利用正则表达式提取出由三维软件导出的STL文件中的顶点数据”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程之家行业资讯频道!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐