]> Creatis software - bbtk.git/blobdiff - kernel/doc/bbtkPackageDevelopersGuide/bbtkPackageDevelopersGuide.tex
*** empty log message ***
[bbtk.git] / kernel / doc / bbtkPackageDevelopersGuide / bbtkPackageDevelopersGuide.tex
index 8046e8ff0d83eca6bd2452870b7177ca63275edc..4b4e20da2bfde7655113970d7200360d7453740f 100644 (file)
@@ -2,75 +2,76 @@
 % ==========================================
 \documentclass[11pt,final,a4paper]{article}
 \input{config.tex}
-
-
-
 \begin{document}
+\bbtkGuide[Package Developers' Guide]
+\newpage
+% ==========================================
 
-\begin{center}
 
-{\Large \BBTK}
-\vspace{1cm}
 
-{\Huge User's Guide}
-\vspace{1cm}
 
-\bbtk version \bbtkVersion
-\vspace{0.5cm}
+% ==========================================
+\section{Introduction}
+% ==========================================
 
+This guide describes how to 
+create new \bbtk packages and black boxes. 
+How to use them is described in \bbtk Users' guide. 
 
-Last modified on : October 12, 2008 \\
-Generated on : \today 
-\vspace{0.5cm}
-\end{center}
-\begin{center}
-Eduardo Davila, Laurent Guigues, Jean-Pierre Roux 
-\end{center}
-\begin{center}
-CREATIS-LRMN, Centre de Recherche en Imagerie Medicale \\ CNRS UMR 5220, INSERM U620\\
-INSA Lyon\\
-Universit\'e Claude-Bernard Lyon 1
-\end{center}
-
+Any black box must be included in a \bbtk package, 
+that is in a particular shared library which can be loaded 
+dynamically by \bbtk, either in \CPP code or in \bbs scripts 
+with the commands \texttt{include} or \texttt{load}.
+The steps to create new boxes are thus to :
 
+\begin{enumerate}
+\item \textbf{Create a new package. }
+This is described in section \ref{CreatePackage}.
 
-% ==========================================
-\tableofcontents
-% ==========================================
+\item \textbf{Describe your new box.}
+You can do it either :
+\begin{itemize}
+\item In \CPP code. You will have to write the class for 
+your box, mostly using \bbtk macros.  
+\item In \xml code. 
+When configuring your project with \cmake, 
+the utility \bbfy will then generate the corresponding \CPP code. 
+\end{itemize}
 
-\listoftables
+This is described in section \ref{CreateBlackBox}.
 
-\listoffigures
+\end{enumerate}
 
 % ==========================================
-%\section*{Abstract}
-% ==========================================
-\newpage
-% ==========================================
-% ==========================================
-\vspace{0.5cm}\hrule
-%\section{Creating your own black boxes}
-%\label{bbp}
+\section{Creating a new package}
+\label{CreatePackage}
 % ==========================================
 
 % ==========================================
-\section{Steps in the creation of new black boxes}
+\subsection{Creating the file tree}
 % ==========================================
-Any black box must be included in a \bbtk package, 
-that is in a particular shared library which can be loaded 
-dynamically by \bbtk (hence applications which use \bbtkns, 
-such as the development environment,
-\bbStudions). 
-
-\begin{enumerate}
-\item \textbf{Create a new package. }
 Before defining any black box you  
 have to create a package, or more precisely  
 the source files which will allow you to generate the package 
 (compile and link the shared library) and may be install it. 
- \texttt{bbStudio} does it for you.
 
+The \bbtk command line application \bbCreatePackage 
+allows to create the basic file architecture 
+to start the development of a new black box package.
+Type \bbCreatePackage in a console to get its usage :
+\begin{verbatim}
+bbCreatePackage <package-path> <package-name> [author] [description]
+\end{verbatim}
+
+\bbStudio also offers a graphical interface to the \bbCreatePackage 
+application. 
+You can run it with the menu \texttt{Tools $>$ Create Package}. 
+
+In both cases (using the command line tool or \bbStudio interface), 
+you have to choose : 
+
+\begin{itemize}
+\item The {\bf directory} of your new package. 
 Two cases occur :
 \begin{itemize}
 \item The black boxes you want to create are based on 
@@ -78,87 +79,26 @@ a processing code (\CPP classes or \C functions) which
 is in an existing project handled by \cmake
 and you want the new package to be part of your existing project. 
 You will have to create your new package into the source tree of your 
-project. 
+project and add a \texttt{SUBDIRS} command in the \texttt{CMakeLists.txt} 
+file of the parent directory of your package.
 \item You do not have an already existing project (you want 
 to create the new boxes from scratch) or you want/are imposed  
 that the existing project remain external to the package project.
 You will have to create your new package in a new location and 
 may be include/link against existing libraries. 
 \end{itemize}
-You'll have to run the standalone application \bbCreatePackagens, that allows 
-to create the basic file architecture 
-to start the development of a new black box package.
 
-\item \textbf{Describe your new box. }
-You can do it either :
-\begin{itemize}
-\item In \CPP code. You will have to write the class for 
-your box, mostly using \bbtk macros.  
-\item In \xml code. 
-When configuring your project with \cmake, 
-the utility \bbfy will then generate the corresponding \CPP code. 
+\item The {\bf name} of your new package. 
+This name will be used to load the package in \CPP and \bbs scripts.
 \end{itemize}
 
+You must also provide the \texttt{author} list 
+and a \texttt{description} which will be used for your package documentation.
 
-
-You'll have to run the standalone application \bbCreateBlackBox allows to create the basic file architecture 
- to start the development of a new black box, that will be included in an already existing package.
-
-\end{enumerate}
-
-% ==========================================
-\section{Creating a new black box package}
-% ==========================================
-
-Run \texttt{bbStudio}.
-
-You'll get something like in fig. \ref{bb-Studio}
-
-\begin{figure}[!ht]
-\caption{\label{bb-Studio} bbStudio}
-\begin{center}
-\includegraphics[width=0.6\textwidth]{bbStudio.png}
-\end{center}
-\end{figure}
-
-Use the option \texttt{Create package} of the menu \texttt{Tools}.
-
-You will be asked to choose the directory where you want to create the package,
-then you'll get something like in fig. \ref{bbCreatePackage}. 
-
-
-\begin{figure}[!ht]
-\caption{\label{bbCreatePackage} Create Package}
-\begin{center}
-\includegraphics[width=0.6\textwidth]{bbCreatePackage.png}
-\end{center}
-\end{figure}
-
-
-That will creates the directory structure and the \texttt{cmake} 
-files necessary to build the project.
-
-You must then decide the name of your new package. 
-This name will be used to load the package by \texttt{bbStudio}.
-Fill up the form like in fig. \ref{bbFillUpPackageForm}.
-
-
-\begin{figure}[!ht]
-\caption{\label{bbFillUpPackageForm} Fill up the form}
-\begin{center}
-\includegraphics[width=0.6\textwidth]{bbFillUpPackageForm.png}
-\end{center}
-\end{figure} 
-
-Edit the file \texttt{MyPackage/CMakeLists.txt} to customize your package
-
-
-the file tree obtained is :
-
+After running \bbCreatePackage or clicking 'Run' in \bbStudio interface 
+you should get a file structure like this (Linux users can verify it with the \texttt{tree} command):
 \begin{verbatim}
->tree  myPackageFolder
-myPackageFolder
-`-- MyPackage
+    NEW_PACKAGE
     |-- CMakeLists.txt
     |-- Configure.cmake
     |-- PackageConfig.cmake.in
@@ -183,17 +123,42 @@ myPackageFolder
     |       `-- Doxyfile.txt.in
     `-- src
         `-- CMakeLists.txt
-       
-9 directories, 16 files
 \end{verbatim}
 
-The directory \texttt{MyPackage} is the directory of your new package, 
-in which you will create the files describing your black boxes.
-But first, you have to customize your new package, by editing the file 
-\texttt{CMakeLists.txt} in the \texttt{MyPackage} directory.
+You can then :
+\begin{itemize}
+\item Edit the root CMakeLists.txt file to customize your package build settings (see \ref{RootCMakeLists} below)
+
+\item Put your c++/xml boxes sources in 'src'.
+  Please use the convention : If the name of your package is Pack and the name of your box is Box then name the source files bbPackBox.\{h;cxx;xml\}.
+
+\item Put your script-defined boxes (complex boxes) in 'bbs/boxes'. 
+
+  Please use the convention : If the name of your box is 'Box' then call the file 'bbBox.bbs' to let others know that the script defines a complex black box type.
+
+\item Put your script-defined applications in 'bbs/appli'. 
+
+  Please use the convention : Do not prepend 'bb' to the files.
+
+\item Put your data in 'data'. 
+Any data put there will be installed and accessible in your scripts : 
+the package data path is provided by the box 
+\texttt{std::PrependPackageDataPath}.
+
+\item You can customize the header of your package html doc by editing the file 'doc/bbdoc/header.html.in'. You must put html code in this file (or edit it with an html editor). You can include images or links to other html pages. The images and pages must be put in the folder 'doc/bbdoc' and will be properly installed. The same way, you can link to these images or pages in your boxes descriptions without giving any path. If you create subdirs for your material then you have to install the materials yourself by editing the CMakeLists.txt and links must use paths relative to 'doc/bbdoc'.
+
+\item You can customize the main page of your doxygen doc by editing the file 'doc/doxygen/DoxyMainPage.txt.in'.
+\end{itemize}
+
+\subsection{Configuring the root \texttt{CMakeLists.txt}}
+\label{RootCMakeLists}
+
+First you must configure your new package build settings, by editing the file 
+\texttt{CMakeLists.txt} in the package root directory.
 This file contains :
 
-\begin{file}{MyPackage/CMakeLists.txt}
+\begin{file}{CMakeLists.txt}
 \small
 \begin{verbatim}
 #===========================================================================
@@ -344,28 +309,57 @@ INCLUDE(Configure.cmake)
 \end{file}
 
 The comments in the file should be easily understandable !
-You have to customize the lines which are enclosed 
-between dashed comment lines.
-In these sections, you can see some of the informations you supplied in previous step:
+In this file, 
+you can see some of the informations you supplied in previous step:
 \begin{itemize}
   \item The \textbf{name} of your package. This will be the name used to load it in \bbi. The shared library however will be called \texttt{bb}name hence on 
     \lin the object file will be called \texttt{libbb}name\texttt{.so} 
     and on \win it  will be called \texttt{bb}name\texttt{.dll}.
   \item The \textbf{author(s)} of the package. Preferably provide e-mail adresses.
-  \item A \textbf{description} of the package, which will appear in the help of your package or in its html documentation automatically generated by \bbdoc.  
+  \item A \textbf{description} of the package, which will appear in the help of your package or in its html documentation automatically generated by \bbtk.  
 \end{itemize}
 
-In these sections, you can set :
+You can additionaly set :
 \begin{itemize}
+\item The \textbf{version} of the package.
 
 \item The \textbf{libraries used} by the package : \vtk, \itk, \gdcm, \gsmis, \wx. The mecanisms to find these libraries, their sources and to link against them are automatically handled by the \cmake files installed by \bbCreatePackage. You just have to uncomment a line to use one of these libraries.
+\item The \textbf{core \bbtk packages used} by the package as \CPP libraries
+(if you need to use the black boxes of these packages in your \CPP code, 
+i.e. include some header and link with the library). 
+The mecanisms to find these libraries, 
+their sources and to link against them are automatically handled 
+by the \cmake files installed by \bbCreatePackage. 
+You just have to uncomment a line to use one of these libraries.
+
+\item The \textbf{\CPP sources} of the package : you can list each input \CPP 
+file explicitly or tell \cmake to include in the project all the \CPP files 
+of the 'src' directory (default).
+
+\item The \textbf{\xml sources} of the package : you can list each input \xml
+file explicitly or tell \cmake to include in the project all the \xml files 
+of the 'src' directory (default).
+
+\item The \textbf{boxes \bbs sources} of the package : you can list each 
+input \bbs
+file explicitly or tell \cmake to include in the project \emph{all} 
+the \bbs files of the 'bbs/boxes' directory (default, recommanded). 
+
+\item The \textbf{appli \bbs sources} of the package : 
+you can list each input \bbs
+file explicitly or tell \cmake to include in the project \emph{all} 
+the \bbs files of the 'bbs/appli' directory (default, recommanded). 
+
+\item \textbf{Additional include directories}. Set it if your package needs to include source files which are not in the package directory, typically if it depends on another library which is not one the libraries automatically handled (\vtk, \itk...) and which you did not find with the 
+\texttt{FIND\_PACKAGE} mechanism of \cmake.
+
+\item \textbf{Additional libraries} to link against. Set it if your package needs to link against another library which is not one the libraries automatically handled (\vtk, \itk...) and which you did not find with the 
+\texttt{FIND\_PACKAGE} mechanism of \cmake.
+
+\item \textbf{Additional link directories} in which to find libraries not 
+automatically handled and which you did not find with the 
+\texttt{FIND\_PACKAGE} mechanism of \cmake. 
 
-\item A \textbf{description} of the package, which will appear in the help of your package or in its html documentation automatically generated by \bbdoc.
-\item The \textbf{version} of the package.
-\item The \textbf{\xml sources} of the package : you can list each input \xml file explicitly or tell \cmake to include in the project \emph{all} the \xml files of the directory. 
-\item The \textbf{\CPP sources} of the package : you can list each input \CPP file explicitly or tell \cmake to include in the project all the \CPP files of the directory.
-\item \textbf{Additional include directories}. Set it if your package needs to include source files which are not in the package directory, typically if it depends on another library which is not one the libraries automatically handled (\vtk, \itk...).
-\item \textbf{Additional libraries} to link against. Set it if your package needs to link against another library which is not one the libraries automatically handled (\vtk, \itk...).
 \end{itemize}
 
 Of course, this is only a framework and you can add any other \cmake commands
@@ -373,60 +367,71 @@ in the file.
 
 % ==========================================
 \section{Creating a new box}
+\label{CreateBlackBox}
 % ==========================================
 
 % ==========================================
 \subsection{Principles}
 % ==========================================
 
+% ==========================================
 \subsubsection{\texttt{C++} or \texttt{XML} ?}
+% ==========================================
 There are two ways to create a new black box in an existing package :
 \begin{itemize}
 \item Write an \xml description file which will be automatically 
-translated in \CPP by the \bbfy application (recommanded).
+translated in \CPP by the \bbfy application during build (recommanded).
 \item Write the \CPP code of the box using \bbtk macros.
 \end{itemize}
 
+% ==========================================
 \subsubsection{From which \bbtk class inherit ?}
+% ==========================================
 
-Apart from this choice of the description langage to use, 
+Apart from the choice of the description langage to use, 
 there is an important choice to do concerning the implementation of the box. 
 In \CPP, a black box is nothing but a class which has the standard 
 interface of all black boxes : what's its name ? inputs ? outputs ? and so on. 
 
-
 The abstract description of this interface is done in the class 
-\texttt{bbtk::BlackBox} and is implemented in its child classes : 
+\texttt{bbtk::BlackBox} of the \bbtk library 
+and is implemented in its children classes : 
 \texttt{bbtk::AtomicBlackBox} and \texttt{bbtk::WxBlackBox} 
 \footnote{all the classes of the \bbtk library are in a \emph{namespace} 
 called \texttt{bbtk} 
 and the \CPP header of a class called \texttt{NameOfAClass} is 
 in the file called \texttt{bbtkNameOfAClass.h}}.
+
 To create a new black box, you have to inherit one of these two  
 concrete classes in order to inherit the black box interface and a 
 particular implementation of this interface. 
+
 If your black box is a \emph{Widget} black box, 
 that is a black box which has (or is) 
 a piece of a graphical interface based on the \wx library,
 then it must inherit the class \texttt{bbtk::WxBlackBox}. 
 
-Concretely, a \texttt{bbtk::WxBlackBox} is associated to
+Concretely, a \texttt{bbtk::WxBlackBox} is associated 
 a \texttt{wxWindow} and must be able to return a pointer to it. 
 If your black box is not a widget black box 
-(that is : doesn't returns a pointer to a \emph{Widget}),
- it must inherit from \texttt{bbtk::AtomicBlackBox}.\\
- It returns a \texttt{wxWidget} which can be embedded into the \texttt{wxWindow}.\\
- In particular, modal dialogs which are created and destroyed at the end of the process method of the box
-  are NOT \texttt{WxBlackBoxes}/
+(that is : doesn't returns a pointer to a \texttt{wxWindow}),
+ it must inherit from \texttt{bbtk::AtomicBlackBox}.
+NOTE : \emph{modal dialogs} 
+which are created and destroyed at the end of the process 
+method of the box are NOT \texttt{WxBlackBoxes} : 
+they do not return a \texttt{wxWindow}, 
+see the code of \texttt{wx::FileSelector} for example.
 
+% ==========================================
 \subsubsection{Inherit or encapsulate ?}
+% ==========================================
 
 Now, your black box will do something (hopefully !). 
 When you decide to write a new black box, 
 you should be in one of these three cases :
 \begin{enumerate}
 \item You already have a \texttt{C}-like function which 
-does the processing that you wish to 'blackboxify'
+does the processing that you wish to 'blackboxify' (bbfy in short).
 \item You already have a \CPP class which 
 does the processing that you wish to 'blackboxify'
 \item You start from scratch without any existing code
@@ -454,12 +459,13 @@ in a class inherited from
 the interface class (e.g. \texttt{bbtk::AtomicBlackBox}).
 In this case you have to :
 \begin{enumerate}
-\item declare it as a member of the black box, 
+\item declare an instance of the processing class 
+as a member of the black box, 
 \item instantiate it at the right time 
 (either in the constructor or in the processing method of the black box)
 \item in the processing method of the black box : 
 \begin{enumerate}
-\item set the inputs of the member procesing class with the inputs of the black box, 
+\item set the inputs of the member processing class with the inputs of the black box, 
 \item call the processing method of the encapsulated class  
 \item set the ouputs of the black box with the outputs of the encapsulated 
 class.
@@ -479,67 +485,11 @@ to the accessors of the inherited processing class,
 as well as the procesing method of the black box 
 to the processing method of the inherited processing class, 
 very much like a callback mechanism.
+%\itk and \vtk classes 
 
-\subsubsection{How to generate a Black Box skeleton}
-
-Run \texttt{bbStudio}, choose \texttt{Tools} in the menu bar, option
-\texttt{Create Black Box}.
-You will be shown something like in fig. \ref{bbCreateBlackbox} :
-
-\begin{figure}[!ht]
-\caption{\label{bbCreateBlackbox}Create Black Box}
-\begin{center}
-\includegraphics[width=0.6\textwidth]{bbCreateBackbox.png}
-\end{center}
-\end{figure}
-
-
-\subsubsection{Informations to provide}
-
-Finally, to create a new black box, you will have to give :
-\begin{enumerate}
-  \item The {\bf name} of the box
-  \item The {\bf package} to which the box belongs (can we do it automatically ? LG : think about it) 
-  \item The {\bf author}(s) of the box
-  \item A {\bf description} of the box
-
- \item Its {\bf type}, either 
-   \begin{enumerate} 
-     \item  AtomicBlackBox : a basic one, with no special I/O (\texttt{std-template})
-     \item  WxBackBox : ouputs a \texttt{wxWindow}, 
-     \item a VTK Polydata Algorithm Box descendant,    
-     \item  a VTK Image Algorithm Box descendant
-
-   \end{enumerate}
-   
-  \item The output format of the file, either a C++ file or an XML file.
-
-  %\item $[$Optional$]$ The additional {\bf include files} which are necessary for the code to compile (classes or functions declarations ...)  
-  %\item $[$Optional$]$ The other {\bf parent(s)} of the box (which must be known hence their header included)
-  %\item $[$Optional$]$ The {\bf namespace} to which the box belongs
-  %\item The box {\bf inputs} and {\bf outputs}, and for each one :
-  %\begin{enumerate}
-  %\item Its {\bf name} : the string which will identify the input or output
-  %\item Its {\bf type} : any \CPP type, either a basic type or a user defined type (class ...) but which must be known, hence the necessary files must be included.  
-  %\item Its {\bf help} : a string describing the input / output 
-  %\end{enumerate}
-%\item Its {\bf processing} code, which can be a simple callback or an arbitrary complex code
-\end{enumerate}
-
-WARNING:
-Under Linux, for reasons we shall not discuss here, you'll get an error message :
-
- \texttt{No such file or directory}
-Have a look at the console, you'll see a shell command (whose syntax is OK although there is is a lot of
-quotes),something like :
-
- \texttt{ "/usr/local/bin/bbCreateBlackBox"  "/home/jpr/Desktop/essai" MyPackage
- myVtkPolydataBlackBox VTK-PolyDataAlgorithm C++  'author1, author2'  'myVtkPolydataBlackBox description'}
-
- Just copy the command, and run it manually.
-
+% ==========================================
 \subsubsection{Input and output accessors}
+% ==========================================
 
 When you encapsulate a processing class or a C function 
 or when you write down a black box from scratch, 
@@ -582,7 +532,7 @@ For example, declaring an input called \texttt{Image}
 would generate the two accessors \texttt{bbSetInputImage} and 
 \texttt{bbGetInputImage}. 
 
-Note that 
+Note that:
 \begin{itemize}
 \item All \bbtk methods are prefixed by \texttt{bb} 
 to avoid conflicts with potential inherited methods. 
@@ -595,6 +545,44 @@ four distinct accessors are created :
 \texttt{bbGetOutputImage}).
 \end{itemize}
 
+
+% ==========================================
+\subsection{Generate the black box skeleton}
+% ==========================================
+
+The command line application \bbCreateBlackBox 
+allows to create a skeleton \CPP or \xml files for a new black box. 
+It has a rather complex usage, 
+we recommand you use the graphical interface to it 
+which is accessible with \bbStudio menu \texttt{Tools $>$ Create black box}.
+The interface looks like in fig. \ref{bbCreateBlackBox}.
+
+\begin{figure}[!ht]
+\caption{\label{bbCreateBlackBox}Create Black Box interface}
+\begin{center}
+\includegraphics[width=0.6\textwidth]{bbCreateBackBox.png}
+\end{center}
+\end{figure}
+
+You will have to give :
+\begin{enumerate}
+  \item The {\bf name} of the box
+  \item The {\bf package} to which the box belongs (can we do it automatically ? LG : think about it) 
+  \item The {\bf author}(s) of the box
+  \item A {\bf description} of the box
+
+ \item Its {\bf type}, either 
+   \begin{enumerate} 
+     \item  Basic (inherits \texttt{AtomicBlackBox}, no particular Input/Output)
+     \item  Widget (inherits \texttt{WxBlackBox}, has output 'Widget' of type 'wxWindow*')
+     \item VTK PolyDataAlgorithm (inherits \texttt{AtomicBlackBox} and a vtkPolyDataAlgorithm, has standard vtk I/O)
+     \item VTK ImageAlgorithm (inherits \texttt{AtomicBlackBox} and a vtkImageAlgorithm, has standard vtk I/O)
+
+   \end{enumerate}
+   
+  \item The output format of the file, either a C++ file or an XML file.
+\end{enumerate}
+
 % ==========================================
 \subsection{\texttt{XML} description of a box}
 % ==========================================
@@ -638,8 +626,7 @@ describing the \texttt{Add} box of the \texttt{std} package :
 The tags and their role are easily understandable.
 
 As the box is not a widget, we inherit implicitely from 
-\texttt{bbtk::AtomicBlackBox}.
-
+\texttt{bbtk::AtomicBlackBox} (the default).
 
 The only part of the file which needs a bit of explaination is 
 the body of the \texttt{process} tag, which describes the 
@@ -659,53 +646,185 @@ the code simply adds the values of the two inputs
 and sets the output \texttt{Out} with the resulting value.
 
 To describe your own black boxes in \xml code, 
-you must modify the xml file generated in previous step : 
+you must modify the xml file generated by \bbCreateBlackBox : 
 
 \begin{enumerate}
   \item Complete the description and author tags if you feel like.
-  \item add the \texttt{\#include} directives to be put in the generated \texttt{.h} file
+  \item Add the \texttt{\#include} directives to be put in the generated \texttt{.h} file
   \item Create your inputs and outputs
   \item Fill in the process tag
   \item Fill in the constructor tag
   \item Fill in the copyconstructor tag
   \item Fill in the destructor tag
-  \item Pray
 \end{enumerate}
 
-
 % ==========================================
-\subsubsection{Specific \texttt{xml} tags for \texttt{itk::ImageToImageFilter} classes bbfication}
+\subsubsection{Writting new widget boxes in \xml}
 % ==========================================
+See the example \texttt{packages/wx/src/bbwxOutputText.xml}
+
+\begin{file}{\texttt{packages/wx/src/bbwxOutputText.xml}}
+\small
+\begin{verbatim}
+<blackbox name="OutputText" widget>
+
+  <author>laurent.guigues at creatis.insa-lyon.fr</author>
+  <description>Text zone to be inserted into a window (wxStaticText)</description>
+  <category></category>
+
+  <input name="Title" type="std::string" description="Title prepended to the text"/>
+  <input name="In" type="std::string" description="Text"/>
+
+  <createwidget><PRE>
+   bbSetOutputWidget( new wxStaticText ( bbGetWxParent() , -1 , _T("") ) );
+   Process();
+  </PRE></createwidget>
+  <process><PRE>
+   std::string msg;
+    if (bbGetInputTitle()!="")
+      {
+       msg = bbGetInputTitle()+": " + bbGetInputIn();
+      }  
+    else 
+      {
+       msg = bbGetInputIn();
+      }
+   ((wxStaticText*)bbGetOutputWidget())->SetLabel( bbtk::std2wx( msg ) ); 
+  </PRE></process>
+  
+  <constructor><PRE> 
+    bbSetInputIn("");
+    bbSetInputTitle("");
+  </PRE></constructor>    
+
+
+</blackbox>
+\end{verbatim}
+\end{file}
+
+Explainations:
+\begin{itemize}
+\item The attribute \texttt{widget} of the \texttt{blackbox} tag instructs 
+\bbfy that the box inherits from \texttt{bbtk::WxBlackBox}.
+\item An output called \texttt{'Widget'} of type \texttt{wxWindow*} is 
+automatically declared (you do not have to do it).
+\item The tag \texttt{createwidget} provides the body of the method which creates the widget. At the end of this method the output \texttt{'Widget'} must 
+have been set with the newly created \texttt{wxWindow}. 
+Here we create a new \texttt{wxStaticText}.
+The parent of the widget to create MUST BE the one provided by the method 
+\texttt{bbGetWxParent()} which returns a \texttt{wxWindow*}. 
+To update the static text after creation we simply call the \texttt{Process} 
+method.
+\item The body of the \texttt{process} method simply concatenates the 
+input \texttt{'Title'} (if non empty) and the input \texttt{'In'} and 
+updates the \texttt{wxStaticText}. 
+Remark that to get it, we use the \texttt{bbGetOutputWidget()} method 
+which returns a \texttt{wxWindow*} which we cast into a 
+\texttt{wxStaticText*} to use its specific method \texttt{SetLabel}.
+\end{itemize}
+
+More complex examples can be found in the \texttt{package/wx/src} folder.
 
 % ==========================================
 \subsubsection{Specific \texttt{xml} tags for \texttt{vtkImageAlgorithm} classes bbfication by inheritance}
 % ==========================================
+If you wish to bbfy a \vtk object which is a \texttt{vtkImageAlgorithm} 
+(such as \texttt{vtkImageGaussianSmooth}, \texttt{ImageAnisotropicDiffusion3D},
+...) we recommand you do it in \xml (you can have a look at the examples 
+in the \vtk core package 'src' folder). 
+The bbfication mechanism is inheritance.
+
+You have to add the attribute \texttt{type="VTK\_ImageAlgorithm"} 
+to the \texttt{blackbox} tag :
 \begin{verbatim}
-
 <blackbox name="..." type="VTK_ImageAlgorithm">
+\end{verbatim}
+
+You have to had an include tag which includes the vtk parent header, such as :
+\begin{verbatim}
+<include> vtkImageAnisotropicDiffusion3D.h </include> 
+\end{verbatim}
 
-<vtkparent>the vtk ImageAlgorithm class it inherits from</vtkparent>
-<input  name="..."  type="double"        special="vtk parameter" description="..."/>
-<input name="..."   type="vtkImageData*" special="vtk input"    description="..."/>
+You have to add the tag \texttt{vtkparent} which gives the \vtk parent of the box, e.g.:
+\begin{verbatim}
+<vtkparent> vtkImageAnisotropicDiffusion3D </vtkparent>
+\end{verbatim}
 
-<output  name="..." type="double"        special="vtk parameter" description="..."/>
-<output name="..."  type="vtkImageData*" special="vtk output"    description="..."/>
+The \vtk algorithm input/ouput are wrapped directly using the 
+\texttt{special} attributes of the input and output tags. 
+A typical example is :
+\begin{verbatim}
+<input name="In"   type="vtkImageData*" special="vtk input" 
+       description="Input image"/>
+<output name="Out"  type="vtkImageData*" special="vtk output"    
+        description="Output image"/>
 \end{verbatim}
+The attribute \texttt{special="vtk input"} of the input 'In' definition 
+directly connects it to the input of the vtk object the box inherits. 
+No additional code is needed, the vtk object will directly receive 
+the value of this input. 
+The same mechanism hold for the output.
+
+The parameters of the vtk object which are declared using 
+\texttt{vtkSetMacro} and \texttt{vtkGetMacro} can also be directly 
+wrapped using the attribute \texttt{special="vtk parameter"} of the input tag,
+e.g. :
+\begin{verbatim}
+<input  name="DiffusionThreshold"  type="double" special="vtk parameter" 
+        description="Difference threshold that stops diffusion"/>
+\end{verbatim}
+The attribute \texttt{special="vtk parameter"} 
+of the input called \texttt{DiffusionThreshold} instructs \bbfy to 
+directly call the \texttt{SetDiffusionThreshold} and 
+\texttt{GetDiffusionThreshold} 
+methods of the vtk parent when needed. 
+
+{\bf NOTE :} 
+For this mechanism to work, 
+the name of the \bbtk input MUST be the same than the name 
+of the \vtk parent parameter. 
+
+No \texttt{process} method has to be given, 
+\bbfy generates a process body for you, which simply calls the 
+\texttt{Update()} method of the vtk parent.
+
+{\bf NOTE :}
+you can write your own \texttt{process} code which will overload 
+the default. Don't forget to call Update(). 
+See \texttt{packages/vtk/src/bbvtkConeSource.xml} for an example.
+
 % ==========================================
 \subsubsection{Specific \texttt{xml} tags for \texttt{vtkPolyDataAlgorithm} classes bbfication by inheritance}
 % ==========================================
+If you wish to bbfy a \vtk object which is a \texttt{vtkPolyDataAlgorithm} 
+(such as \texttt{vtkConeSource}, ...) 
+we recommand you do it in \xml (you can have a look at the examples 
+in the \vtk core package 'src' folder). 
+The bbfication mechanism is inheritance.
+
+You must use the same \xml tags and attributes than for wrapping a 
+\texttt{vtkImageAlgorithm} (see above) : 
+
 \begin{verbatim}
 <blackbox name="..." type="VTK_PolyDataAlgorithm">
 
 <vtkparent>the vtk Polydata class it inherits from</vtkparent>
-<input  name="..."  type="double"       special="vtk parameter" description="..."/>
-<input  name="..."  type="vtkPolyData*" special="vtk input"    description="..."/>
-
-<output  name="..." type="double"       special="vtk parameter" description="..."/>
-<output name="..."  type="vtkPolyData*" special="vtk output"    description="..."/>
+<input  name="..."  type="vtkPolyData*" special="vtk input"    
+        description="..."/>
+<output name="..."  type="vtkPolyData*" special="vtk output"    
+        description="..."/>
+<input  name="..."  type="double"       special="vtk parameter" 
+        description="..."/>
 
 \end{verbatim}
 
+% ==========================================
+\subsubsection{Specific \texttt{xml} tags for \texttt{itk::ImageToImageFilter} classes bbfication by inheritance}
+% ==========================================
+
+to be written...
+
 \newpage
 
 % ==========================================
@@ -729,15 +848,15 @@ Tag & Attributes & Condition & Multiplicity & Description
 \texttt{ITK\_ImageToImageFilter},
 \texttt{VTK\_ImageAlgorithm},
 \texttt{VTK\_PolyDataAlgorithm}\} \\\hline
-& \texttt{generic} & a) & 0-1 &
+& \texttt{generic} & a) & 0-1 & 
 Generate the generic filter (see text)\\ \hline 
-
+& \texttt{widget} & - & 1 & 
+If present then the box inherits from \texttt{WxBlackBox} 
+(\texttt{AtomicBlackBox} if absent)
+\\ \hline 
 \texttt{<description>} & - & - & 0-n &  The description of the box. Multiple occurrence are concatenated \\\hline 
 \texttt{<author>} & - & - & 0-n &  The author of the box. Multiple occurrence are concatenated \\\hline 
 \texttt{<category>} & - & - & 0-1 &  The box category (if more than one, they are separated with commas) see Tab \ref{categories}\\\hline 
-\texttt{<parentblackbox>} & - & - & 1 &  The parent black box of the box.
-In: \{\texttt{bbtk::BlackBox, bbtk::WxBlackBox, bbtk::WxContainerBlackBox}\}\\\hline 
-\texttt{<package>} & - & - & 1 &  The package of the box \\\hline 
 \texttt{<namespace>} & - & - & 0-1 &  The namespace of the box. 
 Use \texttt{bbPACKAGE}, where \texttt{PACKAGE} is the name of the package\\\hline 
 \texttt{<include>} & - & - & 0-n & Additionnal file to include 
@@ -751,8 +870,8 @@ Use \texttt{bbPACKAGE}, where \texttt{PACKAGE} is the name of the package\\\hlin
 
 \texttt{<input>} & \texttt{name} & - & 1 &  The name of the input \\\hline 
         & \texttt{type} & - & 1 &  The type of the input \\\hline 
-        & \texttt{special} & - & 0-1 & In: \{\texttt{``itk input'', 
-``vtk input'', ``itk parameter'', ``vtk parameter''}\} (see below).\\\hline 
+        & \texttt{special} & - & 0-1 & In: \{\texttt{'itk input', 
+'vtk input', 'itk parameter', 'vtk parameter'}\} (see below).\\\hline 
         & \texttt{generic\_type} & c) & 0-1 & The ``generic'' type of the input (see text). \\\hline 
 
 
@@ -768,11 +887,14 @@ Tag & Attributes & Condition & Multiplicity & Description
  \\ \hline
  \texttt{<output>} & \texttt{name} & - & 1 &  The name of the output \\\hline 
         & \texttt{type} & - & 1 &  The type of the output \\\hline 
-        & \texttt{special} & - & 0-1 & In: \{\texttt{``itk output'', 
-``vtk output''}\} (see below).\\\hline
+        & \texttt{special} & - & 0-1 & In: \{\texttt{'itk output', 
+'vtk output'}\} (see below).\\\hline
         & \texttt{generic\_type} & c) & 0-1 & The ``generic'' type  of the output (see text).\\\hline  
         & \texttt{nature} & c) & 0-1 & The ``nature'' of the output (used for automatic GUI generation).\\\hline 
 \texttt{<process>} & - & - & 0-1 & The code of the processing method of the box. Must be put between clear tags : \texttt{<PRE></PRE>} \\\hline 
+\texttt{<createwidget>} & - & d) & 0-1 & The code of the widget creation 
+method of the box. Must be put between clear tags : \texttt{<PRE></PRE>} 
+\\\hline 
 \texttt{<constructor>} & - & - & 0-1 & The code of the user Constructor of the box (may contains default initialisations). Must be put between clear tags : \texttt{<PRE></PRE>} \\\hline 
 \texttt{<copyconstructor>} & - & - & 0-1 & The code of the user Copy Constructor of the box . Must be put between clear tags : \texttt{<PRE></PRE>} \\\hline
 \texttt{<destructor>} & - & - & 0-1 & The code of the user Destructor of the box. Must be put between clear tags : \texttt{<PRE></PRE>} \\\hline
@@ -788,36 +910,37 @@ Tag & Attributes & Condition & Multiplicity & Description
 \small
 \begin{tabular}{|ll|}
 \hline
-a) & \texttt{<blackbox type == ''ITK\_ImageToImageFilter''>} \\ \hline
-b) & \texttt{<blackbox type == ''VTK\_ImageAlgorithm'' or ''VTK\_PolyDataAlgorithm''>} \\ \hline
-c) & \texttt{<blackbox type == ''ITK\_ImageToImageFilter''>} and 
+a) & \texttt{<blackbox type == 'ITK\_ImageToImageFilter'>} \\ \hline
+b) & \texttt{<blackbox type == 'VTK\_ImageAlgorithm' or 'VTK\_PolyDataAlgorithm'>} \\ \hline
+c) & \texttt{<blackbox type == 'ITK\_ImageToImageFilter'>} and 
      \texttt{<blackbox generic>} is present. \\ \hline
+d) & \texttt{<blackbox widget>} is present \\ \hline
 \end{tabular}
 \end{table}
 
-\begin{table}[!ht]
-\caption{\label{basic_parent}}
-\bbfy \texttt{Basic box parent}
-\small
-\begin{tabular}{|ll|}
-\hline
-\texttt{bbtk::WxBlackBox}b) & If the blackbox associated to
-a \texttt{wxWindow} and is be able to return a pointer to it.... \\ \hline
-\texttt{bbtk::AtomicBlackBox} & Any other blackbox that doesn't return a pointer to a \texttt{wxWindow}
-
-\end{tabular}
-\end{table}
+%\begin{table}[!ht]
+%\caption{\label{basic_parent}}
+%\bbfy \texttt{Basic box parent}
+%\small
+%\begin{tabular}{|ll|}
+%\hline
+%\texttt{bbtk::WxBlackBox}b) & If the blackbox associated to
+%a \texttt{wxWindow} and is be able to return a pointer to it.... \\ \hline
+%\texttt{bbtk::AtomicBlackBox} & Any other blackbox that doesn't return a pointer to a \texttt{wxWindow}%
+%\end{tabular}
+%\end{table}
 
 
 
 
 % ==========================================
 \begin{table}[!ht]
-\caption{\label{categories} \texttt{bbfy} \texttt{Black Box} categories}
+\caption{\label{categories} \texttt{Black Box} categories}
 \small
-\begin{tabular}{|ll|}
+\begin{tabular}{|p{4cm}p{8cm}|}
 \hline
- \texttt{Categ name}     & : Meaning                                          \\ \hline \\ \hline
+ \texttt{Category name}     & : Meaning                                          \\ \hline 
+& \\ \hline
  \texttt{adaptor}        & : Adaptor box                                      \\ \hline
  \texttt{application}    & : Final application, end user intended             \\ \hline
  \texttt{atomic box}     & : System category.
@@ -826,12 +949,12 @@ a \texttt{wxWindow} and is be able to return a pointer to it.... \\ \hline
               Automatically assigned to Complex Black Boxes (script defined) \\ \hline  
  \texttt{command line}   & : Script which defines a command line application (no embedded GUI, but command line imput parameters) \\ \hline
  \texttt{demo}           & : Demonstration                             \\ \hline
- \texttt{devel}          & : Developer tool (bbCreatePackage.bbs, ...) \\ \hline
%\texttt{devel}          & : Developer tool (bbCreatePackage.bbs, ...) \\ \hline
  \texttt{dicom}          & : DICOM aware box \\ \hline 
  \texttt{example}        & : Example script showing a box use-case      \\ \hline
- \texttt{filter}         & : Image processing box                       \\ \hline
+ \texttt{filter}         & : Filtering box                       \\ \hline
  \texttt{image}          & : Image processing related box               \\ \hline
- \texttt{interaction}    & :                                            \\ \hline
+% \texttt{interaction}    & :                                            \\ \hline
  \texttt{math}           & : Mathematical operations\\ \hline
  \texttt{mesh}           & : Mesh processing related box \\ \hline
  \texttt{misc}           & : A box that cannot be put in other category ! \\ \hline
@@ -840,19 +963,18 @@ a \texttt{wxWindow} and is be able to return a pointer to it.... \\ \hline
  \texttt{widget}         & : Piece of graphical interface  \\ \hline 
  
  \texttt{3D object creator} & : Sophisticated 3D widget  \\ \hline  
- \texttt{toolsbbtk}         & : Component of bbStudio    \\ \hline  
+ \texttt{toolsbbtk}         & : \bbtk development tools (GUICreatePackage, GUICreateBlackBox,...)   \\ \hline  
 \end{tabular}
 \end{table}
 
 
 % ==========================================
 \begin{table}[!ht]
-\caption{\label{kinds}
-\bbfy \texttt{Black Box} kinds}
+\caption{\label{kinds}\texttt{Black box} kinds}
 \small
-\begin{tabular}{|ll|}
+\begin{tabular}{|p{4cm}p{8cm}|}
 \hline
- \texttt{Kind}     &  Use as :     \\ \hline \\ \hline
+ \texttt{Kind}     &  Use as :     \\ \hline \\ \hline
  \texttt{ADAPTOR} & \\ \hline
  \texttt{DEFAULT\_ADAPTOR} & \\ \hline 
  \texttt{WIDGET\_ADAPTOR} & \\ \hline 
@@ -866,22 +988,22 @@ a \texttt{wxWindow} and is be able to return a pointer to it.... \\ \hline
 
 % ==========================================
 \begin{table}[!ht]
-\caption{\label{nature}
-\bbfy \texttt{nature}}
+\caption{\label{nature}Input/output \texttt{natures}}
 \small
 \begin{tabular}{|ll|}
 \hline
- \texttt{Nature}     &   : used for    \\ \hline \\ \hline
- \texttt{file name} & Poping up a File Selector\\ \hline
- \texttt{directory name} & Poping up a Directory Selector\\ \hline 
- \texttt{file extension} & \\ \hline  
- \texttt{colour} & Poping up a Colour Selector\\ \hline 
- \texttt{pixel type} & \\ \hline 
- \texttt{image dimension} & \\ \hline
- \texttt{image index} & \\ \hline 
- \texttt{image size} & \\ \hline 
- \texttt{voxel size} & \\ \hline  
+ \texttt{Nature}     &   : Associated \texttt{DEFAULT\_GUI} box   \\ \hline 
+& \\ \hline
+
+ \texttt{'file name'} & \texttt{wx::FileSelector}\\ \hline
+ \texttt{'directory name'} & \texttt{wx::DirectorySelector}\\ \hline 
+% \texttt{'file extension'} & \\ \hline  
+ \texttt{'colour'} & \texttt{wx::ColourSelector}\\ \hline 
+% \texttt{pixel type} & \\ \hline 
+% \texttt{image dimension} & \\ \hline
+% \texttt{image index} & \\ \hline 
+% \texttt{image size} & \\ \hline 
+% \texttt{voxel size} & \\ \hline  
 \end{tabular}
 \end{table}
 
@@ -899,90 +1021,371 @@ a \texttt{wxWindow} and is be able to return a pointer to it.... \\ \hline
 \subsection{\CPP description of a box}
 % ==========================================
 
-Almost everything is performed usig macros.
+Almost everything is performed using macros.
 
 For a quick start, the best you have to do is to run \texttt{bbStudio}, then in the menu \texttt{Tools}, choose the item
- \texttt{Create blackbox}, click on \texttt{C++}, and have a look to the generated files.
+ \texttt{Create black box}, click on \texttt{C++}, and have a look to the generated files, or have a look at the source files of \bbtk core packages.
  
 % ==========================================
-\subsubsection{\texttt{.h} description of a box}
+\subsubsection{Black box basic header file (.h)}
 % ========================================== 
- \begin{itemize}
-    \item  \texttt{namespace} : your package name.
-    \item \texttt{class} : the name of your box
-    \item \texttt{public inheritance} : 
-      \begin{itemize}
-         \item{bbtk::WxBlackBox}
-           Your Black Box is intended to return a wxWidget, able to be included into an other one (you choosed
-           \texttt{widget-template} for \texttt{Type of the blackbox} )
-         \item{bbtk::AtomicBlackBox}
-           Your Black box is any processig box (std, ITK or VTK based)
-        \item{any processing class} (ITK, VTK, ...) your box inherits.  
-      \end{itemize}      
-    \item \texttt{BBTK\_BLACK\_BOX\_INTERFACE} : (yourBoxName, the list of the classes it inherits from, VTK Parent -if any-).
-    Yes, we know it's redundant with previous point... That's why we allow you to describe your class in xml format!
-    \item \texttt{bbUserConstructor} declaration of your own callback function, that will be called in the box constructor method
-    \item \texttt{bbUserCopyConstructor} declaration of your own callback function, that will be called in the box copy constructor method 
-    \item \texttt{bbUserDestructor} declaration of your own callback function, that will be called in the box destructor method
-    \item \texttt{BBTK\_DECLARE\_INPUT} : input parameter name (as it will appear to the users of your black box),
-                                        C++ type of the parameter (e.g. double, std::string, vtkImageData*, ...) 
-    \item \texttt{BBTK\_DECLARE\_OUTPUT} : output parameter name (as it will appear to the users of your black box),
-                                        C++ type of the parameter (e.g. double, std::string, vtkImageData*, ...
-    \item \texttt{BBTK\_DECLARE\_VTK\_INPUT}  Declares a vtkAlgorithm-inherited AtomicBlackBox input
-    \item \texttt{BBTK\_DECLARE\_VTK\_OUTPUT} Declares a vtkAlgorithm-inherited AtomicBlackBox output                                                                                  
-    \item \texttt{BBTK\_DECLARE\_VTK\_PARAM} Declares an AtomicBlackBox input corresponding to an inherited vtk parameter 
-     (you know, the ones that are declared by vtkSetMacro/vtkGetMacro). Its name must be the same than the vtk parameter name                          
-    \item \texttt{BBTK\_DECLARE\_VTK\_IMAGE\_ALGORITHM\_INPUT}     Declares a vtkImageAlgorithm-inherited    AtomicBlackBox input
-    \item \texttt{BBTK\_DECLARE\_VTK\_POLY\_DATA\_ALGORITHM\_INPUT} Declares a vtkPolyDataAlgorithm-inherited AtomicBlackBox input                                     
-    \item \texttt{BBTK\_PROCESS}   Defines the default bbUserProcess method for vtk inherited black boxes (actually : calls vtkParent::Update)
-                                                                              
-    \item \texttt{BBTK\_BEGIN\_DESCRIBE\_BLACK\_BOX}  : 
-    (yourBoxName,  \texttt{bbtk::WxBlackBox} or \texttt{bbtk::AtomicBlackBox} depending on what you
-    black box inherits from).
+
+Let's have a look at the file \texttt{packages/std/bbstdMakeFileName.h}
+
+\begin{file}{\texttt{packages/std/bbstdMakeFileName.h}}
+\small
+\begin{verbatim}
+#ifndef __bbstdMakeFileName_h_INCLUDED__
+#define __bbstdMakeFileName_h_INCLUDED__
+
+#include "bbtkAtomicBlackBox.h"
+
+namespace bbstd
+{
+  class MakeFileName : public bbtk::AtomicBlackBox
+  {
+    BBTK_BLACK_BOX_INTERFACE(MakeFileName,bbtk::AtomicBlackBox);
+    BBTK_DECLARE_INPUT(Directory, std::string);
+    BBTK_DECLARE_INPUT(File,      std::string);
+    BBTK_DECLARE_INPUT(Extent,    std::string);
+    BBTK_DECLARE_OUTPUT(Out,      std::string);
+    BBTK_PROCESS(DoProcess);
+    void DoProcess();
+  protected:
+    virtual void bbUserConstructor();
+  };
+
+  BBTK_BEGIN_DESCRIBE_BLACK_BOX(MakeFileName,bbtk::AtomicBlackBox);
+  BBTK_NAME("MakeFileName");
+  BBTK_AUTHOR("jpr@creatis.insa-lyon.fr");
+  BBTK_CATEGORY("misc");
+  BBTK_DESCRIPTION("Makes a kosher file name");
+  BBTK_INPUT(MakeFileName,Directory,"Directory Name",std::string,
+             "directory name");
+  BBTK_INPUT(MakeFileName,File,     "File Name",     std::string,
+             "file name");
+  BBTK_INPUT(MakeFileName,Extent,   "Extention",     std::string,
+             "file extension");
+  
+  BBTK_OUTPUT(MakeFileName,Out,"Full File Name",std::string,"file name");
+  BBTK_END_DESCRIBE_BLACK_BOX(MakeFileName);
+
+}
+// EO namespace bbstd
+
+#endif //  __bbstdMakeFileName_h_INCLUDED__
+\end{verbatim}
+\end{file}
+
+It includes \texttt{bbtkAtomicBlackBox.h}.
+The box class is \texttt{MakeFileName}.
+It inherits \texttt{bbtk::AtomicBlackBox}.
+It is in the \texttt{bbstd} namespace : 
+each box of a given package, say PACK, must be inserted into 
+the namespace \texttt{bbPACK}.
+
+The macro \texttt{BBTK\_BLACK\_BOX\_INTERFACE} 
+declares the interface of the class : constructor, destructor,
+standard methods (e.g. New), etc. 
+The following macros then declare inputs and outputs of the box, 
+with their types.
+The macro \texttt{BBTK\_PROCESS} then declares which method to call 
+when processing the box (the process callback).
+The callback itself is declared just below.
+
+The line \texttt{virtual void bbUserConstructor();} then 
+overloads the virtual method \texttt{bbUserConstructor} 
+which is used to perform specific things at construction time.
+You can also overload \texttt{bbUserCopyConstructor} 
+and \texttt{bbUserDestructor} with the same signature.
+The black box interface macros are summarized in table 
+\ref{CPPInterfaceBasicMacros}.
+
+% ==========================================
+\begin{table}[!ht]
+\caption{\label{CPPInterfaceBasicMacros}Black box interface \CPP macros}
+\begin{tabular}{p{\textwidth}}\hline
+    \\ \small \texttt{BBTK\_BLACK\_BOX\_INTERFACE(BOX\_NAME,BBTK\_PARENT)} :
+    Yes, we know the \bbtk parent is redundant with the inheritance list... That's why we allow you to describe your class in \xml format!
+     \\ \small \texttt{BBTK\_VTK\_BLACK\_BOX\_INTERFACE(CLASS,BBTK\_PARENT,VTK\_PARENT) } : Black box interface for \vtk object inherited boxes
+       \dots
+    \\ \small \texttt{BBTK\_ITK\_BLACK\_BOX\_INTERFACE(CLASS,BBTK\_PARENT,ITK\_PARENT) } : Black box interface for \itk object inherited boxes
+       \dots
+    \\ \small \texttt{BBTK\_DECLARE\_INPUT (NAME,TYPE) } : Declares an input of the box, with \texttt{NAME} : the input name (as it will appear to the users of your black box) and \texttt{TYPE} : \CPP type of the input (e.g. double, std::string, vtkImageData*, ...).
+  \\ \small \texttt{BBTK\_DECLARE\_INHERITED\_INPUT(NAME,TYPE,GETMETHOD,SETMETHOD)} : Declares an input of the box which wraps the \texttt{GETMETHOD / SETMETHOD} accessors
+    \\ \small \texttt{BBTK\_DECLARE\_VTK\_INPUT(NAME,TYPE)} :
+        Declares a vtk object-inherited input
+   \\ \small \texttt{BBTK\_DECLARE\_VTK\_IMAGE\_ALGORITHM\_INPUT(NAME,TYPE)} :    Declares a vtkImageAlgorithm-inherited input 
+    \\ \small \texttt{BBTK\_DECLARE\_VTK\_POLY\_DATA\_ALGORITHM\_INPUT(NAME,TYPE)} : Declares a vtkPolyDataAlgorithm-inherited input  
+    \\ \small \texttt{BBTK\_DECLARE\_ITK\_INPUT (NAME,TYPE)} :
+        Declares a itk object-inherited input
+  \\ \small \texttt{BBTK\_DECLARE\_OUTPUT (NAME,TYPE) } :
+       Declares an output of the box 
+  \\ \small \texttt{BBTK\_DECLARE\_INHERITED\_OUTPUT(NAME,TYPE,GETMETHOD,SETMETHOD)} :
+    Declares an output of the box which wraps the \texttt{GETMETHOD / SETMETHOD} accessors
+    \\ \small \texttt{BBTK\_DECLARE\_VTK\_OUTPUT(NAME,TYPE)} :
+       Declares a vtk object-inherited output    
+     \\ \small \texttt{BBTK\_DECLARE\_ITK\_OUTPUT(NAME,TYPE)} :
+        Declares a itk object-inherited output
+   \\ \small \texttt{BBTK\_DECLARE\_VTK\_PARAM(VTK\_PARENT,NAME,TYPE)} :
+ Declares an input corresponding to an inherited vtk parameter 
+     (you know, the ones that are declared by vtkSetMacro/vtkGetMacro). Its name must be the same than the vtk parameter name. 
+    \\ \small \texttt{BBTK\_DECLARE\_ITK\_PARAM(NAME,TYPE)} :
+ Declares an input corresponding to an inherited itk parameter 
+    \\ \small \texttt{BBTK\_PROCESS(METHOD\_NAME)} :
+       Defines the method to call when the box is processed. 
+    \\ \small \texttt{BBTK\_VTK\_PROCESS} :                                                    Defines AND implements the default processing method for vtk 
+        inherited black boxes (calls \texttt{vtkParent::Update})
+  \\ \small \texttt{BBTK\_ITK\_PROCESS} :                                                      Defines AND implements the default processing method for itk 
+        inherited black boxes (calls \texttt{itkParent::Update})
+\\ 
+\hline\end{tabular}
+
+\end{table}
+%================================================
+
+After the black box class declaration 
+then comes a zone in which you describe your black box, 
+between the macros \texttt{BBTK\_BEGIN\_DESCRIBE\_BLACK\_BOX} 
+and \\ \texttt{BBTK\_END\_DESCRIBE\_BLACK\_BOX}.
+
+The macro \texttt{BBTK\_BEGIN\_DESCRIBE\_BLACK\_BOX} 
+actually starts the declaration of another class, 
+called \texttt{\textless BOXNAME \textgreater Descriptor} 
+(in our case \texttt{MakeFileNameDescriptor}).
+The descriptor of a black box :
+\begin{itemize}
+\item has only one instance, which is stored in the package
+\item provides information about the box type (author, description, ...) 
+which is used for documentation.
+\item provides information about the box I/Os, mainly their types
+(uses RTTI : \texttt{std::type\_info} ).
+\item is responsible for creating new instances of the box it describes.
+\end{itemize}
+
+As you can see, 
+the macros which are between \texttt{BBTK\_BEGIN\_DESCRIBE\_BLACK\_BOX} 
+and \texttt{BBTK\_END\_DESCRIBE\_BLACK\_BOX} 
+provide the box name (the string), 
+its authors, description, category, 
+the descriptions of its inputs and outputs.
+Black box descriptor related 
+are described in table \ref{CPPDescriptorBasicMacros}.
+
+% ==========================================
+\begin{table}[!ht]
+\caption{\label{CPPDescriptorBasicMacros}Black box descriptor \CPP macros}
+\begin{tabular}{p{\textwidth}}\hline
+    \\ \small \texttt{BBTK\_BEGIN\_DESCRIBE\_BLACK\_BOX(BOX\_NAME,BBTK\_PARENT) }  : 
     Yes, we know it's redundant with public inheritance ... That's why we allow you to describe your class in xml format! 
     All the following items will be used in the Help interface; describe them carefully (i.e. in a Human understandable way!).
-    \item \texttt{BBTK\_NAME} : the name of your box 
-    \item \texttt{BBTK\_AUTHOR} : author name (better you put e-mail adress)
-    \item \texttt{BBTK\_DESCRIPTION} : brief description of what does the box
-    \item \texttt{BBTK\_CATEGORY} : box category  (see table \ref{categories})
-    \item \texttt{BBTK\_INPUT} for each one of the input parameters, you have to supply : 
+  \\ \small \texttt{BBTK\_ADAPTOR} : Declares that the box is an adaptor
+  \\ \small \texttt{BBTK\_DEFAULT\_ADAPTOR} : Declares that the box is the default adaptor for its I/O types
+   \\ \small \texttt{BBTK\_NAME(STRING)} : The name of your box 
+    \\ \small \texttt{BBTK\_AUTHOR(STRING)} : The author(s) (better you put e-mail adresses)
+    \\ \small \texttt{BBTK\_DESCRIPTION(STRING)} : Brief description of what does the box
+    \\ \small \texttt{BBTK\_CATEGORY(STRING)} : Box categories, semicolon separated  (see table \ref{categories})
+    \\ \small \texttt{BBTK\_INPUT(BOX\_NAME,INPUT\_NAME,DESCRIPTION,CPP\_TYPE,INPUT\_NATURE)} 
        \begin{itemize}
-         \item The current Blackbox name.
-         \item The parameter name
-         \item A brief description of what the parameter is used for.
-         \item The C++ type of the parameter (e.g. double, std::string, vtkImageData*, ...) 
-         \item The nature of the parameter (see table \ref{nature}) if you wish  your box may be used by automatic GUI generator.
+         \item \texttt{BOX\_NAME} : The current black box name.
+         \item \texttt{INPUT\_NAME} : The input name
+         \item \texttt{DESCRIPTION} (string) : A brief description of what the parameter is used for.
+         \item \texttt{CPP\_TYPE} : The \CPP type of the input (e.g. double, std::string, vtkImageData*, ...) 
+         \item \texttt{INPUT\_NATURE} : The 'nature' of the parameter (see table \ref{nature}) if you wish your box may be used by automatic GUI generator.
         Supply an empty string ("") if you don't care.          
        \end{itemize}
-    \item \texttt{ BBTK\_OUTPUT} for each one of the output parameters, you have to supply :
-       \begin{itemize}
-         \item The current Blackbox name.
-         \item The parameter name
-         \item A brief description of what the parameter is used for.
-         \item The C++ type of the parameter (e.g. double, std::string, vtkImageData*, ...) 
-       \end{itemize} 
-    \item \texttt{BBTK\_END\_DESCRIBE\_BLACK\_BOX} : means the torture is (almost) over.        
- \end{itemize}
-% ==========================================
-\subsubsection{\texttt{.cxx} description of a box}
+    \\ \small\texttt{BBTK\_OUTPUT(BOX\_NAME,OUTPUT\_NAME,DESCRIPTION,CPP\_TYPE)} : The same
+     \\ \small \texttt{BBTK\_END\_DESCRIBE\_BLACK\_BOX(BOX\_NAME)} 
+ \\ \hline\end{tabular}
+\end{table}
+
+% ==========================================
+\subsubsection{Black box basic implementation file (.cxx)}
 % ========================================== 
- \begin{itemize}
-    \item  \texttt{BBTK\_ADD\_BLACK\_BOX\_TO\_PACKAGE} : (Package name, Blackbox name)
-    \item  \texttt{BBTK\_BLACK\_BOX\_IMPLEMENTATION} : (Blackbox name, Blackbox basic parent \\ (bbtk::AtomicBlackBox/ bbtk::WxBlackBox)see :\label{basic_parent}
-    \item  \texttt{Process} :definition of your own callback function, that will be called in the box  method. \\ At least, you'll write here the default initialisation of the outputs
-    \item  \texttt{UserConstructor} :  definition of your own callback function, that will be called in the box constructor method. \\
-                                       At least, you'll write here the default initialisation of the inputs (to avoid unpredictable behaviour if user forgets to
-                                      Set/Connect any Input).  
-    \item  \texttt{UserCopyConstructor} : definition of your own callback function, that will be called in the box copy constructor method
-    \item  \texttt{UserDestructor} :  definition of your own callback function, that will be called in the box destructor method      
- \end{itemize}
+
+Now let's have a look at the file \texttt{packages/std/bbstdMakeFileName.cxx}
+
+\begin{file}{\texttt{packages/std/bbstdMakeFileName.cxx}}
+\small
+\begin{verbatim}
+#include "bbstdMakeFileName.h"
+#include "bbstdPackage.h"
+
+namespace bbstd
+{
+
+  BBTK_ADD_BLACK_BOX_TO_PACKAGE(std,MakeFileName);
+  BBTK_BLACK_BOX_IMPLEMENTATION(MakeFileName,bbtk::AtomicBlackBox);
+  
+  void MakeFileName::bbUserConstructor()
+  {
+    bbSetInputDirectory("");
+    bbSetInputFile("");
+    bbSetInputExtent("");
+  }
+  
+  void MakeFileName::DoProcess()
+  {
+    ...
+  }
+}
+// EO namespace bbstd
+\end{verbatim}
+\end{file}
+
+The first line includes the header file.
+The second one includes the \texttt{std} package header file.
+This file is automatically generated during cmake configuration :
+for a package named \texttt{\textless PACK \textgreater}, \cmake
+creates the files \texttt{bb\textless PACK \textgreater Package.h} 
+and \texttt{bb\textless PACK \textgreater Package.cxx}.
+The header is to be included in any box implementation file and 
+the second one is compiled in the package library.
+
+The macro \texttt{BBTK\_ADD\_BLACK\_BOX\_TO\_PACKAGE} 
+then registers the box \texttt{MakeFileName} into the package \texttt{std}.
+
+The macro \texttt{BBTK\_BLACK\_BOX\_IMPLEMENTATION} is the 
+mirror macro of the macro \texttt{BBTK\_BLACK\_BOX\_INTERFACE} that 
+was used in the header : it implements the methods declared in the header.
+
+We then need to write the body of \texttt{bbUserConstrutor} 
+and of the processing callback (here \texttt{DoProcess}).
+
+That's all we need for a 'basic' black box.
+The implementation related macros are summarized in table \ref{CPPImplementationBasicMacros}.
+
+% ==========================================
+\begin{table}[!ht]
+\caption{\label{CPPImplementationBasicMacros}Black box implementation \CPP macros}
+\begin{tabular}{p{\textwidth}}\hline
+    \\ \small \texttt{BBTK\_ADD\_BLACK\_BOX\_TO\_PACKAGE(PACKAGE\_NAME,BOX\_NAME)}
+   \\ \small  \texttt{BBTK\_BLACK\_BOX\_IMPLEMENTATION(BOX\_NAME,BBTK\_PARENT)}
+\\ \hline
+\end{tabular}
+\end{table}
  
- %\bibliography{all}
+% ==========================================
+\subsubsection{Widget black boxes \CPP macros}
+% ==========================================
+
+See the example of \texttt{package/wx/src/bbwxLayoutLine.h\textbar cxx}.
+The only differences with a non-widget black box are :
+\begin{itemize}
+\item The header must include \texttt{bbtkWxBlackBox.h} and \\ 
+the class must inherit \texttt{bbtk::WxBlackBox}.
+\item The black box interface must declare the widget creation callback 
+with the macro \texttt{BBTK\_CREATE\_WIDGET(CALLBACK)}. 
+The callback must be declared in the interface and implemented. 
+\item You can overload the method \texttt{void bbUserOnShow()} which 
+is called just after the \texttt{wxWindow} has been shown, e.g. 
+to refresh its content. Note that \texttt{Layout} widget \emph{MUST}
+overload this method and call \texttt{bbUserOnShowWidget(INPUT\_NAME)} 
+for all inputs which correspond to an 'embedded' window
+(the 'Widget1' ... 'WidgetN' inputs, 
+see \texttt{package/wx/src/bbwxLayoutLine.cxx})
+\end{itemize}
 
+% ==========================================
+\subsubsection{VTK black boxes \CPP macros}
+% ==========================================
 
+See the example of \texttt{package/wx/src/bbvtkMarchingCubes.h\textbar cxx}.
+The macros are summarized in table \ref{CPPInterfaceBasicMacros}.
+
+% ==========================================
+\subsubsection{Template black boxes \CPP macros}
+% ==========================================
+
+You can write down black box classes \emph{templates}. 
+However, only \emph{actual} classes, that is instanciated templates, 
+can be inserted into a package.
+
+The files \texttt{package/std/src/bbstdStringTo.h\textbar cxx} 
+provide an example of a class template with one template parameter. 
+
+The files \texttt{package/std/src/bbstdCast.h\textbar cxx} 
+provide an example of a class template with two template parameters. 
+
+Class templates related macros are summarized in table \ref{CPPTemplateMacros}.
+% ==========================================
+\begin{table}[!ht]
+\caption{\label{CPPTemplateMacros}Black box templates-related \CPP macros}
+\begin{tabular}{p{\textwidth}}\hline
+% \begin{itemize}
+    \\  \small\texttt{BBTK\_TEMPLATE\_BLACK\_BOX\_INTERFACE(BOX\_NAME,BBTK\_PARENT, TEMPLATE\_PARAMETER)}
+    \\  \small\texttt{BBTK\_TEMPLATE2\_BLACK\_BOX\_INTERFACE(BOX\_NAME,BBTK\_PARENT, TEMPLATE\_PARAMETER\_1, TEMPLATE\_PARAMETER\_2)}
+    \\  \small\texttt{BBTK\_BEGIN\_DESCRIBE\_TEMPLATE\_BLACK\_BOX(BOX\_NAME,BBTK\_PARENT)} : Note that in the descriptor, the template parameter name is \texttt{T}
+\\ \small\texttt{BBTK\_BEGIN\_DESCRIBE\_TEMPLATE2\_BLACK\_BOX(BOX\_NAME,BBTK\_PARENT)} : Note that in the descriptor, the template parameters names are \texttt{T1} and \texttt{T2}
+    \\ \small\texttt{BBTK\_END\_DESCRIBE\_TEMPLATE\_BLACK\_BOX(BOX\_NAME)}
+   \\ \small\texttt{BBTK\_END\_DESCRIBE\_TEMPLATE2\_BLACK\_BOX(BOX\_NAME)}
+     \\ \small\texttt{BBTK\_TEMPLATE\_INPUT(BOX\_NAME,INPUT\_NAME,DESCRIPTION,CPP\_TYPE, INPUT\_NATURE)} : Same than for non-templates, except that the \texttt{CPP\_TYPE} can be the template parameter.
+    \\ \small\texttt{BBTK\_TEMPLATE2\_INPUT(BOX\_NAME,INPUT\_NAME,DESCRIPTION,CPP\_TYPE, INPUT\_NATURE)} : Same remark
+ \\\small \texttt{BBTK\_TEMPLATE\_OUTPUT(BOX\_NAME,OUTPUT\_NAME,DESCRIPTION,CPP\_TYPE)} : Same remark 
+ \\ \small\texttt{BBTK\_TEMPLATE2\_OUTPUT(BOX\_NAME,OUTPUT\_NAME,DESCRIPTION,CPP\_TYPE)} : Same remark 
+ \\ \small\texttt{BBTK\_BLACK\_BOX\_TEMPLATE\_IMPLEMENTATION(BOX\_NAME,BBTK\_PARENT)}
+ \\ \small\texttt{BBTK\_BLACK\_BOX\_TEMPLATE2\_IMPLEMENTATION(BOX\_NAME,BBTK\_PARENT)}
+ \\ \small\texttt{BBTK\_ADD\_TEMPLATE\_BLACK\_BOX\_TO\_PACKAGE(PACKAGE\_NAME,BOX\_NAME, TEMPLATE\_PARAMETER\_VALUE)} : Adds the black box template instanciated on a certain value of its template parameter to the package. You can put as many such lines with different template parameter values as you want (see e.g. \texttt{package/std/src/bbstdStringTo.cxx})
+ \\ \small\texttt{BBTK\_ADD\_TEMPLATE2\_BLACK\_BOX\_TO\_PACKAGE(PACKAGE\_NAME,BOX\_NAME, TEMPLATE\_PARAMETER\_1\_VALUE, TEMPLATE\_PARAMETER\_2\_VALUE)} :
+The same for two template parameters (see  e.g. \texttt{package/std/src/bbstdCast.cxx})
+\\
+%\end{itemize}
+\\ \hline
+\end{tabular}
+\end{table}
 
-%\section{Conclusion}
+
+{\bf IMPORTANT NOTE ON TEMPLATE BLACK BOXES NAMES:}
+
+Two different boxes registered in a package must have two different names. 
+Hence when using black box classes templates, 
+one must give different names to two instanciations of the template on 
+two different types. 
+This is typically done with inserting the template parameter type name in the 
+black box class name.
+An example is provided in \texttt{package/std/src/bbstdStringTo.h} : 
+
+\begin{verbatim}
+  BBTK_BEGIN_DESCRIBE_TEMPLATE_BLACK_BOX(ToString,bbtk::AtomicBlackBox);
+  BBTK_NAME(bbtk::HumanTypeName<T>()+"ToString");
+   ... 
+  BBTK_END_DESCRIBE_TEMPLATE_BLACK_BOX(ToString);
+\end{verbatim}
+
+To get the string corresponding to the name of a \CPP type
+(here the template parameter \texttt{T})
+one must use the template \bbtk function \texttt{bbtk::HumanTypeName<T>()}
+\footnote{\texttt{HumanTypeName} returns a human readable type name, 
+without special chars such as \texttt{::} or \textless. For example the 
+human readable type name of \texttt{std::vector\textless std::string \textgreater} is \texttt{VectorOfString}. The 'inhuman' type name is given 
+by the function \texttt{bbtk::TypeName<T>()}.}.
+It is then concatenated to the name \texttt{ToString}.
+This thus gives the name \texttt{IntToString} to the black box \texttt{ToString\textless int \textgreater}, 
+\texttt{DoubleToString} to the black box \texttt{ToString\textless double \textgreater}, etc.
+
+You can also use \texttt{bbtk::HumanTypeName<T>()} 
+in the macro \texttt{BBTK\_DESCRIPTION}, like for example: 
+\begin{verbatim}
+  BBTK_DESCRIPTION("Converts a "+bbtk::HumanTypeName<T>()+" ("
+                  +bbtk::TypeName<T>()+") into a string");
+\end{verbatim}
+
+
+% ==========================================
+\subsubsection{ITK black boxes \CPP macros}
+% ==========================================
+
+It is a special cas of black box templates with also 
+special macros for itk object inherited black boxes. 
+
+See the example of \texttt{package/wx/src/bbitkBinaryThresholdImageFilter.h\textbar cxx}, 
+the tables \ref{CPPInterfaceBasicMacros} and \ref{CPPTemplateMacros}.
+
+Note that 
+there is also a mechanism for making 
+``generic'' untemplatized itk black boxes.
+See the example in the file above.
+
+% ==========================================
 \end{document}