<div dir="ltr">Joel,<div><br></div><div><br></div><div>There is indeed some asymmetry between the management of Inputs and Outputs.</div><div><br></div><div><br></div><div>The itkSetInputMacro() is enabling us to use the expression:</div>
<div><br></div><div><br></div><div>                                          myFilter->SetRadius( 5.0 );</div><div><br></div><div><br></div><div><br></div><div>through  (itkMacro.h: line 719)</div><div><br></div><div><div>
 719 /** Set an input. This defines the Set"name"() method */</div><div> 720 #define itkSetInputMacro(name, type)                                              \</div><div> 721   virtual void Set##name(const type *_arg)                                        \</div>
<div> 722     {                                                                             \</div><div> 723     itkDebugMacro("setting input " #name " to " << _arg);                         \</div>
<div> 724     if ( _arg != static_cast< type * >( this->ProcessObject::GetInput(#name) ) )  \</div><div> 725       {                                                                           \</div><div> 726       this->ProcessObject::SetInput( #name, const_cast< type * >( _arg ) );       \</div>
<div> 727       this->Modified();                                                           \</div><div> 728       }                                                                           \</div><div> 729     }</div>
</div><div><br></div><div><br></div><div>so that we don't have to write the more verbose:</div><div><br></div><div><br></div><div>                                         myFilter->SetInput( "Radius", 5.0 );<br>
</div><div><br></div><div><br></div><div><br></div><div>That is, the macro is there, to generate expressions that </div><div>are equivalent of what we used to have before named inputs.</div><div><br></div><div><br></div><div>
For the outputs, on the other hand, ITK has:</div><div><br></div><div><br></div><div><a href="https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Core/Common/include/itkProcessObject.h#L527">https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Core/Common/include/itkProcessObject.h#L527</a><br>
</div><div><br></div><div><div>526   /** Return an output */</div><div>527   DataObject * GetOutput(const DataObjectIdentifierType & key);</div><div>528   const DataObject * GetOutput(const DataObjectIdentifierType & key) const;</div>
</div><div><br></div><div><br></div><div>So, if a filter has a named output called "Transform", we can call</div><div><br></div><div><br></div><div>              DataObject * myFilter->GetOutput("Transform");</div>
<div><br></div><div>Note that the output type has to be the generic DataObject * , because</div><div>it must match any potential output type.</div><div><br></div><div><br></div><div>While the original method GetTransform() has a different (and more</div>
<div>specific) return type, such as:</div><div><br></div><div>              TransformType * myFilter->GetTransform();</div><div><br></div><div><br></div><div>If we were to add a </div><div><br></div><div>                                  itkGetOutputMacro()</div>
<div><br></div><div>It would convert:</div><div><br></div><div><div>              DataObject * myFilter->GetOutput("Transform");</div></div><div><br></div><div>into</div><div><br></div><div><div>              DataObject * myFilter->GetTransform();</div>
</div><div><br></div><div><br></div><div>but</div><div><br></div><div>Given that in C++, the return type is not part of the signature of a function,</div><div>we couldn't have two methods with the same name and input parameters</div>
<div>but with different return types.</div><div><br></div><div>Namely:</div><div><br></div><div><div>              DataObject  *       myFilter->GetTransform();</div></div><div><div>              TransformType * myFilter->GetTransform();</div>
</div><div><br></div><div><br></div><div><br></div><div><br></div><div>   Regards,</div><div><br></div><div><br></div><div>         Luis</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Fri, Jan 10, 2014 at 9:50 AM, Joël Schaerer <span dir="ltr"><<a href="mailto:joel.schaerer@gmail.com" target="_blank">joel.schaerer@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Dear all,<br>
<br>
The addition of named inputs and outputs for ProcessObjects in ITK 4 has resulted in the addition of a few macros such as itkSetInputMacro which are responsible for exposing the new protected methods such as GetInput(name).<br>

<br>
I have found no similar macros for outputs. Why is that?<br>
<br>
Thanks!<br>
<br>
joel<br>
______________________________<u></u>_______<br>
Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at<br>
<a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/<u></u>opensource/opensource.html</a><br>
<br>
Kitware offers ITK Training Courses, for more information visit:<br>
<a href="http://www.kitware.com/products/protraining.php" target="_blank">http://www.kitware.com/<u></u>products/protraining.php</a><br>
<br>
Please keep messages on-topic and check the ITK FAQ at:<br>
<a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_<u></u>FAQ</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/<u></u>listinfo/insight-users</a><br>
</blockquote></div><br></div>