[vtkusers] vtkPolyDataConnectivityFilter Help

Sylvain Jaume sylvain.jaume at kitware.com
Sat Nov 26 00:01:30 EST 2005


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?
>>
>>
>



More information about the vtkusers mailing list