关于STL文件,使用C++进行读写操作

搬运自:stl格式说明和stl文件生成(ascII,binary),vs2005,文件生成后imageware读取成功(132条消息) stl格式说明和stl文件生成(ascII,binary),vs2005,文件生成后imageware读取成功_hust_xiaowei的博客-CSDN博客_ascii stlicon-default.png?t=M3K6https://blog.csdn.net/qq1987924/article/details/46632359 

class CSTL
{undefined
private:
 float *vx;
 float *vy;
 float *vz;

 int *triaV1;
 int *triaV2;
 int *triaV3;

 int m_TriaNum;
public:

 CSTL();
 ~CSTL();
public:
 bool SetStlInf(float *px,float *py,float *pz,
       int *TriaNum1,int *TriaNum2,int *TriaNum3,int TriaTotalNum);
 bool SaveStlBinary(char *pathname,char * filename);
 bool SaveStlASCII(char *pathname,char * filename);


};

 

 

 

CSTL::CSTL()
{undefined
}

CSTL::~CSTL()
{undefined
}

bool CSTL::SetStlInf(float *px, float *py, float *pz,
      int *TriaNum1, int *TriaNum2, int *TriaNum3, int TriaTotalNum)
{undefined
 bool success = false;

 vx = px;
 vy = py;
 vz = pz;

 triaV1 = TriaNum1;
 triaV2 = TriaNum2;
 triaV3 = TriaNum3;

 m_TriaNum = TriaTotalNum;
 
 success = true;
 return success;
}

bool CSTL::SaveStlASCII(char *pathname,char * filename)
{undefined
 bool suc = true;
 char *savename = new char[100];
 sprintf(savename,"%s%s.ast",pathname,filename);

 char *fileInf = new char[200];
 sprintf(fileInf,"solid %s.ast  %s",filename,"by master");

 FILE *fp = fopen(savename,"w");
 fprintf(fp,"%s\n",fileInf);
 delete []savename;

 for(int i=0;i<m_TriaNum;i++)
 {undefined
  int id= triaV1[i];
  float v1x = vx[id];
  float v1y = vy[id];
  float v1z = vz[id];
  
  id= triaV2[i];
  float v2x = vx[id];
  float v2y = vy[id];
  float v2z = vz[id];

  id= triaV3[i];
  float v3x = vx[id];
  float v3y = vy[id];
  float v3z = vz[id];

  float nx = (v1y-v3y)*(v2z-v3z)-(v1z-v3z)*(v2y-v3y);
  float ny = (v1z-v3z)*(v2x-v3x)-(v2z-v3z)*(v1x-v3x);
  float nz = (v1x-v3x)*(v2y-v3y)-(v2x-v3x)*(v1y-v3y);

  float nxyz = sqrt(nx*nx+ny*ny+nz*nz);

  fprintf(fp,"facet normal %f %f %f\n",nx/nxyz,ny/nxyz,nz/nxyz);
  fprintf(fp,"outer loop\n");
  fprintf(fp,"vertex %f %f %f\n",v1x,v1y,v1z);
  fprintf(fp,"vertex %f %f %f\n",v2x,v2y,v2z);
  fprintf(fp,"vertex %f %f %f\n",v3x,v3y,v3z);
  fprintf(fp,"endloop\n");
  fprintf(fp,"endfacet\n");

 }
 sprintf(fileInf,"endsolid %s.ast  %s",filename,"by master");
 fprintf(fp,"%s\n",fileInf);
 fclose(fp);

 delete []fileInf;
 


 return suc;
}

bool CSTL::SaveStlBinary(char *pathname,char * filename)
{undefined

 bool suc = true;
 char *savename = new char[100];
 sprintf(savename,"%s%s.stl",pathname,filename);

 char *fileInf = new char[200];
 sprintf(fileInf,"solid %s.stl  %s",filename,"by master");

 FILE *fp = fopen(savename,"wb");
 delete []savename;

 
 float* dat = new float[12];

 fwrite(fileInf,sizeof(char),80,fp);
 fwrite(&m_TriaNum,sizeof(int),1,fp);

 for(int i=0;i<m_TriaNum;i++)
 {undefined
  int id= triaV1[i];
  float v1x = vx[id];
  float v1y = vy[id];
  float v1z = vz[id];
  
  id= triaV2[i];
  float v2x = vx[id];
  float v2y = vy[id];
  float v2z = vz[id];

  id= triaV3[i];
  float v3x = vx[id];
  float v3y = vy[id];
  float v3z = vz[id];

  float nx = (v1y-v3y)*(v2z-v3z)-(v1z-v3z)*(v2y-v3y);
  float ny = (v1z-v3z)*(v2x-v3x)-(v2z-v3z)*(v1x-v3x);
  float nz = (v1x-v3x)*(v2y-v3y)-(v2x-v3x)*(v1y-v3y);

  float nxyz = sqrt(nx*nx+ny*ny+nz*nz);
  
  dat[0] = nx/nxyz;
  dat[1] = ny/nxyz;
  dat[2] = nz/nxyz;

  dat[3] = v1x;
  dat[4] = v1y;
  dat[5] = v1z;

  dat[6] = v2x;
  dat[7] = v2y;
  dat[8] = v2z;

  dat[9] = v3x;
  dat[10] = v3y;
  dat[11] = v3z;

  fwrite(dat,sizeof(float),12,fp);
  fwrite("wl",sizeof(char),2,fp);

 }

 fclose(fp);

 delete []dat;
 delete []fileInf;
 


 return suc;

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值