[vtkusers] add or copy polydata to an other

Marian Panten usted_y_yo at web.de
Mon Feb 18 05:41:55 EST 2008


Hi, 

I found the solution with the clipper. That was all my fault. But the error 

vtkAppendPolyData (03573C50): Destination not big enough.

still happening, although the output look very well and is cliped. 

Any Ideas?

Marian

> -----Ursprüngliche Nachricht-----
> Von: "Marian Panten" <usted_y_yo at web.de>
> Gesendet: 18.02.08 11:26:45
> An: vtkusers at vtk.org
> Betreff: RE: [vtkusers] add or copy polydata to an other


> 
> Hi Frederic, 
> 
> first thanks for the help. It almost works. But when i run an Update(), after i added all my polydata i get an error. 
> 
> vtkAppendPolyData (03573C50): Destination not big enough. 
> 
> I tried to do something with the allocate() method on the output ploydata but i allways get the same problem. Futhermore after clipping the data with vtkClipPolyData i only get the data from 
> clipper->GetClippedOutputPort() not clipper->GetOutputPort().
> 
> Do you you have any idea whats going on there, and how to allocate the destination???
> 
> Thx 
> Marian 
> 
> Here the code I use now, with the clipping. 
> 
>                 vtkCollectionIterator* iter = vtkCollectionIterator::New();
> 		iter->SetCollection(importerFemur->GetRenderer()->GetActors());
> 		iter->InitTraversal();
> 		vtkAppendPolyData *allInOne = vtkAppendPolyData::New();
> 		while (!iter->IsDoneWithTraversal())
> 		{
> 			vtkPolyData* tempD = (vtkPolyData*)((vtkActor*)iter->GetCurrentObject())->GetMapper()->GetInput();
> // Here i tried something with allocate.... 
> 			allInOne->AddInput(tempD);
> 			iter->GoToNextItem();
> 			tempD->Delete();
> 		}
> // Here i tried something with allocate, too 
> 		allInOne->Update(); 
> 		vtkPolyData *allMyPolyData = allInOne->GetOutput();
> 		vtkPolyDataMapper* vrmlMapper = vtkPolyDataMapper::New();
> 			vrmlMapper->SetInput(allMyPolyData);
> 		leftFemurImplantActor->SetMapper(vrmlMapper);
> 	}
> 
> 	vtkPlane* plane = vtkPlane::New();
> 		plane->SetOrigin(0,0,0);
> 		plane->SetNormal(1, 0, 0);
> 
> 	vtkClipPolyData* clipper = vtkClipPolyData::New();
> 	clipper->SetInputConnection(leftFemurImplantActor->GetMapper()->GetInputConnection(0,0));
> 		clipper->SetClipFunction(plane);
> 		clipper->GenerateClipScalarsOn();
> 		clipper->GenerateClippedOutputOn();
> 		clipper->SetValue(0);
> 		clipper->Update();
> 	//
> 	vtkPolyDataMapper* leftMapper = vtkPolyDataMapper::New();
> 		leftMapper->SetInputConnection(clipper->GetOutputPort());
> 		leftMapper->ScalarVisibilityOff();
> 	vtkPolyDataMapper* rightMapper = vtkPolyDataMapper::New();
> 		rightMapper->SetInputConnection(clipper->GetClippedOutputPort());
> 		rightMapper->ScalarVisibilityOff();
> 	
> 	leftFemurImplantActor->SetMapper(rightMapper);
> 	leftFemurImplantActor->GetProperty()->SetColor(1.0,1.0,0.0);
> 	leftFemurImplantActor->SetScale(1000);
> 	leftFemurImplantActor->GetProperty()->SetInterpolation(0);
> 
> 	rightFemurImplantActor->SetMapper(leftMapper);
> 	rightFemurImplantActor->GetProperty()->SetColor(1.0,0.0,1.0);
> 	rightFemurImplantActor->SetScale(1000);
> 	rightFemurImplantActor->GetProperty()->SetInterpolation(0);
> 
> 
> 
> 
> > -----Ursprüngliche Nachricht-----
> > Von: "Frederic Danesi" <frederic.danesi at dinccs.com>
> > Gesendet: 16.02.08 19:48:17
> > An: <vtkusers at vtk.org>
> > Betreff: RE: [vtkusers] add or copy polydata to an other
> 
> 
> > 
> > Hi, 
> > 
> > The problem is here : first->GetPolys()->InsertNextCell(tempD->GetCell(i));
> > 
> > tempD->GetCell(i) return a cell that includes pointsIds from tempD ... which
> > do not match to pointsIds in "first" ...
> > 
> > A simple way to do that is to use vtkAppendPolyData. It will do the work for
> > you ...
> > You may try something like this :
> > 
> > >         vtkCollectionIterator* iter = vtkCollectionIterator::New();
> > >         iter->SetCollection(importer->GetRenderer()->GetActors());
> > >         iter->InitTraversal();	
> > 	   vtkAppendPolyData *allInOne = vtkAppendPolyData::New();
> > >         while (!iter->IsDoneWithTraversal())
> > >         {
> > >             vtkPolyData* tempD =
> > (vtkPolyData*)((vtkActor*)iter->GetCurrentObject())->GetMapper()->GetInput()
> > ;
> > >      	 allInOne->AddInput(tempD);
> > >             iter->GoToNextItem();
> > >         }
> > 	   vtkPolyData *allMyPolyData = allInOne->GetOutput();	
> > 
> > If you really want to do it by yourself, you have to rebuild the point Ids,
> > for example by managing a correspondence table between point's Id in tempD
> > and the matching Id in firstPolyData after inserting the point...
> > 
> > Be careful, this will not merge duplicate points ...
> > 
> > Fred.
> > 
> > Cordialement,
> > F.Danesi.
> > --
> > Département DINCCS (Département Ingénierie Numérique, Conception
> > Collaborative et Simulation) 
> > MICADO / DINCCS 
> > Pole de Haute Technologie, 7 boulevard Jean Delautre (IFTS) 
> > 08000 Charleville-Mézières 
> > Tel. : 03.24.41.69.55 / 06.62.76.13.32 
> > Email : frederic.danesi at dinccs.com 
> > Web: www.afmicado.com / www.dinccs.com
> > 
> > > -----Message d'origine-----
> > > De : Marian Panten [mailto:usted_y_yo at web.de]
> > > Envoyé : samedi 16 février 2008 16:06
> > > À : vtkusers at vtk.org
> > > Objet : [vtkusers] add or copy polydata to an other
> > > 
> > > Hi,
> > > 
> > > I've got a collection of actors and am trying to copy/add the point and
> > > cell data of the collection into the polydata of the first actor. I have
> > > tried something like this.
> > > 
> > >         vtkCollectionIterator* iter = vtkCollectionIterator::New();
> > >         iter->SetCollection(importer->GetRenderer()->GetActors());
> > >         iter->InitTraversal();
> > >         vtkActor* fristActor = (vtkActor*) iter->GetCurrentObject();
> > >         vtkPolyData* firstPolyData = (vtkPolyData*)
> > > temp->GetMapper()->GetInput();
> > >         iter->GoToNextItem();
> > > 
> > >         while (!iter->IsDoneWithTraversal())
> > >         {
> > >             vtkPolyData* tempD = (vtkPolyData*)
> > > ((vtkActor*)iter->GetCurrentObject())->GetMapper()->GetInput();
> > >             vtkIdType nPts = tempD->GetPoints()->GetNumberOfPoints();
> > >             vtkIdType nCells = tempD->GetPolys()->GetNumberOfCells();
> > >             for (vtkIdType i = 0; i<nPts; i++)
> > >             {
> > > 
> > >  first->GetPoints()->InsertNextPoint(tempD->GetPoints()->GetPoint(i));
> > >             }
> > >             for (vtkIdType i = 0; i<nCells; i++)
> > >             {
> > >                 vtkIdType nCout  = first->GetPolys()->GetNumberOfCells();
> > >                 first->GetPolys()->InsertNextCell(tempD->GetCell(i));
> > >                 first->GetPolys()->UpdateCellCount(nCout+1);
> > >                 first->GetPolys()->Modified();
> > >             }
> > >             iter->GoToNextItem();
> > >         }
> > > 
> > > The adding of the points seems to work, but I've got problems with the
> > > cell data, resulting in a runtime error. I've tried a lot, but can't
> > > find a solution.
> > > Does anyone have any idea? I must say I am new in vtk and maybe I have
> > > overseen an easier way to do this. I would be very glad if someone could
> > > send me a code snippet.
> > > 
> > > Thanks a lot
> > > Marian
> > 
> > 
> > 
> > _______________________________________________
> > This is the private VTK discussion list. 
> > Please keep messages on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> > Follow this link to subscribe/unsubscribe:
> > http://www.vtk.org/mailman/listinfo/vtkusers
> > 
> 
> 
> ________________________________________________________
> Bis 50 MB Dateianhänge? Kein Problem!
> http://www.digitaledienste.web.de/freemail/club/lp/?lp=7
> 
> _______________________________________________
> This is the private VTK discussion list. 
> Please keep messages on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
> 


________________________________________________________
Bis 50 MB Dateianhänge? Kein Problem!
http://www.digitaledienste.web.de/freemail/club/lp/?lp=7




More information about the vtkusers mailing list