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__)
112 DECLARE_EVENT_TABLE()
116 BEGIN_EVENT_TABLE(HuginSplashScreen, wxFrame)
120 bool PanoDropTarget::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames)
124 if (!mf)
return false;
126 if (!m_imageOnly && filenames.GetCount() == 1) {
127 wxFileName file(filenames[0]);
128 if (file.GetExt().CmpNoCase(wxT(
"pto")) == 0 ||
129 file.GetExt().CmpNoCase(wxT(
"ptp")) == 0 ||
130 file.GetExt().CmpNoCase(wxT(
"pts")) == 0 )
137 ImageCache::getInstance().flush();
144 std::vector<std::string> filesv;
145 std::vector<std::string> rawFilesv;
146 wxArrayString invalidFiles;
147 for (
unsigned int i=0; i< filenames.GetCount(); i++) {
148 wxFileName file(filenames[i]);
156 invalidFiles.Add(file.GetFullPath());
170 invalidFiles.Add(file.GetFullPath());
180 if (!invalidFiles.empty())
189 if(pano.getNrOfCtrlPoints()>0)
195 std::vector<PanoCommand::PanoCommand*> cmds;
202 if (!rawFilesv.empty())
204 if (rawFilesv.size() == 1)
206 wxMessageDialog message(mf, _(
"You selected only one raw file. This is not recommended.\nAll raw files should be converted at once."),
212 wxICON_EXCLAMATION | wxOK | wxCANCEL);
213 message.SetOKLabel(_(
"Convert anyway."));
214 if (message.ShowModal() != wxID_OK)
224 if (dlg.ShowModal() == wxID_OK)
237 EVT_MENU(XRCID("action_new_project"),
MainFrame::OnNewProject)
238 EVT_MENU(XRCID("action_load_project"),
MainFrame::OnLoadProject)
239 EVT_MENU(XRCID("action_browse_projects"),
MainFrame::OnBrowseProjects)
240 EVT_MENU(XRCID("action_save_project"),
MainFrame::OnSaveProject)
241 EVT_MENU(XRCID("action_save_as_project"),
MainFrame::OnSaveProjectAs)
242 EVT_MENU(XRCID("action_save_as_ptstitcher"),
MainFrame::OnSavePTStitcherAs)
243 EVT_MENU(XRCID("action_open_batch_processor"),
MainFrame::OnOpenPTBatcher)
244 EVT_MENU(XRCID("action_import_project"),
MainFrame::OnMergeProject)
245 EVT_MENU(XRCID("action_import_papywizard"),
MainFrame::OnReadPapywizard)
246 EVT_MENU(XRCID("action_apply_template"),
MainFrame::OnApplyTemplate)
247 EVT_MENU(XRCID("action_exit_hugin"),
MainFrame::OnUserQuit)
248 EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9,
MainFrame::OnMRUFiles)
249 EVT_MENU(XRCID("action_show_about"),
MainFrame::OnAbout)
250 EVT_MENU(XRCID("action_show_help"),
MainFrame::OnHelp)
251 EVT_MENU(XRCID("action_show_tip"),
MainFrame::OnTipOfDay)
252 EVT_MENU(XRCID("action_show_shortcuts"),
MainFrame::OnKeyboardHelp)
253 EVT_MENU(XRCID("action_show_faq"),
MainFrame::OnFAQ)
254 EVT_MENU(XRCID("action_show_prefs"),
MainFrame::OnShowPrefs)
255 EVT_MENU(XRCID("action_assistant"),
MainFrame::OnRunAssistant)
256 EVT_MENU(XRCID("action_batch_assistant"),
MainFrame::OnSendToAssistantQueue)
257 EVT_MENU(XRCID("action_gui_simple"),
MainFrame::OnSetGuiSimple)
258 EVT_MENU(XRCID("action_gui_advanced"),
MainFrame::OnSetGuiAdvanced)
259 EVT_MENU(XRCID("action_gui_expert"),
MainFrame::OnSetGuiExpert)
261 EVT_MENU(XRCID(
"action_python_script"), MainFrame::OnPythonScript)
264 EVT_MENU(XRCID("ID_EDITREDO"),
MainFrame::OnRedo)
265 EVT_MENU(XRCID("ID_SHOW_FULL_SCREEN"),
MainFrame::OnFullScreen)
266 EVT_MENU(XRCID("ID_SHOW_PREVIEW_FRAME"),
MainFrame::OnTogglePreviewFrame)
267 EVT_MENU(XRCID("ID_SHOW_GL_PREVIEW_FRAME"),
MainFrame::OnToggleGLPreviewFrame)
268 EVT_BUTTON(XRCID("ID_SHOW_PREVIEW_FRAME"),
MainFrame::OnTogglePreviewFrame)
269 EVT_BUTTON(XRCID("ID_SHOW_GL_PREVIEW_FRAME"),
MainFrame::OnToggleGLPreviewFrame)
271 EVT_MENU(XRCID("action_optimize"),
MainFrame::OnOptimize)
272 EVT_MENU(XRCID("action_optimize_only_active"),
MainFrame::OnOnlyActiveImages)
273 EVT_MENU(XRCID("action_optimize_ignore_line_cp"),
MainFrame::OnIgnoreLineCp)
274 EVT_BUTTON(XRCID("action_optimize"),
MainFrame::OnOptimize)
275 EVT_MENU(XRCID("action_finetune_all_cp"),
MainFrame::OnFineTuneAll)
277 EVT_MENU(XRCID("action_remove_cp_in_masks"),
MainFrame::OnRemoveCPinMasks)
279 EVT_MENU(XRCID("ID_CP_TABLE"),
MainFrame::OnShowCPFrame)
280 EVT_BUTTON(XRCID("ID_CP_TABLE"),
MainFrame::OnShowCPFrame)
282 EVT_MENU(XRCID("ID_SHOW_PANEL_IMAGES"),
MainFrame::OnShowPanel)
283 EVT_MENU(XRCID("ID_SHOW_PANEL_MASK"),
MainFrame::OnShowPanel)
284 EVT_MENU(XRCID("ID_SHOW_PANEL_CP_EDITOR"),
MainFrame::OnShowPanel)
285 EVT_MENU(XRCID("ID_SHOW_PANEL_OPTIMIZER"),
MainFrame::OnShowPanel)
286 EVT_MENU(XRCID("ID_SHOW_PANEL_OPTIMIZER_PHOTOMETRIC"),
MainFrame::OnShowPanel)
287 EVT_MENU(XRCID("ID_SHOW_PANEL_PANORAMA"),
MainFrame::OnShowPanel)
288 EVT_MENU(XRCID("action_stitch"),
MainFrame::OnDoStitch)
289 EVT_MENU(XRCID("action_stitch_userdefined"),
MainFrame::OnUserDefinedStitch)
290 EVT_MENU(XRCID("action_add_images"),
MainFrame::OnAddImages)
291 EVT_BUTTON(XRCID("action_add_images"),
MainFrame::OnAddImages)
292 EVT_MENU(XRCID("action_add_time_images"),
MainFrame::OnAddTimeImages)
293 EVT_BUTTON(XRCID("action_add_time_images"),
MainFrame::OnAddTimeImages)
296 EVT_COMMAND(wxID_ANY, EVT_LOADING_FAILED,
MainFrame::OnLoadingFailed)
313 : cp_frame(0), pano(pano)
318 bool disableOpenGL=
false;
319 if(wxGetKeyState(WXK_COMMAND))
322 wxXmlResource::Get()->LoadDialog(&dlg, NULL, wxT(
"disable_opengl_dlg"));
323 long noOpenGL=wxConfigBase::Get()->Read(wxT(
"DisableOpenGL"), 0l);
326 XRCCTRL(dlg,
"disable_dont_ask_checkbox", wxCheckBox)->SetValue(
true);
328 if(dlg.ShowModal()==wxID_OK)
330 if(XRCCTRL(dlg,
"disable_dont_ask_checkbox", wxCheckBox)->IsChecked())
332 wxConfigBase::Get()->Write(wxT(
"DisableOpenGL"), 1l);
336 wxConfigBase::Get()->Write(wxT(
"DisableOpenGL"), 0l);
342 wxConfigBase::Get()->Write(wxT(
"DisableOpenGL"), 0l);
347 long noOpenGL=wxConfigBase::Get()->Read(wxT(
"DisableOpenGL"), 0l);
348 disableOpenGL=(noOpenGL==1);
360 dc.SelectObject(bitmap);
362 wxFont font(9, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
364 wxFont font(8, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
367 dc.SetTextForeground(*wxBLACK);
368 dc.SetTextBackground(*wxWHITE);
372 dc.GetTextExtent(version, &tw, &th);
374 dc.DrawText(version, bitmap.GetWidth() - tw - 3, bitmap.GetHeight() - th - 3);
375 dc.SelectObject(wxNullBitmap);
377 bitmap.SetScaleFactor(GetDPIScaleFactor());
380 wxLogFatalError(_(
"Fatal installation error\nThe file data/splash.png was not found at:") +
huginApp::Get()->
GetXRCPath());
392 wxXmlResource::Get()->LoadFrame(
this, parent, wxT(
"main_frame"));
397 wxApp::s_macAboutMenuItemId = XRCID(
"action_show_about");
398 wxApp::s_macPreferencesMenuItemId = XRCID(
"action_show_prefs");
399 wxApp::s_macExitMenuItemId = XRCID(
"action_exit_hugin");
400 wxApp::s_macHelpMenuTitleName = _(
"&Help");
402 wxMenuBar* mainMenu=wxXmlResource::Get()->LoadMenuBar(
this, wxT(
"main_menubar"));
406 SetMenuBar(mainMenu);
407 m_optOnlyActiveImages = (wxConfigBase::Get()->Read(wxT(
"/OptimizePanel/OnlyActiveImages"), 1l) != 0);
413 wxMenuBar* menubar=GetMenuBar();
415 wxMenu *pluginMenu=
new wxMenu();
421 bool cont = dir.GetFirst(&filename, wxT(
"*.py"), wxDIR_FILES | wxDIR_HIDDEN);
425 wxFileName file(dir.GetName(), filename);
430 items.push_back(item);
432 cont = dir.GetNext(&filename);
437 for (PluginItems::const_iterator it = items.begin(); it != items.end(); ++it)
440 int categoryID = pluginMenu->FindItem(item.
GetCategory());
441 wxMenu* categoryMenu;
442 if (categoryID == wxNOT_FOUND)
444 categoryMenu =
new wxMenu();
445 pluginMenu->AppendSubMenu(categoryMenu, item.
GetCategory());
449 categoryMenu = pluginMenu->FindItem(categoryID)->GetSubMenu();
453 Connect(pluginID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainFrame::OnPlugin));
457 if (pluginMenu->GetMenuItemCount() > 0)
459 menubar->Insert(menubar->GetMenuCount() - 2, pluginMenu, _(
"&Actions"));
463 GetMenuBar()->Enable(XRCID(
"action_python_script"),
false);
467 SetToolBar(wxXmlResource::Get()->LoadToolBar(
this, wxT(
"main_toolbar")));
483 m_notebook = XRCCTRL((*
this),
"controls_notebook", wxNotebook);
516 wxConfigBase * config=wxConfigBase::Get();
536 wxDir::GetAllFiles(
GetDataPath()+
"output", &files, wxT(
"*.executor"), wxDIR_FILES | wxDIR_HIDDEN | wxDIR_NO_FOLLOW);
537 const size_t nrAllUserSequences = files.size();
539 if (!files.IsEmpty())
543 int outputMenuId=mainMenu->FindMenu(_(
"&Output"));
544 if (outputMenuId != wxNOT_FOUND)
546 wxMenu* outputSequencesMenu =
new wxMenu;
548 for (
auto file : files)
550 if (i > 0 && i == nrAllUserSequences && outputSequencesMenu->GetMenuItemCount() > 0)
552 outputSequencesMenu->AppendSeparator();
560 wxFileInputStream inputStream(file);
561 if (inputStream.IsOk())
564 wxFileConfig executorFile(inputStream);
569 help = wxString::Format(_(
"User defined sequence: %s"), file);
574 outputSequencesMenu->Append(outputId, desc, help);
587 if ((outputSequencesMenu->GetMenuItemCount() == 1 && !(outputSequencesMenu->FindItemByPosition(0)->IsSeparator())) ||
588 outputSequencesMenu->GetMenuItemCount() > 1)
590 m_outputUserMenu = mainMenu->GetMenu(outputMenuId)->AppendSubMenu(outputSequencesMenu, _(
"User defined output sequences"));
594 delete outputSequencesMenu;
603 wxDir::GetAllFiles(
GetDataPath() +
"assistant", &files, wxT(
"*.assistant"), wxDIR_FILES | wxDIR_HIDDEN | wxDIR_NO_FOLLOW);
604 const size_t nrAllUserSequences = files.size();
606 if (!files.IsEmpty())
610 const int editMenuId = mainMenu->FindMenu(_(
"&Edit"));
611 if (editMenuId != wxNOT_FOUND)
613 wxMenu* userAssistantMenu =
new wxMenu;
615 for (
auto file : files)
617 if (i > 0 && i == nrAllUserSequences && userAssistantMenu->GetMenuItemCount() > 0)
619 userAssistantMenu->AppendSeparator();
626 wxFileInputStream inputStream(file);
627 if (inputStream.IsOk())
630 wxFileConfig assistantFile(inputStream);
633 help = help.Trim(
true).Trim(
false);
636 help = wxString::Format(_(
"User defined assistant: %s"), file);
641 userAssistantMenu->Append(assistantId, desc, help);
654 if (userAssistantMenu->GetMenuItemCount() > 0)
656 m_assistantUserMenu = mainMenu->GetMenu(editMenuId)->Insert(5, wxID_ANY, _(
"User defined assistant"), userAssistantMenu);
660 delete userAssistantMenu;
669 wxIconBundle myIcons(
GetXRCPath() + wxT(
"data/hugin.ico"), wxBITMAP_TYPE_ICO);
672 wxIcon myIcon(
GetXRCPath() + wxT(
"data/hugin.png"),wxBITMAP_TYPE_PNG);
683 const int fields (2);
684 CreateStatusBar(fields);
685 int widths[fields] = {-1, 85};
686 SetStatusWidths( fields, &widths[0]);
687 SetStatusText(_(
"Started"), 0);
693 #if defined __WXMAC__ || defined __WXMSW__
695 SetSizeHints(900, 675);
698 SetSizeHints(780, 455);
702 ImageCache::getInstance().setProgressDisplay(
this);
703 #if defined __WXMSW__
706 unsigned long mem_high = wxConfigBase::Get()->Read(wxT(
"/ImageCache/UpperBoundHigh"), (
long) 0);
708 mem = ((
unsigned long long) mem_high << 32) + mem_low;
713 ImageCache::getInstance().SetUpperLimit(mem);
715 ImageCache::getInstance().SetUpperLimit(wxConfigBase::Get()->Read(wxT(
"/ImageCache/UpperBound"),
HUGIN_IMGCACHE_UPPERBOUND));
725 SetAutoLayout(
false);
731 this->SetBackgroundColour(
images_panel->GetBackgroundColour());
744 freopen(
"c:\\hugin_stdout.txt",
"w", stdout);
745 freopen(
"c:\\hugin_stderr.txt",
"w", stderr);
751 long guiLevel=config->Read(wxT(
"/GuiLevel"),(
long)0);
752 guiLevel = std::max<long>(0, std::min<long>(2, guiLevel));
778 ImageCache::getInstance().setProgressDisplay(NULL);
779 delete & ImageCache::getInstance();
787 wxConfigBase* config = wxConfigBase::Get();
794 config->Write(wxT(
"/GuiLevel"),(
long)
m_guiLevel);
814 if (!(lastCommand ==
"remove control point" || lastCommand ==
"remove control points"))
823 wxToolBar* theToolBar = GetToolBar();
824 wxMenuBar* theMenuBar = GetMenuBar();
826 theMenuBar->Enable (XRCID(
"ID_EDITUNDO"), can_undo);
827 theToolBar->EnableTool(XRCID(
"ID_EDITUNDO"), can_undo);
829 theMenuBar->Enable (XRCID(
"ID_EDITREDO"), can_redo);
830 theToolBar->EnableTool(XRCID(
"ID_EDITREDO"), can_redo);
875 assert(&
pano == &panorama);
887 wxString messageString;
891 messageString = _(
"Save changes to the project file before opening another project?");
894 messageString = _(
"Save changes to the project file before starting a new project?");
898 messageString = _(
"Save changes to the project file before closing?");
901 wxMessageDialog message(wxGetActiveWindow(), messageString,
907 wxICON_EXCLAMATION | wxYES_NO | (cancelable? (wxCANCEL):0));
911 message.SetExtendedMessage(_(
"If you load another project without saving, your changes since last save will be discarded."));
914 message.SetExtendedMessage(_(
"If you start a new project without saving, your changes since last save will be discarded."));
918 message.SetExtendedMessage(_(
"If you close without saving, your changes since your last save will be discarded."));
921 #if defined __WXMAC__ || defined __WXMSW__
923 message.SetYesNoLabels(wxID_SAVE, _(
"Don't Save"));
926 message.SetYesNoLabels(wxID_SAVE, _(
"Close without saving"));
928 int answer = message.ShowModal();
932 wxCommandEvent dummy;
957 wxLogError(_(
"forced close"));
986 ImageCache::getInstance().flush();
1001 DEBUG_DEBUG(
"stripping " << path <<
" from image filenames");
1005 SetStatusText(wxString::Format(_(
"saved project %s"),
m_filename.c_str()),0);
1010 gl_preview_frame->SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Creator"));
1012 SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Panorama editor"));
1016 SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Creator"));
1021 }
catch (std::exception & e) {
1022 wxString err(e.what(), wxConvLocal);
1023 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);
1030 wxFileName scriptName;
1039 scriptName.Normalize(wxPATH_NORM_ABSOLUTE | wxPATH_NORM_DOTS | wxPATH_NORM_TILDE | wxPATH_NORM_SHORTCUT);
1040 wxFileDialog dlg(wxGetActiveWindow(),
1041 _(
"Save project file"),
1042 scriptName.GetPath(), scriptName.GetFullName(),
1043 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1044 wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
1045 if (dlg.ShowModal() == wxID_OK) {
1046 wxConfig::Get()->Write(wxT(
"/actualPath"), dlg.GetDirectory());
1047 wxString fn = dlg.GetPath();
1048 if (fn.Right(4).CmpNoCase(wxT(
".pto"))!=0)
1050 fn.Append(wxT(
".pto"));
1051 if (wxFile::Exists(fn)) {
1052 int d = wxMessageBox(wxString::Format(_(
"File %s exists. Overwrite?"), fn.c_str()),
1053 _(
"Save project"), wxYES_NO | wxICON_QUESTION);
1072 wxFileName scriptNameFN(scriptName);
1073 wxString fn = scriptNameFN.GetName() + wxT(
".txt");
1074 wxFileDialog dlg(wxGetActiveWindow(),
1075 _(
"Save PTmender script file"),
1076 wxConfigBase::Get()->Read(wxT(
"/actualPath"),wxT(
"")), fn,
1077 _(
"PTmender files (*.txt)|*.txt"),
1078 wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
1079 if (dlg.ShowModal() == wxID_OK) {
1080 wxString fname = dlg.GetPath();
1082 wxFileName scriptName = fname;
1102 SetStatusText( _(
"Open project: ") + filename);
1104 wxFileName fname(filename);
1105 wxString path = fname.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
1106 if (fname.IsOk() && fname.FileExists())
1116 wxMessageBox(wxString::Format(_(
"Could not load project file \"%s\".\nIt is not a valid pto file."), filename), _(
"Error"), wxOK | wxICON_ERROR);
1132 SetStatusText(_(
"Project opened"));
1133 m_mruFiles.AddFileToHistory(fname.GetFullPath());
1138 gl_preview_frame->SetTitle(fname.GetName() + wxT(
".") + fname.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Stitcher"));
1140 SetTitle(fname.GetName() + wxT(
".") + fname.GetExt() + wxT(
" - ") + _(
"Panorama editor"));
1144 SetTitle(fname.GetName() + wxT(
".") + fname.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Stitcher"));
1149 SetStatusText(_(
"Loading canceled"));
1157 SetTitle(_(
"Panorama editor"));
1161 SetTitle(_(
"Hugin - Panorama Stitcher"));
1164 if (! (fname.GetExt() == wxT(
"pto"))) {
1171 wxConfigBase* config = wxConfigBase::Get();
1172 config->Write(wxT(
"/actualPath"), path);
1174 SetStatusText( _(
"Error opening project: ") + filename);
1180 wxCommandEvent dummy;
1190 void MainFrame::MacOnOpenFile(
const wxString & filename)
1194 ImageCache::getInstance().flush();
1206 wxConfigBase* config = wxConfigBase::Get();
1208 wxString defaultdir = config->Read(wxT(
"/actualPath"),wxT(
""));
1209 wxFileDialog dlg(wxGetActiveWindow(),
1210 _(
"Open project file"),
1211 defaultdir, wxT(
""),
1212 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1213 wxFD_OPEN, wxDefaultPosition);
1214 dlg.SetDirectory(defaultdir);
1215 if (dlg.ShowModal() == wxID_OK)
1217 wxString filename = dlg.GetPath();
1220 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()),
1226 wxYES_NO | wxICON_QUESTION)==wxYES)
1228 wxArrayString filenameArray;
1229 filenameArray.Add(filename);
1237 ImageCache::getInstance().flush();
1246 SetStatusText( _(
"Open project: cancel"));
1255 ImageCache::getInstance().flush();
1257 wxConfigBase* config = wxConfigBase::Get();
1260 if (dialog.ShowModal() == wxID_OK)
1265 config->Write(
"/actualPath", dialog.GetSelectedPath());
1278 ImageCache::getInstance().flush();
1285 SetTitle(_(
"Panorama editor"));
1289 SetTitle(_(
"Hugin - Panorama Stitcher"));
1292 wxCommandEvent dummy;
1316 wxArrayString invalidFiles;
1317 for(
unsigned int i=0;i<filenameArray.GetCount(); i++)
1321 invalidFiles.Add(filenameArray[i]);
1324 if(!invalidFiles.empty())
1330 std::vector<std::string> filesv;
1331 for (
unsigned int i=0; i< filenameArray.GetCount(); i++) {
1336 if (!filesv.empty()) {
1360 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_MASK"))
1363 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_CP_EDITOR"))
1366 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_OPTIMIZER"))
1369 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_OPTIMIZER_PHOTOMETRIC"))
1381 if(e.GetId()==XRCID(
"ID_SHOW_PANEL_PANORAMA"))
1406 if (wxFileExists(e.GetString()))
1409 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()),
1415 wxOK | wxICON_ERROR);
1420 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()),
1426 wxOK | wxICON_ERROR);
1435 imagesToRemove.insert(i);
1438 if (!imagesToRemove.empty())
1490 DisplayHelp(wxT(
"Hugin_Keyboard_shortcuts.html"));
1501 if (section.IsEmpty())
1514 bool bShowAtStartup;
1519 wxConfigBase * config = wxConfigBase::Get();
1520 nValue = config->Read(wxT(
"/MainFrame/ShowStartTip"),1l);
1524 strFile =
GetXRCPath() + wxT(
"data/tips.txt");
1526 DEBUG_INFO(
"Reading tips from " << strFile.mb_str(wxConvLocal));
1528 bShowAtStartup = wxShowTip(wxGetActiveWindow(), tipProvider, (nValue ?
true :
false));
1531 nValue = (bShowAtStartup ? tipProvider->GetCurrentTip() : 0);
1533 config->Write(wxT(
"/MainFrame/ShowStartTip"), nValue);
1542 pref_dlg.ShowModal();
1544 wxConfigBase* cfg=wxConfigBase::Get();
1545 #if defined __WXMSW__
1548 unsigned long mem_high = cfg->Read(wxT(
"/ImageCache/UpperBoundHigh"), (
long) 0);
1551 mem = ((
unsigned long long) mem_high << 32) + mem_low;
1557 ImageCache::getInstance().SetUpperLimit(mem);
1579 wxCommandEvent dummy;
1589 #if defined __WXMSW__ || defined __WXMAC__
1596 #if defined __WXMSW__
1603 #elif defined __WXGTK__
1632 wxCommandEvent dummy;
1644 wxMenuBar* menubar = GetMenuBar();
1647 menubar->Check(XRCID(
"action_optimize_only_active"), onlyActive);
1662 m_optIgnoreLineCp = GetMenuBar()->IsChecked(XRCID(
"action_optimize_ignore_line_cp"));
1671 wxMenuBar* menubar = GetMenuBar();
1674 menubar->Check(XRCID(
"action_optimize_ignore_line_cp"), ignoreLineCP);
1687 wxCommandEvent dummy;
1694 wxCommandEvent cmdEvt(wxEVT_COMMAND_BUTTON_CLICKED,XRCID(
"pano_button_stitch"));
1695 pano_panel->GetEventHandler()->AddPendingEvent(cmdEvt);
1719 wxConfigBase* config = wxConfigBase::Get();
1721 wxString defaultdir = config->Read(wxT(
"/actualPath"),wxT(
""));
1722 wxFileDialog dlg(wxGetActiveWindow(),
1723 _(
"Open project file"),
1724 defaultdir, wxT(
""),
1725 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1726 wxFD_OPEN, wxDefaultPosition);
1727 dlg.SetDirectory(defaultdir);
1728 if (dlg.ShowModal() == wxID_OK)
1730 wxString filename = dlg.GetPath();
1731 wxFileName fname(filename);
1732 wxString path = fname.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
1733 if (fname.IsOk() && fname.FileExists())
1746 m_mruFiles.AddFileToHistory(fname.GetFullPath());
1750 wxCommandEvent dummy;
1756 wxMessageBox(wxString::Format(_(
"Could not read project file %s."),fname.GetFullPath().c_str()),_(
"Error"),wxOK|wxICON_ERROR);
1764 wxString currentDir = wxConfigBase::Get()->Read(wxT(
"/actualPath"), wxT(
""));
1765 wxFileDialog dlg(wxGetActiveWindow(), _(
"Open Papywizard xml file"),
1766 currentDir, wxT(
""), _(
"Papywizard xml files (*.xml)|*.xml|All files (*)|*"),
1767 wxFD_OPEN, wxDefaultPosition);
1768 dlg.SetDirectory(currentDir);
1769 if (dlg.ShowModal() == wxID_OK)
1771 wxConfigBase::Get()->Write(wxT(
"/actualPath"), dlg.GetDirectory());
1779 wxConfigBase* config = wxConfigBase::Get();
1781 wxFileDialog dlg(wxGetActiveWindow(),
1782 _(
"Choose template project"),
1783 config->Read(wxT(
"/templatePath"),wxT(
"")), wxT(
""),
1784 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
1785 wxFD_OPEN, wxDefaultPosition);
1786 dlg.SetDirectory(wxConfigBase::Get()->Read(wxT(
"/templatePath"),wxT(
"")));
1787 if (dlg.ShowModal() == wxID_OK) {
1788 wxString filename = dlg.GetPath();
1789 wxConfig::Get()->Write(wxT(
"/templatePath"), dlg.GetDirectory());
1801 #if defined __WXMAC__ && defined MAC_SELF_CONTAINED_BUNDLE
1805 FSRef actuallyLaunched;
1807 FSRef documentArray[1];
1808 LSLaunchFSRefSpec launchSpec;
1811 err = LSFindApplicationForInfo(kLSUnknownCreator,
1812 CFSTR(
"net.sourceforge.hugin.PTBatcherGUI"),
1818 wxMessageBox(wxString::Format(_(
"External program %s not found in the bundle, reverting to system path"), wxT(
"open")), _(
"Error"));
1820 wxExecute(_T(
"open -b net.sourceforge.hugin.PTBatcherGUI"));
1823 wxExecute(_T(
"open -b net.sourceforge.hugin.PTBatcherGUI"));
1826 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
1827 wxExecute(exePath.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + _T(
"PTBatcherGUI"));
1839 std::set<unsigned int> unoptimized;
1840 for (
unsigned int i=0; i < cps.size(); i++) {
1842 unoptimized.insert(i);
1845 unsigned int nGood=0;
1846 unsigned int nBad=0;
1848 wxConfigBase *cfg = wxConfigBase::Get();
1858 ProgressReporterDialog progress(unoptimized.size(), _(
"Fine-tuning all points"), _(
"Fine-tuning"), wxGetActiveWindow());
1860 ImageCache & imgCache = ImageCache::getInstance();
1866 std::set<unsigned int>::iterator it=unoptimized.begin();
1868 imgCache.softFlush();
1870 while (it != unoptimized.end()) {
1871 if (cps[*it].image1Nr == imgNr || cps[*it].image2Nr == imgNr) {
1872 if (!progress.updateDisplayValue())
1879 wxImage wxSearchImg;
1881 pano.
getImage(cps[*it].image2Nr).getFilename())->get8BitImage();
1884 pano.
getImage(cps[*it].image1Nr).getFilename())->get8BitImage();
1891 pano.
getImage(cps[*it].image2Nr), *searchImg, roundP2, sWidth);
1899 if (res.
maxi < corrThresh || res.
curv.
x < curvThresh || res.
curv.
y < curvThresh ||
1904 if (res.
maxi >= corrThresh) {
1907 cps[*it].error = res.
maxi;
1916 cps[*it].error = res.
maxi;
1922 cps[*it].error = 1.0;
1924 unsigned int rm = *it;
1926 unoptimized.erase(rm);
1935 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"),
1936 nGood, nBad, corrThresh);
1937 wxMessageBox(result, _(
"Fine-tune result"), wxOK);
1954 wxMessageBox(wxString::Format(_(
"Removed %lu control points"), static_cast<unsigned long>(cps.size())),
1955 _(
"Removing control points in masks"),wxOK|wxICON_INFORMATION);
1960 void MainFrame::OnPythonScript(wxCommandEvent & e)
1963 wxFileDialog dlg(wxGetActiveWindow(),
1964 _(
"Select python script"),
1965 wxConfigBase::Get()->Read(wxT(
"/lensPath"),wxT(
"")), wxT(
""),
1966 _(
"Python script (*.py)|*.py|All files (*.*)|*.*"),
1967 wxFD_OPEN, wxDefaultPosition);
1968 dlg.SetDirectory(wxConfigBase::Get()->Read(wxT(
"/pythonScriptPath"),wxT(
"")));
1970 if (dlg.ShowModal() == wxID_OK)
1972 wxString filename = dlg.GetPath();
1973 wxConfig::Get()->Write(wxT(
"/pythonScriptPath"), dlg.GetDirectory());
1976 new PanoCommand::PythonScriptPanoCmd(
pano,scriptfile)
1981 void MainFrame::OnPlugin(wxCommandEvent & e)
1983 wxFileName file=m_plugins[e.GetId()];
1984 if(file.FileExists())
1988 new PanoCommand::PythonScriptPanoCmd(
pano,scriptfile)
1993 wxMessageBox(wxString::Format(wxT(
"Python-Script %s not found.\nStopping processing."),file.GetFullPath().c_str()),_(
"Warning"),wxOK|wxICON_INFORMATION);
2049 if (switchToCropMode)
2081 msg = wxGetTranslation(wxString(
m_message.c_str(), wxConvLocal));
2084 msg.Append(wxT(
" "));
2088 GetStatusBar()->SetStatusText(msg, 0);
2097 wxToolBar* theToolBar = GetToolBar();
2098 theToolBar->EnableTool(XRCID(
"action_optimize"), option);
2099 theToolBar->EnableTool(XRCID(
"ID_SHOW_PREVIEW_FRAME"), option);
2101 wxMenuBar* theMenuBar = GetMenuBar();
2102 theMenuBar->Enable(XRCID(
"action_optimize"), option);
2103 theMenuBar->Enable(XRCID(
"action_finetune_all_cp"), option);
2104 theMenuBar->Enable(XRCID(
"action_remove_cp_in_masks"), option);
2105 theMenuBar->Enable(XRCID(
"ID_SHOW_PREVIEW_FRAME"), option);
2106 theMenuBar->Enable(XRCID(
"action_stitch"), option);
2107 theMenuBar->Enable(XRCID(
"action_stitch_userdefined"), option);
2116 theMenuBar->Enable(XRCID(
"action_assistant"), option);
2117 theMenuBar->Enable(XRCID(
"action_batch_assistant"), option);
2126 wxSize sz = this->GetSize();
2127 wxSize csz = this->GetClientSize();
2128 wxSize vsz = this->GetVirtualSize();
2130 " client: "<< csz.x <<
"," << csz.y <<
2131 " virtual: "<< vsz.x <<
"," << vsz.y);
2165 return wxGetApp().GetDataPath();
2192 size_t index = e.GetId() - wxID_FILE1;
2193 wxString f(
m_mruFiles.GetHistoryFile(index));
2197 if (fn.FileExists())
2203 ImageCache::getInstance().flush();
2211 wxMessageBox(wxString::Format(_(
"File \"%s\" not found.\nMaybe file was renamed, moved or deleted."),f.c_str()),
2212 _(
"Error!"),wxOK | wxICON_INFORMATION );
2219 ShowFullScreen(!IsFullScreen(), wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION);
2222 GetToolBar()->Show(
true);
2237 if (! wxFile::Exists(wxstrModelFileName) ) {
2238 wxMessageBox(wxString::Format(_(
"Celeste model expected in %s not found, Hugin needs to be properly installed."),wxstrModelFileName.c_str()), _(
"Fatal Error"));
2243 wxMessageBox(wxString::Format(_(
"Could not load Celeste model file %s"),wxstrModelFileName.c_str()),_(
"Error"));
2264 bool needsUpdateOptimizerVar=
false;
2266 for(
size_t i=0; i<optVec.size(); i++)
2268 bool hasTrX=optVec[i].erase(
"TrX")>0;
2269 bool hasTrY=optVec[i].erase(
"TrY")>0;
2270 bool hasTrZ=optVec[i].erase(
"TrZ")>0;
2271 bool hasTpy=optVec[i].erase(
"Tpy")>0;
2272 bool hasTpp=optVec[i].erase(
"Tpp")>0;
2273 bool hasg=optVec[i].erase(
"g")>0;
2274 bool hast=optVec[i].erase(
"t")>0;
2275 needsUpdateOptimizerVar=needsUpdateOptimizerVar || hasTrX || hasTrY || hasTrZ || hasTpy || hasTpp || hasg || hast;
2277 if(needsUpdateOptimizerVar)
2286 bool needsUpdateOptimizerVar=
false;
2288 for(
size_t i=0; i<optVec.size(); i++)
2290 bool hasVx=optVec[i].erase(
"Vx")>0;
2291 bool hasVy=optVec[i].erase(
"Vy")>0;
2292 needsUpdateOptimizerVar=needsUpdateOptimizerVar || hasVx || hasVy;
2294 if(needsUpdateOptimizerVar)
2313 GetMenuBar()->FindItem(XRCID(
"action_gui_simple"))->Check();
2316 GetMenuBar()->FindItem(XRCID(
"action_gui_advanced"))->Check();
2319 GetMenuBar()->FindItem(XRCID(
"action_gui_expert"))->Check();
2326 wxCommandEvent dummy;
2330 GetMenuBar()->Remove(0);
2335 SetTitle(_(
"Panorama editor"));
2340 gl_preview_frame->SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Stitcher"));
2341 SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Panorama editor"));
2347 wxGetApp().SetTopWindow(
this);
2348 GetMenuBar()->Remove(0);
2352 SetTitle(_(
"Hugin - Panorama Stitcher"));
2357 SetTitle(scriptName.GetName() + wxT(
".") + scriptName.GetExt() + wxT(
" - ") + _(
"Hugin - Panorama Stitcher"));
2377 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."),
2383 wxOK | wxICON_INFORMATION);
2387 wxMessageBox(_(
"Can't switch to simple interface. The project is using translation or shear parameters.\nThese parameters are not supported in simple interface."),
2393 wxOK | wxICON_INFORMATION);
2408 wxMessageBox(_(
"Can't switch to advanced interface. The project is using translation or shear parameters.\nThese parameters are not supported in advanced interface."),
2414 wxOK | wxICON_INFORMATION);
2426 GetMenuBar()->Enable(XRCID(
"ID_SHOW_GL_PREVIEW_FRAME"),
false);
2427 GetMenuBar()->Enable(XRCID(
"action_gui_simple"),
false);
2428 GetToolBar()->EnableTool(XRCID(
"ID_SHOW_GL_PREVIEW_FRAME"),
false);
2434 wxString tempDir= wxConfig::Get()->Read(wxT(
"tempDir"),wxT(
""));
2435 if(!tempDir.IsEmpty())
2437 if(tempDir.Last()!=wxFileName::GetPathSeparator())
2439 tempDir.Append(wxFileName::GetPathSeparator());
2442 wxFileName scriptFileName(wxFileName::CreateTempFileName(tempDir+wxT(
"ha")));
2447 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
2448 wxArrayString tempfiles;
2450 if (userdefinedAssistant.IsEmpty())
2456 std::stringstream errors;
2458 if (commands->empty())
2460 wxMessageBox(_(
"The assistant queue is empty. This indicates an error in the user defined assistant file.") +
"\n\n" + wxString(errors.str()),
2461 _(
"Error"), wxOK | wxICON_ERROR, mainWin);
2463 wxRemoveFile(scriptFileName.GetFullPath());
2476 wxRemoveFile(scriptFileName.GetFullPath());
2477 if (!tempfiles.IsEmpty())
2479 for (
auto& f : tempfiles)
2494 if (userdefinedAssistant.IsEmpty())
2498 wxMessageBox(_(
"The assistant could not find vertical lines. Please add vertical lines in the panorama editor and optimize project manually."),
2499 _(
"Warning"), wxOK | wxICON_INFORMATION, mainWin);
2506 if (comps.size() > 1)
2509 unsigned i1 = *(comps[0].rbegin());
2510 unsigned i2 = *(comps[1].begin());
2513 wxMessageBox(wxString::Format(_(
"Warning %d unconnected image groups found:"), static_cast<int>(comps.size())) +
Components2Str(comps) + wxT(
"\n")
2514 + _(
"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);
2517 wxMessageBox(_(
"The assistant did not complete successfully. Please check the resulting project file."),
2518 _(
"Warning"), wxOK | wxICON_INFORMATION, mainWin);
2523 wxMessageBox(_(
"The assistant did not complete successfully. Please check the resulting project file."),
2524 _(
"Warning"), wxOK | wxICON_INFORMATION, mainWin);
2549 wxCommandEvent dummy;
2554 #if defined __WXMAC__ && defined MAC_SELF_CONTAINED_BUNDLE
2558 FSRef actuallyLaunched;
2560 FSRef documentArray[1];
2561 LSLaunchFSRefSpec launchSpec;
2564 err = LSFindApplicationForInfo(kLSUnknownCreator,
2565 CFSTR(
"net.sourceforge.hugin.PTBatcherGUI"),
2572 wxMessageBox(wxString::Format(_(
"External program %s not found in the bundle, reverting to system path"), wxT(
"open")), _(
"Error"));
2578 wxCharBuffer projectFilebuffer=projectFile.ToUTF8();
2580 err = FSPathMakeRef((
unsigned char*) projectFilebuffer.data(), &documentArray[0], &isDir);
2581 if (err != noErr || isDir)
2584 wxMessageBox(wxString::Format(_(
"Project file not found"), wxT(
"open")), _(
"Error"));
2587 launchSpec.appRef = &appRef;
2588 launchSpec.numDocs =
sizeof(documentArray)/
sizeof(documentArray[0]);
2589 launchSpec.itemRefs = documentArray;
2590 launchSpec.passThruParams = NULL;
2591 launchSpec.launchFlags = kLSLaunchDontAddToRecents + kLSLaunchDontSwitch;
2592 launchSpec.asyncRefCon = NULL;
2594 err = LSOpenFromRefSpec(&launchSpec, &actuallyLaunched);
2595 if (err != noErr && err != kLSLaunchInProgressErr)
2599 wxMessageBox(wxString::Format(_(
"Can't launch PTBatcherGui"), wxT(
"open")), _(
"Error"));
2604 if (FSCompareFSRefs(&appRef, &actuallyLaunched) != noErr)
2607 wxMessageBox(wxString::Format(_(
"Launched incorrect programme"), wxT(
"open")), _(
"Error"));
2611 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
2612 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 OnMRUFiles(wxCommandEvent &e)
event handler for recently used files
void OnFAQ(wxCommandEvent &e)
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...