<br>A solution is to define the supported transform types as global typedefs, e.g.:<br><br><span style="font-family: courier new,monospace;">typedef itk::AffineTransform&lt; double, iImgDimension &gt; AffineTransformType;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"></span><span style="font-family: courier new,monospace;">const unsigned int SpaceDimension = iImgDimension;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">const unsigned int SplineOrder = 3;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">typedef double CoordinateRepType;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">typedef itk::BSplineDeformableTransform&lt;CoordinateRepType,SpaceDimension,SplineOrder&gt; BSplineTransformType;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"></span><span style="font-family: courier new,monospace;">itk::TransformFactory&lt;BSplineTransformType&gt;::RegisterTransform();</span><br style="font-family: courier new,monospace;">
<br><br>These types can be used in main() and other functions (there can be a function for each transform type).  This is one of those functions:<br>
<br>
<span style="font-family: courier new,monospace;">BSplineTransformType::Pointer getBSplineXFM( itk::TransformFileReader::TransformListType *transforms )</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    {</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    BSplineTransformType::Pointer xfm, xfmRead;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    // Then use an STL iterator on the list of transforms and apply</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    // the proper casting of the resulting transform.</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    itk::TransformFileReader::TransformListType::const_iterator transformIt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    transformIt = --(transforms-&gt;end()); // get last transform in list</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    if( ! strcmp( (*transformIt)-&gt;GetNameOfClass(),&quot;BSplineDeformableTransform&quot;))</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">        {</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">        xfmRead = static_cast&lt;BSplineTransformType*&gt;( (*transformIt).GetPointer() );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">        xfm = dynamic_cast&lt;BSplineTransformType*&gt;( xfmRead.GetPointer() );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">        }</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    return xfm;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    }</span><br style="font-family: courier new,monospace;">
<br>
<br>This is a small snippet of the main() code that chooses which function to call:<br><br><span style="font-family: courier new,monospace;">// The transform reader is not template and therefore it returns a list<br>// of transforms. However, the reader can instantiate the appropriate<br>
// transform class while reading the file, but it is up to the user to<br>// do the appropriate cast.</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">AffineTransformType::Pointer xfmAffine;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">BSplineTransformType::Pointer xfmBspline;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">if( ! affinePath.empty() )</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  xfmAffine = getAffineXFM( transformReader-&gt;GetTransformList() );</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">if( ! bsplinePath.empty() )</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  xfmBspline = getBSplineXFM( transformReader-&gt;GetTransformList() );</span><br style="font-family: courier new,monospace;"><br>...<br><br><br>What would this look like using a factory method?  Can the factory programming style be easily gleaned from the IO classes or examples?<br>
<br>Thanks,<br>Darren<br><br><br><br><br><br><br><div class="gmail_quote">On Mon, Oct 19, 2009 at 10:48 AM, Luis Ibanez <span dir="ltr">&lt;<a href="mailto:luis.ibanez@kitware.com">luis.ibanez@kitware.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi Darren,<br>
<br>
What do you call an &quot;Unkown&quot; transform ?<br>
<br>
An ITK transform of a well defined type, but whose actual type is not currently<br>
known to the application user ?<br></blockquote><div><br><br>Yes.<br><br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
If so, then you (as a developer) will have to implement a cascade of<br>
reading attempts for all the Transform types that are supported by<br>
your application.<br>
<br>
The factory makes easier for you to register all those potential<br>
readers, and to try them in sequence.<br>
<br>
This is a similar situation to reading an image from a file without<br>
knowing in advance what is the specific  pixel type of that image.<br>
<br>
<br>
I have to admit that the resulting code is not going to be pretty....<br>
<br>
However, the only way to simplify it would be to have a predefined<br>
list of the transform that your application support, and then package<br>
the reading process into a single function.<br>
<br>
<br>
    Regards,<br>
<br>
<br>
           Luis<br>
<br>
<br>
---------------------------------------------------------------------------------------------<br>
<div><div></div><div class="h5">On Tue, Oct 13, 2009 at 6:01 PM, Darren Weber<br>
&lt;<a href="mailto:darren.weber.lists@gmail.com">darren.weber.lists@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; With regard to reading a transform file, using itk::TransformFileReader,<br>
&gt; given the example:<br>
&gt; examples/IO/TransformReadWrite.cxx<br>
&gt;<br>
&gt; This example uses the following code to register and read a known<br>
&gt; BSplineTransformType, i.e.:<br>
&gt;<br>
&gt; typedef itk::BSplineDeformableTransform&lt;double,3,5&gt; BSplineTransformType;<br>
&gt; ...<br>
&gt; itk::TransformFileReader::Pointer reader;<br>
&gt; reader = itk::TransformFileReader::New();<br>
&gt; // Some transforms (like the BSpline transform) might not be registered<br>
&gt; // with the factory so we add them manually.<br>
&gt; itk::TransformFactory&lt;BSplineTransformType&gt;::RegisterTransform();<br>
&gt; reader-&gt;SetFileName( &quot;Transforms.meta&quot; );<br>
&gt; try<br>
&gt;     {<br>
&gt;     reader-&gt;Update();<br>
&gt;     }<br>
&gt; catch( itk::ExceptionObject &amp; excp )<br>
&gt;     {<br>
&gt;     std::cerr &lt;&lt; &quot;Error while reading the transform file&quot; &lt;&lt; std::endl;<br>
&gt;     std::cerr &lt;&lt; excp &lt;&lt; std::endl;<br>
&gt;     std::cerr &lt;&lt; &quot;[FAILED]&quot; &lt;&lt; std::endl;<br>
&gt;     return EXIT_FAILURE;<br>
&gt;     }<br>
&gt;<br>
&gt;<br>
&gt; Now let&#39;s assume a transform file contains an unknown transform type.<br>
&gt;<br>
&gt; What is the role of the transform factory?  Is it required to read a<br>
&gt; transform file?  Is it possible to read a unknown transform file and<br>
&gt; register a given transform type with the transform factory after reading the<br>
&gt; file?<br>
&gt;<br>
&gt; Suppose the transform file contains a BSplineTransformType, but the<br>
&gt; parameters are unknown.  Is it possible to read this transform file?<br>
&gt;<br>
&gt; TIA and take care,<br>
&gt; Darren<br>
&gt;<br>
&gt;<br>
</div></div>&gt; _____________________________________<br>
&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;<br>
&gt; Visit other Kitware open-source projects at<br>
&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;<br>
&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;<br>
&gt; Follow this link to subscribe/unsubscribe:<br>
&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;<br>
&gt;<br>
</blockquote></div><br>