]> Creatis software - bbtk.git/blob - kernel/src/bbtkComplexBlackBoxDescriptor.cxx
a6b40e6aa0e3706d3094da042f1c5f12bdcb24d7
[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/06 14:14:22 $
7   Version:   $Revision: 1.5 $
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("script");
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::string category = GetCategory();
290     Utilities::html_format(category);
291         
292     (s) << "<p><TABLE cellspacing=0  cellpadding=3>\n";
293     (s) << "<TR><TD style='vertical-align: top;'><b> Description </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'> " 
294         << descr << "</TD></TR>\n";
295
296     (s) << "<TR><TD style='vertical-align: top;'><b> Author(s) </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'>  " 
297         << author << "</TD></TR>\n";
298
299     (s) << "<TR><TD style='vertical-align: top;'><b> Category(s) </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'>  " 
300         << category << "</TD></TR>\n";      
301
302     std::string inc = GetScriptFileName();
303     if (inc.size()>0) 
304       {
305     (s) << "<TR><TD style='vertical-align: top;'><b> Use command </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'> include " 
306       << inc << "</TD></TR>\n";
307         
308       }
309     
310     const ComplexBlackBox::BlackBoxMapType& B = mPrototype->bbGetBlackBoxMap();
311         
312     if (B.size()) 
313     {
314            (s) << "<TR><TD style='vertical-align: top;'><b> Dependencies </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'>  ";
315
316            std::set<BlackBoxDescriptor*> pdeps;
317            ComplexBlackBox::BlackBoxMapType::const_iterator b;
318            for ( b = B.begin(); b != B.end(); ++b ) 
319            {
320               BlackBoxDescriptor* d = b->second->bbGetDescriptor();
321               if (pdeps.find(d) != pdeps.end()) 
322             continue;
323               pdeps.insert(d);
324
325               Package* p = d->GetPackage();
326             
327               std::string name = b->second->bbGetTypeName();
328
329               std::string url;
330               if (relative_link) 
331                  url = p->GetDocRelativeURL();
332               else 
333                  url = p->GetDocURL();
334
335               s << "<a href=\"" <<url<<"#"<<name<<"\">" 
336                 << p->GetName()<<"::"<<name<<"</a>\n";
337             }   
338         
339             (s) << "</TD></TR>\n";
340
341      }
342
343      (s) << "</TABLE>\n";
344
345  
346    //-------------
347     // Graph
348     InsertHTMLGraph( s , detail,level, output_dir, relative_link);
349     
350     //-------------
351     // Inputs
352     std::string col("#CCCCFF");
353     
354     //  (s) << "<h3 class=\"subsection\">Inputs</h3>\n";
355     (s) << "<p><TABLE border=1 cellspacing=0 cellpadding=3>\n";
356     (s) << "<TR><TD colspan=3 align=center bgcolor=\""<<col
357       <<"\">Inputs</TD></TR>\n";
358     const BlackBoxDescriptor::InputDescriptorMapType& imap = 
359       GetInputDescriptorMap();
360     
361     InputDescriptorMapType::const_iterator in;
362     
363     for ( in = imap.begin();  in != imap.end(); ++in ) 
364       {
365         std::string name(in->second->GetName());
366         Utilities::html_format(name);
367         
368         std::string type("<");
369         type += in->second->GetTypeName();    
370         type += ">";
371         Utilities::html_format(type);
372         
373         std::string descr(in->second->GetDescription());
374         //Utilities::html_format(descr);
375
376         (s) << "<TR><TD style='vertical-align: top;'><B><PRE> "<<name<<" </PRE></B></TD>"
377           << "<TD style='vertical-align: top;'><I><PRE> "<<type<<" </PRE></I></TD>"
378           << "<TD style='vertical-align: top;'>"<<descr<<"</TD></TR>\n";
379         
380       }
381     //  (s) << "</TABLE>\n";
382     
383     
384     //-------------
385     // Outputs
386     //  (s) << "<h3 class=\"subsection\">Outputs</h3>\n";
387     //  (s) << "<TABLE border=1 cellspacing=0>\n";
388     (s) << "<TR><TD colspan=3 align=center bgcolor=\""<<col
389       <<"\">Outputs</TD></TR>\n";
390     
391     const BlackBoxDescriptor::OutputDescriptorMapType& omap = 
392       GetOutputDescriptorMap();
393     
394     BlackBoxDescriptor::OutputDescriptorMapType::const_iterator o;
395     
396     for ( o = omap.begin();  o != omap.end(); ++o ) 
397       {
398         std::string name(o->second->GetName());
399         Utilities::html_format(name);
400         
401         std::string type("<");
402         type += o->second->GetTypeName();    
403         type += ">";
404         Utilities::html_format(type);
405         
406         std::string descr(o->second->GetDescription());
407         //Utilities::html_format(descr);
408         
409         (s) << "<TR><TD style='vertical-align: top;'><B><PRE> "<<name<<" </PRE></B></TD>"
410           << "<TD style='vertical-align: top;'><I><PRE> "<<type<<" </PRE></I></TD>"
411           << "<TD style='vertical-align: top;'>"<<descr<<"</TD></TR>\n";
412         
413       }
414     (s) << "</TABLE>\n";
415
416     //------------
417     // End
418
419     bbtkDebugDecTab("Kernel",9);
420    }
421   //=========================================================================
422  
423
424   //=======================================================================
425   void ComplexBlackBoxDescriptor::GetHelp(bool full) const
426   {
427     if (full) bbtkMessage("Help",1,"Complex Black Box <"<<
428                           GetPackage()->GetName()<<"::"
429                           <<GetTypeName()<<">"<<std::endl);
430     bbtkMessage("Help",1," "                << GetDescription() <<std::endl);
431     bbtkMessage("Help",1," By : "           << GetAuthor()      <<std::endl);
432     bbtkMessage("Help",1," Category(s) : "  << GetCategory()     <<std::endl);    
433     if (mInput.size()) 
434       bbtkMessage("Help",1," * Inputs : "<<std::endl);
435     else 
436       bbtkMessage("Help",1," * No inputs"<<std::endl);
437     InputDescriptorMapType::const_iterator i;
438     unsigned int namelmax = 0;
439     unsigned int typelmax = 0;
440     for ( i = mInput.begin();  i != mInput.end(); ++i ) 
441     {
442            if (i->second->GetName().size()>namelmax) 
443              namelmax = i->second->GetName().size();
444            if (i->second->GetTypeName().size()>typelmax) 
445              typelmax = i->second->GetTypeName().size();
446     }
447     OutputDescriptorMapType::const_iterator o;
448     if (full) 
449     {
450            for ( o = mOutput.begin();  o != mOutput.end(); ++o ) 
451            {
452              if (o->second->GetName().size()>namelmax) 
453                namelmax = o->second->GetName().size();
454             if (o->second->GetTypeName().size()>typelmax) 
455                typelmax = o->second->GetTypeName().size();
456            }
457     }
458     //
459
460     for ( i = mInput.begin();  i != mInput.end(); ++i ) 
461     {
462            std::string name(i->second->GetName());
463            name += "'";
464            name.append(1+namelmax-name.size(),' ');
465            std::string type(i->second->GetTypeName());
466            type += ">";
467            type.append(1+typelmax-type.size(),' ');
468            bbtkMessage("Help",1,
469                     "    '"<<name
470                     <<" <"<<type
471                     <<" : "<<i->second->GetDescription()<<std::endl);
472     }
473     if (full) 
474     {
475            if (mOutput.size()) 
476              bbtkMessage("Help",1," * Outputs : "<<std::endl);
477            else 
478              bbtkMessage("Help",1," * No outputs"<<std::endl);
479            for ( o = mOutput.begin();  o != mOutput.end(); ++o ) 
480            {
481              std::string name(o->second->GetName());
482              name += "'";
483              name.append(1+namelmax-name.size(),' ');
484              std::string type(o->second->GetTypeName());
485              type += ">";
486              type.append(1+typelmax-type.size(),' ');
487              bbtkMessage("Help",1,
488                          "    '"<<name
489                          <<" <"<<type
490                          <<" : "<<o->second->GetDescription()<<std::endl);
491            }
492     }
493     if (full) 
494     {
495            const ComplexBlackBox::BlackBoxMapType& B = mPrototype->bbGetBlackBoxMap();
496         
497            if (B.size()) 
498              bbtkMessage("Help",1," * Boxes : "<<std::endl);
499            else 
500              bbtkMessage("Help",1," * No boxes"<<std::endl);
501         
502            ComplexBlackBox::BlackBoxMapType::const_iterator b;
503            for ( b = B.begin(); b != B.end(); ++b ) 
504            {
505              bbtkMessage("Help",1,"    '"<<b->second->bbGetName()<<
506                          "' <"
507                          << b->second->bbGetDescriptor()->GetPackage()->GetName() 
508                          <<"::"
509                          <<b->second->bbGetTypeName()<<">"<<std::endl);
510            }
511     }
512
513   }   
514   //=======================================================================
515
516
517
518 }