<div dir="ltr">Hi Bill,<div><br></div><div>Thanks for the prompt reply and the patch. I see that you have submitted a <a href="https://gitlab.kitware.com/vtk/vtk/merge_requests/2393">merge request</a> already, so looking</div><div>forward to have this fixed in the next release. In the meanwhile I'll just copy the patched vtkPointCloudFilter into</div><div>my project.</div><div><br></div><div>Cheers,</div><div>Sergey</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Jan 18, 2017 at 5:47 PM Bill Lorensen <<a href="mailto:bill.lorensen@gmail.com">bill.lorensen@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">PointCloudFilter was promoting all integral arrays to float.<br class="gmail_msg">
I am working on a patch and test.<br class="gmail_msg">
<br class="gmail_msg">
In the meantime you could apply the following changes:<br class="gmail_msg">
diff --git a/Filters/Points/vtkPointCloudFilter.cxx<br class="gmail_msg">
b/Filters/Points/vtkPointCloudFilter.cxx<br class="gmail_msg">
index d9b3b6f..63fa046 100644<br class="gmail_msg">
--- a/Filters/Points/vtkPointCloudFilter.cxx<br class="gmail_msg">
+++ b/Filters/Points/vtkPointCloudFilter.cxx<br class="gmail_msg">
@@ -48,7 +48,7 @@ struct MapPoints<br class="gmail_msg">
             vtkIdType *map, vtkPointData *inPD, vtkPointData *outPD) :<br class="gmail_msg">
     InPoints(inPts), OutPoints(outPts), PointMap(map)<br class="gmail_msg">
   {<br class="gmail_msg">
-      this->Arrays.AddArrays(numOutPts, inPD, outPD);<br class="gmail_msg">
+    this->Arrays.AddArrays(numOutPts, inPD, outPD, 0.0, false);<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
   void operator() (vtkIdType ptId, vtkIdType endPtId)<br class="gmail_msg">
@@ -97,7 +97,7 @@ struct MapOutliers<br class="gmail_msg">
               vtkIdType *map, vtkPointData *inPD, vtkPointData *outPD2) :<br class="gmail_msg">
     InPoints(inPts), OutPoints(outPts), PointMap(map)<br class="gmail_msg">
   {<br class="gmail_msg">
-      this->Arrays.AddArrays(numOutPts, inPD, outPD2);<br class="gmail_msg">
+    this->Arrays.AddArrays(numOutPts, inPD, outPD2, 0.0, false);<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
On Wed, Jan 18, 2017 at 9:50 AM, Bill Lorensen <<a href="mailto:bill.lorensen@gmail.com" class="gmail_msg" target="_blank">bill.lorensen@gmail.com</a>> wrote:<br class="gmail_msg">
> Looks like a bug. I'll take a look today.<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> On Wed, Jan 18, 2017 at 5:46 AM, Sergey Alexandrov<br class="gmail_msg">
> <<a href="mailto:alexandrov88@gmail.com" class="gmail_msg" target="_blank">alexandrov88@gmail.com</a>> wrote:<br class="gmail_msg">
>> Hey,<br class="gmail_msg">
>><br class="gmail_msg">
>> I was writing a custom point cloud filtering algorithm and came across the<br class="gmail_msg">
>> vtkPointCloudFilter class,<br class="gmail_msg">
>> which looks like a convenient base for this kind of filter. However, in my<br class="gmail_msg">
>> opinion it behaves strangely<br class="gmail_msg">
>> when it comes to the handling of data arrays bundled with the points. The<br class="gmail_msg">
>> documentation says that<br class="gmail_msg">
>> "The filter copies point attributes from input to output consistent with the<br class="gmail_msg">
>> filtering operation", and<br class="gmail_msg">
>> indeed it does, but while copying it changes the type of the attribute<br class="gmail_msg">
>> arrays, everything becomes a<br class="gmail_msg">
>> float! Here is a small example that uses vtkRadiusOutlierRemoval (derived<br class="gmail_msg">
>> from vtkPointCloudFilter).<br class="gmail_msg">
>> I create several points with an unsigned char attribute, and pass it through<br class="gmail_msg">
>> the filter.<br class="gmail_msg">
>><br class="gmail_msg">
>><br class="gmail_msg">
>> #include <iostream><br class="gmail_msg">
>><br class="gmail_msg">
>> #include <vtkPoints.h><br class="gmail_msg">
>> #include <vtkPolyData.h><br class="gmail_msg">
>> #include <vtkPointData.h><br class="gmail_msg">
>> #include <vtkSmartPointer.h><br class="gmail_msg">
>> #include <vtkUnsignedCharArray.h><br class="gmail_msg">
>> #include <vtkRadiusOutlierRemoval.h><br class="gmail_msg">
>><br class="gmail_msg">
>> int main(int argc, const char** argv)<br class="gmail_msg">
>> {<br class="gmail_msg">
>>   const double pt1[3] = { 0, 0, 0};<br class="gmail_msg">
>>   const double pt2[3] = { 1, 0, 0};<br class="gmail_msg">
>>   const double pt3[3] = { 2, 0, 0};<br class="gmail_msg">
>><br class="gmail_msg">
>>   auto points = vtkSmartPointer<vtkPoints>::New();<br class="gmail_msg">
>>   points->SetDataTypeToDouble();<br class="gmail_msg">
>>   points->InsertNextPoint(pt1);<br class="gmail_msg">
>>   points->InsertNextPoint(pt2);<br class="gmail_msg">
>>   points->InsertNextPoint(pt3);<br class="gmail_msg">
>><br class="gmail_msg">
>>   auto labels = vtkSmartPointer<vtkUnsignedCharArray>::New();<br class="gmail_msg">
>>   labels->SetName("label");<br class="gmail_msg">
>>   labels->SetNumberOfComponents(1);<br class="gmail_msg">
>>   labels->InsertNextValue(1);<br class="gmail_msg">
>>   labels->InsertNextValue(2);<br class="gmail_msg">
>>   labels->InsertNextValue(3);<br class="gmail_msg">
>><br class="gmail_msg">
>>   auto poly_data = vtkSmartPointer<vtkPolyData>::New();<br class="gmail_msg">
>>   poly_data->SetPoints(points);<br class="gmail_msg">
>>   poly_data->GetPointData()->AddArray(labels);<br class="gmail_msg">
>><br class="gmail_msg">
>>   auto outlier_removal = vtkSmartPointer<vtkRadiusOutlierRemoval>::New();<br class="gmail_msg">
>>   outlier_removal->SetInputData(poly_data);<br class="gmail_msg">
>>   outlier_removal->SetRadius(1.5);<br class="gmail_msg">
>>   outlier_removal->SetNumberOfNeighbors(2);<br class="gmail_msg">
>>   outlier_removal->Update();<br class="gmail_msg">
>><br class="gmail_msg">
>>   auto output = outlier_removal->GetOutputDataObject(0);<br class="gmail_msg">
>>   auto attributes = output->GetAttributes(0);<br class="gmail_msg">
>><br class="gmail_msg">
>>   std::cout << "Output attributes: " << attributes->GetArrayName(0) << ",<br class="gmail_msg">
>> type: " << attributes->GetArray(0)->GetDataTypeAsString() << std::endl;<br class="gmail_msg">
>><br class="gmail_msg">
>>   return 0;<br class="gmail_msg">
>> }<br class="gmail_msg">
>><br class="gmail_msg">
>><br class="gmail_msg">
>> This example prints<br class="gmail_msg">
>><br class="gmail_msg">
>>> Output attributes: label, type: float<br class="gmail_msg">
>><br class="gmail_msg">
>><br class="gmail_msg">
>> So what happens is that the "label" attribute, that was originally of type<br class="gmail_msg">
>> unsigned char, becomes a<br class="gmail_msg">
>> float attribute in the output of the filter.<br class="gmail_msg">
>><br class="gmail_msg">
>> It this behavior a bug or a feature? Or maybe I am missing a flag somewhere<br class="gmail_msg">
>> which controls this<br class="gmail_msg">
>> behavior?<br class="gmail_msg">
>><br class="gmail_msg">
>> Cheers,<br class="gmail_msg">
>> Sergey<br class="gmail_msg">
>><br class="gmail_msg">
>><br class="gmail_msg">
>><br class="gmail_msg">
>> _______________________________________________<br class="gmail_msg">
>> Powered by <a href="http://www.kitware.com" rel="noreferrer" class="gmail_msg" target="_blank">www.kitware.com</a><br class="gmail_msg">
>><br class="gmail_msg">
>> Visit other Kitware open-source projects at<br class="gmail_msg">
>> <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" class="gmail_msg" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br class="gmail_msg">
>><br class="gmail_msg">
>> Please keep messages on-topic and check the VTK FAQ at:<br class="gmail_msg">
>> <a href="http://www.vtk.org/Wiki/VTK_FAQ" rel="noreferrer" class="gmail_msg" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br class="gmail_msg">
>><br class="gmail_msg">
>> Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" rel="noreferrer" class="gmail_msg" target="_blank">http://markmail.org/search/?q=vtkusers</a><br class="gmail_msg">
>><br class="gmail_msg">
>> Follow this link to subscribe/unsubscribe:<br class="gmail_msg">
>> <a href="http://public.kitware.com/mailman/listinfo/vtkusers" rel="noreferrer" class="gmail_msg" target="_blank">http://public.kitware.com/mailman/listinfo/vtkusers</a><br class="gmail_msg">
>><br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> --<br class="gmail_msg">
> Unpaid intern in BillsBasement at noware dot com<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg">
Unpaid intern in BillsBasement at noware dot com<br class="gmail_msg">
</blockquote></div>