00001 #ifndef Impala_Core_ImageSet_Walker_h
00002 #define Impala_Core_ImageSet_Walker_h
00003
00004 #include <vector>
00005 #include "Core/ImageSet/ImageSet.h"
00006 #include "Core/ImageSet/Listener.h"
00007 #include "Core/Geometry/FileReadIxRectangle.h"
00008
00009 namespace Impala
00010 {
00011 namespace Core
00012 {
00013 namespace ImageSet
00014 {
00015
00016
00017 class Walker
00018 {
00019 public:
00020
00021 Walker(ImageSet* imageSet)
00022 {
00023 mImageSet = imageSet;
00024 }
00025
00026 void
00027 AddListener(Listener* listener)
00028 {
00029 mListeners.push_back(listener);
00030 }
00031
00032 int
00033 NrListeners() const
00034 {
00035 return mListeners.size();
00036 }
00037
00038 void
00039 LoadBookmarks(String fileName)
00040 {
00041 mIrList.clear();
00042 Geometry::FileReadIxRectangle(std::back_inserter(mIrList), fileName);
00043 }
00044
00045
00046
00047 void
00048 DoWalk(int startDir, int numberDirs)
00049 {
00050 if (startDir >= mImageSet->NrDirs())
00051 {
00052 ILOG_ERROR("DoWalk: startDir out of range");
00053 return;
00054 }
00055 CmdOptions& options = CmdOptions::GetInstance();
00056 bool useIm = ! options.GetBool("virtualWalk");
00057 if (numberDirs == -1)
00058 numberDirs = mImageSet->NrDirs() - startDir;
00059 if (startDir + numberDirs >= mImageSet->NrDirs())
00060 numberDirs = mImageSet->NrDirs() - startDir;
00061
00062 for (size_t l=0 ; l<mListeners.size() ; l++)
00063 {
00064 mListeners[l]->HandleNewWalk(mImageSet);
00065 mListeners[l]->HandleNewWalk(mImageSet, String("Image"));
00066 }
00067 for (int dirId=startDir ; dirId<startDir+numberDirs ; dirId++)
00068 {
00069 for (size_t l=0 ; l<mListeners.size() ; l++)
00070 mListeners[l]->HandleNewDir(mImageSet, dirId);
00071
00072 int startFile = options.GetInt("startFile");
00073 int numberFiles = options.GetInt("numberFiles");
00074 int startF = mImageSet->GetFirstFileId(dirId);
00075 int numberF = mImageSet->GetNrFiles(dirId);
00076 if (startFile < numberF)
00077 startF += startFile;
00078 if (numberFiles == -1)
00079 numberFiles = numberF;
00080 if (startFile + numberFiles <= numberF)
00081 numberF = numberFiles;
00082 for (int fileId=startF ; fileId<startF+numberF ; fileId++)
00083 {
00084 Array::Array2dVec3UInt8* im = 0;
00085 if (useIm)
00086 im = mImageSet->GetImage(fileId);
00087 for (size_t l=0 ; l<mListeners.size() ; l++)
00088 mListeners[l]->HandleNewFile(mImageSet, fileId, im);
00089 if (im)
00090 delete im;
00091 }
00092 for (size_t l=0 ; l<mListeners.size() ; l++)
00093 mListeners[l]->HandleDoneDir(mImageSet, dirId);
00094 }
00095 for (size_t l=0 ; l<mListeners.size() ; l++)
00096 mListeners[l]->HandleDoneWalk(mImageSet);
00097 }
00098
00099 void
00100 DoWalkBookmarks()
00101 {
00102 CmdOptions& options = CmdOptions::GetInstance();
00103 bool useIm = ! options.GetBool("virtualWalk");
00104 for (size_t l=0 ; l<mListeners.size() ; l++)
00105 {
00106 mListeners[l]->HandleNewWalk(mImageSet, mIrList.size());
00107 mListeners[l]->HandleNewWalk(mImageSet, String("Bookmarks"));
00108 }
00109 for (size_t i=0 ; i<mIrList.size() ; i++)
00110 {
00111 Geometry::IxRectangle ir = mIrList[i];
00112 int fileId = mImageSet->GetFileId(ir.mSection, ir.mDir,
00113 ir.mImageName);
00114 Array::Array2dVec3UInt8* im = 0;
00115 if (useIm)
00116 im = mImageSet->GetImage(fileId);
00117 Geometry::Rectangle r = ir.mRect;
00118 String s = ir.mAnno;
00119 for (size_t l=0 ; l<mListeners.size() ; l++)
00120 mListeners[l]->HandleNewFile(mImageSet, fileId, im, r, s);
00121 if (im)
00122 delete im;
00123 }
00124 for (size_t l=0 ; l<mListeners.size() ; l++)
00125 mListeners[l]->HandleDoneWalk(mImageSet, mIrList.size());
00126 }
00127
00128 protected:
00129
00130 ImageSet* mImageSet;
00131 std::vector<Geometry::IxRectangle> mIrList;
00132 std::vector<Listener*> mListeners;
00133
00134 ILOG_VAR_DEC;
00135
00136 };
00137
00138 ILOG_VAR_INIT(Walker, Impala.Core.ImageSet);
00139
00140 }
00141 }
00142 }
00143
00144 #endif