<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-GB link=blue vlink=purple><div class=WordSection1><p class=MsoPlainText>Hi Matt,<o:p></o:p></p><p class=MsoPlainText>Sorry for being so persistent, but I really want to understand this, and then do it in the optimum way.<o:p></o:p></p><p class=MsoPlainText>From your advice, I’ve restructured my code (and it works) as follows:<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>The actual ITK method is templated and does not know anything about “my” image object. <o:p></o:p></p><p class=MsoPlainText>Instead it just takes the data pointers to source & destination and an array which stores the dimension-sizes. The code now reads:<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New";color:#E46C0A'>MyIMG</span><span style='font-size:8.0pt;font-family:"Courier New";color:#010001'> </span><span style='font-size:8.0pt;font-family:"Courier New";color:#E46C0A'>MyITKWrapper</span><span style='font-size:8.0pt;font-family:"Courier New"'>::<span style='color:#010001'>CurvatureFlowImageFilter</span>( </span><span style='font-size:8.0pt;font-family:"Courier New";color:#E46C0A'>MyIMG</span><span style='font-size:8.0pt;font-family:"Courier New";color:#010001'> </span><span style='font-size:8.0pt;font-family:"Courier New";color:#010001'>srcImage</span><span style='font-size:8.0pt;font-family:"Courier New"'>, <span style='color:blue'>long</span> <span style='color:#010001'>iterations</span>, <span style='color:blue'>double</span> <span style='color:#010001'>timeStep</span> )<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>{<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       <span style='color:green'>// Do stuff to get my pointers and array info<o:p></o:p></span></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       <span style='color:#010001'>octet</span> *<span style='color:#010001'>src</span> = (<span style='color:#010001'>octet</span> *)  <span style='color:#010001'>srcImage</span>.<span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>GetDataPointer()</span>; <o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       <span style='color:#010001'>octet</span> *dst = (<span style='color:#010001'>octet</span> *)  dst<span style='color:#010001'>Image</span>.<span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>GetDataPointer()</span>; <o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       long <span style='color:#010001'>srcDataType</span> = <span style='color:#010001'>srcImage.</span><span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>GetDataType()</span><span style='color:#010001'>;</span><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       <span style='color:#010001'>ulong</span> <span style='color:#010001'>dims</span>[5] = { 1, 1, 1, 1, 1 }; <o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       <span style='color:blue'>for</span> ( <span style='color:blue'>long</span> <span style='color:#010001'>d</span>=0; <span style='color:#010001'>d</span><<span style='color:#010001'>nDims</span>; <span style='color:#010001'>d</span>++ )<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              <span style='color:#010001'>dims</span>[<span style='color:#010001'>d</span>] = <span style='color:#010001'>srcImage</span>.</span><span style='font-size:8.0pt;font-family:"Courier New";color:#E46C0A'>GetSizeAlongDimension</span><span style='font-size:8.0pt;font-family:"Courier New"'>(<span style='color:#010001'>d</span>);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       <span style='color:green'>// Switch into templated code to branch depending on type & dimensionality</span><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       <span style='color:blue'>switch</span>(<span style='color:#010001'>nDims</span>)<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       <span style='color:blue'>case</span>(2):<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              <span style='color:blue'>switch</span>(<span style='color:#010001'>srcDataType</span>)<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              <span style='color:blue'>case</span>(<span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>FLOAT4DATA</span>):  { <span style='color:#010001'>CurvatureFlowImageFilter</span> <2> ( <span style='color:#010001'>iterations</span>, <span style='color:#010001'>timeStep</span>, (<span style='color:blue'>float</span> *) <span style='color:#010001'>src</span> ,  (<span style='color:blue'>float</span> *) <span style='color:#010001'>dst</span>,  <span style='color:#010001'>dims</span> );} <span style='color:blue'>break</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              <span style='color:blue'>case</span>(<span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>FLOAT8DATA</span>):  { <span style='color:#010001'>CurvatureFlowImageFilter</span> <2> ( <span style='color:#010001'>iterations</span>, <span style='color:#010001'>timeStep</span>, (<span style='color:blue'>double</span> *) <span style='color:#010001'>src</span>,  (<span style='color:blue'>double</span> *) <span style='color:#010001'>dst</span>,  <span style='color:#010001'>dims</span> );} <span style='color:blue'>break</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              <span style='color:blue'>default</span>: <span style='color:#010001'>ThrowString</span>(<span style='color:#A31515'>"Data type not supported."</span>);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              }<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              <span style='color:blue'>break</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       <span style='color:blue'>case</span>(3):<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              <span style='color:blue'>switch</span>(<span style='color:#010001'>srcDataType</span>)<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              <span style='color:blue'>case</span>(<span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>FLOAT4DATA</span>):  { <span style='color:#010001'>CurvatureFlowImageFilter</span> <3> ( <span style='color:#010001'>iterations</span>, <span style='color:#010001'>timeStep</span>, (<span style='color:blue'>float</span> *) <span style='color:#010001'>src</span> ,  (<span style='color:blue'>float</span> *) <span style='color:#010001'>dst</span>,  <span style='color:#010001'>dims</span> );} <span style='color:blue'>break</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              <span style='color:blue'>case</span>(<span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>FLOAT8DATA</span>):  { <span style='color:#010001'>CurvatureFlowImageFilter</span> <3> ( <span style='color:#010001'>iterations</span>, <span style='color:#010001'>timeStep</span>, (<span style='color:blue'>double</span> *) <span style='color:#010001'>src</span>,  (<span style='color:blue'>double</span> *) <span style='color:#010001'>dst</span>,  <span style='color:#010001'>dims</span> );} <span style='color:blue'>break</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              <span style='color:blue'>default</span>: <span style='color:#010001'>ThrowString</span>(<span style='color:#A31515'>"Data type not supported."</span>);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              }<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>              <span style='color:blue'>break</span>;<span style='color:blue'> <o:p></o:p></span></span></p><p class=MsoNormal style='text-indent:36.0pt;text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New";color:blue'>default</span><span style='font-size:8.0pt;font-family:"Courier New"'>: <span style='color:#010001'>ThrowString</span>(<span style='color:#A31515'>"Dimensionality  not supported."</span>);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       }<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>       <span style='color:blue'>return</span> <span style='color:#010001'>resultImage</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>}<o:p></o:p></span></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New";color:blue'>template</span><span style='font-size:7.0pt;font-family:"Courier New"'>< <span style='color:blue'>unsigned</span> <span style='color:blue'>int</span> <span style='color:#010001'>VDimension</span>, <span style='color:blue'>typename</span> <span style='color:#010001'>tSrc</span>, <span style='color:blue'>typename</span> <span style='color:#010001'>tDest</span> > <o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New";color:blue'>void</span><span style='font-size:7.0pt;font-family:"Courier New"'> </span><span style='font-size:8.0pt;font-family:"Courier New";color:#E46C0A'>MyITKWrapper</span><span style='font-size:7.0pt;font-family:"Courier New"'>::<span style='color:#010001'>CurvatureFlowImageFilter</span>( <span style='color:blue'>long</span> <span style='color:#010001'>iterations</span>, <span style='color:blue'>double</span> <span style='color:#010001'>timeStep</span>, <span style='color:blue'>typename</span> <span style='color:#010001'>tSrc</span> *<span style='color:#010001'>src</span>, <span style='color:blue'>typename</span> <span style='color:#010001'>tDest</span> *<span style='color:#010001'>dst</span>, <span style='color:#010001'>ulong</span> *<span style='color:#010001'>dimSizes</span> )<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'> {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:green'>// Wrap data for ITK<o:p></o:p></span></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:blue'>typedef</span> <span style='color:#010001'>itk</span>::<span style='color:#010001'>ImportImageFilter</span><<span style='color:#010001'>tSrc</span>,<span style='color:#010001'>VDimension</span>>  <span style='color:#010001'>ImportFilterType</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>ImportFilterType</span>::<span style='color:#010001'>Pointer</span> <span style='color:#010001'>importFilter</span> = <span style='color:#010001'>ImportFilterType</span>::<span style='color:#010001'>New</span>();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>ImportFilterType</span>::<span style='color:#010001'>SizeType</span>  <span style='color:#010001'>size</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>ImportFilterType</span>::<span style='color:#010001'>IndexType</span> <span style='color:#010001'>start</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>itk</span>::<span style='color:#010001'>SpacePrecisionType</span> <span style='color:#010001'>origin</span>[<span style='color:#010001'>VDimension</span>];<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>itk</span>::<span style='color:#010001'>SpacePrecisionType</span> <span style='color:#010001'>spacing</span>[<span style='color:#010001'>VDimension</span>];<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:blue'>long</span> <span style='color:#010001'>nPixels</span>=1;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:blue'>for</span> ( <span style='color:blue'>int</span> <span style='color:#010001'>dim</span> = 0; <span style='color:#010001'>dim</span><<span style='color:#010001'>VDimension</span>; <span style='color:#010001'>dim</span>++ )<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>                   <span style='color:#010001'>size</span>[<span style='color:#010001'>dim</span>] = <span style='color:#010001'>dimSizes</span>[<span style='color:#010001'>dim</span>]; <span style='color:#010001'>start</span>[<span style='color:#010001'>dim</span>] = 0; <span style='color:#010001'>origin</span>[<span style='color:#010001'>dim</span>] = 0.0;       <span style='color:#010001'>spacing</span>[<span style='color:#010001'>dim</span>] = 1.0;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>                   <span style='color:#010001'>nPixels</span> *= <span style='color:#010001'>size</span>[<span style='color:#010001'>dim</span>];<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          }<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>ImportFilterType</span>::<span style='color:#010001'>RegionType</span> <span style='color:#010001'>region</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>region</span>.<span style='color:#010001'>SetIndex</span>( <span style='color:#010001'>start</span> );<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>region</span>.<span style='color:#010001'>SetSize</span>(  <span style='color:#010001'>size</span>  );<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>importFilter</span>-><span style='color:#010001'>SetRegion</span>( <span style='color:#010001'>region</span> );<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>importFilter</span>-><span style='color:#010001'>SetOrigin</span>( <span style='color:#010001'>origin</span> );<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>importFilter</span>-><span style='color:#010001'>SetSpacing</span>( <span style='color:#010001'>spacing</span> );<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>importFilter</span>-><span style='color:#010001'>SetImportPointer</span>( <span style='color:#010001'>src</span>, <span style='color:#010001'>nPixels</span>, <span style='color:blue'>false</span> );<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:green'>// Perform ITK action<o:p></o:p></span></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:blue'>typedef</span> <span style='color:#010001'>itk</span>::<span style='color:#010001'>Image</span><<span style='color:#010001'>tSrc</span>,<span style='color:#010001'>VDimension</span>>  <span style='color:#010001'>InputImageType</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:blue'>typedef</span> <span style='color:#010001'>itk</span>::<span style='color:#010001'>Image</span><<span style='color:#010001'>tDest</span>,<span style='color:#010001'>VDimension</span>> <span style='color:#010001'>OutputImageType</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:blue'>typedef</span> <span style='color:#010001'>itk</span>::<span style='color:#010001'>CurvatureFlowImageFilter</span>< <span style='color:#010001'>InputImageType</span>, <span style='color:#010001'>OutputImageType</span> >  <span style='color:#010001'>FilterType</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>FilterType</span>::<span style='color:#010001'>Pointer</span> <span style='color:#010001'>filter</span> = <span style='color:#010001'>FilterType</span>::<span style='color:#010001'>New</span>();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>filter</span>-><span style='color:#010001'>SetInput</span>( <span style='color:#010001'>importFilter</span>-><span style='color:#010001'>GetOutput</span>() );<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>filter</span>-><span style='color:#010001'>SetTimeStep</span>( <span style='color:#010001'>timeStep</span> );<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>filter</span>-><span style='color:#010001'>SetNumberOfIterations</span>( <span style='color:#010001'>iterations</span> );<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>filter</span>-><span style='color:#010001'>Update</span>();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:green'>//Write back the data<o:p></o:p></span></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:blue'>typedef</span> <span style='color:#010001'>itk</span>::<span style='color:#010001'>ImageRegionIterator</span>< <span style='color:#010001'>OutputImageType</span> >       <span style='color:#010001'>IteratorType</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>OutputImageType</span>::<span style='color:#010001'>Pointer</span> <span style='color:#010001'>filtered</span> = <span style='color:#010001'>filter</span>-><span style='color:#010001'>GetOutput</span>();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:#010001'>IteratorType</span> <span style='color:#010001'>iterator</span>( <span style='color:#010001'>filtered</span>, <span style='color:#010001'>filtered</span>-><span style='color:#010001'>GetRequestedRegion</span>() );<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          <span style='color:blue'>for</span> ( <span style='color:#010001'>iterator</span>.<span style='color:#010001'>GoToBegin</span>(); !<span style='color:#010001'>iterator</span>.<span style='color:#010001'>IsAtEnd</span>(); ++<span style='color:#010001'>iterator</span> )<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>                   *<span style='color:#010001'>dst</span> = (<span style='color:#010001'>tDest</span>) <span style='color:#010001'>iterator</span>.<span style='color:#010001'>Get</span>();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>                   <span style='color:#010001'>dst</span>++;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;font-family:"Courier New"'>          }<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:7.0pt;font-family:"Courier New"'> }</span><span style='font-size:8.0pt'><o:p></o:p></span></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Now, as said this works, but if you look into the CurvatureFlowImageFilter method, only the 8 lines in the “<span style='font-size:7.0pt;font-family:"Courier New";color:green'>Perform ITK action</span> “ section are actually specific to this filter.  As I want to wrap around a lot (ideally all) itk functionality: Is there really no better way to abstract the ‘wrapping’ ? <o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Do I really have to copy&paste the “<span style='font-size:7.0pt;font-family:"Courier New";color:green'>Wrap data for ITK</span>” and “<span style='font-size:7.0pt;font-family:"Courier New";color:green'>Write back the data</span>” sections into each and every filter I want to wrap around?<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText> <o:p></o:p></p><p class=MsoPlainText>Thanks,<o:p></o:p></p><p class=MsoPlainText>  Bernhard<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><span lang=EN-US style='mso-fareast-language:EN-GB'>-----Original Message-----<br>From: Matt McCormick [mailto:matt.mccormick@kitware.com] <br>Sent: 03 November 2014 16:51<br>To: Dr Bernhard Schaffer<br>Cc: community@itk.org<br>Subject: Re: [ITK] templating typdef question</span></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Hi Bernhard,<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> The (dimension) template class wrapping around my own image object <o:p></o:p></p><p class=MsoPlainText>> MyIMG and one of the functions I want to use the wrapper in:<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> ( Methods are static methods of my class. My own stuff is marked in <o:p></o:p></p><p class=MsoPlainText>> orange below. (Do emails in this list preserve formatting?) )<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Yes, looks very readable -- thank you.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> void MyITKWrapper::SomeCoolITKMethod( MyIMG img )<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> {<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        switch ( img.GetDimensionality() )<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        {<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>               case( 2 ):    MyITKWrapper::WrapScalarImage < 2 >( img );<o:p></o:p></p><p class=MsoPlainText>> break;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>               case( 3 ):    MyITKWrapper::WrapScalarImage < 3 >( img );<o:p></o:p></p><p class=MsoPlainText>> break;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        }<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> }<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> template< unsigned int VDimension ><o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> void MyITKWrapper::WrapScalarImage( MyIMG img )<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> {<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        typedef itk::ImportImageFilter<float,VDimension> <o:p></o:p></p><p class=MsoPlainText>> ImportFilterType;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        ImportFilterType::Pointer importFilter = <o:p></o:p></p><p class=MsoPlainText>> ImportFilterType::New();<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        ImportFilterType::SizeType  size;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        ImportFilterType::IndexType start;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        itk::SpacePrecisionType origin[VDimension];<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        itk::SpacePrecisionType spacing[VDimension];<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        long nPixels=1;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        for ( int dim = 0; dim<VDimension; dim++ )<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        {<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>               size[dim] = img.GetSizeAlongDimension(dim);<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>               nPixels *= size[dim];<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>               start[dim] = 0;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>               origin[dim] = 0.0;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>               spacing[dim] = 1.0;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        }<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        ImportFilterType::RegionType region;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        region.SetIndex( start );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        region.SetSize(  size  );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        importFilter->SetRegion( region );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        importFilter->SetOrigin( origin );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        importFilter->SetSpacing( spacing );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        float *localBuffer = (float *) img.GetArrayPointer();<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        const bool importImageFilterWillOwnTheBuffer = false;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        importFilter->SetImportPointer( localBuffer, nPixels, <o:p></o:p></p><p class=MsoPlainText>> importImageFilterWillOwnTheBuffer );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        return;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> }<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Very nice!<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>> This compiles and is fine. The problem, of course, is, that I now want <o:p></o:p></p><p class=MsoPlainText>> to use the “importFilter” in my “SomeCoolITKMethod” method, so that I <o:p></o:p></p><p class=MsoPlainText>> can go on<o:p></o:p></p><p class=MsoPlainText>> like:<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> void MyITKWrapper::SomeCoolITKMethod( MyIMG img )<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> {<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        switch ( img.GetDimensionality() )<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        {<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>               case( 2 ):    importFilter = MyITKWrapper::WrapDMScalarImage <<o:p></o:p></p><p class=MsoPlainText>> 2 >( img );  break;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>               case( 3 ):    importFilter = MyITKWrapper::WrapDMScalarImage <<o:p></o:p></p><p class=MsoPlainText>> 3 >( img );  break;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        }<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        otherCoolITKFilter->SetInput( importFilter->GetOutput() );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>>        […]<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> a lot more stuff<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> […]<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> }<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> …but I don’t know how I can “define” importFilter generically in this <o:p></o:p></p><p class=MsoPlainText>> method, and I also can’t make<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> itk::ImportImageFilter<float,VDimension><o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> the return-type of my templated wrapper method.<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> Do I have to make “SomeCoolITKMethod” a template function itself and <o:p></o:p></p><p class=MsoPlainText>> have the switch-case in the method calling SomeCoolITKMethod ? Or is <o:p></o:p></p><p class=MsoPlainText>> there a better way?<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>It generally works best to put all templated code inside the template instead of moving in and out of templates.  However, if this is neally not desired, itk::ImageBase< VImageDimension >::Pointer or itk::DataObject::Pointer can be returned, which are base classes that do not have the template parameters.  They would then have to be downcast when you need to operate on the specific type.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>HTH,<o:p></o:p></p><p class=MsoPlainText>Matt<o:p></o:p></p></div></body></html>