|字号 订阅
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
}
保存数据还是像前一部分一样操作。