]> Creatis software - bbtk.git/blob - kernel/src/bbtkAtomicBlackBox.cxx
3f46046d14c92b0f4e2b9255ec8b4f2e25628548
[bbtk.git] / kernel / src / bbtkAtomicBlackBox.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkAtomicBlackBox.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/03/20 15:27:56 $
7   Version:   $Revision: 1.2 $
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             <<bbGetFullName()<<"]"<<std::endl);
75     
76     bbtkDebugMessage("Process",5,"Initial Status  = "<<bbGetStatus()
77                     <<std::endl);
78     bbtkDebugMessage("Process",5,"BoxProcessMode  = "
79                     <<bbGetInputBoxProcessMode()<<std::endl);
80    
81     /* 
82     if ( bbGetStatus() == UPDATING ) 
83       {
84     bbtkMessage("Warning",1,"!! WARNING !! Cyclic pipeline execution (bbBackwardUpdate ["<<bbGetFullName()<<"] reentered). This may indicate an error in pipeline conception"<<std::endl);
85     //  return UPTODATE;
86     bbSetStatus(MODIFIED);
87       }
88     */
89
90     if ( ( bbGetStatus() == MODIFIED ) ||
91         ( bbBoxProcessModeIsAlways() ) )
92       {
93         bool wasExecuting = bbGlobalGetSomeBoxExecuting();
94         bbGlobalSetSomeBoxExecuting(true);
95
96         //      bbSetStatus(UPDATING);
97
98         // Updates its inputs
99         IOStatus s = bbUpdateInputs();
100     
101         bbtkDebugMessage("Process",6,"Inputs post-update status = "<<s<<std::endl);
102         // If all inputs are in UPTODATE post-update status 
103         // and mProcessMode is not "Always"
104         // then the box is now UPTODATE
105         if ( ( s == UPTODATE ) && 
106             ( ! bbBoxProcessModeIsAlways() ) ) 
107             {
108                 bbSetStatus(UPTODATE);
109             }
110         else 
111             {
112                 // else it remains MODIFIED
113                 bbSetStatus(MODIFIED);
114             }
115
116         // User process
117         bbProcess();
118
119         // Displays the window (WxBlackbox)
120         bbShowWindow(caller);
121
122         bbGlobalSetSomeBoxExecuting(wasExecuting);
123
124       }
125     else 
126       {
127         bbtkDebugMessage("Process",5,"Up-to-date : nothing to do"<<std::endl);
128       }
129
130     bbtkDebugMessage("Process",5,"Final Status    = "
131             <<bbGetStatus()<<std::endl);
132     bbtkDebugMessage("Process",1,
133             "<= AtomicBlackBox::bbBackwardUpdate() ["
134             <<bbGetFullName()<<"]"<<std::endl);
135     bbtkDebugDecTab("Process",1);
136
137     return bbGetStatus();
138
139   }
140   //=========================================================================
141   
142     
143   //=========================================================================
144   Data AtomicBlackBox::bbGetOutput( const std::string &name )
145   {
146     bbtkDebugMessageInc("Data",7,
147             "AtomicBlackBox::bbGetOutput(\""<<name<<"\") ["
148             <<bbGetFullName()<<"]"
149             <<std::endl);
150     
151     Data p = ((AtomicBlackBoxOutputDescriptor*)bbGetDescriptor()
152                 ->GetOutputDescriptor(name))->GetGetFunctor()->Get(this);
153     
154     bbtkDebugDecTab("Data",7);
155     return p;
156   }
157   //=========================================================================
158   
159   
160   //=========================================================================
161   ///  Gets the input Data of a given name
162   Data AtomicBlackBox::bbGetInput( const std::string &name ) 
163   {
164     bbtkDebugMessageInc("Data",7,
165             "AtomicBlackBox::bbGetInput(\""<<name<<"\") ["
166             <<bbGetFullName()<<"]"
167             <<std::endl);  
168     
169     Data p = ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()
170                 ->GetInputDescriptor(name))->GetGetFunctor()->Get(this);
171     
172     bbtkDebugDecTab("Data",7);
173     return p;
174   }
175   //=========================================================================
176   
177   
178   //=========================================================================
179   ///  Sets the data of the output called <name>
180   void AtomicBlackBox::bbSetOutput( const std::string &name, Data data)
181   {
182     bbtkDebugMessageInc("Data",7,
183             "AtomicBlackBox::bbSetOutput(\""<<name<<"\",data) ["
184             <<bbGetFullName()<<"]"
185             <<std::endl); 
186     
187     ((AtomicBlackBoxOutputDescriptor*)bbGetDescriptor()
188         ->GetOutputDescriptor(name))->GetSetFunctor()->Set(this,data);
189     
190     bbtkDebugDecTab("Data",7);
191   }  
192   //=========================================================================
193   
194   
195   //=========================================================================
196   ///  Sets the data of the input called <name>
197   void AtomicBlackBox::bbSetInput(
198                 const std::string &name,
199                 Data data, 
200                 bool setModified )
201   {
202     bbtkDebugMessageInc("Data",7,
203             "AtomicBlackBox::bbSetInput(\""<<name<<"\",data) ["
204             <<bbGetFullName()<<"]"
205             <<std::endl);  
206     ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()->GetInputDescriptor(name))->GetSetFunctor()->Set(this,data);
207     
208     if (setModified) 
209         {
210             bbSetModifiedStatus();
211         }
212     
213     bbtkDebugDecTab("Data",7);
214   }
215   //=========================================================================
216   
217     //=========================================================================
218   ///  Sets the data of the input called <name>
219   void AtomicBlackBox::bbBruteForceSetInputPointer
220     (
221                     const std::string &name, 
222                     void* data, 
223                     bool setModified
224     )
225   {
226     bbtkDebugMessageInc("Data",7,
227             "AtomicBlackBox::bbBruteForceSetInputPointer(\""
228             <<name<<"\",data) ["
229             <<bbGetFullName()<<"]"
230             <<std::endl);  
231     ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()
232         ->GetInputDescriptor(name))->GetSetFunctor()
233             ->BruteForceSetPointer(this,data);
234     
235     if (setModified) 
236       {
237         bbSetModifiedStatus();
238       }
239     
240     bbtkDebugDecTab("Data",7);
241   }
242   //=========================================================================
243   
244 }
245 // EO namespace bbtk