<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>I´m afraid I still don't quite get it.<o:p></o:p></p><p class=MsoPlainText>I think I've understood the concept of the template and the switch-cases from the example you've given [1],<o:p></o:p></p><p class=MsoPlainText>but that example code does not seem to 'return' the final image in any way, and that's where I'm stuck at the moment.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Leaving different types aside and just looking into dimensionality, I now basically have the following working:<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 MyIMG and one of the functions I want to use the wrapper in:<o:p></o:p></p><p class=MsoPlainText>( Methods are static methods of my class. My own stuff is marked in <span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>orange </span>below. (Do emails in this list preserve formatting?) )<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:#010001'>void</span><span style='font-size:8.0pt;font-family:"Courier New"'> <span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>MyITKWrapper</span>::<span style='color:#010001'>SomeCoolITKMethod(</span><span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'> MyIMG</span><span style='color:#010001'> img </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'>switch</span> ( <span style='color:#010001'>img</span>.<span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>GetDimensionality</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 ): <span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>MyITKWrapper</span>::<span style='color:#010001'>WrapScalarImage</span> < 2 >( <span style='color:#010001'>img</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>( 3 ): <span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>MyITKWrapper</span>::<span style='color:#010001'>WrapScalarImage</span> < 3 >( img ); <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"'> }<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:8.0pt;font-family:"Courier New"'>}</span><span style='font-size:9.0pt'><o:p></o:p></span></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:blue'>template</span><span style='font-size:8.0pt;font-family:"Courier New"'>< <span style='color:blue'>unsigned</span> <span style='color:blue'>int</span> <span style='color:#010001'>VDimension</span> ><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New";color:blue'>void</span><span style='font-size:8.0pt;font-family:"Courier New"'> <span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>MyITKWrapper</span>::<span style='color:#010001'>WrapScalarImage</span>( <span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>MyIMG</span><span style='color:#010001'> img</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'>typedef</span> <span style='color:#010001'>itk</span>::<span style='color:#010001'>ImportImageFilter</span><<span style='color:blue'>float</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:8.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: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'>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:8.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:8.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:8.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:8.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:8.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: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'>size</span>[<span style='color:#010001'>dim</span>] = <span style='color:#010001'>img</span>.<span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>GetSizeAlongDimension</span>(<span style='color:#010001'>dim</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'>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:8.0pt;font-family:"Courier New"'> <span style='color:#010001'>start</span>[<span style='color:#010001'>dim</span>] = 0;<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'>origin</span>[<span style='color:#010001'>dim</span>] = 0.0;<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'>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: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:#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:8.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:8.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:8.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:8.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:8.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: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'>float</span> *<span style='color:#010001'>localBuffer</span> = (<span style='color:blue'>float</span> *) <span style='color:#010001'>img</span>.<span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>GetArrayPointer</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"'> <span style='color:blue'>const</span> <span style='color:blue'>bool</span> <span style='color:#010001'>importImageFilterWillOwnTheBuffer</span> = <span style='color:blue'>false</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'>importFilter</span>-><span style='color:#010001'>SetImportPointer</span>( <span style='color:#010001'>localBuffer</span>, <span style='color:#010001'>nPixels</span>, <span style='color:#010001'>importImageFilterWillOwnTheBuffer</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'>return</span>;<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:8.0pt;font-family:"Courier New"'>}</span><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 to use the “importFilter” in my “SomeCoolITKMethod” method, so that I can go on like:<o:p></o:p></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:8.0pt;font-family:"Courier New";color:#010001'>void</span><span style='font-size:8.0pt;font-family:"Courier New"'> <span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>MyITKWrapper</span>::<span style='color:#010001'>SomeCoolITKMethod(</span><span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'> MyIMG</span><span style='color:#010001'> img </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'>switch</span> ( <span style='color:#010001'>img</span>.<span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>GetDimensionality</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 ): importFilter = <span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>MyITKWrapper</span>::<span style='color:#010001'>WrapDMScalarImage</span> < 2 >( <span style='color:#010001'>img</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>( 3 ): importFilter = <span style='color:#E46C0A;mso-style-textfill-fill-color:#E46C0A;mso-style-textfill-fill-alpha:100.0%'>MyITKWrapper</span>::<span style='color:#010001'>WrapDMScalarImage</span> < 3 >( img ); <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"'> }<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"'> otherCoolITKFilter->SetInput( importFilter->GetOutput() );<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-indent:36.0pt;text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>a lot more stuff<o:p></o:p></span></p><p class=MsoNormal style='text-indent:36.0pt;text-autospace:none'><span style='font-size:8.0pt;font-family:"Courier New"'>[…]<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:8.0pt;font-family:"Courier New"'>}</span><span style='font-size:9.0pt'><o:p></o:p></span></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 method, and I also can’t make <o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText style='text-indent:36.0pt'><span style='font-size:8.0pt;font-family:"Courier New";color:#010001'>itk</span><span style='font-size:8.0pt;font-family:"Courier New"'>::<span style='color:#010001'>ImportImageFilter</span><<span style='color:blue'>float</span>,<span style='color:#010001'>VDimension</span>></span><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>Do I have to make “SomeCoolITKMethod” a template function itself and have the switch-case in the method calling SomeCoolITKMethod ? Or is there a better way?<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><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>[1] <a href="http://itk.org/ITKExamples/src/IO/ImageBase/ReadUnknownImageType/Documentation.html">http://itk.org/ITKExamples/src/IO/ImageBase/ReadUnknownImageType/Documentation.html</a><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: 29 October 2014 22:28<br>To: Dr Bernhard Schaffer<br>Cc: community@itk.org<br>Subject: Re: [ITK] templating typdef question</span><o:p></o:p></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>Welcome to ITK!<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>The basic strategy is to put all the templated code in a template function or class. This prevents duplicated code (the root of almost all evil). Then, use a switch statement and call the appropriate templates. An example is here [1], which is long because it switches over both a number of pixel types and dimensions, but it demonstrates the idea.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Inside the templated code, use for loops instead explicit assignment to set each dimension value. Also, use code like<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText> Image::SpacingType spacing;<o:p></o:p></p><p class=MsoPlainText> spacing.Fill( 1.0 );<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>instead of<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText> itk::SpacePrecisionType spacing[2];<o:p></o:p></p><p class=MsoPlainText> spacing[0] = 1.0;<o:p></o:p></p><p class=MsoPlainText> spacing[1] = 1.0;<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Hope this helps,<o:p></o:p></p><p class=MsoPlainText>Matt<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>[1] <a href="http://itk.org/ITKExamples/src/IO/ImageBase/ReadUnknownImageType/Documentation.html"><span style='color:windowtext;text-decoration:none'>http://itk.org/ITKExamples/src/IO/ImageBase/ReadUnknownImageType/Documentation.html</span></a><o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>On Wed, Oct 29, 2014 at 5:03 PM, Dr Bernhard Schaffer <<a href="mailto:bschaffer@superstem.org"><span style='color:windowtext;text-decoration:none'>bschaffer@superstem.org</span></a>> wrote:<o:p></o:p></p><p class=MsoPlainText>> Hi,<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> This is my second email to this list. I’m still not so familiar with <o:p></o:p></p><p class=MsoPlainText>> typedefs in coding, and I’ve the current problem:<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>> I have my own “image” objects which can be 2D or 3D and of different <o:p></o:p></p><p class=MsoPlainText>> number type. If I assume they are only 2D and float I can do something like this:<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> (The cyan lines show methods of ‘my’ object.)<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>> const unsigned int DIMENSION = 2;<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, DIMENSION > <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 = 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>> size[0] = MYIMAGE.GetXSIZE();<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> size[1] = MYIMAGE.GetYSIZE();<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::IndexType start;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> start.Fill( 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>> 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>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> const itk::SpacePrecisionType origin[ DIMENSION ] = { 0.0, 0.0 };<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>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> const itk::SpacePrecisionType spacing[ DIMENSION ] = { <o:p></o:p></p><p class=MsoPlainText>> 1.0, 1.0 };<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>> const bool importImageFilterWillOwnTheBuffer = false;<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 = MYIMAGE.GETPOINTER();<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> importFilter->SetImportPointer( localBuffer, <o:p></o:p></p><p class=MsoPlainText>> size[0]*size[1], importImageFilterWillOwnTheBuffer );<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::Image< float,DIMENSION > InputImageType;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> typedef itk::Image< float,DIMENSION > OutputImageType;<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::CurvatureFlowImageFilter< InputImageType, <o:p></o:p></p><p class=MsoPlainText>> OutputImageType > FilterType;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> FilterType::Pointer filter = FilterType::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>> filter->SetInput( importFilter->GetOutput() );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> filter->SetTimeStep( timeStep );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> filter->SetNumberOfIterations( iterations );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> filter->Update();<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> typedef itk::ImageRegionIterator< OutputImageType > <o:p></o:p></p><p class=MsoPlainText>> IteratorType;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> OutputImageType::Pointer filtered = filter->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>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> If my image is 3D I can do accordingly: (Yellow is the difference to <o:p></o:p></p><p class=MsoPlainText>> above)<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>> const unsigned int DIMENSION = 3;<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, DIMENSION > <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 = 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>> size[0] = MYIMAGE.GetXSIZE();<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> size[1] = MYIMAGE.GetYSIZE();<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> size[2] = MYIMAGE.GetZSIZE();<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::IndexType start;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> start.Fill( 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>> 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>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> const itk::SpacePrecisionType origin[ DIMENSION ] = { 0.0, 0.0, 0.0 };<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>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> const itk::SpacePrecisionType spacing[ DIMENSION ] = { <o:p></o:p></p><p class=MsoPlainText>> 1.0, 1.0,<o:p></o:p></p><p class=MsoPlainText>> 1.0 };<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>> const bool importImageFilterWillOwnTheBuffer = false;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> float *localBuffer = MYIMAGE.GETPOINTER();<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> importFilter->SetImportPointer( localBuffer, <o:p></o:p></p><p class=MsoPlainText>> size[0]*size[1]*size[2], importImageFilterWillOwnTheBuffer );<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::Image< float,DIMENSION > InputImageType;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> typedef itk::Image< float,DIMENSION > OutputImageType;<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::CurvatureFlowImageFilter< InputImageType, <o:p></o:p></p><p class=MsoPlainText>> OutputImageType > FilterType;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> FilterType::Pointer filter = FilterType::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>> filter->SetInput( importFilter->GetOutput() );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> filter->SetTimeStep( timeStep );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> filter->SetNumberOfIterations( iterations );<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> filter->Update();<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> typedef itk::ImageRegionIterator< OutputImageType > <o:p></o:p></p><p class=MsoPlainText>> IteratorType;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> OutputImageType::Pointer filtered = filter->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>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> The problem I have is the following. I can query my object about its <o:p></o:p></p><p class=MsoPlainText>> dimensionality, but I can’t do the following:<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>> const unsigned int DIMENSION = MYIMAGE.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>> because the typedefs are evaluated on compilation not on runtime. So my<o:p></o:p></p><p class=MsoPlainText>> way around this is, to actually duplicate all the code and have both <o:p></o:p></p><p class=MsoPlainText>> my examples in a switch-case:<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(MYIMAGE.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):<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>> … EXAMPLE 2D as above<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>> break;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> case(3):<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>> … EXAMPLE 3D as above<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>> 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>> Which is rather obvious code duplication. Is there a better way to do this?<o:p></o:p></p><p class=MsoPlainText>> (there has to!) The problem branches out, if I also allow the type <o:p></o:p></p><p class=MsoPlainText>> float to be specified by my object as in<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> switch(MYIMAGE.GETDATATYPE())<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(1):…float…;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> case(2):…double…;<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> case(3):…<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>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> I would very much appreciate a few lines of (pseudo-) code showing me <o:p></o:p></p><p class=MsoPlainText>> how I can do this better.<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>> Thank you very much,<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> Best regards,<o:p></o:p></p><p class=MsoPlainText>><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>><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> _______________________________________________<o:p></o:p></p><p class=MsoPlainText>> Community mailing list<o:p></o:p></p><p class=MsoPlainText>> <a href="mailto:Community@itk.org"><span style='color:windowtext;text-decoration:none'>Community@itk.org</span></a><o:p></o:p></p><p class=MsoPlainText>> <a href="http://public.kitware.com/mailman/listinfo/community"><span style='color:windowtext;text-decoration:none'>http://public.kitware.com/mailman/listinfo/community</span></a><o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>