27 #include "hugin_config.h"
30 #include <wx/stdpaths.h>
31 #include <wx/wfstream.h>
38 #include "vigra/imageinfo.hxx"
92 wxFrame(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxFRAME_TOOL_WINDOW | wxFRAME_NO_TASKBAR | wxSTAY_ON_TOP)
94 SetExtraStyle(GetExtraStyle() | wxWS_EX_TRANSIENT);
95 wxSizer* topSizer=
new wxBoxSizer(wxVERTICAL);
96 wxStaticBitmap* staticBitmap=
new wxStaticBitmap(
this,wxID_ANY,bitmap);
97 topSizer->Add(staticBitmap,1,wxEXPAND);
98 SetSizerAndFit(topSizer);
99 SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
103 #if defined(__WXMSW__) || defined(__WXMAC__)
105 #elif defined(__WXGTK20__)
117 bool
PanoDropTarget::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames)
121 if (!mf)
return false;
123 if (!m_imageOnly && filenames.GetCount() == 1) {
124 wxFileName file(filenames[0]);
125 if (file.GetExt().CmpNoCase(wxT(
"pto")) == 0 ||
126 file.GetExt().CmpNoCase(wxT(
"ptp")) == 0 ||
127 file.GetExt().CmpNoCase(wxT(
"pts")) == 0 )
134 ImageCache::getInstance().flush();
141 std::vector<std::string> filesv;
142 std::vector<std::string> rawFilesv;
143 wxArrayString invalidFiles;
144 for (
unsigned int i=0; i< filenames.GetCount(); i++) {
145 wxFileName file(filenames[i]);
153 invalidFiles.Add(file.GetFullPath());
167 invalidFiles.Add(file.GetFullPath());
177 if (!invalidFiles.empty())
186 if(pano.getNrOfCtrlPoints()>0)
192 std::vector<PanoCommand::PanoCommand*> cmds;
199 if (!rawFilesv.empty())
201 if (rawFilesv.size() == 1)
203 wxMessageDialog message(mf, _(
"You selected only one raw file. This is not recommended.\nAll raw files should be converted at once."),
209 wxICON_EXCLAMATION | wxOK | wxCANCEL);
210 message.SetOKLabel(_(
"Convert anyway."));
211 if (message.ShowModal() != wxID_OK)
221 if (dlg.ShowModal() == wxID_OK)
240 : cp_frame(0), pano(pano)
245 bool disableOpenGL=
false;
246 if(wxGetKeyState(WXK_COMMAND))
249 wxXmlResource::Get()->LoadDialog(&dlg, NULL, wxT(
"disable_opengl_dlg"));
250 long noOpenGL=wxConfigBase::Get()->Read(wxT(
"DisableOpenGL"), 0l);
253 XRCCTRL(dlg,
"disable_dont_ask_checkbox", wxCheckBox)->SetValue(
true);
255 if(dlg.ShowModal()==wxID_OK)
257 if(XRCCTRL(dlg,
"disable_dont_ask_checkbox", wxCheckBox)->IsChecked())
259 wxConfigBase::Get()->Write(wxT(
"DisableOpenGL"), 1l);
263 wxConfigBase::Get()->Write(wxT(
"DisableOpenGL"), 0l);
269 wxConfigBase::Get()->Write(wxT(
"DisableOpenGL"), 0l);
274 long noOpenGL=wxConfigBase::Get()->Read(wxT(
"DisableOpenGL"), 0l);
275 disableOpenGL=(noOpenGL==1);
287 dc.SelectObject(bitmap);
289 wxFont font(9, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
291 wxFont font(8, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
294 dc.SetTextForeground(*wxBLACK);
295 dc.SetTextBackground(*wxWHITE);
299 dc.GetTextExtent(version, &tw, &th);
301 dc.DrawText(version, bitmap.GetWidth() - tw - 3, bitmap.GetHeight() - th - 3);
302 dc.SelectObject(wxNullBitmap);
304 bitmap.SetScaleFactor(GetDPIScaleFactor());
307 wxLogFatalError(_(
"Fatal installation error\nThe file data/splash.png was not found at:") +
huginApp::Get()->
GetXRCPath());
319 wxXmlResource::Get()->LoadFrame(
this, parent, wxT(
"main_frame"));
324 wxApp::s_macAboutMenuItemId = XRCID(
"action_show_about");
325 wxApp::s_macPreferencesMenuItemId = XRCID(
"action_show_prefs");
326 wxApp::s_macExitMenuItemId = XRCID(
"action_exit_hugin");
327 wxApp::s_macHelpMenuTitleName = _(
"&Help");
329 wxMenuBar* mainMenu=wxXmlResource::Get()->LoadMenuBar(
this, wxT(
"main_menubar"));
333 SetMenuBar(mainMenu);
334 m_optOnlyActiveImages = (wxConfigBase::Get()->Read(wxT(
"/OptimizePanel/OnlyActiveImages"), 1l) != 0);
340 wxMenuBar* menubar=GetMenuBar();
342 wxMenu *pluginMenu=
new wxMenu();
348 bool cont = dir.GetFirst(&filename, wxT(
"*.py"), wxDIR_FILES | wxDIR_HIDDEN);
352 wxFileName file(dir.GetName(), filename);
357 items.push_back(item);
359 cont = dir.GetNext(&filename);
364 for (PluginItems::const_iterator it = items.begin(); it != items.end(); ++it)
367 int categoryID = pluginMenu->FindItem(item.
GetCategory());
368 wxMenu* categoryMenu;
369 if (categoryID == wxNOT_FOUND)
371 categoryMenu =
new wxMenu();
372 pluginMenu->AppendSubMenu(categoryMenu, item.
GetCategory());
376 categoryMenu = pluginMenu->FindItem(categoryID)->GetSubMenu();
380 Bind(wxEVT_MENU, &MainFrame::OnPlugin,
this, pluginID);
384 if (pluginMenu->GetMenuItemCount() > 0)
386 menubar->Insert(menubar->GetMenuCount() - 2, pluginMenu, _(
"&Actions"));
390 GetMenuBar()->Enable(XRCID(
"action_python_script"),
false);
394 SetToolBar(wxXmlResource::Get()->LoadToolBar(
this, wxT(
"main_toolbar")));
410 m_notebook = XRCCTRL((*
this),
"controls_notebook", wxNotebook);
443 wxConfigBase * config=wxConfigBase::Get();
463 wxDir::GetAllFiles(
GetDataPath()+
"output", &files, wxT(
"*.executor"), wxDIR_FILES | wxDIR_HIDDEN | wxDIR_NO_FOLLOW);
464 const size_t nrAllUserSequences = files.size();
466 if (!files.IsEmpty())
470 int outputMenuId=mainMenu->FindMenu(_(
"&Output"));
471 if (outputMenuId != wxNOT_FOUND)
473 wxMenu* outputSequencesMenu =
new wxMenu;
475 for (
auto file : files)
477 if (i > 0 && i == nrAllUserSequences && outputSequencesMenu->GetMenuItemCount() > 0)
479 outputSequencesMenu->AppendSeparator();
487 wxFileInputStream inputStream(file);
488 if (inputStream.IsOk())
491 wxFileConfig executorFile(inputStream);
496 help = wxString::Format(_(
"User defined sequence: %s"), file);
501 outputSequencesMenu->Append(outputId, desc, help);
514 if ((outputSequencesMenu->GetMenuItemCount() == 1 && !(outputSequencesMenu->FindItemByPosition(0)->IsSeparator())) ||
515 outputSequencesMenu->GetMenuItemCount() > 1)
517 m_outputUserMenu = mainMenu->GetMenu(outputMenuId)->AppendSubMenu(outputSequencesMenu, _(
"User defined output sequences"));
521 delete outputSequencesMenu;
530 wxDir::GetAllFiles(
GetDataPath() +
"assistant", &files, wxT(
"*.assistant"), wxDIR_FILES | wxDIR_HIDDEN | wxDIR_NO_FOLLOW);
531 const size_t nrAllUserSequences = files.size();
533 if (!files.IsEmpty())
537 const int editMenuId = mainMenu->FindMenu(_(
"&Edit"));
538 if (editMenuId != wxNOT_FOUND)
540 wxMenu* userAssistantMenu =
new wxMenu;
542 for (
auto file : files)
544 if (i > 0 && i == nrAllUserSequences && userAssistantMenu->GetMenuItemCount() > 0)
546 userAssistantMenu->AppendSeparator();
553 wxFileInputStream inputStream(file);
554 if (inputStream.IsOk())
557 wxFileConfig assistantFile(inputStream);
560 help = help.Trim(
true).Trim(
false);
563 help = wxString::Format(_(
"User defined assistant: %s"), file);
568 userAssistantMenu->Append(assistantId, desc, help);
581 if (userAssistantMenu->GetMenuItemCount() > 0)
583 m_assistantUserMenu = mainMenu->GetMenu(editMenuId)->Insert(5, wxID_ANY, _(
"User defined assistant"), userAssistantMenu);
587 delete userAssistantMenu;
596 wxIconBundle myIcons(
GetXRCPath() + wxT(
"data/hugin.ico"), wxBITMAP_TYPE_ICO);
599 wxIcon myIcon(
GetXRCPath() + wxT(
"data/hugin.png"),wxBITMAP_TYPE_PNG);
610 const int fields (2);
611 CreateStatusBar(fields);
612 int widths[fields] = {-1, 85};
613 SetStatusWidths( fields, &widths[0]);
614 SetStatusText(_(
"Started"), 0);
620 #if defined __WXMAC__ || defined __WXMSW__
622 SetSizeHints(900, 675);
625 SetSizeHints(780, 455);
629 ImageCache::getInstance().setProgressDisplay(
this);
630 #if defined __WXMSW__
633 unsigned long mem_high = wxConfigBase::Get()->Read(wxT(
"/ImageCache/UpperBoundHigh"), (
long) 0);
635 mem = ((
unsigned long long) mem_high << 32) + mem_low;
640 ImageCache::getInstance().SetUpperLimit(mem);
642 ImageCache::getInstance().SetUpperLimit(wxConfigBase::Get()->Read(wxT(
"/ImageCache/UpperBound"),
HUGIN_IMGCACHE_UPPERBOUND));
652 SetAutoLayout(
false);
665 freopen(
"c:\\hugin_stdout.txt",
"w", stdout);
666 freopen(
"c:\\hugin_stderr.txt",
"w", stderr);
672 long guiLevel=config->Read(wxT(
"/GuiLevel"),(
long)0);
673 guiLevel = std::max<long>(0, std::min<long>(2, guiLevel));
696 for (
int i = 0; i < 9; ++i)
712 Bind(wxEVT_MENU, &MainFrame::OnPythonScript,
this, XRCID(
"action_python_script"));
762 ImageCache::getInstance().setProgressDisplay(NULL);
763 delete & ImageCache::getInstance();
771 wxConfigBase* config = wxConfigBase::Get();
778 config->Write(wxT(
"/GuiLevel"),(
long)
m_guiLevel);
798 if (!(lastCommand ==
"remove control point" || lastCommand ==
"remove control points"))
807 wxToolBar* theToolBar = GetToolBar();
808 wxMenuBar* theMenuBar = GetMenuBar();
810 theMenuBar->Enable (XRCID(
"ID_EDITUNDO"), can_undo);
811 theToolBar->EnableTool(XRCID(
"ID_EDITUNDO"), can_undo);
813 theMenuBar->Enable (XRCID(
"ID_EDITREDO"), can_redo);
814 theToolBar->EnableTool(XRCID(
"ID_EDITREDO"), can_redo);
859 assert(&
pano == &panorama);
871 wxString messageString;
875 messageString = _(
"Save changes to the project file before opening another project?");
878 messageString = _(
"Save changes to the project file before starting a new project?");
882 messageString = _(
"Save changes to the project file before closing?");
885 wxMessageDialog message(wxGetActiveWindow(), messageString,
891 wxICON_EXCLAMATION | wxYES_NO | (cancelable? (wxCANCEL):0));
895 message.SetExtendedMessage(_(
"If you load another project without saving, your changes since last save will be discarded."));
898 message.SetExtendedMessage(_(
"If you start a new project without saving, your changes since last save will be discarded."));
902 message.SetExtendedMessage(_(
"If you close without saving, your changes since your last save will be discarded."));
905 #if defined __WXMAC__ || defined __WXMSW__
907 message.SetYesNoLabels(wxID_SAVE, _(
"Don't Save"));
910 message.SetYesNoLabels(wxID_SAVE, _(
"Close without saving"));
912 int answer = message.ShowModal();
916 wxCommandEvent dummy;
941 wxLogError(_(
"forced close"));
970 ImageCache::getInstance().flush();
985 DEBUG_DEBUG(
"stripping " << path <<
" from image filenames");
989 SetStatusText(wxString::Format(_(
"saved project %s"),
m_filename.c_str()),0);
994 gl_preview_frame->SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Creator"));
996 SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Panorama editor"));
1000 SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Creator"));
1005 }
catch (std::exception & e) {
1006 wxString err(e.what(), wxConvLocal);
1007 wxMessageBox(wxString::Format(_(
"Could not save project file \"%s\".\nMaybe the file or the folder is read-only.\n\n(Error code: %s)"),
m_filename.c_str(),err.c_str()),_(
"Error"),wxOK|wxICON_ERROR);
1014 wxFileName scriptName;
1023 scriptName.Normalize(wxPATH_NORM_ABSOLUTE | wxPATH_NORM_DOTS | wxPATH_NORM_TILDE | wxPATH_NORM_SHORTCUT);
1024 wxFileDialog dlg(wxGetActiveWindow(),
1025 _(
"Save project file"),
1026 scriptName.GetPath(), scriptName.GetFullName(),
1027 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1028 wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
1029 if (dlg.ShowModal() == wxID_OK) {
1030 wxConfig::Get()->Write(wxT(
"/actualPath"), dlg.GetDirectory());
1031 wxString fn = dlg.GetPath();
1032 if (fn.Right(4).CmpNoCase(wxT(
".pto"))!=0)
1034 fn.Append(wxT(
".pto"));
1035 if (wxFile::Exists(fn)) {
1036 int d = wxMessageBox(wxString::Format(_(
"File %s exists. Overwrite?"), fn.c_str()),
1037 _(
"Save project"), wxYES_NO | wxICON_QUESTION);
1056 wxFileName scriptNameFN(scriptName);
1057 wxString fn = scriptNameFN.GetName() + wxT(
".txt");
1058 wxFileDialog dlg(wxGetActiveWindow(),
1059 _(
"Save PTmender script file"),
1060 wxConfigBase::Get()->Read(wxT(
"/actualPath"),wxT(
"")), fn,
1061 _(
"PTmender files (*.txt)|*.txt"),
1062 wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
1063 if (dlg.ShowModal() == wxID_OK) {
1064 wxString fname = dlg.GetPath();
1066 wxFileName scriptName = fname;
1086 SetStatusText( _(
"Open project: ") + filename);
1088 wxFileName fname(filename);
1089 wxString path = fname.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
1090 if (fname.IsOk() && fname.FileExists())
1100 wxMessageBox(wxString::Format(_(
"Could not load project file \"%s\".\nIt is not a valid pto file."), filename), _(
"Error"), wxOK | wxICON_ERROR);
1116 SetStatusText(_(
"Project opened"));
1117 m_mruFiles.AddFileToHistory(fname.GetFullPath());
1122 gl_preview_frame->SetTitle(fname.GetName() + wxT(
".") + fname.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Stitcher"));
1124 SetTitle(fname.GetName() + wxT(
".") + fname.GetExt() + wxT(
" - ") + _(
"Panorama editor"));
1128 SetTitle(fname.GetName() + wxT(
".") + fname.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Stitcher"));
1133 SetStatusText(_(
"Loading canceled"));
1141 SetTitle(_(
"Panorama editor"));
1145 SetTitle(_(
"Hugin - Panorama Stitcher"));
1148 if (! (fname.GetExt() == wxT(
"pto"))) {
1155 wxConfigBase* config = wxConfigBase::Get();
1156 config->Write(wxT(
"/actualPath"), path);
1158 SetStatusText( _(
"Error opening project: ") + filename);
1164 wxCommandEvent dummy;
1174 void MainFrame::MacOnOpenFile(
const wxString & filename)
1178 ImageCache::getInstance().flush();
1190 wxConfigBase* config = wxConfigBase::Get();
1192 wxString defaultdir = config->Read(wxT(
"/actualPath"),wxT(
""));
1193 wxFileDialog dlg(wxGetActiveWindow(),
1194 _(
"Open project file"),
1195 defaultdir, wxT(
""),
1196 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1197 wxFD_OPEN, wxDefaultPosition);
1198 dlg.SetDirectory(defaultdir);
1199 if (dlg.ShowModal() == wxID_OK)
1201 wxString filename = dlg.GetPath();
1204 if(wxMessageBox(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()),
1210 wxYES_NO | wxICON_QUESTION)==wxYES)
1212 wxArrayString filenameArray;
1213 filenameArray.Add(filename);
1221 ImageCache::getInstance().flush();
1230 SetStatusText( _(
"Open project: cancel"));
1239 ImageCache::getInstance().flush();
1241 wxConfigBase* config = wxConfigBase::Get();
1244 if (dialog.ShowModal() == wxID_OK)
1249 config->Write(
"/actualPath", dialog.GetSelectedPath());
1262 ImageCache::getInstance().flush();
1269 SetTitle(_(
"Panorama editor"));
1273 SetTitle(_(
"Hugin - Panorama Stitcher"));
1276 wxCommandEvent dummy;
1300 wxArrayString invalidFiles;
1301 for(
unsigned int i=0;i<filenameArray.GetCount(); i++)
1305 invalidFiles.Add(filenameArray[i]);
1308 if(!invalidFiles.empty())
1314 std::vector<std::string> filesv;
1315 for (
unsigned int i=0; i< filenameArray.GetCount(); i++) {
1320 if (!filesv.empty()) {
1344 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_MASK"))
1347 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_CP_EDITOR"))
1350 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_OPTIMIZER"))
1353 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_OPTIMIZER_PHOTOMETRIC"))
1365 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_PANORAMA"))
1390 if (wxFileExists(e.GetString()))
1393 wxMessageBox(wxString::Format(_(
"Could not load image \"%s\".\nThis file is not a valid image.\nThis file will be removed from the project."), e.GetString()),
1399 wxOK | wxICON_ERROR);
1404 wxMessageBox(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()),
1410 wxOK | wxICON_ERROR);
1419 imagesToRemove.insert(i);
1422 if (!imagesToRemove.empty())
1474 DisplayHelp(wxT(
"Hugin_Keyboard_shortcuts.html"));
1485 if (section.IsEmpty())
1498 bool bShowAtStartup;
1503 wxConfigBase * config = wxConfigBase::Get();
1504 nValue = config->Read(wxT(
"/MainFrame/ShowStartTip"),1l);
1508 strFile =
GetXRCPath() + wxT(
"data/tips.txt");
1510 DEBUG_INFO(
"Reading tips from " << strFile.mb_str(wxConvLocal));
1512 bShowAtStartup = wxShowTip(wxGetActiveWindow(), tipProvider, (nValue ?
true :
false));
1515 nValue = (bShowAtStartup ? tipProvider->GetCurrentTip() : 0);
1517 config->Write(wxT(
"/MainFrame/ShowStartTip"), nValue);
1526 pref_dlg.ShowModal();
1528 wxConfigBase* cfg=wxConfigBase::Get();
1529 #if defined __WXMSW__
1532 unsigned long mem_high = cfg->Read(wxT(
"/ImageCache/UpperBoundHigh"), (
long) 0);
1535 mem = ((
unsigned long long) mem_high << 32) + mem_low;
1541 ImageCache::getInstance().SetUpperLimit(mem);
1563 wxCommandEvent dummy;
1573 #if defined __WXMSW__ || defined __WXMAC__
1580 #if defined __WXMSW__
1587 #elif defined __WXGTK__
1616 wxCommandEvent dummy;
1628 wxMenuBar* menubar = GetMenuBar();
1631 menubar->Check(XRCID(
"action_optimize_only_active"), onlyActive);
1646 m_optIgnoreLineCp = GetMenuBar()->IsChecked(XRCID(
"action_optimize_ignore_line_cp"));
1655 wxMenuBar* menubar = GetMenuBar();
1658 menubar->Check(XRCID(
"action_optimize_ignore_line_cp"), ignoreLineCP);
1671 wxCommandEvent dummy;
1678 wxCommandEvent cmdEvt(wxEVT_COMMAND_BUTTON_CLICKED,XRCID(
"pano_button_stitch"));
1679 pano_panel->GetEventHandler()->AddPendingEvent(cmdEvt);
1703 wxConfigBase* config = wxConfigBase::Get();
1705 wxString defaultdir = config->Read(wxT(
"/actualPath"),wxT(
""));
1706 wxFileDialog dlg(wxGetActiveWindow(),
1707 _(
"Open project file"),
1708 defaultdir, wxT(
""),
1709 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1710 wxFD_OPEN, wxDefaultPosition);
1711 dlg.SetDirectory(defaultdir);
1712 if (dlg.ShowModal() == wxID_OK)
1714 wxString filename = dlg.GetPath();
1715 wxFileName fname(filename);
1716 wxString path = fname.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
1717 if (fname.IsOk() && fname.FileExists())
1730 m_mruFiles.AddFileToHistory(fname.GetFullPath());
1734 wxCommandEvent dummy;
1740 wxMessageBox(wxString::Format(_(
"Could not read project file %s."),fname.GetFullPath().c_str()),_(
"Error"),wxOK|wxICON_ERROR);
1748 wxString currentDir = wxConfigBase::Get()->Read(wxT(
"/actualPath"), wxT(
""));
1749 wxFileDialog dlg(wxGetActiveWindow(), _(
"Open Papywizard xml file"),
1750 currentDir, wxT(
""), _(
"Papywizard xml files (*.xml)|*.xml|All files (*)|*"),
1751 wxFD_OPEN, wxDefaultPosition);
1752 dlg.SetDirectory(currentDir);
1753 if (dlg.ShowModal() == wxID_OK)
1755 wxConfigBase::Get()->Write(wxT(
"/actualPath"), dlg.GetDirectory());
1763 wxConfigBase* config = wxConfigBase::Get();
1765 wxFileDialog dlg(wxGetActiveWindow(),
1766 _(
"Choose template project"),
1767 config->Read(wxT(
"/templatePath"),wxT(
"")), wxT(
""),
1768 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1769 wxFD_OPEN, wxDefaultPosition);
1770 dlg.SetDirectory(wxConfigBase::Get()->Read(wxT(
"/templatePath"),wxT(
"")));
1771 if (dlg.ShowModal() == wxID_OK) {
1772 wxString filename = dlg.GetPath();
1773 wxConfig::Get()->Write(wxT(
"/templatePath"), dlg.GetDirectory());
1785 #if defined __WXMAC__ && defined MAC_SELF_CONTAINED_BUNDLE
1789 FSRef actuallyLaunched;
1791 FSRef documentArray[1];
1792 LSLaunchFSRefSpec launchSpec;
1795 err = LSFindApplicationForInfo(kLSUnknownCreator,
1796 CFSTR(
"net.sourceforge.hugin.PTBatcherGUI"),
1802 wxMessageBox(wxString::Format(_(
"External program %s not found in the bundle, reverting to system path"), wxT(
"open")), _(
"Error"));
1804 wxExecute(_T(
"open -b net.sourceforge.hugin.PTBatcherGUI"));
1807 wxExecute(_T(
"open -b net.sourceforge.hugin.PTBatcherGUI"));
1810 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
1811 wxExecute(exePath.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + _T(
"PTBatcherGUI"));
1823 std::set<unsigned int> unoptimized;
1824 for (
unsigned int i=0; i < cps.size(); i++) {
1826 unoptimized.insert(i);
1829 unsigned int nGood=0;
1830 unsigned int nBad=0;
1832 wxConfigBase *cfg = wxConfigBase::Get();
1842 ProgressReporterDialog progress(unoptimized.size(), _(
"Fine-tuning all points"), _(
"Fine-tuning"), wxGetActiveWindow());
1844 ImageCache & imgCache = ImageCache::getInstance();
1850 std::set<unsigned int>::iterator it=unoptimized.begin();
1852 imgCache.softFlush();
1854 while (it != unoptimized.end()) {
1855 if (cps[*it].image1Nr == imgNr || cps[*it].image2Nr == imgNr) {
1856 if (!progress.updateDisplayValue())
1863 wxImage wxSearchImg;
1865 pano.
getImage(cps[*it].image2Nr).getFilename())->get8BitImage();
1868 pano.
getImage(cps[*it].image1Nr).getFilename())->get8BitImage();
1875 pano.
getImage(cps[*it].image2Nr), *searchImg, roundP2, sWidth);
1883 if (res.
maxi < corrThresh || res.
curv.
x < curvThresh || res.
curv.
y < curvThresh ||
1888 if (res.
maxi >= corrThresh) {
1891 cps[*it].error = res.
maxi;
1900 cps[*it].error = res.
maxi;
1906 cps[*it].error = 1.0;
1908 unsigned int rm = *it;
1910 unoptimized.erase(rm);
1919 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"),
1920 nGood, nBad, corrThresh);
1921 wxMessageBox(result, _(
"Fine-tune result"), wxOK);
1938 wxMessageBox(wxString::Format(_(
"Removed %lu control points"), static_cast<unsigned long>(cps.size())),
1939 _(
"Removing control points in masks"),wxOK|wxICON_INFORMATION);
1944 void MainFrame::OnPythonScript(wxCommandEvent & e)
1947 wxFileDialog dlg(wxGetActiveWindow(),
1948 _(
"Select python script"),
1949 wxConfigBase::Get()->Read(wxT(
"/lensPath"),wxT(
"")), wxT(
""),
1950 _(
"Python script (*.py)|*.py|All files (*.*)|*.*"),
1951 wxFD_OPEN, wxDefaultPosition);
1952 dlg.SetDirectory(wxConfigBase::Get()->Read(wxT(
"/pythonScriptPath"),wxT(
"")));
1954 if (dlg.ShowModal() == wxID_OK)
1956 wxString filename = dlg.GetPath();
1957 wxConfig::Get()->Write(wxT(
"/pythonScriptPath"), dlg.GetDirectory());
1960 new PanoCommand::PythonScriptPanoCmd(
pano,scriptfile)
1965 void MainFrame::OnPlugin(wxCommandEvent & e)
1967 wxFileName file=m_plugins[e.GetId()];
1968 if(file.FileExists())
1972 new PanoCommand::PythonScriptPanoCmd(
pano,scriptfile)
1977 wxMessageBox(wxString::Format(wxT(
"Python-Script %s not found.\nStopping processing."),file.GetFullPath().c_str()),_(
"Warning"),wxOK|wxICON_INFORMATION);
2033 if (switchToCropMode)
2065 msg = wxGetTranslation(wxString(
m_message.c_str(), wxConvLocal));
2068 msg.Append(wxT(
" "));
2072 GetStatusBar()->SetStatusText(msg, 0);
2081 wxToolBar* theToolBar = GetToolBar();
2082 theToolBar->EnableTool(XRCID(
"action_optimize"), option);
2083 theToolBar->EnableTool(XRCID(
"ID_SHOW_PREVIEW_FRAME"), option);
2085 wxMenuBar* theMenuBar = GetMenuBar();
2086 theMenuBar->Enable(XRCID(
"action_optimize"), option);
2087 theMenuBar->Enable(XRCID(
"action_finetune_all_cp"), option);
2088 theMenuBar->Enable(XRCID(
"action_remove_cp_in_masks"), option);
2089 theMenuBar->Enable(XRCID(
"ID_SHOW_PREVIEW_FRAME"), option);
2090 theMenuBar->Enable(XRCID(
"action_stitch"), option);
2091 theMenuBar->Enable(XRCID(
"action_stitch_userdefined"), option);
2100 theMenuBar->Enable(XRCID(
"action_assistant"), option);
2101 theMenuBar->Enable(XRCID(
"action_batch_assistant"), option);
2110 wxSize sz = this->GetSize();
2111 wxSize csz = this->GetClientSize();
2112 wxSize vsz = this->GetVirtualSize();
2114 " client: "<< csz.x <<
"," << csz.y <<
2115 " virtual: "<< vsz.x <<
"," << vsz.y);
2149 return wxGetApp().GetDataPath();
2176 size_t index = e.GetId() - wxID_FILE1;
2177 wxString f(
m_mruFiles.GetHistoryFile(index));
2181 if (fn.FileExists())
2187 ImageCache::getInstance().flush();
2195 wxMessageBox(wxString::Format(_(
"File \"%s\" not found.\nMaybe file was renamed, moved or deleted."),f.c_str()),
2196 _(
"Error!"),wxOK | wxICON_INFORMATION );
2203 ShowFullScreen(!IsFullScreen(), wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION);
2206 GetToolBar()->Show(
true);
2221 if (! wxFile::Exists(wxstrModelFileName) ) {
2222 wxMessageBox(wxString::Format(_(
"Celeste model expected in %s not found, Hugin needs to be properly installed."),wxstrModelFileName.c_str()), _(
"Fatal Error"));
2227 wxMessageBox(wxString::Format(_(
"Could not load Celeste model file %s"),wxstrModelFileName.c_str()),_(
"Error"));
2248 bool needsUpdateOptimizerVar=
false;
2250 for(
size_t i=0; i<optVec.size(); i++)
2252 bool hasTrX=optVec[i].erase(
"TrX")>0;
2253 bool hasTrY=optVec[i].erase(
"TrY")>0;
2254 bool hasTrZ=optVec[i].erase(
"TrZ")>0;
2255 bool hasTpy=optVec[i].erase(
"Tpy")>0;
2256 bool hasTpp=optVec[i].erase(
"Tpp")>0;
2257 bool hasg=optVec[i].erase(
"g")>0;
2258 bool hast=optVec[i].erase(
"t")>0;
2259 needsUpdateOptimizerVar=needsUpdateOptimizerVar || hasTrX || hasTrY || hasTrZ || hasTpy || hasTpp || hasg || hast;
2261 if(needsUpdateOptimizerVar)
2270 bool needsUpdateOptimizerVar=
false;
2272 for(
size_t i=0; i<optVec.size(); i++)
2274 bool hasVx=optVec[i].erase(
"Vx")>0;
2275 bool hasVy=optVec[i].erase(
"Vy")>0;
2276 needsUpdateOptimizerVar=needsUpdateOptimizerVar || hasVx || hasVy;
2278 if(needsUpdateOptimizerVar)
2297 GetMenuBar()->FindItem(XRCID(
"action_gui_simple"))->Check();
2300 GetMenuBar()->FindItem(XRCID(
"action_gui_advanced"))->Check();
2303 GetMenuBar()->FindItem(XRCID(
"action_gui_expert"))->Check();
2310 wxCommandEvent dummy;
2314 GetMenuBar()->Remove(0);
2319 SetTitle(_(
"Panorama editor"));
2324 gl_preview_frame->SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Stitcher"));
2325 SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Panorama editor"));
2331 wxGetApp().SetTopWindow(
this);
2332 GetMenuBar()->Remove(0);
2336 SetTitle(_(
"Hugin - Panorama Stitcher"));
2341 SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Stitcher"));
2361 wxMessageBox(_(
"Can't switch to simple interface. The project is using stacks and/or vignetting center shift.\nThese features are not supported in simple interface."),
2367 wxOK | wxICON_INFORMATION);
2371 wxMessageBox(_(
"Can't switch to simple interface. The project is using translation or shear parameters.\nThese parameters are not supported in simple interface."),
2377 wxOK | wxICON_INFORMATION);
2392 wxMessageBox(_(
"Can't switch to advanced interface. The project is using translation or shear parameters.\nThese parameters are not supported in advanced interface."),
2398 wxOK | wxICON_INFORMATION);
2410 GetMenuBar()->Enable(XRCID(
"ID_SHOW_GL_PREVIEW_FRAME"),
false);
2411 GetMenuBar()->Enable(XRCID(
"action_gui_simple"),
false);
2412 GetToolBar()->EnableTool(XRCID(
"ID_SHOW_GL_PREVIEW_FRAME"),
false);
2418 wxString tempDir= wxConfig::Get()->Read(wxT(
"tempDir"),wxT(
""));
2419 if(!tempDir.IsEmpty())
2421 if(tempDir.Last()!=wxFileName::GetPathSeparator())
2423 tempDir.Append(wxFileName::GetPathSeparator());
2426 wxFileName scriptFileName(wxFileName::CreateTempFileName(tempDir+wxT(
"ha")));
2431 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
2432 wxArrayString tempfiles;
2434 if (userdefinedAssistant.IsEmpty())
2440 std::stringstream errors;
2442 if (commands->empty())
2444 wxMessageBox(_(
"The assistant queue is empty. This indicates an error in the user defined assistant file.") +
"\n\n" + wxString(errors.str()),
2445 _(
"Error"), wxOK | wxICON_ERROR, mainWin);
2447 wxRemoveFile(scriptFileName.GetFullPath());
2460 wxRemoveFile(scriptFileName.GetFullPath());
2461 if (!tempfiles.IsEmpty())
2463 for (
auto& f : tempfiles)
2478 if (userdefinedAssistant.IsEmpty())
2482 wxMessageBox(_(
"The assistant could not find vertical lines. Please add vertical lines in the panorama editor and optimize project manually."),
2483 _(
"Warning"), wxOK | wxICON_INFORMATION, mainWin);
2490 if (comps.size() > 1)
2493 unsigned i1 = *(comps[0].rbegin());
2494 unsigned i2 = *(comps[1].begin());
2497 wxMessageBox(wxString::Format(_(
"Warning %d unconnected image groups found:"), static_cast<int>(comps.size())) +
Components2Str(comps) + wxT(
"\n")
2498 + _(
"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);
2501 wxMessageBox(_(
"The assistant did not complete successfully. Please check the resulting project file."),
2502 _(
"Warning"), wxOK | wxICON_INFORMATION, mainWin);
2507 wxMessageBox(_(
"The assistant did not complete successfully. Please check the resulting project file."),
2508 _(
"Warning"), wxOK | wxICON_INFORMATION, mainWin);
2533 wxCommandEvent dummy;
2538 #if defined __WXMAC__ && defined MAC_SELF_CONTAINED_BUNDLE
2542 FSRef actuallyLaunched;
2544 FSRef documentArray[1];
2545 LSLaunchFSRefSpec launchSpec;
2548 err = LSFindApplicationForInfo(kLSUnknownCreator,
2549 CFSTR(
"net.sourceforge.hugin.PTBatcherGUI"),
2556 wxMessageBox(wxString::Format(_(
"External program %s not found in the bundle, reverting to system path"), wxT(
"open")), _(
"Error"));
2562 wxCharBuffer projectFilebuffer=projectFile.ToUTF8();
2564 err = FSPathMakeRef((
unsigned char*) projectFilebuffer.data(), &documentArray[0], &isDir);
2565 if (err != noErr || isDir)
2568 wxMessageBox(wxString::Format(_(
"Project file not found"), wxT(
"open")), _(
"Error"));
2571 launchSpec.appRef = &appRef;
2572 launchSpec.numDocs =
sizeof(documentArray)/
sizeof(documentArray[0]);
2573 launchSpec.itemRefs = documentArray;
2574 launchSpec.passThruParams = NULL;
2575 launchSpec.launchFlags = kLSLaunchDontAddToRecents + kLSLaunchDontSwitch;
2576 launchSpec.asyncRefCon = NULL;
2578 err = LSOpenFromRefSpec(&launchSpec, &actuallyLaunched);
2579 if (err != noErr && err != kLSLaunchInProgressErr)
2583 wxMessageBox(wxString::Format(_(
"Can't launch PTBatcherGui"), wxT(
"open")), _(
"Error"));
2588 if (FSCompareFSRefs(&appRef, &actuallyLaunched) != noErr)
2591 wxMessageBox(wxString::Format(_(
"Launched incorrect programme"), wxT(
"open")), _(
"Error"));
2595 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
2596 wxExecute(exePath.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + wxT(
"PTBatcherGUI -a ")+
hugin_utils::wxQuoteFilename(projectFile));
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
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
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
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 StoreFramePosition(wxTopLevelWindow *frame, const wxString &basename)
Store window size and position in configfile/registry.
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)
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...