00001 #include "TString.h"
00002 #include "TSystem.h"
00003 #include "TGWindow.h"
00004 #include "TGClient.h"
00005 #include "TClass.h"
00006 #include "THashList.h"
00007 #include "TROOT.h"
00008 #include "TInterpreter.h"
00009 #include "TRootCanvas.h"
00010 #include "TCanvas.h"
00011 #include "TVirtualViewer3D.h"
00012 #include "TEnv.h"
00013 #include "TVirtualX.h"
00014
00015 int saveScriptOutput(const char* script, const char* outdir, Bool_t compiled) {
00016
00017
00018
00019 enum EErrorCodes {
00020 kSuccess,
00021 kScriptDirNotFound,
00022 kCannotRunScript,
00023 kOutDirNotFound,
00024 kNumErrorCodes
00025 };
00026
00027 TString pwd(gSystem->pwd());
00028 if (!gSystem->cd(gSystem->DirName(script)))
00029 return kScriptDirNotFound;
00030 Int_t err = 0;
00031 TString cmd(".x ");
00032 cmd += gSystem->BaseName(script);
00033 if (compiled)
00034 cmd += "+";
00035 if (!gROOT->IsBatch())
00036 gVirtualX->Sync(1);
00037 gROOT->ProcessLine(cmd, &err);
00038 if (err != TInterpreter::kNoError)
00039 return kCannotRunScript;
00040
00041 gSystem->cd(pwd);
00042 if (!gSystem->cd(outdir))
00043 return kOutDirNotFound;
00044
00045 UInt_t nCanvases = 0;
00046 if (gClient) {
00047 TClass* clRootCanvas = TClass::GetClass("TRootCanvas");
00048 TClass* clGMainFrame = TClass::GetClass("TGMainFrame");
00049 TGWindow* win = 0;
00050 TIter iWin(gClient->GetListOfWindows());
00051 while((win = (TGWindow*)iWin())) {
00052 const TObject* winGetParent = win->GetParent();
00053 Bool_t winIsMapped = kFALSE;
00054 if (winGetParent == gClient->GetDefaultRoot())
00055 winIsMapped = win->IsMapped();
00056 if (winIsMapped && win->InheritsFrom(clGMainFrame)) {
00057 win->MapRaised();
00058 Bool_t isRootCanvas = win->InheritsFrom(clRootCanvas);
00059 Bool_t hasEditor = false;
00060 if (isRootCanvas) {
00061 hasEditor = ((TRootCanvas*)win)->HasEditor();
00062 }
00063 if (isRootCanvas && !hasEditor) {
00064 TVirtualPad* pad = ((TRootCanvas*)win)->Canvas();
00065 if (!pad->HasViewer3D() || pad->GetViewer3D()->InheritsFrom("TViewer3DPad")) {
00066 pad->SaveAs(TString::Format("%s_%d.png", gSystem->BaseName(script), nCanvases++));
00067 }
00068 } else
00069 win->SaveAs(TString::Format("%s_%d.png", gSystem->BaseName(script), nCanvases++));
00070 }
00071 }
00072 } else {
00073
00074 TVirtualPad* pad = 0;
00075 TIter iCanvas(gROOT->GetListOfCanvases());
00076 while ((pad = (TVirtualPad*) iCanvas())) {
00077 pad->SaveAs(TString::Format("%s_%d.png", gSystem->BaseName(script), nCanvases++));
00078 }
00079 }
00080 if (!gROOT->IsBatch() && !gEnv->GetValue("X11.Sync", 0))
00081 gVirtualX->Sync(0);
00082 return kSuccess;
00083 }