[vtkusers] Question ? Save two actors in vtk or stl file

alethea alethea at anatomage.com
Mon Jan 13 11:28:58 EST 2014


Hi, the problem you are having is because the transform is saved in the
Actor, but you are saving the PolyData. vtkPolyData -> vtkMapper ->vtkActor.
(vtkAppendPolyData is just combining your vtkPolyData output from your
reader). If you actually want to have your transform update the poly data,
you should try using vtkTransformFilter
(http://www.vtk.org/Wiki/VTK/Examples/Cxx/Filtering/TransformPolyData), and
pass its output into the vtkAppendPolyData.


agatte wrote
> Hi,
> 
> 
> I load two actors, display in the same renderer, after move them (change
> position).
> I want to save actors (mesh) in vtk or stl file with position ect ..
> Now, I obtain save two mesh but I can't save new position. It was
> overlapped.
> 
> I used vtkPolyDataAppend.
> 
> I don't know, what I have to add or change.
> Could someone help me please ?
> 
> Here  my simple code :
> 
> int main(int, char *[])
> {
>   vtkSmartPointer
> <vtkRenderer>
>  renderer = vtkSmartPointer
> <vtkRenderer>
> ::New();
>  
>   vtkSmartPointer
> <vtkSTLReader>
>  readerLower = vtkSmartPointer
> <vtkSTLReader>
> ::New();
>   readerLower->SetFileName("5EZXH6__lower.stl");
>   readerLower->Update();
> 
>   vtkSmartPointer
> <vtkPolyData>
>  lowerPolyData = readerLower->GetOutput();
> 
> 
>   vtkSmartPointer
> <vtkPolyDataMapper>
>  lowerMapper = vtkSmartPointer
> <vtkPolyDataMapper>
> ::New();
>   lowerMapper->SetInput(lowerPolyData);
>   vtkSmartPointer
> <vtkActor>
>  lowerActor =  vtkSmartPointer
> <vtkActor>
> ::New();
>   lowerActor->SetMapper(lowerMapper);
>  
>   vtkSmartPointer
> <vtkSTLReader>
>  readerUpper = vtkSmartPointer
> <vtkSTLReader>
> ::New();
>   readerUpper->SetFileName("5EZXH6__upper.stl");
>   readerUpper->Update();
> 
>   vtkSmartPointer
> <vtkPolyData>
>  upperPolyData = readerUpper->GetOutput();
>  
>   vtkSmartPointer
> <vtkPolyDataMapper>
>  upperMapper =  vtkSmartPointer
> <vtkPolyDataMapper>
> ::New();
>   upperMapper->SetInput(upperPolyData);
>   vtkSmartPointer
> <vtkActor>
>  upperActor =  vtkSmartPointer
> <vtkActor>
> ::New();
>   upperActor->SetMapper(upperMapper);
>   renderer->AddActor(upperActor);
>  
>   vtkSmartPointer
> <vtkActorCollection>
>  actorCollection = vtkSmartPointer
> <vtkActorCollection>
> ::New();
>   actorCollection->AddItem(lowerActor);
>   actorCollection->InitTraversal();
>  
>   vtkSmartPointer
> <vtkTransform>
>  transform = vtkSmartPointer
> <vtkTransform>
> ::New();
>   transform->PostMultiply(); //this is the key line
>   transform->RotateZ(180.0);
>   transform->RotateX(180.0);
>   transform->Translate(0,0,35);
> 
>    for(vtkIdType i = 0; i < actorCollection->GetNumberOfItems(); i++)
>     {
>     vtkActor* actor = actorCollection->GetNextActor();
>     actor->SetUserTransform(transform);
>     renderer->AddActor(actor);
>     }
>  
>   // Create a renderer, render window, and interactor
>   vtkSmartPointer
> <vtkRenderWindow>
>  renderWindow = vtkSmartPointer
> <vtkRenderWindow>
> ::New();
>   renderWindow->AddRenderer(renderer);
>   vtkSmartPointer
> <vtkRenderWindowInteractor>
>  renderWindowInteractor = vtkSmartPointer
> <vtkRenderWindowInteractor>
> ::New();
>   renderWindowInteractor->SetRenderWindow(renderWindow);
> 
>   vtkSmartPointer
> <vtkInteractorStyleTrackballActor>
>  styleActor =  vtkSmartPointer
> <vtkInteractorStyleTrackballActor>
> ::New(); 
>   renderWindowInteractor->SetInteractorStyle( styleActor );
>   renderWindowInteractor->SetRenderWindow(renderWindow);
> 
>    // Join two actors
>   vtkSmartPointer
> <vtkAppendPolyData>
>  appender = vtkSmartPointer
> <vtkAppendPolyData>
> ::New();
>   appender->AddInputConnection(readerLower->GetOutputPort());
>   appender->AddInputConnection(readerUpper->GetOutputPort());
>   appender->Update();
> 
>   // Save as stl file
>   vtkSmartPointer
> <vtkSTLWriter>
>  writer = vtkSmartPointer
> <vtkSTLWriter>
> ::New();
>   writer->SetFileName("Actors2.stl");
>   writer->SetInput(appender->GetOutput());
>   writer->Write();
> 
>  // Save as vtk file
>   vtkSmartPointer
> <vtkPolyDataWriter>
>  writerVTK = vtkSmartPointer
> <vtkPolyDataWriter>
> ::New();
>   writerVTK->SetFileName("ActorsVTK.vtk");
>   writerVTK->SetInput(appender->GetOutput());
>   writerVTK->Write();
> 
>     // Render and interact
>   renderer->SetBackground(.2, .3, .4);
>   renderWindow->Render();
>   renderWindowInteractor->Start();
> 
>   return EXIT_SUCCESS;
> }
> 
> I would appreciate for any help please.





--
View this message in context: http://vtk.1045678.n5.nabble.com/Question-Save-two-actors-in-vtk-or-stl-file-tp5725333p5725348.html
Sent from the VTK - Users mailing list archive at Nabble.com.


More information about the vtkusers mailing list