37 m_NumberOfRequiredInputs = 0;
39 m_NumberOfRequiredOutputs = 0;
41 m_AbortGenerateData =
false;
46 m_NumberOfThreads = m_Threader->GetNumberOfThreads();
48 m_ReleaseDataBeforeUpdateFlag =
true;
77 for (idx = 0; idx < m_Outputs.size(); ++idx)
82 m_Outputs[idx]->DisconnectSource(
this, idx);
99 if (num == m_Inputs.size())
103 m_Inputs.resize(num);
115 if (m_NumberOfRequiredInputs < m_Inputs.size())
117 num = m_NumberOfRequiredInputs;
121 num = m_Inputs.size();
127 for(std::vector<DataObjectPointer>::const_iterator i = m_Inputs.begin();
128 i < (m_Inputs.begin() + num); ++i)
150 for (idx = 0; idx < m_Inputs.size(); ++idx)
154 m_Inputs[idx] = input;
159 this->SetNumberOfInputs( static_cast<int>( m_Inputs.size() + 1 ) );
160 m_Inputs[
static_cast<int>( m_Inputs.size() ) - 1] = input;
181 DataObjectPointerArray::iterator pos =
182 std::find(m_Inputs.begin(), m_Inputs.end(), input);
184 if(pos == m_Inputs.end())
186 itkDebugMacro(
"tried to remove an input that was not in the list");
194 if (pos == m_Inputs.end() - 1 )
196 this->SetNumberOfInputs( static_cast<int>( m_Inputs.size() ) - 1);
213 if ( idx < m_Inputs.size() && m_Inputs[idx] == input )
219 if (idx >= m_Inputs.size())
221 this->SetNumberOfInputs(idx + 1);
224 m_Inputs[idx] = input;
236 m_Inputs.push_back(const_cast<DataObject*>(input));
247 if (!m_Inputs.empty())
263 m_Inputs.push_back(0);
266 std::copy_backward(m_Inputs.begin(), m_Inputs.end()-1,
282 if (!m_Inputs.empty())
284 std::copy(m_Inputs.begin()+1, m_Inputs.end(),
302 DataObjectPointerArray::iterator pos =
303 std::find(m_Outputs.begin(), m_Outputs.end(), output);
305 if(pos == m_Outputs.end())
307 itkDebugMacro(
"tried to remove an output that was not in the list");
312 (*pos)->DisconnectSource(
this, pos - m_Outputs.begin());
317 if (pos == m_Outputs.end() - 1 )
319 this->SetNumberOfOutputs( static_cast<int>( m_Outputs.size() ) - 1);
336 if ( idx < m_Outputs.size() && output == m_Outputs[idx])
342 if (idx >= m_Outputs.size())
344 this->SetNumberOfOutputs(idx + 1);
350 if ( m_Outputs[idx] )
352 oldOutput = m_Outputs[idx];
353 m_Outputs[idx]->DisconnectSource(
this, idx);
361 m_Outputs[idx] = output;
368 itkDebugMacro(
" creating new output object." );
370 this->SetNthOutput(idx, newOutput);
376 newOutput->SetRequestedRegion( oldOutput );
377 newOutput->SetReleaseDataFlag( oldOutput->GetReleaseDataFlag() );
394 for (idx = 0; idx < m_Outputs.size(); ++idx)
396 if ( m_Outputs[idx].IsNull() )
398 m_Outputs[idx] = output;
410 this->SetNumberOfOutputs( static_cast<int>( m_Outputs.size() ) + 1);
411 m_Outputs[
static_cast<int>( m_Outputs.size() ) - 1] = output;
414 output->
ConnectSource(
this, static_cast<int>( m_Outputs.size() ) - 1 );
428 if (num == m_Outputs.size())
432 m_Outputs.resize(num);
444 if (m_Outputs.size() < i+1)
449 return m_Outputs[i].GetPointer();
456 if (m_Outputs.size() < i+1)
461 return m_Outputs[i].GetPointer();
472 if (m_Inputs.size() < i+1)
477 return m_Inputs[i].GetPointer();
484 if (m_Inputs.size() < i+1)
489 return m_Inputs[i].GetPointer();
514 if (this->GetOutput(0))
516 return this->GetOutput(0)->GetReleaseDataFlag();
518 itkWarningMacro(<<
"Output doesn't exist!");
532 for (idx = 0; idx < m_Outputs.size(); idx++)
536 m_Outputs[idx]->SetReleaseDataFlag(val);
549 Superclass::PrintSelf(os,indent);
551 os << indent <<
"Number Of Required Inputs: "
552 << m_NumberOfRequiredInputs << std::endl;
554 os << indent <<
"Number Of Required Outputs: "
555 << m_NumberOfRequiredOutputs << std::endl;
557 os << indent <<
"Number Of Threads: "
558 << m_NumberOfThreads << std::endl;
560 os << indent <<
"ReleaseDataFlag: "
561 << (this->GetReleaseDataFlag() ?
"On" :
"Off") << std::endl;
563 os << indent <<
"ReleaseDataBeforeUpdateFlag: "
564 << (m_ReleaseDataBeforeUpdateFlag ?
"On" :
"Off") << std::endl;
566 if ( m_Inputs.size())
569 for (idx = 0; idx < m_Inputs.size(); ++idx)
571 os << indent <<
"Input " <<
static_cast<int>( idx );
572 os <<
": (" << m_Inputs[idx].GetPointer() <<
")\n";
577 os << indent <<
"No Inputs\n";
579 if ( m_Outputs.size())
582 for (idx = 0; idx < m_Outputs.size(); ++idx)
584 os << indent <<
"Output " <<
static_cast<int>( idx );
585 os <<
": (" << m_Outputs[idx].GetPointer() <<
")\n";
590 os << indent <<
"No Output\n";
593 os << indent <<
"AbortGenerateData: " << (m_AbortGenerateData ?
"On\n" :
"Off\n");
594 os << indent <<
"Progress: " << m_Progress <<
"\n";
596 os << indent <<
"Multithreader: " << std::endl;
613 if (this->GetOutput(0))
615 this->GetOutput(0)->Update();
623 if (this->GetOutput(0))
625 this->GetOutput(0)->ResetPipeline();
644 for (idx = 0; idx < m_Inputs.size(); ++idx)
648 input = m_Inputs[idx];
653 input->PropagateResetPipeline();
666 unsigned long t1, t2;
692 t1 = this->GetMTime();
697 for (idx = 0; idx < m_Inputs.size(); ++idx)
701 input = m_Inputs[idx];
740 if (t1 > m_OutputInformationMTime.GetMTime())
742 for (idx = 0; idx < m_Outputs.size(); ++idx)
744 output = this->GetOutput( static_cast<int>( idx ) );
751 this->GenerateOutputInformation();
756 m_OutputInformationMTime.Modified();
783 this->EnlargeOutputRequestedRegion( output );
792 this->GenerateOutputRequestedRegion( output );
802 this->GenerateInputRequestedRegion();
810 for (idx = 0; idx < m_Inputs.size(); ++idx)
814 m_Inputs[idx]->PropagateRequestedRegion();
831 for (idx = 0; idx < m_Inputs.size(); ++idx)
835 m_Inputs[idx]->SetRequestedRegionToLargestPossibleRegion();
849 for (idx = 0; idx < m_Outputs.size(); ++idx)
851 if (m_Outputs[idx] && m_Outputs[idx] != output)
853 m_Outputs[idx]->SetRequestedRegion(output);
868 if (this->GetReleaseDataBeforeUpdateFlag())
870 for (idx = 0; idx < m_Outputs.size(); idx++)
874 m_Outputs[idx]->PrepareForNewData();
890 for (idx = 0; idx < m_Inputs.size(); ++idx)
894 if ( m_Inputs[idx]->ShouldIReleaseData() )
896 m_Inputs[idx]->ReleaseData();
923 this->PrepareOutputs();
932 if ( m_Inputs.size() == 1 )
936 m_Inputs[0]->UpdateOutputData();
941 for (idx = 0; idx < m_Inputs.size(); ++idx)
945 m_Inputs[idx]->PropagateRequestedRegion();
946 m_Inputs[idx]->UpdateOutputData();
959 this->CacheInputReleaseDataFlags();
970 m_AbortGenerateData =
false;
977 if (ninputs < m_NumberOfRequiredInputs)
979 itkExceptionMacro(<<
"At least " << m_NumberOfRequiredInputs
980 <<
" inputs are required but only " << ninputs
981 <<
" are specified.");
987 this->GenerateData();
992 this->ResetPipeline();
993 this->RestoreInputReleaseDataFlags();
998 this->ResetPipeline();
999 this->RestoreInputReleaseDataFlags();
1009 if ( m_AbortGenerateData )
1011 this->UpdateProgress(1.0f);
1022 for (idx = 0; idx < m_Outputs.size(); ++idx)
1026 m_Outputs[idx]->DataHasBeenGenerated();
1033 this->RestoreInputReleaseDataFlags();
1038 this->ReleaseInputs();
1054 m_CachedInputReleaseDataFlags.resize( m_Inputs.size() );
1055 for (idx = 0; idx < m_Inputs.size(); ++idx)
1059 m_CachedInputReleaseDataFlags[idx]=m_Inputs[idx]->GetReleaseDataFlag();
1060 m_Inputs[idx]->ReleaseDataFlagOff();
1064 m_CachedInputReleaseDataFlags[idx] =
false;
1080 idx < m_Inputs.size() && idx < m_CachedInputReleaseDataFlags.size();
1085 m_Inputs[idx]->SetReleaseDataFlag(m_CachedInputReleaseDataFlags[idx]);
1099 if (m_Inputs.size() && m_Inputs[0])
1101 input = m_Inputs[0];
1103 for (
unsigned int idx = 0; idx < m_Outputs.size(); ++idx)
1105 output = this->GetOutput(idx);
1108 output->CopyInformation(input);
1122 this->UpdateOutputInformation();
1124 if (this->GetOutput(0))
1126 this->GetOutput(0)->SetRequestedRegionToLargestPossibleRegion();
1127 this->GetOutput(0)->Update();