\tableofcontents
% ==========================================
+\listoftables
+
+\listoffigures
% ==========================================
%\section*{Abstract}
\emph{``any component in a system in which only the input and output
characteristics are of interest, without regard to its internal mechanism
or structure''}.
+I would add something very important to this definition :
+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 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 provides a systematic framework
to encapsulate (or ``wrap'') any
method allows, say, to set a particular input or
get a particular output of the box.
One can use a black box in a purely abstract way.
-\item{\bf symbolic} means a particular
+\item{\bf symbolic} means that a particular
input or output is referenced by a 'name', that is by a symbol
which identifies the input or output.
It also means that symbolic information (text!) is
Of course, symbolic data attached to box can be
{\bf queried}: what are the inputs/outputs of the box ?
-what are their type ? description ? etc.
+what are their type ? their description ? etc.
This allows {\bf automatic documentation} of boxes.
The abstract definition of black boxes is the most basic
\BBTK provides one: \bbi (the Black Box Interpreter).
\item {\bf Automatic documentation} of existing packages.
\texttt{html} documentation of packages is proposed by
-the \bbdoc application.
+\bbi.
\end{itemize}
Finally, these different components allow {\bf efficient}:
\begin{itemize}
-\item {\bf capitalization and reuse} of existing processings,
+\item {\bf capitalization and reuse} of existing processing units,
including {\bf documentation}
\item {\bf testing, prototyping} in a very simple script language
\item {\bf inter-operability} between atomic processings which
% ==========================================
\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.
-\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 creates a directory on disk which contains the basic files to start the development of a new black box package.
-\end{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.
+ \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}
-
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{bb0})
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 \bbStudio
+or clicking on its icon or its menu entry.
+At start, \bbStudio opens with the 'Help' tab selected.
+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}
+
+The 'Help' tab of \bbStudio is used to browse the html help of \BBTK.
+All the entries of the starting page 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}} (see table : \ref{bbi-list_of_packages})
+ \item {\bf\emph{By category}} (see table :\ref{categories})
+ \item {\bf\emph{Adaptors}} Used internaly to perform type conversions (not end user intended)
+ \end{itemize}
+ \end{itemize}
+
+
% ==========================================
+\begin{table}[!ht]
+\caption{\label{bbi-list_of_packages} List of bbtk supplied packages.}
+\small
+\begin{tabular}{|lp{10cm}|}
+\hline
+Package & What it's used for \\ \hline
+\texttt{std} & : the 'standard' package including basic useful boxes \\ \hline
+\texttt{wx} & : basic graphical interface elements (widgets: sliders, buttons, etc. based on the \texttt{wxWidgets} library \\ \hline
+\texttt{itk} & : the basic image processing package, based on the \texttt{itk} library. (without description)\\ \hline
+\texttt{vtk} & : Prints help on the package \texttt{package-name} and its boxes (with brief description). The package must have been previously loaded\\ \hline
+\texttt{wxvtk} & : widget boxes based on the \texttt{vtk} library.\\ \hline
+\texttt{itkvtk} & : boxes to convert \texttt{itk} structures into \texttt{vtk} structures and conversally.\\ \hline
+\end{tabular}
+\end{table}
% ==========================================
-%\subsection{Structure of this part}
+
+
+
+
% ==========================================
+\begin{table}[!ht]
+\caption{\label{categories} \texttt{Black Box} categories}
+\small
+\begin{tabular}{|lp{10cm}|}
+\hline
+ \texttt{Category name} & : Meaning \\ \hline \\ \hline
+ \texttt{adaptor} & : Adaptor box \\ \hline
+ \texttt{application} & : Final application, end user intended \\ \hline
+ \texttt{atomic box} & : System category.
+ 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}
+
+% ==========================================
+
+\begin{table}[!ht]
+\caption{\label{kinds} \texttt{Black Box} kinds}
+\small
+\begin{tabular}{|ll|}
+\hline
+\texttt{Kind name} & : Meaning \\ \hline \\ \hline
+\texttt{ADAPTOR} & : Adaptor Box \\ \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}
+
+
-Using the black box interpreter is very simple.
-Everything is done with only a few commands.
+% ==========================================
+% ==========================================
+% ==========================================
+% ==========================================
+% ==========================================
+% ==========================================
+\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{figure}[!ht]
+\caption{\label{lowertoolbar}The lower tool bar}
+\begin{center}
+\includegraphics[width=0.7\textwidth]{lowertoolbar.png}
+\end{center}
+\end{figure}
+
+
+ \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{save}}: 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}
+
+
+The script language is very simple.
+Everything is done with only a very few commands (See table \ref{bbi-reference-box}).
The philosophy of this part is also very simple:
it introduces the \bbi commands using examples,
starting with the most simple commands.
\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 message and a prompt:
-\begin{verbatim}
-$$ bbi
-BBI (Black Box Interpreter) - bbtk "1.0.0" - (c) Creatis 2007
->
-\end{verbatim}
+You get a window which looks like the one in figure
+\ref{bbi-fig-bbi-gui}
+(the exact appearance of \bbi is system and \bbtk version dependent)
+\footnote{If you compiled \bbtk without \wx then \bbi does not have a
+graphical interface but a simple prompt}.
-If you type:
+\begin{figure}[!ht]
+\caption{\label{bbi-fig-bbi-gui}The black box interpreter interface}
+\begin{center}
+\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 \textgreater) :
\begin{verbatim}
> help
\end{verbatim}
\begin{verbatim}
Available commands:
author
+ category
config
connect
+ debug
define
delete
description
endefine
+ endpackage
exec
graph
help
include
+ index
input
+ kind
load
message
new
+ newgui
output
+ package
print
quit
reset
Complex Black Box <user::workspace>
User's workspace
By: bbi (internal)
+ Category(s) : complex box;
* No inputs
* No outputs
* No boxes
To load it, type:
\begin{verbatim}
-> load std
+> include std
\end{verbatim}
Then if you type:
\begin{verbatim}
std
Add
- ...
+ ConcatStrings
+ Configuration
+ Div
+ ...
+ StringRelay
+ StringSelect
user
workspace
>
\end{verbatim}
Now \bbi knows the package \texttt{std} and the black boxes it provides,
-such as the \texttt{'Add'} box. Remark that the
+such as the \texttt{'Add'} box, the \texttt{'ConcatStrings'}. Remark that the
content of \texttt{std} may vary from one version to another
as new black boxes might be added to it.
If you type:
You get:
\begin{verbatim}
Black Box <std::Add>
- Adds its inputs
- By: laurent.guigues@creatis.insa-lyon.fr
- * Inputs:
- 'In1' <double>: First number to add
- 'In2' <double>: Second number to add
- 'ProcessMode' <int> : Set the process mode of the box (0=Pipeline | 1=Always | 2=Reactive)
- * Outputs:
- 'Out' <double>: Result
+ Adds its inputs
+ By : laurent.guigues@creatis.insa-lyon.fr
+ Categories : atomic box;math;
+ * Inputs :
+ 'BoxExecute' <bbtk::Void> [signal] : Any signal received by this input executes the box
+ 'BoxProcessMode' <String> [] : Sets the processing mode of the box (Pipeline | Always | Reactive)
+ 'In1' <Double> [] : First number to add
+ 'In2' <Double> [] : Second number to add
+ * Outputs :
+ 'BoxChange' <bbtk::Void> [signal] : Signals modifications of the box
+ 'Out' <Double> [] : Result
\end{verbatim}
Like previously,
belongs to the \texttt{std} package.
Then comes a description
(the one which was provided by the author of the box),
-the author(s) of the box (usually e-mail adress(es)).
+the author(s) of the box (usually e-mail adress(es)) and
+the categories to which the box belong.
Finally comes the lists of inputs and outputs of the box.
For each input or output, \bbi provides
its \emph{name} (between quotes, e.g. \texttt{'ProcessMode'}),
-its \emph{type} (between \texttt{<>}, e.g. \texttt{<int>})
+its \emph{type} (between \texttt{<>}, e.g. \texttt{<Int>})
and a description.
Remark that the box \texttt{Add} is not a 'complex' black box
but an 'atomic' box, hence its help does not
The \texttt{'a'} at the end is the \emph{name} of the instance,
which will be used to reference it later.
-It is important to make the difference between box \emph{types}
-and \emph{instances} of box types.
-The \texttt{Add} box of the package \texttt{std} is in fact
-a \emph{type} of box, like \texttt{int} is a type of data
+It is important to distinguish a box \emph{type}
+and an \emph{instance} of a box type.
+The \texttt{Add} box of the package \texttt{std} is actually
+a \emph{box type} , like \texttt{int} is a data type
in \texttt{C} langage. The \texttt{new} command allows to create
an instance of a box type, exactly like \texttt{int i;} in
-a \texttt{C} code declares a variable of type \texttt{int} whose
+a \texttt{C} code, it declares a variable of type \texttt{int} whose
name is \texttt{i}.
Of course, like in \texttt{C} Language, you can declare multiple boxes of the
same type in \bbi.
Complex Black Box <user::workspace>
User's workspace
By: bbi (internal)
+ Category(s) : complex box;
* No inputs
* No outputs
* Boxes:
'a' <std::Add>
\end{verbatim}
-which means that \bbi's workspace now contains a black box
-of type \texttt{std::Add} and name \texttt{a}.
+which means that \bbi workspace now contains a black box named \texttt{a},
+of type \texttt{std::Add}.
Now look back at the help on \texttt{Add} boxes:
you can see that this type of box has two inputs,
\item Converts the output of the box to a string if possible
(see below)
\item Substitutes the result in the string to print
+\item postpone an implicit 'new line' character to the string
\end{enumerate}
+\paragraph
Box processing is needed if:
\begin{itemize}
\item at least input has changed since last processing or
-\item the input \texttt{'ProcessMode'} of the box is set to
-\texttt{1}, which forces box reprocessing.
+\item the input \texttt{'BoxProcessMode'} of the box is set to
+\texttt{'Always'}, which forces box reprocessing.
\end{itemize}
-Note that all boxes have the input \texttt{'ProcessMode'}.
+Note that all boxes have the input \texttt{'BoxProcessMode'}.
Another way to process the box \texttt{a} is to issue the command:
\begin{verbatim}
\paragraph{Summary}
%\hrule
\begin{itemize}
-\item The \texttt{load} command allows to load a package.
+\item The \texttt{include} command allows to load a package, and the complex black boxes that come with it..
\item \texttt{help} gives help on:
\begin{itemize}
\item Available commands if you just type \texttt{help}.
\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}.
-\item \texttt{exec} runs the process of a box if needed.
-\item \texttt{quit} quits \bbi.
+\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.
\end{itemize}
\hrule
+
+\paragraph{Note :}
+A more 'modern' way to proceed is to run \texttt{bbStudio}, drag and drop the \texttt{Command} bookmark to the lower \texttt{Welcome to bbStudio!} bar.
+Wou'll get something like in figure \ref{bbCommandPlusHelp} :
+
+\begin{figure}[!ht]
+\caption{\label{bbCommandPlusHelp}
+An other way to run the command interpreter}
+\begin{center}
+\includegraphics[width=0.5\textwidth]{bbCommandPlusHelp.png}
+\end{center}
+\end{figure}
% ==========================================
% ==========================================
First start \bbi and load the package \texttt{std}:
\begin{verbatim}
-$$ bbi
-BBI (Black Box Interpreter) - bbtk "1.0.0" - (c) Creatis 2007
-> load std
+> include std
\end{verbatim}
Assume you want to compute $1+2+3$. You can do it by
\end{center}
\end{figure}
+
The \bbi instructions to create and execute this pipeline are:
\begin{verbatim}
> new Add a
> set a.In2 2
> set b.In2 3
> print $b.Out$
+\end{verbatim}
+
+You will see the (very expected) result :
+\begin{verbatim}
6
\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
+prints \texttt{b} black boxe output (the pipeline is executed before printing, because the interpretor 'knows' he box \texttt{b},
+whose output is requested, is not up to date.
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
chains of boxes (see \ref{bbi-more-on-pipeline-processing}
for details).
+
+Lets' consider an other, more image oriented, example :
+
+\begin{verbatim}
+> include vtk
+> include wx
+> include itk
+> include wxvtk
+
+> new FileSelector fileDialog
+> new ImageReader reader
+> new Slider slider
+> new Viewer2D viewer
+
+> connect fileDialog.Out reader.In
+> connect reader.Out viewer.In
+> connect slider.Out viewer.Slice
+> connect slider.BoxChange viewer.BoxExecute
+
+> exec viewer
+\end{verbatim}
+
+Some explainations : the \texttt{include} instructions load the necessary packages. \\
+
+\texttt{new FileSelector} will pop a File Selector, at run time, that will out the user chosen file name. \\
+\texttt{new Slider} will pop a Slider, at run time, that will out an integer, used later as a slice number.\\
+\texttt{new ImageReader} will read any itk readable file, whose name is passed as a std::string, and return a itk::ImagePointer.
+\texttt{new Viewer2D} display a plane, whose number id specified by an integer.\\
+\\
+\texttt{connect fileDialog.Out reader.In} plugs the output of the File Selector (a std::string) to the input of the reader (a std::string, too).\\
+\texttt{connect reader.Out viewer.In} plugs the output of the reader (an itk::ImagePointer) to the input of the Viewer (a vtkImageData *)\\
+\texttt{connect slider.Out viewer.Slice} plugs the output of the slider (an int) to an other output (named Slide) of the viewer.\\
+\texttt{connect slider.BoxChange viewer.BoxExecute} says the viewer it must re process itself any time the slider is modified.\\
+\\
+\texttt{exec viewer} processes the viewer.
+
+
+This would correspond to the graph in figure \ref{bbi-simplegraph}
+
+
+\begin{figure}[!ht]
+\caption{\label{bbi-simplegraph}(Very) simple Graph of a (very) simple pipeline}
+\begin{center}
+\includegraphics[width=0.8\textwidth]{bbi-simplegraph.png}
+\end{center}
+\end{figure}
+
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- eduardo.davila/laurent.guigues@creatis.insa-lyon.fr
- Basic graphical interface elements (slider, button ...) based on wxWidgets
- Black boxes:
- Button : Button that gives a string
- FileDialog : FileDialog widget (wxFileDialog)
- RadioButton : RadioButton group widget (wxRadioButton) 0-9 entries
- Sizer : Sizer widget (wxSizer)
- Slider : Slider widget (wxSlider)
- Split : Split widget (wxSplitterWindow)
- StaticText : wxWidget Static text
- TextCtrl : TextCtrl widget (wxTextCtrl)
+ 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
+There are two kinds of widgets: ``terminal'' widgets and ``container'' 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}
+% ==========================================
-TO DO:
-\begin{enumerate}
-\item Make a tour of ``complex'' widgets of wxvtk
-\item Explain the role of ProcessMode to update widgets
-\item Explain the creation of complex widgets (containers, contained...)
-\item Explain the ``control'' mechanism in bbi (switch exec commands, e.g. Button)
-\end{enumerate}
+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 \texttt{Widget}\texttt{\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() calls Process only 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\emph{Widget}}\texttt{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}
% ==========================================
\label{bbi-more-on-packages}
% ==========================================
+There are various others user-intended packages :
+\begin{itemize}
+\item{vtk} \\
+It contains some vtk based image processing filters :
+% \begin{enumerate}
+
+ \paragraph{AppendPolyData}
+ Appends one of more polygonal datasets into a single polygonal dataset
+
+ \paragraph{ConeSource}
+ Creates a Cone
+
+ \paragraph{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.\\
+ Receives : \\
+ - In : an image (vtkImageData*)\\
+ - Diffusion : Difference threshold that stops the diffusion\\
+ Outputs : \\
+ - Out : the isosurface mesh (vtkPolyData*)
+
+ \paragraph{ImageCharacteristics}
+ Exports objet sizes, and Spacings
+
+ \paragraph{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) \\
+ Receives : \\
+ - In : an image (vtkImageData*)\\
+ - DilateValue : The dilatation value\\
+ - ErodeValue : The erosion value\\
+ Outputs : \\
+ - Out : the isosurface mesh (vtkPolyData*)
+
+ \paragraph{ImageGaussianSmooth}
+ Performs a gaussian convolution of the input image\\
+ Receives : \\
+ - In : an image (vtkImageData*)\\
+ - StdDevX : Standard deviation in X direction\\
+ - StdDevY : Standard deviation in Y direction\\
+ Outputs : \\
+ - Out : the isosurface mesh (vtkPolyData*)
+
+ \paragraph{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)
+ Receives : \\
+ - In : an image (vtkImageData*)\\
+ Outputs : \\
+ - PlaneX : the image plane in X direction (vtkImagePlaneWidget*)\\
+ - PlaneY : the image plane in Y direction (vtkImagePlaneWidget*)\\
+ - PlaneY : the image plane in Z direction (vtkImagePlaneWidget*)\\
+
+ Outputs : \\
+ - Out : the isosurface mesh (vtkPolyData*)
+
+ \paragraph{IsoSurfaceExtractor}
+ Extracts an iso-surface of a 3D image and creates a vtkProp3D object to insert into a 3D scene (e.g. a Viewer3D)
+ Receives : \\
+ - In : an image (vtkImageData*)\\
+ - Isovalue : the isosurface value (double)\\
+ - Colour : Surface colour (vector of 3 doubles)
+ Outputs : \\
+ - Out : the isosurface (vtkProp3D**)
+
+ \paragraph{MarchingCubes}
+ Extracts an iso-surface of an image using the marching cubes algorithm (bbfication of vtkMarchingCubes)\\
+ Receives : \\
+ - In : an image (vtkImageData*)\\
+ - Value : the isosurface value (double)\\
+ Outputs : \\
+ - Out : the isosurface mesh (vtkPolyData*)
+
+ \paragraph{MIPCreator}
+ Creates a Maximum Intensity Projection (MIP) view of a 3D image.\\
+ Receives : \\
+ - In : an image (vtkImageData*)\\
+ - Scale : the Gray scale scaling (float) \\
+ - Shift : the Gray scale shift (float) \\
+ Ouputs : \\
+ - Out : The MIP object (vtkProp3D*) to be plugged into a 3D Viever
+
+ \paragraph{MetaImageReader}
+ Reads .mhd / .mhd image formats (bbfication of vtkMetaImageReader) \\
+ Receives : \\
+ - In : the name of the file to be read (std::string)
+ Outputs :
+ - Out : The image (vtkImageData*)
+
+ \paragraph{SegmentationConnectivity}
+ Segmentation with min max threshold and connectivity \\
+ Receives : \\
+ - In : an image (vtkImageData*)\\
+ - PositionXYZ : initial position (std::vector<int>) \\
+ - ThresholdMinMax : min, max threshold values (std::vector<int>) \\
+ Outputs : \\
+ - Out : The image (vtkImageData*)
+
+ \paragraph{SphereSource}
+ Creates a Sphere
+% \end{enumerate}
+
+\item{itk} \\
+It contains some itk based image processing filters :
+
+ \paragraph{BinaryThresholdImageFilter}
+ Binarizes an image by thresholding (generic bbification of itk::BinaryThresholdImageFilter)
+
+ \paragraph{DICOMSeriesFileNames}
+ Reads a series from a DICOM directory as a 3D itk image
+
+ \paragraph{ExtractImageFilter}
+ Decrease the image size by cropping the image to the selected region bounds (bbification of itk::ExtractImageFilter)
+
+ \paragraph{ImageProperties}
+ Outputs different properties of an image (type, dimension, size, spacing, ...)
+
+ \paragraph{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)
+
+ \paragraph{ImageReader}
+Generic itk image reader
+
+ \paragraph{ImageWriter}
+Generic itk image writer
+
+ \paragraph{ImageSeriesReader}
+Generic itk image series reader.
+
+ \paragraph{ResampleImageFilter}
+Resamples an image
+
+\item{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.
+
+\item{wxvtk} \\
+
+It contains two atomic black boxes.
+
+ \paragraph{Viewer2D}
+ Receives : \\
+ - a \textless vtkImageData* \textgreater (In),\\
+ - an Orientation(0:yz / 1:xz / 2:xy),\\
+ - an initial slice number (Slice).\\
+ Outputs :\\
+ - a \textless vtkRenderer* \textgreater (Renderer)
+
+ \paragraph{Viewer3D}
+ Receives :\\
+ - up to 5 Input Actors (\textless vtkProp3D* \textgreater),\\
+ - up to 5 Input Observers (\textless vtkInteractorObserver* \textgreater), \\
+ - a boolean 'Stereo' option, to use Red-Blue filter
+ Outputs :\\
+ - an Interactor (\textless wxVTKRenderWindowInteractor* \textgreater) with which vtk widgets can interact, \\
+ - a Renderer (\textless vtkRenderer* \textgreater) to which actors can be added.
+
+It contains too some sophisticated complex black boxes :
+
+ \paragraph{IsoSurfaceWithControls}
+ Image iso-surface extractor (vtk::IsoSurfaceExtractor) with associated control panel (isovalue, opacity and colour)\\
+ Receives :\\
+ - an initial isovalue (Isovalue)
+ - an initial opacity (Opacity)
+ - an initial colour (Colour)
+ Outputs :\\
+ \textless vtkProp3D* \textgreater (In)\\
+
+ \paragraph{MIPWithControls}
+ Maximum Intensity Projection (MIP) creator (vtk::MIPCreator) with associated control panel (shift and scale) \\
+ Receives :\\
+ - an initial scale (Scale)
+ - an initial shift (Shift)
+ Outputs :\\
+ \textless vtkProp3D* \textgreater (In)\\
+
+\item{wx} \\
+
+Some boxes are the bbfication of usefull xwWidgets, some other ones are more
+sophisticated.
+
+ \paragraph{ColourSelector} Colour Selector dialog (bbfication of wxColourSelector) \\
+ %\begin{verbatim}
+ \texttt{Out} : Colour choosen in format '[0,1] [0,1] [0,1]'
+ %\end{verbatim}
+
+ \paragraph{ColourSelectorButton} A button which displays a colour picker dialog when clicked \\
+ %\begin{verbatim}
+ \texttt{In} :Initial colour \\
+ \texttt{Out} : Colour choosen in format '[0,1] [0,1] [0,1]'
+ %\end{verbatim} \\
+
+ \paragraph{CommandButton} Button which executes bbi commands \\
+ %\begin{verbatim}
+ \texttt{In} : Commands to be executed separated by commas (;). Each single quote (') is replaced by a double quote ("). \\
+ \texttt{Label} : Label of the button \\
+ \texttt{Widget} : Output widget \\
+ %\end{verbatim}
+
+ \paragraph{DirectorySelector} Pops up a directory selection dialog (wxDirDialog)\\
+ %\begin{verbatim}
+ \texttt{DefaultDir} : The default directory\\
+ \texttt{Message} : Message to show on the dialog \\
+ \texttt{Title} : Title of the dialog \\
+ \texttt{Out} : The directory selected by the user\\
+ %\end{verbatim}
+
+ \paragraph{FileSelector} Pops up a file selection dialog for reading or saving (wxFileDialog)\\
+ %\begin{verbatim}
+ \texttt{DefaultDir} : The default directory \\
+ \texttt{DefaultFile} : The default filename \\
+ \texttt{Message} : Message to show on the dialog \\
+ \texttt{OpenSave} : Open for an open dialog (default) / Save for a save dialog\\
+ \texttt{Title} : Title of the dialog \\
+ \texttt{Wildcard} : A wildcard, such as "*.*" or "BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif" \\
+ \texttt{Out} : The file selected by the user \\
+ %\end{verbatim}
+
+ \paragraph{InputText} A zone in which the user can enter a text (wxTextCtrl)\\
+ %\begin{verbatim}
+ \texttt{In} : Initial text (default '')\\
+ \texttt{Title} : Title of the input zone (default '')\\
+ \texttt{WinTitle} : Title of the window (*)\\
+ \texttt{Out} :Current text\\
+ %\end{verbatim}
+
+ \paragraph{LayoutLine} LayoutLine widget (wxBoxSizer)\\
+ %\begin{verbatim}
+ \texttt{Orientation} Orientation (default V), 0=H=HORIZONTAL , 1=V=VERTICAL \\
+ \texttt{Widget}1 widget 1 \\
+ \texttt{Widget2} widget 2 \\
+ \texttt{Widget3} widget 3 \\
+ \texttt{Widget4} widget 4 \\
+ \texttt{Widget5} widget 5 \\
+ \texttt{Widget6} widget 6 \\
+ \texttt{Widget7} widget 7 \\
+ \texttt{Widget8} widget 8 \\
+ \texttt{Widget9} widget 9\\
+ %\end{verbatim}
+
+ \paragraph{LayoutSplit} Widget which splits a window in two fixed size parts (wxSplitterWindow)\\
+ %\begin{verbatim}
+ \texttt{Orientation} : Orientation (default H), 0=H=HORIZONTAL , 1=V=VERTICAL\\
+ \texttt{Proportion} : Proportion (in percent) of the first children in the window\\
+ \texttt{Widget1} : Upper or left widget\\
+ \texttt{Widget2} : Lower or right widget\\
+ %\end{verbatim}
+
+ \paragraph{LayoutTDown} Creates a 'T like' complex container : Down {UpLeft, UpRight} \\
+ %\begin{verbatim}
+ \texttt{Widget1} : UpLeft container\\
+ \texttt{Widget2} : UpRight container\\
+ \texttt{Widget3} : Down container\\
+ \begin{verbatim}
+// ---------------
+// | | |
+// | W1 | W2 |
+// |-------------|
+// | |
+// | W3 |
+// ---------------
+ \end{verbatim}
+
+ \paragraph{LayoutTLeft} Creates a 'T like' complex container : Left {RigthUp, RightDown}\\
+ %\begin{verbatim}
+ \texttt{input} Widget1 : "UpLeft container"\\
+ \texttt{input} Widget2 : "UpRight container"\\
+ \texttt{input} Wigdet3 : "Down container"\\
+ \begin{verbatim}
+// ---------------
+// | | W2 |
+// | W1 | |
+// | |------|
+// | | W3 |
+// | | |
+// ---------------
+ \end{verbatim}
+
+ \paragraph{LayoutTRight} Creates a 'T like' complex container : Right {LeftUp, LeftDown}\\
+ %\begin{verbatim}
+ \texttt{input} Widget1 currentBox.Widget1 "Up container"\\
+ \texttt{input} Widget2 down.Widget1 "DownLeft container"\\
+ \texttt{input} Widget3 down.Widget2 "DownRight container"\\
+ \begin{verbatim}
+// ---------------
+// | | |
+// | W1 | |
+// |------| W2 |
+// | W3 | |
+// | | |
+// ---------------
+ \end{verbatim}
+
+ \paragraph{LayoutTUp} Creates a 'T like' complex container : Up {DownLeft, DownRight} as w1{w2,w3}\\
+ \begin{verbatim}
+ \texttt{ input} Widget1 currentBox.Widget1 "Up"\\
+ \texttt{input} Widget2 down.Widget1 "DownLeft"\\
+ \texttt{input} Widget3 down.Widget2 "DownRight"\\
+
+// ----------------
+// | W1 |
+// | |
+// |------|-------|
+// | W3 | W2 |
+// | | |
+// ----------------
+ \end{verbatim}
+
+ \paragraph{LayoutTab} LayoutTab widget (wxNotebook)\\
+ %\begin{verbatim}
+ \texttt{Orientation} Orientation (default T), 0=T=TOP , 1=R=RIGHT , 2=B=BOTTON , 3=L=LEFT \\
+ \texttt{Widget1} widget 1 \\
+ \texttt{Widget2} widget 2 \\
+ \texttt{Widget3} widget 3 \\
+ \texttt{Widget4} widget 4 \\
+ \texttt{Widget5} widget 5 \\
+ \texttt{Widget6} widget 6 \\
+ \texttt{Widget7} widget 7 \\
+ \texttt{Widget8} widget 8 \\
+ \texttt{Widget9} widget 9 \\
+%\end{verbatim}
+
+ \paragraph{OutputText} Text zone to be inserted into a window (wxStaticText)\\
+ %\begin{verbatim}
+ \texttt{In} Text \\
+ \texttt{Title} Title prepended to the text\\
+ %\end{verbatim}
+
+ \paragraph{RadioButton} RadioButton group widget 0-9 entries\\
+ %\begin{verbatim}
+ \texttt{In} Set initial item \\
+ \texttt{In0} option 0\\
+ \texttt{In1} option 1\\
+ \texttt{In2} option 2\\
+ \texttt{In3} option 3\\
+ \texttt{In4} option 4\\
+ \texttt{In5} option 5 \\
+ \texttt{In6} option 6 \\
+ \texttt{In7} option 7 \\
+ \texttt{In8} option 8 \\
+ \texttt{In9} option 9 \\
+ \texttt{Title} Title of the widget (default '')\\
+ \texttt{Out} Number of the selected Item
+ %\end{verbatim}
+
+ \paragraph{Slider} Slider widget (wxSlider)\\
+ %\begin{verbatim}
+ \texttt{ChangeResolution} Enables the user to change the slider resolution (default FALSE) \\
+ \texttt{In} Initial slider position(default 0) \\
+ \texttt{Label} Show slider labels ? (default FALSE) \\
+ \texttt{Max} Maximum value of the slider (default 500)\\
+ \texttt{Min} Minimum value of the slider (default 0)\\
+ \texttt{Orientation} Orientation : (default H) 0=H=HORIZONTAL, 1=V=VERTICAL\\
+ \texttt{ReactiveOnTrack} Slider sends info when track moves (default 0 = no)\\
+ \texttt{Title} Title shown above the slider (default '')\\
+ %\end{verbatim}
+\end{itemize}
% ==========================================
\subsubsection{Pipeline processing}
\label{bbi-more-on-pipeline-processing}
% ==========================================
-
+\begin{itemize}
+\item the ``control'' mechanism in bbi (switch exec commands, e.g. Button)
+\item the role of ProcessMode to update widgets.
+\end{itemize}
% ==========================================
\subsubsection{Complex black boxes}
\label{bbi-more-on-complex-black-boxes}
+Creation of complex widgets (containers, contained...)
%\subsubsection{Advanced issues}
%\paragraph{Reducing the number of inputs of a box}
If needed the boxes
connected to its inputs
are also processed recursively (pipeline processing).\\ \hline
+\texttt{exec} & \texttt{freeze} &
+ allows to block execution commands while keeping definition commands active.\\ \hline
+\texttt{exec} & \texttt{unfreeze} &
+ turns back to 'normal' mode.\\ \hline
\end{tabular}
\end{table}
% ==========================================
\texttt{load} & \texttt{<package-name>} &
Loads the package \texttt{package-name}\\ \hline
+\texttt{include} & \texttt{<package-name>} &
+Loads the package \texttt{package-name} and includes all the complex black boxes that comes with it \\ \hline
+
+\texttt{kind} & \texttt{<box kind>} &
+Specifies the \texttt{kind} of the complex black boxes you are describing \\ \hline
+
+
+
+
\texttt{unload} & \texttt{<package-name>}&
Unloads the package \texttt{package-name}.
The package must have been previously loaded.
\texttt{endefine} & - &
Ends the definition of a complex black box type\\ \hline
-
\texttt{author} & \texttt{<string>} &
Sets the author(s) of the complex black box currently being defined \\ \hline
Sets the description of the complex black box currently being defined
\\ \hline
-
\texttt{input} & \texttt{<name>} \texttt{<box.input>} \texttt{<help>} &
Defines a new input for the current complex black box,
named \texttt{name}.
It is defined as corresponding to
-the input \texttt{input} of the box \texttt{box}.
+the input \texttt{input} of the box \texttt{box}.
+
\texttt{<help>} is the help string for the new input.
The box \texttt{box} must already have been created in the complex box
and of course have an input named \texttt{input}.
\\ \hline
-
\texttt{output} & \texttt{<name>} \texttt{<box.output>} \texttt{<help>} &
Defines a new output for the current complex black box,
named \texttt{name}.