1 /*=========================================================================
4 Module: $RCSfile: bbtkBlackBox.cxx,v $
6 Date: $Date: 2008/07/24 14:37:05 $
7 Version: $Revision: 1.23 $
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)
96 bbmBoxProcessMode("Pipeline"),
100 bbtkDebugMessage("object",4,"==> BlackBox::BlackBox(\""
101 <<name<<"\")"<<std::endl);
102 bbtkDebugMessage("object",4,"<== BlackBox::BlackBox(\""
103 <<name<<"\")"<<std::endl);
105 //=========================================================================
107 //=========================================================================
108 BlackBox::BlackBox(const BlackBox&)
111 //=========================================================================
112 BlackBox::BlackBox(BlackBox& from, const std::string &name)
114 bbmStatus(from.bbmStatus),
116 bbmBoxProcessMode(from.bbmBoxProcessMode),
120 bbtkDebugMessage("object",4,"==> BlackBox::BlackBox("
121 <<from.bbGetFullName()<<",\""
122 <<name<<"\")"<<std::endl);
123 bbtkDebugMessage("object",4,"<== BlackBox::BlackBox("
124 <<from.bbGetFullName()<<",\""
125 <<name<<"\")"<<std::endl);
127 //=========================================================================
130 //=========================================================================
131 BlackBox::~BlackBox()
133 bbtkDebugMessage("object",4,"==> BlackBox::~BlackBox() ["<<bbmName
135 this->bbDesallocateConnectors();
136 bbtkDebugMessage("object",4,"<== BlackBox::~BlackBox() ["<<bbmName
139 //=========================================================================
142 //=========================================================================
143 /// Main processing method of the box.
144 void BlackBox::bbExecute(bool force)
146 bbtkDebugMessageInc("process",2,
147 "=> BlackBox::bbExecute() ["
148 <<bbGetFullName()<<"]"<<std::endl);
152 // If execution frozen : return
153 if (bbGlobalGetFreezeExecution())
155 bbtkDebugMessage("process",2,
156 " -> FreezeExecution global flag is 'true' : abort execution"<<std::endl);
159 // If force is true then update is triggered even if the box is UPTODATE
160 if (force) bbSetModifiedStatus();
162 // Calls the main recursive update method
163 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>() );
458 else if ( bbGetStatus() == MODIFIED ) //! this->bbIsUptodate())
460 bbtkDebugMessage("modified",2,"-> Already modified"<<std::endl);
466 bbtkDebugMessage("modified",2,"-> Status set to modified"<<std::endl);
467 this->bbSetStatus(MODIFIED);
470 this->bbSignalOutputModification(false);
473 bbtkDebugMessageDec("process",5,
474 "<= BlackBox::bbSetModifiedStatus("<<c<<") ["
475 <<bbGetFullName()<<"]"<<std::endl);
478 //=========================================================================
480 //=========================================================================
481 void BlackBox::bbSignalOutputModification(bool reaction)
483 bbtkDebugMessageInc("process",5,
484 "=> BlackBox::bbSignalOutputModification() ["
485 <<bbGetFullName()<<"]"<<std::endl);
487 OutputConnectorMapType::iterator change = bbGetOutputConnectorMap().end();
488 OutputConnectorMapType::iterator i;
489 for ( i = bbGetOutputConnectorMap().begin();
490 i != bbGetOutputConnectorMap().end(); ++i) {
491 /* if ( i->first == "BoxChange" )
497 i->second->SetModifiedStatus();
499 // if (change != bbGetOutputConnectorMap().end())
500 // change->second->SetModifiedStatus();
502 if (reaction) bbGlobalProcessExecutionList();
504 bbtkDebugMessageDec("process",5,
505 "<= BlackBox::bbSignalOutputModification() ["
506 <<bbGetFullName()<<"]"<<std::endl);
509 //=========================================================================
510 //=========================================================================
511 void BlackBox::bbSignalOutputModification(const std::string& output,
514 bbtkDebugMessageInc("process",5,
515 "=> BlackBox::bbSignalOutputModification("
517 <<bbGetFullName()<<"]"<<std::endl);
519 OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(output);
520 if ( i == bbGetOutputConnectorMap().end() )
522 bbtkError("BlackBox["<<bbGetFullName()<<"]::bbSignalOutputModification("<<output<<") : unknown output");
524 i->second->SetModifiedStatus();
525 // Has to notify the output "BoxChange" also
526 if (output != "BoxChange")
528 i = bbGetOutputConnectorMap().find("BoxChange");
529 if ( i != bbGetOutputConnectorMap().end() )
531 i->second->SetModifiedStatus();
534 if (reaction) bbGlobalProcessExecutionList();
536 bbtkDebugMessageDec("process",5,
537 "<= BlackBox::bbSignalOutputModification("
539 <<bbGetFullName()<<"]"<<std::endl);
542 //=========================================================================
543 //=========================================================================
544 void BlackBox::bbSignalOutputModification(const std::vector<std::string>& output,
547 bbtkDebugMessageInc("process",5,
548 "=> BlackBox::bbSignalOutputModification(vector of outputs) ["
549 <<bbGetFullName()<<"]"<<std::endl);
550 OutputConnectorMapType::iterator i;
551 std::vector<std::string>::const_iterator o;
552 for (o=output.begin();o!=output.end();++o)
554 // the output "BoxChange" must be signaled **AFTER** all others
555 if (*o == "BoxChange") continue;
556 // Look for the connector
557 i = bbGetOutputConnectorMap().find(*o);
558 if ( i == bbGetOutputConnectorMap().end() )
560 bbtkError("BlackBox["<<bbGetFullName()<<"]::bbSignalOutputModification("<<*o<<") : unknown output");
562 i->second->SetModifiedStatus();
564 // Has to notify the output "BoxChange" also
565 i = bbGetOutputConnectorMap().find("BoxChange");
566 if ( i != bbGetOutputConnectorMap().end() )
568 i->second->SetModifiedStatus();
570 if (reaction) bbGlobalProcessExecutionList();
572 bbtkDebugMessageDec("process",5,
573 "<= BlackBox::bbSignalOutputModification(vector of outputs) ["
574 <<bbGetFullName()<<"]"<<std::endl);
577 //=========================================================================
579 //=========================================================================
580 /// Updates the BlackBox inputs
581 /// \returns UPTODATE if all inputs are in UPTODATE status after update
583 IOStatus BlackBox::bbUpdateInputs(bool excludeParent)
585 bbtkDebugMessageInc("process",4,
586 "=> BlackBox::bbUpdateInputs() ["
587 <<bbGetFullName()<<"]"
590 IOStatus s = UPTODATE;
592 InputConnectorMapType::iterator i;
593 for ( i = bbGetInputConnectorMap().begin();
594 i!= bbGetInputConnectorMap().end(); ++i)
596 if (excludeParent && (i->first=="WinParent")) continue;
597 if (i->first=="WinHide") continue;
598 // If input type is Void : no recurse
599 //if ( bbGetDescriptor()->GetInputDescriptor(i->first)->GetTypeInfo()
603 IOStatus t = i->second->BackwardUpdate();
604 if (t==MODIFIED) s = MODIFIED;
607 bbtkDebugMessageDec("process",4,
608 "<= BlackBox::bbUpdateInputs() ["
609 <<bbGetFullName()<<"]"
615 //=========================================================================
618 //=========================================================================
619 /// Connects the input <name> to the connection c
620 void BlackBox::bbConnectInput( const std::string& name, Connection* c)
622 bbtkDebugMessage("connection",2,
623 "==> BlackBox::bbConnectInput(\""
624 <<name<<"\","<<c->GetFullName()<<") ["
625 <<bbGetFullName()<<"]"
629 InputConnectorMapType::iterator i = bbGetInputConnectorMap().find(name);
630 if (i==bbGetInputConnectorMap().end())
632 bbtkError("no input called '"<<name<<"'");
634 i->second->SetConnection(c);
636 bbtkDebugMessage("connection",2,
637 "<== BlackBox::bbConnectInput(\""
638 <<name<<"\","<<c->GetFullName()<<") ["
639 <<bbGetFullName()<<"]"
641 // bbSetModifiedStatus();
644 //=========================================================================
647 //=========================================================================
648 /// Connects the output <name> to the connection c
649 void BlackBox::bbConnectOutput( const std::string& name, Connection* c)
651 bbtkDebugMessage("connection",2,
652 "==> BlackBox::bbConnectOutput(\""<<name<<"\","
653 <<c->GetFullName()<<") ["
654 <<bbGetFullName()<<"]"<<std::endl);
656 OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(name);
657 if (i==bbGetOutputConnectorMap().end())
659 bbtkError("no output called '"<<name<<"'");
661 i->second->SetConnection(c);
663 bbtkDebugMessage("connection",2,
664 "<== BlackBox::bbConnectOutput(\""<<name<<"\","
665 <<c->GetFullName()<<") ["
666 <<bbGetFullName()<<"]"<<std::endl);
669 //=========================================================================
672 //=========================================================================
673 /// Disconnects the input <name> from the connection c
674 void BlackBox::bbDisconnectInput( const std::string& name, Connection* c)
677 bbtkDebugMessage("connection",2,
678 "==> BlackBox::bbDisconnectInput(\""<<name
679 <<"\","<<c->GetFullName()<<") ["
680 <<bbGetFullName()<<"]"
686 bbtkDebugMessage("connection",2,"c==0"<<std::endl);
690 InputConnectorMapType::iterator i = bbGetInputConnectorMap().find(name);
691 if (i==bbGetInputConnectorMap().end())
693 bbtkError("no input called '"<<name<<"'");
695 i->second->UnsetConnection(c);
697 bbtkDebugMessage("connection",2,
698 "<== BlackBox::bbDisconnectInput(\""<<name
699 <<"\","<<c->GetFullName()<<") ["
700 <<bbGetFullName()<<"]"
704 //=========================================================================
707 //=========================================================================
708 /// Disconnects the output <name> from the connection c
709 void BlackBox::bbDisconnectOutput( const std::string& name, Connection* c)
711 bbtkDebugMessage("connection",2,
712 "==> BlackBox::bbDisconnectOutput(\""<<name
713 <<"\","<<c->GetFullName()<<") ["
714 <<bbGetFullName()<<"]"
719 bbtkDebugMessage("connection",2,"c==0"<<std::endl);
723 OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(name);
724 if (i==bbGetOutputConnectorMap().end())
726 bbtkError("no output called '"<<name<<"'");
728 i->second->UnsetConnection(c);
730 bbtkDebugMessage("connection",2,
731 "<== BlackBox::bbDisconnectOutput(\""<<name
732 <<"\","<<c->GetFullName()<<") ["
733 <<bbGetFullName()<<"]"
736 //=========================================================================
739 //=========================================================================
741 void BlackBox::bbWriteDotInputOutputName(FILE *ff,bool inputoutput,int detail, int level)
743 fprintf(ff,"%s%p",bbGetTypeName().c_str(),this);
745 //=========================================================================
748 //=========================================================================
749 std::string BlackBox::bbGetOutputAsString( const std::string &output )
752 // Looks for the adaptor
753 if (bbGetOutputType(output).name() != typeid(std::string).name() )
756 Package::Pointer p = bbGetDescriptor()->GetPackage();
757 if ((p != 0) && ( ! p->GetFactorySet().empty() ) )
759 Factory::Pointer f = p->GetFactorySet().begin()->lock();
764 bbGetOutputType(output),
767 } catch (bbtk::Exception e)
772 a->bbSetInput("In",bbGetOutput(output));
774 v = a->bbGetOutput("Out").unsafe_get<std::string>() ;
776 v="? (no adaptor found)";
781 v="? (no factory found)";
787 v = bbGetOutput(output).unsafe_get<std::string>() ;
791 //=========================================================================
793 //=========================================================================
794 std::string BlackBox::bbGetInputAsString( const std::string &input )
797 // Looks for the adaptor
798 if (bbGetInputType(input) != typeid(std::string))
801 Package::Pointer p = bbGetDescriptor()->GetPackage();
802 if ((p != 0) && ( ! p->GetFactorySet().empty() ) )
804 Factory::Pointer f = p->GetFactorySet().begin()->lock();
809 bbGetInputType(input),
812 }catch (bbtk::Exception e)
818 a->bbSetInput("In",bbGetInput(input));
820 v = a->bbGetOutput("Out").unsafe_get<std::string>() ;
824 v="? (no adaptor found)";
829 v="? (no factory found)";
834 v = bbGetInput(input).unsafe_get<std::string>() ;
838 //=======================================================================
840 //=======================================================================
841 // Replaces substrings "<" by "["
842 void SubsBrackets ( std::string& s )
844 // std::cout << "BEFORE=["<<s<<"]"<<std::endl;
846 std::string::size_type pos = 0;
849 while ( pos != std::string::npos )
851 // std::cout << "*** find one "<<std::endl;
852 s.replace(pos,1,cr,1);
853 pos = s.find(ss, pos);
859 while ( pos != std::string::npos )
861 // std::cout << "*** find one "<<std::endl;
862 s.replace(pos,1,cr,1);
863 pos = s.find(ss, pos);
869 while ( pos != std::string::npos )
871 // std::cout << "*** find one "<<std::endl;
872 s.replace(pos,1,cr,1);
873 pos = s.find(ss, pos);
874 } // std::cout << "AFTER=["<<s<<"]"<<std::endl;
876 //=======================================================================
878 //=========================================================================
879 /// Write Graphviz-dot description in file
880 void BlackBox::bbWriteDotFileBlackBox(FILE *ff,
881 BlackBox::Pointer parentblackbox,
882 int detail, int level,
887 InputConnectorMapType::iterator i;
889 std::string labelStr;
890 std::string valueStr("");
893 labelStr = bbGetName() ;
895 labelStr = labelStr + "\\n[" +this->bbGetDescriptor()->GetPackage()->GetName()+"::"+ bbGetTypeName() + "]";
897 labelStr = bbGetName();
898 labelStr = labelStr + " [" +this->bbGetDescriptor()->GetPackage()->GetName()+"::"+ bbGetTypeName() + "] ";
901 SubsBrackets(labelStr);
904 labelStr = labelStr + " | {{ ";
905 std::string tempStrTypeName;
908 for ( i = mInputConnectorMap.begin(); i != mInputConnectorMap.end(); ++i )
912 labelStr=labelStr+" | ";
915 if (instanceOrtype==true)
917 valueStr = this->bbGetInputAsString(i->first) + " = ";
919 const BlackBoxInputDescriptor* id = bbGetDescriptor()->GetInputDescriptor(i->first);
920 tempStrTypeName=id->GetTypeName();
921 SubsBrackets(tempStrTypeName);
922 std::string Name(i->first);
924 labelStr=labelStr + "<"+i->first.c_str()+"> " + valueStr + Name.c_str() + " [" + tempStrTypeName.c_str() + "]";
926 labelStr=labelStr+ " } | {";
928 OutputConnectorMapType::iterator ii;
929 for ( ii = mOutputConnectorMap.begin(); ii != mOutputConnectorMap.end(); ++ii )
933 labelStr=labelStr+" | ";
936 if (instanceOrtype==true)
938 valueStr = this->bbGetOutputAsString(ii->first) + " = ";
940 const BlackBoxOutputDescriptor* id = bbGetDescriptor()->GetOutputDescriptor(ii->first);
941 tempStrTypeName=id->GetTypeName();
942 SubsBrackets(tempStrTypeName);
943 std::string Name(ii->first);
945 labelStr=labelStr+"<"+ii->first.c_str()+"> " + valueStr + Name.c_str() + " ["+tempStrTypeName+"]";
947 labelStr = labelStr+ " } }" ;
951 bbWriteDotInputOutputName(ff,true,detail,level);
952 std::string tmp ( bbGetTypeName() );
956 url = this->bbGetDescriptor()->GetPackage()->GetDocRelativeURL() + "#" + tmp;
958 url = this->bbGetDescriptor()->GetPackage()->GetDocURL() + "#" + tmp;
960 fprintf( ff , " [shape=record, URL=\"%s\",label=\"%s\"]%s\n",url.c_str(),labelStr.c_str(),";" );
961 // std::cout << labelStr << std::endl;
964 if (GetThisPointer<BlackBox>()!=parentblackbox){
965 for ( i = mInputConnectorMap.begin(); i != mInputConnectorMap.end(); ++i )
969 Connection* con = i->second->GetConnection();
971 BlackBox::Pointer a=con->GetOriginalBlackBoxFrom();
972 BlackBox::Pointer b=con->GetOriginalBlackBoxTo();
974 a->bbWriteDotInputOutputName(ff,false,detail,level);
977 fprintf(ff,":%s",con->GetOriginalBlackBoxFromOutput().c_str());
980 b->bbWriteDotInputOutputName(ff,true,detail,level);
983 fprintf(ff,":%s",con->GetOriginalBlackBoxToInput().c_str());
985 fprintf(ff,"%s\n",";");
989 } // if parentblackbox
991 //=========================================================================
996 //=========================================================================
997 void BlackBox::bbShowRelations(BlackBox::Pointer parentblackbox,
998 int detail, int level
999 /*,Factory *factory*/ )
1002 if (this->bbGetDescriptor()->GetPackage())
1004 bbtkMessage("Help",1,"Black Box '"<<bbGetName()<<"' <"<<
1005 this->bbGetDescriptor()->GetPackage()->GetName()
1006 <<"::"<<this->bbGetDescriptor()->GetTypeName()<<">"<<std::endl);
1010 bbtkMessage("Help",1,"Black Box <::"<<this->bbGetDescriptor()->GetTypeName()<<">"<<std::endl);
1012 // bbtkMessage("Help",1," "<<GetDescription()<<std::endl);
1013 // bbtkMessage("Help",1," By : "<<GetAuthor()<<std::endl);
1015 std::vector<std::string> iname;
1016 std::vector<std::string> ivalue;
1017 std::vector<std::string> iconn;
1019 InputConnectorMapType::iterator i;
1020 unsigned int namelmax = 0;
1021 unsigned int valuelmax = 0;
1022 // unsigned int connlmax = 0;
1023 for ( i = mInputConnectorMap.begin(); i != mInputConnectorMap.end(); ++i )
1025 iname.push_back(i->first);
1026 if (iname.back().size()>namelmax) namelmax = iname.back().size();
1027 ivalue.push_back(bbGetInputAsString(i->first));
1028 if (ivalue.back().size()>valuelmax) valuelmax = ivalue.back().size();
1030 Connection* con = i->second->GetConnection();
1032 s = con->GetOriginalBlackBoxFrom()->bbGetName();
1034 s += con->GetOriginalBlackBoxFromOutput();
1038 OutputConnectorMapType::iterator o;
1039 std::vector<std::string> oname;
1040 std::vector<std::string> ovalue;
1041 std::vector<std::vector<std::string> > oconn;
1042 for ( o = mOutputConnectorMap.begin(); o != mOutputConnectorMap.end(); ++o )
1044 oname.push_back(o->first);
1045 if (oname.back().size()>namelmax) namelmax = oname.back().size();
1046 ovalue.push_back(bbGetOutputAsString(o->first));
1047 if (ovalue.back().size()>valuelmax) valuelmax = ovalue.back().size();
1048 std::vector<std::string> ss;
1049 const std::vector<Connection*>& con
1050 = o->second->GetConnectionVector();
1051 std::vector<Connection*>::const_iterator c;
1052 for (c=con.begin();c!=con.end();++c)
1055 s = (*c)->GetOriginalBlackBoxTo()->bbGetName();
1057 s += (*c)->GetOriginalBlackBoxToInput();
1060 oconn.push_back(ss);
1064 bbtkMessage("Help",1," * Inputs : "<<std::endl);
1066 bbtkMessage("Help",1," * No inputs"<<std::endl);
1068 std::vector<std::string>::iterator i1,i2,i3;
1069 for (i1=iname.begin(),i2=ivalue.begin(),i3=iconn.begin();
1070 i1!=iname.end(),i2!=ivalue.end(),i3!=iconn.end();
1073 std::string name(*i1);
1075 name.append(1+namelmax-name.size(),' ');
1076 std::string value(*i2);
1078 value.append(1+valuelmax-value.size(),' ');
1080 bbtkMessage("Help",1," '"<<name<<" = '"<<value<<" <-- '"<<*i3<<"'"<<std::endl);
1082 bbtkMessage("Help",1," '"<<name<<" = '"<<value<<std::endl);
1086 bbtkMessage("Help",1," * Outputs : "<<std::endl);
1088 bbtkMessage("Help",1," * No outputs"<<std::endl);
1090 std::vector<std::vector<std::string> >::iterator i4;
1092 for (i1=oname.begin(),i2=ovalue.begin(),i4=oconn.begin();
1093 i1!=oname.end(),i2!=ovalue.end(),i4!=oconn.end();
1096 std::string name(*i1);
1098 name.append(1+namelmax-name.size(),' ');
1099 std::string value(*i2);
1101 value.append(1+valuelmax-value.size(),' ');
1103 bbtkMessage("Help",1," '"<<name<<" = '"<<value<<std::endl);
1106 std::string pref = " '"+name+" = '"+value;
1107 for (i3=i4->begin();i3!=i4->end();++i3)
1109 bbtkMessage("Help",1,pref<<" --> '"<<*i3<<"'"<<std::endl);
1110 pref.replace(0,pref.size(),pref.size(),' ');
1116 //=========================================================================
1119 //=========================================================================
1120 void BlackBox::bbGlobalProcessExecutionList()
1122 bbtkDebugMessageInc("process",3,
1123 "=> BlackBox::bbGlobalProcessExecutionList()"
1126 std::set<BlackBox::Pointer>::iterator i;
1127 for (i=bbmgExecutionList.begin();
1128 i!=bbmgExecutionList.end();
1131 bbtkDebugMessage("process",4,
1132 " -> Executing "<<(*i)->bbGetFullName()<<std::endl);
1133 (*i)->bbExecute(true);
1136 bbmgExecutionList.clear();
1137 bbtkDebugMessageDec("process",3,
1138 "<= BlackBox::bbGlobalProcessExecutionList()"
1143 //=========================================================================
1145 bool BlackBox::bbGlobalGetSomeBoxExecuting()
1147 return bbmgSomeBoxExecuting;
1150 void BlackBox::bbGlobalSetSomeBoxExecuting(bool b)
1152 bbmgSomeBoxExecuting = b;
1155 void BlackBox::bbGlobalSetFreezeExecution(bool b)
1157 bbmgFreezeExecution = b;
1160 bool BlackBox::bbGlobalGetFreezeExecution()
1162 return bbmgFreezeExecution;
1165 void BlackBox::bbGlobalAddToExecutionList( BlackBox::Pointer b )
1167 bbmgExecutionList.insert(b);
1171 //=========================================================================
1173 //=========================================================================
1174 void BlackBox::Check(bool recursive)
1176 bbtkMessage("debug",1,"*** Checking Black Box "<<(void*)this<<" ["<<bbGetFullName()
1177 <<"] ... OK"<<std::endl);
1179 //=========================================================================
1181 void BlackBox::bbUserOnShowWidget(std::string nameInput)
1183 bbtk::BlackBoxInputConnector *cc;
1184 cc = this->bbGetInputConnectorMap().find( nameInput.c_str() )->second;
1185 if (cc->GetConnection()!=NULL)
1187 cc->GetConnection()->GetBlackBoxFrom()->bbUserOnShow();
1193 } // EO namespace bbtk