]> Creatis software - bbtk.git/blobdiff - kernel/doc/bbtkPackageDevelopersGuide/bbtkPackageDevelopersGuide.tex
doc
[bbtk.git] / kernel / doc / bbtkPackageDevelopersGuide / bbtkPackageDevelopersGuide.tex
index de75a2789bc21ec1e1432fcf99805ce200430667..2a9e0724e4dbbd090ace1270c5f716e32f852150 100644 (file)
@@ -1,6 +1,66 @@
 % ==========================================
 \documentclass[11pt,final,a4paper]{article}
 \input{config.tex}
+
+
+\def\todo{\scriptsize\fbox{\bf TODO !!}\normalsize}
+\def\x{\bm{x}}
+\def\BBTK{{\xspace}The {\bf Black Box Toolkit} }
+\def\bbtk{{\xspace}$\texttt{bbtk}$ }
+\def\bbi{{\xspace}$\texttt{bbi}$ }
+\def\bbStudio{{\xspace}$\texttt{bbStudio}$ }
+\def\bbfy{{\xspace}$\texttt{bbfy}$ }
+\def\bbdoc{{\xspace}$\texttt{bbdoc}$ }
+\def\bbCreatePackage{{\xspace}$\texttt{bbCreatePackage}$ }
+
+\def\bb{{\xspace}$\texttt{bb}$ }
+%\def\bbp{{\xspace}$\texttt{bbp}$\xspace}
+
+\def\cmake{{\xspace}$\texttt{cmake}$ }
+
+\def\C{{\xspace}$\texttt{C}$ }
+\def\CPP{{\xspace}$\texttt{C++}$ }
+
+\def\xml{{\xspace}$\texttt{xml}$ }
+
+\def\itk{{\xspace}$\texttt{itk}$ }
+\def\vtk{{\xspace}$\texttt{vtk}$ }
+\def\gdcm{{\xspace}$\texttt{gdcm}$ }
+\def\gsmis{{\xspace}$\texttt{gsmis}$ }
+\def\wx{{\xspace}$\texttt{wxWidgets}$ }
+
+\def\lin{{\xspace}\textit{Linux} }
+\def\win{{\xspace}\textit{Windows} }
+
+% the same macros with no space at the end
+
+\def\BBTKns{{\xspace}The {\bf Black Box Toolkit}}
+\def\bbtkns{{\xspace}$\texttt{bbtk}$}
+\def\bbins{{\xspace}$\texttt{bbi}$}
+\def\bbfyns{{\xspace}$\texttt{bbfy}$}
+\def\bbdocns{{\xspace}$\texttt{bbdoc}$}
+\def\bbCreatePackagens{{\xspace}$\texttt{bbCreatePackage}$}
+
+\def\bbns{{\xspace}$\texttt{bb}$}
+%\def\bbp{{\xspace}$\texttt{bbp}$\xspace}
+
+\def\cmakens{{\xspace}$\texttt{cmake}$}
+
+\def\Cns{{\xspace}$\texttt{C}$}
+\def\CPPns{{\xspace}$\texttt{C++}$}
+
+\def\xmlns{{\xspace}$\texttt{xml}$}
+
+\def\itkns{{\xspace}$\texttt{itk}$}
+\def\vtkns{{\xspace}$\texttt{vtk}$}
+\def\gdcmns{{\xspace}$\texttt{gdcm}$}
+\def\gsmisns{{\xspace}$\texttt{gsmis}$}
+\def\wxns{{\xspace}$\texttt{wxWidgets}$}
+
+\def\linns{{\xspace}\textit{Linux}}
+\def\winns{{\xspace}\textit{Windows}}
+
+
 \begin{document}
 \title{The Black Box Toolkit\\Package Developers' Guide}
 \date{\today}
@@ -10,6 +70,9 @@
 \tableofcontents
 % ==========================================
 
+\listoftables
+
+\listoffigures
 
 % ==========================================
 %\section*{Abstract}
@@ -27,8 +90,9 @@
 % ==========================================
 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 interpreter \bbi, launched by the development environment
+\bbStudions). 
 
 \begin{enumerate}
 \item \textbf{Create a new package. }
@@ -72,8 +136,7 @@ the utility \bbfy will then generate the corresponding \CPP code.
 
 Run \texttt{bbStudio}.
 
-Use the option \texttt{Create Package} of the menu \texttt{Tools}.
-
+You'll get something like in fig. \ref{bb-Studio}
 
 \begin{figure}[!ht]
 \caption{\label{bb-Studio} bbStudio}
@@ -82,6 +145,8 @@ Use the option \texttt{Create Package} of the menu \texttt{Tools}.
 \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}. 
 
@@ -98,7 +163,7 @@ 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 in \texttt{bbi}.
 Fill up the form like in fig. \ref{bbFillUpPackageForm}.
 
 
@@ -109,7 +174,7 @@ Fill up the form like in fig. \ref{bbFillUpPackageForm}.
 \end{center}
 \end{figure} 
 
-Edit the file 'MyPackage/CMakeLists.txt' to customize your package
+Edit the file \texttt{MyPackage/CMakeLists.txt} to customize your package
 
 
 the file tree obtained is :
@@ -322,7 +387,7 @@ In these sections, you can set :
 \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 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}
@@ -352,9 +417,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 
@@ -366,10 +433,12 @@ 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}.
 
 \subsubsection{Inherit or encapsulate ?}
 
@@ -393,7 +462,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 
@@ -403,7 +472,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, 
@@ -588,8 +657,8 @@ 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}.
 
 
 The only part of the file which needs a bit of explaination is 
@@ -602,9 +671,9 @@ 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.
@@ -614,14 +683,14 @@ you must modify the xml file generated in previous step :
 
 \begin{enumerate}
   \item Complete the description and author tags if you feel like.
-  \item add the '\#include' directives to be put in the generated .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} 
+\end{enumerate}
 
 
 % ==========================================
@@ -631,11 +700,31 @@ you must modify the xml file generated in previous step :
 % ==========================================
 \subsubsection{Specific \texttt{xml} tags for \texttt{vtkImageAlgorithm} classes bbfication}
 % ==========================================
+\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 output"    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}
 % ==========================================
+\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 output"    description="..."/>
 
+<output  name="..." type="double"       special="vtk parameter" description="..."/>
+<output name="..."  type="vtkPolyData*" special="vtk output"    description="..."/>
+
+\end{verbatim}
 % ==========================================
 \subsubsection{\bbfy \texttt{xml} tags reference}
 % ==========================================
@@ -685,8 +774,9 @@ Use \texttt{bbPACKAGE}, where \texttt{PACKAGE} is the name of the package\\\hlin
 \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 
@@ -701,13 +791,27 @@ Use \texttt{bbPACKAGE}, where \texttt{PACKAGE} is the name of the package\\\hlin
 \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 
+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}
+
+
 
 
 % ==========================================
@@ -731,7 +835,7 @@ c) & \texttt{<blackbox type == ''itkImageToImageFilter''>} and
  \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{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
@@ -755,7 +859,6 @@ c) & \texttt{<blackbox type == ''itkImageToImageFilter''>} and
  \texttt{Kind}     &  Use as :     \\ \hline \\ \hline
  \texttt{ADAPTOR} & \\ \hline
  \texttt{DEFAULT\_ADAPTOR} & \\ \hline 
- \texttt{ADAPTOR} & \\ \hline 
  \texttt{WIDGET\_ADAPTOR} & \\ \hline 
  \texttt{DEFAULT\_WIDGET\_ADAPTOR} & \\ \hline
  \texttt{GUI} & \\ \hline 
@@ -764,16 +867,113 @@ c) & \texttt{<blackbox type == ''itkImageToImageFilter''>} and
 \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}
+
 % ==========================================
 \subsection{\CPP description of a box}
 % ==========================================
 
-TO DO...
-
-Look at the files \texttt{examples/TEMPLATE\_bbPackagenameBoxname.h/cxx}
-and \texttt{examples/TEMPLATE\_bbPackagenameWXBoxname.h/cxx}
+Almost everything is performed usig macros.
 
-%\bibliography{all}
+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}