vtkSTLWriter实现多个STL文件组合成一个STL文件输出

来源:互联网 发布:主人属下知错认罚规矩 编辑:程序博客网 时间:2024/05/01 02:06


|字号 订阅

 vtkSTLWriter* partW = vtkSTLWriter::New(); //生成一个STL输出器
 vtkAppendPolyData *apd = vtkAppendPolyData::New(); //连接多个polydata成一个polydata
 for (int i = 0;i < Files.GetCount();i++)
 { 
  vtkSTLReader *partR = vtkSTLReader::New(); 

  partR->SetFileName(Files[i]);//不断读入STL文件
  partR->Update();
  apd->AddInput(partR->GetOutput());//读入合并polydata
  partR->Delete();
 }

 vtkTriangleFilter *triangleFilter = vtkTriangleFilter::New();//三角片过滤器
 triangleFilter->SetInputConnection(apd->GetOutputPort());//导入合并后的polydata
 partW->SetInput(triangleFilter->GetOutput());//将三角化后的模型数据导入STL输出器中
 partW->SetFileName(strFName.GetBuffer(255));//设置输出文件名称
 partW->Update();
 strFName.ReleaseBuffer();
 partW->SetFileTypeToBinary(); //设置输出的STL文件为二进制类型,二进制占用更小的内存
 partW->Write();//写入文件

     通常我们要保存的零件是经过了操作者平移、旋转后的零件,而不像以上代码中仅仅对读入的STL进行简单合并得到,这就需要获取编辑完成的actor后在保存成心的STL文件,程序如下:

 vtkActorCollection* actors = m_pRender->GetActors();//m_pRender 是vtkRenderer*(渲染器)类型,显示窗口中至少有一个该类型,获得该渲染器内所有的actor链表
 int iSum = actors->GetNumberOfItems();//获得这个渲染器内拥有的actor的数量
 actors->InitTraversal();//初始化访问便利链表,这两句话不可颠倒,初始化后获得的actor总数就不对了(不知道为什么

 for (int i = 0;i < iSum;i++)
 { 
  vtkActor* pA = actors->GetNextActor();//遍历每一个actor

/*******

以这个actor是否发生平移为判断条件,发生旋转类似

*******/
  double* pPos = pA->GetPosition();
  pA->SetPosition(pPos[0],pPos[1],pPos[2]);
  if (abs(pPos[0]) < ESP && abs(pPos[1]) < ESP && abs(pPos[2]) <ESP)//没没有平移运动
  {
   vtkPolyDataMapper* pMapper = (vtkPolyDataMapper*)pA->GetMapper();
   apd->AddInput(pMapper->GetInput());
   continue;
  }

//发生了平移运动,基于VTK的管道原理,对三角片点集进行逐个点的位置平移计算
  vtkPolyDataMapper* pMapper = (vtkPolyDataMapper*)pA->GetMapper();
  vtkPolyData* pData = pMapper->GetInput();
  vtkPoints* pPoints = pData->GetPoints();
  vtkIdType iSumPts = pPoints->GetNumberOfPoints();//获得三角片点集
  for (int j = 0;j < iSumPts;j++)
  {
   double tmp[3];
   pPoints->GetPoint(j,tmp);
   for (int k = 0;k < 3;k++)
   {
    tmp[k] += pPos[k];
   }//累加移动
   pPoints->SetPoint(j,tmp);
  }
  apd->AddInput(pData);//添加改变位置了的polydata
 }

保存数据还是像前一部分一样操作。

0 0
原创粉丝点击