vcglib/wrap/io_trimesh/export_stl.h

84 lines
3.4 KiB
C

/****************************************************************************
* VCGLib o o *
* Visual and Computer Graphics Library o o *
* _ O _ *
* Copyright(C) 2004 \/)\/ *
* Visual Computing Lab /\/| *
* ISTI - Italian National Research Council | *
* \ *
* All rights reserved. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
* for more details. *
* *
****************************************************************************/
bool Save_STL(const char * filename , bool binary =true, const char *objectname=0)
{
FILE *fp;
fp = fopen(filename,"wb");
if(fp==0)
return false;
if(binary)
{
// Write Header
char *header="VCG ";
if(objectname) strncpy(header,objectname,80);
fwrite(header,80,1,fp);
// write number of facets
fwrite(&fn,1,sizeof(int),fp);
face_iterator fi;
Point3f p;
unsigned short attributes=0;
for(fi=face.begin(); fi!=face.end(); ++fi) if( !(*fi).IsD() )
{
// For each triangle write the normal, the three coords and a short set to zero
p.Import(vcg::NormalizedNormal((*fi).V(0)->P(), (*fi).V(1)->P(), (*fi).V(2)->P()));
fwrite(p.V(),3,sizeof(float),fp);
for(int k=0;k<3;++k){
p.Import((*fi).V(k)->P());
fwrite(p.V(),3,sizeof(float),fp);
}
fwrite(&attributes,1,sizeof(short),fp);
}
}
else
{
if(objectname) fprintf(fp,"solid %s\n",objectname);
else fprintf(fp,"solid vcg\n");
Point3f p;
face_iterator fi;
for(fi=face.begin(); fi!=face.end(); ++fi) if( !(*fi).IsD() )
{
// For each triangle write the normal, the three coords and a short set to zero
p.Import(vcg::NormalizedNormal((*fi).V(0)->P(), (*fi).V(1)->P(), (*fi).V(2)->P()));
fprintf(fp," facet normal %13e %13e %13e\n",p[0],p[1],p[2]);
fprintf(fp," outer loop\n");
for(int k=0;k<3;++k){
p.Import((*fi).V(k)->P());
fprintf(fp," vertex %13e %13e %13e\n",p[0],p[1],p[2]);
}
fprintf(fp," endloop\n");
fprintf(fp," endfacet\n");
}
fprintf(fp,"endsolid vcg\n");
}
fclose(fp);
return true;
}
//@}