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 wxStaticBitmap* staticBitmap=
new wxStaticBitmap(
this,wxID_ANY,bitmap);
98 topSizer->Add(staticBitmap,1,wxEXPAND);
99 SetSizerAndFit(topSizer);
100 SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
104 #if defined(__WXMSW__) || defined(__WXMAC__)
106 #elif defined(__WXGTK20__)
118 bool
PanoDropTarget::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames)
122 if (!mf)
return false;
124 if (!m_imageOnly && filenames.GetCount() == 1) {
125 wxFileName file(filenames[0]);
126 if (file.GetExt().CmpNoCase(
"pto") == 0 ||
127 file.GetExt().CmpNoCase(
"ptp") == 0 ||
128 file.GetExt().CmpNoCase(
"pts") == 0 )
135 ImageCache::getInstance().flush();
142 std::vector<std::string> filesv;
143 std::vector<std::string> rawFilesv;
144 wxArrayString invalidFiles;
145 for (
unsigned int i=0; i< filenames.GetCount(); i++) {
146 wxFileName file(filenames[i]);
154 invalidFiles.Add(file.GetFullPath());
168 invalidFiles.Add(file.GetFullPath());
178 if (!invalidFiles.empty())
187 if(pano.getNrOfCtrlPoints()>0)
193 std::vector<PanoCommand::PanoCommand*> cmds;
200 if (!rawFilesv.empty())
202 if (rawFilesv.size() == 1)
205 _(
"Hugin"), wxICON_EXCLAMATION | wxOK | wxCANCEL, mf);
206 message->SetOKLabel(_(
"Convert anyway."));
207 if (message->ShowModal() != wxID_OK)
217 if (dlg.ShowModal() == wxID_OK)
236 : cp_frame(0), pano(pano)
241 bool disableOpenGL=
false;
242 if(wxGetKeyState(WXK_COMMAND))
245 wxXmlResource::Get()->LoadDialog(&dlg, NULL,
"disable_opengl_dlg");
246 long noOpenGL=wxConfigBase::Get()->Read(
"DisableOpenGL", 0l);
249 XRCCTRL(dlg,
"disable_dont_ask_checkbox", wxCheckBox)->SetValue(
true);
251 if(dlg.ShowModal()==wxID_OK)
253 if(XRCCTRL(dlg,
"disable_dont_ask_checkbox", wxCheckBox)->IsChecked())
255 wxConfigBase::Get()->Write(
"DisableOpenGL", 1l);
259 wxConfigBase::Get()->Write(
"DisableOpenGL", 0l);
265 wxConfigBase::Get()->Write(
"DisableOpenGL", 0l);
270 long noOpenGL=wxConfigBase::Get()->Read(
"DisableOpenGL", 0l);
271 disableOpenGL=(noOpenGL==1);
283 dc.SelectObject(bitmap);
285 wxFont font(9, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
287 wxFont font(8, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
290 dc.SetTextForeground(*wxBLACK);
291 dc.SetTextBackground(*wxWHITE);
295 dc.GetTextExtent(version, &tw, &th);
297 dc.DrawText(version, bitmap.GetWidth() - tw - 3, bitmap.GetHeight() - th - 3);
298 dc.SelectObject(wxNullBitmap);
300 bitmap.SetScaleFactor(GetDPIScaleFactor());
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;
1654 wxCommandEvent cmdEvt(wxEVT_COMMAND_BUTTON_CLICKED,XRCID(
"pano_button_stitch"));
1655 pano_panel->GetEventHandler()->AddPendingEvent(cmdEvt);
1679 wxConfigBase* config = wxConfigBase::Get();
1681 wxString defaultdir = config->Read(
"/actualPath",wxEmptyString);
1682 wxFileDialog dlg(wxGetActiveWindow(),
1683 _(
"Open project file"),
1684 defaultdir, wxEmptyString,
1685 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1686 wxFD_OPEN, wxDefaultPosition);
1687 dlg.SetDirectory(defaultdir);
1688 if (dlg.ShowModal() == wxID_OK)
1690 wxString filename = dlg.GetPath();
1691 wxFileName fname(filename);
1692 wxString path = fname.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
1693 if (fname.IsOk() && fname.FileExists())
1706 m_mruFiles.AddFileToHistory(fname.GetFullPath());
1710 wxCommandEvent dummy;
1716 hugin_utils::HuginMessageBox(wxString::Format(_(
"Could not read project file %s."), fname.GetFullPath()), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
1724 wxString currentDir = wxConfigBase::Get()->Read(
"/actualPath", wxEmptyString);
1725 wxFileDialog dlg(wxGetActiveWindow(), _(
"Open Papywizard xml file"),
1726 currentDir, wxEmptyString, _(
"Papywizard xml files (*.xml)|*.xml|All files (*)|*"),
1727 wxFD_OPEN, wxDefaultPosition);
1728 dlg.SetDirectory(currentDir);
1729 if (dlg.ShowModal() == wxID_OK)
1731 wxConfigBase::Get()->Write(
"/actualPath", dlg.GetDirectory());
1739 wxConfigBase* config = wxConfigBase::Get();
1741 wxFileDialog dlg(wxGetActiveWindow(),
1742 _(
"Choose template project"),
1743 config->Read(
"/templatePath",wxEmptyString), wxEmptyString,
1744 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1745 wxFD_OPEN, wxDefaultPosition);
1746 dlg.SetDirectory(wxConfigBase::Get()->Read(
"/templatePath",wxEmptyString));
1747 if (dlg.ShowModal() == wxID_OK) {
1748 wxString filename = dlg.GetPath();
1749 wxConfig::Get()->Write(
"/templatePath", dlg.GetDirectory());
1761 #if defined __WXMAC__ && defined MAC_SELF_CONTAINED_BUNDLE
1765 FSRef actuallyLaunched;
1767 FSRef documentArray[1];
1768 LSLaunchFSRefSpec launchSpec;
1771 err = LSFindApplicationForInfo(kLSUnknownCreator,
1772 CFSTR(
"net.sourceforge.hugin.PTBatcherGUI"),
1778 hugin_utils::HuginMessageBox(wxString::Format(_(
"External program %s not found in the bundle, reverting to system path"),
"open"), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
1780 wxExecute(_T(
"open -b net.sourceforge.hugin.PTBatcherGUI"));
1783 wxExecute(_T(
"open -b net.sourceforge.hugin.PTBatcherGUI"));
1786 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
1787 wxExecute(exePath.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + _T(
"PTBatcherGUI"));
1799 std::set<unsigned int> unoptimized;
1800 for (
unsigned int i=0; i < cps.size(); i++) {
1802 unoptimized.insert(i);
1805 unsigned int nGood=0;
1806 unsigned int nBad=0;
1808 wxConfigBase *cfg = wxConfigBase::Get();
1818 ProgressReporterDialog progress(unoptimized.size(), _(
"Fine-tuning all points"), _(
"Fine-tuning"), wxGetActiveWindow());
1820 ImageCache & imgCache = ImageCache::getInstance();
1826 std::set<unsigned int>::iterator it=unoptimized.begin();
1828 imgCache.softFlush();
1830 while (it != unoptimized.end()) {
1831 if (cps[*it].image1Nr == imgNr || cps[*it].image2Nr == imgNr) {
1832 if (!progress.updateDisplayValue())
1839 wxImage wxSearchImg;
1841 pano.
getImage(cps[*it].image2Nr).getFilename())->get8BitImage();
1844 pano.
getImage(cps[*it].image1Nr).getFilename())->get8BitImage();
1851 pano.
getImage(cps[*it].image2Nr), *searchImg, roundP2, sWidth);
1859 if (res.
maxi < corrThresh || res.
curv.
x < curvThresh || res.
curv.
y < curvThresh ||
1864 if (res.
maxi >= corrThresh) {
1867 cps[*it].error = res.
maxi;
1876 cps[*it].error = res.
maxi;
1882 cps[*it].error = 1.0;
1884 unsigned int rm = *it;
1886 unoptimized.erase(rm);
1895 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"),
1896 nGood, nBad, corrThresh);
1915 _(
"Hugin"), wxOK | wxICON_INFORMATION,
this);
1920 void MainFrame::OnPythonScript(wxCommandEvent & e)
1923 wxFileDialog dlg(wxGetActiveWindow(),
1924 _(
"Select python script"),
1925 wxConfigBase::Get()->Read(
"/lensPath",wxEmptyString), wxEmptyString,
1926 _(
"Python script (*.py)|*.py|All files (*.*)|*.*"),
1927 wxFD_OPEN, wxDefaultPosition);
1928 dlg.SetDirectory(wxConfigBase::Get()->Read(
"/pythonScriptPath",wxEmptyString));
1930 if (dlg.ShowModal() == wxID_OK)
1932 wxString filename = dlg.GetPath();
1933 wxConfig::Get()->Write(
"/pythonScriptPath", dlg.GetDirectory());
1936 new PanoCommand::PythonScriptPanoCmd(
pano,scriptfile)
1941 void MainFrame::OnPlugin(wxCommandEvent & e)
1943 wxFileName file=m_plugins[e.GetId()];
1944 if(file.FileExists())
1948 new PanoCommand::PythonScriptPanoCmd(
pano,scriptfile)
1953 hugin_utils::HuginMessageBox(wxString::Format(
"Python-Script %s not found.\nStopping processing.", file.GetFullPath()), _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2009 if (switchToCropMode)
2041 msg = wxGetTranslation(wxString(
m_message.c_str(), wxConvLocal));
2048 GetStatusBar()->SetStatusText(msg, 0);
2057 wxToolBar* theToolBar = GetToolBar();
2058 theToolBar->EnableTool(XRCID(
"action_optimize"), option);
2059 theToolBar->EnableTool(XRCID(
"ID_SHOW_PREVIEW_FRAME"), option);
2061 wxMenuBar* theMenuBar = GetMenuBar();
2062 theMenuBar->Enable(XRCID(
"action_optimize"), option);
2063 theMenuBar->Enable(XRCID(
"action_finetune_all_cp"), option);
2064 theMenuBar->Enable(XRCID(
"action_remove_cp_in_masks"), option);
2065 theMenuBar->Enable(XRCID(
"ID_SHOW_PREVIEW_FRAME"), option);
2066 theMenuBar->Enable(XRCID(
"action_stitch"), option);
2067 theMenuBar->Enable(XRCID(
"action_stitch_userdefined"), option);
2076 theMenuBar->Enable(XRCID(
"action_assistant"), option);
2077 theMenuBar->Enable(XRCID(
"action_batch_assistant"), option);
2086 wxSize sz = this->GetSize();
2087 wxSize csz = this->GetClientSize();
2088 wxSize vsz = this->GetVirtualSize();
2090 " client: "<< csz.x <<
"," << csz.y <<
2091 " virtual: "<< vsz.x <<
"," << vsz.y);
2125 return wxGetApp().GetDataPath();
2152 size_t index = e.GetId() - wxID_FILE1;
2153 wxString f(
m_mruFiles.GetHistoryFile(index));
2157 if (fn.FileExists())
2163 ImageCache::getInstance().flush();
2172 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2179 ShowFullScreen(!IsFullScreen(), wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION);
2182 GetToolBar()->Show(
true);
2197 if (! wxFile::Exists(wxstrModelFileName) ) {
2198 hugin_utils::HuginMessageBox(wxString::Format(_(
"Celeste model expected in %s not found, Hugin needs to be properly installed."), wxstrModelFileName), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2203 hugin_utils::HuginMessageBox(wxString::Format(_(
"Could not load Celeste model file %s"), wxstrModelFileName), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2224 bool needsUpdateOptimizerVar=
false;
2226 for(
size_t i=0; i<optVec.size(); i++)
2228 bool hasTrX=optVec[i].erase(
"TrX")>0;
2229 bool hasTrY=optVec[i].erase(
"TrY")>0;
2230 bool hasTrZ=optVec[i].erase(
"TrZ")>0;
2231 bool hasTpy=optVec[i].erase(
"Tpy")>0;
2232 bool hasTpp=optVec[i].erase(
"Tpp")>0;
2233 bool hasg=optVec[i].erase(
"g")>0;
2234 bool hast=optVec[i].erase(
"t")>0;
2235 needsUpdateOptimizerVar=needsUpdateOptimizerVar || hasTrX || hasTrY || hasTrZ || hasTpy || hasTpp || hasg || hast;
2237 if(needsUpdateOptimizerVar)
2246 bool needsUpdateOptimizerVar=
false;
2248 for(
size_t i=0; i<optVec.size(); i++)
2250 bool hasVx=optVec[i].erase(
"Vx")>0;
2251 bool hasVy=optVec[i].erase(
"Vy")>0;
2252 needsUpdateOptimizerVar=needsUpdateOptimizerVar || hasVx || hasVy;
2254 if(needsUpdateOptimizerVar)
2273 GetMenuBar()->FindItem(XRCID(
"action_gui_simple"))->Check();
2276 GetMenuBar()->FindItem(XRCID(
"action_gui_advanced"))->Check();
2279 GetMenuBar()->FindItem(XRCID(
"action_gui_expert"))->Check();
2286 wxCommandEvent dummy;
2290 GetMenuBar()->Remove(0);
2295 SetTitle(_(
"Panorama editor"));
2300 gl_preview_frame->SetTitle(scriptName.GetName() +
"." + scriptName.GetExt() +
" - " + _(
"Hugin - Panorama Stitcher"));
2301 SetTitle(scriptName.GetName() +
"." + scriptName.GetExt() +
" - " + _(
"Panorama editor"));
2307 wxGetApp().SetTopWindow(
this);
2308 GetMenuBar()->Remove(0);
2312 SetTitle(_(
"Hugin - Panorama Stitcher"));
2317 SetTitle(scriptName.GetName() +
"." + scriptName.GetExt() +
" - " + _(
"Hugin - Panorama Stitcher"));
2337 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."),
2338 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2342 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."),
2343 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2358 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."),
2359 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2371 GetMenuBar()->Enable(XRCID(
"ID_SHOW_GL_PREVIEW_FRAME"),
false);
2372 GetMenuBar()->Enable(XRCID(
"action_gui_simple"),
false);
2373 GetToolBar()->EnableTool(XRCID(
"ID_SHOW_GL_PREVIEW_FRAME"),
false);
2379 wxString tempDir= wxConfig::Get()->Read(
"tempDir",wxEmptyString);
2380 if(!tempDir.IsEmpty())
2382 if(tempDir.Last()!=wxFileName::GetPathSeparator())
2384 tempDir.Append(wxFileName::GetPathSeparator());
2387 wxFileName scriptFileName(wxFileName::CreateTempFileName(tempDir+
"ha"));
2392 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
2393 wxArrayString tempfiles;
2395 if (userdefinedAssistant.IsEmpty())
2401 std::stringstream errors;
2403 if (commands->empty())
2405 hugin_utils::HuginMessageBox(_(
"The assistant queue is empty. This indicates an error in the user defined assistant file.") +
"\n\n" + wxString(errors.str()),
2406 _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2408 wxRemoveFile(scriptFileName.GetFullPath());
2421 wxRemoveFile(scriptFileName.GetFullPath());
2422 if (!tempfiles.IsEmpty())
2424 for (
auto& f : tempfiles)
2439 if (userdefinedAssistant.IsEmpty())
2443 hugin_utils::HuginMessageBox(_(
"The assistant could not find vertical lines. Please add vertical lines in the panorama editor and optimize project manually."),
2444 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2451 if (comps.size() > 1)
2454 unsigned i1 = *(comps[0].rbegin());
2455 unsigned i2 = *(comps[1].begin());
2459 + _(
"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);
2463 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2469 _(
"Hugin"), wxOK | wxICON_INFORMATION, wxGetActiveWindow());
2494 wxCommandEvent dummy;
2499 #if defined __WXMAC__ && defined MAC_SELF_CONTAINED_BUNDLE
2503 FSRef actuallyLaunched;
2505 FSRef documentArray[1];
2506 LSLaunchFSRefSpec launchSpec;
2509 err = LSFindApplicationForInfo(kLSUnknownCreator,
2510 CFSTR(
"net.sourceforge.hugin.PTBatcherGUI"),
2517 hugin_utils::HuginMessageBox(wxString::Format(_(
"External program %s not found in the bundle, reverting to system path"),
"open"), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2523 wxCharBuffer projectFilebuffer=projectFile.ToUTF8();
2525 err = FSPathMakeRef((
unsigned char*) projectFilebuffer.data(), &documentArray[0], &isDir);
2526 if (err != noErr || isDir)
2529 hugin_utils::HuginMessageBox(wxString::Format(_(
"Project file not found"),
"open"), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2532 launchSpec.appRef = &appRef;
2533 launchSpec.numDocs =
sizeof(documentArray)/
sizeof(documentArray[0]);
2534 launchSpec.itemRefs = documentArray;
2535 launchSpec.passThruParams = NULL;
2536 launchSpec.launchFlags = kLSLaunchDontAddToRecents + kLSLaunchDontSwitch;
2537 launchSpec.asyncRefCon = NULL;
2539 err = LSOpenFromRefSpec(&launchSpec, &actuallyLaunched);
2540 if (err != noErr && err != kLSLaunchInProgressErr)
2544 hugin_utils::HuginMessageBox(wxString::Format(_(
"Can't launch PTBatcherGui"),
"open"), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2549 if (FSCompareFSRefs(&appRef, &actuallyLaunched) != noErr)
2552 hugin_utils::HuginMessageBox(wxString::Format(_(
"Launched incorrect programme"),
"open"), _(
"Hugin"), wxOK | wxICON_ERROR, wxGetActiveWindow());
2556 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)
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
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 StoreFramePosition(wxTopLevelWindow *frame, const wxString &basename)
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...