[vtkusers] vtkPolyDataConnectivityFilter Help

Sylvain Jaume sylvain.jaume at kitware.com
Wed Nov 30 20:33:29 EST 2005


Hi Mike,

You can add a vtkCleanPolyData in your pipeline to keep only the 
connected points in the output.

Cheers,
Sylvain

Mike Jackson wrote:

> Turns out while this works for smaller data sets ( < 50,000 points)  
> in our larger data sets (500,000 points) this chaining of clip  
> filters together does not work well. By work well, I mean it takes  
> the code 7 minutes to run. This is just with 179 distinct regions in  
> the model and about 250,000 points.
>
>  All that time is taken up looping for each particle and doing a  pair 
> of clip filters for each particle.
>  Some of the ideas I had were to generate the clipped output for one  
> of the filters and use that as the input on the next iteration in the  
> loop. That should let the loops speed up as more iterations go by  
> because there is less to filter.
>
> I thought about subclassing the clipfilter and trying to over ride  
> how the cells get clipped. This led to the discovery that the actual  
> clipping occurs in the vtkCell class. I got lost in the code trying  
> to figure that out.
>
> I Looked at vtkExtractPolyDataGeometry which again look promising but  
> I need to provide a vtkImplicitFunction to get that to work. And it  
> only works on actual xyz point coordinates, which isn't how I want to  
> "Extract" the regions.
>
>  I then saw the *MultiGroup* classes, but those did not seem  
> promising either.
>
> So then I went down the road of working from the  
> vtkPolyDataConnectivityFilter source and trying to make up a new  
> class based on that. There is a tantalizing section of code in that  
> class where a new vtkPolyData object will be created for a given  
> Region Id(s). This is pretty close to what I need but not quite. I  
> worked most of the day on the code and the closest I can come is to  
> produce the correct number of vtkPolyData Objects (179 in my current  
> Model), but all the points are copied into each PolyData object  
> (235,000).  If I post some code can some one have a look and tell me  
> what I might be doing wrong?
>
> Also, on a side note, besides the regular VTK books, are there any  
> other resources that explain the layout of the vtk Data structures?  
> Like what is a vtkCell in relation to vtkPolyData? Is that the actual  
> triangle, or is it a Hexahedral that encompasses a triangle? Stuff  
> like that?
>
> Thanks for all the help
>
> Respectfully
> Mike Jackson
>
> On Nov 26, 2005, at 12:01 AM, Sylvain Jaume wrote:
>
>> Hi Mike,
>>
>> Please replace:
>> clipInsideOut->SetInput(connections->GetOutput() );
>> with:
>> clipInsideOut->SetInput(clip->GetOutput() );
>>
>> Let me know if it works for you.
>> Cheers,
>> Sylvain
>>
>> Sylvain Jaume wrote:
>>
>>> Hi Mike,
>>>
>>> I think this code will solve your problem:
>>>
>>>  unsigned int numRegions = connections->GetNumberOfExtractedRegions ();
>>>
>>>  vtkClipPolyData *clip = vtkClipPolyData::New();
>>>  clip->SetInput(connections->GetOutput() );
>>>
>>>  vtkClipPolyData *clipInsideOut = vtkClipPolyData::New();
>>>  clipInsideOut->SetInput(connections->GetOutput() );
>>>  clipInsideOut->InsideOutOn();
>>>
>>>  for (unsigned int i = 0; i < numRegions; ++i)
>>>  {
>>>      std::cout << "----------- Region Number " << i << "    
>>> ----------" << std::endl;
>>>
>>>      clip->SetValue( (float) i - 0.5 );
>>>      clipInsideOut->SetValue( (float) i + 0.5 );
>>>      clipInsideOut->Update();
>>>
>>>      clipInsideOut->GetOutput()->PrintSelf(std::cout, 1);
>>> }
>>>
>>> Cheers,
>>> Sylvain
>>>
>>> Mike Jackson wrote:
>>>
>>>>
>>>> On Nov 23, 2005, at 6:51 PM, Sylvain Jaume wrote:
>>>>
>>>>> Hi Mike,
>>>>>
>>>>> You may want to do:
>>>>>
>>>>> vtkPolyDataConnectivityFilter *connections =    
>>>>> vtkPolyDataConnectivityFilter::New();
>>>>> connections->SetInput(data);
>>>>> connections->SetExtractionModeToAllRegions();
>>>>> connections->ColorRegionsOn();
>>>>> connections->Update();
>>>>>
>>>>>  unsigned int numRegions = connections- 
>>>>> >GetNumberOfExtractedRegions();
>>>>>  vtkClipPolyData *clip = vtkClipPolyData::New();
>>>>>  clip->SetInput(connections->GetOutput() );
>>>>>
>>>>>  for (unsigned int i = 0; i < numRegions; ++i)
>>>>>  {
>>>>>      std::cout << "----------- Region Number " << i << "    
>>>>> ----------" << std::endl;
>>>>>      clip->SetValue( (float) i );
>>>>>      clip->Update();
>>>>>      clip->GetOutput()->PrintSelf(std::cout, 1);
>>>>>  }
>>>>>
>>>>> You don't need  clip->GenerateClipScalarsOff();
>>>>>
>>>>> Cheers,
>>>>> Sylvain
>>>>>
>>>>> Mike Jackson wrote:
>>>>>
>>>>>>
>>>>>> On Nov 23, 2005, at 5:18 PM, Sylvain Jaume wrote:
>>>>>>
>>>>>>>
>>>>>>> You could set ColorRegionsOn in vtkPolyDataConnectivityFilter.
>>>>>>> Then use vtkClipPolyData with SetValue set to the region id  (i  
>>>>>>> in  your code).
>>>>>>>
>>>>>>> Cheers,
>>>>>>> Sylvain
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> I gave that a try, looking extensively at the docs and this is   
>>>>>> what I  have.
>>>>>> //Assume data is of type vtkPolyData which has been through a   
>>>>>> smoothing
>>>>>> // and a Decimation, just prior to this.
>>>>>>   vtkPolyDataConnectivityFilter *connections =    
>>>>>> vtkPolyDataConnectivityFilter::New();
>>>>>>   connections->SetInput(data);
>>>>>>   connections->SetExtractionModeToAllRegions();
>>>>>>   connections->Update();
>>>>>>
>>>>>>   /// Loop on each Region
>>>>>>   unsigned int numRegions = connections-  
>>>>>> >GetNumberOfExtractedRegions();
>>>>>>   vtkClipPolyData *clip = vtkClipPolyData::New();
>>>>>>   vtkImplicitBoolean *func = vtkImplicitBoolean::New();
>>>>>>   clip->SetInput(connections->GetOutput() );
>>>>>>   clip->SetClipFunction(func);
>>>>>>   clip->GenerateClipScalarsOff();
>>>>>>
>>>>>>   for (unsigned int i = 0; i < numRegions; ++i)
>>>>>>   {
>>>>>>       std::cout << "----------- Region Number " << i << "    
>>>>>> ----------" << std::endl;
>>>>>>       clip->SetValue( (float) i );
>>>>>>       clip->Update();
>>>>>>       clip->GetOutput()->PrintSelf(std::cout, 1);
>>>>>>   }
>>>>>>
>>>>>> When the prints go by the number of polys, vertices, cells...  
>>>>>> are  all  Zero. Any idea what I am doing wrong?
>>>>>>
>>>>>> I think I am getting confused about the implicit function and   
>>>>>> whether  or not to have GenerateClipScalarsOff or   
>>>>>> GenerateClipScalarsOn.
>>>>>> ---
>>>>>> Mike Jackson
>>>>>> mike _at_ bluequartz dot net
>>>>>>
>>>>>>
>>>>
>>>> I have been working on this problem some more today but am still   
>>>> coming up short.
>>>>
>>>> This is the code that I have now:
>>>>
>>>>   unsigned int numRegions = connections- 
>>>> >GetNumberOfExtractedRegions();
>>>>   vtkClipPolyData *clip = vtkClipPolyData::New();
>>>>   clip->SetInput(connections->GetOutput() );
>>>>   clip->InsideOutOn();
>>>>   for (unsigned int i = 0; i < 5; ++i)
>>>>   {
>>>>       std::cout << "----------- Region Number " << i << "    
>>>> ----------" << std::endl;
>>>>       clip->SetValue( (float) i );
>>>>       clip->Update();
>>>>
>>>>       clip->GetOutput()->PrintSelf(std::cout, 1);
>>>> }
>>>>
>>>> But what happens is the number of polygons just keeps growing  
>>>> with  each iteration, eventually on the last iteration, the  number 
>>>> of  polygons in the clip are the same as the number of  original 
>>>> polygons.  So I think I am just missing something, could  someone 
>>>> please fill me in?
>>>>
>>>>
>>>
>>
>
> ---
> Mike Jackson
> mike _at_ bluequartz dot net
>
>
> _______________________________________________
> 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
>



More information about the vtkusers mailing list