]> Creatis software - bbtk.git/blobdiff - kernel/doc/bbtkPackageDevelopersGuide/bbtkPackageDevelopersGuide.tex
Doc headers
[bbtk.git] / kernel / doc / bbtkPackageDevelopersGuide / bbtkPackageDevelopersGuide.tex
index ab4cb9fd7092071eb9041a1a427511ae7bdd3429..8046e8ff0d83eca6bd2452870b7177ca63275edc 100644 (file)
@@ -1,15 +1,46 @@
+
 % ==========================================
 \documentclass[11pt,final,a4paper]{article}
 \input{config.tex}
+
+
+
 \begin{document}
-\title{The Black Box Toolkit\\Package Developers' Guide}
-\date{\today}
-\author{Laurent Guigues}
-\maketitle
+
+\begin{center}
+
+{\Large \BBTK}
+\vspace{1cm}
+
+{\Huge User's Guide}
+\vspace{1cm}
+
+\bbtk version \bbtkVersion
+\vspace{0.5cm}
+
+
+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}
+
+
+
 % ==========================================
 \tableofcontents
 % ==========================================
 
+\listoftables
+
+\listoffigures
 
 % ==========================================
 %\section*{Abstract}
 % ==========================================
 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 \bbtk, 
-such as the interpreter \bbi). 
+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 files which will allow you to generate the package 
+the source files which will allow you to generate the package 
 (compile and link the shared library) and may be install it. 
-The utility \texttt{bbCreatePackage} does it for you. 
+ \texttt{bbStudio} does it for you.
 
 Two cases occur :
 \begin{itemize}
@@ -52,6 +85,9 @@ 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 :
@@ -63,192 +99,271 @@ When configuring your project with \cmake,
 the utility \bbfy will then generate the corresponding \CPP code. 
 \end{itemize}
 
+
+
+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}
 % ==========================================
 
-The utility \texttt{bbCreatePackage} allows to 
-create a new void package. It is a command script 
-(a \texttt{bash} script on linux,
-a \texttt{dos} script on windows) 
-which creates the directory structure and the \texttt{cmake} 
-files necessary to build the project.
+Run \texttt{bbStudio}.
 
-Its usage is as follows :
-\begin{verbatim}
-> bbCreatePackage <package-folder-with-complete-path>
-\end{verbatim}
+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. 
-It will be the name used to load the package in \texttt{bbi}. 
+This name will be used to load the package by \texttt{bbStudio}.
+Fill up the form like in fig. \ref{bbFillUpPackageForm}.
 
-For example, on linux, turn to an empty folder and type :
 
-\begin{verbatim}
-> bbCreatePackage pack1
-\end{verbatim}
+\begin{figure}[!ht]
+\caption{\label{bbFillUpPackageForm} Fill up the form}
+\begin{center}
+\includegraphics[width=0.6\textwidth]{bbFillUpPackageForm.png}
+\end{center}
+\end{figure} 
 
-you get :
+Edit the file \texttt{MyPackage/CMakeLists.txt} to customize your package
 
-\begin{verbatim}
------ Creating new black box package in 'pack1' -----
--> Creating directory 'pack1'
--> Creating file 'pack1/CMakeLists.txt'
--> Creating directory 'pack1/cmake'
--> Copying files in 'pack1/cmake'
-Done !
-Edit the file 'pack1/CMakeLists.txt' to customize your package
-\end{verbatim}
 
 the file tree obtained is :
 
 \begin{verbatim}
-> tree pack1
-pack1/
-|-- CMakeLists.txt
-`-- cmake
+>tree  myPackageFolder
+myPackageFolder
+`-- MyPackage
+    |-- CMakeLists.txt
     |-- Configure.cmake
-    |-- ConfigurePackage.cmake
-    |-- FindGTK2.cmake
-    |-- FindLibrary.cmake.in
-    |-- FindwxW.cmake
-    |-- GenerateLibraryConfig.cmake
-    |-- InstallLibrary.cmake
-    |-- LibraryConfig.cmake.in
-    |-- UseLibrary.cmake.in
-    |-- bbPackage.cxx.in
-    `-- bbPackage.h.in
-
-1 directory, 12 files
+    |-- PackageConfig.cmake.in
+    |-- README.txt
+    |-- UsePackage.cmake.in
+    |-- bbs
+    |   |-- CMakeLists.txt
+    |   |-- appli
+    |   |   `-- README.txt
+    |   `-- boxes
+    |       `-- README.txt
+    |-- data
+    |   `-- CMakeLists.txt
+    |-- doc
+    |   |-- CMakeLists.txt
+    |   |-- bbdoc
+    |   |   |-- CMakeLists.txt
+    |   |   `-- header.html.in
+    |   `-- doxygen
+    |       |-- CMakeLists.txt
+    |       |-- DoxyMainPage.txt.in
+    |       `-- Doxyfile.txt.in
+    `-- src
+        `-- CMakeLists.txt
+       
+9 directories, 16 files
 \end{verbatim}
 
-The directory \texttt{pack1} is the directory of your new package, 
+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{pack1} directory.
+\texttt{CMakeLists.txt} in the \texttt{MyPackage} directory.
 This file contains :
 
-\begin{file}{pack1/CMakeLists.txt}
+\begin{file}{MyPackage/CMakeLists.txt}
 \small
 \begin{verbatim}
-#...........................................................................
-# CMake configuration file for a bbtk package. 
-# Automatically generated by bbCreatePackage.
-# - The lines which are between dotted comments (#...) must be left unchanged 
-# - The lines which are between dashed comments (#===) can be edited to customize the package
-#...........................................................................
+#===========================================================================
+# CMAKE SETTINGS FOR BUILDING A BBTK PACKAGE
+#===========================================================================
+
+#===========================================================================
+# THE NAME OF THE BBTK PACKAGE
+SET(BBTK_PACKAGE_NAME MyPackage)
+#===========================================================================
+
+#===========================================================================
+# IF IT IS A STANDALONE PROJECT UNCOMMENT NEXT LINE TO DECLARE YOUR PROJECT
+# PROJECT(bb${BBTK_PACKAGE_NAME})
+#===========================================================================
+
+#===========================================================================
+# PACKAGE AUTHOR
+# !!! NO COMMA ALLOWED !!!
+SET(${BBTK_PACKAGE_NAME}_AUTHOR "myself")
+#===========================================================================
 
-#...........................................................................
-INCLUDE(cmake/Configure.cmake)
-#...........................................................................
+#===========================================================================
+# PACKAGE DESCRIPTION
+SET(${BBTK_PACKAGE_NAME}_DESCRIPTION "The kinkiest stuff you ve ever seen.")
+#===========================================================================
 
+#===========================================================================
+# PACKAGE VERSION NUMBER 
+SET(${BBTK_PACKAGE_NAME}_MAJOR_VERSION 1)
+SET(${BBTK_PACKAGE_NAME}_MINOR_VERSION 0)
+SET(${BBTK_PACKAGE_NAME}_BUILD_VERSION 0)
+#===========================================================================
 
 #===========================================================================
-# THE NAME OF THE PACKAGE 
-SET(PACKAGE_NAME Example)
+# UNCOMMENT EACH LIBRARY NEEDED (WILL BE FOUND AND USED AUTOMATICALLY)
+# SET(${BBTK_PACKAGE_NAME}_USE_VTK  ON)
+# SET(${BBTK_PACKAGE_NAME}_USE_ITK  ON)
+# SET(${BBTK_PACKAGE_NAME}_USE_GDCM ON)
+# SET(${BBTK_PACKAGE_NAME}_USE_GSMIS ON)
+# SET(${BBTK_PACKAGE_NAME}_USE_WXWIDGETS ON)
 #===========================================================================
 
+#===========================================================================
+# LIST HERE THE OTHER bbtk PACKAGES NEEDED
+# (WILL BE FOUND AND USED AUTOMATICALLY)
+SET(${BBTK_PACKAGE_NAME}_USE_PACKAGES 
+  # std
+  # wx
+  # itk
+  # vtk
+  # ...
+  )
+#===========================================================================
 
-#...........................................................................
-# DOES THE USER WANT TO BUILD THE PACKAGE ?
-OPTION(BUILD_PACKAGE_${PACKAGE_NAME} 
-  "Build the bbtk package ${PACKAGE_NAME}" ON)
-#...........................................................................
+#===========================================================================
+# THE SOURCES OF THE PACKAGE
+# EITHER UNCOMMENT NEXT LINE TO COMPILE ALL .cxx OF THE src DIRECTORY :
+SET(${BBTK_PACKAGE_NAME}_COMPILE_ALL_CXX ON)
+# ... OR LIST THE FILES TO COMPILE MANUALLY :
+#SET(${BBTK_PACKAGE_NAME}_SOURCES
+# LIST HERE THE FILES TO COMPILE TO BUILD THE LIB
+# E.G. TO COMPILE "toto.cxx" ADD "toto" (NO EXTENSION)
+# THE PATH MUST BE RELATIVE TO THE src FOLDER
+#    )
+#===========================================================================
+
+#===========================================================================
+# THE xml SOURCES OF THE PACKAGE
+# EITHER UNCOMMENT NEXT LINE TO bbfy ALL .xml OF THE src DIRECTORY :
+SET(${BBTK_PACKAGE_NAME}_COMPILE_ALL_XML ON)
+# ... OR LIST THE FILES TO COMPILE MANUALLY :
+#SET(${BBTK_PACKAGE_NAME}_XML_SOURCES
+# LIST HERE THE FILES TO bbfy TO BUILD THE LIB
+# E.G. TO bbfy "toto.xml" ADD "toto" (NO EXTENSION)
+# THE PATH MUST BE RELATIVE TO THE src FOLDER
+#    )
+#===========================================================================
 
-#...........................................................................
-# IF THE USER HAS CHOSEN TO BUILD THE PACKAGE
-IF(BUILD_PACKAGE_${PACKAGE_NAME})
-  #...........................................................................
+#===========================================================================
+# THE SCRIPT-DEFINED BOXES OF THE PACKAGE (bbs)
+# EITHER UNCOMMENT NEXT LINE TO INCLUDE ALL .bbs OF THE bbs/boxes DIRECTORY :
+SET(${BBTK_PACKAGE_NAME}_INCLUDE_ALL_BBS_BOXES ON)
+# ... OR LIST THE FILES TO INCLUDE MANUALLY :
+# SET(${BBTK_PACKAGE_NAME}_BBS_BOXES
+# LIST HERE THE bbs FILES TO INCLUDE 
+# E.G. TO INCLUDE "boxes/bbtoto.bbs" ADD "boxes/bbtoto" (NO EXTENSION)
+# !! THE PATH MUST BE RELATIVE TO THE bbs FOLDER !!
+#)
+#===========================================================================
 
+#===========================================================================
+# THE SCRIPT-DEFINED APPLICATIONS OF THE PACKAGE (bbs)
+# EITHER UNCOMMENT NEXT LINE TO INCLUDE ALL .bbs OF THE bbs/appli DIRECTORY :
+SET(${BBTK_PACKAGE_NAME}_INCLUDE_ALL_BBS_APPLI ON)
+# ... OR LIST THE FILES TO INCLUDE MANUALLY :
+# SET(${BBTK_PACKAGE_NAME}_BBS_APPLI
+# LIST HERE THE bbs FILES TO INCLUDE 
+# E.G. TO INCLUDE "appli/testToto.bbs" ADD "appli/testToto" (NO EXTENSION)
+# !! THE PATH MUST BE RELATIVE TO THE bbs FOLDER !!
+#)
+#===========================================================================
 
-  #===========================================================================
-  # UNCOMMENT NEXT LINES IF THE PACKAGE USES THE VTK LIBRARY, THE ITK LIB, ETC.
-  # SET(${PACKAGE_NAME}_USE_VTK  ON)
-  # SET(${PACKAGE_NAME}_USE_ITK  ON)
-  # SET(${PACKAGE_NAME}_USE_GDCM ON)
-  # SET(${PACKAGE_NAME}_USE_GSMIS ON)
-  # SET(${PACKAGE_NAME}_USE_WXWIDGETS ON)
-  #===========================================================================
-  
-  #===========================================================================
-  # PACKAGE AUTHOR : PREFERABLY PROVIDE YOUR EMAIL ADDRESS
-  SET(PACKAGE_AUTHOR "foo.bar@creatis.insa-lyon.fr")
-  #===========================================================================
-
-  #===========================================================================
-  # PACKAGE DESCRIPTION
-  SET(PACKAGE_DESCRIPTION "My marvelous black box package")
-  #===========================================================================
-
-  #===========================================================================
-  # PACKAGE VERSION NUMBER 
-  SET(PACKAGE_MAJOR_VERSION 1)
-  SET(PACKAGE_MINOR_VERSION 0)
-  SET(PACKAGE_BUILD_VERSION 0)
-  #===========================================================================
-  #===========================================================================
-  # THE xml SOURCES OF THE PACKAGE
-  # EITHER UNCOMMENT NEXT LINE TO bbfy ALL .xml OF THE DIRECTORY :
-  SET(COMPILE_ALL_XML ON)
-  # ... OR LIST THE FILES TO COMPILE MANUALLY :
-  #SET(PACKAGE_XML_SOURCES
-    # LIST HERE THE FILES TO bbfy TO BUILD THE LIB
-    # E.G. TO bbfy "toto.xml" ADD "toto" (NO EXTENSION)
-  #    )
-  #===========================================================================
-
-  #===========================================================================
-  # THE C++ SOURCES OF THE PACKAGE
-  # EITHER UNCOMMENT NEXT LINE TO COMPILE ALL .cxx OF THE DIRECTORY :
-  SET(COMPILE_ALL_CXX ON)
-  # ... OR LIST THE FILES TO COMPILE MANUALLY :
-  #SET(PACKAGE_CXX_SOURCES
-    # LIST HERE THE FILES TO COMPILE TO BUILD THE LIB
-    # E.G. TO COMPILE "toto.cxx" ADD "toto" (NO EXTENSION)
-  #    )
-  #===========================================================================
-
-  #===========================================================================
-  INCLUDE_DIRECTORIES(
-    # LIST HERE YOUR ADDITIONAL INCLUDE DIRECTORIES (EXCEPT BBTK'S)
-    )
-  #===========================================================================
-  #===========================================================================
-  SET(PACKAGE_LIBS 
-    # LIST HERE THE ADDITIONAL LIBS TO LINK AGAINST (EXCEPT BBTK'S)   
-    )
-  #===========================================================================
+#===========================================================================
+SET(${BBTK_PACKAGE_NAME}_INCLUDE_DIRS
+  # LIST HERE YOUR ADDITIONAL INCLUDE DIRECTORIES 
+  # EXCEPT :
+  #  - src
+  #  - bbtk dirs
+  #  - automatically handled libraries or packages : wx, vtk... (see above)
+  #  - the dirs automatically set by other libraries found by FIND_PACKAGE
+  )
+#===========================================================================
 
-  
-  #...........................................................................
-  INCLUDE(cmake/ConfigurePackage.cmake)
-  #...........................................................................
-  
-ENDIF(BUILD_PACKAGE_\${PACKAGE_NAME})
-#...........................................................................
+#===========================================================================
+SET(${BBTK_PACKAGE_NAME}_LIBS 
+  # LIST HERE THE ADDITIONAL LIBS TO LINK AGAINST
+  # EXCEPT : the same libs than for INCLUDE_DIRS 
+  )
+#===========================================================================
+
+#===========================================================================
+# IF NEEDED : UNCOMMENT NEXT LINE 
+# AND LIST ADDITIONNAL DIRECTORIES 
+# IN WHICH TO LOOK FOR LIBRARIES TO LINK AGAINST
+# LINK_DIRECTORIES()
+#===========================================================================
+
+#===========================================================================
+# SET TO TRUE TO HAVE INFORMATION ON LIBRARIES FOUND DURING CMAKE CONFIGURE
+SET(FIND_PACKAGE_VERBOSE TRUE)
+#===========================================================================
+
+#===========================================================================
+# END OF USER SECTION
+#===========================================================================
+
+#===========================================================================
+# Include configuration script
+INCLUDE(Configure.cmake)
+#===========================================================================
+
+#===========================================================================
 # EOF
-#...........................................................................
+#===========================================================================
+
 \end{verbatim}
 \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:
+\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.  
+\end{itemize}
+
 In these sections, you can set :
 \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{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{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 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 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 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}
@@ -278,9 +393,11 @@ Apart from this 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::UserBlackBox} and \texttt{bbtk::WxBlackBox} 
+\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 
@@ -292,10 +409,15 @@ 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 
+
+Concretely, a \texttt{bbtk::WxBlackBox} is associated to
 a \texttt{wxWindow} and must be able to return a pointer to it. 
-If your black box is not a widget black box, it must inherit 
-\texttt{bbtk::UserBlackBox}.
+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}/
 
 \subsubsection{Inherit or encapsulate ?}
 
@@ -319,7 +441,7 @@ In \CPP, in order to embed an existing processing \emph{class}
 into a standard interface you only have two possibilities :
 \begin{enumerate}
 \item {\bf Inherit} the existing processing class 
-\emph{and} the interface class (e.g. \texttt{bbtk::UserBlackBox}).
+\emph{and} the interface class (e.g. \texttt{bbtk::AtomicBlackBox}).
 In this case you have to :
 \begin{enumerate}
 \item make the link between the inputs and outputs of the black box 
@@ -329,7 +451,7 @@ method of the inherited class in the processing method of the black box.
 \end{enumerate}
 \item {\bf Encapsulate} the existing processing class 
 in a class inherited from 
-the interface class (e.g. \texttt{bbtk::UserBlackBox}).
+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, 
@@ -358,27 +480,65 @@ 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.
 
+\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 author} of the box
-\item A {\bf description} of the box
-\item The {\bf package} to which the box belongs (can we do it automatically ? LG : think about it)
-\item Its {\bf parent black box}, either \texttt{bbtk::UserBlackBox} or \texttt{bbtk::WxBlackBox} 
-\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
+  \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 
@@ -446,27 +606,30 @@ four distinct accessors are created :
 Let us examine the \texttt{xml} file 
 describing the \texttt{Add} box of the \texttt{std} package :
 
-\begin{file}{\texttt{src/packages/std/bbAdd.xml}}
+\begin{file}{\texttt{packages/std/src/bbAdd.xml}}
 \small
 \begin{verbatim}
 <?xml version="1.0" encoding="iso-8859-1"?>
 
 <blackbox name="Add">
 
-  <description> Adds its inputs                      </description>
-  <author>      laurent.guigues@creatis.insa-lyon.fr </author>
-  <package>     std                                  </package>
-
-  <parentblackbox> bbtk::UserBlackBox                </parentblackbox>
-  <namespace>      bbstd                             </namespace>
+  <author>laurent.guigues@creatis.insa-lyon.fr </author>
+  <description>Adds its inputs                 </description>
+  <category>math                               </category>
 
-  <input  name="In1" type="double">  First number to add   </input>
-  <input  name="In2" type="double">  Second number to add  </input>
-  <output name="Out" type="double">  Result                </output>
+  <input name="In1"  type="double" description="First number to add"/>
+  <input name="In2"  type="double" description="Second number to add"/>
+  <output name="Out" type="double" description="Result"/>
 
   <process><PRE>
     bbSetOutputOut( bbGetInputIn1() + bbGetInputIn2() );
   </PRE></process>
+  
+  <constructor><PRE>
+    bbSetInputIn1(0);
+    bbSetInputIn2(0);
+    bbSetOutputOut(0);
+  </PRE></constructor>    
 
 </blackbox>
 \end{verbatim}
@@ -474,13 +637,11 @@ 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 from 
-\texttt{bbtk::UserBlackBox} (\texttt{parentblackbox} tag).
+As the box is not a widget, we inherit implicitely from 
+\texttt{bbtk::AtomicBlackBox}.
 
-Note that we decided to include the generated class 
-into the namespace \texttt{bbstd}.
 
-The only part of the file which demand a bit of explaination is 
+The only part of the file which needs a bit of explaination is 
 the body of the \texttt{process} tag, which describes the 
 actual code to execute in the box. 
 This code must be enclosed in a \texttt{<PRE></PRE>} tag 
@@ -490,28 +651,26 @@ like the \texttt{<} and \texttt{>} which have a
 special meaning in \xml. 
 In the case of the \texttt{Add} box, the process code 
 is very simple : remember that 
-\texttt{bbGetInputIn1} is the 
+\texttt{bbGetInputIn1()} is the 
 accessor to the input \texttt{In1} declared above and 
-\texttt{bbGetInputIn2} is the 
+\texttt{bbGetInputIn2()} is the 
 accessor to the input \texttt{In2};  
 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 can use the template \texttt{xml} file 
-\texttt{examples/TEMPLATE\_bbPackagenameBoxname.xml}.
+you must modify the xml file generated in previous step : 
 
-If \texttt{MyPack} is the name of your package and 
-\texttt{MyBox} the name of your box, then :
 \begin{enumerate}
-\item Copy this file in your package folder with 
-the normalised name \texttt{bbMyPackMyBox.xml} 
-\item Replace each occurrence of \$PACKAGENAME\$ by MyPack 
-and each occurrence of \$BOXNAME\$ by MyBox.
-\item Fill in the description and author tags
-\item Create your inputs and outputs
-\item Fill in the process tag 
-\end{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 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}
 
 
 % ==========================================
@@ -519,21 +678,45 @@ and each occurrence of \$BOXNAME\$ by MyBox.
 % ==========================================
 
 % ==========================================
-\subsubsection{Specific \texttt{xml} tags for \texttt{vtkImageAlgorithm} classes bbfication}
+\subsubsection{Specific \texttt{xml} tags for \texttt{vtkImageAlgorithm} classes bbfication by inheritance}
 % ==========================================
+\begin{verbatim}
+
+<blackbox name="..." type="VTK_ImageAlgorithm">
 
+<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="..."/>
+
+<output  name="..." type="double"        special="vtk parameter" description="..."/>
+<output name="..."  type="vtkImageData*" special="vtk output"    description="..."/>
+\end{verbatim}
 % ==========================================
-\subsubsection{Specific \texttt{xml} tags for \texttt{vtkPolyDataAlgorithm} classes bbfication}
+\subsubsection{Specific \texttt{xml} tags for \texttt{vtkPolyDataAlgorithm} classes bbfication by inheritance}
 % ==========================================
+\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="..."/>
+
+\end{verbatim}
+
+\newpage
 
 % ==========================================
 \subsubsection{\bbfy \texttt{xml} tags reference}
 % ==========================================
 
+ See tables \ref{xml_tags}, \ref{xml_tags2}
 % ==========================================
 \begin{table}[!ht]
 \caption{\label{xml_tags}
-\bbfy \texttt{xml} tags reference}
+\bbfy \texttt{xml} tags reference (part 1)}
 \small
 \begin{tabular}{|lcllm{6cm}|}
 \hline
@@ -543,14 +726,15 @@ Tag & Attributes & Condition & Multiplicity & Description
 \texttt{<blackbox>} & \texttt{name} & - & 1 & The name of the box \\ \hline
                & \texttt{type} & - & 1 & The type of the box. In: 
        \{\texttt{standard} (default), 
-\texttt{itkImageToImageFilter},
-\texttt{vtkImageAlgorithm},
-\texttt{vtkPolyDataAlgorithm}\} \\\hline
+\texttt{ITK\_ImageToImageFilter},
+\texttt{VTK\_ImageAlgorithm},
+\texttt{VTK\_PolyDataAlgorithm}\} \\\hline
 & \texttt{generic} & a) & 0-1 &
 Generate the generic filter (see text)\\ \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 
@@ -570,42 +754,232 @@ Use \texttt{bbPACKAGE}, where \texttt{PACKAGE} is the name of the package\\\hlin
         & \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 
-\texttt{<output>} & \texttt{name} & - & 1 &  The name of the output \\\hline 
+
+
+ \end{tabular}
+ \end{table}
+\begin{table}[!ht]
+\caption{\label{xml_tags2}
+\bbfy \texttt{xml} tags reference (part 2)}
+\small
+\begin{tabular}{|lcllm{6cm}|}
+\hline
+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{generic\_type} & c) & 0-1 & The ``generic'' type of the output (see text).\\\hline 
-
+``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{<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
+ \end{tabular}
+ \end{table}
+ \newpage
+% ==========================================
+\begin{table}[!ht]
+\caption{\label{xml_tags-conditions}
+\bbfy \texttt{xml} tags conditions}
+\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 
+     \texttt{<blackbox generic>} 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{xml_tags}
-\bbfy \texttt{xml} tags conditions}
+\caption{\label{categories} \texttt{bbfy} \texttt{Black Box} categories}
 \small
 \begin{tabular}{|ll|}
 \hline
-a) & \texttt{<blackbox type == ''itkImageToImageFilter''>} \\ \hline
-b) & \texttt{<blackbox type == ''vtkImageAlgorithm'' or ''vtkPolyDataAlgorithm''>} \\ \hline
-c) & \texttt{<blackbox type == ''itkImageToImageFilter''>} and 
-       \texttt{<blackbox generic>} is present. \\ \hline
+ \texttt{Categ name}     & : Meaning                                          \\ \hline \\ \hline
+ \texttt{adaptor}        & : Adaptor box                                      \\ \hline
+ \texttt{application}    & : Final application, end user intended             \\ \hline
+ \texttt{atomic box}     & : System category.
+              Automatically assigned to Atomic Black Boxes (c++ defined)     \\ \hline
+ \texttt{complex box}    & : System category.
+              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{dicom}          & : DICOM aware box \\ \hline 
+ \texttt{example}        & : Example script showing a box use-case      \\ \hline
+ \texttt{filter}         & : Image processing box                       \\ \hline
+ \texttt{image}          & : Image processing related box               \\ \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
+ \texttt{read/write}     & : Box that read or write data from or to disk  \\ \hline
+ \texttt{viewer}         & : Box which displays some data \\ \hline
+ \texttt{widget}         & : Piece of graphical interface  \\ \hline 
+ \texttt{3D object creator} & : Sophisticated 3D widget  \\ \hline  
+ \texttt{toolsbbtk}         & : Component of bbStudio    \\ \hline  
 \end{tabular}
 \end{table}
 
 
 % ==========================================
-\subsection{\CPP description of a box}
+\begin{table}[!ht]
+\caption{\label{kinds}
+\bbfy \texttt{Black Box} kinds}
+\small
+\begin{tabular}{|ll|}
+\hline
+ \texttt{Kind}     &  Use as :     \\ \hline \\ \hline
+ \texttt{ADAPTOR} & \\ \hline
+ \texttt{DEFAULT\_ADAPTOR} & \\ \hline 
+ \texttt{WIDGET\_ADAPTOR} & \\ \hline 
+ \texttt{DEFAULT\_WIDGET\_ADAPTOR} & \\ \hline
+ \texttt{GUI} & \\ \hline 
+ \texttt{DEFAULT\_GUI} & \\ \hline 
+ \texttt{ALL} & If kind='ALL' then sets the level for all kinds\\ \hline  
+\end{tabular}
+\end{table}
+
+
 % ==========================================
+\begin{table}[!ht]
+\caption{\label{nature}
+\bbfy \texttt{nature}}
+\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  
+\end{tabular}
+\end{table}
+
+.\\
+.\\
+.\\
+.\\
+.\\
+
 
-TO DO...
+\newpage 
 
-Look at the files \texttt{examples/TEMPLATE\_bbPackagenameBoxname.h/cxx}
-and \texttt{examples/TEMPLATE\_bbPackagenameWXBoxname.h/cxx}
 
-%\bibliography{all}
+% ==========================================
+\subsection{\CPP description of a box}
+% ==========================================
+
+Almost everything is performed usig 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.
+% ==========================================
+\subsubsection{\texttt{.h} description of a box}
+% ========================================== 
+ \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).
+    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 : 
+       \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.
+        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}
+% ========================================== 
+ \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}
+ %\bibliography{all}