1 /*=========================================================================
4 Module: $RCSfile: bbtkBlackBox.cxx,v $
6 Date: $Date: 2008/05/15 08:02:36 $
7 Version: $Revision: 1.19 $
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.
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.
17 =========================================================================*/
22 * \brief Class bbtk::BlackBox : abstract black-box interface.
24 #include "bbtkBlackBox.h"
25 #include "bbtkPackage.h"
26 #include "bbtkMessageManager.h"
27 #include "bbtkFactory.h"
29 #include "bbtkConfigurationFile.h"
30 #include "bbtkWxBlackBox.h"
40 static bool bbmgSomeBoxExecuting = false;
41 static bool bbmgFreezeExecution = false;
42 static std::set<BlackBox::Pointer> bbmgExecutionList;
44 //=========================================================================
45 BlackBox::Deleter::Deleter()
48 //=========================================================================
50 //=========================================================================
51 void BlackBox::Deleter::Delete(Object* p)
53 BlackBox* b = dynamic_cast<BlackBox*>(p);
56 bbtkInternalError("BlackBox::Deleter::Delete("<<p->GetObjectName()
58 <<"dynamic cast to BlackBox* failed !");
60 std::string name = p->GetObjectName();//b->bbGetNameWithParent();
61 bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\")"<<std::endl);
64 BlackBoxDescriptor::WeakPointer desc = b->bbGetDescriptor();
65 bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : deleting black box"<<std::endl);
69 bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : releasing descriptor ["<<desc.lock()<<"]"<<std::endl);
73 Package::WeakPointer pack = desc.lock()->GetPackage();
76 Package::ReleaseBlackBoxDescriptor(pack,desc);
80 bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : descriptor package expired (was not held by a package and the box was the last instance)"<<std::endl);
85 bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : descriptor expired : nothing to do (was not held by a package or the box is a complex black box prototype)"<<std::endl);
87 bbtkDebugMessage("object",2,"<## BlackBox::Deleter(\""<<name<<"\")"<<std::endl);
89 //=========================================================================
91 //=========================================================================
92 BlackBox::BlackBox(const std::string &name)
95 bbmBoxProcessMode("Pipeline"),
99 bbtkDebugMessage("object",4,"==> BlackBox::BlackBox(\""
100 <<name<<"\")"<<std::endl);
101 bbtkDebugMessage("object",4,"<== BlackBox::BlackBox(\""
102 <<name<<"\")"<<std::endl);
104 //=========================================================================
106 //=========================================================================
107 BlackBox::BlackBox(const BlackBox&)
110 //=========================================================================
111 BlackBox::BlackBox(BlackBox& from, const std::string &name)
113 bbmStatus(from.bbmStatus),
114 bbmBoxProcessMode(from.bbmBoxProcessMode),
118 bbtkDebugMessage("object",4,"==> BlackBox::BlackBox("
119 <<from.bbGetFullName()<<",\""
120 <<name<<"\")"<<std::endl);
121 bbtkDebugMessage("object",4,"<== BlackBox::BlackBox("
122 <<from.bbGetFullName()<<",\""
123 <<name<<"\")"<<std::endl);
125 //=========================================================================
128 //=========================================================================
129 BlackBox::~BlackBox()
131 bbtkDebugMessage("object",4,"==> BlackBox::~BlackBox() ["<<bbmName
133 this->bbDesallocateConnectors();
134 bbtkDebugMessage("object",4,"<== BlackBox::~BlackBox() ["<<bbmName
137 //=========================================================================
140 //=========================================================================
141 /// Main processing method of the box.
142 void BlackBox::bbExecute(bool force)
144 bbtkDebugMessageInc("process",2,
145 "=> BlackBox::bbExecute() ["
146 <<bbGetFullName()<<"]"<<std::endl);
148 Wx::BeginBusyCursor();
150 // If execution frozen : return
151 if (bbGlobalGetFreezeExecution())
153 bbtkDebugMessage("process",2,
154 " -> FreezeExecution global flag is 'true' : abort execution"<<std::endl);
157 // If force is true then update is triggered even if the box is UPTODATE
158 if (force) bbSetModifiedStatus();
160 // Calls the main recursive update method
161 bbBackwardUpdate(Connection::Pointer());
165 bbtkDebugMessageDec("process",2,
166 "<= BlackBox::bbExecute() ["
167 <<bbGetFullName()<<"]"<<std::endl);
169 //=========================================================================
171 //=========================================================================
172 std::string BlackBox::bbGetFullName() const
174 return this->bbGetNameWithParent()+"<"+this->bbGetDescriptor()->GetTypeName()+">";
176 //=========================================================================
180 //=========================================================================
181 /// Returns the name with the name of the parent prepended if any
182 std::string BlackBox::bbGetNameWithParent() const
184 if (bbmParent.lock())
186 return bbmParent.lock()->bbGetNameWithParent() + ":" + bbmName;
193 //=========================================================================
195 //=========================================================================
196 /// Prints the Help on the BlackBox type
197 void BlackBox::bbGetHelp(bool full) const
199 bbGetDescriptor()->GetHelp(full);
201 //=========================================================================
204 //=========================================================================
205 /// Returns true if the UserBlackBox has an input of name name
206 bool BlackBox::bbHasInput(const std::string& name) const
208 bbtkDebugMessageInc("Kernel",8,
209 "BlackBox::bbHasInput(\""
210 <<name<<"\") ["<<bbGetFullName()<<"]"
212 bool r = ( bbGetDescriptor()->GetInputDescriptorMap().find(name)
213 != bbGetDescriptor()->GetInputDescriptorMap().end());
214 bbtkDebugDecTab("Kernel",8);
217 //=========================================================================
220 //=========================================================================
221 /// Returns true if the UserBlackBox has an output of name name
222 bool BlackBox::bbHasOutput(const std::string& name) const
224 bbtkDebugMessageInc("Kernel",8,"BlackBox::bbHasOutput(\""
225 <<name<<"\") ["<<bbGetFullName()<<"]"<<std::endl);
226 bool r = ( bbGetDescriptor()->GetOutputDescriptorMap().find(name)
227 != bbGetDescriptor()->GetOutputDescriptorMap().end());
228 bbtkDebugDecTab("Kernel",8);
231 //=========================================================================
234 //=========================================================================
235 /// Gets the output type of a given name
236 TypeInfo BlackBox::bbGetOutputType( const std::string &name ) const
238 bbtkDebugMessageInc("Kernel",8,
239 "BlackBox::bbGetOutputType(\""
240 <<name<<"\") ["<<bbGetFullName()<<"]"<<std::endl);
241 TypeInfo r = bbGetDescriptor()->GetOutputDescriptor(name)->GetTypeInfo();
242 bbtkDebugDecTab("Kernel",8);
245 //=========================================================================
247 //=========================================================================
248 /// Gets the input type of a given name
249 TypeInfo BlackBox::bbGetInputType( const std::string &name ) const
251 bbtkDebugMessageInc("Kernel",8,
252 "BlackBox::bbGetInputType(\""
253 <<name<<"\") ["<<bbGetFullName()<<"]"<<std::endl);
254 TypeInfo r = bbGetDescriptor()->GetInputDescriptor(name)->GetTypeInfo();
255 bbtkDebugDecTab("Kernel",8);
258 //=========================================================================
261 //=========================================================================
262 /// Allocates the i/o connectors of the black box
263 void BlackBox::bbAllocateConnectors()
265 bbtkDebugMessageInc("Kernel",8,
266 "BlackBox::bbAllocateConnectors() ["
267 <<bbGetFullName()<<"]"
269 const BlackBoxDescriptor::InputDescriptorMapType& imap
270 = bbGetDescriptor()->GetInputDescriptorMap();
271 BlackBoxDescriptor::InputDescriptorMapType::const_iterator i;
272 for ( i = imap.begin(); i != imap.end(); ++i )
274 bbtkDebugMessage("Kernel",8,"* Allocate \""<<i->first<<"\""<<std::endl);
275 bbGetInputConnectorMap()[i->second->GetName()]
276 = new BlackBoxInputConnector(GetThisPointer<BlackBox>());
278 const BlackBoxDescriptor::OutputDescriptorMapType& omap
279 = bbGetDescriptor()->GetOutputDescriptorMap();
280 BlackBoxDescriptor::OutputDescriptorMapType::const_iterator o;
281 for ( o = omap.begin(); o != omap.end(); ++o )
283 bbtkDebugMessage("Kernel",8,"* Allocate \""<<o->first<<"\""<<std::endl);
284 bbGetOutputConnectorMap()[o->second->GetName()]
285 = new BlackBoxOutputConnector();
287 bbtkDebugDecTab("Kernel",8);
289 //=========================================================================
292 //=========================================================================
293 /// Desallocates the i/o connectors of the black box
294 void BlackBox::bbDesallocateConnectors()
296 bbtkDebugMessageInc("Kernel",8,
297 "BlackBox::bbDesallocateConnectors()"
300 InputConnectorMapType::const_iterator i;
301 for ( i = bbGetInputConnectorMap().begin();
302 i != bbGetInputConnectorMap().end(); ++i )
304 bbtkDebugMessage("Kernel",8,"* Delete \""<<i->first<<"\""<<std::endl);
307 OutputConnectorMapType::const_iterator o;
308 for ( o = bbGetOutputConnectorMap().begin();
309 o != bbGetOutputConnectorMap().end(); ++o )
311 bbtkDebugMessage("Kernel",8,"* Delete \""<<o->first<<"\""<<std::endl);
315 bbtkDebugDecTab("Kernel",8);
318 //=========================================================================
321 //=========================================================================
322 /// Copies the input / output values from another box
323 void BlackBox::bbCopyIOValues(BlackBox& from)
325 bbtkDebugMessageInc("Kernel",9,
326 "BlackBox::bbCopyIOValues("
327 <<from.bbGetFullName()<<") ["
328 <<bbGetFullName()<<"]"<<std::endl);
329 // copies the input values
330 const BlackBoxDescriptor::InputDescriptorMapType& imap
331 = bbGetDescriptor()->GetInputDescriptorMap();
332 BlackBoxDescriptor::InputDescriptorMapType::const_iterator i;
333 for ( i = imap.begin(); i != imap.end(); ++i )
335 if (! i->second->GetCopyConstruct() ) continue;
336 std::string input = i->second->GetName();
337 this->bbSetInput(input, from.bbGetInput(input) );
339 // copies the output values
340 const BlackBoxDescriptor::OutputDescriptorMapType& omap
341 = bbGetDescriptor()->GetOutputDescriptorMap();
342 BlackBoxDescriptor::OutputDescriptorMapType::const_iterator o;
343 for ( o = omap.begin(); o != omap.end(); ++o )
345 if (! o->second->GetCopyConstruct() ) continue;
346 std::string output = o->second->GetName();
347 this->bbSetOutput(output, from.bbGetOutput(output) );
350 bbtkDebugDecTab("Kernel",9);
353 //=========================================================================
357 //=========================================================================
358 bool BlackBox::bbCanReact() const
360 return ( bbGlobalGetSomeBoxExecuting()
361 #ifdef _USE_WXWIDGETS_
362 || Wx::IsSomeWindowAlive()
366 //=========================================================================
370 //=========================================================================
371 /// User overloadable destruction method of a black box
372 void BlackBox::bbUserDelete()
374 bbtkDebugMessage("process",5,
375 "=> BlackBox::bbUserDelete() ["
376 <<bbGetFullName()<<"]"
377 <<" : not overloaded; using standard deletion"
381 //=========================================================================
384 //=========================================================================
385 BlackBox::BoxProcessModeValue BlackBox::bbGetBoxProcessModeValue() const
387 const std::string& p = bbmBoxProcessMode;
389 (p == "P") || (p == "p") ||
390 (p == "Pipeline") || (p == "pipeline") ) return Pipeline;
392 (p == "A") || (p == "a") ||
393 (p == "Always") || (p == "always") ) return Always;
395 (p == "R") || (p == "r") ||
396 (p == "Reactive") || (p == "reactive") ) return Reactive;
397 bbtkError(bbGetFullName()<<" : BoxProcessMode value '"<<p
398 <<"' unknown. Possible values : "
399 <<"'0'/'P'/'p'/'Pipeline'/'pipeline' | "
400 <<"'1'/'A'/'a'/'Always'/'always' | "
401 <<"'2'/'R'/'r'/'Reactive'/'reactive'"<<std::endl);
403 //=========================================================================
405 //=========================================================================
406 bool BlackBox::bbBoxProcessModeIsReactive() const
408 return (bbGetBoxProcessModeValue() == Reactive);
410 //=========================================================================
412 //=========================================================================
413 bool BlackBox::bbBoxProcessModeIsAlways() const
415 return (bbGetBoxProcessModeValue() == Always);
417 //=========================================================================
419 //=========================================================================
420 /// Signals that the BlackBox has been modified
421 void BlackBox::bbSetModifiedStatus(BlackBoxInputConnector* c)
423 bbtkDebugMessage("modified",1,
424 "==> BlackBox::bbSetModifiedStatus("<<c<<") ["
425 <<bbGetFullName()<<"]"<<std::endl);
427 if ( (c==bbGetInputConnectorMap().find("WinHide")->second) )
428 // && (bbCanReact()))
430 bbtkDebugMessage("modified",2,
431 "-> Hide triggered by WinHide input change"
433 this->bbHideWindow();
434 this->bbSetStatus(MODIFIED);
437 if ( (c==bbGetInputConnectorMap().find("WinClose")->second) )
438 // && (bbCanReact()))
440 bbtkDebugMessage("modified",2,
441 "-> Close triggered by WinClose input change"
443 this->bbHideWindow();
444 this->bbSetStatus(MODIFIED);
448 if ( ( bbBoxProcessModeIsReactive() ||
449 (c==bbGetInputConnectorMap().find("BoxExecute")->second))
452 bbtkDebugMessage("modified",2,
453 "-> Execution triggered by Reactive mode or BoxExecute input change"<<std::endl);
454 this->bbSetStatus(MODIFIED);
455 bbGlobalAddToExecutionList( GetThisPointer<BlackBox>() );
457 else if ( bbGetStatus() == MODIFIED ) //! this->bbIsUptodate())
459 bbtkDebugMessage("modified",2,"-> Already modified"<<std::endl);
464 bbtkDebugMessage("modified",2,"-> Status set to modified"<<std::endl);
465 this->bbSetStatus(MODIFIED);
468 this->bbSignalOutputModification(false);
471 bbtkDebugMessageDec("process",5,
472 "<= BlackBox::bbSetModifiedStatus("<<c<<") ["
473 <<bbGetFullName()<<"]"<<std::endl);
476 //=========================================================================
478 //=========================================================================
479 void BlackBox::bbSignalOutputModification(bool reaction)
481 bbtkDebugMessageInc("process",5,
482 "=> BlackBox::bbSignalOutputModification() ["
483 <<bbGetFullName()<<"]"<<std::endl);
485 OutputConnectorMapType::iterator change = bbGetOutputConnectorMap().end();
486 OutputConnectorMapType::iterator i;
487 for ( i = bbGetOutputConnectorMap().begin();
488 i != bbGetOutputConnectorMap().end(); ++i) {
489 /* if ( i->first == "BoxChange" )
495 i->second->SetModifiedStatus();
497 // if (change != bbGetOutputConnectorMap().end())
498 // change->second->SetModifiedStatus();
500 if (reaction) bbGlobalProcessExecutionList();
502 bbtkDebugMessageDec("process",5,
503 "<= BlackBox::bbSignalOutputModification() ["
504 <<bbGetFullName()<<"]"<<std::endl);
507 //=========================================================================
508 //=========================================================================
509 void BlackBox::bbSignalOutputModification(const std::string& output,
512 bbtkDebugMessageInc("process",5,
513 "=> BlackBox::bbSignalOutputModification("
515 <<bbGetFullName()<<"]"<<std::endl);
517 OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(output);
518 if ( i == bbGetOutputConnectorMap().end() )
520 bbtkError("BlackBox["<<bbGetFullName()<<"]::bbSignalOutputModification("<<output<<") : unknown output");
522 i->second->SetModifiedStatus();
523 // Has to notify the output "BoxChange" also
524 if (output != "BoxChange")
526 i = bbGetOutputConnectorMap().find("BoxChange");
527 if ( i != bbGetOutputConnectorMap().end() )
529 i->second->SetModifiedStatus();
532 if (reaction) bbGlobalProcessExecutionList();
534 bbtkDebugMessageDec("process",5,
535 "<= BlackBox::bbSignalOutputModification("
537 <<bbGetFullName()<<"]"<<std::endl);
540 //=========================================================================
541 //=========================================================================
542 void BlackBox::bbSignalOutputModification(const std::vector<std::string>& output,
545 bbtkDebugMessageInc("process",5,
546 "=> BlackBox::bbSignalOutputModification(vector of outputs) ["
547 <<bbGetFullName()<<"]"<<std::endl);
548 OutputConnectorMapType::iterator i;
549 std::vector<std::string>::const_iterator o;
550 for (o=output.begin();o!=output.end();++o)
552 // the output "BoxChange" must be signaled **AFTER** all others
553 if (*o == "BoxChange") continue;
554 // Look for the connector
555 i = bbGetOutputConnectorMap().find(*o);
556 if ( i == bbGetOutputConnectorMap().end() )
558 bbtkError("BlackBox["<<bbGetFullName()<<"]::bbSignalOutputModification("<<*o<<") : unknown output");
560 i->second->SetModifiedStatus();
562 // Has to notify the output "BoxChange" also
563 i = bbGetOutputConnectorMap().find("BoxChange");
564 if ( i != bbGetOutputConnectorMap().end() )
566 i->second->SetModifiedStatus();
568 if (reaction) bbGlobalProcessExecutionList();
570 bbtkDebugMessageDec("process",5,
571 "<= BlackBox::bbSignalOutputModification(vector of outputs) ["
572 <<bbGetFullName()<<"]"<<std::endl);
575 //=========================================================================
577 //=========================================================================
578 /// Updates the BlackBox inputs
579 /// \returns UPTODATE if all inputs are in UPTODATE status after update
581 IOStatus BlackBox::bbUpdateInputs(bool excludeParent)
583 bbtkDebugMessageInc("process",4,
584 "=> BlackBox::bbUpdateInputs() ["
585 <<bbGetFullName()<<"]"
588 IOStatus s = UPTODATE;
590 InputConnectorMapType::iterator i;
591 for ( i = bbGetInputConnectorMap().begin();
592 i!= bbGetInputConnectorMap().end(); ++i)
594 if (excludeParent && (i->first=="WinParent")) continue;
595 if (i->first=="WinHide") continue;
596 // If input type is Void : no recurse
597 //if ( bbGetDescriptor()->GetInputDescriptor(i->first)->GetTypeInfo()
601 IOStatus t = i->second->BackwardUpdate();
602 if (t==MODIFIED) s = MODIFIED;
605 bbtkDebugMessageDec("process",4,
606 "<= BlackBox::bbUpdateInputs() ["
607 <<bbGetFullName()<<"]"
613 //=========================================================================
616 //=========================================================================
617 /// Connects the input <name> to the connection c
618 void BlackBox::bbConnectInput( const std::string& name, Connection* c)
620 bbtkDebugMessage("connection",2,
621 "==> BlackBox::bbConnectInput(\""
622 <<name<<"\","<<c->GetFullName()<<") ["
623 <<bbGetFullName()<<"]"
627 InputConnectorMapType::iterator i = bbGetInputConnectorMap().find(name);
628 if (i==bbGetInputConnectorMap().end())
630 bbtkError("no input called '"<<name<<"'");
632 i->second->SetConnection(c);
634 bbtkDebugMessage("connection",2,
635 "<== BlackBox::bbConnectInput(\""
636 <<name<<"\","<<c->GetFullName()<<") ["
637 <<bbGetFullName()<<"]"
639 // bbSetModifiedStatus();
642 //=========================================================================
645 //=========================================================================
646 /// Connects the output <name> to the connection c
647 void BlackBox::bbConnectOutput( const std::string& name, Connection* c)
649 bbtkDebugMessage("connection",2,
650 "==> BlackBox::bbConnectOutput(\""<<name<<"\","
651 <<c->GetFullName()<<") ["
652 <<bbGetFullName()<<"]"<<std::endl);
654 OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(name);
655 if (i==bbGetOutputConnectorMap().end())
657 bbtkError("no output called '"<<name<<"'");
659 i->second->SetConnection(c);
661 bbtkDebugMessage("connection",2,
662 "<== BlackBox::bbConnectOutput(\""<<name<<"\","
663 <<c->GetFullName()<<") ["
664 <<bbGetFullName()<<"]"<<std::endl);
667 //=========================================================================
670 //=========================================================================
671 /// Disconnects the input <name> from the connection c
672 void BlackBox::bbDisconnectInput( const std::string& name, Connection* c)
675 bbtkDebugMessage("connection",2,
676 "==> BlackBox::bbDisconnectInput(\""<<name
677 <<"\","<<c->GetFullName()<<") ["
678 <<bbGetFullName()<<"]"
684 bbtkDebugMessage("connection",2,"c==0"<<std::endl);
688 InputConnectorMapType::iterator i = bbGetInputConnectorMap().find(name);
689 if (i==bbGetInputConnectorMap().end())
691 bbtkError("no input called '"<<name<<"'");
693 i->second->UnsetConnection(c);
695 bbtkDebugMessage("connection",2,
696 "<== BlackBox::bbDisconnectInput(\""<<name
697 <<"\","<<c->GetFullName()<<") ["
698 <<bbGetFullName()<<"]"
702 //=========================================================================
705 //=========================================================================
706 /// Disconnects the output <name> from the connection c
707 void BlackBox::bbDisconnectOutput( const std::string& name, Connection* c)
709 bbtkDebugMessage("connection",2,
710 "==> BlackBox::bbDisconnectOutput(\""<<name
711 <<"\","<<c->GetFullName()<<") ["
712 <<bbGetFullName()<<"]"
717 bbtkDebugMessage("connection",2,"c==0"<<std::endl);
721 OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(name);
722 if (i==bbGetOutputConnectorMap().end())
724 bbtkError("no output called '"<<name<<"'");
726 i->second->UnsetConnection(c);
728 bbtkDebugMessage("connection",2,
729 "<== BlackBox::bbDisconnectOutput(\""<<name
730 <<"\","<<c->GetFullName()<<") ["
731 <<bbGetFullName()<<"]"
734 //=========================================================================
737 //=========================================================================
739 void BlackBox::bbWriteDotInputOutputName(FILE *ff,bool inputoutput,int detail, int level)
741 fprintf(ff,"%s%p",bbGetTypeName().c_str(),this);
743 //=========================================================================
746 //=========================================================================
747 std::string BlackBox::bbGetOutputAsString( const std::string &output )
750 // Looks for the adaptor
751 if (bbGetOutputType(output).name() != typeid(std::string).name() )
754 Package::Pointer p = bbGetDescriptor()->GetPackage();
755 if ((p != 0) && ( ! p->GetFactorySet().empty() ) )
757 Factory::Pointer f = p->GetFactorySet().begin()->lock();
762 bbGetOutputType(output),
765 } catch (bbtk::Exception e)
770 a->bbSetInput("In",bbGetOutput(output));
772 v = a->bbGetOutput("Out").unsafe_get<std::string>() ;
774 v="? (no adaptor found)";
779 v="? (no factory found)";
785 v = bbGetOutput(output).unsafe_get<std::string>() ;
789 //=========================================================================
791 //=========================================================================
792 std::string BlackBox::bbGetInputAsString( const std::string &input )
795 // Looks for the adaptor
796 if (bbGetInputType(input) != typeid(std::string))
799 Package::Pointer p = bbGetDescriptor()->GetPackage();
800 if ((p != 0) && ( ! p->GetFactorySet().empty() ) )
802 Factory::Pointer f = p->GetFactorySet().begin()->lock();
807 bbGetInputType(input),
810 }catch (bbtk::Exception e)
816 a->bbSetInput("In",bbGetInput(input));
818 v = a->bbGetOutput("Out").unsafe_get<std::string>() ;
822 v="? (no adaptor found)";
827 v="? (no factory found)";
832 v = bbGetInput(input).unsafe_get<std::string>() ;
836 //=======================================================================
838 //=======================================================================
839 // Replaces substrings "<" by "["
840 void SubsBrackets ( std::string& s )
842 // std::cout << "BEFORE=["<<s<<"]"<<std::endl;
844 std::string::size_type pos = 0;
847 while ( pos != std::string::npos )
849 // std::cout << "*** find one "<<std::endl;
850 s.replace(pos,1,cr,1);
851 pos = s.find(ss, pos);
857 while ( pos != std::string::npos )
859 // std::cout << "*** find one "<<std::endl;
860 s.replace(pos,1,cr,1);
861 pos = s.find(ss, pos);
867 while ( pos != std::string::npos )
869 // std::cout << "*** find one "<<std::endl;
870 s.replace(pos,1,cr,1);
871 pos = s.find(ss, pos);
872 } // std::cout << "AFTER=["<<s<<"]"<<std::endl;
874 //=======================================================================
876 //=========================================================================
877 /// Write Graphviz-dot description in file
878 void BlackBox::bbWriteDotFileBlackBox(FILE *ff,
879 BlackBox::Pointer parentblackbox,
880 int detail, int level,
885 InputConnectorMapType::iterator i;
887 std::string labelStr;
888 std::string valueStr("");
891 labelStr = bbGetName() ;
893 labelStr = labelStr + "\\n[" +this->bbGetDescriptor()->GetPackage()->GetName()+"::"+ bbGetTypeName() + "]";
895 labelStr = bbGetName();
896 labelStr = labelStr + " [" +this->bbGetDescriptor()->GetPackage()->GetName()+"::"+ bbGetTypeName() + "] ";
899 SubsBrackets(labelStr);
902 labelStr = labelStr + " | {{ ";
903 std::string tempStrTypeName;
906 for ( i = mInputConnectorMap.begin(); i != mInputConnectorMap.end(); ++i )
910 labelStr=labelStr+" | ";
913 if (instanceOrtype==true)
915 valueStr = this->bbGetInputAsString(i->first) + " = ";
917 const BlackBoxInputDescriptor* id = bbGetDescriptor()->GetInputDescriptor(i->first);
918 tempStrTypeName=id->GetTypeName();
919 SubsBrackets(tempStrTypeName);
920 std::string Name(i->first);
922 labelStr=labelStr + "<"+i->first.c_str()+"> " + valueStr + Name.c_str() + " [" + tempStrTypeName.c_str() + "]";
924 labelStr=labelStr+ " } | {";
926 OutputConnectorMapType::iterator ii;
927 for ( ii = mOutputConnectorMap.begin(); ii != mOutputConnectorMap.end(); ++ii )
931 labelStr=labelStr+" | ";
934 if (instanceOrtype==true)
936 valueStr = this->bbGetOutputAsString(ii->first) + " = ";
938 const BlackBoxOutputDescriptor* id = bbGetDescriptor()->GetOutputDescriptor(ii->first);
939 tempStrTypeName=id->GetTypeName();
940 SubsBrackets(tempStrTypeName);
941 std::string Name(ii->first);
943 labelStr=labelStr+"<"+ii->first.c_str()+"> " + valueStr + Name.c_str() + " ["+tempStrTypeName+"]";
945 labelStr = labelStr+ " } }" ;
949 bbWriteDotInputOutputName(ff,true,detail,level);
950 std::string tmp ( bbGetTypeName() );
954 url = this->bbGetDescriptor()->GetPackage()->GetDocRelativeURL() + "#" + tmp;
956 url = this->bbGetDescriptor()->GetPackage()->GetDocURL() + "#" + tmp;
958 fprintf( ff , " [shape=record, URL=\"%s\",label=\"%s\"]%s\n",url.c_str(),labelStr.c_str(),";" );
959 // std::cout << labelStr << std::endl;
962 if (GetThisPointer<BlackBox>()!=parentblackbox){
963 for ( i = mInputConnectorMap.begin(); i != mInputConnectorMap.end(); ++i )
967 Connection* con = i->second->GetConnection();
969 BlackBox::Pointer a=con->GetOriginalBlackBoxFrom();
970 BlackBox::Pointer b=con->GetOriginalBlackBoxTo();
972 a->bbWriteDotInputOutputName(ff,false,detail,level);
975 fprintf(ff,":%s",con->GetOriginalBlackBoxFromOutput().c_str());
978 b->bbWriteDotInputOutputName(ff,true,detail,level);
981 fprintf(ff,":%s",con->GetOriginalBlackBoxToInput().c_str());
983 fprintf(ff,"%s\n",";");
987 } // if parentblackbox
989 //=========================================================================
994 //=========================================================================
995 void BlackBox::bbShowRelations(BlackBox::Pointer parentblackbox,
996 int detail, int level
997 /*,Factory *factory*/ )
1000 if (this->bbGetDescriptor()->GetPackage())
1002 bbtkMessage("Help",1,"Black Box '"<<bbGetName()<<"' <"<<
1003 this->bbGetDescriptor()->GetPackage()->GetName()
1004 <<"::"<<this->bbGetDescriptor()->GetTypeName()<<">"<<std::endl);
1008 bbtkMessage("Help",1,"Black Box <::"<<this->bbGetDescriptor()->GetTypeName()<<">"<<std::endl);
1010 // bbtkMessage("Help",1," "<<GetDescription()<<std::endl);
1011 // bbtkMessage("Help",1," By : "<<GetAuthor()<<std::endl);
1013 std::vector<std::string> iname;
1014 std::vector<std::string> ivalue;
1015 std::vector<std::string> iconn;
1017 InputConnectorMapType::iterator i;
1018 unsigned int namelmax = 0;
1019 unsigned int valuelmax = 0;
1020 unsigned int connlmax = 0;
1021 for ( i = mInputConnectorMap.begin(); i != mInputConnectorMap.end(); ++i )
1023 iname.push_back(i->first);
1024 if (iname.back().size()>namelmax) namelmax = iname.back().size();
1025 ivalue.push_back(bbGetInputAsString(i->first));
1026 if (ivalue.back().size()>valuelmax) valuelmax = ivalue.back().size();
1028 Connection* con = i->second->GetConnection();
1030 s = con->GetOriginalBlackBoxFrom()->bbGetName();
1032 s += con->GetOriginalBlackBoxFromOutput();
1036 OutputConnectorMapType::iterator o;
1037 std::vector<std::string> oname;
1038 std::vector<std::string> ovalue;
1039 std::vector<std::vector<std::string> > oconn;
1040 for ( o = mOutputConnectorMap.begin(); o != mOutputConnectorMap.end(); ++o )
1042 oname.push_back(o->first);
1043 if (oname.back().size()>namelmax) namelmax = oname.back().size();
1044 ovalue.push_back(bbGetOutputAsString(o->first));
1045 if (ovalue.back().size()>valuelmax) valuelmax = ovalue.back().size();
1046 std::vector<std::string> ss;
1047 const std::vector<Connection*>& con
1048 = o->second->GetConnectionVector();
1049 std::vector<Connection*>::const_iterator c;
1050 for (c=con.begin();c!=con.end();++c)
1053 s = (*c)->GetOriginalBlackBoxTo()->bbGetName();
1055 s += (*c)->GetOriginalBlackBoxToInput();
1058 oconn.push_back(ss);
1062 bbtkMessage("Help",1," * Inputs : "<<std::endl);
1064 bbtkMessage("Help",1," * No inputs"<<std::endl);
1066 std::vector<std::string>::iterator i1,i2,i3;
1067 for (i1=iname.begin(),i2=ivalue.begin(),i3=iconn.begin();
1068 i1!=iname.end(),i2!=ivalue.end(),i3!=iconn.end();
1071 std::string name(*i1);
1073 name.append(1+namelmax-name.size(),' ');
1074 std::string value(*i2);
1076 value.append(1+valuelmax-value.size(),' ');
1078 bbtkMessage("Help",1," '"<<name<<" = '"<<value<<" <-- '"<<*i3<<"'"<<std::endl);
1080 bbtkMessage("Help",1," '"<<name<<" = '"<<value<<std::endl);
1084 bbtkMessage("Help",1," * Outputs : "<<std::endl);
1086 bbtkMessage("Help",1," * No outputs"<<std::endl);
1088 std::vector<std::vector<std::string> >::iterator i4;
1090 for (i1=oname.begin(),i2=ovalue.begin(),i4=oconn.begin();
1091 i1!=oname.end(),i2!=ovalue.end(),i4!=oconn.end();
1094 std::string name(*i1);
1096 name.append(1+namelmax-name.size(),' ');
1097 std::string value(*i2);
1099 value.append(1+valuelmax-value.size(),' ');
1101 bbtkMessage("Help",1," '"<<name<<" = '"<<value<<std::endl);
1104 std::string pref = " '"+name+" = '"+value;
1105 for (i3=i4->begin();i3!=i4->end();++i3)
1107 bbtkMessage("Help",1,pref<<" --> '"<<*i3<<"'"<<std::endl);
1108 pref.replace(0,pref.size(),pref.size(),' ');
1114 //=========================================================================
1117 //=========================================================================
1118 void BlackBox::bbGlobalProcessExecutionList()
1120 bbtkDebugMessageInc("process",3,
1121 "=> BlackBox::bbGlobalProcessExecutionList()"
1124 std::set<BlackBox::Pointer>::iterator i;
1125 for (i=bbmgExecutionList.begin();
1126 i!=bbmgExecutionList.end();
1129 bbtkDebugMessage("process",4,
1130 " -> Executing "<<(*i)->bbGetFullName()<<std::endl);
1131 (*i)->bbExecute(true);
1134 bbmgExecutionList.clear();
1135 bbtkDebugMessageDec("process",3,
1136 "<= BlackBox::bbGlobalProcessExecutionList()"
1141 //=========================================================================
1143 bool BlackBox::bbGlobalGetSomeBoxExecuting()
1145 return bbmgSomeBoxExecuting;
1148 void BlackBox::bbGlobalSetSomeBoxExecuting(bool b)
1150 bbmgSomeBoxExecuting = b;
1153 void BlackBox::bbGlobalSetFreezeExecution(bool b)
1155 bbmgFreezeExecution = b;
1158 bool BlackBox::bbGlobalGetFreezeExecution()
1160 return bbmgFreezeExecution;
1163 void BlackBox::bbGlobalAddToExecutionList( BlackBox::Pointer b )
1165 bbmgExecutionList.insert(b);
1169 //=========================================================================
1170 // Static members initialization
1172 bool BlackBox::bbmgSomeBoxExecuting = false;
1173 bool BlackBox::bbmgFreezeExecution = false;
1174 std::set<BlackBox*> BlackBox::bbmgExecutionList;
1176 //=========================================================================
1178 //=========================================================================
1179 void BlackBox::Check(bool recursive)
1181 bbtkMessage("debug",1,"*** Checking Black Box "<<(void*)this<<" ["<<bbGetFullName()
1182 <<"] ... OK"<<std::endl);
1184 //=========================================================================
1188 } // EO namespace bbtk