not only the inputs and outputs are of interest but also
\emph{what the box does} !
Hence, I would say that a black box is any \emph{\bf documented}
-component of a system, letting know the user
+component of a system, letting the user know
\emph{\bf what} the box is supposed to do and
\emph{\bf how to use it}
but not \emph{\bf how it does it}.
% ==========================================
\BBTK includes:
\begin{itemize}
-\item A \CPP {\bf\emph{library}} - called \bbtk - which defines a framework
-(abstract classes) to develop black boxes and to store them into
-dynamic libraries, called black box \emph{packages}.
-\item Different {\bf\emph{black box packages}}:
-\begin{itemize}
-\item {\bf\emph{std}}: the 'standard' package including basic useful boxes.
-\item {\bf\emph{wx}}: basic graphical interface elements (widgets: sliders, buttons, etc. based on the \texttt{wxWidgets} library).
-\item {\bf\emph{itk}}: the basic image processing package, based on the \texttt{itk} library.
-\item {\bf\emph{vtk}}: the basic image and surfaces processing package, based on the \texttt{vtk} library.
-\item {\bf\emph{wxvtk}}: widget boxes based on the \texttt{vtk} library.
-\item {\bf\emph{itkvtk}}: boxes to convert \texttt{itk} structures into \texttt{vtk} structures and conversally.
+ \item A \CPP {\bf\emph{library}} - called \bbtk - which defines a framework
+ (abstract classes) to develop black boxes and to store them into
+ dynamic libraries, called black box \emph{packages}.
+ \item Different {\bf\emph{black box packages}}:
+ \begin{itemize}
+ \item {\bf\emph{std}}: the 'standard' package including basic useful boxes.
+ \item {\bf\emph{wx}}: basic graphical interface elements (widgets: sliders, buttons, etc. based on the \texttt{wxWidgets} library).
+ \item {\bf\emph{itk}}: the basic image processing package, based on the \texttt{itk} library.
+ \item {\bf\emph{vtk}}: the basic image and surfaces processing package, based on the \texttt{vtk} library.
+ \item {\bf\emph{wxvtk}}: widget boxes based on the \texttt{vtk} library.
+ \item {\bf\emph{itkvtk}}: boxes to convert \texttt{itk} structures into \texttt{vtk} structures and conversally.
+ \end{itemize}
+ \item A {\bf\emph{Developement environment}}, called bbStudio, which provides
+ \begin{itemize}
+ \item An online {\bf\emph{script editor}}, called bbed
+ \item A powerfull {\bf\emph{Help environment}}, called bbhelp
+ whith integrated
+ \begin{itemize}
+ \item Online documentation scaning
+ \item Retreiving boxes on various criterions
+ \item Checking Demo and examples
+ \end{itemize}
+
+ \item An {\bf\emph{interpreter}}, called \bbi, which allows to
+ load black box packages and to define and execute
+ processing chains by connecting various black boxes of the already loaded packages.
+ \item {\bf\emph{Utilities}}:
+ \begin{itemize}
+ \item \bbfy generates the \CPP code of a black box from a
+ description file written in \texttt{xml}.
+ %\item \bbdoc generates the html documentation of a black box package
+ %(author, description, description of its black boxes:
+ %author, description, inputs, outputs, and so on).
+ \item \bbCreatePackage allows to create the basic file architecture
+ to start the development of a new black box package.
+ \end{itemize}
+ \end{itemize}
\end{itemize}
-\item An {\bf\emph{interpreter}}, called \bbi, which allows to
-load black box packages and to define and execute
-processing chains by connecting various black boxes of the already loaded packages.
-\item {\bf\emph{Utilities}}:
-\begin{itemize}
-\item \bbfy generates the \CPP code of a black box from a
-description file written in \texttt{xml}.
-%\item \bbdoc generates the html documentation of a black box package
-%(author, description, description of its black boxes:
-%author, description, inputs, outputs, and so on).
-\item \bbCreatePackage allows to create the basic file architecture
-to start the development of a new black box package.
-\end{itemize}
-\end{itemize}
-
The general architecture of \BBTK
is shown in figure \ref{bb-architecture}.
\subsection{Structure of this guide}
% ==========================================
-This guide is divided into two parts.
+This guide is divided into three parts.
-The first part (\ref{bbi})
+The first part (\ref{bbStudio}) is a brief presentation of the very intuitive Development
+environment, \bbStudio.
+
+The second part (\ref{bbi})
is devoted to the use of the \emph{black box interpreter} \bbi.
This is the highest level of use of the toolkit, which
allows to create and execute processing chains by connecting
black boxes of existing packages.
-The second part (\ref{cpp}) explains how to
+The third part (\ref{cpp}) explains how to
use the black box toolkit framework in \CPP code,
typically to develop large applications which
involve complex graphical interfaces.
-
+
% ==========================================
% ==========================================
% ==========================================
% ==========================================
\vspace{0.5cm}\hrule
-\section{The black box interpreter (bbi)}
-\label{bbi}
-% ==========================================
+\section{The Development environment (bbStudio)}
+\label{bbStudio}
+
+Just run it, typing in a console \texttt{bbed}.
+You'll get something like in figure
+\ref{bbi-fig-bbStudio-gui}
+(the exact appearance of \bbStudio is system and \bbtk version dependent)
+\begin{figure}[!ht]
+\caption{\label{bbi-fig-bbStudio-gui}The bbStudio Development environment interface}
+\begin{center}
+\includegraphics[width=0.7\textwidth]{bbStudioMainPage.png}
+\end{center}
+\end{figure}
+
+All the entries of this Help 'bookmark' are self-explanatory :
+
+ \begin{itemize}
+ \item {\bf\emph{Wiki}}: Direct link to the bbtk Wiki (intranet only, right now, www
+ later).
+ \item {\bf\emph{Demo}}: Link to some demonstrations.
+ \item {\bf\emph{User's Guide}}: Step to step How-to for user who just wants to create his own
+ application, just using already existing boxes.
+ \item {\bf\emph{Package Developper's Guide}}: Step to step How-to for user who wants to create his own
+ black boxes.
+ \item {\bf\emph{Developper's Guide}}: Sorry, not yet written.
+ \item {\bf\emph{Reference Manual}}: Sorry, not yet written.
+ \item {\bf\emph{Doxygen Documentation}}: Doxygen source browser.
+ \item {\bf\emph{Boxes}}: Box retrieving on various criterions :
+ \begin{itemize}
+ \item {\bf\emph{By name}}
+ \item {\bf\emph{By package}}
+ \item {\bf\emph{By category}}
+ \end{itemize}
+ \end{itemize}
+
+% ==========================================
+% ==========================================
% ==========================================
-%\subsection{Structure of this part}
% ==========================================
+% ==========================================
+% ==========================================
+\vspace{0.5cm}\hrule
+\section{The script manager}
+\label{bb0}
+% ==========================================
+
+ Call it with the bookmark \emph{File}.
+
+
+\begin{figure}[!ht]
+\caption{\label{bbi-fig-bbStudio-file0}The bbStudio script manager}
+\begin{center}
+\includegraphics[width=0.7\textwidth]{bbFile0.png}
+\end{center}
+\end{figure}
+
+Using the lower tool bar, you can :
+ \begin{itemize}
+ \item {\bf\emph{new}}: Create a newfile to hold a script
+ \item {\bf\emph{open}}: Open a already existing file holding a script
+ \item {\bf\emph{close}}: Close a file holding a script
+ \item {\bf\emph{close}}: Save he current file (if modified)
+ \item {\bf\emph{save as}}: Save he current file under a different name
+ \item {\bf\emph{execute}}: Execute the script you just loaded/modified/written
+ \end{itemize}
-Using the black box interpreter is very simple.
+
+The script language is very simple.
Everything is done with only a few commands.
The philosophy of this part is also very simple:
it introduces the \bbi commands using examples,
\subsubsection{Creating and executing black boxes}
% ==========================================
-To run the black box interpreter,
+To learn interactivelly the script language features, you can use the black box
+interpreter :
open a console and type \texttt{bbi}
or double click on the application icon.
You get a window which looks like the one in figure
\begin{figure}[!ht]
\caption{\label{bbi-fig-bbi-gui}The black box interpreter interface}
\begin{center}
-\includegraphics[width=0.7\textwidth]{bbi-gui.png}
+\includegraphics[width=0.7\textwidth]{bbi-gui0.png}
\end{center}
\end{figure}
The 'Command' tab is subdivided into two parts :
one single line zone at the bottom in which you can enter your commands and
one multiple line zone in which \bbi prints out the result of your commands.
-
+, just using already existing boxes.
Try typing in the input zone (in this manual,
-the commands entered by the user will be preceded by a prompt '(>)') :
+the commands entered by the user will be preceded by a prompt \textgreater) :
\begin{verbatim}
> help
\end{verbatim}
quit
reset
set
- unload
+ unload
\end{verbatim}
To get help on a particular command type \texttt{help <command-name>},
\item A particular black box type (with full description) if you type \texttt{help <box-type-name>}. In particular, \texttt{help workspace} displays information on the content of the \texttt{'workspace'} black box, which stores the boxes created by the user (by \texttt{new}).
\end{itemize}
%\item \texttt{list} displays the list of black box instances created so far (by \texttt{new}).
-\item \texttt{new} creates an instance of a black box.
-\item \texttt{set} sets the value of an input of a black box.
+\item \texttt{new} : creates an instance of a black box.
+\item \texttt{set} : sets the value of an input of a black box.
\item In all \bbi, to reference the input called \texttt{i}
of a black box called \texttt{b} you must type \texttt{'b.i'}.
The same syntax holds for outputs.
-\item \texttt{print} prints a string, substituting each substring of the form \$b.o\$ by the value of the output \texttt{o} of the black box \texttt{b}. Note that an
+\item \texttt{print} : prints a string, substituting each substring of the form \$b.o\$ by the value of the output \texttt{o} of the black box \texttt{b}. Note that an
implicit trailing 'new line character' is added at the final string.
-\item \texttt{exec} runs the process of a box if needed.
-\item \texttt{quit} quits \bbi.
+\item \texttt{exec} : runs the process of a box if needed.
+\item \texttt{quit} : quits \bbi.
\end{itemize}
\hrule
% ==========================================
\label{bbi-connecting-black-boxes}
% ==========================================
-LG : THE GUIDE IS UP TO DATE UNTIL HERE
-
\BBTK allows to create
and execute processing chains,
also called \emph{pipelines},
\end{center}
\end{figure}
+
The \bbi instructions to create and execute this pipeline are:
\begin{verbatim}
> new Add a
\end{verbatim}
The first three commands build the pipeline,
-the next three set its inputs and the last one
-executes it and prints its output.
+the next three set \texttt{a} and \texttt{b} black boxes inputs and the last one
+executes the pipeline and prints \texttt{b} black boxe output.
The command \texttt{'connect a.Out b.In1'} ``plugs'' the output
\texttt{Out} of the box \texttt{a} into the input \texttt{In1} of the
Of course, to be able to connect two boxes,
the output and the input must be compatibles.
You can always connect an output to an input of the \emph{same} type,
-but you can do more, thanks to particular black boxes called {\bf adaptors}.
+but you can do more, thanks to particular (hidden) black boxes called {\bf adaptors}.
An adaptor is a black box which has at least one input, called \texttt{In},
and at least one ouput called \texttt{Out} and whose role is to convert
\end{verbatim}
+As a side note, we can say that, for consistency reasons, it would have been better to name
+\texttt{In1}, \texttt{In2} and \texttt{In3} the inputs of the black box \texttt{Add3},
+since all the 'natural entry' of a box is named \texttt{In}, or\texttt{In}x if there are more than one 'natural
+entry'.
+
% ==========================================
\hrule
\paragraph{Summary}
Doing this, you start writing \bbi scripts.
The conventionnal extension for such scripts is \texttt{bbs}
(black box script).
+For consistency reasons, you are requested to prepend \texttt{bb} to the name.
For example, the \texttt{Add3} complex box we previously worked on
-can be defined in the \texttt{Add3.bbs} file:
+can be defined in the \texttt{bbAdd3.bbs} file:
-\begin{file}{Add3.bbs}
+\begin{file}{bbAdd3.bbs}
\begin{verbatim}
# Defines the Add3 black box which adds 3 doubles
load std
To use this file in \bbi, use the \texttt{include} command:
\begin{verbatim}
-> include Add3.bbs
+> include bbAdd3.bbs
> help Add3
Complex Black Box <user::Add3>
adds 3 doubles
Of course, you can include script files in other script files,
like in the following example:
-\begin{file}{Add4.bbs}
+\begin{file}{bbAdd4.bbs}
\begin{verbatim}
# Defines the Add4 black box which adds 4 doubles
include Add3
\end{verbatim}
\end{file}
-TO DO:
+% ==========================================
+\hrule
+\paragraph{Naming Conventions}
+%\hrule
-- naming conventions: one cbb per file with the same name
-- search paths
+\hrule
+% ==========================================
+\begin{itemize}
+\item
+File names:
+For consistency reasons, you are requested to prepend \texttt{bb}, and postpone an extention \texttt{.bbs},
+to the names of the files that hold a \texttt{complex black box} definition.
+For example, the \texttt{Add3} complex box we previously worked on
+can be defined in the \texttt{bbAdd3.bbs} file.
+\item
+Search Paths
+\end{itemize}
% ==========================================
\hrule
+
\paragraph{Summary}
%\hrule
\begin{itemize}
\item The \texttt{include} command allows to include a script file in \bbi.
-\item Lines starting with a \texttt{\#} are treated as comments in \bbi scripts.
+\item Lines starting with a \texttt{\#} or with a \texttt{\//} are treated as comments in \bbi scripts.
+\item Lines between a line starting with a \texttt{\//*} an a line starting with a \texttt{*\//} are treated as comments in \bbi scripts.
\end{itemize}
+
\hrule
% ==========================================
\label{bbi-widget}
% ==========================================
+% ==========================================
+\subsubsection{Overwiew}
+\label{bbi-overview}
+% ==========================================
+
If \bbi is compiled in graphical mode
(option \texttt{BUILD\_bbi\_GRAPHICAL} of \cmake, requires \wx),
then you can use special black boxes which are
As first example, type the following commands in \bbi:
\begin{verbatim}
> load wx
-> new TextCtrl t
+> new InputText t
> print $t.Out$\n
\end{verbatim}
Type \texttt{help wx}, you get something like:
\begin{verbatim}
-Package wx v1.0.0- info-dev@creatis.insa-lyon.fr
- Basic graphical interface elements (slider, button ...) based on wxWidgets
- Black boxes:
- Button : Button that gives a string
- ColourSelectorButton :
- ColourSelector : Colour Selector widget (wxColourDialog)
- CommandButton :
- DirectorySelector :
- FileSelector : FileDialog widget (wxFileDialog)
- InputText : TextCtrl widget (wxTextCtrl)
- LayoutLine : Sizer widget (wxSizer)
- LayoutSplit : Split widget (wxSplitterWindow)
- NoteBook :
- OutputText : wxWidget Static text
- RadioButton : RadioButton group widget (wxRadioButton) 0-9 entries
- Slider : Slider widget (wxSlider)
-
+ Package wx v1.0.0- info-dev@creatis.insa-lyon.fr
+ Basic graphical interface elements (sliders, buttons ...) based on wxWidgets
+ Black boxes :
+ ColourSelector : Colour Selector dialog (bbfication of wxColourSele...
+ ColourSelectorButton : A button which displays a colour picker dialog whe...
+ CommandButton : Button which executes bbi commands
+ DirectorySelector : Pops up a directory selection dialog (wxDirDialog)
+ FileSelector : Pops up a file selection dialog for reading or sav...
+ InputText : A zone in which the user can enter a text (wxTextC...
+ LayoutLine : LayoutLine widget (wxBoxSizer)
+ LayoutSplit : Widget which splits a window in two fixed size par...
+ LayoutTab : LayoutTab widget (wxNotebook)
+ OutputText : Text zone to be inserted into a window (wxStaticTe...
+ RadioButton : RadioButton group widget 0-9 entries
+ Slider : Slider widget (wxSlider)
\end{verbatim}
You can reproduce the same experiment as above using a
-\texttt{Slider} or a \texttt{FileDialog} rather than a \texttt{TextCtrl}.
+\texttt{Slider} or a \texttt{FileDialog} rather than a \texttt{InputText}.
See the files \texttt{test*.bbs} in the \texttt{scripts/test} directory.
There are two kind of widgets: ``terminal'' widgets and ``container'' widgets.
-The \texttt{TextCtrl}, \texttt{FileDialog} or \texttt{Slider} widgets
+The \texttt{InputText}, \texttt{FileDialog} or \texttt{Slider} widgets
are ``terminal'' widgets.
-``container'' widgets are of another kind: they are made to
+``container'' widgets are of another kind: they are designed to
contain other widgets in order to build larger dialog boxes.
-For example, the \texttt{Split} widget is a container which
+For example, the \texttt{LayoutSplit} widget is a container which
``splits'' horizontally a window into two parts,
each part including another widget.
The size of the two parts can be adjusted by the user thanks
new Slider s1
new Slider s2
-new Split s
-connect s.Child s1.Parent
-connect s.Child s2.Parent
+new LayoutSplit s
+connect s1.Widget s.Widget1
+connect s2.Widget s.Widget2
print s1=$s1.Out$\\n
print s2=$s2.Out$\\n
\end{file}
First, the two sliders \texttt{s1} and \texttt{s2} are created.
-A \texttt{Split} box \texttt{s} is also created.
+A \texttt{LayoutSplit} box \texttt{s} is also created.
The \texttt{connect} commands then ``includes'' the sliders in the
split ``container''.
-The input \texttt{Parent} is common to all widget boxes:
+The input \texttt{Widget} is common to all widget boxes:
every widget can be inserted into another widget.
-The output \texttt{Child} is specific of \emph{container}
+The outputs \texttt{Widget1},\texttt{Widget2} are specific of \emph{container}
widgets
(in \bbi type \texttt{help Slider}:
-you will see the input \texttt{Parent};
-type \texttt{help Split}:
-you will see the input \texttt{Parent}
-and the output \texttt{Child}).
-When you connect the \texttt{Child} output of a container
-to the \texttt{Parent} input of a widget,
+you will see the output \texttt{Widget};
+type \texttt{help LayoutSplit}:
+you will see the inputs \texttt{Widget1} and \texttt{Widget2}
+and the output \texttt{Widget}).
+When you connect the \texttt{Widget} output of a container
+to the \texttt{Widget}i input of a widget,
you order to include the widget in the container.
Of course, the order of connection is important.
In our case, the slider \texttt{s1} is included first,
then the slider \texttt{s2}: \texttt{s1} will be placed
-on top of \texttt{s2} (the \texttt{Split} box is
+on top of \texttt{s2} (the \texttt{LayoutSplit} box is
implemented that way, but this is arbitrary choice).
-For the moment, there are only \emph{two} container widgets in the \texttt{wx} package:
-the \texttt{Split} widget we just described and the \texttt{Sizer}
-widget, which can have multiple children and
+Right now, there are only \emph{three} container widgets in the \texttt{wx} package:
+the \texttt{LayoutSplit} widget we just described, the \texttt{LayoutLine} , and the \texttt{LayoutTab}
+widget.
+
+The \texttt{LayoutLine} widget can have multiple children and
divides its window into as much parts as children,
each part of equal size.
-The orientation of the sizer can be changed by the input \texttt{Orientation}.
+The orientation of the \texttt{LayoutSplit} or of the \texttt{LayoutLine} can be changed by the input \texttt{Orientation}.
See the example \texttt{test/testSizer.bbs}.
With only those two containers you can already create
complex dialog boxes (of course containers can be nested, which
leads to tree-like structures of widgets).
-See the script \texttt{test/testSizerSplit.bbs} for an example.
+See the script \texttt{bbtk/share/bbtk/bbs/wx/appli/ExampleLayoutSplit.bbs} for an example.
+
+The \texttt{LayoutTab} widget is based on the \texttt{wxNotebook.}
One word about a special widget in the package \texttt{wx}:
the \texttt{Button}... to be continued.
+% ==========================================
+\subsubsection{Deeper in the boxes}
+\label{bbi-deep-box}
+% ==========================================
+
+Any widget box has two mandatory Outputs :
+
+\begin{itemize}
+ \item {\bf\emph{Widget}} : that is the \texttt{wxWindow} itself. If it's not connected to the \texttt{Widget}\emph{i} of any \emph{Layout box}, it
+ will popup. If it's connected to the\bf{Widget}\bf\emph{i} of any \texttt{Layout box}, it will be embedded in its parent window.
+ \item {\bf\emph{Boxchange}} : Signals any modification of the box. This output may be connect if necessary to the \emph{BoxExecute} of an other box,
+ further within the execution pipeline.
+\end{itemize}
+
+Any widget box has two mandatory Inputs :
+\begin{itemize}
+ \item {\bf\emph{BoxExecute}} : Any signal received by this input executes the box
+ \item {\bf\emph{BoxProcessMode}} : Sets the processing mode of the box :
+ \begin{itemize}
+ \item {\bf\emph{Pipeline}} : bbUpdate() only calls Process if Status == MODIFIED (normal pipeline processing)
+ \item {\bf\emph{Always}} : bbUpdate() always calls Process
+ \item {\bf\emph{Reactive}} : bbSetModifiedStatus() calls bbUpdate()
+ \end{itemize}
+\end{itemize}
+
+Any widget box has five Inputs, that will be dealt with only if the box is not connected to the \emph{Widget}i of any \emph{Layout box} :
+\begin{itemize}
+ \item {\bf\emph{WinHeight}} : Height of the window
+ \item {\bf\emph{WinWidth}} : Width of the window
+ \item {\bf\emph{WinTitle}} : Title of the window
+ \item {\bf\emph{WinClose}} : Any received signal closes the window
+ \item {\bf\emph{WinHide}} : Any received signal hides the window
+ \item {\bf\emph{WinDialog}} : When set to 'true', creates a \emph{dialog window}, that blocks the pipeline until it is closed (\emph{modal})
+\end{itemize}
+
+
+Any \emph{Layout box} (i.e. \emph{LayoutLine}, \emph{LayoutSplit} or \emph{LayoutTab}) has at one or more mandatory Inputs :
+\begin{itemize}
+ \item \bf{Widget}\bf{\emph{i}} : e.g. a \emph{LayoutSplit} box (Widget which splits a window in two fixed size parts)
+ has two Input parameters \emph{Widget1} and \emph{Widget2}, used to embed the child windows.
+\end{itemize}
+
+
TO DO:
\begin{enumerate}
\label{bbi-more-on-packages}
% ==========================================
+There are various others user-intended packages :
+
+\paragraph{vtk}
+It contains some vtk based image processing filters :
+% \begin{enumerate}
+ \subparagraph{AppendPolyData}
+ Appends one of more polygonal datasets into a single polygonal dataset
+ \subparagraph{ConeSource}
+ Creates a Cone
+ \subparagraph{ImageAnisotropicDiffusion3D}
+vtkImageAnisotropicDiffusion3D diffuses an volume iteratively.
+The neighborhood of the diffusion is determined by the instance flags.
+if 'Faces' is on, the 6 voxels adjoined by faces are included in the neighborhood.
+If 'Edges' is on the 12 edge connected voxels are included, and if 'Corners' is on, the 8 corner connected voxels are included.
+'DiffusionFactor' determines how far a pixel value moves toward its neighbors, and is insensitive to the number of neighbors chosen.
+The diffusion is anisotropic because it only occurs when a gradient measure is below 'GradientThreshold'.
+Two gradient measures exist and are toggled by the 'GradientMagnitudeThreshold' flag.
+When 'GradientMagnitudeThreshold' is on, the magnitude of the gradient, computed by central differences, above 'DiffusionThreshold' a voxel is not modified.
+The alternative measure examines each neighbor independently.
+The gradient between the voxel and the neighbor must be below the 'DiffusionThreshold' for diffusion to occur with THAT neighbor.
+ \subparagraph{ImageCharacteristics}
+ Exports objet sizes, and Spacings
+ \subparagraph{ImageDilateErode3D}
+ Dilates one value and erodes another.
+ vtkImageDilateErode3D will dilate one value and erode another.
+ It uses an elliptical foot print, and only erodes/dilates on the boundary of the two values.
+ The filter is restricted to the X, Y, and Z axes for now.
+ It can degenerate to a 2 or 1 dimensional filter by setting the kernel size to 1 for a specific axis.
+ (bbfication of vtkImageDilateErode3D)
+ \subparagraph{ImageGaussianSmooth}
+ Performs a gaussian convolution of the input image
+ \subparagraph{ImagePlanes}
+Creates three 3D planes with the input image mapped onto with which the user can interact.
+The output vtkImagePlaneWidget objects are to be inserted into a 3D scene (e.g. a Viewer3D
+ \subparagraph{IsoSurfaceExtractor}
+Extracts an iso-surface of a 3D image and creates a vtkProp3D object to insert into a 3D scene (e.g. a Viewer3D
+ \subparagraph{MarchingCubes}
+ Extracts an iso-surface of an image using the marching cubes algorithm (bbfication of vtkMarchingCubes
+ \subparagraph{MIPCreator}
+Creates a Maximum Intensity Projection (MIP) view of a 3D image.
+Creates a vtkProp3D object to insert into a 3D scene (e.g. a Viewer3D
+ \subparagraph{MetaImageReader}
+Reads .mhd / .mhd image formats (bbfication of vtkMetaImageReader)
+ \subparagraph{SegmentationConnectivity}
+Segmentation with min max threshold and connectivity
+ \subparagraph{SphereSource}
+ Creates a Sphere
+% \end{enumerate}
+
+\paragraph{itk}
+It contains some itk based image processing filters :
+
+ \subparagraph{BinaryThresholdImageFilter}
+ Binarizes an image by thresholding (generic bbification of itk::BinaryThresholdImageFilter)
+ \subparagraph{DICOMSeriesFileNames}
+ Reads a series from a DICOM directory as a 3D itk image
+ \subparagraph{ExtractImageFilter}
+ Decrease the image size by cropping the image to the selected region bounds (bbification of itk::ExtractImageFilter)
+ \subparagraph{ImageProperties}
+ Outputs different properties of an image (type, dimension, size, spacing, ...)
+ \subparagraph{ImageRegion}
+Creates a generic ImageRegion (bbtk::any) from two vectors providing the index and size of the region.
+The dimension D of the actual itk::ImageRegion created is the max of the sizes of Index and Size
+(the smallest vector is padded by zeros)
+ \subparagraph{ImageReader}
+Generic itk image reader
+ \subparagraph{ImageWriter}
+Generic itk image writer
+ \subparagraph{ImageSeriesReader}
+Generic itk image series reader.
+ \subparagraph{ResampleImageFilter}
+Resamples an image
+\paragraph{itkvtk}
+It doesn't contain any end user intended box, only adaptors : to convert a generic itkImage to a vtkImageData, and vtkImageData* to a generic itkImage pointer
+
+Sorry nothing is done, right now for meshes.
+
+\paragraph{wxvtk}
+It contains two atomic black boxes, and some sophisticated complex black boxes :
+
+ \subparagraph{Viewer2D}
+ Receives a \textless vtkImageData* \textgreater (In), an Orientation(0:yz / 1:xz / 2:xy), and a initial slice number (Slice).
+ Returns a \textgreater vtkRenderer* \textgreater (Renderer)
+
+ \subparagraph{Viewer3D}
+ Receives up to 5 Input Actors (\textless vtkProp3D* \textgreater), up to 5 Imput Observers (\textless vtkInteractorObserver* \textgreater),
+ outputs an Interactor (\textless wxVTKRenderWindowInteractor* \textgreater) with which vtk widgets can interact,
+ and a Renderer (\textless vtkRenderer* \textgreater) to which actors can be added.
+ Has also a boolean 'Stereo' option, to use Red-Blue filter.
+
+ \subparagraph{Viewer3D}
+
+
% ==========================================
\subsubsection{Pipeline processing}
\label{bbi-more-on-pipeline-processing}