<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>
So, I´m really fed up with this:<br>Why does this filter link without problems :<br><br>vtkImageHorizontalAverage.h:<br>#ifndef __vtkImageHorizontalAverage_h<br>#define __vtkImageHorizontalAverage_h<br><br>// additional macro for paraview running under windows<br>//#define vtkImaging_EXPORTS<br><br>#include "vtkSimpleImageToImageFilter.h"<br><br>class VTK_IMAGING_EXPORT vtkImageHorizontalAverage: public vtkSimpleImageToImageFilter<br>{<br>public:<br>&nbsp;&nbsp;&nbsp; static vtkImageHorizontalAverage *New();<br>&nbsp;&nbsp;&nbsp; vtkTypeRevisionMacro(vtkImageHorizontalAverage,vtkSimpleImageToImageFilter);<br>//&nbsp;&nbsp;&nbsp; void PrintSelf(ostream&amp; os, vtkIndent indent);<br><br>&nbsp; &nbsp;&nbsp;&nbsp; // Set/Get the isNormalize value.<br>&nbsp; &nbsp;&nbsp;&nbsp; vtkSetMacro(Normalize,int);<br>&nbsp; &nbsp;&nbsp;&nbsp; vtkGetMacro(Normalize,int);<br>&nbsp;&nbsp;&nbsp; vtkBooleanMacro(Normalize, int);<br>&nbsp; &nbsp;&nbsp;&nbsp; <br>protected:<br>&nbsp;&nbsp;&nbsp; vtkImageHorizontalAverage();<br>&nbsp;&nbsp;&nbsp; ~vtkImageHorizontalAverage() {};<br><br>&nbsp;&nbsp;&nbsp; int Normalize;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; virtual void SimpleExecute(vtkImageData* input, vtkImageData* output);<br><br>private:<br>&nbsp;&nbsp;&nbsp; vtkImageHorizontalAverage(const vtkImageHorizontalAverage&amp;);&nbsp; // Not implemented.<br>&nbsp;&nbsp;&nbsp; void operator=(const vtkImageHorizontalAverage&amp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Not implemented.<br>};<br><br>#endif<br><br><br>vtkImageHorizontalAverage.cpp:<br>#include "vtkImageHorizontalAverage.h"<br><br>#include "vtkImageData.h"<br>#include "vtkObjectFactory.h"<br><br>vtkCxxRevisionMacro(vtkImageHorizontalAverage, "$Revision: 1.10 $");<br>vtkStandardNewMacro(vtkImageHorizontalAverage);<br><br><br>// constructor<br>vtkImageHorizontalAverage::vtkImageHorizontalAverage()<br>{<br>&nbsp;&nbsp;&nbsp; this-&gt;Normalize = 0;<br>}<br><br>// The switch statement in Execute will call this method with<br>// the appropriate input type (IT). Note that this example assumes<br>// that the output data type is the same as the input data type.<br>// This is not always the case.<br>template &lt;class IT&gt;<br>void vtkImageHorizontalAverageExecute(vtkImageHorizontalAverage *self,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;vtkImageData* input,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkImageData* output,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IT* inPtr, IT* outPtr)<br>{<br>&nbsp; &nbsp;&nbsp;&nbsp; int i,j,k,dims[3];<br>&nbsp; &nbsp;&nbsp;&nbsp; input-&gt;GetDimensions(dims);<br>&nbsp; &nbsp;&nbsp;&nbsp; if (input-&gt;GetScalarType() != output-&gt;GetScalarType())<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; vtkGenericWarningMacro(&lt;&lt; "Execute: input ScalarType, " &lt;&lt; input-&gt;GetScalarType()<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;&lt; ", must match out ScalarType " &lt;&lt; output-&gt;GetScalarType());<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; &nbsp;&nbsp;&nbsp; double *horizontal = new double[dims[0]];<br>&nbsp; &nbsp;&nbsp;&nbsp; double *horizontal_sigma = new double[dims[0]];<br>&nbsp; &nbsp;&nbsp;&nbsp; int index;<br>&nbsp; &nbsp;&nbsp;&nbsp; // compute the horizontal average<br>&nbsp;&nbsp;&nbsp; for (i=0; i&lt;dims[0]; i++) { <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; horizontal[i] = 0.0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (j=0; j&lt;dims[1]; j++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (k=0; k&lt;dims[2]; k++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; index = k*(dims[1]*dims[0]) + j*dims[0] + i;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; horizontal[i] += inPtr[index];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; horizontal[i] = horizontal[i]/(dims[1]*dims[2]);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; //subtract horizontal average<br>&nbsp;&nbsp;&nbsp; for (i=0; i&lt;dims[0]; i++) { <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (j=0; j&lt;dims[1]; j++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (k=0; k&lt;dims[2]; k++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; index = k*(dims[1]*dims[0]) + j*dims[0] + i;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; outPtr[index] = inPtr[index] - horizontal[i];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; // normalize with sigma&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; if (self-&gt;GetNormalize()) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // compute sigma<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (i=0; i&lt;dims[0]; i++) { <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; horizontal_sigma[i] = 0.0;<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (j=0; j&lt;dims[1]; j++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (k=0; k&lt;dims[2]; k++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; index = k*(dims[1]*dims[0]) + j*dims[0] + i;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; horizontal_sigma[i] += (inPtr[index])*(inPtr[index]);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; horizontal_sigma[i] /= (dims[1]*dims[2]-1);<br>&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; horizontal_sigma[i] = sqrt(horizontal_sigma[i]);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // now normalize<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (i=0; i&lt;dims[0]; i++) { <br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (j=0; j&lt;dims[1]; j++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (k=0; k&lt;dims[2]; k++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; index = k*(dims[1]*dims[0]) + j*dims[0] + i;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; outPtr[index] /= horizontal_sigma[i];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; delete [] horizontal;<br>&nbsp;&nbsp;&nbsp; delete [] horizontal_sigma;<br>}<br><br>void vtkImageHorizontalAverage::SimpleExecute(vtkImageData* input,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; vtkImageData* output)<br>{<br>&nbsp; // copy information<br>&nbsp; output-&gt;DeepCopy(input);<br><br>&nbsp; void* inPtr = input-&gt;GetScalarPointer();<br>&nbsp; void* outPtr = output-&gt;GetScalarPointer();<br><br>&nbsp; switch(output-&gt;GetScalarType())<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; // This is simple a #define for a big case list. It handles<br>&nbsp;&nbsp;&nbsp; // all data types vtk can handle.<br>&nbsp;&nbsp;&nbsp; vtkTemplateMacro5(vtkImageHorizontalAverageExecute, this, input, output, <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (VTK_TT *)(inPtr), (VTK_TT *)(outPtr));<br>&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkGenericWarningMacro("Execute: Unknown input ScalarType");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>and the other one does not???????????????????????????? (The other one - vtkHorizontalAverage - is posted in the post before)<br>Both should do the same thing, compute the horizontal average of the points of the grid, the only difference should be the data type of the input file! one is structured_points, the other one structured_grid!!!!!!<br><br>I´d be very grateful for any comments!<br>thx,<br>NH<br><br><br /><hr />Express yourself instantly with MSN Messenger! <a href='http://clk.atdmt.com/AVE/go/onm00200471ave/direct/01/' target='_new'>MSN Messenger</a></body>
</html>