1 % ==========================================
2 \documentclass[11pt,final,a4paper]{article}
12 {\Huge Package Developers' Guide}
15 \bbtk version \bbtkVersion
19 Last modified on : October 12, 2008 \\
23 Laurent Guigues, Jean-Pierre Roux
26 % ==========================================
28 % ==========================================
34 % ==========================================
36 % ==========================================
38 % ==========================================
39 % ==========================================
41 %\section{Creating your own black boxes}
43 % ==========================================
45 % ==========================================
46 \section{Steps in the creation of new black boxes}
47 % ==========================================
48 Any black box must be included in a \bbtk package,
49 that is in a particular shared library which can be loaded
50 dynamically by \bbtk (hence applications which use \bbtkns,
51 such as the development environment,
55 \item \textbf{Create a new package. }
56 Before defining any black box you
57 have to create a package, or more precisely
58 the source files which will allow you to generate the package
59 (compile and link the shared library) and may be install it.
60 \texttt{bbStudio} does it for you.
65 \item The black boxes you want to create are based on
66 a processing code (\CPP classes or \C functions) which
67 is in an existing project handled by \cmake
68 and you want the new package to be part of your existing project.
69 You will have to create your new package into the source tree of your
71 \item You do not have an already existing project (you want
72 to create the new boxes from scratch) or you want/are imposed
73 that the existing project remain external to the package project.
74 You will have to create your new package in a new location and
75 may be include/link against existing libraries.
77 You'll have to run the standalone application \bbCreatePackagens, that allows
78 to create the basic file architecture
79 to start the development of a new black box package.
81 \item \textbf{Describe your new box. }
82 You can do it either :
84 \item In \CPP code. You will have to write the class for
85 your box, mostly using \bbtk macros.
87 When configuring your project with \cmake,
88 the utility \bbfy will then generate the corresponding \CPP code.
92 You'll have to run the standalone application \bbCreateBlackBox allows to create the basic file architecture
93 to start the development of a new black box, that will be included in an already existing package.
97 % ==========================================
98 \section{Creating a new black box package}
99 % ==========================================
101 Run \texttt{bbStudio}.
103 You'll get something like in fig. \ref{bb-Studio}
106 \caption{\label{bb-Studio} bbStudio}
108 \includegraphics[width=0.6\textwidth]{bbStudio.png}
112 Use the option \texttt{Create package} of the menu \texttt{Tools}.
114 You will be asked to choose the directory where you want to create the package,
115 then you'll get something like in fig. \ref{bbCreatePackage}.
119 \caption{\label{bbCreatePackage} Create Package}
121 \includegraphics[width=0.6\textwidth]{bbCreatePackage.png}
126 That will creates the directory structure and the \texttt{cmake}
127 files necessary to build the project.
129 You must then decide the name of your new package.
130 This name will be used to load the package in \texttt{bbi}.
131 Fill up the form like in fig. \ref{bbFillUpPackageForm}.
135 \caption{\label{bbFillUpPackageForm} Fill up the form}
137 \includegraphics[width=0.6\textwidth]{bbFillUpPackageForm.png}
141 Edit the file \texttt{MyPackage/CMakeLists.txt} to customize your package
144 the file tree obtained is :
147 >tree myPackageFolder
152 |-- PackageConfig.cmake.in
154 |-- UsePackage.cmake.in
166 | | |-- CMakeLists.txt
167 | | `-- header.html.in
170 | |-- DoxyMainPage.txt.in
171 | `-- Doxyfile.txt.in
175 9 directories, 16 files
178 The directory \texttt{MyPackage} is the directory of your new package,
179 in which you will create the files describing your black boxes.
180 But first, you have to customize your new package, by editing the file
181 \texttt{CMakeLists.txt} in the \texttt{MyPackage} directory.
184 \begin{file}{MyPackage/CMakeLists.txt}
187 #===========================================================================
188 # CMAKE SETTINGS FOR BUILDING A BBTK PACKAGE
189 #===========================================================================
191 #===========================================================================
192 # THE NAME OF THE BBTK PACKAGE
193 SET(BBTK_PACKAGE_NAME MyPackage)
194 #===========================================================================
196 #===========================================================================
197 # IF IT IS A STANDALONE PROJECT UNCOMMENT NEXT LINE TO DECLARE YOUR PROJECT
198 # PROJECT(bb${BBTK_PACKAGE_NAME})
199 #===========================================================================
201 #===========================================================================
203 # !!! NO COMMA ALLOWED !!!
204 SET(${BBTK_PACKAGE_NAME}_AUTHOR "myself")
205 #===========================================================================
207 #===========================================================================
208 # PACKAGE DESCRIPTION
209 SET(${BBTK_PACKAGE_NAME}_DESCRIPTION "The kinkiest stuff you ve ever seen.")
210 #===========================================================================
212 #===========================================================================
213 # PACKAGE VERSION NUMBER
214 SET(${BBTK_PACKAGE_NAME}_MAJOR_VERSION 1)
215 SET(${BBTK_PACKAGE_NAME}_MINOR_VERSION 0)
216 SET(${BBTK_PACKAGE_NAME}_BUILD_VERSION 0)
217 #===========================================================================
219 #===========================================================================
220 # UNCOMMENT EACH LIBRARY NEEDED (WILL BE FOUND AND USED AUTOMATICALLY)
221 # SET(${BBTK_PACKAGE_NAME}_USE_VTK ON)
222 # SET(${BBTK_PACKAGE_NAME}_USE_ITK ON)
223 # SET(${BBTK_PACKAGE_NAME}_USE_GDCM ON)
224 # SET(${BBTK_PACKAGE_NAME}_USE_GSMIS ON)
225 # SET(${BBTK_PACKAGE_NAME}_USE_WXWIDGETS ON)
226 #===========================================================================
228 #===========================================================================
229 # LIST HERE THE OTHER bbtk PACKAGES NEEDED
230 # (WILL BE FOUND AND USED AUTOMATICALLY)
231 SET(${BBTK_PACKAGE_NAME}_USE_PACKAGES
238 #===========================================================================
240 #===========================================================================
241 # THE SOURCES OF THE PACKAGE
242 # EITHER UNCOMMENT NEXT LINE TO COMPILE ALL .cxx OF THE src DIRECTORY :
243 SET(${BBTK_PACKAGE_NAME}_COMPILE_ALL_CXX ON)
244 # ... OR LIST THE FILES TO COMPILE MANUALLY :
245 #SET(${BBTK_PACKAGE_NAME}_SOURCES
246 # LIST HERE THE FILES TO COMPILE TO BUILD THE LIB
247 # E.G. TO COMPILE "toto.cxx" ADD "toto" (NO EXTENSION)
248 # THE PATH MUST BE RELATIVE TO THE src FOLDER
250 #===========================================================================
252 #===========================================================================
253 # THE xml SOURCES OF THE PACKAGE
254 # EITHER UNCOMMENT NEXT LINE TO bbfy ALL .xml OF THE src DIRECTORY :
255 SET(${BBTK_PACKAGE_NAME}_COMPILE_ALL_XML ON)
256 # ... OR LIST THE FILES TO COMPILE MANUALLY :
257 #SET(${BBTK_PACKAGE_NAME}_XML_SOURCES
258 # LIST HERE THE FILES TO bbfy TO BUILD THE LIB
259 # E.G. TO bbfy "toto.xml" ADD "toto" (NO EXTENSION)
260 # THE PATH MUST BE RELATIVE TO THE src FOLDER
262 #===========================================================================
264 #===========================================================================
265 # THE SCRIPT-DEFINED BOXES OF THE PACKAGE (bbs)
266 # EITHER UNCOMMENT NEXT LINE TO INCLUDE ALL .bbs OF THE bbs/boxes DIRECTORY :
267 SET(${BBTK_PACKAGE_NAME}_INCLUDE_ALL_BBS_BOXES ON)
268 # ... OR LIST THE FILES TO INCLUDE MANUALLY :
269 # SET(${BBTK_PACKAGE_NAME}_BBS_BOXES
270 # LIST HERE THE bbs FILES TO INCLUDE
271 # E.G. TO INCLUDE "boxes/bbtoto.bbs" ADD "boxes/bbtoto" (NO EXTENSION)
272 # !! THE PATH MUST BE RELATIVE TO THE bbs FOLDER !!
274 #===========================================================================
276 #===========================================================================
277 # THE SCRIPT-DEFINED APPLICATIONS OF THE PACKAGE (bbs)
278 # EITHER UNCOMMENT NEXT LINE TO INCLUDE ALL .bbs OF THE bbs/appli DIRECTORY :
279 SET(${BBTK_PACKAGE_NAME}_INCLUDE_ALL_BBS_APPLI ON)
280 # ... OR LIST THE FILES TO INCLUDE MANUALLY :
281 # SET(${BBTK_PACKAGE_NAME}_BBS_APPLI
282 # LIST HERE THE bbs FILES TO INCLUDE
283 # E.G. TO INCLUDE "appli/testToto.bbs" ADD "appli/testToto" (NO EXTENSION)
284 # !! THE PATH MUST BE RELATIVE TO THE bbs FOLDER !!
286 #===========================================================================
288 #===========================================================================
289 SET(${BBTK_PACKAGE_NAME}_INCLUDE_DIRS
290 # LIST HERE YOUR ADDITIONAL INCLUDE DIRECTORIES
294 # - automatically handled libraries or packages : wx, vtk... (see above)
295 # - the dirs automatically set by other libraries found by FIND_PACKAGE
297 #===========================================================================
299 #===========================================================================
300 SET(${BBTK_PACKAGE_NAME}_LIBS
301 # LIST HERE THE ADDITIONAL LIBS TO LINK AGAINST
302 # EXCEPT : the same libs than for INCLUDE_DIRS
304 #===========================================================================
306 #===========================================================================
307 # IF NEEDED : UNCOMMENT NEXT LINE
308 # AND LIST ADDITIONNAL DIRECTORIES
309 # IN WHICH TO LOOK FOR LIBRARIES TO LINK AGAINST
311 #===========================================================================
313 #===========================================================================
314 # SET TO TRUE TO HAVE INFORMATION ON LIBRARIES FOUND DURING CMAKE CONFIGURE
315 SET(FIND_PACKAGE_VERBOSE TRUE)
316 #===========================================================================
318 #===========================================================================
319 # END OF USER SECTION
320 #===========================================================================
322 #===========================================================================
323 # Include configuration script
324 INCLUDE(Configure.cmake)
325 #===========================================================================
327 #===========================================================================
329 #===========================================================================
334 The comments in the file should be easily understandable !
335 You have to customize the lines which are enclosed
336 between dashed comment lines.
337 In these sections, you can see some of the informations you supplied in previous step:
339 \item The \textbf{name} of your package. This will be the name used to load it in \bbi. The shared library however will be called \texttt{bb}name hence on
340 \lin the object file will be called \texttt{libbb}name\texttt{.so}
341 and on \win it will be called \texttt{bb}name\texttt{.dll}.
342 \item The \textbf{author(s)} of the package. Preferably provide e-mail adresses.
343 \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.
346 In these sections, you can set :
349 \item The \textbf{libraries used} by the package : \vtk, \itk, \gdcm, \gsmis, \wx. The mecanisms to find these libraries, their sources and to link against them are automatically handled by the \cmake files installed by \bbCreatePackage. You just have to uncomment a line to use one of these libraries.
351 \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.
352 \item The \textbf{version} of the package.
353 \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.
354 \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.
355 \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...).
356 \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...).
359 Of course, this is only a framework and you can add any other \cmake commands
362 % ==========================================
363 \section{Creating a new box}
364 % ==========================================
366 % ==========================================
367 \subsection{Principles}
368 % ==========================================
370 \subsubsection{\texttt{C++} or \texttt{XML} ?}
371 There are two ways to create a new black box in an existing package :
373 \item Write an \xml description file which will be automatically
374 translated in \CPP by the \bbfy application (recommanded).
375 \item Write the \CPP code of the box using \bbtk macros.
378 \subsubsection{From which \bbtk class inherit ?}
380 Apart from this choice of the description langage to use,
381 there is an important choice to do concerning the implementation of the box.
382 In \CPP, a black box is nothing but a class which has the standard
383 interface of all black boxes : what's its name ? inputs ? outputs ? and so on.
386 The abstract description of this interface is done in the class
387 \texttt{bbtk::BlackBox} and is implemented in its child classes :
388 \texttt{bbtk::AtomicBlackBox} and \texttt{bbtk::WxBlackBox}
389 \footnote{all the classes of the \bbtk library are in a \emph{namespace}
391 and the \CPP header of a class called \texttt{NameOfAClass} is
392 in the file called \texttt{bbtkNameOfAClass.h}}.
393 To create a new black box, you have to inherit one of these two
394 concrete classes in order to inherit the black box interface and a
395 particular implementation of this interface.
396 If your black box is a \emph{Widget} black box,
397 that is a black box which has (or is)
398 a piece of a graphical interface based on the \wx library,
399 then it must inherit the class \texttt{bbtk::WxBlackBox}.
401 Concretely, a \texttt{bbtk::WxBlackBox} is associated to
402 a \texttt{wxWindow} and must be able to return a pointer to it.
403 If your black box is not a widget black box
404 (that is : doesn't returns a pointer to a \emph{Widget}),
405 it must inherit from \texttt{bbtk::AtomicBlackBox}.\\
406 It returns a \texttt{wxWidget} which can be embedded into the \texttt{wxWindow}.\\
407 In particular, modal dialogs which are created and destroyed at the end of the process method of the box
408 are NOT \texttt{WxBlackBoxes}/
410 \subsubsection{Inherit or encapsulate ?}
412 Now, your black box will do something (hopefully !).
413 When you decide to write a new black box,
414 you should be in one of these three cases :
416 \item You already have a \texttt{C}-like function which
417 does the processing that you wish to 'blackboxify'
418 \item You already have a \CPP class which
419 does the processing that you wish to 'blackboxify'
420 \item You start from scratch without any existing code
423 The idea of \BBTK is to embed processing codes into
424 \CPP objects which have a standard and generic interface -
425 namely black boxes - to be able to chain arbitrary
426 processes afterwards.
428 In \CPP, in order to embed an existing processing \emph{class}
429 into a standard interface you only have two possibilities :
431 \item {\bf Inherit} the existing processing class
432 \emph{and} the interface class (e.g. \texttt{bbtk::AtomicBlackBox}).
433 In this case you have to :
435 \item make the link between the inputs and outputs of the black box
436 and the interface of the inherited class
437 \item call the processing
438 method of the inherited class in the processing method of the black box.
440 \item {\bf Encapsulate} the existing processing class
441 in a class inherited from
442 the interface class (e.g. \texttt{bbtk::AtomicBlackBox}).
443 In this case you have to :
445 \item declare it as a member of the black box,
446 \item instantiate it at the right time
447 (either in the constructor or in the processing method of the black box)
448 \item in the processing method of the black box :
450 \item set the inputs of the member procesing class with the inputs of the black box,
451 \item call the processing method of the encapsulated class
452 \item set the ouputs of the black box with the outputs of the encapsulated
458 If you wish to 'blackboxify' a C-like \emph{function},
459 you do not have the choice, you can only use the second mechanism,
460 namely encapsulation.
462 Obviously, the inheritance mechanism is more powerfull
463 and - when it is possible to use it - it demands less effort
464 because, as we will see, in \bbtk you can directly
465 link the accessors to the input and output data of the box
466 to the accessors of the inherited processing class,
467 as well as the procesing method of the black box
468 to the processing method of the inherited processing class,
469 very much like a callback mechanism.
471 \subsubsection{How to generate a Black Box skeleton}
473 Run \texttt{bbStudio}, choose \texttt{Tools} in the menu bar, option
474 \texttt{Create Black Box}.
475 You will be shown something like in fig. \ref{bbCreateBlackbox} :
478 \caption{\label{bbCreateBlackbox}Create Black Box}
480 \includegraphics[width=0.6\textwidth]{bbCreateBackbox.png}
485 \subsubsection{Informations to provide}
487 Finally, to create a new black box, you will have to give :
489 \item The {\bf name} of the box
490 \item The {\bf package} to which the box belongs (can we do it automatically ? LG : think about it)
491 \item The {\bf author}(s) of the box
492 \item A {\bf description} of the box
494 \item Its {\bf type}, either
496 \item AtomicBlackBox : a basic one, with no special I/O (\texttt{std-template})
497 \item WxBackBox : ouputs a \texttt{wxWindow},
498 \item a VTK Polydata Algorithm Box descendant,
499 \item a VTK Image Algorithm Box descendant
503 \item The output format of the file, either a C++ file or an XML file.
505 %\item $[$Optional$]$ The additional {\bf include files} which are necessary for the code to compile (classes or functions declarations ...)
506 %\item $[$Optional$]$ The other {\bf parent(s)} of the box (which must be known hence their header included)
507 %\item $[$Optional$]$ The {\bf namespace} to which the box belongs
508 %\item The box {\bf inputs} and {\bf outputs}, and for each one :
510 %\item Its {\bf name} : the string which will identify the input or output
511 %\item Its {\bf type} : any \CPP type, either a basic type or a user defined type (class ...) but which must be known, hence the necessary files must be included.
512 %\item Its {\bf help} : a string describing the input / output
514 %\item Its {\bf processing} code, which can be a simple callback or an arbitrary complex code
518 Under Linux, for reasons we shall not discuss here, you'll get an error message :
520 \texttt{No such file or directory}
522 Have a look at the console, you'll see a shell command (whose syntax is OK although there is is a lot of
523 quotes),something like :
525 \texttt{ "/usr/local/bin/bbCreateBlackBox" "/home/jpr/Desktop/essai" MyPackage
526 myVtkPolydataBlackBox VTK-PolyDataAlgorithm C++ 'author1, author2' 'myVtkPolydataBlackBox description'}
528 Just copy the command, and run it manually.
530 \subsubsection{Input and output accessors}
532 When you encapsulate a processing class or a C function
533 or when you write down a black box from scratch,
534 you must access the inputs and outputs of the black box,
535 in order to interface it manually with your processing method
536 or simply write your processing code
537 (there are other cases in which you also need to access the
538 inputs and outputs, we will talk about them later).
540 The only thing you must know about the \CPP code generated
541 from your \xml or your \CPP macro-based description
542 is that when you declare an input
543 or an output of a black box then
544 two \emph{accessors} for this input or output are generated :
545 one to \emph{get} the value of the input or output and
546 one to \emph{set} it.
547 These accessors have normalized names :
550 \item The declaration of an {\bf input} called \texttt{NAME} and
551 of type \texttt{TYPE} generates the two accessors
552 \footnote{For the sake of simplicity, the parameters and return value are
553 shown here as if they were all passed by value.
554 However the actual code can use references.
555 The same way, the issue of const or non const methods is eluded here.
556 Different cases occur in practice.}:
558 \item \texttt{void bbSetInput<NAME>(<TYPE>);}
559 \item \texttt{<TYPE> bbGetInput<NAME>();}
561 \item The declaration of an {\bf output} called \texttt{NAME} and
562 of type \texttt{TYPE} generates the two accessors:
564 \item \texttt{void bbSetOutput<NAME>(<TYPE>);}
565 \item \texttt{<TYPE> bbGetOutput<NAME>();}
569 For example, declaring an input called \texttt{Image}
570 would generate the two accessors \texttt{bbSetInputImage} and
571 \texttt{bbGetInputImage}.
575 \item All \bbtk methods are prefixed by \texttt{bb}
576 to avoid conflicts with potential inherited methods.
577 \item An input and an output can have the same name (e.g. 'Image').
578 No conflict between accessors occur (e.g.
579 four distinct accessors are created :
580 \texttt{bbSetInputImage},
581 \texttt{bbGetInputImage},
582 \texttt{bbSetOutputImage} and
583 \texttt{bbGetOutputImage}).
586 % ==========================================
587 \subsection{\texttt{XML} description of a box}
588 % ==========================================
590 % ==========================================
591 \subsubsection{General \texttt{xml} tags}
592 % ==========================================
594 Let us examine the \texttt{xml} file
595 describing the \texttt{Add} box of the \texttt{std} package :
597 \begin{file}{\texttt{packages/std/src/bbAdd.xml}}
600 <?xml version="1.0" encoding="iso-8859-1"?>
602 <blackbox name="Add">
604 <author>laurent.guigues@creatis.insa-lyon.fr </author>
605 <description>Adds its inputs </description>
606 <category>math </category>
608 <input name="In1" type="double" description="First number to add"/>
609 <input name="In2" type="double" description="Second number to add"/>
610 <output name="Out" type="double" description="Result"/>
613 bbSetOutputOut( bbGetInputIn1() + bbGetInputIn2() );
626 The tags and their role are easily understandable.
628 As the box is not a widget, we inherit implicitely from
629 \texttt{bbtk::AtomicBlackBox}.
632 The only part of the file which needs a bit of explaination is
633 the body of the \texttt{process} tag, which describes the
634 actual code to execute in the box.
635 This code must be enclosed in a \texttt{<PRE></PRE>} tag
636 to tell the \xml parser not to interpret it as \xml instructions.
637 This is necessary to be able to use any symbol,
638 like the \texttt{<} and \texttt{>} which have a
639 special meaning in \xml.
640 In the case of the \texttt{Add} box, the process code
641 is very simple : remember that
642 \texttt{bbGetInputIn1()} is the
643 accessor to the input \texttt{In1} declared above and
644 \texttt{bbGetInputIn2()} is the
645 accessor to the input \texttt{In2};
646 the code simply adds the values of the two inputs
647 and sets the output \texttt{Out} with the resulting value.
649 To describe your own black boxes in \xml code,
650 you must modify the xml file generated in previous step :
653 \item Complete the description and author tags if you feel like.
654 \item add the \texttt{\#include} directives to be put in the generated \texttt{.h} file
655 \item Create your inputs and outputs
656 \item Fill in the process tag
657 \item Fill in the constructor tag
658 \item Fill in the copyconstructor tag
659 \item Fill in the destructor tag
664 % ==========================================
665 \subsubsection{Specific \texttt{xml} tags for \texttt{itk::ImageToImageFilter} classes bbfication}
666 % ==========================================
668 % ==========================================
669 \subsubsection{Specific \texttt{xml} tags for \texttt{vtkImageAlgorithm} classes bbfication by inheritance}
670 % ==========================================
673 <blackbox name="..." type="VTK_ImageAlgorithm">
675 <vtkparent>the vtk ImageAlgorithm class it inherits from</vtkparent>
676 <input name="..." type="double" special="vtk parameter" description="..."/>
677 <input name="..." type="vtkImageData*" special="vtk input" description="..."/>
679 <output name="..." type="double" special="vtk parameter" description="..."/>
680 <output name="..." type="vtkImageData*" special="vtk output" description="..."/>
682 % ==========================================
683 \subsubsection{Specific \texttt{xml} tags for \texttt{vtkPolyDataAlgorithm} classes bbfication by inheritance}
684 % ==========================================
686 <blackbox name="..." type="VTK_PolyDataAlgorithm">
688 <vtkparent>the vtk Polydata class it inherits from</vtkparent>
689 <input name="..." type="double" special="vtk parameter" description="..."/>
690 <input name="..." type="vtkPolyData*" special="vtk input" description="..."/>
692 <output name="..." type="double" special="vtk parameter" description="..."/>
693 <output name="..." type="vtkPolyData*" special="vtk output" description="..."/>
699 % ==========================================
700 \subsubsection{\bbfy \texttt{xml} tags reference}
701 % ==========================================
703 See tables \ref{xml_tags}, \ref{xml_tags2}
704 % ==========================================
706 \caption{\label{xml_tags}
707 \bbfy \texttt{xml} tags reference (part 1)}
709 \begin{tabular}{|lcllm{6cm}|}
711 Tag & Attributes & Condition & Multiplicity & Description
714 \texttt{<blackbox>} & \texttt{name} & - & 1 & The name of the box \\ \hline
715 & \texttt{type} & - & 1 & The type of the box. In:
716 \{\texttt{standard} (default),
717 \texttt{ITK\_ImageToImageFilter},
718 \texttt{VTK\_ImageAlgorithm},
719 \texttt{VTK\_PolyDataAlgorithm}\} \\\hline
720 & \texttt{generic} & a) & 0-1 &
721 Generate the generic filter (see text)\\ \hline
723 \texttt{<description>} & - & - & 0-n & The description of the box. Multiple occurrence are concatenated \\\hline
724 \texttt{<author>} & - & - & 0-n & The author of the box. Multiple occurrence are concatenated \\\hline
725 \texttt{<category>} & - & - & 0-1 & The box category (if more than one, they are separated with commas) see Tab \ref{categories}\\\hline
726 \texttt{<parentblackbox>} & - & - & 1 & The parent black box of the box.
727 In: \{\texttt{bbtk::BlackBox, bbtk::WxBlackBox, bbtk::WxContainerBlackBox}\}\\\hline
728 \texttt{<package>} & - & - & 1 & The package of the box \\\hline
729 \texttt{<namespace>} & - & - & 0-1 & The namespace of the box.
730 Use \texttt{bbPACKAGE}, where \texttt{PACKAGE} is the name of the package\\\hline
731 \texttt{<include>} & - & - & 0-n & Additionnal file to include
732 (generates : \texttt{\#include 'value'})\\\hline
734 \texttt{<template>} & - & - & 0-n & Template parameter of the box. The template parameter list is generated in the order of appearance of the tag. \\\hline
736 \texttt{<itkparent>} & - & a) & 1 & The parent itk class (with namespace) \\\hline
738 \texttt{<vtkparent>} & - & b) & 1 & The parent vtk class \\\hline
740 \texttt{<input>} & \texttt{name} & - & 1 & The name of the input \\\hline
741 & \texttt{type} & - & 1 & The type of the input \\\hline
742 & \texttt{special} & - & 0-1 & In: \{\texttt{``itk input'',
743 ``vtk input'', ``itk parameter'', ``vtk parameter''}\} (see below).\\\hline
744 & \texttt{generic\_type} & c) & 0-1 & The ``generic'' type of the input (see text). \\\hline
750 \caption{\label{xml_tags2}
751 \bbfy \texttt{xml} tags reference (part 2)}
753 \begin{tabular}{|lcllm{6cm}|}
755 Tag & Attributes & Condition & Multiplicity & Description
757 \texttt{<output>} & \texttt{name} & - & 1 & The name of the output \\\hline
758 & \texttt{type} & - & 1 & The type of the output \\\hline
759 & \texttt{special} & - & 0-1 & In: \{\texttt{``itk output'',
760 ``vtk output''}\} (see below).\\\hline
761 & \texttt{generic\_type} & c) & 0-1 & The ``generic'' type of the output (see text).\\\hline
762 & \texttt{nature} & c) & 0-1 & The ``nature'' of the output (used for automatic GUI generation).\\\hline
763 \texttt{<process>} & - & - & 0-1 & The code of the processing method of the box. Must be put between clear tags : \texttt{<PRE></PRE>} \\\hline
764 \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
765 \texttt{<copyconstructor>} & - & - & 0-1 & The code of the user Copy Constructor of the box . Must be put between clear tags : \texttt{<PRE></PRE>} \\\hline
766 \texttt{<destructor>} & - & - & 0-1 & The code of the user Destructor of the box. Must be put between clear tags : \texttt{<PRE></PRE>} \\\hline
772 % ==========================================
774 \caption{\label{xml_tags-conditions}
775 \bbfy \texttt{xml} tags conditions}
777 \begin{tabular}{|ll|}
779 a) & \texttt{<blackbox type == ''ITK\_ImageToImageFilter''>} \\ \hline
780 b) & \texttt{<blackbox type == ''VTK\_ImageAlgorithm'' or ''VTK\_PolyDataAlgorithm''>} \\ \hline
781 c) & \texttt{<blackbox type == ''ITK\_ImageToImageFilter''>} and
782 \texttt{<blackbox generic>} is present. \\ \hline
787 \caption{\label{basic_parent}}
788 \bbfy \texttt{Basic box parent}
790 \begin{tabular}{|ll|}
792 \texttt{bbtk::WxBlackBox}b) & If the blackbox associated to
793 a \texttt{wxWindow} and is be able to return a pointer to it.... \\ \hline
794 \texttt{bbtk::AtomicBlackBox} & Any other blackbox that doesn't return a pointer to a \texttt{wxWindow}
802 % ==========================================
804 \caption{\label{categories}
805 \bbfy \texttt{Black Box} categories}
807 \begin{tabular}{|ll|}
809 \texttt{Categ name} & : Meaning \\ \hline \\ \hline
810 \texttt{adaptor} & : Adaptor box \\ \hline
811 \texttt{application} & : Final application, end user intended \\ \hline
812 \texttt{atomic box} & : System category.
813 Automatically assigned to Atomic Black Boxes (c++ defined) \\ \hline
814 \texttt{complex box} & : System category.
815 Automatically assigned to Complex Black Boxes (script defined) \\ \hline
816 \texttt{command line} & : Script which defines a command line application (no embedded GUI, but command line imput parameters) \\ \hline
817 \texttt{demo} & : Demonstration \\ \hline
818 \texttt{devel} & : Developer tool (bbCreatePackage.bbs, ...) \\ \hline
819 \texttt{dicom} & : DICOM aware box \\ \hline
820 \texttt{example} & : Example script showing a box use-case \\ \hline
821 \texttt{filter} & : Image processing box \\ \hline
822 \texttt{image} & : Image processing related box \\ \hline
823 \texttt{interaction} & : \\ \hline
824 \texttt{math} & : Mathematical operations\\ \hline
825 \texttt{mesh} & : Mesh processing related box \\ \hline
826 \texttt{misc} & : A box that cannot be put in other category ! \\ \hline
827 \texttt{read/write} & : Box that read or write data from or to disk \\ \hline
828 \texttt{viewer} & : Box which displays some data \\ \hline
829 \texttt{widget} & : Piece of graphical interface \\ \hline
831 \texttt{3D object creator} & : Sophisticated 3D widget \\ \hline
832 \texttt{toolsbbtk} & : Component of bbStudio \\ \hline
837 % ==========================================
839 \caption{\label{kinds}
840 \bbfy \texttt{Black Box} kinds}
842 \begin{tabular}{|ll|}
844 \texttt{Kind} & Use as : \\ \hline \\ \hline
845 \texttt{ADAPTOR} & \\ \hline
846 \texttt{DEFAULT\_ADAPTOR} & \\ \hline
847 \texttt{WIDGET\_ADAPTOR} & \\ \hline
848 \texttt{DEFAULT\_WIDGET\_ADAPTOR} & \\ \hline
849 \texttt{GUI} & \\ \hline
850 \texttt{DEFAULT\_GUI} & \\ \hline
851 \texttt{ALL} & If kind='ALL' then sets the level for all kinds\\ \hline
856 % ==========================================
858 \caption{\label{nature}
859 \bbfy \texttt{nature}}
861 \begin{tabular}{|ll|}
863 \texttt{Nature} & : used for \\ \hline \\ \hline
865 \texttt{file name} & Poping up a File Selector\\ \hline
866 \texttt{directory name} & Poping up a Directory Selector\\ \hline
867 \texttt{file extension} & \\ \hline
868 \texttt{colour} & Poping up a Colour Selector\\ \hline
869 \texttt{pixel type} & \\ \hline
870 \texttt{image dimension} & \\ \hline
871 \texttt{image index} & \\ \hline
872 \texttt{image size} & \\ \hline
873 \texttt{voxel size} & \\ \hline
887 % ==========================================
888 \subsection{\CPP description of a box}
889 % ==========================================
891 Almost everything is performed usig macros.
893 For a quick start, the best you have to do is to run \texttt{bbStudio}, then in the menu \texttt{Tools}, choose the item
894 \texttt{Create blackbox}, click on \texttt{C++}, and have a look to the generated files.
896 % ==========================================
897 \subsubsection{\texttt{.h} description of a box}
898 % ==========================================
900 \item \texttt{namespace} : your package name.
901 \item \texttt{class} : the name of your box
902 \item \texttt{public inheritance} :
904 \item{bbtk::WxBlackBox}
905 Your Black Box is intended to return a wxWidget, able to be included into an other one (you choosed
906 \texttt{widget-template} for \texttt{Type of the blackbox} )
907 \item{bbtk::AtomicBlackBox}
908 Your Black box is any processig box (std, ITK or VTK based)
909 \item{any processing class} (ITK, VTK, ...) your box inherits.
911 \item \texttt{BBTK\_BLACK\_BOX\_INTERFACE} : (yourBoxName, the list of the classes it inherits from, VTK Parent -if any-).
912 Yes, we know it's redundant with previous point... That's why we allow you to describe your class in xml format!
913 \item \texttt{bbUserConstructor} declaration of your own callback function, that will be called in the box constructor method
914 \item \texttt{bbUserCopyConstructor} declaration of your own callback function, that will be called in the box copy constructor method
915 \item \texttt{bbUserDestructor} declaration of your own callback function, that will be called in the box destructor method
916 \item \texttt{BBTK\_DECLARE\_INPUT} : input parameter name (as it will appear to the users of your black box),
917 C++ type of the parameter (e.g. double, std::string, vtkImageData*, ...)
918 \item \texttt{BBTK\_DECLARE\_OUTPUT} : output parameter name (as it will appear to the users of your black box),
919 C++ type of the parameter (e.g. double, std::string, vtkImageData*, ...
920 \item \texttt{BBTK\_DECLARE\_VTK\_INPUT} Declares a vtkAlgorithm-inherited AtomicBlackBox input
921 \item \texttt{BBTK\_DECLARE\_VTK\_OUTPUT} Declares a vtkAlgorithm-inherited AtomicBlackBox output
922 \item \texttt{BBTK\_DECLARE\_VTK\_PARAM} Declares an AtomicBlackBox input corresponding to an inherited vtk parameter
923 (you know, the ones that are declared by vtkSetMacro/vtkGetMacro). Its name must be the same than the vtk parameter name
924 \item \texttt{BBTK\_DECLARE\_VTK\_IMAGE\_ALGORITHM\_INPUT} Declares a vtkImageAlgorithm-inherited AtomicBlackBox input
925 \item \texttt{BBTK\_DECLARE\_VTK\_POLY\_DATA\_ALGORITHM\_INPUT} Declares a vtkPolyDataAlgorithm-inherited AtomicBlackBox input
926 \item \texttt{BBTK\_PROCESS} Defines the default bbUserProcess method for vtk inherited black boxes (actually : calls vtkParent::Update)
928 \item \texttt{BBTK\_BEGIN\_DESCRIBE\_BLACK\_BOX} :
929 (yourBoxName, \texttt{bbtk::WxBlackBox} or \texttt{bbtk::AtomicBlackBox} depending on what you
930 black box inherits from).
931 Yes, we know it's redundant with public inheritance ... That's why we allow you to describe your class in xml format!
932 All the following items will be used in the Help interface; describe them carefully (i.e. in a Human understandable way!).
933 \item \texttt{BBTK\_NAME} : the name of your box
934 \item \texttt{BBTK\_AUTHOR} : author name (better you put e-mail adress)
935 \item \texttt{BBTK\_DESCRIPTION} : brief description of what does the box
936 \item \texttt{BBTK\_CATEGORY} :box category (see table \ref{categories})
937 \item \texttt{BBTK\_INPUT} for each one of the input parameters, you have to supply :
939 \item The current Blackbox name.
940 \item The parameter name
941 \item A brief description of what the parameter is used for.
942 \item The C++ type of the parameter (e.g. double, std::string, vtkImageData*, ...)
943 \item The nature of the parameter (see table \ref{nature}) if you wish your box may be used by automatic GUI generator.
944 Supply an empty string ("") if you don't care.
946 \item \texttt{ BBTK\_OUTPUT} for each one of the output parameters, you have to supply :
948 \item The current Blackbox name.
949 \item The parameter name
950 \item A brief description of what the parameter is used for.
951 \item The C++ type of the parameter (e.g. double, std::string, vtkImageData*, ...)
953 \item \texttt{BBTK\_END\_DESCRIBE\_BLACK\_BOX} : means the torture is (almost) over.
955 % ==========================================
956 \subsubsection{\texttt{.cxx} description of a box}
957 % ==========================================
959 \item \texttt{BBTK\_ADD\_BLACK\_BOX\_TO\_PACKAGE} : (Package name, Blackbox name)
960 \item \texttt{BBTK\_BLACK\_BOX\_IMPLEMENTATION} : (Blackbox name, Blackbox basic parent \\ (bbtk::AtomicBlackBox/ bbtk::WxBlackBox)see :\label{basic_parent}
961 \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
962 \item \texttt{UserConstructor} : definition of your own callback function, that will be called in the box constructor method. \\
963 At least, you'll write here the default initialisation of the inputs (to avoid unpredictable behaviour if user forgets to
964 Set/Connect any Input).
965 \item \texttt{UserCopyConstructor} : definition of your own callback function, that will be called in the box copy constructor method
966 \item \texttt{UserDestructor} : definition of your own callback function, that will be called in the box destructor method
975 %\section{Conclusion}