]> Creatis software - bbtk.git/blobdiff - kernel/doc/bbtkPackageDevelopersGuide/bbtkPackageDevelopersGuide.tex
Doc headers
[bbtk.git] / kernel / doc / bbtkPackageDevelopersGuide / bbtkPackageDevelopersGuide.tex
index 0c6a4287c6ac84ba3ea59888ce5ee98ff1367e02..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. 
  \texttt{bbStudio} does it for you.
  
@@ -53,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 :
@@ -64,6 +99,11 @@ 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}
 
 % ==========================================
@@ -72,7 +112,7 @@ the utility \bbfy will then generate the corresponding \CPP code.
 
 Run \texttt{bbStudio}.
 
-You''l get something like in fig. \ref{bb-Studio}
+You'll get something like in fig. \ref{bb-Studio}
 
 \begin{figure}[!ht]
 \caption{\label{bb-Studio} bbStudio}
@@ -99,7 +139,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. 
-This name will be 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}.
 
 
@@ -323,7 +363,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}
@@ -374,7 +414,10 @@ 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 
 (that is : doesn't returns a pointer to a \emph{Widget}),
- it must inherit from \texttt{bbtk::AtomicBlackBox}.
+ 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 ?}
 
@@ -462,10 +505,11 @@ Finally, to create a new black box, you will have to give :
 
  \item Its {\bf type}, either 
    \begin{enumerate} 
-     \item  a standard one (\texttt{std-template})
-     \item a VTK Polydata Algorithm based box (\texttt{VTK\_PolydataAlgorithm-template}),    
-     \item  a VTK Image Algorithm based box (\texttt{VTK\_ImageaAlgorithm-template}),
-     \item  if it uses the wxWidget Library (\texttt{widget-template})
+     \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.
@@ -634,42 +678,45 @@ you must modify the xml file generated in previous step :
 % ==========================================
 
 % ==========================================
-\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">
+<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="..."/>
+<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">
+<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="..."/>
+<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
@@ -707,39 +754,66 @@ 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  
         & \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}
+\caption{\label{xml_tags-conditions}
 \bbfy \texttt{xml} tags conditions}
 \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}
+
+
 
 
 % ==========================================
 \begin{table}[!ht]
-\caption{\label{categories}
-\bbfy \texttt{Black Box} categories}
+\caption{\label{categories} \texttt{bbfy} \texttt{Black Box} categories}
 \small
 \begin{tabular}{|ll|}
 \hline
@@ -781,7 +855,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 
@@ -812,16 +885,101 @@ c) & \texttt{<blackbox type == ''itkImageToImageFilter''>} and
 \end{tabular}
 \end{table}
 
+.\\
+.\\
+.\\
+.\\
+.\\
+
+
+\newpage 
+
+
 % ==========================================
 \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}