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 ILOG_NDC_PUSH("image " << fileId);
00085 Array::Array2dVec3UInt8* im = 0;
00086 if (useIm)
00087 im = mImageSet->GetImage(fileId);
00088 for (size_t l=0 ; l<mListeners.size() ; l++)
00089 mListeners[l]->HandleNewFile(mImageSet, fileId, im);
00090 if (im)
00091 delete im;
00092 ILOG_NDC_POP;
00093 }
00094 for (size_t l=0 ; l<mListeners.size() ; l++)
00095 mListeners[l]->HandleDoneDir(mImageSet, dirId);
00096 }
00097 for (size_t l=0 ; l<mListeners.size() ; l++)
00098 mListeners[l]->HandleDoneWalk(mImageSet);
00099 }
00100
00101 void
00102 DoWalkBookmarks()
00103 {
00104 CmdOptions& options = CmdOptions::GetInstance();
00105 bool useIm = ! options.GetBool("virtualWalk");
00106 for (size_t l=0 ; l<mListeners.size() ; l++)
00107 {
00108 mListeners[l]->HandleNewWalk(mImageSet, mIrList.size());
00109 mListeners[l]->HandleNewWalk(mImageSet, String("Bookmarks"));
00110 }
00111 for (size_t i=0 ; i<mIrList.size() ; i++)
00112 {
00113 Geometry::IxRectangle ir = mIrList[i];
00114 int fileId = mImageSet->GetFileId(ir.mSection, ir.mDir,
00115 ir.mImageName);
00116 Array::Array2dVec3UInt8* im = 0;
00117 if (useIm)
00118 im = mImageSet->GetImage(fileId);
00119 Geometry::Rectangle r = ir.mRect;
00120 String s = ir.mAnno;
00121 for (size_t l=0 ; l<mListeners.size() ; l++)
00122 mListeners[l]->HandleNewFile(mImageSet, fileId, im, r, s);
00123 if (im)
00124 delete im;
00125 }
00126 for (size_t l=0 ; l<mListeners.size() ; l++)
00127 mListeners[l]->HandleDoneWalk(mImageSet, mIrList.size());
00128 }
00129
00130 protected:
00131
00132 ImageSet* mImageSet;
00133 std::vector<Geometry::IxRectangle> mIrList;
00134 std::vector<Listener*> mListeners;
00135
00136 ILOG_VAR_DEC;
00137
00138 };
00139
00140 ILOG_VAR_INIT(Walker, Impala.Core.ImageSet);
00141
00142 }
00143 }
00144 }
00145
00146 #endif