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(wxT(
"pto")) == 0 ||
127 file.GetExt().CmpNoCase(wxT(
"ptp")) == 0 ||
128 file.GetExt().CmpNoCase(wxT(
"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)
204 wxMessageDialog message(mf, _(
"You selected only one raw file. This is not recommended.\nAll raw files should be converted at once."),
210 wxICON_EXCLAMATION | wxOK | wxCANCEL);
211 message.SetOKLabel(_(
"Convert anyway."));
212 if (message.ShowModal() != wxID_OK)
222 if (dlg.ShowModal() == wxID_OK)
241 : cp_frame(0), pano(pano)
246 bool disableOpenGL=
false;
247 if(wxGetKeyState(WXK_COMMAND))
250 wxXmlResource::Get()->LoadDialog(&dlg, NULL, wxT(
"disable_opengl_dlg"));
251 long noOpenGL=wxConfigBase::Get()->Read(wxT(
"DisableOpenGL"), 0l);
254 XRCCTRL(dlg,
"disable_dont_ask_checkbox", wxCheckBox)->SetValue(
true);
256 if(dlg.ShowModal()==wxID_OK)
258 if(XRCCTRL(dlg,
"disable_dont_ask_checkbox", wxCheckBox)->IsChecked())
260 wxConfigBase::Get()->Write(wxT(
"DisableOpenGL"), 1l);
264 wxConfigBase::Get()->Write(wxT(
"DisableOpenGL"), 0l);
270 wxConfigBase::Get()->Write(wxT(
"DisableOpenGL"), 0l);
275 long noOpenGL=wxConfigBase::Get()->Read(wxT(
"DisableOpenGL"), 0l);
276 disableOpenGL=(noOpenGL==1);
288 dc.SelectObject(bitmap);
290 wxFont font(9, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
292 wxFont font(8, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
295 dc.SetTextForeground(*wxBLACK);
296 dc.SetTextBackground(*wxWHITE);
300 dc.GetTextExtent(version, &tw, &th);
302 dc.DrawText(version, bitmap.GetWidth() - tw - 3, bitmap.GetHeight() - th - 3);
303 dc.SelectObject(wxNullBitmap);
305 bitmap.SetScaleFactor(GetDPIScaleFactor());
308 wxLogFatalError(_(
"Fatal installation error\nThe file data/splash.png was not found at:") +
huginApp::Get()->
GetXRCPath());
320 wxXmlResource::Get()->LoadFrame(
this, parent, wxT(
"main_frame"));
325 wxApp::s_macAboutMenuItemId = XRCID(
"action_show_about");
326 wxApp::s_macPreferencesMenuItemId = XRCID(
"action_show_prefs");
327 wxApp::s_macExitMenuItemId = XRCID(
"action_exit_hugin");
328 wxApp::s_macHelpMenuTitleName = _(
"&Help");
330 wxMenuBar* mainMenu=wxXmlResource::Get()->LoadMenuBar(
this, wxT(
"main_menubar"));
334 SetMenuBar(mainMenu);
335 m_optOnlyActiveImages = (wxConfigBase::Get()->Read(wxT(
"/OptimizePanel/OnlyActiveImages"), 1l) != 0);
341 wxMenuBar* menubar=GetMenuBar();
343 wxMenu *pluginMenu=
new wxMenu();
349 bool cont = dir.GetFirst(&filename, wxT(
"*.py"), wxDIR_FILES | wxDIR_HIDDEN);
353 wxFileName file(dir.GetName(), filename);
358 items.push_back(item);
360 cont = dir.GetNext(&filename);
365 for (PluginItems::const_iterator it = items.begin(); it != items.end(); ++it)
368 int categoryID = pluginMenu->FindItem(item.
GetCategory());
369 wxMenu* categoryMenu;
370 if (categoryID == wxNOT_FOUND)
372 categoryMenu =
new wxMenu();
373 pluginMenu->AppendSubMenu(categoryMenu, item.
GetCategory());
377 categoryMenu = pluginMenu->FindItem(categoryID)->GetSubMenu();
381 Bind(wxEVT_MENU, &MainFrame::OnPlugin,
this, pluginID);
385 if (pluginMenu->GetMenuItemCount() > 0)
387 menubar->Insert(menubar->GetMenuCount() - 2, pluginMenu, _(
"&Actions"));
391 GetMenuBar()->Enable(XRCID(
"action_python_script"),
false);
395 SetToolBar(wxXmlResource::Get()->LoadToolBar(
this, wxT(
"main_toolbar")));
411 m_notebook = XRCCTRL((*
this),
"controls_notebook", wxNotebook);
444 wxConfigBase * config=wxConfigBase::Get();
464 wxDir::GetAllFiles(
GetDataPath()+
"output", &files, wxT(
"*.executor"), wxDIR_FILES | wxDIR_HIDDEN | wxDIR_NO_FOLLOW);
465 const size_t nrAllUserSequences = files.size();
467 if (!files.IsEmpty())
471 int outputMenuId=mainMenu->FindMenu(_(
"&Output"));
472 if (outputMenuId != wxNOT_FOUND)
474 wxMenu* outputSequencesMenu =
new wxMenu;
476 for (
auto file : files)
478 if (i > 0 && i == nrAllUserSequences && outputSequencesMenu->GetMenuItemCount() > 0)
480 outputSequencesMenu->AppendSeparator();
488 wxFileInputStream inputStream(file);
489 if (inputStream.IsOk())
492 wxFileConfig executorFile(inputStream);
497 help = wxString::Format(_(
"User defined sequence: %s"), file);
502 outputSequencesMenu->Append(outputId, desc, help);
515 if ((outputSequencesMenu->GetMenuItemCount() == 1 && !(outputSequencesMenu->FindItemByPosition(0)->IsSeparator())) ||
516 outputSequencesMenu->GetMenuItemCount() > 1)
518 m_outputUserMenu = mainMenu->GetMenu(outputMenuId)->AppendSubMenu(outputSequencesMenu, _(
"User defined output sequences"));
522 delete outputSequencesMenu;
531 wxDir::GetAllFiles(
GetDataPath() +
"assistant", &files, wxT(
"*.assistant"), wxDIR_FILES | wxDIR_HIDDEN | wxDIR_NO_FOLLOW);
532 const size_t nrAllUserSequences = files.size();
534 if (!files.IsEmpty())
538 const int editMenuId = mainMenu->FindMenu(_(
"&Edit"));
539 if (editMenuId != wxNOT_FOUND)
541 wxMenu* userAssistantMenu =
new wxMenu;
543 for (
auto file : files)
545 if (i > 0 && i == nrAllUserSequences && userAssistantMenu->GetMenuItemCount() > 0)
547 userAssistantMenu->AppendSeparator();
554 wxFileInputStream inputStream(file);
555 if (inputStream.IsOk())
558 wxFileConfig assistantFile(inputStream);
561 help = help.Trim(
true).Trim(
false);
564 help = wxString::Format(_(
"User defined assistant: %s"), file);
569 userAssistantMenu->Append(assistantId, desc, help);
582 if (userAssistantMenu->GetMenuItemCount() > 0)
584 m_assistantUserMenu = mainMenu->GetMenu(editMenuId)->Insert(5, wxID_ANY, _(
"User defined assistant"), userAssistantMenu);
588 delete userAssistantMenu;
597 wxIconBundle myIcons(
GetXRCPath() + wxT(
"data/hugin.ico"), wxBITMAP_TYPE_ICO);
600 wxIcon myIcon(
GetXRCPath() + wxT(
"data/hugin.png"),wxBITMAP_TYPE_PNG);
611 const int fields (2);
612 CreateStatusBar(fields);
613 int widths[fields] = {-1, 85};
614 SetStatusWidths( fields, &widths[0]);
615 SetStatusText(_(
"Started"), 0);
621 #if defined __WXMAC__ || defined __WXMSW__
623 SetSizeHints(900, 675);
626 SetSizeHints(780, 455);
630 ImageCache::getInstance().setProgressDisplay(
this);
631 #if defined __WXMSW__
634 unsigned long mem_high = wxConfigBase::Get()->Read(wxT(
"/ImageCache/UpperBoundHigh"), (
long) 0);
636 mem = ((
unsigned long long) mem_high << 32) + mem_low;
641 ImageCache::getInstance().SetUpperLimit(mem);
643 ImageCache::getInstance().SetUpperLimit(wxConfigBase::Get()->Read(wxT(
"/ImageCache/UpperBound"),
HUGIN_IMGCACHE_UPPERBOUND));
653 SetAutoLayout(
false);
666 freopen(
"c:\\hugin_stdout.txt",
"w", stdout);
667 freopen(
"c:\\hugin_stderr.txt",
"w", stderr);
673 long guiLevel=config->Read(wxT(
"/GuiLevel"),(
long)0);
674 guiLevel = std::max<long>(0, std::min<long>(2, guiLevel));
697 for (
int i = 0; i < 9; ++i)
713 Bind(wxEVT_MENU, &MainFrame::OnPythonScript,
this, XRCID(
"action_python_script"));
763 ImageCache::getInstance().setProgressDisplay(NULL);
764 delete & ImageCache::getInstance();
772 wxConfigBase* config = wxConfigBase::Get();
779 config->Write(wxT(
"/GuiLevel"),(
long)
m_guiLevel);
799 if (!(lastCommand ==
"remove control point" || lastCommand ==
"remove control points"))
808 wxToolBar* theToolBar = GetToolBar();
809 wxMenuBar* theMenuBar = GetMenuBar();
811 theMenuBar->Enable (XRCID(
"ID_EDITUNDO"), can_undo);
812 theToolBar->EnableTool(XRCID(
"ID_EDITUNDO"), can_undo);
814 theMenuBar->Enable (XRCID(
"ID_EDITREDO"), can_redo);
815 theToolBar->EnableTool(XRCID(
"ID_EDITREDO"), can_redo);
860 assert(&
pano == &panorama);
872 wxString messageString;
876 messageString = _(
"Save changes to the project file before opening another project?");
879 messageString = _(
"Save changes to the project file before starting a new project?");
883 messageString = _(
"Save changes to the project file before closing?");
886 wxMessageDialog message(wxGetActiveWindow(), messageString,
892 wxICON_EXCLAMATION | wxYES_NO | (cancelable? (wxCANCEL):0));
896 message.SetExtendedMessage(_(
"If you load another project without saving, your changes since last save will be discarded."));
899 message.SetExtendedMessage(_(
"If you start a new project without saving, your changes since last save will be discarded."));
903 message.SetExtendedMessage(_(
"If you close without saving, your changes since your last save will be discarded."));
906 #if defined __WXMAC__ || defined __WXMSW__
908 message.SetYesNoLabels(wxID_SAVE, _(
"Do&n't Save"));
911 message.SetYesNoLabels(wxID_SAVE, _(
"&Close without saving"));
913 int answer = message.ShowModal();
917 wxCommandEvent dummy;
942 wxLogError(_(
"forced close"));
971 ImageCache::getInstance().flush();
986 DEBUG_DEBUG(
"stripping " << path <<
" from image filenames");
990 SetStatusText(wxString::Format(_(
"saved project %s"),
m_filename.c_str()),0);
995 gl_preview_frame->SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Creator"));
997 SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Panorama editor"));
1001 SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Creator"));
1006 }
catch (std::exception & e) {
1007 wxString err(e.what(), wxConvLocal);
1008 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);
1015 wxFileName scriptName;
1024 scriptName.Normalize(wxPATH_NORM_ABSOLUTE | wxPATH_NORM_DOTS | wxPATH_NORM_TILDE | wxPATH_NORM_SHORTCUT);
1025 wxFileDialog dlg(wxGetActiveWindow(),
1026 _(
"Save project file"),
1027 scriptName.GetPath(), scriptName.GetFullName(),
1028 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1029 wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
1030 if (dlg.ShowModal() == wxID_OK) {
1031 wxConfig::Get()->Write(wxT(
"/actualPath"), dlg.GetDirectory());
1032 wxString fn = dlg.GetPath();
1033 if (fn.Right(4).CmpNoCase(wxT(
".pto"))!=0)
1035 fn.Append(wxT(
".pto"));
1036 if (wxFile::Exists(fn)) {
1037 int d = wxMessageBox(wxString::Format(_(
"File %s exists. Overwrite?"), fn.c_str()),
1038 _(
"Save project"), wxYES_NO | wxICON_QUESTION);
1057 wxFileName scriptNameFN(scriptName);
1058 wxString fn = scriptNameFN.GetName() + wxT(
".txt");
1059 wxFileDialog dlg(wxGetActiveWindow(),
1060 _(
"Save PTmender script file"),
1061 wxConfigBase::Get()->Read(wxT(
"/actualPath"),wxT(
"")), fn,
1062 _(
"PTmender files (*.txt)|*.txt"),
1063 wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
1064 if (dlg.ShowModal() == wxID_OK) {
1065 wxString fname = dlg.GetPath();
1067 wxFileName scriptName = fname;
1087 SetStatusText( _(
"Open project: ") + filename);
1089 wxFileName fname(filename);
1090 wxString path = fname.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
1091 if (fname.IsOk() && fname.FileExists())
1101 wxMessageBox(wxString::Format(_(
"Could not load project file \"%s\".\nIt is not a valid pto file."), filename), _(
"Error"), wxOK | wxICON_ERROR);
1117 SetStatusText(_(
"Project opened"));
1118 m_mruFiles.AddFileToHistory(fname.GetFullPath());
1123 gl_preview_frame->SetTitle(fname.GetName() + wxT(
".") + fname.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Stitcher"));
1125 SetTitle(fname.GetName() + wxT(
".") + fname.GetExt() + wxT(
" - ") + _(
"Panorama editor"));
1129 SetTitle(fname.GetName() + wxT(
".") + fname.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Stitcher"));
1134 SetStatusText(_(
"Loading canceled"));
1142 SetTitle(_(
"Panorama editor"));
1146 SetTitle(_(
"Hugin - Panorama Stitcher"));
1149 if (! (fname.GetExt() == wxT(
"pto"))) {
1156 wxConfigBase* config = wxConfigBase::Get();
1157 config->Write(wxT(
"/actualPath"), path);
1159 SetStatusText( _(
"Error opening project: ") + filename);
1165 wxCommandEvent dummy;
1175 void MainFrame::MacOnOpenFile(
const wxString & filename)
1179 ImageCache::getInstance().flush();
1191 wxConfigBase* config = wxConfigBase::Get();
1193 wxString defaultdir = config->Read(wxT(
"/actualPath"),wxT(
""));
1194 wxFileDialog dlg(wxGetActiveWindow(),
1195 _(
"Open project file"),
1196 defaultdir, wxT(
""),
1197 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1198 wxFD_OPEN, wxDefaultPosition);
1199 dlg.SetDirectory(defaultdir);
1200 if (dlg.ShowModal() == wxID_OK)
1202 wxString filename = dlg.GetPath();
1205 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()),
1211 wxYES_NO | wxICON_QUESTION)==wxYES)
1213 wxArrayString filenameArray;
1214 filenameArray.Add(filename);
1222 ImageCache::getInstance().flush();
1231 SetStatusText( _(
"Open project: cancel"));
1240 ImageCache::getInstance().flush();
1242 wxConfigBase* config = wxConfigBase::Get();
1245 if (dialog.ShowModal() == wxID_OK)
1250 config->Write(
"/actualPath", dialog.GetSelectedPath());
1263 ImageCache::getInstance().flush();
1270 SetTitle(_(
"Panorama editor"));
1274 SetTitle(_(
"Hugin - Panorama Stitcher"));
1277 wxCommandEvent dummy;
1301 wxArrayString invalidFiles;
1302 for(
unsigned int i=0;i<filenameArray.GetCount(); i++)
1306 invalidFiles.Add(filenameArray[i]);
1309 if(!invalidFiles.empty())
1315 std::vector<std::string> filesv;
1316 for (
unsigned int i=0; i< filenameArray.GetCount(); i++) {
1321 if (!filesv.empty()) {
1345 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_MASK"))
1348 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_CP_EDITOR"))
1351 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_OPTIMIZER"))
1354 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_OPTIMIZER_PHOTOMETRIC"))
1366 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_PANORAMA"))
1391 if (wxFileExists(e.GetString()))
1394 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()),
1400 wxOK | wxICON_ERROR);
1405 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()),
1411 wxOK | wxICON_ERROR);
1420 imagesToRemove.insert(i);
1423 if (!imagesToRemove.empty())
1475 DisplayHelp(wxT(
"Hugin_Keyboard_shortcuts.html"));
1486 if (section.IsEmpty())
1499 bool bShowAtStartup;
1504 wxConfigBase * config = wxConfigBase::Get();
1505 nValue = config->Read(wxT(
"/MainFrame/ShowStartTip"),1l);
1509 strFile =
GetXRCPath() + wxT(
"data/tips.txt");
1511 DEBUG_INFO(
"Reading tips from " << strFile.mb_str(wxConvLocal));
1513 bShowAtStartup = wxShowTip(wxGetActiveWindow(), tipProvider, (nValue ?
true :
false));
1516 nValue = (bShowAtStartup ? tipProvider->GetCurrentTip() : 0);
1518 config->Write(wxT(
"/MainFrame/ShowStartTip"), nValue);
1527 pref_dlg.ShowModal();
1529 wxConfigBase* cfg=wxConfigBase::Get();
1530 #if defined __WXMSW__
1533 unsigned long mem_high = cfg->Read(wxT(
"/ImageCache/UpperBoundHigh"), (
long) 0);
1536 mem = ((
unsigned long long) mem_high << 32) + mem_low;
1542 ImageCache::getInstance().SetUpperLimit(mem);
1564 wxCommandEvent dummy;
1574 #if defined __WXMSW__ || defined __WXMAC__
1581 #if defined __WXMSW__
1588 #elif defined __WXGTK__
1617 wxCommandEvent dummy;
1629 wxMenuBar* menubar = GetMenuBar();
1632 menubar->Check(XRCID(
"action_optimize_only_active"), onlyActive);
1647 m_optIgnoreLineCp = GetMenuBar()->IsChecked(XRCID(
"action_optimize_ignore_line_cp"));
1656 wxMenuBar* menubar = GetMenuBar();
1659 menubar->Check(XRCID(
"action_optimize_ignore_line_cp"), ignoreLineCP);
1672 wxCommandEvent dummy;
1679 wxCommandEvent cmdEvt(wxEVT_COMMAND_BUTTON_CLICKED,XRCID(
"pano_button_stitch"));
1680 pano_panel->GetEventHandler()->AddPendingEvent(cmdEvt);
1704 wxConfigBase* config = wxConfigBase::Get();
1706 wxString defaultdir = config->Read(wxT(
"/actualPath"),wxT(
""));
1707 wxFileDialog dlg(wxGetActiveWindow(),
1708 _(
"Open project file"),
1709 defaultdir, wxT(
""),
1710 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1711 wxFD_OPEN, wxDefaultPosition);
1712 dlg.SetDirectory(defaultdir);
1713 if (dlg.ShowModal() == wxID_OK)
1715 wxString filename = dlg.GetPath();
1716 wxFileName fname(filename);
1717 wxString path = fname.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
1718 if (fname.IsOk() && fname.FileExists())
1731 m_mruFiles.AddFileToHistory(fname.GetFullPath());
1735 wxCommandEvent dummy;
1741 wxMessageBox(wxString::Format(_(
"Could not read project file %s."),fname.GetFullPath().c_str()),_(
"Error"),wxOK|wxICON_ERROR);
1749 wxString currentDir = wxConfigBase::Get()->Read(wxT(
"/actualPath"), wxT(
""));
1750 wxFileDialog dlg(wxGetActiveWindow(), _(
"Open Papywizard xml file"),
1751 currentDir, wxT(
""), _(
"Papywizard xml files (*.xml)|*.xml|All files (*)|*"),
1752 wxFD_OPEN, wxDefaultPosition);
1753 dlg.SetDirectory(currentDir);
1754 if (dlg.ShowModal() == wxID_OK)
1756 wxConfigBase::Get()->Write(wxT(
"/actualPath"), dlg.GetDirectory());
1764 wxConfigBase* config = wxConfigBase::Get();
1766 wxFileDialog dlg(wxGetActiveWindow(),
1767 _(
"Choose template project"),
1768 config->Read(wxT(
"/templatePath"),wxT(
"")), wxT(
""),
1769 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1770 wxFD_OPEN, wxDefaultPosition);
1771 dlg.SetDirectory(wxConfigBase::Get()->Read(wxT(
"/templatePath"),wxT(
"")));
1772 if (dlg.ShowModal() == wxID_OK) {
1773 wxString filename = dlg.GetPath();
1774 wxConfig::Get()->Write(wxT(
"/templatePath"), dlg.GetDirectory());
1786 #if defined __WXMAC__ && defined MAC_SELF_CONTAINED_BUNDLE
1790 FSRef actuallyLaunched;
1792 FSRef documentArray[1];
1793 LSLaunchFSRefSpec launchSpec;
1796 err = LSFindApplicationForInfo(kLSUnknownCreator,
1797 CFSTR(
"net.sourceforge.hugin.PTBatcherGUI"),
1803 wxMessageBox(wxString::Format(_(
"External program %s not found in the bundle, reverting to system path"), wxT(
"open")), _(
"Error"));
1805 wxExecute(_T(
"open -b net.sourceforge.hugin.PTBatcherGUI"));
1808 wxExecute(_T(
"open -b net.sourceforge.hugin.PTBatcherGUI"));
1811 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
1812 wxExecute(exePath.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + _T(
"PTBatcherGUI"));
1824 std::set<unsigned int> unoptimized;
1825 for (
unsigned int i=0; i < cps.size(); i++) {
1827 unoptimized.insert(i);
1830 unsigned int nGood=0;
1831 unsigned int nBad=0;
1833 wxConfigBase *cfg = wxConfigBase::Get();
1843 ProgressReporterDialog progress(unoptimized.size(), _(
"Fine-tuning all points"), _(
"Fine-tuning"), wxGetActiveWindow());
1845 ImageCache & imgCache = ImageCache::getInstance();
1851 std::set<unsigned int>::iterator it=unoptimized.begin();
1853 imgCache.softFlush();
1855 while (it != unoptimized.end()) {
1856 if (cps[*it].image1Nr == imgNr || cps[*it].image2Nr == imgNr) {
1857 if (!progress.updateDisplayValue())
1864 wxImage wxSearchImg;
1866 pano.
getImage(cps[*it].image2Nr).getFilename())->get8BitImage();
1869 pano.
getImage(cps[*it].image1Nr).getFilename())->get8BitImage();
1876 pano.
getImage(cps[*it].image2Nr), *searchImg, roundP2, sWidth);
1884 if (res.
maxi < corrThresh || res.
curv.
x < curvThresh || res.
curv.
y < curvThresh ||
1889 if (res.
maxi >= corrThresh) {
1892 cps[*it].error = res.
maxi;
1901 cps[*it].error = res.
maxi;
1907 cps[*it].error = 1.0;
1909 unsigned int rm = *it;
1911 unoptimized.erase(rm);
1920 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"),
1921 nGood, nBad, corrThresh);
1922 wxMessageBox(result, _(
"Fine-tune result"), wxOK);
1939 wxMessageBox(wxString::Format(_(
"Removed %lu control points"), static_cast<unsigned long>(cps.size())),
1940 _(
"Removing control points in masks"),wxOK|wxICON_INFORMATION);
1945 void MainFrame::OnPythonScript(wxCommandEvent & e)
1948 wxFileDialog dlg(wxGetActiveWindow(),
1949 _(
"Select python script"),
1950 wxConfigBase::Get()->Read(wxT(
"/lensPath"),wxT(
"")), wxT(
""),
1951 _(
"Python script (*.py)|*.py|All files (*.*)|*.*"),
1952 wxFD_OPEN, wxDefaultPosition);
1953 dlg.SetDirectory(wxConfigBase::Get()->Read(wxT(
"/pythonScriptPath"),wxT(
"")));
1955 if (dlg.ShowModal() == wxID_OK)
1957 wxString filename = dlg.GetPath();
1958 wxConfig::Get()->Write(wxT(
"/pythonScriptPath"), dlg.GetDirectory());
1961 new PanoCommand::PythonScriptPanoCmd(
pano,scriptfile)
1966 void MainFrame::OnPlugin(wxCommandEvent & e)
1968 wxFileName file=m_plugins[e.GetId()];
1969 if(file.FileExists())
1973 new PanoCommand::PythonScriptPanoCmd(
pano,scriptfile)
1978 wxMessageBox(wxString::Format(wxT(
"Python-Script %s not found.\nStopping processing."),file.GetFullPath().c_str()),_(
"Warning"),wxOK|wxICON_INFORMATION);
2034 if (switchToCropMode)
2066 msg = wxGetTranslation(wxString(
m_message.c_str(), wxConvLocal));
2069 msg.Append(wxT(
" "));
2073 GetStatusBar()->SetStatusText(msg, 0);
2082 wxToolBar* theToolBar = GetToolBar();
2083 theToolBar->EnableTool(XRCID(
"action_optimize"), option);
2084 theToolBar->EnableTool(XRCID(
"ID_SHOW_PREVIEW_FRAME"), option);
2086 wxMenuBar* theMenuBar = GetMenuBar();
2087 theMenuBar->Enable(XRCID(
"action_optimize"), option);
2088 theMenuBar->Enable(XRCID(
"action_finetune_all_cp"), option);
2089 theMenuBar->Enable(XRCID(
"action_remove_cp_in_masks"), option);
2090 theMenuBar->Enable(XRCID(
"ID_SHOW_PREVIEW_FRAME"), option);
2091 theMenuBar->Enable(XRCID(
"action_stitch"), option);
2092 theMenuBar->Enable(XRCID(
"action_stitch_userdefined"), option);
2101 theMenuBar->Enable(XRCID(
"action_assistant"), option);
2102 theMenuBar->Enable(XRCID(
"action_batch_assistant"), option);
2111 wxSize sz = this->GetSize();
2112 wxSize csz = this->GetClientSize();
2113 wxSize vsz = this->GetVirtualSize();
2115 " client: "<< csz.x <<
"," << csz.y <<
2116 " virtual: "<< vsz.x <<
"," << vsz.y);
2150 return wxGetApp().GetDataPath();
2177 size_t index = e.GetId() - wxID_FILE1;
2178 wxString f(
m_mruFiles.GetHistoryFile(index));
2182 if (fn.FileExists())
2188 ImageCache::getInstance().flush();
2196 wxMessageBox(wxString::Format(_(
"File \"%s\" not found.\nMaybe file was renamed, moved or deleted."),f.c_str()),
2197 _(
"Error!"),wxOK | wxICON_INFORMATION );
2204 ShowFullScreen(!IsFullScreen(), wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION);
2207 GetToolBar()->Show(
true);
2222 if (! wxFile::Exists(wxstrModelFileName) ) {
2223 wxMessageBox(wxString::Format(_(
"Celeste model expected in %s not found, Hugin needs to be properly installed."),wxstrModelFileName.c_str()), _(
"Fatal Error"));
2228 wxMessageBox(wxString::Format(_(
"Could not load Celeste model file %s"),wxstrModelFileName.c_str()),_(
"Error"));
2249 bool needsUpdateOptimizerVar=
false;
2251 for(
size_t i=0; i<optVec.size(); i++)
2253 bool hasTrX=optVec[i].erase(
"TrX")>0;
2254 bool hasTrY=optVec[i].erase(
"TrY")>0;
2255 bool hasTrZ=optVec[i].erase(
"TrZ")>0;
2256 bool hasTpy=optVec[i].erase(
"Tpy")>0;
2257 bool hasTpp=optVec[i].erase(
"Tpp")>0;
2258 bool hasg=optVec[i].erase(
"g")>0;
2259 bool hast=optVec[i].erase(
"t")>0;
2260 needsUpdateOptimizerVar=needsUpdateOptimizerVar || hasTrX || hasTrY || hasTrZ || hasTpy || hasTpp || hasg || hast;
2262 if(needsUpdateOptimizerVar)
2271 bool needsUpdateOptimizerVar=
false;
2273 for(
size_t i=0; i<optVec.size(); i++)
2275 bool hasVx=optVec[i].erase(
"Vx")>0;
2276 bool hasVy=optVec[i].erase(
"Vy")>0;
2277 needsUpdateOptimizerVar=needsUpdateOptimizerVar || hasVx || hasVy;
2279 if(needsUpdateOptimizerVar)
2298 GetMenuBar()->FindItem(XRCID(
"action_gui_simple"))->Check();
2301 GetMenuBar()->FindItem(XRCID(
"action_gui_advanced"))->Check();
2304 GetMenuBar()->FindItem(XRCID(
"action_gui_expert"))->Check();
2311 wxCommandEvent dummy;
2315 GetMenuBar()->Remove(0);
2320 SetTitle(_(
"Panorama editor"));
2325 gl_preview_frame->SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Stitcher"));
2326 SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Panorama editor"));
2332 wxGetApp().SetTopWindow(
this);
2333 GetMenuBar()->Remove(0);
2337 SetTitle(_(
"Hugin - Panorama Stitcher"));
2342 SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Stitcher"));
2362 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."),
2368 wxOK | wxICON_INFORMATION);
2372 wxMessageBox(_(
"Can't switch to simple interface. The project is using translation or shear parameters.\nThese parameters are not supported in simple interface."),
2378 wxOK | wxICON_INFORMATION);
2393 wxMessageBox(_(
"Can't switch to advanced interface. The project is using translation or shear parameters.\nThese parameters are not supported in advanced interface."),
2399 wxOK | wxICON_INFORMATION);
2411 GetMenuBar()->Enable(XRCID(
"ID_SHOW_GL_PREVIEW_FRAME"),
false);
2412 GetMenuBar()->Enable(XRCID(
"action_gui_simple"),
false);
2413 GetToolBar()->EnableTool(XRCID(
"ID_SHOW_GL_PREVIEW_FRAME"),
false);
2419 wxString tempDir= wxConfig::Get()->Read(wxT(
"tempDir"),wxT(
""));
2420 if(!tempDir.IsEmpty())
2422 if(tempDir.Last()!=wxFileName::GetPathSeparator())
2424 tempDir.Append(wxFileName::GetPathSeparator());
2427 wxFileName scriptFileName(wxFileName::CreateTempFileName(tempDir+wxT(
"ha")));
2432 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
2433 wxArrayString tempfiles;
2435 if (userdefinedAssistant.IsEmpty())
2441 std::stringstream errors;
2443 if (commands->empty())
2445 wxMessageBox(_(
"The assistant queue is empty. This indicates an error in the user defined assistant file.") +
"\n\n" + wxString(errors.str()),
2446 _(
"Error"), wxOK | wxICON_ERROR, mainWin);
2448 wxRemoveFile(scriptFileName.GetFullPath());
2461 wxRemoveFile(scriptFileName.GetFullPath());
2462 if (!tempfiles.IsEmpty())
2464 for (
auto& f : tempfiles)
2479 if (userdefinedAssistant.IsEmpty())
2483 wxMessageBox(_(
"The assistant could not find vertical lines. Please add vertical lines in the panorama editor and optimize project manually."),
2484 _(
"Warning"), wxOK | wxICON_INFORMATION, mainWin);
2491 if (comps.size() > 1)
2494 unsigned i1 = *(comps[0].rbegin());
2495 unsigned i2 = *(comps[1].begin());
2498 wxMessageBox(wxString::Format(_(
"Warning %d unconnected image groups found:"), static_cast<int>(comps.size())) +
Components2Str(comps) + wxT(
"\n")
2499 + _(
"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);
2502 wxMessageBox(_(
"The assistant did not complete successfully. Please check the resulting project file."),
2503 _(
"Warning"), wxOK | wxICON_INFORMATION, mainWin);
2508 wxMessageBox(_(
"The assistant did not complete successfully. Please check the resulting project file."),
2509 _(
"Warning"), wxOK | wxICON_INFORMATION, mainWin);
2534 wxCommandEvent dummy;
2539 #if defined __WXMAC__ && defined MAC_SELF_CONTAINED_BUNDLE
2543 FSRef actuallyLaunched;
2545 FSRef documentArray[1];
2546 LSLaunchFSRefSpec launchSpec;
2549 err = LSFindApplicationForInfo(kLSUnknownCreator,
2550 CFSTR(
"net.sourceforge.hugin.PTBatcherGUI"),
2557 wxMessageBox(wxString::Format(_(
"External program %s not found in the bundle, reverting to system path"), wxT(
"open")), _(
"Error"));
2563 wxCharBuffer projectFilebuffer=projectFile.ToUTF8();
2565 err = FSPathMakeRef((
unsigned char*) projectFilebuffer.data(), &documentArray[0], &isDir);
2566 if (err != noErr || isDir)
2569 wxMessageBox(wxString::Format(_(
"Project file not found"), wxT(
"open")), _(
"Error"));
2572 launchSpec.appRef = &appRef;
2573 launchSpec.numDocs =
sizeof(documentArray)/
sizeof(documentArray[0]);
2574 launchSpec.itemRefs = documentArray;
2575 launchSpec.passThruParams = NULL;
2576 launchSpec.launchFlags = kLSLaunchDontAddToRecents + kLSLaunchDontSwitch;
2577 launchSpec.asyncRefCon = NULL;
2579 err = LSOpenFromRefSpec(&launchSpec, &actuallyLaunched);
2580 if (err != noErr && err != kLSLaunchInProgressErr)
2584 wxMessageBox(wxString::Format(_(
"Can't launch PTBatcherGui"), wxT(
"open")), _(
"Error"));
2589 if (FSCompareFSRefs(&appRef, &actuallyLaunched) != noErr)
2592 wxMessageBox(wxString::Format(_(
"Launched incorrect programme"), wxT(
"open")), _(
"Error"));
2596 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
2597 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 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 StoreFramePosition(wxTopLevelWindow *frame, const wxString &basename)
Store window size and position in configfile/registry.
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...