]> Creatis software - bbtk.git/blob - kernel/src/bbtkAtomicBlackBox.cxx
*** empty log message ***
[bbtk.git] / kernel / src / bbtkAtomicBlackBox.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkAtomicBlackBox.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/04/08 06:59:29 $
7   Version:   $Revision: 1.3 $
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 /**
21  *  \file 
22  *  \brief class bbtk::AtomicBlackBox : abstract user defined black boxes
23  */
24 #include "bbtkAtomicBlackBox.h"
25
26 namespace bbtk
27 {
28   
29   //=========================================================================
30   AtomicBlackBox::AtomicBlackBox(const std::string &name, bool alloc)
31     : BlackBox(name)
32   {
33     bbtkDebugMessageInc("Kernel",7,
34             "AtomicBlackBox::AtomicBlackBox(\""
35             <<name<<"\")"<<std::endl);
36     bbtkDebugDecTab("Kernel",7);
37   }
38   //========================================================================= 
39   
40   //=========================================================================
41   /// Constructor from an existing box (copy) with a new name 
42   AtomicBlackBox::AtomicBlackBox(AtomicBlackBox& from, 
43                 const std::string &name, 
44                 bool alloc)
45     : BlackBox(from,name)
46   {
47     bbtkDebugMessageInc("Kernel",7,
48         "AtomicBlackBox::AtomicBlackBox("
49         <<from.bbGetFullName()<<",\""
50         <<name<<"\")"<<std::endl);
51     bbtkDebugDecTab("Kernel",7);
52     
53   }
54   //=========================================================================
55   
56   
57   //=========================================================================
58   ///  Destructor
59   AtomicBlackBox::~AtomicBlackBox()
60   {
61     bbtkDebugMessage("Kernel",7,"AtomicBlackBox::~AtomicBlackBox()"
62             <<std::endl);
63   } 
64   //=========================================================================
65   
66   
67
68   //=========================================================================
69   /// Main processing method of the box.
70   IOStatus AtomicBlackBox::bbBackwardUpdate( Connection* caller )
71   {
72     bbtkDebugMessageInc("Process",1,
73                         "=> AtomicBlackBox::bbBackwardUpdate("
74                         <<(caller?caller->GetFullName():"0")<<") ["
75                         <<bbGetFullName()<<"]"<<std::endl);
76     
77     if (bbGetExecuting()) 
78       {
79         bbtkWarning(bbGetFullName()<<" : Cyclic execution stopped");
80         return UPTODATE;
81       }
82     bbSetExecuting(true);
83
84     bbtkDebugMessage("Process",5,"Initial Status  = "<<bbGetStatus()
85                     <<std::endl);
86     bbtkDebugMessage("Process",5,"BoxProcessMode  = "
87                     <<bbGetInputBoxProcessMode()<<std::endl);
88    
89     /* 
90     if ( bbGetStatus() == UPDATING ) 
91       {
92     bbtkMessage("Warning",1,"!! WARNING !! Cyclic pipeline execution (bbBackwardUpdate ["<<bbGetFullName()<<"] reentered). This may indicate an error in pipeline conception"<<std::endl);
93     //  return UPTODATE;
94     bbSetStatus(MODIFIED);
95       }
96     */
97
98     if ( ( bbGetStatus() == MODIFIED ) ||
99         ( bbBoxProcessModeIsAlways() ) )
100       {
101         bool wasExecuting = bbGlobalGetSomeBoxExecuting();
102         bbGlobalSetSomeBoxExecuting(true);
103
104         //      bbSetStatus(UPDATING);
105
106         // Updates its inputs
107         IOStatus s = bbUpdateInputs();
108     
109         bbtkDebugMessage("Process",6,"Inputs post-update status = "<<s<<std::endl);
110         // If all inputs are in UPTODATE post-update status 
111         // and mProcessMode is not "Always"
112         // then the box is now UPTODATE
113         if ( ( s == UPTODATE ) && 
114             ( ! bbBoxProcessModeIsAlways() ) ) 
115             {
116                 bbSetStatus(UPTODATE);
117             }
118         else 
119             {
120                 // else it remains MODIFIED
121                 bbSetStatus(MODIFIED);
122             }
123
124         // User process
125         bbProcess();
126
127         // Displays the window (WxBlackbox)
128         bbShowWindow(caller);
129
130         bbGlobalSetSomeBoxExecuting(wasExecuting);
131
132       }
133     else 
134       {
135         bbtkDebugMessage("Process",5,"Up-to-date : nothing to do"<<std::endl);
136       }
137
138     bbtkDebugMessage("Process",5,"Final Status    = "
139             <<bbGetStatus()<<std::endl);
140     bbtkDebugMessage("Process",1,
141             "<= AtomicBlackBox::bbBackwardUpdate() ["
142             <<bbGetFullName()<<"]"<<std::endl);
143     bbtkDebugDecTab("Process",1);
144
145     bbSetExecuting(false);
146
147     return bbGetStatus();
148
149   }
150   //=========================================================================
151   
152     
153   //=========================================================================
154   Data AtomicBlackBox::bbGetOutput( const std::string &name )
155   {
156     bbtkDebugMessageInc("Data",7,
157             "AtomicBlackBox::bbGetOutput(\""<<name<<"\") ["
158             <<bbGetFullName()<<"]"
159             <<std::endl);
160     
161     Data p = ((AtomicBlackBoxOutputDescriptor*)bbGetDescriptor()
162                 ->GetOutputDescriptor(name))->GetGetFunctor()->Get(this);
163     
164     bbtkDebugDecTab("Data",7);
165     return p;
166   }
167   //=========================================================================
168   
169   
170   //=========================================================================
171   ///  Gets the input Data of a given name
172   Data AtomicBlackBox::bbGetInput( const std::string &name ) 
173   {
174     bbtkDebugMessageInc("Data",7,
175             "AtomicBlackBox::bbGetInput(\""<<name<<"\") ["
176             <<bbGetFullName()<<"]"
177             <<std::endl);  
178     
179     Data p = ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()
180                 ->GetInputDescriptor(name))->GetGetFunctor()->Get(this);
181     
182     bbtkDebugDecTab("Data",7);
183     return p;
184   }
185   //=========================================================================
186   
187   
188   //=========================================================================
189   ///  Sets the data of the output called <name>
190   void AtomicBlackBox::bbSetOutput( const std::string &name, Data data)
191   {
192     bbtkDebugMessageInc("Data",7,
193             "AtomicBlackBox::bbSetOutput(\""<<name<<"\",data) ["
194             <<bbGetFullName()<<"]"
195             <<std::endl); 
196     
197     ((AtomicBlackBoxOutputDescriptor*)bbGetDescriptor()
198         ->GetOutputDescriptor(name))->GetSetFunctor()->Set(this,data);
199     
200     bbtkDebugDecTab("Data",7);
201   }  
202   //=========================================================================
203   
204   
205   //=========================================================================
206   ///  Sets the data of the input called <name>
207   void AtomicBlackBox::bbSetInput(
208                 const std::string &name,
209                 Data data, 
210                 bool setModified )
211   {
212     bbtkDebugMessageInc("Data",7,
213             "AtomicBlackBox::bbSetInput(\""<<name<<"\",data) ["
214             <<bbGetFullName()<<"]"
215             <<std::endl);  
216     ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()->GetInputDescriptor(name))->GetSetFunctor()->Set(this,data);
217     
218     if (setModified) 
219         {
220             bbSetModifiedStatus();
221         }
222     
223     bbtkDebugDecTab("Data",7);
224   }
225   //=========================================================================
226   
227     //=========================================================================
228   ///  Sets the data of the input called <name>
229   void AtomicBlackBox::bbBruteForceSetInputPointer
230     (
231                     const std::string &name, 
232                     void* data, 
233                     bool setModified
234     )
235   {
236     bbtkDebugMessageInc("Data",7,
237             "AtomicBlackBox::bbBruteForceSetInputPointer(\""
238             <<name<<"\",data) ["
239             <<bbGetFullName()<<"]"
240             <<std::endl);  
241     ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()
242         ->GetInputDescriptor(name))->GetSetFunctor()
243             ->BruteForceSetPointer(this,data);
244     
245     if (setModified) 
246       {
247         bbSetModifiedStatus();
248       }
249     
250     bbtkDebugDecTab("Data",7);
251   }
252   //=========================================================================
253   
254 }
255 // EO namespace bbtk