有点复杂的问题,.stl文件的读入

herocock 2008-04-18 08:47:42
小弟近日要编个程,读入.STL格式的模型(比如一个立方体),然后给不同地方上的(比如立方体的每个面)三角面加上属性,还要统计各个点的坐标和编号,然后转换成另一种格式的文件输出。
由于入门C++不到1个月,算法还行,但在文件流这块不熟,不知道怎样读进来比较好,另外读进来之后如何组织数据结构以方便筛选掉重复的点,以及判别不同地方的面以加属性标志。能给出读入的代码及推荐的存储结构最好了,谢谢指教。
一个例子.STL文件如下:
用AUTOcad做的,可以使用一些软件打开,是一个上部为楔形的立方体。现在要读入,目的是给不同方向上的面上的各个三角面片附上属性标志,比如在xy坐标平面上,且z=0,的面上的三角面都附属性1。还要统计各个点的坐标,去掉重复的点,编号。


solid AutoCAD
facet normal 0.0000000e+000 0.0000000e+000 -1.0000000e+000
outer loop
vertex 1.0000000e+003 0.0000000e+000 0.0000000e+000
vertex 0.0000000e+000 0.0000000e+000 0.0000000e+000
vertex 1.0000000e+003 6.0000000e+002 0.0000000e+000
endloop
endfacet
facet normal 0.0000000e+000 0.0000000e+000 -1.0000000e+000
outer loop
vertex 0.0000000e+000 0.0000000e+000 0.0000000e+000
vertex 0.0000000e+000 6.0000000e+002 0.0000000e+000
vertex 1.0000000e+003 6.0000000e+002 0.0000000e+000
endloop
endfacet
facet normal -1.0000000e+000 0.0000000e+000 0.0000000e+000
outer loop
vertex 0.0000000e+000 6.0000000e+002 6.0000000e+002
vertex 0.0000000e+000 6.0000000e+002 0.0000000e+000
vertex 0.0000000e+000 0.0000000e+000 6.0000000e+002
endloop
endfacet
facet normal -1.0000000e+000 0.0000000e+000 0.0000000e+000
outer loop
vertex 0.0000000e+000 6.0000000e+002 0.0000000e+000
vertex 0.0000000e+000 0.0000000e+000 0.0000000e+000
vertex 0.0000000e+000 0.0000000e+000 6.0000000e+002
endloop
endfacet
facet normal 1.0000000e+000 0.0000000e+000 0.0000000e+000
outer loop
vertex 1.0000000e+003 0.0000000e+000 6.0000000e+002
vertex 1.0000000e+003 0.0000000e+000 0.0000000e+000
vertex 1.0000000e+003 6.0000000e+002 6.0000000e+002
endloop
endfacet
facet normal 1.0000000e+000 0.0000000e+000 0.0000000e+000
outer loop
vertex 1.0000000e+003 0.0000000e+000 0.0000000e+000
vertex 1.0000000e+003 6.0000000e+002 0.0000000e+000
vertex 1.0000000e+003 6.0000000e+002 6.0000000e+002
endloop
endfacet
facet normal 1.9611614e-001 0.0000000e+000 9.8058068e-001
outer loop
vertex 5.0000000e+002 0.0000000e+000 7.0000000e+002
vertex 1.0000000e+003 0.0000000e+000 6.0000000e+002
vertex 5.0000000e+002 6.0000000e+002 7.0000000e+002
endloop
endfacet
facet normal 1.9611614e-001 0.0000000e+000 9.8058068e-001
outer loop
vertex 1.0000000e+003 0.0000000e+000 6.0000000e+002
vertex 1.0000000e+003 6.0000000e+002 6.0000000e+002
vertex 5.0000000e+002 6.0000000e+002 7.0000000e+002
endloop
endfacet
facet normal -1.9611614e-001 0.0000000e+000 9.8058068e-001
outer loop
vertex 0.0000000e+000 0.0000000e+000 6.0000000e+002
vertex 5.0000000e+002 0.0000000e+000 7.0000000e+002
vertex 0.0000000e+000 6.0000000e+002 6.0000000e+002
endloop
endfacet
facet normal -1.9611614e-001 0.0000000e+000 9.8058068e-001
outer loop
vertex 5.0000000e+002 0.0000000e+000 7.0000000e+002
vertex 5.0000000e+002 6.0000000e+002 7.0000000e+002
vertex 0.0000000e+000 6.0000000e+002 6.0000000e+002
endloop
endfacet
facet normal 0.0000000e+000 -1.0000000e+000 0.0000000e+000
outer loop
vertex 0.0000000e+000 0.0000000e+000 6.0000000e+002
vertex 0.0000000e+000 0.0000000e+000 0.0000000e+000
vertex 5.0000000e+002 0.0000000e+000 7.0000000e+002
endloop
endfacet
facet normal 0.0000000e+000 -1.0000000e+000 0.0000000e+000
outer loop
vertex 0.0000000e+000 0.0000000e+000 0.0000000e+000
vertex 1.0000000e+003 0.0000000e+000 0.0000000e+000
vertex 5.0000000e+002 0.0000000e+000 7.0000000e+002
endloop
endfacet
facet normal 0.0000000e+000 -1.0000000e+000 0.0000000e+000
outer loop
vertex 1.0000000e+003 0.0000000e+000 0.0000000e+000
vertex 1.0000000e+003 0.0000000e+000 6.0000000e+002
vertex 5.0000000e+002 0.0000000e+000 7.0000000e+002
endloop
endfacet
facet normal 0.0000000e+000 1.0000000e+000 0.0000000e+000
outer loop
vertex 0.0000000e+000 6.0000000e+002 6.0000000e+002
vertex 5.0000000e+002 6.0000000e+002 7.0000000e+002
vertex 0.0000000e+000 6.0000000e+002 0.0000000e+000
endloop
endfacet
facet normal 0.0000000e+000 1.0000000e+000 0.0000000e+000
outer loop
vertex 1.0000000e+003 6.0000000e+002 6.0000000e+002
vertex 1.0000000e+003 6.0000000e+002 0.0000000e+000
vertex 5.0000000e+002 6.0000000e+002 7.0000000e+002
endloop
endfacet
facet normal 0.0000000e+000 1.0000000e+000 0.0000000e+000
outer loop
vertex 1.0000000e+003 6.0000000e+002 0.0000000e+000
vertex 0.0000000e+000 6.0000000e+002 0.0000000e+000
vertex 5.0000000e+002 6.0000000e+002 7.0000000e+002
endloop
endfacet
endsolid AutoCAD

...全文
370 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
caocheng8230 2008-05-01
  • 打赏
  • 举报
回复
最好学用一下正则表达式,能够很容易地将数据进行提取,代码量会小很多
carylin 2008-04-21
  • 打赏
  • 举报
回复
关键是要分析你的.STL文件格式,找出其规律,剩下的就不难了。用C++实现的话去看看文件操作吧,其fstream封装得比C好用。
herman~~ 2008-04-19
  • 打赏
  • 举报
回复
mark
solo_coder 2008-04-19
  • 打赏
  • 举报
回复
最好用类的成员函数来实现读取,翻译数据的功能。

多提供接口,少暴露数据给外部
ryfdizuo 2008-04-19
  • 打赏
  • 举报
回复
  0.0000000000    0.0000000000   -1.0000000000
1000.0000000000 0.0000000000 0.0000000000
0.0000000000 0.0000000000 0.0000000000
1000.0000000000 600.0000000000 0.0000000000
0.0000000000 0.0000000000 -1.0000000000
0.0000000000 0.0000000000 0.0000000000
0.0000000000 600.0000000000 0.0000000000
1000.0000000000 600.0000000000 0.0000000000
-1.0000000000 0.0000000000 0.0000000000
0.0000000000 600.0000000000 600.0000000000
0.0000000000 600.0000000000 0.0000000000
0.0000000000 0.0000000000 600.0000000000
-1.0000000000 0.0000000000 0.0000000000
0.0000000000 600.0000000000 0.0000000000
0.0000000000 0.0000000000 0.0000000000
0.0000000000 0.0000000000 600.0000000000
1.0000000000 0.0000000000 0.0000000000
1000.0000000000 0.0000000000 600.0000000000
1000.0000000000 0.0000000000 0.0000000000
1000.0000000000 600.0000000000 600.0000000000
1.0000000000 0.0000000000 0.0000000000
1000.0000000000 0.0000000000 0.0000000000
1000.0000000000 600.0000000000 0.0000000000
1000.0000000000 600.0000000000 600.0000000000
0.1961161400 0.0000000000 0.9805806800
500.0000000000 0.0000000000 700.0000000000
1000.0000000000 0.0000000000 600.0000000000
500.0000000000 600.0000000000 700.0000000000
0.1961161400 0.0000000000 0.9805806800
1000.0000000000 0.0000000000 600.0000000000
1000.0000000000 600.0000000000 600.0000000000
500.0000000000 600.0000000000 700.0000000000
-0.1961161400 0.0000000000 0.9805806800
0.0000000000 0.0000000000 600.0000000000
500.0000000000 0.0000000000 700.0000000000
0.0000000000 600.0000000000 600.0000000000
-0.1961161400 0.0000000000 0.9805806800
500.0000000000 0.0000000000 700.0000000000
500.0000000000 600.0000000000 700.0000000000
0.0000000000 600.0000000000 600.0000000000
0.0000000000 -1.0000000000 0.0000000000
0.0000000000 0.0000000000 600.0000000000
0.0000000000 0.0000000000 0.0000000000
500.0000000000 0.0000000000 700.0000000000
0.0000000000 -1.0000000000 0.0000000000
0.0000000000 0.0000000000 0.0000000000
1000.0000000000 0.0000000000 0.0000000000
500.0000000000 0.0000000000 700.0000000000
0.0000000000 -1.0000000000 0.0000000000
1000.0000000000 0.0000000000 0.0000000000
1000.0000000000 0.0000000000 600.0000000000
500.0000000000 0.0000000000 700.0000000000
0.0000000000 1.0000000000 0.0000000000
0.0000000000 600.0000000000 600.0000000000
500.0000000000 600.0000000000 700.0000000000
0.0000000000 600.0000000000 0.0000000000
0.0000000000 1.0000000000 0.0000000000
1000.0000000000 600.0000000000 600.0000000000
1000.0000000000 600.0000000000 0.0000000000
500.0000000000 600.0000000000 700.0000000000
0.0000000000 1.0000000000 0.0000000000
1000.0000000000 600.0000000000 0.0000000000
0.0000000000 600.0000000000 0.0000000000
500.0000000000 600.0000000000 700.0000000000
请按任意键继续. . .
ryfdizuo 2008-04-19
  • 打赏
  • 举报
回复

#include<iostream>
#include <iterator>
#include <fstream>
#include<string>
using namespace std;

struct FaceMsg
{
FaceMsg():m_flag(false){}

double m_Normal[3];
double m_Vertex0[3];
double m_Vertex1[3];
double m_Vertex2[3];
bool m_flag;
};
FaceMsg Data[20];

int statistics( const char *pFileName )
{
int count=0;

ifstream infile( pFileName );
if( infile.fail() ){return false;}
istream_iterator<string> bg(infile);
istream_iterator<string> ed;
for( bg; bg!=ed; ++bg )
{
if( *bg=="normal" )
{
bg++; //跳过normal

//存放法线
for(int j=0; j<3; j++, bg++)
Data[count].m_Normal[j]=atof(bg->c_str());

//跳过loop,vertex;
bg++; bg++; bg++;
for(int j=0; j<3; j++, bg++)
Data[count].m_Vertex0[j]=atof(bg->c_str());
bg++;
for(int j=0; j<3; j++, bg++)
Data[count].m_Vertex1[j]=atof(bg->c_str());
bg++;
for(int j=0; j<3; j++, bg++)
Data[count].m_Vertex2[j]=atof(bg->c_str());

count++; //面数加加
}
}
infile.close();

return count;
}

int main()
{
int count=statistics("input.txt");

for (int i=0; i<count; i++)
{
for(int j=0; j<3; j++)
printf("%14.10f\t", Data[i].m_Normal[j]);
printf("\n");
for(int j=0; j<3; j++)
printf("%14.10f\t", Data[i].m_Vertex0[j]);
printf("\n");
for(int j=0; j<3; j++)
printf("%14.10f\t", Data[i].m_Vertex1[j]);
printf("\n");
for(int j=0; j<3; j++)
printf("%14.10f\t", Data[i].m_Vertex2[j]);
printf("\n");
}
}
zhanglin03130410 2008-04-19
  • 打赏
  • 举报
回复
不懂,学习
ryfdizuo 2008-04-19
  • 打赏
  • 举报
回复
就是法线坐标,和顶点坐标吧,
herocock 2008-04-19
  • 打赏
  • 举报
回复
3楼果然牛人~
就还在研究中,谢谢了
xjy1204 2008-04-19
  • 打赏
  • 举报
回复
楼上牛人啊~

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧