]> Creatis software - bbtk.git/blob - kernel/src/bbtkComplexBlackBoxDescriptor.cxx
test to example
[bbtk.git] / kernel / src / bbtkComplexBlackBoxDescriptor.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkComplexBlackBoxDescriptor.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/02/19 18:40:10 $
7   Version:   $Revision: 1.11 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18
19 /**
20  *  \file 
21  *  \brief Class bbtk::ComplexBlackBoxDescriptor : describes a ComplexBlackBox (constituents, connections) and is able to create an instance of it.
22  */
23 #include "bbtkComplexBlackBoxDescriptor.h"
24 #include "bbtkComplexBlackBox.h"
25 //#include "bbtkFactory.h"
26 #include "bbtkMessageManager.h"
27 #include "bbtkUtilities.h"
28
29 namespace bbtk
30 {
31   
32
33   //=======================================================================
34   /// Default ctor
35   ComplexBlackBoxDescriptor::ComplexBlackBoxDescriptor(const std::string& name)
36     : BlackBoxDescriptor()
37   {
38     bbtkDebugMessageInc("Kernel",9,"ComplexBlackBoxDescriptor::ComplexBlackBoxDescriptor(\""<<name<<"\")"<<std::endl);
39     SetTypeName(name);
40     AddToCategory("complex box");
41     mPrototype = new ComplexBlackBox(name+std::string("Prototype"),this);
42     bbtkDebugDecTab("Kernel",9);
43   }
44   //=======================================================================
45
46
47
48   //=======================================================================
49   /// Default dtor
50   ComplexBlackBoxDescriptor::~ComplexBlackBoxDescriptor()
51   {
52     bbtkDebugMessageInc("Kernel",9,"ComplexBlackBoxDescriptor::~ComplexBlackBoxDescriptor(\""<<GetTypeName()<<"\")"<<std::endl);
53
54     delete mPrototype;
55
56     bbtkDebugDecTab("Kernel",9);
57   }
58   //=======================================================================
59
60
61   //=======================================================================
62   /// Creates an instance of name <name> of the ComplexBlackBox of which this is the descriptor 
63   BlackBox* ComplexBlackBoxDescriptor::CreateInstance(const std::string& name)
64   {
65     //bbtkError("ComplexBlackBoxDescriptor::CreateInstance not implemented");
66     bbtkDebugMessageInc("Kernel",5,
67                         "ComplexBlackBoxDescriptor::CreateInstance(\""
68                         <<name<<"\") ["
69                         <<GetTypeName()<<"]"<<std::endl);
70     
71     return mPrototype->bbClone(name);
72
73     bbtkDebugDecTab("Kernel",5);
74   }
75   //=======================================================================
76
77
78
79   //=======================================================================
80   /// Adds a black box to the complex box
81   void ComplexBlackBoxDescriptor::Add ( const std::string& type,
82                                         const std::string& name
83                                         )
84   {
85     bbtkDebugMessageInc("Kernel",5,
86                         "ComplexBlackBoxDescriptor::Add(\""
87                         <<type<<"\",\""<<name<<"\") ["
88                         <<GetTypeName()<<"]"<<std::endl);
89     
90     
91     // Verify that a box with the same name does not exist already
92     if ( mPrototype->bbUnsafeGetBlackBox( name ) ) 
93       {
94         bbtkError("a black box \""<<name<<"\" already exists");
95       }
96     // ok : create new one
97     mPrototype->bbAddBlackBox ( /*mFactory->Create*/ NewBlackBox(type,name) );
98
99     bbtkDebugDecTab("Kernel",5);
100   }
101   //=======================================================================
102
103  //=======================================================================
104   /// Adds a black box to the execution list 
105   void ComplexBlackBoxDescriptor::AddToExecutionList ( const std::string& box)
106   {
107     bbtkDebugMessageInc("Kernel",5,
108                         "ComplexBlackBoxDescriptor::AddToExecutionList(\""
109                         <<box<<"\" ["
110                         <<GetTypeName()<<"]"<<std::endl);
111     // Verify that the box exists
112     BlackBox* b = mPrototype->bbUnsafeGetBlackBox( box ); 
113     if ( !b ) 
114       {
115         bbtkError("the black box \""<<box<<"\" does not exist");
116       }
117     // ok 
118     mPrototype->bbAddToExecutionList ( box  );
119
120     bbtkDebugDecTab("Kernel",5);
121     }
122
123
124   //=======================================================================
125   /// Connects two black boxes of the complex box
126   void ComplexBlackBoxDescriptor::Connect ( const std::string& from,
127                                             const std::string& output,
128                                             const std::string& to,
129                                             const std::string& input
130                                             )
131   {
132     bbtkDebugMessageInc("Kernel",5,
133                         "ComplexBlackBoxDescriptor::Connect(\""
134                         <<from<<"\",\""<<output<<"\",\""
135                         <<to<<"\",\""<<input
136                         <<"\") ["
137                         <<GetTypeName()<<"]"<<std::endl);
138   // Verify that a box with the same name does not exist already
139     BlackBox* bbfrom = mPrototype->bbGetBlackBox( from );
140     if ( !bbfrom ) 
141       {
142         bbtkError("the black box \""<<from<<"\" does not exist");
143       }
144     BlackBox* bbto = mPrototype->bbGetBlackBox( to );
145     if ( !bbto ) 
146       {
147         bbtkError("the black box \""<<to<<"\" does not exist");
148       }
149     
150     Connection* c = /*mFactory->*/ NewConnection( bbfrom, output, bbto, input );
151
152     mPrototype->bbAddConnection(c);
153
154     bbtkDebugDecTab("Kernel",5);
155   }
156   //=======================================================================
157
158
159   //=======================================================================
160   /// Defines an input of the complex box
161   void ComplexBlackBoxDescriptor::DefineInput ( const std::string& name,
162                                                 const std::string& box,
163                                                 const std::string& input,
164                                                 const std::string& help)
165   {
166     bbtkDebugMessageInc("Kernel",5,
167                         "ComplexBlackBoxDescriptor::DefineInput(\""
168                         <<name<<"\",\""<<box<<"\",\""
169                         <<input<<"\",\""<<help
170                         <<"\") ["
171                         <<GetTypeName()<<"]"<<std::endl);
172
173     BlackBox* bb = mPrototype->bbGetBlackBox( box );
174     if ( !bb ) 
175       {
176         bbtkError("the black box \""<<box<<"\" does not exist");
177       }
178
179     if (!bb->bbHasInput(input) )
180       {
181         bbtkError("the black box \""<<box<<"\" does not have input \""
182                   <<input<<"\"");
183       }
184     
185     AddInputDescriptor ( new ComplexBlackBoxInputDescriptor 
186                          ( typeid(ComplexBlackBoxDescriptor),
187                            name,
188                            help,
189                            box,
190                            input,
191                            bb->bbGetInputType(input)));
192     
193     
194     bbtkDebugDecTab("Kernel",5);
195   }
196   //=======================================================================
197
198   //=======================================================================
199   /// Defines an output of the complex box
200   void ComplexBlackBoxDescriptor::DefineOutput ( const std::string& name,
201                                                  const std::string& box,
202                                                  const std::string& output,
203                                                  const std::string& help)
204   {
205     bbtkDebugMessageInc("Kernel",5,
206                         "ComplexBlackBoxDescriptor::DefineOutput(\""
207                         <<name<<"\",\""<<box<<"\",\""
208                         <<output<<"\",\""<<help
209                         <<"\") ["
210                         <<GetTypeName()<<"]"<<std::endl);
211
212     BlackBox* bb = mPrototype->bbGetBlackBox( box );
213     if ( !bb ) 
214       {
215         bbtkError("the black box \""<<box<<"\" does not exist");
216       }
217
218     if (!bb->bbHasOutput(output) )
219       {
220         bbtkError("the black box \""<<box<<"\" does not have output \""
221                   <<output<<"\"");
222       }
223     
224     AddOutputDescriptor ( new ComplexBlackBoxOutputDescriptor 
225                           ( typeid(ComplexBlackBoxDescriptor),
226                             name,
227                             help,
228                             box,
229                             output,
230                             bb->bbGetOutputType(output)));
231     
232     
233     bbtkDebugDecTab("Kernel",5);
234   }
235   //=======================================================================
236
237   //=======================================================================
238   void ComplexBlackBoxDescriptor::PrintBlackBoxes()
239   {
240     mPrototype->bbPrintBlackBoxes(); 
241   }
242   //=======================================================================
243
244
245   //=======================================================================
246   void ComplexBlackBoxDescriptor::InsertHTMLGraph( std::ofstream& s , 
247                                                    int detail, int level, 
248                                                    const std::string& output_dir, bool relative_link )   
249   {
250     this->mPrototype->bbInsertHTMLGraph( s, 
251                                          detail, level, 
252                                          false, 
253                                          output_dir,
254                                          relative_link );
255   }
256   //=======================================================================
257
258   //=========================================================================
259   void ComplexBlackBoxDescriptor::InsertHtmlHelp ( std::ofstream& s, 
260                                                    int detail, int level,
261                                                    const std::string& output_dir, bool relative_link)
262   {
263     bbtkDebugMessageInc("Kernel",9,
264                         "ComplexBlackBoxDescriptor::InsertHtmlHelp() ["
265                         <<GetTypeName()<<"]"<<std::endl);
266     
267     //-------------
268     // General info 
269     std::string name = GetTypeName();
270     Utilities::html_format(name);
271
272     //   std::ofstream* s = &s1;
273
274     (s) << "<p><hr>\n";
275     (s) << "<a name=\""<<name<<"\"></a>\n";
276     (s) << //"Top:&nbsp;
277       "<a rel=\"top\" accesskey=\"t\" href=\"#Top\">Top</a>\n";
278     // (s) << "Previous:&nbsp;<a rel="previous" accesskey="p" href="#dir">(dir)</a>,
279     // (s) << "Up:&nbsp;<a rel="up" accesskey="u" href="#dir">(dir)</a>
280     (s) << "<h2 class=\"section\">"<<name<<"</h2>\n";
281
282
283     std::string descr = GetDescription();
284     Utilities::html_format(descr);
285     
286     std::string author = GetAuthor();
287     Utilities::html_format(author);
288     
289     std::vector<std::string> categories;
290     // Split the category string 
291     std::string delimiters = ";,";
292     Utilities::SplitString(GetCategory(),
293                            delimiters,categories);
294
295         
296     (s) << "<p><TABLE cellspacing=0  cellpadding=3>\n";
297     (s) << "<TR><TD style='vertical-align: top;'><b> Description </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'> " 
298         << descr << "</TD></TR>\n";
299
300     (s) << "<TR><TD style='vertical-align: top;'><b> Author(s) </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'>  " 
301         << author << "</TD></TR>\n";
302
303     (s) << "<TR><TD style='vertical-align: top;'><b> Category(s) </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'>  ";
304     std::vector<std::string>::iterator ci;
305     for (ci=categories.begin(); ci!=categories.end(); ++ci)
306       {
307         s << "<a href=\"../index-category.html#"<< *ci <<"\">" << *ci 
308           << "</a>&nbsp;\n";
309       }
310     s << "</TD></TR>\n";      
311     std::string inc = GetScriptFileName();
312     if (inc.size()>0) 
313       {
314         s << "<TR><TD style='vertical-align: top;'><b> To use it </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'> include ";
315         s << inc << "&nbsp;&nbsp;<a href=\"../../../bbs/"<<inc<<"\">[source]</a>";
316         s << "</TD></TR>\n";
317         
318       }
319     
320     const ComplexBlackBox::BlackBoxMapType& B = mPrototype->bbGetBlackBoxMap();
321         
322     if (B.size()) 
323     {
324            (s) << "<TR><TD style='vertical-align: top;'><b> Uses </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'>  ";
325
326            std::set<BlackBoxDescriptor*> pdeps;
327            ComplexBlackBox::BlackBoxMapType::const_iterator b;
328            for ( b = B.begin(); b != B.end(); ++b ) 
329            {
330               BlackBoxDescriptor* d = b->second->bbGetDescriptor();
331               if (pdeps.find(d) != pdeps.end()) 
332             continue;
333               pdeps.insert(d);
334
335               Package* p = d->GetPackage();
336             
337               std::string name = b->second->bbGetTypeName();
338
339               std::string url;
340               if (relative_link) 
341                  url = p->GetDocRelativeURL();
342               else 
343                  url = p->GetDocURL();
344
345               s << "<a href=\"" <<url<<"#"<<name<<"\">" 
346                 << p->GetName()<<"::"<<name<<"</a>\n";
347             }   
348         
349             (s) << "</TD></TR>\n";
350
351      }
352
353      (s) << "</TABLE>\n";
354
355  
356    //-------------
357     // Graph
358     InsertHTMLGraph( s , detail,level, output_dir, relative_link);
359     
360     //-------------
361     // Inputs
362     std::string col("#CCCCFF");
363     
364     //  (s) << "<h3 class=\"subsection\">Inputs</h3>\n";
365     (s) << "<p><TABLE border=1 cellspacing=0 cellpadding=3>\n";
366     (s) << "<TR><TD colspan=3 align=center bgcolor=\""<<col
367       <<"\">Inputs</TD></TR>\n";
368     const BlackBoxDescriptor::InputDescriptorMapType& imap = 
369       GetInputDescriptorMap();
370     
371     InputDescriptorMapType::const_iterator in;
372     
373     for ( in = imap.begin();  in != imap.end(); ++in ) 
374       {
375         std::string name(in->second->GetName());
376         Utilities::html_format(name);
377         
378         std::string type("<");
379         type += in->second->GetTypeName();    
380         type += ">";
381         Utilities::html_format(type);
382         
383         std::string descr(in->second->GetDescription());
384         Utilities::html_format(descr);
385
386         (s) << "<TR><TD style='vertical-align: top;'><B><PRE> "<<name<<" </PRE></B></TD>"
387           << "<TD style='vertical-align: top;'><I><PRE> "<<type<<" </PRE></I></TD>"
388           << "<TD style='vertical-align: top;'>"<<descr<<"</TD></TR>\n";
389         
390       }
391     //  (s) << "</TABLE>\n";
392     
393     
394     //-------------
395     // Outputs
396     //  (s) << "<h3 class=\"subsection\">Outputs</h3>\n";
397     //  (s) << "<TABLE border=1 cellspacing=0>\n";
398     (s) << "<TR><TD colspan=3 align=center bgcolor=\""<<col
399       <<"\">Outputs</TD></TR>\n";
400     
401     const BlackBoxDescriptor::OutputDescriptorMapType& omap = 
402       GetOutputDescriptorMap();
403     
404     BlackBoxDescriptor::OutputDescriptorMapType::const_iterator o;
405     
406     for ( o = omap.begin();  o != omap.end(); ++o ) 
407       {
408         std::string name(o->second->GetName());
409         Utilities::html_format(name);
410         
411         std::string type("<");
412         type += o->second->GetTypeName();    
413         type += ">";
414         Utilities::html_format(type);
415         
416         std::string descr(o->second->GetDescription());
417         Utilities::html_format(descr);
418         
419         (s) << "<TR><TD style='vertical-align: top;'><B><PRE> "<<name<<" </PRE></B></TD>"
420           << "<TD style='vertical-align: top;'><I><PRE> "<<type<<" </PRE></I></TD>"
421           << "<TD style='vertical-align: top;'>"<<descr<<"</TD></TR>\n";
422         
423       }
424     (s) << "</TABLE>\n";
425
426     //------------
427     // End
428
429     bbtkDebugDecTab("Kernel",9);
430    }
431   //=========================================================================
432  
433
434   //=======================================================================
435   void ComplexBlackBoxDescriptor::GetHelp(bool full) const
436   {
437     if (full) bbtkMessage("Help",1,"Complex Black Box <"<<
438                           GetPackage()->GetName()<<"::"
439                           <<GetTypeName()<<">"<<std::endl);
440     bbtkMessage("Help",1," "                << GetDescription() <<std::endl);
441     bbtkMessage("Help",1," By : "           << GetAuthor()      <<std::endl);
442     bbtkMessage("Help",1," Category(s) : "  << GetCategory()     <<std::endl);    
443     if (mInput.size()) 
444       bbtkMessage("Help",1," * Inputs : "<<std::endl);
445     else 
446       bbtkMessage("Help",1," * No inputs"<<std::endl);
447     InputDescriptorMapType::const_iterator i;
448     unsigned int namelmax = 0;
449     unsigned int typelmax = 0;
450     for ( i = mInput.begin();  i != mInput.end(); ++i ) 
451     {
452            if (i->second->GetName().size()>namelmax) 
453              namelmax = i->second->GetName().size();
454            if (i->second->GetTypeName().size()>typelmax) 
455              typelmax = i->second->GetTypeName().size();
456     }
457     OutputDescriptorMapType::const_iterator o;
458     if (full) 
459     {
460            for ( o = mOutput.begin();  o != mOutput.end(); ++o ) 
461            {
462              if (o->second->GetName().size()>namelmax) 
463                namelmax = o->second->GetName().size();
464             if (o->second->GetTypeName().size()>typelmax) 
465                typelmax = o->second->GetTypeName().size();
466            }
467     }
468     //
469
470     for ( i = mInput.begin();  i != mInput.end(); ++i ) 
471     {
472            std::string name(i->second->GetName());
473            name += "'";
474            name.append(1+namelmax-name.size(),' ');
475            std::string type(i->second->GetTypeName());
476            type += ">";
477            type.append(1+typelmax-type.size(),' ');
478            bbtkMessage("Help",1,
479                     "    '"<<name
480                     <<" <"<<type
481                     <<" : "<<i->second->GetDescription()<<std::endl);
482     }
483     if (full) 
484     {
485            if (mOutput.size()) 
486              bbtkMessage("Help",1," * Outputs : "<<std::endl);
487            else 
488              bbtkMessage("Help",1," * No outputs"<<std::endl);
489            for ( o = mOutput.begin();  o != mOutput.end(); ++o ) 
490            {
491              std::string name(o->second->GetName());
492              name += "'";
493              name.append(1+namelmax-name.size(),' ');
494              std::string type(o->second->GetTypeName());
495              type += ">";
496              type.append(1+typelmax-type.size(),' ');
497              bbtkMessage("Help",1,
498                          "    '"<<name
499                          <<" <"<<type
500                          <<" : "<<o->second->GetDescription()<<std::endl);
501            }
502     }
503     if (full) 
504     {
505            const ComplexBlackBox::BlackBoxMapType& B = mPrototype->bbGetBlackBoxMap();
506         
507            if (B.size()) 
508              bbtkMessage("Help",1," * Boxes : "<<std::endl);
509            else 
510              bbtkMessage("Help",1," * No boxes"<<std::endl);
511         
512            ComplexBlackBox::BlackBoxMapType::const_iterator b;
513            for ( b = B.begin(); b != B.end(); ++b ) 
514            {
515              bbtkMessage("Help",1,"    '"<<b->second->bbGetName()<<
516                          "' <"
517                          << b->second->bbGetDescriptor()->GetPackage()->GetName() 
518                          <<"::"
519                          <<b->second->bbGetTypeName()<<">"<<std::endl);
520            }
521     }
522
523   }   
524   //=======================================================================
525
526
527
528 }