27 #include "hugin_config.h"
30 #include <wx/stdpaths.h>
31 #include <wx/wfstream.h>
39 #include "vigra/imageinfo.hxx"
93 wxFrame(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxFRAME_TOOL_WINDOW | wxFRAME_NO_TASKBAR | wxSTAY_ON_TOP)
95 SetExtraStyle(GetExtraStyle() | wxWS_EX_TRANSIENT);
96 wxSizer* topSizer=
new wxBoxSizer(wxVERTICAL);
97 bitmap.SetScaleFactor(GetDPIScaleFactor());
98 wxStaticBitmap* staticBitmap=
new wxStaticBitmap(
this,wxID_ANY,bitmap);
99 topSizer->Add(staticBitmap,1,wxEXPAND);
100 SetSizerAndFit(topSizer);
101 SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
105 #if defined(__WXMSW__) || defined(__WXMAC__)
107 #elif defined(__WXGTK20__)
119 bool
PanoDropTarget::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames)
123 if (!mf)
return false;
125 if (!m_imageOnly && filenames.GetCount() == 1) {
126 wxFileName file(filenames[0]);
127 if (file.GetExt().CmpNoCase(
"pto") == 0 ||
128 file.GetExt().CmpNoCase(
"ptp") == 0 ||
129 file.GetExt().CmpNoCase(
"pts") == 0 )
136 ImageCache::getInstance().flush();
143 std::vector<std::string> filesv;
144 std::vector<std::string> rawFilesv;
145 wxArrayString invalidFiles;
146 for (
unsigned int i=0; i< filenames.GetCount(); i++) {
147 wxFileName file(filenames[i]);
155 invalidFiles.Add(file.GetFullPath());
169 invalidFiles.Add(file.GetFullPath());
179 if (!invalidFiles.empty())
188 if(pano.getNrOfCtrlPoints()>0)
194 std::vector<PanoCommand::PanoCommand*> cmds;
201 if (!rawFilesv.empty())
203 if (rawFilesv.size() == 1)
206 _(
"Hugin"), wxICON_EXCLAMATION | wxOK | wxCANCEL, mf);
207 message->SetOKLabel(_(
"Convert anyway."));
208 if (message->ShowModal() != wxID_OK)
218 if (dlg.ShowModal() == wxID_OK)
237 : cp_frame(0), pano(pano)
242 bool disableOpenGL=
false;
243 if(wxGetKeyState(WXK_COMMAND))
246 wxXmlResource::Get()->LoadDialog(&dlg, NULL,
"disable_opengl_dlg");
247 long noOpenGL=wxConfigBase::Get()->Read(
"DisableOpenGL", 0l);
250 XRCCTRL(dlg,
"disable_dont_ask_checkbox", wxCheckBox)->SetValue(
true);
252 if(dlg.ShowModal()==wxID_OK)
254 if(XRCCTRL(dlg,
"disable_dont_ask_checkbox", wxCheckBox)->IsChecked())
256 wxConfigBase::Get()->Write(
"DisableOpenGL", 1l);
260 wxConfigBase::Get()->Write(
"DisableOpenGL", 0l);
266 wxConfigBase::Get()->Write(
"DisableOpenGL", 0l);
271 long noOpenGL=wxConfigBase::Get()->Read(
"DisableOpenGL", 0l);
272 disableOpenGL=(noOpenGL==1);
284 dc.SelectObject(bitmap);
286 wxFont font(9, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
288 wxFont font(8, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
291 dc.SetTextForeground(*wxBLACK);
292 dc.SetTextBackground(*wxWHITE);
296 dc.GetTextExtent(version, &tw, &th);
298 dc.DrawText(version, bitmap.GetWidth() - tw - 3, bitmap.GetHeight() - th - 3);
299 dc.SelectObject(wxNullBitmap);
303 wxLogFatalError(_(
"Fatal installation error\nThe file data/splash.png was not found at:") +
huginApp::Get()->
GetXRCPath());
315 wxXmlResource::Get()->LoadFrame(
this, parent,
"main_frame");
320 wxApp::s_macAboutMenuItemId = XRCID(
"action_show_about");
321 wxApp::s_macPreferencesMenuItemId = XRCID(
"action_show_prefs");
322 wxApp::s_macExitMenuItemId = XRCID(
"action_exit_hugin");
323 wxApp::s_macHelpMenuTitleName = _(
"&Help");
325 wxMenuBar* mainMenu=wxXmlResource::Get()->LoadMenuBar(
this,
"main_menubar");
329 SetMenuBar(mainMenu);
336 wxMenuBar* menubar=GetMenuBar();
338 wxMenu *pluginMenu=
new wxMenu();
344 bool cont = dir.GetFirst(&filename,
"*.py", wxDIR_FILES | wxDIR_HIDDEN);
348 wxFileName file(dir.GetName(), filename);
353 items.push_back(item);
355 cont = dir.GetNext(&filename);
360 for (PluginItems::const_iterator it = items.begin(); it != items.end(); ++it)
363 int categoryID = pluginMenu->FindItem(item.
GetCategory());
364 wxMenu* categoryMenu;
365 if (categoryID == wxNOT_FOUND)
367 categoryMenu =
new wxMenu();
368 pluginMenu->AppendSubMenu(categoryMenu, item.
GetCategory());
372 categoryMenu = pluginMenu->FindItem(categoryID)->GetSubMenu();
376 Bind(wxEVT_MENU, &MainFrame::OnPlugin,
this, pluginID);
380 if (pluginMenu->GetMenuItemCount() > 0)
382 menubar->Insert(menubar->GetMenuCount() - 2, pluginMenu, _(
"&Actions"));
386 GetMenuBar()->Enable(XRCID(
"action_python_script"),
false);
390 SetToolBar(wxXmlResource::Get()->LoadToolBar(
this,
"main_toolbar"));
406 m_notebook = XRCCTRL((*
this),
"controls_notebook", wxNotebook);
439 wxConfigBase * config=wxConfigBase::Get();
459 wxDir::GetAllFiles(
GetDataPath()+
"output", &files,
"*.executor", wxDIR_FILES | wxDIR_HIDDEN | wxDIR_NO_FOLLOW);
460 const size_t nrAllUserSequences = files.size();
462 if (!files.IsEmpty())
466 int outputMenuId=mainMenu->FindMenu(_(
"&Output"));
467 if (outputMenuId != wxNOT_FOUND)
469 wxMenu* outputSequencesMenu =
new wxMenu;
471 for (
auto file : files)
473 if (i > 0 && i == nrAllUserSequences && outputSequencesMenu->GetMenuItemCount() > 0)
475 outputSequencesMenu->AppendSeparator();
483 wxFileInputStream inputStream(file);
484 if (inputStream.IsOk())
487 wxFileConfig executorFile(inputStream);
492 help = wxString::Format(_(
"User defined sequence: %s"), file);
497 outputSequencesMenu->Append(outputId, desc, help);
510 if ((outputSequencesMenu->GetMenuItemCount() == 1 && !(outputSequencesMenu->FindItemByPosition(0)->IsSeparator())) ||
511 outputSequencesMenu->GetMenuItemCount() > 1)
513 m_outputUserMenu = mainMenu->GetMenu(outputMenuId)->AppendSubMenu(outputSequencesMenu, _(
"User defined output sequences"));
517 delete outputSequencesMenu;
526 wxDir::GetAllFiles(
GetDataPath() +
"assistant", &files,
"*.assistant", wxDIR_FILES | wxDIR_HIDDEN | wxDIR_NO_FOLLOW);
527 const size_t nrAllUserSequences = files.size();
529 if (!files.IsEmpty())
533 const int editMenuId = mainMenu->FindMenu(_(
"&Edit"));
534 if (editMenuId != wxNOT_FOUND)
536 wxMenu* userAssistantMenu =
new wxMenu;
538 for (
auto file : files)
540 if (i > 0 && i == nrAllUserSequences && userAssistantMenu->GetMenuItemCount() > 0)
542 userAssistantMenu->AppendSeparator();
549 wxFileInputStream inputStream(file);
550 if (inputStream.IsOk())
553 wxFileConfig assistantFile(inputStream);
556 help = help.Trim(
true).Trim(
false);
559 help = wxString::Format(_(
"User defined assistant: %s"), file);
564 userAssistantMenu->Append(assistantId, desc, help);
577 if (userAssistantMenu->GetMenuItemCount() > 0)
579 m_assistantUserMenu = mainMenu->GetMenu(editMenuId)->Insert(5, wxID_ANY, _(
"User defined assistant"), userAssistantMenu);
583 delete userAssistantMenu;
592 wxIconBundle myIcons(
GetXRCPath() +
"data/hugin.ico", wxBITMAP_TYPE_ICO);
595 wxIcon myIcon(
GetXRCPath() +
"data/hugin.png",wxBITMAP_TYPE_PNG);
606 const int fields (2);
607 CreateStatusBar(fields);
608 int widths[fields] = {-1, 85};
609 SetStatusWidths( fields, &widths[0]);
610 SetStatusText(_(
"Started"), 0);
616 #if defined __WXMAC__ || defined __WXMSW__
618 SetSizeHints(900, 675);
621 SetSizeHints(780, 455);
625 ImageCache::getInstance().setProgressDisplay(
this);
626 #if defined __WXMSW__
629 unsigned long mem_high = wxConfigBase::Get()->Read(
"/ImageCache/UpperBoundHigh", (
long) 0);
631 mem = ((
unsigned long long) mem_high << 32) + mem_low;
636 ImageCache::getInstance().SetUpperLimit(mem);
648 SetAutoLayout(
false);
661 freopen(
"c:\\hugin_stdout.txt",
"w", stdout);
662 freopen(
"c:\\hugin_stderr.txt",
"w", stderr);
668 long guiLevel=config->Read(
"/GuiLevel",(
long)0);
669 guiLevel = std::max<long>(0, std::min<long>(2, guiLevel));
692 for (
int i = 0; i < 9; ++i)
708 Bind(wxEVT_MENU, &MainFrame::OnPythonScript,
this, XRCID(
"action_python_script"));
758 ImageCache::getInstance().setProgressDisplay(NULL);
759 delete & ImageCache::getInstance();
767 wxConfigBase* config = wxConfigBase::Get();
794 if (!(lastCommand ==
"remove control point" || lastCommand ==
"remove control points"))
803 wxToolBar* theToolBar = GetToolBar();
804 wxMenuBar* theMenuBar = GetMenuBar();
806 theMenuBar->Enable (XRCID(
"ID_EDITUNDO"), can_undo);
807 theToolBar->EnableTool(XRCID(
"ID_EDITUNDO"), can_undo);
809 theMenuBar->Enable (XRCID(
"ID_EDITREDO"), can_redo);
810 theToolBar->EnableTool(XRCID(
"ID_EDITREDO"), can_redo);
855 assert(&
pano == &panorama);
867 wxString messageString;
871 messageString = _(
"Save changes to the project file before opening another project?");
874 messageString = _(
"Save changes to the project file before starting a new project?");
878 messageString = _(
"Save changes to the project file before closing?");
885 message->SetExtendedMessage(_(
"If you load another project without saving, your changes since last save will be discarded."));
888 message->SetExtendedMessage(_(
"If you start a new project without saving, your changes since last save will be discarded."));
892 message->SetExtendedMessage(_(
"If you close without saving, your changes since your last save will be discarded."));
895 #if defined __WXMAC__ || defined __WXMSW__
897 message->SetYesNoLabels(wxID_SAVE, _(
"Do&n't Save"));
900 message->SetYesNoLabels(wxID_SAVE, _(
"&Close without saving"));
902 const int answer = message->ShowModal();
907 wxCommandEvent dummy;
932 wxLogError(_(
"forced close"));
961 ImageCache::getInstance().flush();
976 DEBUG_DEBUG(
"stripping " << path <<
" from image filenames");
980 SetStatusText(wxString::Format(_(
"saved project %s"),
m_filename.c_str()),0);
985 gl_preview_frame->SetTitle(scriptName.GetName() +
"." + scriptName.GetExt() +
" - " + _(
"Hugin - Panorama Creator"));
987 SetTitle(scriptName.GetName() +
"." + scriptName.GetExt() +
" - " + _(
"Panorama editor"));
991 SetTitle(scriptName.GetName() +
"." + scriptName.GetExt() +
" - " + _(
"Hugin - Panorama Creator"));
996 }
catch (std::exception & e) {
997 wxString err(e.what(), wxConvLocal);
999 _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
1006 wxFileName scriptName;
1015 scriptName.Normalize(wxPATH_NORM_ABSOLUTE | wxPATH_NORM_DOTS | wxPATH_NORM_TILDE | wxPATH_NORM_SHORTCUT);
1016 wxFileDialog dlg(wxGetActiveWindow(),
1017 _(
"Save project file"),
1018 scriptName.GetPath(), scriptName.GetFullName(),
1019 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1020 wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
1021 if (dlg.ShowModal() == wxID_OK) {
1022 wxConfig::Get()->Write(
"/actualPath", dlg.GetDirectory());
1023 wxString fn = dlg.GetPath();
1024 if (fn.Right(4).CmpNoCase(
".pto")!=0)
1027 if (wxFile::Exists(fn)) {
1047 wxFileName scriptNameFN(scriptName);
1048 wxString fn = scriptNameFN.GetName() +
".txt";
1049 wxFileDialog dlg(wxGetActiveWindow(),
1050 _(
"Save PTmender script file"),
1051 wxConfigBase::Get()->Read(
"/actualPath",wxEmptyString), fn,
1052 _(
"PTmender files (*.txt)|*.txt"),
1053 wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
1054 if (dlg.ShowModal() == wxID_OK) {
1055 wxString fname = dlg.GetPath();
1057 wxFileName scriptName = fname;
1077 SetStatusText( _(
"Open project: ") + filename);
1079 wxFileName fname(filename);
1080 wxString path = fname.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
1081 if (fname.IsOk() && fname.FileExists())
1091 hugin_utils::HuginMessageBox(wxString::Format(_(
"Could not load project file \"%s\".\nIt is not a valid pto file."), filename), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
1107 SetStatusText(_(
"Project opened"));
1108 m_mruFiles.AddFileToHistory(fname.GetFullPath());
1113 gl_preview_frame->SetTitle(fname.GetName() +
"." + fname.GetExt() +
" - " + _(
"Hugin - Panorama Stitcher"));
1115 SetTitle(fname.GetName() +
"." + fname.GetExt() +
" - " + _(
"Panorama editor"));
1119 SetTitle(fname.GetName() +
"." + fname.GetExt() +
" - " + _(
"Hugin - Panorama Stitcher"));
1124 SetStatusText(_(
"Loading canceled"));
1132 SetTitle(_(
"Panorama editor"));
1136 SetTitle(_(
"Hugin - Panorama Stitcher"));
1139 if (! (fname.GetExt() ==
"pto")) {
1146 wxConfigBase* config = wxConfigBase::Get();
1147 config->Write(
"/actualPath", path);
1149 SetStatusText( _(
"Error opening project: ") + filename);
1155 wxCommandEvent dummy;
1165 void MainFrame::MacOnOpenFile(
const wxString & filename)
1169 ImageCache::getInstance().flush();
1181 wxConfigBase* config = wxConfigBase::Get();
1183 wxString defaultdir = config->Read(
"/actualPath",wxEmptyString);
1184 wxFileDialog dlg(wxGetActiveWindow(),
1185 _(
"Open project file"),
1186 defaultdir, wxEmptyString,
1187 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1188 wxFD_OPEN, wxDefaultPosition);
1189 dlg.SetDirectory(defaultdir);
1190 if (dlg.ShowModal() == wxID_OK)
1192 wxString filename = dlg.GetPath();
1195 if (
hugin_utils::HuginMessageBox(wxString::Format(_(
"File %s is an image file and not a project file.\nThis file can't be open with File, Open.\nDo you want to add this image file to the current project?"), filename.c_str()),
1196 _(
"Hugin"), wxYES_NO | wxICON_QUESTION, wxGetActiveWindow()) == wxYES)
1198 wxArrayString filenameArray;
1199 filenameArray.Add(filename);
1207 ImageCache::getInstance().flush();
1216 SetStatusText( _(
"Open project: cancel"));
1225 ImageCache::getInstance().flush();
1227 wxConfigBase* config = wxConfigBase::Get();
1230 if (dialog.ShowModal() == wxID_OK)
1235 config->Write(
"/actualPath", dialog.GetSelectedPath());
1248 ImageCache::getInstance().flush();
1255 SetTitle(_(
"Panorama editor"));
1259 SetTitle(_(
"Hugin - Panorama Stitcher"));
1262 wxCommandEvent dummy;
1286 wxArrayString invalidFiles;
1287 for(
unsigned int i=0;i<filenameArray.GetCount(); i++)
1291 invalidFiles.Add(filenameArray[i]);
1294 if(!invalidFiles.empty())
1300 std::vector<std::string> filesv;
1301 for (
unsigned int i=0; i< filenameArray.GetCount(); i++) {
1306 if (!filesv.empty()) {
1330 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_MASK"))
1333 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_CP_EDITOR"))
1336 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_OPTIMIZER"))
1339 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_OPTIMIZER_PHOTOMETRIC"))
1351 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_PANORAMA"))
1376 if (wxFileExists(e.GetString()))
1379 hugin_utils::HuginMessageBox(wxString::Format(_(
"Could not load image \"%s\".\nThis file is not a valid image.\nThis file will be removed from the project."), e.GetString()),
1380 _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
1385 hugin_utils::HuginMessageBox(wxString::Format(_(
"Could not load image \"%s\".\nThis file was renamed, deleted or is on a non-accessible drive.\nThis file will be removed from the project."), e.GetString()),
1386 _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
1395 imagesToRemove.insert(i);
1398 if (!imagesToRemove.empty())
1461 if (section.IsEmpty())
1474 bool bShowAtStartup;
1479 wxConfigBase * config = wxConfigBase::Get();
1480 nValue = config->Read(
"/MainFrame/ShowStartTip",1l);
1486 DEBUG_INFO(
"Reading tips from " << strFile.mb_str(wxConvLocal));
1488 bShowAtStartup = wxShowTip(wxGetActiveWindow(), tipProvider, (nValue ?
true :
false));
1491 nValue = (bShowAtStartup ? tipProvider->GetCurrentTip() : 0);
1493 config->Write(
"/MainFrame/ShowStartTip", nValue);
1502 pref_dlg.ShowModal();
1504 wxConfigBase* cfg=wxConfigBase::Get();
1505 #if defined __WXMSW__
1508 unsigned long mem_high = cfg->Read(
"/ImageCache/UpperBoundHigh", (
long) 0);
1511 mem = ((
unsigned long long) mem_high << 32) + mem_low;
1517 ImageCache::getInstance().SetUpperLimit(mem);
1539 wxCommandEvent dummy;
1549 #if defined __WXMSW__ || defined __WXMAC__
1556 #if defined __WXMSW__
1563 #elif defined __WXGTK__
1592 wxCommandEvent dummy;
1604 wxMenuBar* menubar = GetMenuBar();
1607 menubar->Check(XRCID(
"action_optimize_only_active"), onlyActive);
1622 m_optIgnoreLineCp = GetMenuBar()->IsChecked(XRCID(
"action_optimize_ignore_line_cp"));
1631 wxMenuBar* menubar = GetMenuBar();
1634 menubar->Check(XRCID(
"action_optimize_ignore_line_cp"), ignoreLineCP);
1647 wxCommandEvent dummy;
1655 wxCommandEvent cmdEvt(wxEVT_BUTTON, stitchButton->GetId());
1656 stitchButton->GetEventHandler()->AddPendingEvent(cmdEvt);
1680 wxConfigBase* config = wxConfigBase::Get();
1682 wxString defaultdir = config->Read(
"/actualPath",wxEmptyString);
1683 wxFileDialog dlg(wxGetActiveWindow(),
1684 _(
"Open project file"),
1685 defaultdir, wxEmptyString,
1686 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1687 wxFD_OPEN, wxDefaultPosition);
1688 dlg.SetDirectory(defaultdir);
1689 if (dlg.ShowModal() == wxID_OK)
1691 wxString filename = dlg.GetPath();
1692 wxFileName fname(filename);
1693 wxString path = fname.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
1694 if (fname.IsOk() && fname.FileExists())
1707 m_mruFiles.AddFileToHistory(fname.GetFullPath());
1711 wxCommandEvent dummy;
1717 hugin_utils::HuginMessageBox(wxString::Format(_(
"Could not read project file %s."), fname.GetFullPath()), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
1725 wxString currentDir = wxConfigBase::Get()->Read(
"/actualPath", wxEmptyString);
1726 wxFileDialog dlg(wxGetActiveWindow(), _(
"Open Papywizard xml file"),
1727 currentDir, wxEmptyString, _(
"Papywizard xml files (*.xml)|*.xml|All files (*)|*"),
1728 wxFD_OPEN, wxDefaultPosition);
1729 dlg.SetDirectory(currentDir);
1730 if (dlg.ShowModal() == wxID_OK)
1732 wxConfigBase::Get()->Write(
"/actualPath", dlg.GetDirectory());
1740 wxConfigBase* config = wxConfigBase::Get();
1742 wxFileDialog dlg(wxGetActiveWindow(),
1743 _(
"Choose template project"),
1744 config->Read(
"/templatePath",wxEmptyString), wxEmptyString,
1745 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1746 wxFD_OPEN, wxDefaultPosition);
1747 dlg.SetDirectory(wxConfigBase::Get()->Read(
"/templatePath",wxEmptyString));
1748 if (dlg.ShowModal() == wxID_OK) {
1749 wxString filename = dlg.GetPath();
1750 wxConfig::Get()->Write(
"/templatePath", dlg.GetDirectory());
1762 #if defined __WXMAC__ && defined MAC_SELF_CONTAINED_BUNDLE
1766 FSRef actuallyLaunched;
1768 FSRef documentArray[1];
1769 LSLaunchFSRefSpec launchSpec;
1772 err = LSFindApplicationForInfo(kLSUnknownCreator,
1773 CFSTR(
"net.sourceforge.hugin.PTBatcherGUI"),
1779 hugin_utils::HuginMessageBox(wxString::Format(_(
"External program %s not found in the bundle, reverting to system path"),
"open"), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
1781 wxExecute(_T(
"open -b net.sourceforge.hugin.PTBatcherGUI"));
1784 wxExecute(_T(
"open -b net.sourceforge.hugin.PTBatcherGUI"));
1787 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
1788 wxExecute(exePath.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + _T(
"PTBatcherGUI"));
1800 std::set<unsigned int> unoptimized;
1801 for (
unsigned int i=0; i < cps.size(); i++) {
1803 unoptimized.insert(i);
1806 unsigned int nGood=0;
1807 unsigned int nBad=0;
1809 wxConfigBase *cfg = wxConfigBase::Get();
1819 ProgressReporterDialog progress(unoptimized.size(), _(
"Fine-tuning all points"), _(
"Fine-tuning"), wxGetActiveWindow());
1821 ImageCache & imgCache = ImageCache::getInstance();
1827 std::set<unsigned int>::iterator it=unoptimized.begin();
1829 imgCache.softFlush();
1831 while (it != unoptimized.end()) {
1832 if (cps[*it].image1Nr == imgNr || cps[*it].image2Nr == imgNr) {
1833 if (!progress.updateDisplayValue())
1840 wxImage wxSearchImg;
1842 pano.
getImage(cps[*it].image2Nr).getFilename())->get8BitImage();
1845 pano.
getImage(cps[*it].image1Nr).getFilename())->get8BitImage();
1852 pano.
getImage(cps[*it].image2Nr), *searchImg, roundP2, sWidth);
1860 if (res.
maxi < corrThresh || res.
curv.
x < curvThresh || res.
curv.
y < curvThresh ||
1865 if (res.
maxi >= corrThresh) {
1868 cps[*it].error = res.
maxi;
1877 cps[*it].error = res.
maxi;
1883 cps[*it].error = 1.0;
1885 unsigned int rm = *it;
1887 unoptimized.erase(rm);
1896 result.Printf(_(
"%d points fine-tuned, %d points not updated due to low correlation\n\nHint: The errors of the fine-tuned points have been set to the correlation coefficient\nProblematic points can be spotted (just after fine-tune, before optimizing)\nby an error <= %.3f.\nThe error of points without a well defined peak (typically in regions with uniform color)\nwill be set to 0\n\nUse the Control Point list (F3) to see all points of the current project\n"),
1897 nGood, nBad, corrThresh);
1916 _(
"Hugin"), wxOK | wxICON_INFORMATION,
this);
1921 void MainFrame::OnPythonScript(wxCommandEvent & e)
1924 wxFileDialog dlg(wxGetActiveWindow(),
1925 _(
"Select python script"),
1926 wxConfigBase::Get()->Read(
"/lensPath",wxEmptyString), wxEmptyString,
1927 _(
"Python script (*.py)|*.py|All files (*.*)|*.*"),
1928 wxFD_OPEN, wxDefaultPosition);
1929 dlg.SetDirectory(wxConfigBase::Get()->Read(
"/pythonScriptPath",wxEmptyString));
1931 if (dlg.ShowModal() == wxID_OK)
1933 wxString filename = dlg.GetPath();
1934 wxConfig::Get()->Write(
"/pythonScriptPath", dlg.GetDirectory());
1937 new PanoCommand::PythonScriptPanoCmd(
pano,scriptfile)
1942 void MainFrame::OnPlugin(wxCommandEvent & e)
1944 wxFileName file=m_plugins[e.GetId()];
1945 if(file.FileExists())
1949 new PanoCommand::PythonScriptPanoCmd(
pano,scriptfile)
1954 hugin_utils::HuginMessageBox(wxString::Format(
"Python-Script %s not found.\nStopping processing.", file.GetFullPath()), _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2010 if (switchToCropMode)
2042 msg = wxGetTranslation(wxString(
m_message.c_str(), wxConvLocal));
2049 GetStatusBar()->SetStatusText(msg, 0);
2058 wxToolBar* theToolBar = GetToolBar();
2059 theToolBar->EnableTool(XRCID(
"action_optimize"), option);
2060 theToolBar->EnableTool(XRCID(
"ID_SHOW_PREVIEW_FRAME"), option);
2062 wxMenuBar* theMenuBar = GetMenuBar();
2063 theMenuBar->Enable(XRCID(
"action_optimize"), option);
2064 theMenuBar->Enable(XRCID(
"action_finetune_all_cp"), option);
2065 theMenuBar->Enable(XRCID(
"action_remove_cp_in_masks"), option);
2066 theMenuBar->Enable(XRCID(
"ID_SHOW_PREVIEW_FRAME"), option);
2067 theMenuBar->Enable(XRCID(
"action_stitch"), option);
2068 theMenuBar->Enable(XRCID(
"action_stitch_userdefined"), option);
2077 theMenuBar->Enable(XRCID(
"action_assistant"), option);
2078 theMenuBar->Enable(XRCID(
"action_batch_assistant"), option);
2087 wxSize sz = this->GetSize();
2088 wxSize csz = this->GetClientSize();
2089 wxSize vsz = this->GetVirtualSize();
2091 " client: "<< csz.x <<
"," << csz.y <<
2092 " virtual: "<< vsz.x <<
"," << vsz.y);
2126 return wxGetApp().GetDataPath();
2153 size_t index = e.GetId() - wxID_FILE1;
2154 wxString f(
m_mruFiles.GetHistoryFile(index));
2158 if (fn.FileExists())
2164 ImageCache::getInstance().flush();
2173 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2180 ShowFullScreen(!IsFullScreen(), wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION);
2183 GetToolBar()->Show(
true);
2198 if (! wxFile::Exists(wxstrModelFileName) ) {
2199 hugin_utils::HuginMessageBox(wxString::Format(_(
"Celeste model expected in %s not found, Hugin needs to be properly installed."), wxstrModelFileName), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2204 hugin_utils::HuginMessageBox(wxString::Format(_(
"Could not load Celeste model file %s"), wxstrModelFileName), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2225 bool needsUpdateOptimizerVar=
false;
2227 for(
size_t i=0; i<optVec.size(); i++)
2229 bool hasTrX=optVec[i].erase(
"TrX")>0;
2230 bool hasTrY=optVec[i].erase(
"TrY")>0;
2231 bool hasTrZ=optVec[i].erase(
"TrZ")>0;
2232 bool hasTpy=optVec[i].erase(
"Tpy")>0;
2233 bool hasTpp=optVec[i].erase(
"Tpp")>0;
2234 bool hasg=optVec[i].erase(
"g")>0;
2235 bool hast=optVec[i].erase(
"t")>0;
2236 needsUpdateOptimizerVar=needsUpdateOptimizerVar || hasTrX || hasTrY || hasTrZ || hasTpy || hasTpp || hasg || hast;
2238 if(needsUpdateOptimizerVar)
2247 bool needsUpdateOptimizerVar=
false;
2249 for(
size_t i=0; i<optVec.size(); i++)
2251 bool hasVx=optVec[i].erase(
"Vx")>0;
2252 bool hasVy=optVec[i].erase(
"Vy")>0;
2253 needsUpdateOptimizerVar=needsUpdateOptimizerVar || hasVx || hasVy;
2255 if(needsUpdateOptimizerVar)
2274 GetMenuBar()->FindItem(XRCID(
"action_gui_simple"))->Check();
2277 GetMenuBar()->FindItem(XRCID(
"action_gui_advanced"))->Check();
2280 GetMenuBar()->FindItem(XRCID(
"action_gui_expert"))->Check();
2287 wxCommandEvent dummy;
2291 GetMenuBar()->Remove(0);
2296 SetTitle(_(
"Panorama editor"));
2301 gl_preview_frame->SetTitle(scriptName.GetName() +
"." + scriptName.GetExt() +
" - " + _(
"Hugin - Panorama Stitcher"));
2302 SetTitle(scriptName.GetName() +
"." + scriptName.GetExt() +
" - " + _(
"Panorama editor"));
2308 wxGetApp().SetTopWindow(
this);
2309 GetMenuBar()->Remove(0);
2313 SetTitle(_(
"Hugin - Panorama Stitcher"));
2318 SetTitle(scriptName.GetName() +
"." + scriptName.GetExt() +
" - " + _(
"Hugin - Panorama Stitcher"));
2338 hugin_utils::HuginMessageBox(_(
"Can't switch to simple interface. The project is using stacks and/or vignetting center shift.\nThese features are not supported in simple interface."),
2339 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2343 hugin_utils::HuginMessageBox(_(
"Can't switch to simple interface. The project is using translation or shear parameters.\nThese parameters are not supported in simple interface."),
2344 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2359 hugin_utils::HuginMessageBox(_(
"Can't switch to advanced interface. The project is using translation or shear parameters.\nThese parameters are not supported in advanced interface."),
2360 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2372 GetMenuBar()->Enable(XRCID(
"ID_SHOW_GL_PREVIEW_FRAME"),
false);
2373 GetMenuBar()->Enable(XRCID(
"action_gui_simple"),
false);
2374 GetToolBar()->EnableTool(XRCID(
"ID_SHOW_GL_PREVIEW_FRAME"),
false);
2380 wxString tempDir= wxConfig::Get()->Read(
"tempDir",wxEmptyString);
2381 if(!tempDir.IsEmpty())
2383 if(tempDir.Last()!=wxFileName::GetPathSeparator())
2385 tempDir.Append(wxFileName::GetPathSeparator());
2388 wxFileName scriptFileName(wxFileName::CreateTempFileName(tempDir+
"ha"));
2393 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
2394 wxArrayString tempfiles;
2396 if (userdefinedAssistant.IsEmpty())
2402 std::stringstream errors;
2404 if (commands->empty())
2406 hugin_utils::HuginMessageBox(_(
"The assistant queue is empty. This indicates an error in the user defined assistant file.") +
"\n\n" + wxString(errors.str()),
2407 _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2409 wxRemoveFile(scriptFileName.GetFullPath());
2422 wxRemoveFile(scriptFileName.GetFullPath());
2423 if (!tempfiles.IsEmpty())
2425 for (
auto& f : tempfiles)
2440 if (userdefinedAssistant.IsEmpty())
2444 hugin_utils::HuginMessageBox(_(
"The assistant could not find vertical lines. Please add vertical lines in the panorama editor and optimize project manually."),
2445 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2452 if (comps.size() > 1)
2455 unsigned i1 = *(comps[0].rbegin());
2456 unsigned i2 = *(comps[1].begin());
2460 + _(
"Please create control points between unconnected images using the Control Points tab in the panorama editor.\n\nAfter adding the points, press the \"Align\" button again"), _(
"Error"), wxOK, mainWin);
2464 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2470 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2495 wxCommandEvent dummy;
2500 #if defined __WXMAC__ && defined MAC_SELF_CONTAINED_BUNDLE
2504 FSRef actuallyLaunched;
2506 FSRef documentArray[1];
2507 LSLaunchFSRefSpec launchSpec;
2510 err = LSFindApplicationForInfo(kLSUnknownCreator,
2511 CFSTR(
"net.sourceforge.hugin.PTBatcherGUI"),
2518 hugin_utils::HuginMessageBox(wxString::Format(_(
"External program %s not found in the bundle, reverting to system path"),
"open"), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2524 wxCharBuffer projectFilebuffer=projectFile.ToUTF8();
2526 err = FSPathMakeRef((
unsigned char*) projectFilebuffer.data(), &documentArray[0], &isDir);
2527 if (err != noErr || isDir)
2530 hugin_utils::HuginMessageBox(wxString::Format(_(
"Project file not found"),
"open"), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2533 launchSpec.appRef = &appRef;
2534 launchSpec.numDocs =
sizeof(documentArray)/
sizeof(documentArray[0]);
2535 launchSpec.itemRefs = documentArray;
2536 launchSpec.passThruParams = NULL;
2537 launchSpec.launchFlags = kLSLaunchDontAddToRecents + kLSLaunchDontSwitch;
2538 launchSpec.asyncRefCon = NULL;
2540 err = LSOpenFromRefSpec(&launchSpec, &actuallyLaunched);
2541 if (err != noErr && err != kLSLaunchInProgressErr)
2545 hugin_utils::HuginMessageBox(wxString::Format(_(
"Can't launch PTBatcherGui"),
"open"), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2550 if (FSCompareFSRefs(&appRef, &actuallyLaunched) != noErr)
2553 hugin_utils::HuginMessageBox(wxString::Format(_(
"Launched incorrect programme"),
"open"), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2557 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
void DisplayHelp(wxString section=wxEmptyString)
call help browser with given file
wxDEFINE_EVENT(EVT_QUEUE_PROGRESS, wxCommandEvent)
void OnShowCPFrame(wxCommandEvent &e)
OptimizePanel * opt_panel
int MyExecuteCommandQueue(HuginQueue::CommandQueue *queue, wxWindow *parent, const wxString &title, const wxString &comment)
execute all commands in queue with redirection of output to frame and allow canceling the queue will ...
Base class for all panorama commands.
bool ImportPapywizardFile(const wxString &filename, HuginBase::Panorama &pano)
import the settings from given filename into pano
void destroySVMmodel(struct svm_model *&model)
frees the resource of model
const bool GetOptimizeOnlyActiveImages() const
#define HUGIN_SHOW_PROJECTION_HINTS
void OnUpdate(wxCommandEvent &event)
std::list< PluginItem > PluginItems
void updateProgressDisplay()
receive notification about progress.
std::map< int, wxString > m_userOutput
bool FileExists(const std::string &filename)
checks if file exists
bool AskUserOverwrite(const wxString &filename, const wxString &caption, wxWindow *parent)
ask user if the given file should be overwritten, return true if the user confirmed the overwritting ...
void SetGuiLevel(GuiLevel newLevel)
void OnRemoveCPinMasks(wxCommandEvent &e)
const wxString & GetDataPath()
return the current data path
void OnUserQuit(wxCommandEvent &e)
void OnRunAssistant(wxCommandEvent &e)
void OnApplyTemplate(wxCommandEvent &e)
The OpenGL preview frame.
void setMemento(const PanoramaMemento &memento)
set the internal state
virtual PanoCommand::PanoCommand * GetCommand(wxWindow *parent, HuginBase::Panorama &pano, HuginBase::UIntSet images, GuiLevel guiLevel)
returns the appropriate PanoCommand::PanoCommand to be inserted into GlobalCmdHistory, checks if operation is enabled
void AddImages(wxArrayString &filenameArray)
adds the given files to the projects, with checking for invalid filenames
void SetGuiLevel(GuiLevel newGuiLevel)
void ShowStitcherTab()
opens the stitcher tab
const bool GetOptimizeIgnoreLineCp() const
void StorePositionAndSize()
store position and size of window in wxConfig
start a new project, reset options to values in preferences
read settings from papywizard xml file
#define HUGIN_FT_LOCAL_SEARCH_WIDTH
vigra_ext::CorrelationResult PointFineTuneProjectionAware(const HuginBase::SrcPanoImage &templ, const vigra::UInt8RGBImage &templImg, vigra::Diff2D templPos, int templSize, const HuginBase::SrcPanoImage &search, const vigra::UInt8RGBImage &searchImg, vigra::Diff2D searchPos, int sWidth)
function for fine-tune with remapping to stereographic projection
void OnToggleGLPreviewFrame(wxCommandEvent &e)
void AddUserDefinedAssistant(int id, const wxString &desc, const wxString &help)
adds the given user defined assistant to SplitButton menu
void OnRedo(wxCommandEvent &e)
void StoreFramePosition(wxTopLevelWindow *frame, const wxString &basename, const bool ignoreMaximize)
GLPreviewFrame * gl_preview_frame
ImagesPanel * images_panel
bool m_show_opt_photo_panel
void OnUndo(wxCommandEvent &e)
center panorama horizontically
wxMenuItem * m_assistantUserMenu
struct celeste::svm_model * svmModel
control point editor panel.
OptimizePhotometricPanel * opt_photo_panel
bool removeObserver(PanoramaObserver *observer)
remove a panorama observer.
GuiLevel GetMinimumGuiLevel(HuginBase::PanoramaData &pano)
returns the requiered GuiLevel for the given panorama to work correctly
std::unique_ptr< wxMessageDialogBase > MessageDialog
hugin_utils::FDiff2D corrPos
const wxString GetSelectedCPGenerator()
return the currently selected cp generator description
void RunAssistant(wxWindow *mainWin, const wxString &userdefinedAssistant=wxEmptyString)
#define HUGIN_FT_CURV_THRESHOLD
void registerPTWXDlgFcn()
void OnUserDefinedStitch(wxCommandEvent &e)
void OnSavePTStitcherAs(wxCommandEvent &e)
void OnExit(wxCloseEvent &e)
void RunCPGenerator(CPDetectorSetting &setting, const HuginBase::UIntSet &img)
run the cp generator with the given setting on selected images
const wxString GetDescription() const
return description
Reading python plugins metadata.
void OnTipOfDay(wxCommandEvent &e)
void deregisterPTWXDlgFcn()
void OnMergeProject(wxCommandEvent &e)
This is a cache for all the images we use.
void SetOptimizeOnlyActiveImages(const bool onlyActive)
sets the status of the "optimize only active images" menu item
#define DEBUG_ASSERT(cond)
void OnPhotometricOptimize(wxCommandEvent &e)
HuginBase::ImageCache::ImageCacheRGB8Ptr ImageCacheRGB8Ptr
simple class that forward the drop to the mainframe
include file for the hugin project
A tip file provider that uses gettext to translate the tips.
wxHelpController & GetHelpController()
virtual void clearDirty()
clear dirty flag.
void OnSendToAssistantQueue(wxCommandEvent &e)
void setImage(unsigned int imgNr, bool updateListSelection=false)
sets the image, which is currently edited
void setLeftImage(unsigned int imgNr)
set left image
void InitPreviews()
init previews
const CPVector & getCtrlPoints() const
get all control point of this Panorama
void GeneratePanoOperationVector()
generates the PanoOperationVector for context menu
void OnLoadingFailed(wxCommandEvent &e)
event handler called when loading of image file failed
static MainFrame * m_this
wxMenuItem * m_outputUserMenu
remove several control points
void DoUserDefinedStitch(const wxString &settings=wxString())
stitching with user defined file
void ShowControlPoint(unsigned int cpNr)
show a control point
Definition of PanoOperation class.
std::vector< HuginBase::UIntSet > Components
stores the components of the graph
MessageDialog GetMessageDialog(const wxString &message, const wxString &caption, int style, wxWindow *parent)
void SetGuiLevel(GuiLevel newGuiLevel)
static huginApp * Get()
hack.. kind of a pseudo singleton...
void OnUserDefinedStitchSaved(wxCommandEvent &e)
PanoCommand to combine other PanoCommands.
void Init(HuginBase::Panorama *pano)
apply a template to a panorama object
std::set< unsigned int > UIntSet
void OnSetGuiAdvanced(wxCommandEvent &e)
void Init(HuginBase::Panorama *pano)
CommandQueue * GetAssistantCommandQueue(const HuginBase::Panorama &pano, const wxString &ExePath, const wxString &project)
generates the command queue for running the assistant
algorithms for remove control points by statistic method
void ShowCtrlPoint(unsigned int cpNr)
void LoadOpenGLLayout()
loads the layout of the OpenGL windows and restores it
wxButton * GetStitchButton() const
updates the optimize vector, aka all variables which should be optimized
bool loadSVMmodel(struct svm_model *&model, std::string &model_file)
loads the SVM model from file
wxMenu * m_menu_file_simple
void LoadProjectFile(const wxString &filename)
#define HUGIN_IMGCACHE_UPPERBOUND
const wxFileName GetFilename() const
returns filename
std::string getPathPrefix(const std::string &filename)
Get the path to a filename.
HuginBase::Panorama & pano
void OnFineTuneAll(wxCommandEvent &e)
Definition of dialog and functions to import RAW images to project file.
const wxString & GetDataPath()
get the path to data directory
const OptimizeVector & getOptimizeVector() const
return the optimize settings stored inside panorama
bool loadPTScript(std::istream &i, int &ptoVersion, const std::string &prefix="")
load a Hugin file
#define HUGIN_FT_TEMPLATE_SIZE
class, which stores all settings of one cp detector
void OnKeyboardHelp(wxCommandEvent &e)
PanoCommand::PanoCommand * GetPanoCommand()
return PanoCommand for adding converted raw files to Panorama
bool comparePluginItem(PluginItem item1, PluginItem item2)
compares 2 plugin with category and name
std::size_t getNrOfImages() const
number of images.
static MainFrame * Get()
hack.. kind of a pseudo singleton...
void SetIgnoreLineCP(const bool noLineCp)
for external setting of "ignore line cp" checkbox
void OnIgnoreLineCp(wxCommandEvent &e)
const PanoCommand * getLastCommand() const
return the last PanoCommand
void SetOnlyActiveImages(const bool onlyActive)
for external setting of "only active image" checkbox
void OnFAQ(wxCommandEvent &e)
void OnMRUFiles(wxCommandEvent &e)
event handler for recently used files
void SwitchToCropMode()
switches the controls to crop mode
void AddUserDefinedSequence(int id, const wxString &desc, const wxString &help)
adds the given user defined output sequence to SplitButton menu
Dialog for browsing pto files.
void SetGuiLevel(GuiLevel newLevel)
sets the gui level
void OnCPListFrameClosed()
virtual void panoramaChanged(HuginBase::Panorama &pano)
this is called whenever the panorama has changed.
void DisableOpenGLTools()
disables all OpenGL related menu items and toobar buttons
void OnAddImages(wxCommandEvent &e)
class for generating plugin menu items
virtual bool wasSuccessful() const
void SetOnlyActiveImages(const bool onlyActive)
for external setting of "only active image" checkbox
void panoramaImagesChanged(HuginBase::Panorama &pano, const HuginBase::UIntSet &imgNr)
notifies about changes to images
wxString GetCurrentOptimizerString()
returns the string which describes the current selected optimizer setting
PanoOperation to add several user selected images to the panorama.
IMPLEMENT_DYNAMIC_CLASS(wxTreeListHeaderWindow, wxWindow)
class for showing splash screen the class wxSplashScreen from wxWidgets does not work correctly for o...
Maximum of correlation, position and value.
std::string getLastCommandName() const
returns the name of the last command
Definition of dialog for numeric transforms.
hugin_utils::FDiff2D curv
void OnTogglePreviewFrame(wxCommandEvent &e)
wxwindows specific panorama commands
bool canRedo() const
Return true iff there is a command to redo.
const wxString GetName() const
return name from metadata
void OnOptimizeButton(wxCommandEvent &e)
run the optimizer
update all control points
void clearRedoQueue()
clear all commands in the redo queue
virtual ~MainFrame()
dtor.
distributes all images above the sphere, for the assistant
void SetShowProjectionHints(bool new_value)
set status if projection hints should be shown or not
void SetOptimizeIgnoreLineCp(const bool ignoreLineCP)
sets the status of the "ignore line cp" menu item
static GlobalCmdHist & getInstance()
const wxString & GetXRCPath()
get the path to the xrc directory
void OnOptimizeButton(wxCommandEvent &e)
run the optimizer
void ShowMaskEditor(size_t imgNr, bool switchToCropMode=false)
opens the mask/crop editor with the given image selected
void OnBrowseProjects(wxCommandEvent &e)
void Init(HuginBase::Panorama *pano)
void addCommand(PanoCommand *command, bool execute=true)
Adds a command to the history.
void OnLoadProject(wxCommandEvent &e)
const bool IsAPIValid() const
returns true, if plugin can run on given system and version
void OnOptimize(wxCommandEvent &e)
void clear()
Erases all the undo/redo history.
void ReloadCPDetectorSettings()
Reloads the cp detector settings from config, necessary after edit preferences.
wxMenu * m_menu_file_advanced
void Init(HuginBase::Panorama *pano)
void OnSaveProjectAs(wxCommandEvent &e)
void OnSaveProject(wxCommandEvent &e)
void RunCPGenerator(CPDetectorSetting &setting, const HuginBase::UIntSet &img)
run the cp generator with the given setting on selected images
bool CloseProject(bool cancelable, CloseReason reason)
void SetGuiLevel(GuiLevel newGuiLevel)
void Init(HuginBase::Panorama *pano)
void OnShowPanel(wxCommandEvent &e)
void addObserver(PanoramaObserver *o)
add a panorama observer.
void OnDoStitch(wxCommandEvent &e)
struct celeste::svm_model * GetSVMModel()
void changeFinished(bool keepDirty)
notify observers about changes in this class
PanoOperation to add all image in a defined timeinterval to the panorama.
include file for the hugin project
#define HUGIN_CELESTE_MODEL
const PanoramaOptions & getOptions() const
returns the options for this panorama
void OnHelp(wxCommandEvent &e)
bool canUndo() const
Return true iff there is a command to undo.
const wxString GetSettingStringTranslated(wxConfigBase *setting, const wxString &name, const wxString defaultValue)
read a translated string from settings and remove all whitespaces
void setRightImage(unsigned int imgNr)
set right image
const int getPhotometricOptimizerSwitch() const
return the photometric optimizer master switch
#define HUGIN_FT_CORR_THRESHOLD
GLPreviewFrame * getGLPreview()
Components GetComponents()
find all connected components
void OnRunAssistantUserdefined(wxCommandEvent &e)
Memento class for a Panorama object.
bool isDirty() const
true if there are unsaved changes
void ShowCtrlPointEditor(unsigned int img1, unsigned int img2)
opens the control points tab with the both images selected
const int getOptimizerSwitch() const
returns optimizer master switch
MainFrame(wxWindow *parent, HuginBase::Panorama &pano)
ctor.
std::string GetUserAppDataDir()
returns the directory for user specific Hugin settings, e.g.
void Init(HuginBase::Panorama *pano)
HuginSplashScreen(wxWindow *parent, wxBitmap bitmap)
bool m_optOnlyActiveImages
add image(s) to a panorama
Definition of dialog to browse directory with pto files.
virtual void redo()
Redoes the last undone action.
std::string GetHuginVersion()
return a string with version numbers
void OnOnlyActiveImages(wxCommandEvent &e)
void OnNewProject(wxCommandEvent &e)
hugin_utils::FDiff2D maxpos
void OnSetGuiSimple(wxCommandEvent &e)
CPDetectorSetting & GetDefaultSetting()
returns the default cp detector settings
std::vector< ControlPoint > CPVector
functions for interaction with the hugin configuration file
wxString GetCurrentOptimizerString()
return the currently selected optimizer setting as string from the drop down list box ...
bool WritePTOFile(const std::string &filename, const std::string &prefix="")
write data to given pto file
void OnOpenPTBatcher(wxCommandEvent &e)
std::vector< std::set< std::string > > OptimizeVector
void OnShowPrefs(wxCommandEvent &e)
Define the pano edit panel.
void OnFullScreen(wxCommandEvent &e)
event handler for full screen
MaskEditorPanel * mask_panel
const SrcPanoImage & getImage(std::size_t nr) const
get a panorama image, counting starts with 0
void OnShowEvent(wxShowEvent &e)
remove multiple images from a panorama
void CleanPanoOperationVector()
clears the PanoOperationVector
void fill_set(_Container &c, typename _Container::key_type begin, typename _Container::key_type end)
virtual void undo()
Undoes the last action.
CommandQueue * GetAssistantCommandQueueUserDefined(const HuginBase::Panorama &pano, const wxString &ExePath, const wxString &project, const wxString &assistantSetting, wxArrayString &tempFilesDelete, std::ostream &errStream)
generates the command queue for running the assistant
void OnAbout(wxCommandEvent &e)
CPDetectorSetting & GetDefaultSetting()
returns default cp detector setting
virtual void panoramaChanged(HuginBase::Panorama &pano)
Enable or disable undo and redo.
const wxString GetCategory() const
return category name
void OnAddTimeImages(wxCommandEvent &e)
str wxQuoteFilename(const str &arg)
Quote a filename, so that it is surrounded by "".
dump the current project and load a new one.
void OnSize(wxSizeEvent &e)
wxString getProjectName()
const wxString & GetXRCPath()
return the current xrc path
void SetGuiLevel(GuiLevel newGuiLevel)
sets the GuiLevel for all controls on this panel
UIntSet getCPinMasks(HuginBase::Panorama pano)
returns these control points, which are in masks
bool IsShowingCorrelation() const
PreviewFrame * preview_frame
const wxString GetSelectedCPGenerator()
return the currently selected cp generator description
void ResetPreviewZoom()
reset zoom level for preview window
wxString Components2Str(const HuginGraph::ImageGraph::Components &comp)
int HuginMessageBox(const wxString &message, const wxString &caption, int style, wxWindow *parent)
std::map< int, wxString > m_userAssistant
wxString getDefaultProjectName(const HuginBase::Panorama &pano, const wxString filenameTemplate)
gets the default project name, as defined in the preferences
std::vector< NormalCommand * > CommandQueue
void printStitcherScript(std::ostream &o, const PanoramaOptions &target, const UIntSet &imgs) const
create the stitcher script
void OnSetGuiExpert(wxCommandEvent &e)
bool CheckRawFiles()
return true, if all raw files are from the same camera
create a CommandQueue for running the assistant using CLI tools
void OnReadPapywizard(wxCommandEvent &e)
void enableTools(bool option)
class to work with images graphs created from a HuginBase::Panorama class it creates a graph based on...