From: <ad...@us...> - 2009-12-14 20:37:34
|
Revision: 4806 http://hugin.svn.sourceforge.net/hugin/?rev=4806&view=rev Author: ade_br Date: 2009-12-14 20:37:26 +0000 (Mon, 14 Dec 2009) Log Message: ----------- i18n: Don't i18n 0 values (literal constant) Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp hugin/trunk/src/hugin1/hugin/PreviewFrame.cpp Modified: hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp 2009-12-14 17:09:44 UTC (rev 4805) +++ hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp 2009-12-14 20:37:26 UTC (rev 4806) @@ -314,7 +314,7 @@ // wxArtProvider::GetBitmap(wxART_GO_BACK)); // blendModeSizer->Add(m_decExposureBut); - m_exposureTextCtrl = new wxTextCtrl(this, ID_EXPOSURE_TEXT, _("0"), + m_exposureTextCtrl = new wxTextCtrl(this, ID_EXPOSURE_TEXT, wxT("0"), wxDefaultPosition,wxSize(50,-1), wxTE_PROCESS_ENTER); blendModeSizer->Add(m_exposureTextCtrl, 0, // not vertically strechable Modified: hugin/trunk/src/hugin1/hugin/PreviewFrame.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewFrame.cpp 2009-12-14 17:09:44 UTC (rev 4805) +++ hugin/trunk/src/hugin1/hugin/PreviewFrame.cpp 2009-12-14 20:37:26 UTC (rev 4806) @@ -301,7 +301,7 @@ 0, // not vertically strechable wxALL | wxALIGN_CENTER_VERTICAL, // draw border all around 5); // border width - m_projParamTextCtrl[i] = new wxTextCtrl(this, PROJ_PARAM_VAL_ID+i, _("0"), + m_projParamTextCtrl[i] = new wxTextCtrl(this, PROJ_PARAM_VAL_ID+i, wxT("0"), wxDefaultPosition,wxDefaultSize, wxTE_PROCESS_ENTER); m_projParamSizer->Add(m_projParamTextCtrl[i], 0, // not vertically strechable This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <har...@us...> - 2009-12-14 20:47:57
|
Revision: 4809 http://hugin.svn.sourceforge.net/hugin/?rev=4809&view=rev Author: harryvanderwolf Date: 2009-12-14 20:47:47 +0000 (Mon, 14 Dec 2009) Log Message: ----------- [OSX] "fine tune" fix 4789 Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/AboutDialog.cpp hugin/trunk/src/hugin1/hugin/NumTransDialog.cpp Modified: hugin/trunk/src/hugin1/hugin/AboutDialog.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/AboutDialog.cpp 2009-12-14 20:38:35 UTC (rev 4808) +++ hugin/trunk/src/hugin1/hugin/AboutDialog.cpp 2009-12-14 20:47:47 UTC (rev 4809) @@ -32,12 +32,7 @@ #include "hugin/huginApp.h" #include <hugin_version.h> -// more vigra include if needed -#include "vigra/cornerdetection.hxx" -#include "vigra/localminmax.hxx" -#include "vigra_ext/Correlation.h" - BEGIN_EVENT_TABLE(AboutDialog, wxDialog) EVT_BUTTON(XRCID("about_me"), AboutDialog::OnAboutMe) END_EVENT_TABLE() Modified: hugin/trunk/src/hugin1/hugin/NumTransDialog.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/NumTransDialog.cpp 2009-12-14 20:38:35 UTC (rev 4808) +++ hugin/trunk/src/hugin1/hugin/NumTransDialog.cpp 2009-12-14 20:47:47 UTC (rev 4809) @@ -35,8 +35,6 @@ #include "hugin/NumTransDialog.h" #include "common/wxPlatform.h" -#include "base_wx/platform.h" -#include <wx/glcanvas.h> #include "hugin/huginApp.h" #include "hugin/CommandHistory.h" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2009-12-30 09:56:08
|
Revision: 4842 http://hugin.svn.sourceforge.net/hugin/?rev=4842&view=rev Author: tmodes Date: 2009-12-30 09:55:59 +0000 (Wed, 30 Dec 2009) Log Message: ----------- Added stack aware cp detector setting Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.h hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc Modified: hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp 2009-12-28 22:36:02 UTC (rev 4841) +++ hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp 2009-12-30 09:55:59 UTC (rev 4842) @@ -110,16 +110,9 @@ } -CPVector AutoCtrlPointCreator::automatch(CPDetectorSetting &setting, - Panorama & pano, - const UIntSet & imgs, - int nFeatures, - wxWindow *parent) +bool CanStartProg(wxString progName,wxWindow* parent) { - CPVector cps; - int t = setting.GetType(); - //check, if the cp generator exists - wxFileName prog(setting.GetProg()); + wxFileName prog(progName); bool canStart=false; if(prog.IsAbsolute()) { @@ -129,7 +122,7 @@ { wxPathList pathlist; pathlist.AddEnvList(wxT("PATH")); - wxString path = pathlist.FindAbsoluteValidPath(setting.GetProg()); + wxString path = pathlist.FindAbsoluteValidPath(progName); if(path.IsEmpty()) canStart=false; else @@ -139,27 +132,57 @@ }; }; if(!canStart) - { wxMessageBox(wxString::Format( - _("Could not find \"%s\" in path.\nMaybe you have not installed it properly or given a wrong path in the settings."),setting.GetProg().c_str()), + _("Could not find \"%s\" in path.\nMaybe you have not installed it properly or given a wrong path in the settings."),progName.c_str()), _("Error"),wxOK | wxICON_INFORMATION,parent); + return canStart; +}; + +CPVector AutoCtrlPointCreator::automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, + int nFeatures, wxWindow *parent) +{ + int return_value; + return automatch(setting,pano,imgs,nFeatures,return_value,parent); +}; + +CPVector AutoCtrlPointCreator::automatch(CPDetectorSetting &setting, + Panorama & pano, + const UIntSet & imgs, + int nFeatures, + int & ret_value, + wxWindow *parent) +{ + CPVector cps; + CPDetectorType t = setting.GetType(); + //check, if the cp generator exists + if(!CanStartProg(setting.GetProg(),parent)) return cps; - }; + if(t==CPDetector_AutoPanoSiftStack) + if(!setting.GetProgStack().IsEmpty()) + if(!CanStartProg(setting.GetProgStack(),parent)) + return cps; switch (t) { - case 0: + case CPDetector_AutoPano: { // autopano@kolor AutoPanoKolor matcher; - cps = matcher.automatch(setting, pano, imgs, nFeatures, parent); + cps = matcher.automatch(setting, pano, imgs, nFeatures, ret_value, parent); break; } - case 1: + case CPDetector_AutoPanoSift: { // autopano-sift AutoPanoSift matcher; - cps = matcher.automatch(setting, pano, imgs, nFeatures, parent); + cps = matcher.automatch(setting, pano, imgs, nFeatures, ret_value, parent); break; } + case CPDetector_AutoPanoSiftStack: + { + // autopano-sift with stacks + AutoPanoSiftStack matcher; + cps = matcher.automatch(setting, pano, imgs, nFeatures, ret_value, parent); + break; + } default: DEBUG_ERROR("Invalid autopano type"); } @@ -167,7 +190,7 @@ } CPVector AutoPanoSift::automatch(CPDetectorSetting &setting, Panorama & pano, const UIntSet & imgs, - int nFeatures, wxWindow *parent) + int nFeatures, int & ret_value, wxWindow *parent) { CPVector cps; if (imgs.size() == 0) { @@ -281,16 +304,18 @@ return cps; } - int ret = 0; + ret_value = 0; // use MyExternalCmdExecDialog - ret = MyExecuteCommandOnDialog(autopanoExe, autopanoArgs, parent, _("finding control points")); + ret_value = MyExecuteCommandOnDialog(autopanoExe, autopanoArgs, parent, _("finding control points")); - if (ret == -1) { + if (ret_value == HUGIN_EXIT_CODE_CANCELLED) { + return cps; + } else if (ret_value == -1) { wxMessageBox( wxString::Format(_("Could not execute command: %s"),cmd.c_str()), _("wxExecute Error"), wxOK | wxICON_ERROR, parent); return cps; - } else if (ret > 0) { - wxMessageBox(wxString::Format(_("Command: %s\nfailed with error code: %d"),cmd.c_str(),ret), + } else if (ret_value > 0) { + wxMessageBox(wxString::Format(_("Command: %s\nfailed with error code: %d"),cmd.c_str(),ret_value), _("wxExecute Error"), wxOK | wxICON_ERROR, parent); return cps; } @@ -327,7 +352,7 @@ CPVector AutoPanoKolor::automatch(CPDetectorSetting &setting, Panorama & pano, const UIntSet & imgs, - int nFeatures, wxWindow *parent) + int nFeatures, int & ret_value, wxWindow *parent) { CPVector cps; wxString autopanoExe = setting.GetProg(); @@ -385,18 +410,18 @@ return cps; } - int ret = 0; + ret_value = 0; // use MyExternalCmdExecDialog - ret = MyExecuteCommandOnDialog(autopanoExe, autopanoArgs, parent, _("finding control points")); + ret_value = MyExecuteCommandOnDialog(autopanoExe, autopanoArgs, parent, _("finding control points")); - if (ret == HUGIN_EXIT_CODE_CANCELLED) { + if (ret_value == HUGIN_EXIT_CODE_CANCELLED) { return cps; - } else if (ret == -1) { + } else if (ret_value == -1) { wxMessageBox( wxString::Format(_("Could not execute command: %s"),cmd.c_str()), _("wxExecute Error"), wxOK | wxICON_ERROR, parent); return cps; - } else if (ret > 0) { - wxMessageBox(wxString::Format(_("Command: %s\nfailed with error code: %d"),cmd.c_str(),ret), + } else if (ret_value > 0) { + wxMessageBox(wxString::Format(_("Command: %s\nfailed with error code: %d"),cmd.c_str(),ret_value), _("wxExecute Error"), wxOK | wxICON_ERROR, parent); return cps; } @@ -417,4 +442,100 @@ return cps; } +struct img_ev +{ + unsigned int img_nr; + double ev; +}; +struct stack_img +{ + unsigned int layer_nr; + std::vector<img_ev> images; +}; +bool sort_img_ev (img_ev i1, img_ev i2) { return (i1.ev<i2.ev); }; +CPVector AutoPanoSiftStack::automatch(CPDetectorSetting &setting, Panorama & pano, const UIntSet & imgs, + int nFeatures, int & ret_value, wxWindow *parent) +{ + CPVector cps; + if (imgs.size() == 0) { + return cps; + }; + std::vector<stack_img> stack_images; + HuginBase::StandardImageVariableGroups* variable_groups = new HuginBase::StandardImageVariableGroups(pano); + for(UIntSet::const_iterator it = imgs.begin(); it != imgs.end(); it++) + { + unsigned int stack_nr=variable_groups->getStacks().getPartNumber(*it); + //check, if this stack is already in list + bool found=false; + unsigned int index=0; + for(index=0;index<stack_images.size();index++) + { + found=(stack_images[index].layer_nr==stack_nr); + if(found) + break; + }; + if(!found) + { + //new stack + stack_images.resize(stack_images.size()+1); + index=stack_images.size()-1; + //add new stack + stack_images[index].layer_nr=stack_nr; + }; + //add new image + unsigned int new_image_index=stack_images[index].images.size(); + stack_images[index].images.resize(new_image_index+1); + stack_images[index].images[new_image_index].img_nr=*it; + stack_images[index].images[new_image_index].ev=pano.getImage(*it).getExposure(); + }; + delete variable_groups; + //get image with median exposure for search with cp generator + UIntSet images_layer; + for(unsigned int i=0;i<stack_images.size();i++) + { + std::sort(stack_images[i].images.begin(),stack_images[i].images.end(),sort_img_ev); + unsigned int median=stack_images[i].images.size() / 2; + images_layer.insert(stack_images[i].images[median].img_nr); + }; + //generate cp for median exposure + ret_value=0; + if(images_layer.size()>1) + { + AutoPanoSift matcher; + cps=matcher.automatch(setting, pano, images_layer, nFeatures, ret_value, parent); + if(ret_value!=0) + return cps; + }; + //now work on all stacks + if(!setting.GetProgStack().IsEmpty()) + { + CPDetectorSetting stack_setting; + stack_setting.SetType(CPDetector_AutoPanoSift); + stack_setting.SetProg(setting.GetProgStack()); + stack_setting.SetArgs(setting.GetArgsStack()); + + for(unsigned int i=0;i<stack_images.size();i++) + { + UIntSet images_stack; + images_stack.clear(); + for(unsigned int j=0;j<stack_images[i].images.size();j++) + images_stack.insert(stack_images[i].images[j].img_nr); + if(images_stack.size()>1) + { + AutoPanoSift matcher; + CPVector new_cps=matcher.automatch(stack_setting, pano, images_stack, nFeatures, ret_value, parent); + if(new_cps.size()>0) + { + unsigned int old_size=cps.size(); + cps.resize(old_size+new_cps.size()); + for(unsigned int k=0;k<new_cps.size();k++) + cps[old_size+k]=new_cps[k]; + }; + if(ret_value!=0) + return cps; + }; + }; + } + return cps; +}; Modified: hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.h =================================================================== --- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.h 2009-12-28 22:36:02 UTC (rev 4841) +++ hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.h 2009-12-30 09:55:59 UTC (rev 4842) @@ -48,6 +48,8 @@ * on the matcher selected */ virtual CPVector automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, + int nFeatures, int & ret_value, wxWindow *parent=NULL); + virtual CPVector automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, int nFeatures, wxWindow *parent=NULL); protected: @@ -72,7 +74,7 @@ virtual ~AutoPanoSift() {} ; virtual CPVector automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, - int nFeatures, wxWindow *parent=NULL); + int nFeatures, int & ret_value, wxWindow *parent=NULL); private: @@ -93,13 +95,33 @@ virtual ~AutoPanoKolor() {} ; virtual CPVector automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, - int nFeatures, wxWindow *parent=NULL); + int nFeatures, int & ret_value, wxWindow *parent=NULL); private: }; +/** A matcher that uses Sebastians Nowozin's excellent sift matcher and considers stacks */ +class AutoPanoSiftStack : public AutoCtrlPointCreator +{ +public: + /** ctor. + */ + AutoPanoSiftStack() {}; + /** dtor. + */ + virtual ~AutoPanoSiftStack() {} ; + + virtual CPVector automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, + int nFeatures, int & ret_value, wxWindow *parent=NULL); + +private: + + +}; + + #endif // _AUTOCTRLPOINTCREATOR_H Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp 2009-12-28 22:36:02 UTC (rev 4841) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp 2009-12-30 09:55:59 UTC (rev 4842) @@ -144,16 +144,36 @@ desc=default_cpdetectors[new_type].desc; prog=default_cpdetectors[new_type].prog; args=default_cpdetectors[new_type].args; + if(type==CPDetector_AutoPanoSiftStack) + { + prog_stack=default_cpdetectors[new_type].prog_stack; + args_stack=default_cpdetectors[new_type].args_stack; + } + else + { + prog_stack=wxEmptyString; + args_stack=wxEmptyString; + }; }; }; }; void CPDetectorSetting::Read(wxConfigBase *config, wxString path) { - type=config->Read(path+wxT("/Type"),default_cpdetectors[0].type); + type=(CPDetectorType)config->Read(path+wxT("/Type"),default_cpdetectors[0].type); desc=config->Read(path+wxT("/Description"),default_cpdetectors[0].desc); prog=config->Read(path+wxT("/Program"),default_cpdetectors[0].prog); args=config->Read(path+wxT("/Arguments"),default_cpdetectors[0].args); + if(type==CPDetector_AutoPanoSiftStack) + { + prog_stack=config->Read(path+wxT("/ProgramStack"),default_cpdetectors[0].prog_stack); + args_stack=config->Read(path+wxT("/ArgumentsStack"),default_cpdetectors[0].args_stack); + } + else + { + prog_stack=wxEmptyString; + args_stack=wxEmptyString; + }; }; void CPDetectorSetting::Write(wxConfigBase *config, wxString path) @@ -162,6 +182,11 @@ config->Write(path+wxT("/Description"),desc); config->Write(path+wxT("/Program"),prog); config->Write(path+wxT("/Arguments"),args); + if(type==CPDetector_AutoPanoSiftStack) + { + config->Write(path+wxT("/ProgramStack"),prog_stack); + config->Write(path+wxT("/ArgumentsStack"),args_stack); + }; }; // dialog for showing settings of one autopano setting @@ -169,6 +194,8 @@ BEGIN_EVENT_TABLE(CPDetectorDialog,wxDialog) EVT_BUTTON(wxID_OK, CPDetectorDialog::OnOk) EVT_BUTTON(XRCID("prefs_cpdetector_program_select"),CPDetectorDialog::OnSelectPath) + EVT_BUTTON(XRCID("prefs_cpdetector_program_stack_select"),CPDetectorDialog::OnSelectPathStack) + EVT_CHOICE(XRCID("prefs_cpdetector_type"),CPDetectorDialog::OnTypeChange) END_EVENT_TABLE() CPDetectorDialog::CPDetectorDialog(wxWindow* parent) @@ -187,8 +214,11 @@ m_edit_desc = XRCCTRL(*this, "prefs_cpdetector_desc", wxTextCtrl); m_edit_prog = XRCCTRL(*this, "prefs_cpdetector_program", wxTextCtrl); m_edit_args = XRCCTRL(*this, "prefs_cpdetector_args", wxTextCtrl); + m_edit_prog_stack = XRCCTRL(*this, "prefs_cpdetector_program_stack", wxTextCtrl); + m_edit_args_stack = XRCCTRL(*this, "prefs_cpdetector_args_stack", wxTextCtrl); m_cpdetector_type = XRCCTRL(*this, "prefs_cpdetector_type", wxChoice); m_cpdetector_type->SetSelection(1); + ChangeType(); }; CPDetectorDialog::~CPDetectorDialog() @@ -210,6 +240,9 @@ valid=valid && (m_edit_desc->GetValue().Trim().Len()>0); valid=valid && (m_edit_prog->GetValue().Trim().Len()>0); valid=valid && (m_edit_args->GetValue().Trim().Len()>0); + if(m_cpdetector_type->GetSelection()==CPDetector_AutoPanoSiftStack) + if(m_edit_prog_stack->GetValue().Trim().Len()>0) + valid=valid && (m_edit_args_stack->GetValue().Trim().Len()>0); if(valid) this->EndModal(wxOK); else @@ -222,7 +255,13 @@ m_edit_desc->SetValue(cpdet_config->settings[index].GetCPDetectorDesc()); m_edit_prog->SetValue(cpdet_config->settings[index].GetProg()); m_edit_args->SetValue(cpdet_config->settings[index].GetArgs()); + if(cpdet_config->settings[index].GetType()==CPDetector_AutoPanoSiftStack) + { + m_edit_prog_stack->SetValue(cpdet_config->settings[index].GetProgStack()); + m_edit_args_stack->SetValue(cpdet_config->settings[index].GetArgsStack()); + }; m_cpdetector_type->SetSelection(cpdet_config->settings[index].GetType()); + ChangeType(); }; void CPDetectorDialog::UpdateSettings(CPDetectorConfig* cpdet_config,int index) @@ -230,16 +269,34 @@ cpdet_config->settings[index].SetCPDetectorDesc(m_edit_desc->GetValue().Trim()); cpdet_config->settings[index].SetProg(m_edit_prog->GetValue().Trim()); cpdet_config->settings[index].SetArgs(m_edit_args->GetValue().Trim()); - cpdet_config->settings[index].SetType(m_cpdetector_type->GetSelection()); + cpdet_config->settings[index].SetType((CPDetectorType)m_cpdetector_type->GetSelection()); + if(cpdet_config->settings[index].GetType()==CPDetector_AutoPanoSiftStack) + { + cpdet_config->settings[index].SetProgStack(m_edit_prog_stack->GetValue().Trim()); + cpdet_config->settings[index].SetArgsStack(m_edit_args_stack->GetValue().Trim()); + }; }; +void CPDetectorDialog::OnTypeChange(wxCommandEvent &e) +{ + ChangeType(); +}; + +void CPDetectorDialog::ChangeType() +{ + wxPanel* panel=XRCCTRL(*this,"panel_stack",wxPanel); + panel->Show(m_cpdetector_type->GetSelection()==CPDetector_AutoPanoSiftStack); + panel->Enable(m_cpdetector_type->GetSelection()==CPDetector_AutoPanoSiftStack); + Layout(); +}; + void CPDetectorDialog::OnSelectPath(wxCommandEvent &e) { wxFileName executable(m_edit_prog->GetValue()); #ifdef MAC_SELF_CONTAINED_BUNDLE wxString autopanoPath = MacGetPathToUserAppSupportAutoPanoFolder(); #endif - wxFileDialog dlg(this,_("Select Autopano program"), + wxFileDialog dlg(this,_("Select control point detector program"), #ifdef MAC_SELF_CONTAINED_BUNDLE autopanoPath, #else @@ -255,3 +312,26 @@ if (dlg.ShowModal() == wxID_OK) m_edit_prog->SetValue(dlg.GetPath()); }; + +void CPDetectorDialog::OnSelectPathStack(wxCommandEvent &e) +{ + wxFileName executable(m_edit_prog_stack->GetValue()); +#ifdef MAC_SELF_CONTAINED_BUNDLE + wxString autopanoPath = MacGetPathToUserAppSupportAutoPanoFolder(); +#endif + wxFileDialog dlg(this,_("Select control point detector program"), +#ifdef MAC_SELF_CONTAINED_BUNDLE + autopanoPath, +#else + executable.GetPath(), +#endif + executable.GetFullName(), +#ifdef __WXMSW__ + _("Executables (*.exe,*.vbs,*.cmd, *.bat)|*.exe;*.vbs;*.cmd;*.bat"), +#else + wxT(""), +#endif + wxOPEN, wxDefaultPosition); + if (dlg.ShowModal() == wxID_OK) + m_edit_prog_stack->SetValue(dlg.GetPath()); +}; Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h 2009-12-28 22:36:02 UTC (rev 4841) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h 2009-12-30 09:55:59 UTC (rev 4842) @@ -34,6 +34,13 @@ #include <wx/dynarray.h> +enum CPDetectorType +{ + CPDetector_AutoPano=0, + CPDetector_AutoPanoSift=1, + CPDetector_AutoPanoSiftStack=2 +}; + /** class, which stores all settings of one cp detector */ class CPDetectorSetting { @@ -60,12 +67,20 @@ /** sets arguments of this setting */ void SetArgs(wxString new_args) { args=new_args; }; /** return type of this setting */ - const int GetType() {return type; }; + const CPDetectorType GetType() {return type; }; /** sets type of this setting */ - void SetType(int new_type) { type=new_type;}; + void SetType(CPDetectorType new_type) { type=new_type;}; + /** return program name, which works on stacks */ + const wxString GetProgStack() {return prog_stack; }; + /** sets program for detecting cp in stacks */ + void SetProgStack(wxString new_prog) { prog_stack=new_prog; }; + /** return arguments of program for detection of cp in stacks */ + const wxString GetArgsStack() {return args_stack; }; + /** sets arguments of program for detection of cp in stacks */ + void SetArgsStack(wxString new_args) { args_stack=new_args; }; private: - int type; - wxString desc,prog,args; + CPDetectorType type; + wxString desc, prog, args, prog_stack, args_stack; }; WX_DECLARE_OBJARRAY(CPDetectorSetting,ArraySettings); @@ -126,10 +141,15 @@ void OnOk(wxCommandEvent & e); /** select program with file open dialog */ void OnSelectPath(wxCommandEvent &e); + /** select program for stack with file open dialog */ + void OnSelectPathStack(wxCommandEvent &e); + /** update dialog, when other cp detector type is changed */ + void OnTypeChange(wxCommandEvent &e); private: - wxTextCtrl *m_edit_desc, *m_edit_prog, *m_edit_args; + wxTextCtrl *m_edit_desc, *m_edit_prog, *m_edit_args, *m_edit_prog_stack, *m_edit_args_stack; wxChoice *m_cpdetector_type; + void ChangeType(); DECLARE_EVENT_TABLE(); }; Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h 2009-12-28 22:36:02 UTC (rev 4841) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h 2009-12-30 09:55:59 UTC (rev 4842) @@ -34,34 +34,42 @@ /** struct to save the default setting of one CP detector */ struct cpdetector_default { + /** cp detector type */ + CPDetectorType type; /** name, which is shown in GUI */ wxString desc; /** program name */ wxString prog; /** arguments of the detector */ wxString args; - /** type: 0 - autopano von Alexandre Jenny, 1 - autopano-sift-c, panomatic, match-n-shift,... */ - int type; + /** program name of cp detector for stacks */ + wxString prog_stack; + /** arguments of cp detector for stacks */ + wxString args_stack; }; /** this array saves all default settings */ const struct cpdetector_default default_cpdetectors[]= { -/* use following order: {description, program name, arguments, type, custom } +/* use following order: {type, description, program name, arguments, program name stack, arguments stack} attention: this array have to contain at least one item */ #if defined WIN32 - {wxT("Autopano-SIFT-C"),wxT("autopano-sift-c.exe"),wxT("--maxmatches %p --projection %f,%v %o %i"),1l}, - {wxT("Autopano"),wxT("autopano.exe"),wxT("/allinone /path:%d /keys:%p /project:oto /name:%o /size:1024 /f %i"),0l}, - {wxT("Panomatic"),wxT("panomatic.exe"),wxT("-o %o %i"),1l}, - {wxT("Align image stack"),wxT("align_image_stack.exe"),wxT("-f %v -p %o %i"),1l}, - {wxT("Match-n-shift"),wxT("match-n-shift.exe"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),1l} + {CPDetector_AutoPanoSift, wxT("Autopano-SIFT-C"), + wxT("autopano-sift-c.exe"),wxT("--maxmatches %p --projection %f,%v %o %i"), + wxT(""), wxT("")}, + {CPDetector_AutoPano, wxT("Autopano"), + wxT("autopano.exe"),wxT("/allinone /path:%d /keys:%p /project:oto /name:%o /size:1024 /f %i"), + wxT(""), wxT("")}, + {CPDetector_AutoPanoSift, wxT("Panomatic"),wxT("panomatic.exe"),wxT("-o %o %i"),wxT(""), wxT("")}, + {CPDetector_AutoPanoSift, wxT("Align image stack"),wxT("align_image_stack.exe"),wxT("-f %v -p %o %i"),wxT(""),wxT("")}, + {CPDetector_AutoPanoSift, wxT("Match-n-shift"),wxT("match-n-shift.exe"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT("")} #else #if !defined MAC_SELF_CONTAINED_BUNDLE // Since medio 2008 the MacOSX bundle comes without default CPgenerators due to patent restrictions. - {wxT("Autopano-SIFT-C"),wxT("autopano-noop.sh"),wxT("--maxmatches %p --projection %f,%v %o %i"),1l}, - {wxT("Panomatic"),wxT("panomatic"),wxT("-o %o %i"),1l}, - {wxT("Match-n-shift"),wxT("match-n-shift"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),1l}, - {wxT("Align image stack"),wxT("align_image_stack"),wxT("-f %v -p %o %i"),1l} + {CPDetector_AutoPanoSift,wxT("Autopano-SIFT-C"),wxT("autopano-noop.sh"),wxT("--maxmatches %p --projection %f,%v %o %i"),wxT(""),wxT("")}, + {CPDetector_AutoPanoSift,wxT("Panomatic"),wxT("panomatic"),wxT("-o %o %i"),wxT(""),wxT("")}, + {CPDetector_AutoPanoSift,wxT("Match-n-shift"),wxT("match-n-shift"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT("")}, + {CPDetector_AutoPanoSift,wxT("Align image stack"),wxT("align_image_stack"),wxT("-f %v -p %o %i"),wxT(""),wxT("")} #endif #endif }; Modified: hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc 2009-12-28 22:36:02 UTC (rev 4841) +++ hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc 2009-12-30 09:55:59 UTC (rev 4842) @@ -1,8 +1,6 @@ <?xml version="1.0" encoding="ISO-8859-1"?> <resource> <object class="wxDialog" name="cpdetector_dialog"> - <title>Parameters for Control Point Detectors</title> - <style>wxDEFAULT_DIALOG_STYLE|wxCAPTION|wxRESIZE_BORDER|wxRESIZE_BOX|wxTAB_TRAVERSAL</style> <object class="wxBoxSizer"> <orient>wxVERTICAL</orient> <object class="sizeritem"> @@ -25,6 +23,24 @@ </object> <object class="sizeritem"> <object class="wxStaticText"> + <label>Type:</label> + </object> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxChoice" name="prefs_cpdetector_type"> + <content> + <item>Autopano (by A. Jenny)</item> + <item>Autopano-SIFT</item> + <item>Autopano-SIFT, stack aware</item> + </content> + </object> + <flag>wxALL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxStaticText"> <label>Program:</label> </object> <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> @@ -58,27 +74,70 @@ </object> <object class="sizeritem"> <object class="wxTextCtrl" name="prefs_cpdetector_args"/> - <option>2</option> <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> <border>5</border> </object> <growablecols>1</growablecols> - <object class="sizeritem"> - <object class="wxStaticText"> - <label>Type:</label> + </object> + <flag>wxEXPAND</flag> + </object> + <object class="sizeritem"> + <object class="wxPanel" name="panel_stack"> + <object class="wxStaticBoxSizer"> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Leave empty, when no control point detector should run on stacks.</label> + </object> + <flag>wxALL|wxEXPAND</flag> + <border>5</border> </object> - <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> - <border>5</border> - </object> - <object class="sizeritem"> - <object class="wxChoice" name="prefs_cpdetector_type"> - <content> - <item>Autopano (by A. Jenny)</item> - <item>Autopano-SIFT</item> - </content> + <object class="sizeritem"> + <object class="wxFlexGridSizer"> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Program:</label> + </object> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxBoxSizer"> + <orient>wxHORIZONTAL</orient> + <object class="sizeritem"> + <object class="wxTextCtrl" name="prefs_cpdetector_program_stack"/> + <option>1</option> + <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxButton" name="prefs_cpdetector_program_stack_select"> + <label>Choose...</label> + </object> + <flag>wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + </object> + <flag>wxEXPAND</flag> + </object> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Arguments:</label> + </object> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxTextCtrl" name="prefs_cpdetector_args_stack"/> + <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <cols>2</cols> + <growablecols>1</growablecols> + </object> + <flag>wxEXPAND</flag> </object> - <flag>wxALL</flag> - <border>5</border> + <label>Control Point Detector for stacks</label> + <orient>wxVERTICAL</orient> </object> </object> <flag>wxEXPAND</flag> @@ -94,7 +153,7 @@ %namefile -- file that contains image filenames %s -- input panotools script</label> </object> - <flag>wxALL|wxEXPAND</flag> + <flag>wxALL|wxEXPAND|wxADJUST_MINSIZE</flag> <border>5</border> </object> <label>Detector</label> @@ -130,5 +189,7 @@ <border>5</border> </object> </object> + <title>Parameters for Control Point Detectors</title> + <style>wxDEFAULT_DIALOG_STYLE|wxCAPTION|wxRESIZE_BORDER|wxTAB_TRAVERSAL</style> </object> </resource> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-01-05 06:36:40
|
Revision: 4850 http://hugin.svn.sourceforge.net/hugin/?rev=4850&view=rev Author: tmodes Date: 2010-01-05 06:36:31 +0000 (Tue, 05 Jan 2010) Log Message: ----------- Modify fast preview window to use a tabbed toolbar Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp hugin/trunk/src/hugin1/hugin/GLPreviewFrame.h hugin/trunk/src/hugin1/hugin/GLViewer.cpp hugin/trunk/src/hugin1/hugin/GLViewer.h hugin/trunk/src/hugin1/hugin/MeshManager.cpp hugin/trunk/src/hugin1/hugin/MeshManager.h hugin/trunk/src/hugin1/hugin/xrc/preview_frame.xrc Added Paths: ----------- hugin/trunk/src/hugin1/hugin/xrc/data/crop_tool_small.png hugin/trunk/src/hugin1/hugin/xrc/data/drag_tool_small.png hugin/trunk/src/hugin1/hugin/xrc/data/gl_preview_small.png hugin/trunk/src/hugin1/hugin/xrc/data/identify_tool_small.png hugin/trunk/src/hugin1/hugin/xrc/data/preview_layout_small.png Removed Paths: ------------- hugin/trunk/src/hugin1/hugin/xrc/data/crop_tool.png hugin/trunk/src/hugin1/hugin/xrc/data/drag_tool.png hugin/trunk/src/hugin1/hugin/xrc/data/photometric.png hugin/trunk/src/hugin1/hugin/xrc/data/preview_control_point_tool.png hugin/trunk/src/hugin1/hugin/xrc/data/preview_layout.png Modified: hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp 2010-01-05 06:34:36 UTC (rev 4849) +++ hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp 2010-01-05 06:36:31 UTC (rev 4850) @@ -45,6 +45,7 @@ #include "hugin/ImagesPanel.h" #include "hugin/CommandHistory.h" #include "hugin/GLViewer.h" +#include "hugin/TextKillFocusHandler.h" // something messed up... temporary fix :-( #include "hugin_utils/utils.h" #define DEBUG_HEADER "" @@ -63,7 +64,6 @@ #include "PreviewDifferenceTool.h" #include "PreviewPanoMaskTool.h" #include "PreviewControlPointTool.h" -#include "NumTransDialog.h" #include "PreviewLayoutLinesTool.h" #include <wx/progdlg.h> @@ -72,52 +72,66 @@ // a random id, hope this doesn't break something.. enum { - ID_PROJECTION_CHOICE = wxID_HIGHEST +11, - ID_BLEND_CHOICE, - ID_UPDATE_BUTTON, - ID_OUTPUTMODE_CHOICE, - ID_EXPOSURE_TEXT, - ID_EXPOSURE_SPIN, - ID_EXPOSURE_DEFAULT, ID_TOGGLE_BUT = wxID_HIGHEST+500, PROJ_PARAM_NAMES_ID = wxID_HIGHEST+1300, PROJ_PARAM_VAL_ID = wxID_HIGHEST+1400, PROJ_PARAM_SLIDER_ID = wxID_HIGHEST+1500, ID_TOGGLE_BUT_LEAVE = wxID_HIGHEST+1600, - ID_FULL_SCREEN = wxID_HIGHEST+1710 + ID_FULL_SCREEN = wxID_HIGHEST+1710, + ID_SHOW_ALL = wxID_HIGHEST+1711, + ID_SHOW_NONE = wxID_HIGHEST+1712 }; +/** enum, which contains all different toolbar modes */ +enum{ + mode_preview=0, + mode_layout, + mode_projection, + mode_drag, + mode_crop +}; + BEGIN_EVENT_TABLE(GLPreviewFrame, wxFrame) EVT_CLOSE(GLPreviewFrame::OnClose) - EVT_TOOL(XRCID("preview_layout_mode_tool"), GLPreviewFrame::OnLayoutMode) - EVT_TOOL(XRCID("preview_center_tool"), GLPreviewFrame::OnCenterHorizontally) - EVT_TOOL(XRCID("preview_fit_pano_tool"), GLPreviewFrame::OnFitPano) - EVT_TOOL(XRCID("preview_straighten_pano_tool"), GLPreviewFrame::OnStraighten) - EVT_TOOL(XRCID("preview_num_transform"), GLPreviewFrame::OnNumTransform) - EVT_TOOL(XRCID("preview_show_all_tool"), GLPreviewFrame::OnShowAll) - EVT_TOOL(XRCID("preview_show_none_tool"), GLPreviewFrame::OnShowNone) - EVT_TOOL(XRCID("preview_photometric_tool"), GLPreviewFrame::OnPhotometric) - EVT_TOOL(XRCID("preview_crop_tool"), GLPreviewFrame::OnCrop) - EVT_TOOL(XRCID("preview_drag_tool"), GLPreviewFrame::OnDrag) + EVT_BUTTON(XRCID("preview_center_tool"), GLPreviewFrame::OnCenterHorizontally) + EVT_BUTTON(XRCID("preview_fit_pano_tool"), GLPreviewFrame::OnFitPano) + EVT_BUTTON(XRCID("preview_fit_pano_tool2"), GLPreviewFrame::OnFitPano) + EVT_BUTTON(XRCID("preview_straighten_pano_tool"), GLPreviewFrame::OnStraighten) + EVT_BUTTON(XRCID("apply_num_transform"), GLPreviewFrame::OnNumTransform) + EVT_BUTTON(ID_SHOW_ALL, GLPreviewFrame::OnShowAll) + EVT_BUTTON(ID_SHOW_NONE, GLPreviewFrame::OnShowNone) + EVT_CHECKBOX(XRCID("preview_photometric_tool"), GLPreviewFrame::OnPhotometric) EVT_TOOL(XRCID("preview_identify_tool"), GLPreviewFrame::OnIdentify) - EVT_TOOL(XRCID("preview_control_point_tool"), GLPreviewFrame::OnControlPoint) - EVT_TOOL(XRCID("preview_autocrop_tool"), GLPreviewFrame::OnAutocrop) + EVT_CHECKBOX(XRCID("preview_control_point_tool"), GLPreviewFrame::OnControlPoint) + EVT_BUTTON(XRCID("preview_autocrop_tool"), GLPreviewFrame::OnAutocrop) + EVT_NOTEBOOK_PAGE_CHANGED(XRCID("mode_toolbar_notebook"), GLPreviewFrame::OnSelectMode) + EVT_NOTEBOOK_PAGE_CHANGING(XRCID("mode_toolbar_notebook"), GLPreviewFrame::OnToolModeChanging) - EVT_TEXT_ENTER( -1 , GLPreviewFrame::OnTextCtrlChanged) - - EVT_BUTTON(ID_EXPOSURE_DEFAULT, GLPreviewFrame::OnDefaultExposure) - EVT_SPIN_DOWN(ID_EXPOSURE_SPIN, GLPreviewFrame::OnDecreaseExposure) - EVT_SPIN_UP(ID_EXPOSURE_SPIN, GLPreviewFrame::OnIncreaseExposure) - EVT_CHOICE(ID_BLEND_CHOICE, GLPreviewFrame::OnBlendChoice) - EVT_CHOICE(ID_PROJECTION_CHOICE, GLPreviewFrame::OnProjectionChoice) + EVT_BUTTON(XRCID("exposure_default_button"), GLPreviewFrame::OnDefaultExposure) + EVT_SPIN_DOWN(XRCID("exposure_spin"), GLPreviewFrame::OnDecreaseExposure) + EVT_SPIN_UP(XRCID("exposure_spin"), GLPreviewFrame::OnIncreaseExposure) + EVT_CHOICE(XRCID("blend_mode_choice"), GLPreviewFrame::OnBlendChoice) + EVT_CHOICE(XRCID("projection_choice"), GLPreviewFrame::OnProjectionChoice) #ifndef __WXMAC__ // wxMac does not process these EVT_SCROLL_CHANGED(GLPreviewFrame::OnChangeFOV) + EVT_COMMAND_SCROLL(XRCID("layout_scale_slider"), GLPreviewFrame::OnLayoutScaleChange) #else EVT_SCROLL_THUMBRELEASE(GLPreviewFrame::OnChangeFOV) EVT_SCROLL_ENDSCROLL(GLPreviewFrame::OnChangeFOV) + EVT_COMMAND_SCROLL_THUMBRELEASE(XRCID("layout_scale_slider"), GLPreviewFrame::OnLayoutScaleChange) + EVT_COMMAND_SCROLL_ENDSCROLL(XRCID("layout_scale_slider"), GLPreviewFrame::OnLayoutScaleChange) + EVT_COMMAND_SCROLL_THUMBTRACK(XRCID("layout_scale_slider"), GLPreviewFrame::OnLayoutScaleChange) #endif EVT_SCROLL_THUMBTRACK(GLPreviewFrame::OnTrackChangeFOV) + EVT_TEXT_ENTER(XRCID("pano_text_hfov"), GLPreviewFrame::OnHFOVChanged ) + EVT_TEXT_ENTER(XRCID("pano_text_vfov"), GLPreviewFrame::OnVFOVChanged ) + EVT_TEXT_ENTER(XRCID("pano_val_roi_left"), GLPreviewFrame::OnROIChanged) + EVT_TEXT_ENTER(XRCID("pano_val_roi_top"), GLPreviewFrame::OnROIChanged) + EVT_TEXT_ENTER(XRCID("pano_val_roi_right"), GLPreviewFrame::OnROIChanged) + EVT_TEXT_ENTER(XRCID("pano_val_roi_bottom"), GLPreviewFrame::OnROIChanged) + EVT_TEXT_ENTER(XRCID("exposure_text"), GLPreviewFrame::OnExposureChanged) + EVT_COMMAND_RANGE(PROJ_PARAM_VAL_ID,PROJ_PARAM_VAL_ID+PANO_PROJECTION_MAX_PARMS,wxEVT_COMMAND_TEXT_ENTER,GLPreviewFrame::OnProjParameterChanged) EVT_TOOL(ID_FULL_SCREEN, GLPreviewFrame::OnFullScreen) END_EVENT_TABLE() @@ -131,6 +145,52 @@ #endif END_EVENT_TABLE() +void AddLabelToBitmapButton(wxBitmapButton* button, wxString new_label,bool TextBelow=true) +{ + int new_width=0; + int new_height=0; + int text_height=0; + int text_width=0; + button->GetTextExtent(new_label, &text_width,&text_height); + if(TextBelow) + { + new_height=23+text_height; + if(text_width<24) + new_width=24; + else + new_width=text_width; + } + else + { + new_height=22; + new_width=24+text_width; + }; + wxBitmap new_bitmap(new_width,new_height); + wxMemoryDC dc(new_bitmap); + dc.SetBackground(wxBrush(button->GetBackgroundColour())); + dc.Clear(); + if(TextBelow) + { + dc.DrawBitmap(button->GetBitmapLabel(),(new_width/2)-11,0,true); + dc.SetFont(button->GetParent()->GetFont()); + dc.DrawText(new_label,(new_width-text_width)/2,23); + } + else + { + dc.DrawBitmap(button->GetBitmapLabel(),0,0,true); + dc.SetFont(button->GetParent()->GetFont()); + dc.DrawText(new_label,24,(22-text_height)/2); + }; + dc.SelectObject(wxNullBitmap); + //some fiddeling with mask + wxImage new_image=new_bitmap.ConvertToImage(); + wxColour bg=button->GetBackgroundColour(); + new_image.SetMaskColour(bg.Red(),bg.Green(),bg.Blue()); + wxBitmap new_bitmap_mask(new_image); + button->SetBitmapLabel(new_bitmap_mask); + button->Refresh(); +}; + #define PF_STYLE (wxMAXIMIZE_BOX | wxRESIZE_BORDER | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN) #include <iostream> GLPreviewFrame::GLPreviewFrame(wxFrame * frame, PT::Panorama &pano) @@ -148,19 +208,22 @@ difference_tool = NULL; pano_mask_tool = NULL; + m_mode = -1; m_oldProjFormat = -1; - m_ToolBar = wxXmlResource::Get()->LoadToolBar(this, wxT("fast_preview_toolbar")); - DEBUG_ASSERT(m_ToolBar); - // create tool bar - SetToolBar(m_ToolBar); - drag_tool_id = wxXmlResource::Get()->GetXRCID(wxT("preview_drag_tool")); - DEBUG_ASSERT(drag_tool_id != -2); - crop_tool_id = wxXmlResource::Get()->GetXRCID(wxT("preview_crop_tool")); - DEBUG_ASSERT(crop_tool_id != -2); - identify_tool_id = wxXmlResource::Get()->GetXRCID(wxT("preview_identify_tool")); - DEBUG_ASSERT(identify_tool_id != -2); - control_point_tool_id = wxXmlResource::Get()->GetXRCID(wxT("preview_control_point_tool")); - DEBUG_ASSERT(control_point_tool_id != -2); + // add a status bar + CreateStatusBar(3); + int widths[3] = {-3, 150, 150}; + SetStatusWidths(3, widths); + SetStatusText(wxT(""),1); + SetStatusText(wxT(""),2); + wxPanel *tool_panel = wxXmlResource::Get()->LoadPanel(this,wxT("mode_panel")); + m_tool_notebook = XRCCTRL(*this,"mode_toolbar_notebook",wxNotebook); + m_ToolBar_Identify = XRCCTRL(*this,"preview_mode_toolbar",wxToolBar); + AddLabelToBitmapButton(XRCCTRL(*this,"preview_center_tool",wxBitmapButton),_("Center")); + AddLabelToBitmapButton(XRCCTRL(*this,"preview_fit_pano_tool",wxBitmapButton),_("Fit")); + AddLabelToBitmapButton(XRCCTRL(*this,"preview_straighten_pano_tool",wxBitmapButton),_("Straighten")); + AddLabelToBitmapButton(XRCCTRL(*this,"preview_fit_pano_tool2",wxBitmapButton),_("Fit")); + AddLabelToBitmapButton(XRCCTRL(*this,"preview_autocrop_tool",wxBitmapButton),_("Autocrop")); m_topsizer = new wxBoxSizer( wxVERTICAL ); @@ -176,9 +239,23 @@ m_ButtonSizer = new wxBoxSizer(wxHORIZONTAL); m_ButtonPanel->SetAutoLayout(true); m_ButtonPanel->SetSizer(m_ButtonSizer); - - m_ToggleButtonSizer->Add(m_ButtonPanel, 1, wxEXPAND | wxADJUST_MINSIZE, 0); + wxPanel *panel = new wxPanel(this); + wxBitmap bitmap; + bitmap.LoadFile(huginApp::Get()->GetXRCPath()+wxT("data/preview_show_all.png"),wxBITMAP_TYPE_PNG); + wxBitmapButton * select_all = new wxBitmapButton(panel,ID_SHOW_ALL,bitmap); + bitmap.LoadFile(huginApp::Get()->GetXRCPath()+wxT("data/preview_show_none.png"),wxBITMAP_TYPE_PNG); + wxBitmapButton * select_none = new wxBitmapButton(panel,ID_SHOW_NONE,bitmap); + + wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(select_all,5,wxALIGN_CENTER_VERTICAL | wxLEFT | wxTOP | wxBOTTOM); + sizer->Add(select_none,5,wxALIGN_CENTER_VERTICAL | wxRIGHT | wxTOP | wxBOTTOM); + panel->SetSizer(sizer); + m_ToggleButtonSizer->Add(panel, 0, wxALIGN_CENTER_VERTICAL); + m_ToggleButtonSizer->Add(m_ButtonPanel, 1, wxEXPAND | wxADJUST_MINSIZE | wxALIGN_CENTER_VERTICAL, 0); + AddLabelToBitmapButton(select_all,_("All"),false); + AddLabelToBitmapButton(select_none,_("None"), false); + m_topsizer->Add(tool_panel, 0, wxEXPAND | wxALL, 2); m_topsizer->Add(m_ToggleButtonSizer, 0, wxEXPAND | wxADJUST_MINSIZE | wxBOTTOM, 5); wxFlexGridSizer * flexSizer = new wxFlexGridSizer(2,0,5,5); @@ -221,6 +298,29 @@ m_HFOVSlider->SetToolTip(_("drag to change the horizontal field of view")); + m_HFOVText = XRCCTRL(*this, "pano_text_hfov" ,wxTextCtrl); + DEBUG_ASSERT(m_HFOVText); + m_HFOVText->PushEventHandler(new TextKillFocusHandler(this)); + m_VFOVText = XRCCTRL(*this, "pano_text_vfov" ,wxTextCtrl); + DEBUG_ASSERT(m_VFOVText); + m_VFOVText->PushEventHandler(new TextKillFocusHandler(this)); + + m_ROILeftTxt = XRCCTRL(*this, "pano_val_roi_left", wxTextCtrl); + DEBUG_ASSERT(m_ROILeftTxt); + m_ROILeftTxt->PushEventHandler(new TextKillFocusHandler(this)); + + m_ROIRightTxt = XRCCTRL(*this, "pano_val_roi_right", wxTextCtrl); + DEBUG_ASSERT(m_ROIRightTxt); + m_ROIRightTxt->PushEventHandler(new TextKillFocusHandler(this)); + + m_ROITopTxt = XRCCTRL(*this, "pano_val_roi_top", wxTextCtrl); + DEBUG_ASSERT(m_ROITopTxt); + m_ROITopTxt->PushEventHandler(new TextKillFocusHandler(this)); + + m_ROIBottomTxt = XRCCTRL(*this, "pano_val_roi_bottom", wxTextCtrl); + DEBUG_ASSERT(m_ROIBottomTxt); + m_ROIBottomTxt->PushEventHandler(new TextKillFocusHandler(this)); + flexSizer->Add(m_HFOVSlider, 0, wxEXPAND); m_topsizer->Add(flexSizer, @@ -229,17 +329,8 @@ wxALL, // draw border all around 5); // border width - wxStaticBoxSizer * blendModeSizer = new wxStaticBoxSizer( - new wxStaticBox(this, -1, _("Preview Options")), - wxHORIZONTAL); + m_ProjectionChoice = XRCCTRL(*this,"projection_choice",wxChoice); - blendModeSizer->Add(new wxStaticText(this, -1, _("projection (f):")), - 0, // not vertically strechable - wxALL | wxALIGN_CENTER_VERTICAL, // draw border all around - 5); // border width - m_ProjectionChoice = new wxChoice(this, ID_PROJECTION_CHOICE, - wxDefaultPosition, wxDefaultSize); - /* populate with all available projection types */ int nP = panoProjectionFormatCount(); for(int n=0; n < nP; n++) { @@ -251,34 +342,16 @@ } m_ProjectionChoice->SetSelection(2); - blendModeSizer->Add(m_ProjectionChoice, - 0, - wxALL | wxALIGN_CENTER_VERTICAL, - 5); - ////////////////////////////////////////////////////// // Blend mode - blendModeSizer->Add(new wxStaticText(this, -1, _("Blend mode:")), - 0, // not vertically strechable - wxALL | wxALIGN_CENTER_VERTICAL, // draw border all around - 5); // border width - - // prepare choice item for blend selection - m_choices[0] = _("normal"); // remaining blend mode should be added after OpenGL context has been created // see FillBlendMode() m_differenceIndex = -1; // create choice item - m_BlendModeChoice = new wxChoice(this, ID_BLEND_CHOICE, - wxDefaultPosition, wxDefaultSize, - 1, m_choices); + m_BlendModeChoice = XRCCTRL(*this,"blend_mode_choice",wxChoice); + m_BlendModeChoice->Append(_("normal")); m_BlendModeChoice->SetSelection(0); - blendModeSizer->Add(m_BlendModeChoice, - 0, - wxALL | wxALIGN_CENTER_VERTICAL, - 5); - // TODO implement hdr display in OpenGL, if possible? // Disabled until someone can figure out HDR display in OpenGL. /* @@ -303,78 +376,47 @@ ///////////////////////////////////////////////////// // exposure - blendModeSizer->Add(new wxStaticText(this, -1, _("EV:")), - 0, // not vertically strechable - wxALL | wxALIGN_CENTER_VERTICAL, // draw border all around - 5); // border width - - m_defaultExposureBut = new wxBitmapButton(this, ID_EXPOSURE_DEFAULT, - wxArtProvider::GetBitmap(wxART_REDO)); - blendModeSizer->Add(m_defaultExposureBut, 0, wxLEFT | wxRIGHT, 5); + m_defaultExposureBut = XRCCTRL(*this, "exposure_default_button", wxBitmapButton); -// m_decExposureBut = new wxBitmapButton(this, ID_EXPOSURE_DECREASE, -// wxArtProvider::GetBitmap(wxART_GO_BACK)); -// blendModeSizer->Add(m_decExposureBut); - - m_exposureTextCtrl = new wxTextCtrl(this, ID_EXPOSURE_TEXT, wxT("0"), - wxDefaultPosition,wxSize(50,-1), wxTE_PROCESS_ENTER); - blendModeSizer->Add(m_exposureTextCtrl, - 0, // not vertically strechable - wxLEFT | wxTOP | wxBOTTOM | wxALIGN_CENTER_VERTICAL, // draw border all around - 5); // border width -// m_incExposureBut = new wxBitmapButton(this, ID_EXPOSURE_INCREASE, -// wxArtProvider::GetBitmap(wxART_GO_FORWARD)); - m_exposureSpinBut = new wxSpinButton(this, ID_EXPOSURE_SPIN, wxDefaultPosition, - wxDefaultSize, wxSP_VERTICAL); - m_exposureSpinBut->SetRange(-0x8000, 0x7fff); + m_exposureTextCtrl = XRCCTRL(*this, "exposure_text", wxTextCtrl); + m_exposureSpinBut = XRCCTRL(*this, "exposure_spin", wxSpinButton); m_exposureSpinBut->SetValue(0); - blendModeSizer->Add(m_exposureSpinBut, 0, wxALIGN_CENTER_VERTICAL); - m_topsizer->Add(blendModeSizer, 0, wxEXPAND | wxALL, 5); + m_projection_panel = XRCCTRL(*this, "projection_panel", wxPanel); + m_projParamSizer = new wxBoxSizer(wxHORIZONTAL); - m_projParamSizer = new wxStaticBoxSizer( - new wxStaticBox(this, -1, _("Projection Parameters")), - wxHORIZONTAL); - m_projParamNamesLabel.resize(PANO_PROJECTION_MAX_PARMS); m_projParamTextCtrl.resize(PANO_PROJECTION_MAX_PARMS); m_projParamSlider.resize(PANO_PROJECTION_MAX_PARMS); for (int i=0; i < PANO_PROJECTION_MAX_PARMS; i++) { - m_projParamNamesLabel[i] = new wxStaticText(this, PROJ_PARAM_NAMES_ID+i, _("param:")); + m_projParamNamesLabel[i] = new wxStaticText(m_projection_panel, PROJ_PARAM_NAMES_ID+i, _("param:")); m_projParamSizer->Add(m_projParamNamesLabel[i], 0, // not vertically strechable - wxALL | wxALIGN_CENTER_VERTICAL, // draw border all around + wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, // draw border all around 5); // border width - m_projParamTextCtrl[i] = new wxTextCtrl(this, PROJ_PARAM_VAL_ID+i, _("0"), + m_projParamTextCtrl[i] = new wxTextCtrl(m_projection_panel, PROJ_PARAM_VAL_ID+i, _("0"), wxDefaultPosition,wxDefaultSize, wxTE_PROCESS_ENTER); m_projParamSizer->Add(m_projParamTextCtrl[i], 0, // not vertically strechable - wxALL | wxALIGN_CENTER_VERTICAL, // draw border all around + wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, // draw border all around 5); // border width - m_projParamSlider[i] = new wxSlider(this, PROJ_PARAM_SLIDER_ID+i, 0, -90, 90); + m_projParamSlider[i] = new wxSlider(m_projection_panel, PROJ_PARAM_SLIDER_ID+i, 0, -90, 90); m_projParamSizer->Add(m_projParamSlider[i], 1, // not vertically strechable - wxALL | wxALIGN_CENTER_VERTICAL | wxEXPAND, // draw border all around + wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL , // draw border all around 5); // border width } - m_topsizer->Add(m_projParamSizer, 0, wxEXPAND | wxALL, 5); + m_projection_panel->GetSizer()->Add(m_projParamSizer, 1, wxEXPAND | wxALIGN_CENTER_VERTICAL); // do not show projection param sizer - m_topsizer->Show(m_projParamSizer, false, true); + m_projection_panel->GetSizer()->Show(m_projParamSizer, false, true); wxConfigBase * config = wxConfigBase::Get(); - // add a status bar - CreateStatusBar(3); - int widths[3] = {-3, 150, 150}; - SetStatusWidths(3, widths); - SetStatusText(wxT(""),1); - SetStatusText(wxT(""),2); - // the initial size as calculated by the sizers this->SetSizer( m_topsizer ); m_topsizer->SetSizeHints( this ); @@ -435,6 +477,12 @@ helper->DeactivateTool(difference_tool); delete difference_tool; helper->DeactivateTool(pano_mask_tool); delete pano_mask_tool; } + m_HFOVText->PopEventHandler(true); + m_VFOVText->PopEventHandler(true); + m_ROILeftTxt->PopEventHandler(true); + m_ROIRightTxt->PopEventHandler(true); + m_ROITopTxt->PopEventHandler(true); + m_ROIBottomTxt->PopEventHandler(true); m_pano.removeObserver(this); DEBUG_TRACE("dtor end"); } @@ -464,10 +512,10 @@ if (helper != NULL && identify_tool != NULL && difference_tool != NULL - && m_ToolBar != NULL) + && m_ToolBar_Identify != NULL ) { helper->DeactivateTool(identify_tool); - m_ToolBar->ToggleTool(identify_tool_id, false); + m_ToolBar_Identify->ToggleTool(XRCID("preview_identify_tool"), false); helper->ActivateTool(difference_tool); CleanButtonColours(); }; @@ -505,10 +553,6 @@ m_exposureTextCtrl->SetValue(wxString(doubleToString(opts.outputExposureValue,2).c_str(), wxConvLocal)); bool activeImgs = pano.getActiveImages().size() > 0; - m_ToolBar->EnableTool(XRCID("preview_center_tool"), activeImgs); - m_ToolBar->EnableTool(XRCID("preview_fit_pano_tool"), activeImgs); - m_ToolBar->EnableTool(XRCID("preview_num_transform"), activeImgs); - m_ToolBar->EnableTool(XRCID("preview_straighten_pano_tool"), pano.getNrOfImages() > 0); // TODO: enable display of parameters and set their limits, if projection has some. @@ -519,7 +563,7 @@ DEBUG_DEBUG("Projection format changed"); if (nParam) { // show parameters and update labels. - m_topsizer->Show(m_projParamSizer, true, true); + m_projection_panel->GetSizer()->Show(m_projParamSizer, true, true); int i; for (i=0; i < nParam; i++) { const pano_projection_parameter * pp = & (opts.m_projFeatures.parm[i]); @@ -535,7 +579,7 @@ } relayout = true; } else { - m_topsizer->Show(m_projParamSizer, false, true); + m_projection_panel->GetSizer()->Show(m_projParamSizer, false, true); relayout = true; } } @@ -550,19 +594,29 @@ } } if (relayout) { - m_topsizer->Layout(); + m_projection_panel->Layout(); + Refresh(); } SetStatusText(wxString::Format(wxT("%.1f x %.1f"), opts.getHFOV(), opts.getVFOV()),2); m_HFOVSlider->SetValue(roundi(opts.getHFOV())); m_VFOVSlider->SetValue(roundi(opts.getVFOV())); + std::string val; + val = doubleToString(opts.getHFOV(),1); + m_HFOVText->SetValue(wxString(val.c_str(), wxConvLocal)); + val = doubleToString(opts.getVFOV(),1); + m_VFOVText->SetValue(wxString(val.c_str(), wxConvLocal)); + m_VFOVText->Enable(opts.fovCalcSupported(opts.getProjection())); m_oldProjFormat = opts.getProjection(); // Check if autocrop is usable on this projection. bool hasActiveImages = pano.getActiveImages().size() > 0; - m_ToolBar->EnableTool(XRCID("preview_autocrop_tool"), - hasActiveImages && - opts.fovCalcSupported(opts.getProjection())); + XRCCTRL(*this,"preview_autocrop_tool",wxBitmapButton)->Enable( + hasActiveImages && opts.fovCalcSupported(opts.getProjection())); + m_ROILeftTxt->SetValue(wxString::Format(wxT("%d"), opts.getROI().left() )); + m_ROIRightTxt->SetValue(wxString::Format(wxT("%d"), opts.getROI().right() )); + m_ROITopTxt->SetValue(wxString::Format(wxT("%d"), opts.getROI().top() )); + m_ROIBottomTxt->SetValue(wxString::Format(wxT("%d"), opts.getROI().bottom() )); } void GLPreviewFrame::panoramaImagesChanged(Panorama &pano, const UIntSet &changed) @@ -618,8 +672,8 @@ // handler, which will also toggle the images: ImageToogleButtonEventHandler * event_handler = new ImageToogleButtonEventHandler(*it, &identify_tool, - identify_tool_id, m_ToolBar, - &m_pano); + m_ToolBar_Identify->FindById(XRCID("preview_identify_tool")), + &m_pano); toogle_button_event_handlers.push_back(event_handler); but->PushEventHandler(event_handler); wxSize sz = but->GetSize(); @@ -654,6 +708,16 @@ DEBUG_INFO("New m_ButtonPanel width: " << (m_ButtonPanel->GetSize()).GetWidth()); DEBUG_INFO("New m_ButtonPanel Height: " << (m_ButtonPanel->GetSize()).GetHeight()); } + + if(nrImages==0) + { + SetMode(mode_preview); + m_tool_notebook->ChangeSelection(mode_preview); + }; + for(size_t i=1; i<m_tool_notebook->GetPageCount();i++) + { + m_tool_notebook->GetPage(i)->Enable(nrImages!=0); + }; } @@ -693,47 +757,6 @@ } #endif -void GLPreviewFrame::OnLayoutMode(wxCommandEvent & e) -{ - if (e.IsChecked()) - { - // turn off things not used in layout mode. - helper->DeactivateTool(pano_mask_tool); - /** @todo only turn off tools which are on, as turning off an already - * off tool causes wasted renders, which are expensive. - */ - std::set<PreviewTool*> tools; - tools.insert(crop_tool); - tools.insert(drag_tool); - tools.insert(identify_tool); - tools.insert(control_point_tool); - helper->DeactivateTool(crop_tool); - helper->DeactivateTool(drag_tool); - helper->DeactivateTool(identify_tool); - helper->DeactivateTool(control_point_tool); - TurnOffTools(tools); - // hide UI items that are not applicable to layout mode. - m_ToolBar->EnableTool(drag_tool_id, false); - m_ToolBar->EnableTool(identify_tool_id, false); - m_ToolBar->EnableTool(crop_tool_id, false); - m_ToolBar->EnableTool(control_point_tool_id, false); - // Turn on the layout mode view - m_GLViewer->SetLayoutMode(true); - helper->ActivateTool(m_layoutLinesTool); - } else { - // disable layout mode. - helper->DeactivateTool(m_layoutLinesTool); - m_GLViewer->SetLayoutMode(false); - // Switch the panorama mask back on. - helper->ActivateTool(pano_mask_tool); - // show hidden UI items - m_ToolBar->EnableTool(drag_tool_id, true ); - m_ToolBar->EnableTool(identify_tool_id, true ); - m_ToolBar->EnableTool(crop_tool_id, true); - m_ToolBar->EnableTool(control_point_tool_id, true); - } -} - void GLPreviewFrame::OnCenterHorizontally(wxCommandEvent & e) { if (m_pano.getActiveImages().size() == 0) return; @@ -811,43 +834,75 @@ void GLPreviewFrame::OnNumTransform(wxCommandEvent & e) { if (m_pano.getNrOfImages() == 0) return; - NumTransDialog dlg(this, m_pano); + + wxString text = XRCCTRL(*this,"input_yaw",wxTextCtrl)->GetValue(); + double y; + if(!utils::stringToDouble(std::string(text.mb_str(wxConvLocal)), y)) + { + wxBell(); + wxMessageBox(_("Yaw value must be numeric."),_("Warning"),wxOK | wxICON_ERROR,this); + return; + } + text = XRCCTRL(*this,"input_pitch",wxTextCtrl)->GetValue(); + double p; + if(!utils::stringToDouble(std::string(text.mb_str(wxConvLocal)), p)) + { + wxBell(); + wxMessageBox(_("Pitch value must be numeric."),_("Warning"),wxOK | wxICON_ERROR,this); + return; + } + text = XRCCTRL(*this,"input_roll",wxTextCtrl)->GetValue(); + double r; + if(!utils::stringToDouble(std::string(text.mb_str(wxConvLocal)), r)) + { + wxBell(); + wxMessageBox(_("Roll value must be numeric."),_("Warning"),wxOK | wxICON_ERROR,this); + return; + } + GlobalCmdHist::getInstance().addCommand( + new PT::RotatePanoCmd(m_pano, y, p, r) + ); } -void GLPreviewFrame::OnTextCtrlChanged(wxCommandEvent & e) +void GLPreviewFrame::OnExposureChanged(wxCommandEvent & e) { PanoramaOptions opts = m_pano.getOptions(); - if (e.GetEventObject() == m_exposureTextCtrl) { - // exposure - wxString text = m_exposureTextCtrl->GetValue(); - DEBUG_INFO ("target exposure = " << text.mb_str(wxConvLocal) ); - double p = 0; - if (text != wxT("")) { - if (!str2double(text, p)) { - wxLogError(_("Value must be numeric.")); - return; - } + // exposure + wxString text = m_exposureTextCtrl->GetValue(); + DEBUG_INFO ("target exposure = " << text.mb_str(wxConvLocal) ); + double p = 0; + if (text != wxT("")) { + if (!str2double(text, p)) { + wxLogError(_("Value must be numeric.")); + return; } - opts.outputExposureValue = p; - } else { - int nParam = opts.m_projFeatures.numberOfParameters; - std::vector<double> para = opts.getProjectionParameters(); - for (int i = 0; i < nParam; i++) { - if (e.GetEventObject() == m_projParamTextCtrl[i]) { - wxString text = m_projParamTextCtrl[i]->GetValue(); - DEBUG_INFO ("param " << i << ": = " << text.mb_str(wxConvLocal) ); - double p = 0; - if (text != wxT("")) { - if (!str2double(text, p)) { - wxLogError(_("Value must be numeric.")); - return; - } + } + opts.outputExposureValue = p; + GlobalCmdHist::getInstance().addCommand( + new PT::SetPanoOptionsCmd( m_pano, opts ) + ); +} + +void GLPreviewFrame::OnProjParameterChanged(wxCommandEvent & e) +{ + PanoramaOptions opts = m_pano.getOptions(); + int nParam = opts.m_projFeatures.numberOfParameters; + std::vector<double> para = opts.getProjectionParameters(); + for (int i = 0; i < nParam; i++) { + if (e.GetEventObject() == m_projParamTextCtrl[i]) { + wxString text = m_projParamTextCtrl[i]->GetValue(); + DEBUG_INFO ("param " << i << ": = " << text.mb_str(wxConvLocal) ); + double p = 0; + if (text != wxT("")) { + if (!str2double(text, p)) { + wxLogError(_("Value must be numeric.")); + return; } - para[i] = p; } + para[i] = p; } - opts.setProjectionParameters(para); } + opts.setProjectionParameters(para); GlobalCmdHist::getInstance().addCommand( new PT::SetPanoOptionsCmd( m_pano, opts ) ); @@ -966,7 +1021,8 @@ new PT::SetPanoOptionsCmd( m_pano, opt ) ); DEBUG_DEBUG ("Projection changed: " << lt); - + m_projection_panel->Layout(); + Refresh(); } else { // FIXME DEBUG_WARN("wxChoice event from unknown object received"); } @@ -1058,37 +1114,10 @@ helper->ActivateTool(pano_mask_tool); // update the blend mode which activates some tools updateBlendMode(); + // update toolbar + SetMode(mode_preview); } -void GLPreviewFrame::OnCrop(wxCommandEvent & e) -{ - // turn on or off the crop tool when its button is pressed. - SetStatusText(wxT(""), 0); // blank status text as it refers to an old tool. - if (e.IsChecked()) - { - // ActivateTool returns pointers to the tools that were switched off to - // enable the crop tool. - TurnOffTools(helper->ActivateTool(crop_tool)); - } else { - helper->DeactivateTool(crop_tool); - // the tool draws some extra guides that need covering up - m_GLViewer->Refresh(); - } -} - -void GLPreviewFrame::OnDrag(wxCommandEvent & e) -{ - SetStatusText(wxT(""), 0); // blank status text as it refers to an old tool. - if (e.IsChecked()) - { - TurnOffTools(helper->ActivateTool(drag_tool)); - } else { - helper->DeactivateTool(drag_tool); - } - // The plumb lines should only be shown when the tool is active: - m_GLViewer->Refresh(); // ...draw them or draw over them. -} - void GLPreviewFrame::OnIdentify(wxCommandEvent & e) { SetStatusText(wxT(""), 0); // blank status text as it refers to an old tool. @@ -1123,27 +1152,23 @@ { if (*i == crop_tool) { - // disabled the crop tool, toogle the button for it off - m_ToolBar->ToggleTool(crop_tool_id, false); // cover up the guidelines m_GLViewer->Refresh(); } else if (*i == drag_tool) { - // disabled the drag tool, toggle its button off. - m_ToolBar->ToggleTool(drag_tool_id, false); // cover up its boxes m_GLViewer->Refresh(); } else if (*i == identify_tool) { // disabled the identify tool, toggle its button off. - m_ToolBar->ToggleTool(identify_tool_id, false); + m_ToolBar_Identify->ToggleTool(XRCID("preview_identify_tool"), false); // cover up its indicators and restore normal button colours. m_GLViewer->Refresh(); CleanButtonColours(); } else if (*i == control_point_tool) { // disabled the control point tool. - m_ToolBar->ToggleTool(control_point_tool_id, false); + XRCCTRL(*this,"preview_control_point_tool",wxCheckBox)->SetValue(false); // cover up the control point lines. m_GLViewer->Refresh(); } @@ -1214,14 +1239,12 @@ ImageToogleButtonEventHandler::ImageToogleButtonEventHandler( unsigned int image_number_in, PreviewIdentifyTool **identify_tool_in, - unsigned int identify_tool_id_in, - wxToolBar *tool_bar_in, + wxToolBarToolBase* identify_toolbutton_in, PT::Panorama * m_pano_in) { image_number = image_number_in; identify_tool = identify_tool_in; - identify_tool_id = identify_tool_id_in; - tool_bar = tool_bar_in; + identify_toolbutton = identify_toolbutton_in; m_pano = m_pano_in; } @@ -1230,7 +1253,7 @@ // When using the identify tool, we want to identify image locations when // the user moves the mouse over the image buttons, but only if the image // is being shown. - if ( tool_bar->GetToolState(identify_tool_id) + if ( identify_toolbutton->IsToggled() && m_pano->getActiveImages().count(image_number)) { (*identify_tool)->ShowImageNumber(image_number); @@ -1242,7 +1265,7 @@ { // if the mouse left one of the image toggle buttons with the identification // tool active, we should stop showing the image indicator for that button. - if (tool_bar->GetToolState(identify_tool_id) + if ( identify_toolbutton->IsToggled() && m_pano->getActiveImages().count(image_number)) { (*identify_tool)->StopShowingImages(); @@ -1333,9 +1356,195 @@ void GLPreviewFrame::OnFullScreen(wxCommandEvent & e) { ShowFullScreen(!IsFullScreen(), wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION); -#ifdef __WXGTK__ - //workaround a wxGTK bug that also the toolbar is hidden, but not requested to hide - GetToolBar()->Show(true); -#endif }; +void GLPreviewFrame::SetMode(int newMode) +{ + if(m_mode==newMode) + return; + SetStatusText(wxT(""), 0); // blank status text as it refers to an old tool. + switch(m_mode) + { + case mode_preview: + // switch off identify and show cp tool + helper->DeactivateTool(identify_tool); + CleanButtonColours(); + m_ToolBar_Identify->ToggleTool(XRCID("preview_identify_tool"),false); + helper->DeactivateTool(control_point_tool); + XRCCTRL(*this,"preview_control_point_tool",wxCheckBox)->SetValue(false); + break; + case mode_layout: + // disable layout mode. + helper->DeactivateTool(m_layoutLinesTool); + m_GLViewer->SetLayoutMode(false); + // Switch the panorama mask back on. + helper->ActivateTool(pano_mask_tool); + //restore blend mode + m_BlendModeChoice->SetSelection(non_layout_blend_mode); + updateBlendMode(); + break; + case mode_projection: + break; + case mode_drag: + helper->DeactivateTool(drag_tool); + break; + case mode_crop: + helper->DeactivateTool(crop_tool); + break; + }; + m_mode=newMode; + wxScrollEvent dummy; + switch(m_mode) + { + case mode_preview: + break; + case mode_layout: + //save blend mode setting, set to normal for layout mode + non_layout_blend_mode=m_BlendModeChoice->GetSelection(); + m_BlendModeChoice->SetSelection(0); + updateBlendMode(); + // turn off things not used in layout mode. + helper->DeactivateTool(pano_mask_tool); + m_GLViewer->SetLayoutMode(true); + helper->ActivateTool(m_layoutLinesTool); + OnLayoutScaleChange(dummy); + break; + case mode_projection: + break; + case mode_drag: + TurnOffTools(helper->ActivateTool(drag_tool)); + break; + case mode_crop: + TurnOffTools(helper->ActivateTool(crop_tool)); + break; + }; + m_GLViewer->Refresh(); +}; + +void GLPreviewFrame::OnSelectMode(wxNotebookEvent &e) +{ + if(m_mode!=-1) + SetMode(e.GetSelection()); +}; + +void GLPreviewFrame::OnToolModeChanging(wxNotebookEvent &e) +{ + if(m_pano.getNrOfImages()==0 && e.GetOldSelection()==0) + { + wxBell(); + e.Veto(); + }; +}; + +void GLPreviewFrame::OnROIChanged ( wxCommandEvent & e ) +{ + PanoramaOptions opt = m_pano.getOptions(); + long left, right, top, bottom; + if (!m_ROITopTxt->GetValue().ToLong(&top)) { + wxLogError(_("Top needs to be an integer bigger than 0")); + return; + } + if (!m_ROILeftTxt->GetValue().ToLong(&left)) { + wxLogError(_("left needs to be an integer bigger than 0")); + return; + } + if (!m_ROIRightTxt->GetValue().ToLong(&right)) { + wxLogError(_("right needs to be an integer bigger than 0")); + return; + } + if (!m_ROIBottomTxt->GetValue().ToLong(&bottom)) { + wxLogError(_("bottom needs to be an integer bigger than 0")); + return; + } + // make sure that left is really to the left of right + if(left>=right) { + wxLogError(_("left boundary must be smaller than right")); + // TODO: would be nice if the previous value would be restored + return; + } + // make sure that top is really higher than bottom + if(top>=bottom) { + wxLogError(_("top boundary must be smaller than bottom")); + // TODO: would be nice if the previous value would be restored + return; + } + + + opt.setROI(vigra::Rect2D(left, top, right, bottom)); + GlobalCmdHist::getInstance().addCommand( + new PT::SetPanoOptionsCmd( m_pano, opt ) + ); +}; + +void GLPreviewFrame::OnHFOVChanged ( wxCommandEvent & e ) +{ + PanoramaOptions opt = m_pano.getOptions(); + + + wxString text = m_HFOVText->GetValue(); + DEBUG_INFO ("HFOV = " << text.mb_str(wxConvLocal) ); + if (text == wxT("")) { + return; + } + + double hfov; + if (!str2double(text, hfov)) { + wxLogError(_("Value must be numeric.")); + return; + } + + if ( hfov <=0 || hfov > opt.getMaxHFOV()) { + wxLogError(wxString::Format( + _("Invalid HFOV value. Maximum HFOV for this projection is %lf."), + opt.getMaxHFOV())); + hfov=opt.getMaxHFOV(); + } + opt.setHFOV(hfov); + // recalculate panorama height... + GlobalCmdHist::getInstance().addCommand( + new PT::SetPanoOptionsCmd( m_pano, opt ) + ); + + DEBUG_INFO ( "new hfov: " << hfov ) +}; + +void GLPreviewFrame::OnVFOVChanged ( wxCommandEvent & e ) +{ + PanoramaOptions opt = m_pano.getOptions(); + + wxString text = m_VFOVText->GetValue(); + DEBUG_INFO ("VFOV = " << text.mb_str(wxConvLocal) ); + if (text == wxT("")) { + return; + } + + double vfov; + if (!str2double(text, vfov)) { + wxLogError(_("Value must be numeric.")); + return; + } + + if ( vfov <=0 || vfov > opt.getMaxVFOV()) { + wxLogError(wxString::Format( + _("Invalid VFOV value. Maximum VFOV for this projection is %lf."), + opt.getMaxVFOV())); + vfov = opt.getMaxVFOV(); + } + opt.setVFOV(vfov); + // recalculate panorama height... + GlobalCmdHist::getInstance().addCommand( + new PT::SetPanoOptionsCmd( m_pano, opt ) + ); + + DEBUG_INFO ( "new vfov: " << vfov ) +}; + +void GLPreviewFrame::OnLayoutScaleChange(wxScrollEvent &e) +{ + if(m_mode==mode_layout) + { + double scale_factor=XRCCTRL(*this,"layout_scale_slider",wxSlider)->GetValue(); + m_GLViewer->SetLayoutScale(10.0-sqrt(scale_factor)); + m_GLViewer->Refresh(); + }; +}; \ No newline at end of file Modified: hugin/trunk/src/hugin1/hugin/GLPreviewFrame.h =================================================================== --- hugin/trunk/src/hugin1/hugin/GLPreviewFrame.h 2010-01-05 06:34:36 UTC (rev 4849) +++ hugin/trunk/src/hugin1/hugin/GLPreviewFrame.h 2010-01-05 06:36:31 UTC (rev 4850) @@ -59,8 +59,7 @@ public: ImageToogleButtonEventHandler(unsigned int image_number, PreviewIdentifyTool **identify_tool, - unsigned int identify_tool_id, - wxToolBar *tool_bar, + wxToolBarToolBase* identify_toolbutton_in, PT::Panorama * m_pano); void OnChange(wxCommandEvent &e); protected: @@ -70,8 +69,7 @@ DECLARE_EVENT_TABLE() unsigned int image_number; PreviewIdentifyTool **identify_tool; - unsigned int identify_tool_id; - wxToolBar *tool_bar; + wxToolBarToolBase *identify_toolbutton; PT::Panorama * m_pano; }; @@ -109,22 +107,20 @@ protected: void OnClose(wxCloseEvent& e); - void OnLayoutMode(wxCommandEvent & e); void OnCenterHorizontally(wxCommandEvent & e); void OnFitPano(wxCommandEvent& e); void OnStraighten(wxCommandEvent & e); void OnShowAll(wxCommandEvent & e); void OnShowNone(wxCommandEvent & e); void OnPhotometric(wxCommandEvent & e); - void OnCrop(wxCommandEvent & e); - void OnDrag(wxCommandEvent & e); void OnIdentify(wxCommandEvent &e); void OnAutocrop(wxCommandEvent &e); void OnControlPoint(wxCommandEvent &e); void OnNumTransform(wxCommandEvent & e); void OnChangeFOV(wxScrollEvent & e); void OnTrackChangeFOV(wxScrollEvent & e); - void OnTextCtrlChanged(wxCommandEvent & e); + void OnExposureChanged(wxCommandEvent & e); + void OnProjParameterChanged(wxCommandEvent & e); void OnDefaultExposure( wxCommandEvent & e ); void OnDecreaseExposure( wxSpinEvent & e ); @@ -132,6 +128,10 @@ void OnBlendChoice(wxCommandEvent & e); void OnProjectionChoice(wxCommandEvent & e); + /** event handler for changed roi */ + void OnROIChanged(wxCommandEvent & e); + void OnHFOVChanged(wxCommandEvent & e); + void OnVFOVChanged(wxCommandEvent & e); // No HDR display yet // void OnOutputChoice(wxCommandEvent & e); // update tools according to blend mode choice @@ -140,15 +140,31 @@ void updatePano(); /** event handler for full screen */ void OnFullScreen(wxCommandEvent &e); + /** event handler for selection of new mode */ + void OnSelectMode(wxNotebookEvent &e); + /** event handler for blocking changing mode when panorama contains no images*/ + void OnToolModeChanging(wxNotebookEvent &e); + /** event handler for change scale of layout mode */ + void OnLayoutScaleChange(wxScrollEvent &e); private: + void SetMode(int newMode); PT::Panorama & m_pano; GLViewer * m_GLViewer; - wxToolBar * m_ToolBar; - int drag_tool_id, crop_tool_id, identify_tool_id, control_point_tool_id; + int m_mode; + int non_layout_blend_mode; + wxToolBar* m_ToolBar_Identify; + wxNotebook* m_tool_notebook; + wxPanel* m_projection_panel; wxSlider * m_HFOVSlider; wxSlider * m_VFOVSlider; + wxTextCtrl * m_HFOVText; + wxTextCtrl * m_VFOVText; + wxTextCtrl * m_ROILeftTxt; + wxTextCtrl * m_ROIRightTxt; + wxTextCtrl * m_ROITopTxt; + wxTextCtrl * m_ROIBottomTxt; wxChoice * m_BlendModeChoice; wxChoice * m_ProjectionChoice; // No HDR display yet. @@ -167,7 +183,7 @@ wxStaticBoxSizer * m_ToggleButtonSizer; wxBoxSizer * m_topsizer; - wxStaticBoxSizer * m_projParamSizer; + wxBoxSizer * m_projParamSizer; std::vector<wxStaticText *> m_projParamNamesLabel; std::vector<wxTextCtrl *> m_projParamTextCtrl; std::vector<wxSlider *> m_projParamSlider; Modified: hugin/trunk/src/hugin1/hugin/GLViewer.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/GLViewer.cpp 2010-01-05 06:34:36 UTC (rev 4849) +++ hugin/trunk/src/hugin1/hugin/GLViewer.cpp 2010-01-05 06:36:31 UTC (rev 4850) @@ -148,6 +148,12 @@ Refresh(); } +void GLViewer::SetLayoutScale(double scale) +{ + m_view_state->GetMeshManager()->SetLayoutScale(scale); + Refresh(); +} + void GLViewer::RedrawE(wxPaintEvent& e) { if(!IsShown()) return; Modified: hugin/trunk/src/hugin1/hugin/GLViewer.h =================================================================== --- hugin/trunk/src/hugin1/hugin/GLViewer.h 2010-01-05 06:34:36 UTC (rev 4849) +++ hugin/trunk/src/hugin1/hugin/GLViewer.h 2010-01-05 06:36:31 UTC (rev 4850) @@ -50,6 +50,7 @@ void SetUpContext(); void SetPhotometricCorrect(bool state); void SetLayoutMode(bool state); + void SetLayoutScale(double scale); ViewState * m_view_state; protected: Modified: hugin/trunk/src/hugin1/hugin/MeshManager.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/MeshManager.cpp 2010-01-05 06:34:36 UTC (rev 4849) +++ hugin/trunk/src/hugin1/hugin/MeshManager.cpp 2010-01-05 06:36:31 UTC (rev 4850) @@ -98,6 +98,12 @@ meshes.clear(); } +void MeshManager::SetLayoutScale(double scale) +{ + for(unsigned int i=0;i<meshes.size();i++) + meshes[i].SetScaleFactor(scale); +}; + MeshManager::MeshInfo::MeshInfo(PT::Panorama * m_pano_in, unsigned int image_number_in, ViewState * view_state_in, @@ -108,7 +114,8 @@ m_view_state(view_state_in), remap(layout_mode_on_in ? (MeshRemapper *) new LayoutRemapper(m_pano, image_number, m_view_state) : (MeshRemapper *) new ChoosyRemapper(m_pano, image_number, m_view_state)), - layout_mode_on(layout_mode_on_in) + layout_mode_on(layout_mode_on_in), + scale_factor(3.0) { Update(); } @@ -121,7 +128,8 @@ m_view_state(source.m_view_state), remap(source.layout_mode_on ? (MeshRemapper *) new LayoutRemapper(source.m_pano, source.image_number, source.m_view_state) : (MeshRemapper *) new ChoosyRemapper(source.m_pano, source.image_number, source.m_view_state)), - layout_mode_on(source.layout_mode_on) + layout_mode_on(source.layout_mode_on), + scale_factor(3.0) { Update(); } @@ -140,7 +148,7 @@ * image, and find a more asthetic way to calculate it. */ double scale = m_view_state->GetVisibleArea().width() / - sqrt((double) m_pano->getNrOfImages()) / 3.0; + sqrt((double) m_pano->getNrOfImages()) / scale_factor; MeshRemapper & remapper_ref = *remap; LayoutRemapper &r = dynamic_cast<LayoutRemapper &>(remapper_ref); r.setScale(scale); @@ -148,6 +156,12 @@ CompileList(); } +void MeshManager::MeshInfo::SetScaleFactor(double scale) +{ + scale_factor=scale; + Update(); +}; + void MeshManager::MeshInfo::CallList() const { glCallList(display_list_number); Modified: hugin/trunk/src/hugin1/hugin/MeshManager.h =================================================================== --- hugin/trunk/src/hugin1/hugin/MeshManager.h 2010-01-05 06:34:36 UTC (rev 4849) +++ hugin/trunk/src/hugin1/hugin/MeshManager.h 2010-01-05 06:36:31 UTC (rev 4850) @@ -50,6 +50,7 @@ * @param state true to turn on layout mode, false to turn it off. */ void SetLayoutMode(bool state); + void SetLayoutScale(double scale); private: PT::Panorama * m_pano; ViewState * view_state; @@ -78,9 +79,11 @@ /// Recreate the mesh when the image or panorama it represents changes. void Update(); unsigned int display_list_number; + void SetScaleFactor(double scale); private: unsigned int image_number; PT::Panorama *m_pano; + double scale_factor; ViewState *m_view_state; /// The ramapper we should use MeshRemapper * remap; Deleted: hugin/trunk/src/hugin1/hugin/xrc/data/crop_tool.png =================================================================== (Binary files differ) Added: hugin/trunk/src/hugin1/hugin/xrc/data/crop_tool_small.png =================================================================== (Binary files differ) Property changes on: hugin/trunk/src/hugin1/hugin/xrc/data/crop_tool_small.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Deleted: hugin/trunk/src/hugin1/hugin/xrc/data/drag_tool.png =================================================================== (Binary files differ) Added: hugin/trunk/src/hugin1/hugin/xrc/data/drag_tool_small.png =================================================================== (Binary files differ) Property changes on: hugin/trunk/src/hugin1/hugin/xrc/data/drag_tool_small.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: hugin/trunk/src/hugin1/hugin/xrc/data/gl_preview_small.png =================================================================== (Binary files differ) Property changes on: hugin/trunk/src/hugin1/hugin/xrc/data/gl_preview_small.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: hugin/trunk/src/hugin1/hugin/xrc/data/identify_tool_small.png =================================================================== (Binary files differ) Property changes on: hugin/trunk/src/hugin1/hugin/xrc/data/identify_tool_small.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Deleted: hugin/trunk/src/hugin1/hugin/xrc/data/photometric.png =================================================================== (Binary files differ) Deleted: hugin/trunk/src/hugin1/hugin/xrc/data/preview_control_point_tool.png =================================================================== (Binary files differ) Deleted: hugin/trunk/src/hugin1/hugin/xrc/data/preview_layout.png =================================================================== (Binary files differ) Added: hugin/trunk/src/hugin1/hugin/xrc/data/preview_layout_small.png =================================================================== (Binary files differ) Property changes on: hugin/trunk/src/hugin1/hugin/xrc/data/preview_layout_small.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: hugin/trunk/src/hugin1/hugin/xrc/preview_frame.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/preview_frame.xrc 2010-01-05 06:34:36 UTC (rev 4849) +++ hugin/trunk/src/hugin1/hugin/xrc/preview_frame.xrc 2010-01-05 06:36:31 UTC (rev 4850) @@ -120,88 +120,7 @@ <packing>3</packing> <style>wxTB_DOCKABLE</style> </object> - <object class="wxToolBar" name="fast_preview_toolbar"> - <style>wxTB_FLAT|wxTB_TEXT</style> - <object class="tool" name="preview_layout_mode_tool"> - <toggle>1</toggle> - <bitmap>data/preview_layout.png</bitmap> - <tooltip>Show the images in their position without distortion</tooltip> - <label>Show layout</label> - </object> - <object class="separator"/> - <object class="tool" name="preview_center_tool"> - <bitmap>data/center_pano.png</bitmap> - <tooltip>Center the preview horizontally</tooltip> - <label>Center</label> - </object> - <object class="tool" name="preview_fit_pano_tool"> - <bitmap>data/fit_pano.png</bitmap> - <longhelp>Show the whole panorama</longhelp> - <tooltip>Estimate field of view</tooltip> - <label>Fit</label> - </object> - <object class="tool" name="preview_autocrop_tool"> - <bitmap>data/autocrop_tool.png</bitmap> - <tooltip>Set the crop region to the largest rectangle covered by images</tooltip> - <label>Autocrop</label> - </object> - <object class="tool" name="preview_straighten_pano_tool"> - <bitmap>data/straighten_pano.png</bitmap> - <tooltip>Automatically straighten a wavy horizon</tooltip> - <label>Straighten</label> - </object> - <object class="tool" name="preview_num_transform"> - <bitmap>data/preview_num_transform.png</bitmap> - <tooltip>Numerical Transform</tooltip> - <label>Num. Transf.</label> - </object> - <object class="separator"/> - <object class="tool" name="preview_show_all_tool"> - <bitmap>data/preview_show_all.png</bitmap> - <tooltip>Show all images</tooltip> - <label>All</label> - </object> - <object class="tool" name="preview_show_none_tool"> - <bitmap>data/preview_show_none.png</bitmap> - <tooltip>Show none of the images</tooltip> - <label>None</label> - </object> - <object class="separator"/> - <object class="tool" name="preview_photometric_tool"> - <toggle>1</toggle> - <bitmap>data/photometric.png</bitmap> - <tooltip>Use full photometric correction (slow)</tooltip> - <label>Photometrics</label> - </object> - <object class="separator"/> - <object class="tool" name="preview_drag_tool"> - <toggle>1</toggle> - <bitmap>data/drag_tool.png</bitmap> - <tooltip>Drag images into position</tooltip> - <label>Drag</label> - </object> - <object class="tool" name="preview_crop_tool"> - <toggle>1</toggle> - <bitmap>data/crop_tool.png</bitmap> - <tooltip>Manually change the panorama's cropping region</tooltip> - <label>Crop</label> - </object> - <object class="tool" name="preview_identify_tool"> - <toggle>1</toggle> - <bitmap>data/identify_tool.png</bitmap> - <tooltip>Match images to their numbers</tooltip> - <label>Identify</label> - </object> - <object class="tool" name="preview_control_point_tool"> - <toggle>1</toggle> - <bitmap>data/preview_control_point_tool.png</bitmap> - <tooltip>Show lines between the ends of each control point. The longer the line, the bigger the error</tooltip> - <label>Show control points</label> - </object> - <bitmapsize>22,22</bitmapsize> - <packing>3</packing> - <style>wxTB_DOCKABLE</style> - </object> + <object class="wxDialog" name="dlg_numtrans"> <title>Numerical Transform</title> <object class="wxBoxSizer"> @@ -284,4 +203,441 @@ </object> </object> </object> -</resource> + <object class="wxPanel" name="mode_panel"> + <object class="wxBoxSizer"> + <orient>wxHORIZONTAL</orient> + <object class="sizeritem"> + <object class="wxNotebook" name="mode_toolbar_notebook"> + <object class="notebookpage"> + <object class="wxPanel" name="preview_mode_panel"> + <object class="wxBoxSizer"> + <orient>wxHORIZONTAL</orient> + <object class="sizeritem"> + <object class="wxBoxSizer"> + <object class="sizeritem"> + <object class="wxToolBar" name="preview_mode_toolbar"> + <object class="tool" name="preview_identify_tool"> + <toggle>1</toggle> + <bitmap platform="unix|win">data/identify_tool.png</bitmap> + <bitmap platform="mac">data/identify_tool_small.png</bitmap> + <tooltip>Match images to their numbers</tooltip> + <label>Identify</label> + </object> + <bitmapsize>22,22</bitmapsize> + <style>wxTB_TEXT|wxTB_NODIVIDER</style> + </object> + <flag>wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTRE_HORIZONTAL|wxADJUST_MINSIZE</flag> + </object> + <object class="sizeritem" platform="mac"> + <object class="wxStaticText"> + <label>Identify</label> + </object> + <flag>wxALIGN_CENTRE_HORIZONTAL</flag> + </object> + <orient>wxVERTICAL</orient> + </object> + <flag>wxALL|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxStaticLine"> + <size>2,-1</size> + </object> + <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + </object> + <object class="sizeritem"> + <object class="wxBoxSizer"> + <object class="sizeritem"> + <object class="wxCheckBox" name="preview_photometric_tool"> + <label>Photometrics</label> + <tooltip>Use full photometric correction (slow)</tooltip> + </object> + <flag>wxALL</flag> + <border>2</border> + </object> + <object class="sizeritem"> + <object class="wxCheckBox" name="preview_control_point_tool"> + <label>Show control points</label> + <tooltip>Show lines between the ends of each control point. The longer the line, the bigger the error.</tooltip> + </object> + <flag>wxALL</flag> + <border>2</border> + </object> + <orient>wxVERTICAL</orient> + </object> + <flag>wxLEFT|wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>4</border> + </object> + <object class="sizeritem"> + <object class="wxStaticLine"> + <size>2,-1</size> + </object> + <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + </object> + <object class="sizeritem"> + <object class="wxBoxSize... [truncated message content] |
From: <tm...@us...> - 2010-01-06 06:29:46
|
Revision: 4854 http://hugin.svn.sourceforge.net/hugin/?rev=4854&view=rev Author: tmodes Date: 2010-01-06 06:29:37 +0000 (Wed, 06 Jan 2010) Log Message: ----------- Unified progress boxes Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp hugin/trunk/src/hugin1/hugin/ImagesPanel.cpp hugin/trunk/src/hugin1/hugin/PanoPanel.cpp Modified: hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp 2010-01-06 06:20:44 UTC (rev 4853) +++ hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp 2010-01-06 06:29:37 UTC (rev 4854) @@ -39,6 +39,7 @@ #include "panoinc.h" #include "base_wx/platform.h" +#include "base_wx/MyProgressDialog.h" #include "hugin/config_defaults.h" #include "hugin/GLPreviewFrame.h" #include "hugin/huginApp.h" @@ -1318,12 +1319,12 @@ void GLPreviewFrame::OnAutocrop(wxCommandEvent &e) { - wxProgressDialog progress(wxT(""), _("Calculating optimal crop"), 100, this); - progress.Pulse(); - DEBUG_INFO("Dirty ROI Calc\n"); - DEBUG_TRACE(""); if (m_pano.getActiveImages().size() == 0) return; + + ProgressReporterDialog progress(2, _("Autocrop"), _("Calculating optimal crop"),this, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_ELAPSED_TIME); + progress.increaseProgress(1); + progress.Pulse(); vigra::Rect2D newROI; vigra::Size2D newSize; Modified: hugin/trunk/src/hugin1/hugin/ImagesPanel.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/ImagesPanel.cpp 2010-01-06 06:20:44 UTC (rev 4853) +++ hugin/trunk/src/hugin1/hugin/ImagesPanel.cpp 2010-01-06 06:29:37 UTC (rev 4854) @@ -342,7 +342,9 @@ return; deregisterPTWXDlgFcn(); - ProgressReporterDialog progress(2, _("Cleaning Control points"), _("Checking pairwise"),this, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_ELAPSED_TIME); + // work around a flaw in wxProgresDialog that results in incorrect layout + // by pre-allocting sufficient horizontal space + ProgressReporterDialog progress(2, _("Cleaning Control points"), _("Checking pairwise")+wxString((wxChar)' ',10),this, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_ELAPSED_TIME); UIntSet CPremove=getCPoutsideLimit_pair(*pano,2.0); unsigned int NrRemoved=CPremove.size(); Modified: hugin/trunk/src/hugin1/hugin/PanoPanel.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/PanoPanel.cpp 2010-01-06 06:20:44 UTC (rev 4853) +++ hugin/trunk/src/hugin1/hugin/PanoPanel.cpp 2010-01-06 06:29:37 UTC (rev 4854) @@ -916,12 +916,11 @@ void PanoPanel::DoCalcOptimalROI(wxCommandEvent & e) { - wxProgressDialog progress(wxT(""), _("Calculating optimal crop"), 100, GetParent()->GetParent()); - progress.Pulse(); - //DoCalcOptimalWidth(e); - printf("Dirty ROI Calc\n"); - DEBUG_TRACE(""); + DEBUG_INFO("Dirty ROI Calc\n"); if (pano->getActiveImages().size() == 0) return; + ProgressReporterDialog progress(2, _("Autocrop"), _("Calculating optimal crop"),this, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_ELAPSED_TIME); + progress.increaseProgress(1); + progress.Pulse(); //unsigned int left,top,right,bottom; vigra::Rect2D newROI; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-01-06 06:33:00
|
Revision: 4856 http://hugin.svn.sourceforge.net/hugin/?rev=4856&view=rev Author: tmodes Date: 2010-01-06 06:32:54 +0000 (Wed, 06 Jan 2010) Log Message: ----------- Update optimize panel for better integration of translation parameters Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/OptimizePanel.cpp hugin/trunk/src/hugin1/hugin/xrc/optimize_panel.xrc Modified: hugin/trunk/src/hugin1/hugin/OptimizePanel.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/OptimizePanel.cpp 2010-01-06 06:31:18 UTC (rev 4855) +++ hugin/trunk/src/hugin1/hugin/OptimizePanel.cpp 2010-01-06 06:32:54 UTC (rev 4856) @@ -81,8 +81,8 @@ END_EVENT_TABLE() // local optimize definition. need to be in sync with the xrc file -enum OptimizeMode { OPT_PAIRWISE=0, OPT_YRP, OPT_YRP_V, - OPT_YRP_B, OPT_YRP_BV, OPT_ALL, OPT_CUSTOM, +enum OptimizeMode { OPT_PAIRWISE=0, OPT_YRP, OPT_YRP_XYZ, OPT_YRP_V, OPT_YRP_XYZ_V, + OPT_YRP_B, OPT_YRP_XYZ_B, OPT_YRP_BV, OPT_YRP_XYZ_BV, OPT_ALL, OPT_CUSTOM, OPT_END_MARKER}; OptimizePanel::OptimizePanel() @@ -614,9 +614,9 @@ optvars2.insert("p"); optvars2.insert("r"); // TODO: check tilt mode here, before inserting the parameters. - optvars2.insert("TrX"); + /* optvars2.insert("TrX"); optvars2.insert("TrY"); - optvars2.insert("TrZ"); + optvars2.insert("TrZ"); */ // remove vertical and horizontal control points CPVector cps = optPano.getCtrlPoints(); @@ -755,9 +755,15 @@ XRCCTRL(*this, "opt_yaw_select", wxButton)->Disable(); XRCCTRL(*this, "opt_roll_select", wxButton)->Disable(); XRCCTRL(*this, "opt_pitch_select", wxButton)->Disable(); + XRCCTRL(*this, "opt_x_select", wxButton)->Disable(); + XRCCTRL(*this, "opt_y_select", wxButton)->Disable(); + XRCCTRL(*this, "opt_z_select", wxButton)->Disable(); XRCCTRL(*this, "opt_yaw_clear", wxButton)->Disable(); XRCCTRL(*this, "opt_roll_clear", wxButton)->Disable(); XRCCTRL(*this, "opt_pitch_clear", wxButton)->Disable(); + XRCCTRL(*this, "opt_x_clear", wxButton)->Disable(); + XRCCTRL(*this, "opt_y_clear", wxButton)->Disable(); + XRCCTRL(*this, "opt_z_clear", wxButton)->Disable(); } else { switch (mode) { case OPT_PAIRWISE: @@ -765,11 +771,9 @@ SetCheckMark(m_yaw_list,true); SetCheckMark(m_roll_list,true); SetCheckMark(m_pitch_list,true); - /* - SetCheckMark(m_x_list,true); - SetCheckMark(m_y_list,true); - SetCheckMark(m_z_list,true); - */ + SetCheckMark(m_x_list,false); + SetCheckMark(m_y_list,false); + SetCheckMark(m_z_list,false); SetCheckMark(m_v_list,false); SetCheckMark(m_a_list,false); SetCheckMark(m_b_list,false); @@ -782,6 +786,9 @@ SetCheckMark(m_yaw_list,true); SetCheckMark(m_roll_list,true); SetCheckMark(m_pitch_list,true); + SetCheckMark(m_x_list,false); + SetCheckMark(m_y_list,false); + SetCheckMark(m_z_list,false); SetCheckMark(m_v_list,false); SetCheckMark(m_a_list,false); SetCheckMark(m_b_list,false); @@ -789,11 +796,29 @@ SetCheckMark(m_d_list,false); SetCheckMark(m_e_list,false); break; + case OPT_YRP_XYZ: + // position + translation + SetCheckMark(m_yaw_list,true); + SetCheckMark(m_roll_list,true); + SetCheckMark(m_pitch_list,true); + SetCheckMark(m_x_list,true); + SetCheckMark(m_y_list,true); + SetCheckMark(m_z_list,true); + SetCheckMark(m_v_list,false); + SetCheckMark(m_a_list,false); + SetCheckMark(m_b_list,false); + SetCheckMark(m_c_list,false); + SetCheckMark(m_d_list,false); + SetCheckMark(m_e_list,false); + break; case OPT_YRP_V: // v + position SetCheckMark(m_yaw_list,true); SetCheckMark(m_roll_list,true); SetCheckMark(m_pitch_list,true); + SetCheckMark(m_x_list,false); + SetCheckMark(m_y_list,false); + SetCheckMark(m_z_list,false); SetCheckMark(m_v_list,true); SetCheckMark(m_a_list,false); SetCheckMark(m_b_list,false); @@ -801,11 +826,29 @@ SetCheckMark(m_d_list,false); SetCheckMark(m_e_list,false); break; + case OPT_YRP_XYZ_V: + // v + position + translation + SetCheckMark(m_yaw_list,true); + SetCheckMark(m_roll_list,true); + SetCheckMark(m_pitch_list,true); + SetCheckMark(m_x_list,true); + SetCheckMark(m_y_list,true); + SetCheckMark(m_z_list,true); + SetCheckMark(m_v_list,true); + SetCheckMark(m_a_list,false); + SetCheckMark(m_b_list,false); + SetCheckMark(m_c_list,false); + SetCheckMark(m_d_list,false); + SetCheckMark(m_e_list,false); + break; case OPT_YRP_B: // important lens distortion + position SetCheckMark(m_yaw_list,true); SetCheckMark(m_roll_list,true); SetCheckMark(m_pitch_list,true); + SetCheckMark(m_x_list,false); + SetCheckMark(m_y_list,false); + SetCheckMark(m_z_list,false); SetCheckMark(m_v_list,false); SetCheckMark(m_a_list,false); SetCheckMark(m_b_list,true); @@ -813,11 +856,29 @@ SetCheckMark(m_d_list,false); SetCheckMark(m_e_list,false); break; + case OPT_YRP_XYZ_B: + // important lens distortion + position + translation + SetCheckMark(m_yaw_list,true); + SetCheckMark(m_roll_list,true); + SetCheckMark(m_pitch_list,true); + SetCheckMark(m_x_list,true); + SetCheckMark(m_y_list,true); + SetCheckMark(m_z_list,true); + SetCheckMark(m_v_list,false); + SetCheckMark(m_a_list,false); + SetCheckMark(m_b_list,true); + SetCheckMark(m_c_list,false); + SetCheckMark(m_d_list,false); + SetCheckMark(m_e_list,false); + break; case OPT_YRP_BV: // important lens distortion + v + position SetCheckMark(m_yaw_list,true); SetCheckMark(m_roll_list,true); SetCheckMark(m_pitch_list,true); + SetCheckMark(m_x_list,false); + SetCheckMark(m_y_list,false); + SetCheckMark(m_z_list,false); SetCheckMark(m_v_list,true); SetCheckMark(m_a_list,false); SetCheckMark(m_b_list,true); @@ -825,11 +886,29 @@ SetCheckMark(m_d_list,false); SetCheckMark(m_e_list,false); break; + case OPT_YRP_XYZ_BV: + // important lens distortion + v + position + translation + SetCheckMark(m_yaw_list,true); + SetCheckMark(m_roll_list,true); + SetCheckMark(m_pitch_list,true); + SetCheckMark(m_x_list,true); + SetCheckMark(m_y_list,true); + SetCheckMark(m_z_list,true); + SetCheckMark(m_v_list,true); + SetCheckMark(m_a_list,false); + SetCheckMark(m_b_list,true); + SetCheckMark(m_c_list,false); + SetCheckMark(m_d_list,false); + SetCheckMark(m_e_list,false); + break; case OPT_ALL: // everything SetCheckMark(m_yaw_list,true); SetCheckMark(m_roll_list,true); SetCheckMark(m_pitch_list,true); + SetCheckMark(m_x_list,true); + SetCheckMark(m_y_list,true); + SetCheckMark(m_z_list,true); SetCheckMark(m_v_list,true); SetCheckMark(m_a_list,true); SetCheckMark(m_b_list,true); @@ -906,7 +985,14 @@ default: break; } - + // don't optimize translation of anchor image + for (std::vector<unsigned int>::iterator it = refImgs.begin(); + it != refImgs.end(); it++) + { + m_x_list->Check(*it, false); + m_y_list->Check(*it, false); + m_z_list->Check(*it, false); + } // disable all manual settings m_yaw_list->Disable(); m_pitch_list->Disable(); @@ -923,9 +1009,15 @@ XRCCTRL(*this, "opt_yaw_select", wxButton)->Disable(); XRCCTRL(*this, "opt_roll_select", wxButton)->Disable(); XRCCTRL(*this, "opt_pitch_select", wxButton)->Disable(); + XRCCTRL(*this, "opt_x_select", wxButton)->Disable(); + XRCCTRL(*this, "opt_y_select", wxButton)->Disable(); + XRCCTRL(*this, "opt_z_select", wxButton)->Disable(); XRCCTRL(*this, "opt_yaw_clear", wxButton)->Disable(); XRCCTRL(*this, "opt_roll_clear", wxButton)->Disable(); XRCCTRL(*this, "opt_pitch_clear", wxButton)->Disable(); + XRCCTRL(*this, "opt_x_clear", wxButton)->Disable(); + XRCCTRL(*this, "opt_y_clear", wxButton)->Disable(); + XRCCTRL(*this, "opt_z_clear", wxButton)->Disable(); } else { m_yaw_list->Enable(); m_pitch_list->Enable(); @@ -942,9 +1034,15 @@ XRCCTRL(*this, "opt_yaw_select", wxButton)->Enable(); XRCCTRL(*this, "opt_roll_select", wxButton)->Enable(); XRCCTRL(*this, "opt_pitch_select", wxButton)->Enable(); + XRCCTRL(*this, "opt_x_select", wxButton)->Enable(); + XRCCTRL(*this, "opt_y_select", wxButton)->Enable(); + XRCCTRL(*this, "opt_z_select", wxButton)->Enable(); XRCCTRL(*this, "opt_yaw_clear", wxButton)->Enable(); XRCCTRL(*this, "opt_roll_clear", wxButton)->Enable(); XRCCTRL(*this, "opt_pitch_clear", wxButton)->Enable(); + XRCCTRL(*this, "opt_x_clear", wxButton)->Enable(); + XRCCTRL(*this, "opt_y_clear", wxButton)->Enable(); + XRCCTRL(*this, "opt_z_clear", wxButton)->Enable(); } } m_edit_cb->Enable(mode != OPT_PAIRWISE); Modified: hugin/trunk/src/hugin1/hugin/xrc/optimize_panel.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/optimize_panel.xrc 2010-01-06 06:31:18 UTC (rev 4855) +++ hugin/trunk/src/hugin1/hugin/xrc/optimize_panel.xrc 2010-01-06 06:32:54 UTC (rev 4856) @@ -37,9 +37,13 @@ <content> <item>Positions (incremental, starting from anchor)</item> <item>Positions (y,p,r)</item> + <item>Positions and Translation (y,p,r,x,y,z)</item> <item>Positions and View (y,p,r,v)</item> + <item>Positions, Translation and View (y,p,r,x,y,z,v)</item> <item>Positions and Barrel Distortion (y,p,r,b)</item> + <item>Positions, Translation and Barrel (y,p,r,x,y,z,b)</item> <item>Positions, View and Barrel (y,p,r,v,b)</item> + <item>Positions, Translation, View and Barrel (y,p,r,x,y,z,v,b)</item> <item>Everything</item> <item>the Custom parameters below</item> </content> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-01-11 06:39:23
|
Revision: 4870 http://hugin.svn.sourceforge.net/hugin/?rev=4870&view=rev Author: tmodes Date: 2010-01-11 06:39:15 +0000 (Mon, 11 Jan 2010) Log Message: ----------- Implemented import project feature Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/MainFrame.cpp hugin/trunk/src/hugin1/hugin/MainFrame.h hugin/trunk/src/hugin1/hugin/wxPanoCommand.cpp hugin/trunk/src/hugin1/hugin/wxPanoCommand.h hugin/trunk/src/hugin1/hugin/xrc/main_menu.xrc Modified: hugin/trunk/src/hugin1/hugin/MainFrame.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/MainFrame.cpp 2010-01-11 06:36:34 UTC (rev 4869) +++ hugin/trunk/src/hugin1/hugin/MainFrame.cpp 2010-01-11 06:39:15 UTC (rev 4870) @@ -143,6 +143,7 @@ EVT_MENU(XRCID("action_save_as_ptstitcher"), MainFrame::OnSavePTStitcherAs) EVT_MENU(XRCID("action_send_to_batch"), MainFrame::OnSendToBatch) EVT_MENU(XRCID("action_open_batch_processor"), MainFrame::OnOpenPTBatcher) + EVT_MENU(XRCID("action_import_project"), MainFrame::OnImportProject) EVT_MENU(XRCID("action_apply_template"), MainFrame::OnApplyTemplate) EVT_MENU(XRCID("action_exit_hugin"), MainFrame::OnUserQuit) EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, MainFrame::OnMRUFiles) @@ -1248,6 +1249,43 @@ pano_panel->DoStitch(); } +void MainFrame::OnImportProject(wxCommandEvent & e) +{ + // get the global config object + wxConfigBase* config = wxConfigBase::Get(); + + wxString defaultdir = config->Read(wxT("/actualPath"),wxT("")); + wxFileDialog dlg(this, + _("Open project file"), + defaultdir, wxT(""), + _("Project files (*.pto,*.ptp,*.pts,*.oto)|*.pto;*.ptp;*.pts;*.oto;|All files (*)|*"), + wxOPEN, wxDefaultPosition); + dlg.SetDirectory(defaultdir); + if (dlg.ShowModal() == wxID_OK) + { + wxString filename = dlg.GetPath(); + wxFileName fname(filename); + wxString path = fname.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR); + if (fname.IsOk() && fname.FileExists()) + { + wxBusyCursor wait; + deregisterPTWXDlgFcn(); + GlobalCmdHist::getInstance().addCommand( + new wxImportPTProjectCmd(pano,(const char *)filename.mb_str(HUGIN_CONV_FILENAME), (const char *)path.mb_str(HUGIN_CONV_FILENAME)) + ); + registerPTWXDlgFcn(MainFrame::Get()); + opt_panel->setModeCustom(); + pano.clearDirty(); + // force update of preview window + if ( !(preview_frame->IsIconized() ||(! preview_frame->IsShown()) ) ) + { + wxCommandEvent dummy; + preview_frame->OnUpdate(dummy); + } + }; + } +} + void MainFrame::OnApplyTemplate(wxCommandEvent & e) { // get the global config object Modified: hugin/trunk/src/hugin1/hugin/MainFrame.h =================================================================== --- hugin/trunk/src/hugin1/hugin/MainFrame.h 2010-01-11 06:36:34 UTC (rev 4869) +++ hugin/trunk/src/hugin1/hugin/MainFrame.h 2010-01-11 06:39:15 UTC (rev 4870) @@ -183,6 +183,7 @@ void OnNewProject(wxCommandEvent & e); void OnAddTimeImages(wxCommandEvent & e); void OnFineTuneAll(wxCommandEvent & e); + void OnImportProject(wxCommandEvent & e); void OnApplyTemplate(wxCommandEvent & e); void OnSendToBatch(wxCommandEvent & e); void OnOpenPTBatcher(wxCommandEvent & e); Modified: hugin/trunk/src/hugin1/hugin/wxPanoCommand.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/wxPanoCommand.cpp 2010-01-11 06:36:34 UTC (rev 4869) +++ hugin/trunk/src/hugin1/hugin/wxPanoCommand.cpp 2010-01-11 06:39:15 UTC (rev 4870) @@ -597,6 +597,127 @@ pano.changeFinished(); } +void wxImportPTProjectCmd::execute() +{ + PanoCommand::execute(); +#ifdef _Hgn1_PANOCOMMAND_H + Panorama& pano = o_pano; +#endif + Panorama new_pano; + wxLoadPTProjectCmd load(new_pano, filename, prefix); + load.execute(); + if(new_pano.getNrOfImages()>0) + { + vector<unsigned int> new_image_nr(new_pano.getNrOfImages()); + unsigned int oldNrOfImage=pano.getNrOfImages(); + HuginBase::OptimizeVector optVec=pano.getOptimizeVector(); + HuginBase::OptimizeVector optVecNew=new_pano.getOptimizeVector(); + //add only new images + for(unsigned int i=0;i<new_pano.getNrOfImages();i++) + { + std::string filename=new_pano.getImage(i).getFilename(); + bool found=false; + for(unsigned int j=0;j<pano.getNrOfImages();j++) + { + if(pano.getImage(j).getFilename()==filename) + { + //image is already in panorama, we remember the image nr + found=true; + new_image_nr[i]=j; + break; + }; + }; + if(!found) + { + //new image found, add it + new_image_nr[i]=pano.addImage(new_pano.getImage(i)); + //copy also optimise vector + optVec.push_back(optVecNew[i]); + }; + }; + pano.setOptimizeVector(optVec); + //now update lens numbers + HuginBase::StandardImageVariableGroups variable_groups(pano); + HuginBase::ImageVariableGroup & lenses = variable_groups.getLenses(); + HuginBase::StandardImageVariableGroups new_variable_groups(new_pano); + HuginBase::ImageVariableGroup & new_lenses = new_variable_groups.getLenses(); + for (unsigned int i=0; i<new_pano.getNrOfImages(); i++) + { + if(new_image_nr[i]>=oldNrOfImage) + { + //image was previously added + unsigned oldLens=new_lenses.getPartNumber(i); + for(unsigned int j=0; j<new_pano.getNrOfImages(); j++) + { + if(i==j) + continue; + if(new_lenses.getPartNumber(j)==oldLens) + { + if(new_image_nr[j]<oldNrOfImage) + { + lenses.switchParts(new_image_nr[i],lenses.getPartNumber(new_image_nr[j])); + lenses.updatePartNumbers(); + break; + }; + }; + }; + // no image which connects the present with the new pano + // so use the same check as in AddImage to conclude + // if the present pano contains a matching lens + const HuginBase::SrcPanoImage img=new_pano.getImage(i); + for (unsigned int j=0; j<oldNrOfImage; j++) + { + SrcPanoImage other = pano.getSrcImage(j); + if(other.getExifModel().size()>0 && other.getExifMake().size()>0) + { + if (other.getSize()==img.getSize() && + other.getExifModel()==img.getExifModel() && other.getExifMake()==img.getExifMake() && + other.getExifFocalLength()==img.getExifFocalLength()) + { + lenses.switchParts(new_image_nr[i],lenses.getPartNumber(j)); + lenses.updatePartNumbers(); + break; + } + } + else + { + // no exiv information, just check image size. + if (other.getSize()==img.getSize()) + { + lenses.switchParts(new_image_nr[i],lenses.getPartNumber(j)); + lenses.updatePartNumbers(); + break; + }; + }; + }; + }; + }; + // recreate links between image variables. + for (unsigned int i=0; i<new_pano.getNrOfImages(); i++) + { + for(unsigned int j=i+1;j<new_pano.getNrOfImages();j++) + { + const HuginBase::SrcPanoImage &img=new_pano.getImage(i); +#define image_variable( name, type, default_value )\ + if(img.name##isLinkedWith(new_pano.getImage(j)))\ + {\ + pano.linkImageVariable##name(new_image_nr[i],new_image_nr[j]);\ + }; +#include "panodata/image_variables.h" +#undef image_variable + } + } + //now translate cp + CPVector cps=new_pano.getCtrlPoints(); + for(unsigned int i=0;i<cps.size();i++) + { + HuginBase::ControlPoint cp(new_image_nr[cps[i].image1Nr], cps[i].x1, cps[i].y1, + new_image_nr[cps[i].image2Nr],cps[i].x2, cps[i].y2, cps[i].mode); + pano.addCtrlPoint(cp); + }; + }; + pano.changeFinished(); +} } // namespace Modified: hugin/trunk/src/hugin1/hugin/wxPanoCommand.h =================================================================== --- hugin/trunk/src/hugin1/hugin/wxPanoCommand.h 2010-01-11 06:36:34 UTC (rev 4869) +++ hugin/trunk/src/hugin1/hugin/wxPanoCommand.h 2010-01-11 06:39:15 UTC (rev 4870) @@ -112,6 +112,29 @@ std::istream & in; }; +/** load a new one and import it into current on. + * + */ +class wxImportPTProjectCmd : public PanoCommand +{ +public: + wxImportPTProjectCmd(Panorama & p, const std::string filename, const std::string prefix = "") + : PanoCommand(p), + filename(filename), + prefix(prefix) + { }; + + virtual void execute(); + + virtual std::string getName() const + { + return "import project"; + } +private: + const std::string filename; + const std::string prefix; +}; + //========================================================================= //========================================================================= Modified: hugin/trunk/src/hugin1/hugin/xrc/main_menu.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/main_menu.xrc 2010-01-11 06:36:34 UTC (rev 4869) +++ hugin/trunk/src/hugin1/hugin/xrc/main_menu.xrc 2010-01-11 06:39:15 UTC (rev 4870) @@ -41,6 +41,10 @@ <help>Opens PTBatcher, the batch processor for Hugin's project files</help> </object> <object class="separator"/> + <object class="wxMenuItem" name="action_import_project"> + <label>&Import Project...</label> + <help>Import an existing projection file into current project.</help> + </object> <object class="wxMenuItem" name="action_apply_template"> <label>Apply &Template</label> <help>Assign the settings of a previously saved project to the current images.</help> @@ -105,7 +109,7 @@ <label>&Fast Preview window</label> <accel>Ctrl-shift-p</accel> <help>Show the OpenGL preview window</help> - </object> + </object> </object> <object class="wxMenu" name="help_menu"> <label>&Help</label> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-01-11 06:45:03
|
Revision: 4871 http://hugin.svn.sourceforge.net/hugin/?rev=4871&view=rev Author: tmodes Date: 2010-01-11 06:44:54 +0000 (Mon, 11 Jan 2010) Log Message: ----------- Added new cp generator settings (multi-row, stacked multi-row, prealigned) Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.h hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc Modified: hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp 2010-01-11 06:39:15 UTC (rev 4870) +++ hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp 2010-01-11 06:44:54 UTC (rev 4871) @@ -35,11 +35,13 @@ #endif #include "PT/Panorama.h" +#include "PT/ImageGraph.h" #include "hugin/huginApp.h" #include "hugin/config_defaults.h" #include "hugin/AutoCtrlPointCreator.h" #include "hugin/CommandHistory.h" +#include <algorithms/optimizer/PTOptimizer.h> #include "base_wx/MyExternalCmdExecDialog.h" #include "base_wx/platform.h" @@ -54,7 +56,6 @@ #include <wx/cmdline.h> - #if defined MAC_SELF_CONTAINED_BUNDLE #include <wx/dir.h> #include <CoreFoundation/CFBundle.h> @@ -157,7 +158,7 @@ //check, if the cp generator exists if(!CanStartProg(setting.GetProg(),parent)) return cps; - if(t==CPDetector_AutoPanoSiftStack) + if(t==CPDetector_AutoPanoSiftStack || t==CPDetector_AutoPanoSiftMultiRowStack) if(!setting.GetProgStack().IsEmpty()) if(!CanStartProg(setting.GetProgStack(),parent)) return cps; @@ -183,6 +184,27 @@ cps = matcher.automatch(setting, pano, imgs, nFeatures, ret_value, parent); break; } + case CPDetector_AutoPanoSiftMultiRow: + { + // autopano-sift for multi-row panoramas + AutoPanoSiftMultiRow matcher; + cps = matcher.automatch(setting, pano, imgs, nFeatures, ret_value, parent); + break; + } + case CPDetector_AutoPanoSiftMultiRowStack: + { + // autopano-sift for multi-row panoramas with stacks + AutoPanoSiftMultiRowStack matcher; + cps = matcher.automatch(setting, pano, imgs, nFeatures, ret_value, parent); + break; + } + case CPDetector_AutoPanoSiftPreAlign: + { + // autopano-sift for panoramas with position information + AutoPanoSiftPreAlign matcher; + cps = matcher.automatch(setting, pano, imgs, nFeatures, ret_value, parent); + break; + } default: DEBUG_ERROR("Invalid autopano type"); } @@ -454,6 +476,25 @@ }; bool sort_img_ev (img_ev i1, img_ev i2) { return (i1.ev<i2.ev); }; +void AddControlPointsWithCheck(CPVector &cpv, CPVector &new_cp) +{ + for(unsigned int i=0;i<new_cp.size();i++) + { + HuginBase::ControlPoint cp=new_cp[i]; + bool duplicate=false; + for(unsigned int j=0;j<cpv.size();j++) + { + if(cp==cpv[j]) + { + duplicate=true; + break; + } + }; + if(!duplicate) + cpv.push_back(cp); + }; +}; + CPVector AutoPanoSiftStack::automatch(CPDetectorSetting &setting, Panorama & pano, const UIntSet & imgs, int nFeatures, int & ret_value, wxWindow *parent) { @@ -526,12 +567,7 @@ AutoPanoSift matcher; CPVector new_cps=matcher.automatch(stack_setting, pano, images_stack, nFeatures, ret_value, parent); if(new_cps.size()>0) - { - unsigned int old_size=cps.size(); - cps.resize(old_size+new_cps.size()); - for(unsigned int k=0;k<new_cps.size();k++) - cps[old_size+k]=new_cps[k]; - }; + AddControlPointsWithCheck(cps,new_cps); if(ret_value!=0) return cps; }; @@ -539,3 +575,240 @@ } return cps; }; + +CPVector AutoPanoSiftMultiRow::automatch(CPDetectorSetting &setting, Panorama & pano, const UIntSet & imgs, + int nFeatures, int & ret_value, wxWindow *parent) +{ + CPVector cps; + if (imgs.size() < 2) + { + return cps; + }; + //generate cp for every consecutive image pair + unsigned int counter=0; + for(UIntSet::const_iterator it = imgs.begin(); it != imgs.end(); ) + { + if(counter==imgs.size()-1) + break; + counter++; + UIntSet ImagePair; + ImagePair.clear(); + ImagePair.insert(*it); + it++; + ImagePair.insert(*it); + AutoPanoSift matcher; + CPVector new_cps; + new_cps.clear(); + new_cps=matcher.automatch(setting, pano, ImagePair, nFeatures, ret_value, parent); + if(new_cps.size()>0) + AddControlPointsWithCheck(cps,new_cps); + if(ret_value!=0) + return cps; + }; + // now connect all image groups + // generate temporary panorama to add all found cps + UIntSet allImgs; + fill_set(allImgs, 0, pano.getNrOfImages()-1); + Panorama optPano=pano.getSubset(allImgs); + for (CPVector::const_iterator it=cps.begin();it!=cps.end();++it) + optPano.addCtrlPoint(*it); + + CPGraph graph; + createCPGraph(optPano, graph); + CPComponents comps; + int n = findCPComponents(graph, comps); + if(n>1) + { + UIntSet ImagesGroups; + for(unsigned int i=0;i<n;i++) + { + ImagesGroups.insert(*(comps[i].begin())); + if(comps[i].size()>1) + ImagesGroups.insert(*(comps[i].rbegin())); + }; + AutoPanoSift matcher; + CPVector new_cps; + new_cps=matcher.automatch(setting, optPano, ImagesGroups, nFeatures, ret_value, parent); + if(new_cps.size()>0) + { + AddControlPointsWithCheck(cps,new_cps); + //also add cp to temporary pano + for (CPVector::const_iterator it=new_cps.begin();it!=new_cps.end();++it) + optPano.addCtrlPoint(*it); + }; + if(ret_value!=0) + return cps; + }; + createCPGraph(optPano,graph); + n=findCPComponents(graph, comps); + if(n==1 && setting.GetOption()) + { + //next steps happens only when all images are connected; + //now optimize panorama + PanoramaOptions opts = pano.getOptions(); + opts.setProjection(PanoramaOptions::EQUIRECTANGULAR); + // calculate proper scaling, 1:1 resolution. + // Otherwise optimizer distances are meaningless. + opts.setWidth(30000, false); + opts.setHeight(15000); + + optPano.setOptions(opts); + int w = optPano.calcOptimalWidth(); + opts.setWidth(w); + opts.setHeight(w/2); + optPano.setOptions(opts); + + //generate optimize vector, optimize only yaw and pitch + OptimizeVector optvars; + const SrcPanoImage & anchorImage = optPano.getImage(opts.optimizeReferenceImage); + for (unsigned i=0; i < optPano.getNrOfImages(); i++) + { + std::set<std::string> imgopt; + // do not optimize anchor image's stack for position. + if(!optPano.getImage(i).YawisLinkedWith(anchorImage)) + { + imgopt.insert("p"); + imgopt.insert("y"); + } + optvars.push_back(imgopt); + } + optPano.setOptimizeVector(optvars); + HuginBase::PTools::optimize(optPano); + //and find cp on overlapping images + AutoPanoSiftPreAlign matcher; + CPVector new_cps; + new_cps=matcher.automatch(setting, optPano, imgs, nFeatures, ret_value, parent); + if(new_cps.size()>0) + AddControlPointsWithCheck(cps,new_cps); + }; + return cps; +}; + +CPVector AutoPanoSiftMultiRowStack::automatch(CPDetectorSetting &setting, Panorama & pano, const UIntSet & imgs, + int nFeatures, int & ret_value, wxWindow *parent) +{ + CPVector cps; + if (imgs.size() == 0) { + return cps; + }; + std::vector<stack_img> stack_images; + HuginBase::StandardImageVariableGroups* variable_groups = new HuginBase::StandardImageVariableGroups(pano); + for(UIntSet::const_iterator it = imgs.begin(); it != imgs.end(); it++) + { + unsigned int stack_nr=variable_groups->getStacks().getPartNumber(*it); + //check, if this stack is already in list + bool found=false; + unsigned int index=0; + for(index=0;index<stack_images.size();index++) + { + found=(stack_images[index].layer_nr==stack_nr); + if(found) + break; + }; + if(!found) + { + //new stack + stack_images.resize(stack_images.size()+1); + index=stack_images.size()-1; + //add new stack + stack_images[index].layer_nr=stack_nr; + }; + //add new image + unsigned int new_image_index=stack_images[index].images.size(); + stack_images[index].images.resize(new_image_index+1); + stack_images[index].images[new_image_index].img_nr=*it; + stack_images[index].images[new_image_index].ev=pano.getImage(*it).getExposure(); + }; + delete variable_groups; + //get image with median exposure for search with cp generator + UIntSet images_layer; + for(unsigned int i=0;i<stack_images.size();i++) + { + std::sort(stack_images[i].images.begin(),stack_images[i].images.end(),sort_img_ev); + unsigned int median=stack_images[i].images.size() / 2; + images_layer.insert(stack_images[i].images[median].img_nr); + }; + ret_value=0; + //work on all stacks + if(!setting.GetProgStack().IsEmpty()) + { + CPDetectorSetting stack_setting; + stack_setting.SetType(CPDetector_AutoPanoSift); + stack_setting.SetProg(setting.GetProgStack()); + stack_setting.SetArgs(setting.GetArgsStack()); + + for(unsigned int i=0;i<stack_images.size();i++) + { + UIntSet images_stack; + images_stack.clear(); + for(unsigned int j=0;j<stack_images[i].images.size();j++) + images_stack.insert(stack_images[i].images[j].img_nr); + if(images_stack.size()>1) + { + AutoPanoSift matcher; + CPVector new_cps=matcher.automatch(stack_setting, pano, images_stack, nFeatures, ret_value, parent); + if(new_cps.size()>0) + AddControlPointsWithCheck(cps,new_cps); + if(ret_value!=0) + return cps; + }; + }; + } + //generate cp for median exposure with multi-row algorithm + if(images_layer.size()>1) + { + AutoPanoSiftMultiRow matcher; + CPVector new_cps=matcher.automatch(setting, pano, images_layer, nFeatures, ret_value, parent); + if(new_cps.size()>0) + AddControlPointsWithCheck(cps,new_cps); + }; + return cps; +}; + +CPVector AutoPanoSiftPreAlign::automatch(CPDetectorSetting &setting, Panorama & pano, const UIntSet & imgs, + int nFeatures, int & ret_value, wxWindow *parent) +{ + CPVector cps; + if (imgs.size()<2) + return cps; + vector<UIntSet> usedImages; + usedImages.resize(pano.getNrOfImages()); + for(UIntSet::const_iterator it=imgs.begin();it!=imgs.end();it++) + { + UIntSet images; + images.clear(); + images.insert(*it); + SrcPanoImage simg = pano.getSrcImage(*it); + double maxShift = simg.getHFOV(); + double minShiftYaw = 360.0 - maxShift; + double minShiftPitch = 180.0 - maxShift; + UIntSet::const_iterator it2=it; + for(++it2;it2!=imgs.end();it2++) + { + //check if this image pair was yet used + if(set_contains(usedImages[*it2],*it)) + continue; + //now check position + SrcPanoImage simg2 = pano.getSrcImage(*it2); + double diffYaw=fabs(simg.getYaw()-simg2.getYaw()); + double diffPitch=fabs(simg.getPitch()-simg2.getPitch()); + if((diffYaw<maxShift || diffYaw>minShiftYaw) && (diffPitch<maxShift || diffPitch>minShiftPitch)) + { + images.insert(*it2); + }; + }; + if(images.size()<2) + continue; + //remember image pairs for later + for(UIntSet::const_iterator img_it=images.begin();img_it!=images.end();img_it++) + for(UIntSet::const_iterator img_it2=images.begin();img_it2!=images.end();img_it2++) + usedImages[*img_it].insert(*img_it2); + AutoPanoSift matcher; + CPVector new_cps=matcher.automatch(setting, pano, images, nFeatures, ret_value, parent); + if(new_cps.size()>0) + AddControlPointsWithCheck(cps,new_cps); + if(ret_value!=0) + return cps; + }; + return cps; +}; Modified: hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.h =================================================================== --- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.h 2010-01-11 06:39:15 UTC (rev 4870) +++ hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.h 2010-01-11 06:44:54 UTC (rev 4871) @@ -123,5 +123,67 @@ }; +/** A matcher for multi-row panoramas based on an idea by Bruno Postle */ +class AutoPanoSiftMultiRow : public AutoCtrlPointCreator +{ +public: + /** ctor. + */ + AutoPanoSiftMultiRow() {}; + + /** dtor. + */ + virtual ~AutoPanoSiftMultiRow() {} ; + + virtual CPVector automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, + int nFeatures, int & ret_value, wxWindow *parent=NULL); + +private: + + +}; + +/** A matcher for multi-rows, which considers stacks */ +class AutoPanoSiftMultiRowStack : public AutoCtrlPointCreator +{ +public: + + /** ctor. + */ + AutoPanoSiftMultiRowStack() {}; + + /** dtor. + */ + virtual ~AutoPanoSiftMultiRowStack() {} ; + + virtual CPVector automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, + int nFeatures, int & ret_value, wxWindow *parent=NULL); + +private: + + +}; + +/** A matcher that uses the align information in the panorama to generate cp between overlapping images */ +class AutoPanoSiftPreAlign : public AutoCtrlPointCreator +{ +public: + + /** ctor. + */ + AutoPanoSiftPreAlign() {}; + + /** dtor. + */ + virtual ~AutoPanoSiftPreAlign() {} ; + + virtual CPVector automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, + int nFeatures, int & ret_value, wxWindow *parent=NULL); + +private: + + +}; + #endif // _AUTOCTRLPOINTCREATOR_H Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp 2010-01-11 06:39:15 UTC (rev 4870) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp 2010-01-11 06:44:54 UTC (rev 4871) @@ -144,7 +144,7 @@ desc=default_cpdetectors[new_type].desc; prog=default_cpdetectors[new_type].prog; args=default_cpdetectors[new_type].args; - if(type==CPDetector_AutoPanoSiftStack) + if(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack) { prog_stack=default_cpdetectors[new_type].prog_stack; args_stack=default_cpdetectors[new_type].args_stack; @@ -154,6 +154,7 @@ prog_stack=wxEmptyString; args_stack=wxEmptyString; }; + option=default_cpdetectors[new_type].option; }; }; }; @@ -164,7 +165,7 @@ desc=config->Read(path+wxT("/Description"),default_cpdetectors[0].desc); prog=config->Read(path+wxT("/Program"),default_cpdetectors[0].prog); args=config->Read(path+wxT("/Arguments"),default_cpdetectors[0].args); - if(type==CPDetector_AutoPanoSiftStack) + if(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack) { prog_stack=config->Read(path+wxT("/ProgramStack"),default_cpdetectors[0].prog_stack); args_stack=config->Read(path+wxT("/ArgumentsStack"),default_cpdetectors[0].args_stack); @@ -174,6 +175,7 @@ prog_stack=wxEmptyString; args_stack=wxEmptyString; }; + option=config->Read(path+wxT("/Option"),default_cpdetectors[0].option); }; void CPDetectorSetting::Write(wxConfigBase *config, wxString path) @@ -182,11 +184,12 @@ config->Write(path+wxT("/Description"),desc); config->Write(path+wxT("/Program"),prog); config->Write(path+wxT("/Arguments"),args); - if(type==CPDetector_AutoPanoSiftStack) + if(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack) { config->Write(path+wxT("/ProgramStack"),prog_stack); config->Write(path+wxT("/ArgumentsStack"),args_stack); }; + config->Write(path+wxT("/Option"),option); }; // dialog for showing settings of one autopano setting @@ -216,6 +219,7 @@ m_edit_args = XRCCTRL(*this, "prefs_cpdetector_args", wxTextCtrl); m_edit_prog_stack = XRCCTRL(*this, "prefs_cpdetector_program_stack", wxTextCtrl); m_edit_args_stack = XRCCTRL(*this, "prefs_cpdetector_args_stack", wxTextCtrl); + m_check_option_multirow = XRCCTRL(*this, "prefs_cpdetector_option_multirow", wxCheckBox); m_cpdetector_type = XRCCTRL(*this, "prefs_cpdetector_type", wxChoice); m_cpdetector_type->SetSelection(1); ChangeType(); @@ -240,7 +244,8 @@ valid=valid && (m_edit_desc->GetValue().Trim().Len()>0); valid=valid && (m_edit_prog->GetValue().Trim().Len()>0); valid=valid && (m_edit_args->GetValue().Trim().Len()>0); - if(m_cpdetector_type->GetSelection()==CPDetector_AutoPanoSiftStack) + int type=m_cpdetector_type->GetSelection(); + if(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack) if(m_edit_prog_stack->GetValue().Trim().Len()>0) valid=valid && (m_edit_args_stack->GetValue().Trim().Len()>0); if(valid) @@ -255,12 +260,14 @@ m_edit_desc->SetValue(cpdet_config->settings[index].GetCPDetectorDesc()); m_edit_prog->SetValue(cpdet_config->settings[index].GetProg()); m_edit_args->SetValue(cpdet_config->settings[index].GetArgs()); - if(cpdet_config->settings[index].GetType()==CPDetector_AutoPanoSiftStack) + int type=cpdet_config->settings[index].GetType(); + if(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack) { m_edit_prog_stack->SetValue(cpdet_config->settings[index].GetProgStack()); m_edit_args_stack->SetValue(cpdet_config->settings[index].GetArgsStack()); }; - m_cpdetector_type->SetSelection(cpdet_config->settings[index].GetType()); + m_cpdetector_type->SetSelection(type); + m_check_option_multirow->SetValue(cpdet_config->settings[index].GetOption()); ChangeType(); }; @@ -270,11 +277,13 @@ cpdet_config->settings[index].SetProg(m_edit_prog->GetValue().Trim()); cpdet_config->settings[index].SetArgs(m_edit_args->GetValue().Trim()); cpdet_config->settings[index].SetType((CPDetectorType)m_cpdetector_type->GetSelection()); - if(cpdet_config->settings[index].GetType()==CPDetector_AutoPanoSiftStack) + CPDetectorType type=cpdet_config->settings[index].GetType(); + if(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack) { cpdet_config->settings[index].SetProgStack(m_edit_prog_stack->GetValue().Trim()); cpdet_config->settings[index].SetArgsStack(m_edit_args_stack->GetValue().Trim()); }; + cpdet_config->settings[index].SetOption(m_check_option_multirow->IsChecked()); }; void CPDetectorDialog::OnTypeChange(wxCommandEvent &e) @@ -284,9 +293,13 @@ void CPDetectorDialog::ChangeType() { + int type=m_cpdetector_type->GetSelection(); wxPanel* panel=XRCCTRL(*this,"panel_stack",wxPanel); - panel->Show(m_cpdetector_type->GetSelection()==CPDetector_AutoPanoSiftStack); - panel->Enable(m_cpdetector_type->GetSelection()==CPDetector_AutoPanoSiftStack); + panel->Show(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack); + panel->Enable(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack); + panel=XRCCTRL(*this,"panel_multirow",wxPanel); + panel->Show(type==CPDetector_AutoPanoSiftMultiRow || type==CPDetector_AutoPanoSiftMultiRowStack); + panel->Enable(type==CPDetector_AutoPanoSiftMultiRow || type==CPDetector_AutoPanoSiftMultiRowStack); Layout(); }; Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h 2010-01-11 06:39:15 UTC (rev 4870) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h 2010-01-11 06:44:54 UTC (rev 4871) @@ -38,7 +38,10 @@ { CPDetector_AutoPano=0, CPDetector_AutoPanoSift=1, - CPDetector_AutoPanoSiftStack=2 + CPDetector_AutoPanoSiftStack=2, + CPDetector_AutoPanoSiftMultiRow=3, + CPDetector_AutoPanoSiftMultiRowStack=4, + CPDetector_AutoPanoSiftPreAlign=5 }; /** class, which stores all settings of one cp detector */ @@ -78,9 +81,18 @@ const wxString GetArgsStack() {return args_stack; }; /** sets arguments of program for detection of cp in stacks */ void SetArgsStack(wxString new_args) { args_stack=new_args; }; + /** gets options, currently only used in multi-row cp detectors */ + const bool GetOption() { return option; } + /** set options, currently only used in multi-row cp detectors */ + void SetOption(bool new_option) { option=new_option; }; private: CPDetectorType type; - wxString desc, prog, args, prog_stack, args_stack; + wxString desc; + wxString prog; + wxString args; + wxString prog_stack; + wxString args_stack; + bool option; }; WX_DECLARE_OBJARRAY(CPDetectorSetting,ArraySettings); @@ -146,7 +158,12 @@ /** update dialog, when other cp detector type is changed */ void OnTypeChange(wxCommandEvent &e); private: - wxTextCtrl *m_edit_desc, *m_edit_prog, *m_edit_args, *m_edit_prog_stack, *m_edit_args_stack; + wxTextCtrl *m_edit_desc; + wxTextCtrl *m_edit_prog; + wxTextCtrl *m_edit_args; + wxTextCtrl *m_edit_prog_stack; + wxTextCtrl *m_edit_args_stack; + wxCheckBox *m_check_option_multirow; wxChoice *m_cpdetector_type; void ChangeType(); Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h 2010-01-11 06:39:15 UTC (rev 4870) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h 2010-01-11 06:44:54 UTC (rev 4871) @@ -46,30 +46,32 @@ wxString prog_stack; /** arguments of cp detector for stacks */ wxString args_stack; + /** option, currently only used in multi row detectors */ + bool option; }; /** this array saves all default settings */ const struct cpdetector_default default_cpdetectors[]= { -/* use following order: {type, description, program name, arguments, program name stack, arguments stack} +/* use following order: {type, description, program name, arguments, program name stack, arguments stack, option} attention: this array have to contain at least one item */ #if defined WIN32 {CPDetector_AutoPanoSift, wxT("Autopano-SIFT-C"), wxT("autopano-sift-c.exe"),wxT("--maxmatches %p --projection %f,%v %o %i"), - wxT(""), wxT("")}, + wxT(""), wxT(""), true}, {CPDetector_AutoPano, wxT("Autopano"), wxT("autopano.exe"),wxT("/allinone /path:%d /keys:%p /project:oto /name:%o /size:1024 /f %i"), - wxT(""), wxT("")}, - {CPDetector_AutoPanoSift, wxT("Panomatic"),wxT("panomatic.exe"),wxT("-o %o %i"),wxT(""), wxT("")}, - {CPDetector_AutoPanoSift, wxT("Align image stack"),wxT("align_image_stack.exe"),wxT("-f %v -p %o %i"),wxT(""),wxT("")}, - {CPDetector_AutoPanoSift, wxT("Match-n-shift"),wxT("match-n-shift.exe"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT("")} + wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift, wxT("Panomatic"),wxT("panomatic.exe"),wxT("-o %o %i"),wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift, wxT("Align image stack"),wxT("align_image_stack.exe"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), true}, + {CPDetector_AutoPanoSift, wxT("Match-n-shift"),wxT("match-n-shift.exe"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT(""), true} #else #if !defined MAC_SELF_CONTAINED_BUNDLE // Since medio 2008 the MacOSX bundle comes without default CPgenerators due to patent restrictions. - {CPDetector_AutoPanoSift,wxT("Autopano-SIFT-C"),wxT("autopano-noop.sh"),wxT("--maxmatches %p --projection %f,%v %o %i"),wxT(""),wxT("")}, - {CPDetector_AutoPanoSift,wxT("Panomatic"),wxT("panomatic"),wxT("-o %o %i"),wxT(""),wxT("")}, - {CPDetector_AutoPanoSift,wxT("Match-n-shift"),wxT("match-n-shift"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT("")}, - {CPDetector_AutoPanoSift,wxT("Align image stack"),wxT("align_image_stack"),wxT("-f %v -p %o %i"),wxT(""),wxT("")} + {CPDetector_AutoPanoSift,wxT("Autopano-SIFT-C"),wxT("autopano-noop.sh"),wxT("--maxmatches %p --projection %f,%v %o %i"),wxT(""),wxT(""), true}, + {CPDetector_AutoPanoSift,wxT("Panomatic"),wxT("panomatic"),wxT("-o %o %i"),wxT(""),wxT(""), true}, + {CPDetector_AutoPanoSift,wxT("Match-n-shift"),wxT("match-n-shift"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT(""),true}, + {CPDetector_AutoPanoSift,wxT("Align image stack"),wxT("align_image_stack"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), true} #endif #endif }; Modified: hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc 2010-01-11 06:39:15 UTC (rev 4870) +++ hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc 2010-01-11 06:44:54 UTC (rev 4871) @@ -32,8 +32,11 @@ <object class="wxChoice" name="prefs_cpdetector_type"> <content> <item>Autopano (by A. Jenny)</item> - <item>Autopano-SIFT</item> - <item>Autopano-SIFT, stack aware</item> + <item>All images at once</item> + <item>Panorama with stacks</item> + <item>Multi-row panorama</item> + <item>Multi-row panorama with stacks</item> + <item>Prealigned panorama</item> </content> </object> <flag>wxALL</flag> @@ -143,6 +146,22 @@ <flag>wxEXPAND</flag> </object> <object class="sizeritem"> + <object class="wxPanel" name="panel_multirow"> + <object class="wxStaticBoxSizer"> + <label>Multi-row detector</label> + <orient>wxVERTICAL</orient> + <object class="sizeritem"> + <object class="wxCheckBox" name="prefs_cpdetector_option_multirow"> + <label>Try to connect all overlapping images.</label> + </object> + <flag>wxALL|wxEXPAND</flag> + <border>5</border> + </object> + </object> + </object> + <flag>wxEXPAND</flag> + </object> + <object class="sizeritem"> <object class="wxStaticText"> <label>following patterns will be substituted before running: %o -- output project (0.oto will be appended when using Autopano) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-01-12 06:22:23
|
Revision: 4877 http://hugin.svn.sourceforge.net/hugin/?rev=4877&view=rev Author: tmodes Date: 2010-01-12 06:22:17 +0000 (Tue, 12 Jan 2010) Log Message: ----------- Fixes some issues with import function Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/MainFrame.cpp hugin/trunk/src/hugin1/hugin/wxPanoCommand.cpp Modified: hugin/trunk/src/hugin1/hugin/MainFrame.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/MainFrame.cpp 2010-01-11 14:10:24 UTC (rev 4876) +++ hugin/trunk/src/hugin1/hugin/MainFrame.cpp 2010-01-12 06:22:17 UTC (rev 4877) @@ -1276,6 +1276,7 @@ registerPTWXDlgFcn(MainFrame::Get()); opt_panel->setModeCustom(); pano.clearDirty(); + m_mruFiles.AddFileToHistory(fname.GetFullPath()); // force update of preview window if ( !(preview_frame->IsIconized() ||(! preview_frame->IsShown()) ) ) { Modified: hugin/trunk/src/hugin1/hugin/wxPanoCommand.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/wxPanoCommand.cpp 2010-01-11 14:10:24 UTC (rev 4876) +++ hugin/trunk/src/hugin1/hugin/wxPanoCommand.cpp 2010-01-12 06:22:17 UTC (rev 4877) @@ -647,6 +647,7 @@ { //image was previously added unsigned oldLens=new_lenses.getPartNumber(i); + bool foundLens=false; for(unsigned int j=0; j<new_pano.getNrOfImages(); j++) { if(i==j) @@ -657,10 +658,13 @@ { lenses.switchParts(new_image_nr[i],lenses.getPartNumber(new_image_nr[j])); lenses.updatePartNumbers(); + foundLens=true; break; }; }; }; + if(foundLens) + continue; // no image which connects the present with the new pano // so use the same check as in AddImage to conclude // if the present pano contains a matching lens This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-01-12 06:24:19
|
Revision: 4878 http://hugin.svn.sourceforge.net/hugin/?rev=4878&view=rev Author: tmodes Date: 2010-01-12 06:24:10 +0000 (Tue, 12 Jan 2010) Log Message: ----------- Some improvements for new cp detector settings Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc Modified: hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp 2010-01-12 06:22:17 UTC (rev 4877) +++ hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp 2010-01-12 06:24:10 UTC (rev 4878) @@ -476,7 +476,7 @@ }; bool sort_img_ev (img_ev i1, img_ev i2) { return (i1.ev<i2.ev); }; -void AddControlPointsWithCheck(CPVector &cpv, CPVector &new_cp) +void AddControlPointsWithCheck(CPVector &cpv, CPVector &new_cp, Panorama *pano=NULL) { for(unsigned int i=0;i<new_cp.size();i++) { @@ -491,7 +491,11 @@ } }; if(!duplicate) + { cpv.push_back(cp); + if(pano!=NULL) + pano->addCtrlPoint(cp); + }; }; }; @@ -630,17 +634,12 @@ CPVector new_cps; new_cps=matcher.automatch(setting, optPano, ImagesGroups, nFeatures, ret_value, parent); if(new_cps.size()>0) - { - AddControlPointsWithCheck(cps,new_cps); - //also add cp to temporary pano - for (CPVector::const_iterator it=new_cps.begin();it!=new_cps.end();++it) - optPano.addCtrlPoint(*it); - }; + AddControlPointsWithCheck(cps,new_cps,&optPano); if(ret_value!=0) return cps; + createCPGraph(optPano,graph); + n=findCPComponents(graph, comps); }; - createCPGraph(optPano,graph); - n=findCPComponents(graph, comps); if(n==1 && setting.GetOption()) { //next steps happens only when all images are connected; @@ -675,9 +674,14 @@ optPano.setOptimizeVector(optvars); HuginBase::PTools::optimize(optPano); //and find cp on overlapping images + //work only on image pairs, which are not yet connected AutoPanoSiftPreAlign matcher; + CPDetectorSetting newSetting; + newSetting.SetProg(setting.GetProg()); + newSetting.SetArgs(setting.GetArgs()); + newSetting.SetOption(true); CPVector new_cps; - new_cps=matcher.automatch(setting, optPano, imgs, nFeatures, ret_value, parent); + new_cps=matcher.automatch(newSetting, optPano, imgs, nFeatures, ret_value, parent); if(new_cps.size()>0) AddControlPointsWithCheck(cps,new_cps); }; @@ -757,8 +761,15 @@ //generate cp for median exposure with multi-row algorithm if(images_layer.size()>1) { + UIntSet allImgs; + fill_set(allImgs, 0, pano.getNrOfImages()-1); + Panorama newPano=pano.getSubset(allImgs); + if(cps.size()>0) + for (CPVector::const_iterator it=cps.begin();it!=cps.end();++it) + newPano.addCtrlPoint(*it); + AutoPanoSiftMultiRow matcher; - CPVector new_cps=matcher.automatch(setting, pano, images_layer, nFeatures, ret_value, parent); + CPVector new_cps=matcher.automatch(setting, newPano, images_layer, nFeatures, ret_value, parent); if(new_cps.size()>0) AddControlPointsWithCheck(cps,new_cps); }; @@ -773,6 +784,19 @@ return cps; vector<UIntSet> usedImages; usedImages.resize(pano.getNrOfImages()); + if(setting.GetOption()) + { + //only work on not connected image pairs + CPVector oldCps=pano.getCtrlPoints(); + for(unsigned i=0;i<oldCps.size();i++) + { + if(oldCps[i].mode==ControlPoint::X_Y) + { + usedImages[oldCps[i].image1Nr].insert(oldCps[i].image2Nr); + usedImages[oldCps[i].image2Nr].insert(oldCps[i].image1Nr); + }; + }; + }; for(UIntSet::const_iterator it=imgs.begin();it!=imgs.end();it++) { UIntSet images; Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp 2010-01-12 06:22:17 UTC (rev 4877) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp 2010-01-12 06:24:10 UTC (rev 4878) @@ -219,7 +219,7 @@ m_edit_args = XRCCTRL(*this, "prefs_cpdetector_args", wxTextCtrl); m_edit_prog_stack = XRCCTRL(*this, "prefs_cpdetector_program_stack", wxTextCtrl); m_edit_args_stack = XRCCTRL(*this, "prefs_cpdetector_args_stack", wxTextCtrl); - m_check_option_multirow = XRCCTRL(*this, "prefs_cpdetector_option_multirow", wxCheckBox); + m_check_option = XRCCTRL(*this, "prefs_cpdetector_option", wxCheckBox); m_cpdetector_type = XRCCTRL(*this, "prefs_cpdetector_type", wxChoice); m_cpdetector_type->SetSelection(1); ChangeType(); @@ -267,7 +267,7 @@ m_edit_args_stack->SetValue(cpdet_config->settings[index].GetArgsStack()); }; m_cpdetector_type->SetSelection(type); - m_check_option_multirow->SetValue(cpdet_config->settings[index].GetOption()); + m_check_option->SetValue(cpdet_config->settings[index].GetOption()); ChangeType(); }; @@ -283,7 +283,7 @@ cpdet_config->settings[index].SetProgStack(m_edit_prog_stack->GetValue().Trim()); cpdet_config->settings[index].SetArgsStack(m_edit_args_stack->GetValue().Trim()); }; - cpdet_config->settings[index].SetOption(m_check_option_multirow->IsChecked()); + cpdet_config->settings[index].SetOption(m_check_option->IsChecked()); }; void CPDetectorDialog::OnTypeChange(wxCommandEvent &e) @@ -295,11 +295,24 @@ { int type=m_cpdetector_type->GetSelection(); wxPanel* panel=XRCCTRL(*this,"panel_stack",wxPanel); - panel->Show(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack); - panel->Enable(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack); - panel=XRCCTRL(*this,"panel_multirow",wxPanel); - panel->Show(type==CPDetector_AutoPanoSiftMultiRow || type==CPDetector_AutoPanoSiftMultiRowStack); - panel->Enable(type==CPDetector_AutoPanoSiftMultiRow || type==CPDetector_AutoPanoSiftMultiRowStack); + bool isActive=(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack); + panel->Show(isActive); + panel->Enable(isActive); + panel=XRCCTRL(*this,"panel_option",wxPanel); + isActive=(type==CPDetector_AutoPanoSiftMultiRow || type==CPDetector_AutoPanoSiftMultiRowStack + || type==CPDetector_AutoPanoSiftPreAlign); + panel->Show(isActive); + panel->Enable(isActive); + switch(type) + { + case CPDetector_AutoPanoSiftMultiRow: + case CPDetector_AutoPanoSiftMultiRowStack: + m_check_option->SetLabel(_("Try to connect all overlapping images.")); + break; + case CPDetector_AutoPanoSiftPreAlign: + m_check_option->SetLabel(_("Only work on image pairs without control points.")); + break; + }; Layout(); }; Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h 2010-01-12 06:22:17 UTC (rev 4877) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h 2010-01-12 06:24:10 UTC (rev 4878) @@ -81,9 +81,9 @@ const wxString GetArgsStack() {return args_stack; }; /** sets arguments of program for detection of cp in stacks */ void SetArgsStack(wxString new_args) { args_stack=new_args; }; - /** gets options, currently only used in multi-row cp detectors */ + /** gets options, used in multi-row and prealigned cp detectors */ const bool GetOption() { return option; } - /** set options, currently only used in multi-row cp detectors */ + /** set options, used in multi-row cp and prealigned detectors */ void SetOption(bool new_option) { option=new_option; }; private: CPDetectorType type; @@ -163,7 +163,7 @@ wxTextCtrl *m_edit_args; wxTextCtrl *m_edit_prog_stack; wxTextCtrl *m_edit_args_stack; - wxCheckBox *m_check_option_multirow; + wxCheckBox *m_check_option; wxChoice *m_cpdetector_type; void ChangeType(); Modified: hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc 2010-01-12 06:22:17 UTC (rev 4877) +++ hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc 2010-01-12 06:24:10 UTC (rev 4878) @@ -146,13 +146,14 @@ <flag>wxEXPAND</flag> </object> <object class="sizeritem"> - <object class="wxPanel" name="panel_multirow"> + <object class="wxPanel" name="panel_option"> <object class="wxStaticBoxSizer"> - <label>Multi-row detector</label> + <label>Advanced option</label> <orient>wxVERTICAL</orient> <object class="sizeritem"> - <object class="wxCheckBox" name="prefs_cpdetector_option_multirow"> - <label>Try to connect all overlapping images.</label> + <object class="wxCheckBox" name="prefs_cpdetector_option"> + <label></label> + <checked>1</checked> </object> <flag>wxALL|wxEXPAND</flag> <border>5</border> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <har...@us...> - 2010-01-15 10:22:19
|
Revision: 4893 http://hugin.svn.sourceforge.net/hugin/?rev=4893&view=rev Author: harryvanderwolf Date: 2010-01-15 10:22:09 +0000 (Fri, 15 Jan 2010) Log Message: ----------- [OSX] Add possibility to add (patent free) CP Detectors inside bundle. This was removed after implementation of new CPDetector structure. Now added again. Thanks to Thomas Modes Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h Modified: hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp 2010-01-15 06:49:42 UTC (rev 4892) +++ hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp 2010-01-15 10:22:09 UTC (rev 4893) @@ -110,9 +110,24 @@ return ctrlPoints; } +#if defined MAC_SELF_CONTAINED_BUNDLE +wxString GetBundledProg(wxString progName) +{ + // First check inside the bundle for (AutoCP generator "without path"), e.g. binary name with path stripped off + wxFileName file(progName); + // if executable contains no path, look inside bundle, if program can be found there + if(file.GetPath().IsEmpty()) + return MacGetPathToBundledResourceFile(MacCreateCFStringWithWxString(progName)); + return wxEmptyString; +} +#endif bool CanStartProg(wxString progName,wxWindow* parent) { +#if defined MAC_SELF_CONTAINED_BUNDLE + if(!GetBundledProg(progName).IsEmpty()) + return true; +#endif wxFileName prog(progName); bool canStart=false; if(prog.IsAbsolute()) @@ -219,7 +234,13 @@ return cps; } // create suitable command line.. +#if defined MAC_SELF_CONTAINED_BUNDLE + wxString autopanoExe = GetBundledProg(setting.GetProg()); + if(autopanoExe.IsEmpty()) + autopanoExe = setting.GetProg(); +#else wxString autopanoExe = setting.GetProg(); +#endif wxString autopanoArgs = setting.GetArgs(); #ifdef __WXMSW__ Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h 2010-01-15 06:49:42 UTC (rev 4892) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h 2010-01-15 10:22:09 UTC (rev 4893) @@ -1,79 +1,83 @@ -// -*- c-basic-offset: 4 -*- - -/** @file CPDetectorConfig_default.h - * - * @brief default settings for different control point detectors - * - * @author Thomas Modes - * - * $Id$ - * - */ - -/* This is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#ifndef _CPDETECTORCONFIG_DEFAULT_H -#define _CPDETECTORCONFIG_DEFAULT_H - -#include "panoinc_WX.h" - -/** struct to save the default setting of one CP detector */ -struct cpdetector_default -{ - /** cp detector type */ - CPDetectorType type; - /** name, which is shown in GUI */ - wxString desc; - /** program name */ - wxString prog; - /** arguments of the detector */ - wxString args; - /** program name of cp detector for stacks */ - wxString prog_stack; - /** arguments of cp detector for stacks */ - wxString args_stack; - /** option, currently only used in multi row detectors */ - bool option; -}; - -/** this array saves all default settings */ -const struct cpdetector_default default_cpdetectors[]= -{ -/* use following order: {type, description, program name, arguments, program name stack, arguments stack, option} - attention: this array have to contain at least one item */ -#if defined WIN32 - {CPDetector_AutoPanoSift, wxT("Autopano-SIFT-C"), - wxT("autopano-sift-c.exe"),wxT("--maxmatches %p --projection %f,%v %o %i"), - wxT(""), wxT(""), true}, - {CPDetector_AutoPano, wxT("Autopano"), - wxT("autopano.exe"),wxT("/allinone /path:%d /keys:%p /project:oto /name:%o /size:1024 /f %i"), - wxT(""), wxT(""), true}, - {CPDetector_AutoPanoSift, wxT("Panomatic"),wxT("panomatic.exe"),wxT("-o %o %i"),wxT(""), wxT(""), true}, - {CPDetector_AutoPanoSift, wxT("Align image stack"),wxT("align_image_stack.exe"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), true}, - {CPDetector_AutoPanoSift, wxT("Match-n-shift"),wxT("match-n-shift.exe"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT(""), true} -#else - #if !defined MAC_SELF_CONTAINED_BUNDLE - // Since medio 2008 the MacOSX bundle comes without default CPgenerators due to patent restrictions. - {CPDetector_AutoPanoSift,wxT("Autopano-SIFT-C"),wxT("autopano-noop.sh"),wxT("--maxmatches %p --projection %f,%v %o %i"),wxT(""),wxT(""), true}, - {CPDetector_AutoPanoSift,wxT("Panomatic"),wxT("panomatic"),wxT("-o %o %i"),wxT(""),wxT(""), true}, - {CPDetector_AutoPanoSift,wxT("Match-n-shift"),wxT("match-n-shift"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT(""),true}, - {CPDetector_AutoPanoSift,wxT("Align image stack"),wxT("align_image_stack"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), true} - #endif -#endif -}; - -#endif +// -*- c-basic-offset: 4 -*- + +/** @file CPDetectorConfig_default.h + * + * @brief default settings for different control point detectors + * + * @author Thomas Modes + * + * $Id$ + * + */ + +/* This is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _CPDETECTORCONFIG_DEFAULT_H +#define _CPDETECTORCONFIG_DEFAULT_H + +#include "panoinc_WX.h" + +/** struct to save the default setting of one CP detector */ +struct cpdetector_default +{ + /** cp detector type */ + CPDetectorType type; + /** name, which is shown in GUI */ + wxString desc; + /** program name */ + wxString prog; + /** arguments of the detector */ + wxString args; + /** program name of cp detector for stacks */ + wxString prog_stack; + /** arguments of cp detector for stacks */ + wxString args_stack; + /** option, currently only used in multi row detectors */ + bool option; +}; + +/** this array saves all default settings */ +const struct cpdetector_default default_cpdetectors[]= +{ +/* use following order: {type, description, program name, arguments, program name stack, arguments stack, option} + attention: this array have to contain at least one item */ +#if defined WIN32 + {CPDetector_AutoPanoSift, wxT("Autopano-SIFT-C"), + wxT("autopano-sift-c.exe"),wxT("--maxmatches %p --projection %f,%v %o %i"), + wxT(""), wxT(""), true}, + {CPDetector_AutoPano, wxT("Autopano"), + wxT("autopano.exe"),wxT("/allinone /path:%d /keys:%p /project:oto /name:%o /size:1024 /f %i"), + wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift, wxT("Panomatic"),wxT("panomatic.exe"),wxT("-o %o %i"),wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift, wxT("Align image stack"),wxT("align_image_stack.exe"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), true}, + {CPDetector_AutoPanoSift, wxT("Match-n-shift"),wxT("match-n-shift.exe"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT(""), true} +#else + #if !defined MAC_SELF_CONTAINED_BUNDLE + // Since medio 2008 the MacOSX bundle is built without patent/license restricted CP detectors. + {CPDetector_AutoPanoSift,wxT("Autopano-SIFT-C"),wxT("autopano-noop.sh"),wxT("--maxmatches %p --projection %f,%v %o %i"),wxT(""),wxT(""), true}, + {CPDetector_AutoPanoSift,wxT("Panomatic"),wxT("panomatic"),wxT("-o %o %i"),wxT(""),wxT(""), true}, + {CPDetector_AutoPanoSift,wxT("Match-n-shift"),wxT("match-n-shift"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT(""),true}, + {CPDetector_AutoPanoSift,wxT("Align image stack"),wxT("align_image_stack"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), true}, + {CPDetector_AutoPanoSift,wxT("Align_image_stack FullFrameFisheye"),wxT("align_image_stack"),wxT("-f %v -p -e %o %i"),wxT(""),wxT(""), true} + #else + {CPDetector_AutoPanoSift,wxT("Align_image_stack linear"),wxT("align_image_stack"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), true}, + {CPDetector_AutoPanoSift,wxT("Align_image_stack FullFrameFisheye"),wxT("align_image_stack"),wxT("-f %v -p -e %o %i"),wxT(""),wxT(""), true} + #endif +#endif +}; + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-01-18 06:37:50
|
Revision: 4907 http://hugin.svn.sourceforge.net/hugin/?rev=4907&view=rev Author: tmodes Date: 2010-01-18 06:37:32 +0000 (Mon, 18 Jan 2010) Log Message: ----------- Extended cp detectors to allow also 2 step detectors (e.g. generatekeys + autopano) Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.h hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc Modified: hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp 2010-01-17 22:23:48 UTC (rev 4906) +++ hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp 2010-01-18 06:37:32 UTC (rev 4907) @@ -122,6 +122,16 @@ } #endif +wxString GetProgPath(wxString progName) +{ +#if defined MAC_SELF_CONTAINED_BUNDLE + wxString bundled=GetBundledProg(progName); + if(!bundled.IsEmpty()) + return bundled; +#endif + return progName; +}; + bool CanStartProg(wxString progName,wxWindow* parent) { #if defined MAC_SELF_CONTAINED_BUNDLE @@ -170,9 +180,12 @@ { CPVector cps; CPDetectorType t = setting.GetType(); - //check, if the cp generator exists + //check, if the cp generators exists if(!CanStartProg(setting.GetProg(),parent)) return cps; + if(setting.IsTwoStepDetector()) + if(!CanStartProg(setting.GetProgMatcher(),parent)) + return cps; if(t==CPDetector_AutoPanoSiftStack || t==CPDetector_AutoPanoSiftMultiRowStack) if(!setting.GetProgStack().IsEmpty()) if(!CanStartProg(setting.GetProgStack(),parent)) @@ -226,6 +239,23 @@ return cps; } +void RemoveKeyfiles(vector<wxString> &keyFiles) +{ + if(keyFiles.size()>0) + { + for(unsigned int i=0;i<keyFiles.size();i++) + { + if(wxFileExists(keyFiles[i])) + { + if(!wxRemoveFile(keyFiles[i])) + { + DEBUG_DEBUG("could not remove temporary file: " << keyFiles[i].c_str()); + }; + }; + }; + }; +}; + CPVector AutoPanoSift::automatch(CPDetectorSetting &setting, Panorama & pano, const UIntSet & imgs, int nFeatures, int & ret_value, wxWindow *parent) { @@ -234,20 +264,21 @@ return cps; } // create suitable command line.. -#if defined MAC_SELF_CONTAINED_BUNDLE - wxString autopanoExe = GetBundledProg(setting.GetProg()); - if(autopanoExe.IsEmpty()) - autopanoExe = setting.GetProg(); -#else - wxString autopanoExe = setting.GetProg(); -#endif + wxString autopanoExe = GetProgPath(setting.GetProg()); + if(setting.IsTwoStepDetector()) + { + std::vector<wxString> keyFiles(pano.getNrOfImages()); + cps=automatch(setting, pano, imgs, nFeatures, keyFiles, ret_value, parent); + RemoveKeyfiles(keyFiles); + return cps; + }; wxString autopanoArgs = setting.GetArgs(); #ifdef __WXMSW__ // remember cwd. wxString cwd = wxGetCwd(); wxString apDir = wxPathOnly(autopanoExe); - if (apDir.Length() > 0) { + if (apDir.Len() > 0) { wxSetWorkingDirectory(apDir); } #endif @@ -393,7 +424,186 @@ return cps; } +CPVector AutoPanoSift::automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, + int nFeatures, vector<wxString> &keyFiles, int & ret_value, wxWindow *parent) +{ + CPVector cps; + if (imgs.size() == 0) + { + return cps; + } + DEBUG_ASSERT(keyFiles.size()==pano.getNrOfImages()); + // create suitable command line.. + wxString generateKeysExe=GetProgPath(setting.GetProg()); + wxString matcherExe = GetProgPath(setting.GetProgMatcher()); + wxString generateKeysArgs=setting.GetArgs(); + wxString matcherArgs = setting.GetArgsMatcher(); + +#ifdef __WXMSW__ + // remember cwd. + wxString cwd = wxGetCwd(); + wxString apDir = wxPathOnly(generateKeysExe); + if (apDir.Len() > 0) + { + wxSetWorkingDirectory(apDir); + } +#endif + wxString tempDir= wxConfigBase::Get()->Read(wxT("tempDir"),wxT("")); + if(!tempDir.IsEmpty()) + if(tempDir.Last()!=wxFileName::GetPathSeparator()) + tempDir.Append(wxFileName::GetPathSeparator()); + //check arguments + if(generateKeysArgs.Find(wxT("%i"))==wxNOT_FOUND || generateKeysArgs.Find(wxT("%k"))==wxNOT_FOUND) + { + wxMessageBox(_("Please use %i to specify the input files and %k to specify the keypoint file for generate keys step"), + _("Error in control point detector command"), wxOK | wxICON_ERROR,parent); + return cps; + }; + if(matcherArgs.Find(wxT("%k"))==wxNOT_FOUND || matcherArgs.Find(wxT("%o"))==wxNOT_FOUND) + { + wxMessageBox(_("Please use %k to specify the keypoint files and %o to specify the output project file for the matching step"), + _("Error in control point detector command"), wxOK | wxICON_ERROR,parent); + return cps; + }; + + ret_value=0; + for(UIntSet::const_iterator img=imgs.begin();img!=imgs.end();img++) + { + if(keyFiles[*img].IsEmpty()) + { + //no key files exists, so generate it + wxString keyfile=wxFileName::CreateTempFileName(tempDir+wxT("apk_")); + keyFiles[*img]=keyfile; + wxString cmd=generateKeysArgs; + wxString tmp; + tmp.Printf(wxT("%d"), nFeatures); + cmd.Replace(wxT("%p"), tmp); + + SrcPanoImage srcImg = pano.getSrcImage(*img); + tmp.Printf(wxT("%f"), srcImg.getHFOV()); + cmd.Replace(wxT("%v"), tmp); + + tmp.Printf(wxT("%d"), (int) srcImg.getProjection()); + cmd.Replace(wxT("%f"), tmp); + + cmd.Replace(wxT("%i"),wxQuoteFilename(wxString(srcImg.getFilename().c_str(), HUGIN_CONV_FILENAME))); + cmd.Replace(wxT("%k"),wxQuoteFilename(keyfile)); + // use MyExternalCmdExecDialog + ret_value = MyExecuteCommandOnDialog(generateKeysExe, cmd, parent, _("generating key file")); + cmd=generateKeysExe+wxT(" ")+cmd; + if (ret_value == HUGIN_EXIT_CODE_CANCELLED) + return cps; + else + if (ret_value == -1) + { + wxMessageBox( wxString::Format(_("Could not execute command: %s"),cmd.c_str()), _("wxExecute Error"), + wxOK | wxICON_ERROR, parent); + return cps; + } + else + if (ret_value > 0) + { + wxMessageBox(wxString::Format(_("Command: %s\nfailed with error code: %d"),cmd.c_str(),ret_value), + _("wxExecute Error"), wxOK | wxICON_ERROR, parent); + return cps; + }; + }; + }; + + // TODO: create a secure temporary filename here + wxString ptofile = wxFileName::CreateTempFileName(wxT("ap_res")); + matcherArgs.Replace(wxT("%o"), ptofile); + wxString tmp; + tmp.Printf(wxT("%d"), nFeatures); + matcherArgs.Replace(wxT("%p"), tmp); + + SrcPanoImage firstImg = pano.getSrcImage(*imgs.begin()); + tmp.Printf(wxT("%f"), firstImg.getHFOV()); + matcherArgs.Replace(wxT("%v"), tmp); + + tmp.Printf(wxT("%d"), (int) firstImg.getProjection()); + matcherArgs.Replace(wxT("%f"), tmp); + + // build a list of all image files, and a corrosponding connection map. + // local img nr -> global (panorama) img number + std::map<int,int> imgMapping; + + wxString imgFiles; + int imgNr=0; + for(UIntSet::const_iterator it = imgs.begin(); it != imgs.end(); it++) + { + imgMapping[imgNr] = *it; + imgFiles.append(wxT(" ")).append(wxQuoteFilename(keyFiles[*it])); + imgNr++; + }; + matcherArgs.Replace(wxT("%k"), wxString (imgFiles.c_str(), HUGIN_CONV_FILENAME)); + +#ifdef __WXMSW__ + if (matcherArgs.size() > 32000) { + wxMessageBox(_("Command line for control point detector too long.\nThis is a windows limitation\nPlease select less images, or place the images in a folder with\na shorter pathname"), + _("Too many images selected"), + wxCANCEL | wxICON_ERROR, parent ); + return cps; + } + apDir = wxPathOnly(matcherExe); + if (apDir.Len() > 0) { + wxSetWorkingDirectory(apDir); + } +#endif + + wxString cmd = matcherExe + wxT(" ") + matcherArgs; + DEBUG_DEBUG("Executing: " << matcherExe.mb_str(wxConvLocal) << " " << matcherArgs.mb_str(wxConvLocal)); + + wxArrayString arguments = wxCmdLineParser::ConvertStringToArgs(matcherArgs); + if (arguments.GetCount() > 127) { + DEBUG_ERROR("Too many arguments for call to wxExecute()"); + wxMessageBox(wxString::Format(_("Too many arguments (images). Try using a cp generator setting which supports the %%s parameter in preferences.\n\n Could not execute command: %s"), matcherExe.c_str()), _("wxExecute Error"), wxOK | wxICON_ERROR, parent); + return cps; + } + + // use MyExternalCmdExecDialog + ret_value = MyExecuteCommandOnDialog(matcherExe, matcherArgs, parent, _("finding control points")); + + if (ret_value == HUGIN_EXIT_CODE_CANCELLED) + return cps; + else + if (ret_value == -1) + { + wxMessageBox( wxString::Format(_("Could not execute command: %s"),cmd.c_str()), _("wxExecute Error"), + wxOK | wxICON_ERROR, parent); + return cps; + } + else + if (ret_value > 0) + { + wxMessageBox(wxString::Format(_("Command: %s\nfailed with error code: %d"),cmd.c_str(),ret_value), + _("wxExecute Error"), wxOK | wxICON_ERROR, parent); + return cps; + }; + + if (! wxFileExists(ptofile.c_str())) + { + wxMessageBox(wxString::Format(_("Could not open %s for reading\nThis is an indicator that the control point detector call failed,\nor wrong command line parameters have been used.\n\nExecuted command: %s"),ptofile.c_str(),cmd.c_str()), + _("Control point detector failure"), wxOK | wxICON_ERROR, parent ); + return cps; + } + + // read and update control points + cps = readUpdatedControlPoints((const char *)ptofile.mb_str(HUGIN_CONV_FILENAME), pano); + +#ifdef __WXMSW__ + // set old cwd. + wxSetWorkingDirectory(cwd); +#endif + + if (!wxRemoveFile(ptofile)) { + DEBUG_DEBUG("could not remove temporary file: " << ptofile.c_str()); + } + + return cps; +}; + CPVector AutoPanoKolor::automatch(CPDetectorSetting &setting, Panorama & pano, const UIntSet & imgs, int nFeatures, int & ret_value, wxWindow *parent) { @@ -609,6 +819,7 @@ { return cps; }; + std::vector<wxString> keyFiles(pano.getNrOfImages()); //generate cp for every consecutive image pair unsigned int counter=0; for(UIntSet::const_iterator it = imgs.begin(); it != imgs.end(); ) @@ -624,11 +835,17 @@ AutoPanoSift matcher; CPVector new_cps; new_cps.clear(); - new_cps=matcher.automatch(setting, pano, ImagePair, nFeatures, ret_value, parent); + if(setting.IsTwoStepDetector()) + new_cps=matcher.automatch(setting, pano, ImagePair, nFeatures, keyFiles, ret_value, parent); + else + new_cps=matcher.automatch(setting, pano, ImagePair, nFeatures, ret_value, parent); if(new_cps.size()>0) AddControlPointsWithCheck(cps,new_cps); if(ret_value!=0) + { + RemoveKeyfiles(keyFiles); return cps; + }; }; // now connect all image groups // generate temporary panorama to add all found cps @@ -653,11 +870,17 @@ }; AutoPanoSift matcher; CPVector new_cps; - new_cps=matcher.automatch(setting, optPano, ImagesGroups, nFeatures, ret_value, parent); + if(setting.IsTwoStepDetector()) + new_cps=matcher.automatch(setting, optPano, ImagesGroups, nFeatures, keyFiles, ret_value, parent); + else + new_cps=matcher.automatch(setting, optPano, ImagesGroups, nFeatures, ret_value, parent); if(new_cps.size()>0) AddControlPointsWithCheck(cps,new_cps,&optPano); if(ret_value!=0) + { + RemoveKeyfiles(keyFiles); return cps; + }; createCPGraph(optPano,graph); n=findCPComponents(graph, comps); }; @@ -708,12 +931,21 @@ CPDetectorSetting newSetting; newSetting.SetProg(setting.GetProg()); newSetting.SetArgs(setting.GetArgs()); + if(setting.IsTwoStepDetector()) + { + newSetting.SetProgMatcher(setting.GetProgMatcher()); + newSetting.SetArgsMatcher(setting.GetArgsMatcher()); + }; newSetting.SetOption(true); CPVector new_cps; - new_cps=matcher.automatch(newSetting, optPano, imgs, nFeatures, ret_value, parent); + if(setting.IsTwoStepDetector()) + new_cps=matcher.automatch(newSetting, optPano, imgs, nFeatures, keyFiles, ret_value, parent); + else + new_cps=matcher.automatch(newSetting, optPano, imgs, nFeatures, ret_value, parent); if(new_cps.size()>0) AddControlPointsWithCheck(cps,new_cps); }; + RemoveKeyfiles(keyFiles); return cps; }; @@ -808,9 +1040,18 @@ CPVector AutoPanoSiftPreAlign::automatch(CPDetectorSetting &setting, Panorama & pano, const UIntSet & imgs, int nFeatures, int & ret_value, wxWindow *parent) { + std::vector<wxString> keyFiles(pano.getNrOfImages()); + return automatch(setting, pano, imgs, nFeatures, keyFiles, ret_value, parent); +}; + +CPVector AutoPanoSiftPreAlign::automatch(CPDetectorSetting &setting, Panorama & pano, const UIntSet & imgs, + int nFeatures, std::vector<wxString> &keyFiles, int & ret_value, wxWindow *parent) +{ CPVector cps; if (imgs.size()<2) return cps; + DEBUG_ASSERT(keyFiles.size()==pano.getNrOfImages()); + vector<UIntSet> usedImages; usedImages.resize(pano.getNrOfImages()); if(setting.GetOption()) @@ -857,11 +1098,19 @@ for(UIntSet::const_iterator img_it2=images.begin();img_it2!=images.end();img_it2++) usedImages[*img_it].insert(*img_it2); AutoPanoSift matcher; - CPVector new_cps=matcher.automatch(setting, pano, images, nFeatures, ret_value, parent); + CPVector new_cps; + if(setting.IsTwoStepDetector()) + new_cps=matcher.automatch(setting, pano, images, nFeatures, keyFiles, ret_value, parent); + else + new_cps=matcher.automatch(setting, pano, images, nFeatures, ret_value, parent); if(new_cps.size()>0) AddControlPointsWithCheck(cps,new_cps); if(ret_value!=0) + { + RemoveKeyfiles(keyFiles); return cps; + }; }; + RemoveKeyfiles(keyFiles); return cps; }; Modified: hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.h =================================================================== --- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.h 2010-01-17 22:23:48 UTC (rev 4906) +++ hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.h 2010-01-18 06:37:32 UTC (rev 4907) @@ -75,6 +75,8 @@ virtual CPVector automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, int nFeatures, int & ret_value, wxWindow *parent=NULL); + virtual CPVector automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, + int nFeatures, std::vector<wxString> &keyFiles, int & ret_value, wxWindow *parent=NULL); private: @@ -180,6 +182,8 @@ virtual CPVector automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, int nFeatures, int & ret_value, wxWindow *parent=NULL); + virtual CPVector automatch(CPDetectorSetting &setting, PT::Panorama & pano, const PT::UIntSet & imgs, + int nFeatures, std::vector<wxString> &keyFiles, int & ret_value, wxWindow *parent=NULL); private: Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp 2010-01-17 22:23:48 UTC (rev 4906) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig.cpp 2010-01-18 06:37:32 UTC (rev 4907) @@ -144,6 +144,8 @@ desc=default_cpdetectors[new_type].desc; prog=default_cpdetectors[new_type].prog; args=default_cpdetectors[new_type].args; + prog_matcher=default_cpdetectors[new_type].prog_matcher; + args_matcher=default_cpdetectors[new_type].args_matcher; if(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack) { prog_stack=default_cpdetectors[new_type].prog_stack; @@ -156,15 +158,42 @@ }; option=default_cpdetectors[new_type].option; }; + } + else + { + type=CPDetector_AutoPanoSift; + desc=wxEmptyString; + prog=wxEmptyString; + args=wxEmptyString; + prog_matcher=wxEmptyString; + args_matcher=wxEmptyString; + prog_stack=wxEmptyString; + args_stack=wxEmptyString; + option=true; }; + CheckValues(); }; +void CPDetectorSetting::CheckValues() +{ + if(type==CPDetector_AutoPano) + { + if(!prog_matcher.IsEmpty()) + { + prog_matcher=wxEmptyString; + args_matcher=wxEmptyString; + }; + }; +}; + void CPDetectorSetting::Read(wxConfigBase *config, wxString path) { type=(CPDetectorType)config->Read(path+wxT("/Type"),default_cpdetectors[0].type); desc=config->Read(path+wxT("/Description"),default_cpdetectors[0].desc); prog=config->Read(path+wxT("/Program"),default_cpdetectors[0].prog); args=config->Read(path+wxT("/Arguments"),default_cpdetectors[0].args); + prog_matcher=config->Read(path+wxT("/ProgramMatcher"),default_cpdetectors[0].prog_matcher); + args_matcher=config->Read(path+wxT("/ArgumentsMatcher"),default_cpdetectors[0].args_matcher); if(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack) { prog_stack=config->Read(path+wxT("/ProgramStack"),default_cpdetectors[0].prog_stack); @@ -176,6 +205,7 @@ args_stack=wxEmptyString; }; option=config->Read(path+wxT("/Option"),default_cpdetectors[0].option); + CheckValues(); }; void CPDetectorSetting::Write(wxConfigBase *config, wxString path) @@ -184,6 +214,8 @@ config->Write(path+wxT("/Description"),desc); config->Write(path+wxT("/Program"),prog); config->Write(path+wxT("/Arguments"),args); + config->Write(path+wxT("/ProgramMatcher"),prog_matcher); + config->Write(path+wxT("/ArgumentsMatcher"),args_matcher); if(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack) { config->Write(path+wxT("/ProgramStack"),prog_stack); @@ -197,8 +229,11 @@ BEGIN_EVENT_TABLE(CPDetectorDialog,wxDialog) EVT_BUTTON(wxID_OK, CPDetectorDialog::OnOk) EVT_BUTTON(XRCID("prefs_cpdetector_program_select"),CPDetectorDialog::OnSelectPath) + EVT_BUTTON(XRCID("prefs_cpdetector_program_descriptor_select"),CPDetectorDialog::OnSelectPathDescriptor) + EVT_BUTTON(XRCID("prefs_cpdetector_program_matcher_select"),CPDetectorDialog::OnSelectPathMatcher) EVT_BUTTON(XRCID("prefs_cpdetector_program_stack_select"),CPDetectorDialog::OnSelectPathStack) EVT_CHOICE(XRCID("prefs_cpdetector_type"),CPDetectorDialog::OnTypeChange) + EVT_CHOICEBOOK_PAGE_CHANGING(XRCID("choicebook_steps"),CPDetectorDialog::OnStepChanging) END_EVENT_TABLE() CPDetectorDialog::CPDetectorDialog(wxWindow* parent) @@ -217,10 +252,15 @@ m_edit_desc = XRCCTRL(*this, "prefs_cpdetector_desc", wxTextCtrl); m_edit_prog = XRCCTRL(*this, "prefs_cpdetector_program", wxTextCtrl); m_edit_args = XRCCTRL(*this, "prefs_cpdetector_args", wxTextCtrl); + m_edit_prog_descriptor = XRCCTRL(*this, "prefs_cpdetector_program_descriptor", wxTextCtrl); + m_edit_args_descriptor = XRCCTRL(*this, "prefs_cpdetector_args_descriptor", wxTextCtrl); + m_edit_prog_matcher = XRCCTRL(*this, "prefs_cpdetector_program_matcher", wxTextCtrl); + m_edit_args_matcher = XRCCTRL(*this, "prefs_cpdetector_args_matcher", wxTextCtrl); m_edit_prog_stack = XRCCTRL(*this, "prefs_cpdetector_program_stack", wxTextCtrl); m_edit_args_stack = XRCCTRL(*this, "prefs_cpdetector_args_stack", wxTextCtrl); m_check_option = XRCCTRL(*this, "prefs_cpdetector_option", wxCheckBox); m_cpdetector_type = XRCCTRL(*this, "prefs_cpdetector_type", wxChoice); + m_choice_step = XRCCTRL(*this, "choicebook_steps", wxChoicebook); m_cpdetector_type->SetSelection(1); ChangeType(); }; @@ -242,8 +282,20 @@ #endif bool valid=true; valid=valid && (m_edit_desc->GetValue().Trim().Len()>0); - valid=valid && (m_edit_prog->GetValue().Trim().Len()>0); - valid=valid && (m_edit_args->GetValue().Trim().Len()>0); + if(m_choice_step->GetSelection()==0) + { + //detector with one step + valid=valid && (m_edit_prog->GetValue().Trim().Len()>0); + valid=valid && (m_edit_args->GetValue().Trim().Len()>0); + } + else + { + //detector with two steps + valid=valid && (m_edit_prog_descriptor->GetValue().Trim().Len()>0); + valid=valid && (m_edit_prog_matcher->GetValue().Trim().Len()>0); + valid=valid && (m_edit_args_descriptor->GetValue().Trim().Len()>0); + valid=valid && (m_edit_args_matcher->GetValue().Trim().Len()>0); + }; int type=m_cpdetector_type->GetSelection(); if(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack) if(m_edit_prog_stack->GetValue().Trim().Len()>0) @@ -258,8 +310,21 @@ void CPDetectorDialog::UpdateFields(CPDetectorConfig* cpdet_config,int index) { m_edit_desc->SetValue(cpdet_config->settings[index].GetCPDetectorDesc()); - m_edit_prog->SetValue(cpdet_config->settings[index].GetProg()); - m_edit_args->SetValue(cpdet_config->settings[index].GetArgs()); + //program names and arguments + if(cpdet_config->settings[index].IsTwoStepDetector()) + { + m_choice_step->SetSelection(1); + m_edit_prog_descriptor->SetValue(cpdet_config->settings[index].GetProg()); + m_edit_prog_matcher->SetValue(cpdet_config->settings[index].GetProgMatcher()); + m_edit_args_descriptor->SetValue(cpdet_config->settings[index].GetArgs()); + m_edit_args_matcher->SetValue(cpdet_config->settings[index].GetArgsMatcher()); + } + else + { + m_choice_step->SetSelection(0); + m_edit_prog->SetValue(cpdet_config->settings[index].GetProg()); + m_edit_args->SetValue(cpdet_config->settings[index].GetArgs()); + }; int type=cpdet_config->settings[index].GetType(); if(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack) { @@ -274,9 +339,19 @@ void CPDetectorDialog::UpdateSettings(CPDetectorConfig* cpdet_config,int index) { cpdet_config->settings[index].SetCPDetectorDesc(m_edit_desc->GetValue().Trim()); - cpdet_config->settings[index].SetProg(m_edit_prog->GetValue().Trim()); - cpdet_config->settings[index].SetArgs(m_edit_args->GetValue().Trim()); cpdet_config->settings[index].SetType((CPDetectorType)m_cpdetector_type->GetSelection()); + if(m_choice_step->GetSelection()==0) + { + cpdet_config->settings[index].SetProg(m_edit_prog->GetValue().Trim()); + cpdet_config->settings[index].SetArgs(m_edit_args->GetValue().Trim()); + } + else + { + cpdet_config->settings[index].SetProg(m_edit_prog_descriptor->GetValue().Trim()); + cpdet_config->settings[index].SetArgs(m_edit_args_descriptor->GetValue().Trim()); + cpdet_config->settings[index].SetProgMatcher(m_edit_prog_matcher->GetValue().Trim()); + cpdet_config->settings[index].SetArgsMatcher(m_edit_args_matcher->GetValue().Trim()); + }; CPDetectorType type=cpdet_config->settings[index].GetType(); if(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack) { @@ -294,70 +369,102 @@ void CPDetectorDialog::ChangeType() { int type=m_cpdetector_type->GetSelection(); - wxPanel* panel=XRCCTRL(*this,"panel_stack",wxPanel); + if(type==CPDetector_AutoPano) + { + m_choice_step->SetSelection(0); + twoStepAllowed=false; + } + else + twoStepAllowed=true; bool isActive=(type==CPDetector_AutoPanoSiftStack || type==CPDetector_AutoPanoSiftMultiRowStack); - panel->Show(isActive); - panel->Enable(isActive); - panel=XRCCTRL(*this,"panel_option",wxPanel); - isActive=(type==CPDetector_AutoPanoSiftMultiRow || type==CPDetector_AutoPanoSiftMultiRowStack - || type==CPDetector_AutoPanoSiftPreAlign); - panel->Show(isActive); - panel->Enable(isActive); + XRCCTRL(*this,"panel_stack",wxPanel)->Enable(isActive); switch(type) { case CPDetector_AutoPanoSiftMultiRow: case CPDetector_AutoPanoSiftMultiRowStack: m_check_option->SetLabel(_("Try to connect all overlapping images.")); + m_check_option->Enable(true); + m_check_option->Show(true); + XRCCTRL(*this, "prefs_cpdetector_no_option",wxStaticText)->Show(false); break; case CPDetector_AutoPanoSiftPreAlign: m_check_option->SetLabel(_("Only work on image pairs without control points.")); + m_check_option->Enable(true); + m_check_option->Show(true); + XRCCTRL(*this, "prefs_cpdetector_no_option",wxStaticText)->Show(false); break; + default: + XRCCTRL(*this, "prefs_cpdetector_no_option",wxStaticText)->Show(true); + m_check_option->Enable(false); + m_check_option->Show(false); + break; }; + m_check_option->GetParent()->Layout(); Layout(); }; -void CPDetectorDialog::OnSelectPath(wxCommandEvent &e) + +bool CPDetectorDialog::ShowFileDialog(wxString & prog) { - wxFileName executable(m_edit_prog->GetValue()); + wxFileName executable(prog); #ifdef MAC_SELF_CONTAINED_BUNDLE - wxString autopanoPath = MacGetPathToUserAppSupportAutoPanoFolder(); + wxString autopanoPath = MacGetPathToUserAppSupportAutoPanoFolder(); #endif wxFileDialog dlg(this,_("Select control point detector program"), #ifdef MAC_SELF_CONTAINED_BUNDLE - autopanoPath, -#else - executable.GetPath(), + autopanoPath, +#else + executable.GetPath(), #endif - executable.GetFullName(), + executable.GetFullName(), #ifdef __WXMSW__ - _("Executables (*.exe,*.vbs,*.cmd, *.bat)|*.exe;*.vbs;*.cmd;*.bat"), + _("Executables (*.exe,*.vbs,*.cmd, *.bat)|*.exe;*.vbs;*.cmd;*.bat"), #else - wxT(""), + wxT(""), #endif - wxOPEN, wxDefaultPosition); + wxOPEN, wxDefaultPosition); if (dlg.ShowModal() == wxID_OK) - m_edit_prog->SetValue(dlg.GetPath()); + { + prog=dlg.GetPath(); + return true; + } + else + return false; }; +void CPDetectorDialog::OnSelectPath(wxCommandEvent &e) +{ + wxString prog=m_edit_prog->GetValue(); + if (ShowFileDialog(prog)) + m_edit_prog->SetValue(prog); +}; + +void CPDetectorDialog::OnSelectPathDescriptor(wxCommandEvent &e) +{ + wxString prog=m_edit_prog_descriptor->GetValue(); + if (ShowFileDialog(prog)) + m_edit_prog_descriptor->SetValue(prog); +}; + +void CPDetectorDialog::OnSelectPathMatcher(wxCommandEvent &e) +{ + wxString prog=m_edit_prog_matcher->GetValue(); + if (ShowFileDialog(prog)) + m_edit_prog_matcher->SetValue(prog); +}; + void CPDetectorDialog::OnSelectPathStack(wxCommandEvent &e) { - wxFileName executable(m_edit_prog_stack->GetValue()); -#ifdef MAC_SELF_CONTAINED_BUNDLE - wxString autopanoPath = MacGetPathToUserAppSupportAutoPanoFolder(); -#endif - wxFileDialog dlg(this,_("Select control point detector program"), -#ifdef MAC_SELF_CONTAINED_BUNDLE - autopanoPath, -#else - executable.GetPath(), -#endif - executable.GetFullName(), -#ifdef __WXMSW__ - _("Executables (*.exe,*.vbs,*.cmd, *.bat)|*.exe;*.vbs;*.cmd;*.bat"), -#else - wxT(""), -#endif - wxOPEN, wxDefaultPosition); - if (dlg.ShowModal() == wxID_OK) - m_edit_prog_stack->SetValue(dlg.GetPath()); + wxString prog=m_edit_prog_stack->GetValue(); + if (ShowFileDialog(prog)) + m_edit_prog_stack->SetValue(prog); }; + +void CPDetectorDialog::OnStepChanging(wxChoicebookEvent &e) +{ + if(!twoStepAllowed && e.GetOldSelection()==0) + { + wxBell(); + e.Veto(); + }; +}; Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h 2010-01-17 22:23:48 UTC (rev 4906) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig.h 2010-01-18 06:37:32 UTC (rev 4907) @@ -33,6 +33,7 @@ #include "panoinc_WX.h" #include <wx/dynarray.h> +#include <wx/choicebk.h> enum CPDetectorType { @@ -61,18 +62,26 @@ const wxString GetCPDetectorDesc() {return desc; }; /** sets description of this setting */ void SetCPDetectorDesc(wxString new_desc) { desc=new_desc; }; - /** return program of this setting (program name) */ + /** return type of this setting */ + const CPDetectorType GetType() {return type; }; + /** sets type of this setting */ + void SetType(CPDetectorType new_type) { type=new_type;}; + /** return program for one step detector or feature descriptor */ const wxString GetProg() {return prog; }; - /** sets program of this setting */ + /** sets program for one step detector or feature descriptor */ void SetProg(wxString new_prog) { prog=new_prog; }; - /** return arguments of this setting */ + /** return arguments of one step detector or feature descriptor */ const wxString GetArgs() {return args; }; - /** sets arguments of this setting */ + /** sets arguments of one step detector or feature descriptor */ void SetArgs(wxString new_args) { args=new_args; }; - /** return type of this setting */ - const CPDetectorType GetType() {return type; }; - /** sets type of this setting */ - void SetType(CPDetectorType new_type) { type=new_type;}; + /** return program for feature matcher */ + const wxString GetProgMatcher() {return prog_matcher; }; + /** sets program for feature matcher */ + void SetProgMatcher(wxString new_prog) { prog_matcher=new_prog; }; + /** return arguments for feature matcher */ + const wxString GetArgsMatcher() {return args_matcher; }; + /** sets arguments for feature matcher */ + void SetArgsMatcher(wxString new_args) { args_matcher=new_args; }; /** return program name, which works on stacks */ const wxString GetProgStack() {return prog_stack; }; /** sets program for detecting cp in stacks */ @@ -85,11 +94,16 @@ const bool GetOption() { return option; } /** set options, used in multi-row cp and prealigned detectors */ void SetOption(bool new_option) { option=new_option; }; + /** returns true, if setting is suitable for two step detector otherwise false */ + const bool IsTwoStepDetector() { return !prog_matcher.IsEmpty(); }; private: + void CheckValues(); CPDetectorType type; wxString desc; wxString prog; wxString args; + wxString prog_matcher; + wxString args_matcher; wxString prog_stack; wxString args_stack; bool option; @@ -153,18 +167,32 @@ void OnOk(wxCommandEvent & e); /** select program with file open dialog */ void OnSelectPath(wxCommandEvent &e); + /** select program for feature descriptor with file open dialog */ + void OnSelectPathDescriptor(wxCommandEvent &e); + /** select program for feature matcher with file open dialog */ + void OnSelectPathMatcher(wxCommandEvent &e); /** select program for stack with file open dialog */ void OnSelectPathStack(wxCommandEvent &e); /** update dialog, when other cp detector type is changed */ void OnTypeChange(wxCommandEvent &e); + /** block selection of two step detector for autopano setting */ + void OnStepChanging(wxChoicebookEvent &e); + /** shows file dialog */ + bool ShowFileDialog(wxString & prog); private: wxTextCtrl *m_edit_desc; wxTextCtrl *m_edit_prog; wxTextCtrl *m_edit_args; + wxTextCtrl *m_edit_prog_descriptor; + wxTextCtrl *m_edit_args_descriptor; + wxTextCtrl *m_edit_prog_matcher; + wxTextCtrl *m_edit_args_matcher; wxTextCtrl *m_edit_prog_stack; wxTextCtrl *m_edit_args_stack; wxCheckBox *m_check_option; wxChoice *m_cpdetector_type; + wxChoicebook * m_choice_step; + bool twoStepAllowed; void ChangeType(); DECLARE_EVENT_TABLE(); Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h 2010-01-17 22:23:48 UTC (rev 4906) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h 2010-01-18 06:37:32 UTC (rev 4907) @@ -38,10 +38,14 @@ CPDetectorType type; /** name, which is shown in GUI */ wxString desc; - /** program name */ + /** program name for detector or descriptor*/ wxString prog; - /** arguments of the detector */ + /** arguments of the detector or descriptor*/ wxString args; + /** program name for matcher */ + wxString prog_matcher; + /** arguments of matcher */ + wxString args_matcher; /** program name of cp detector for stacks */ wxString prog_stack; /** arguments of cp detector for stacks */ @@ -53,29 +57,30 @@ /** this array saves all default settings */ const struct cpdetector_default default_cpdetectors[]= { -/* use following order: {type, description, program name, arguments, program name stack, arguments stack, option} +/* use following order: {type, description, program for detector or descriptor, arguments for detector or descriptor, + program for matcher, arguments for matcher, program name stack, arguments stack, option} attention: this array have to contain at least one item */ #if defined WIN32 {CPDetector_AutoPanoSift, wxT("Autopano-SIFT-C"), wxT("autopano-sift-c.exe"),wxT("--maxmatches %p --projection %f,%v %o %i"), - wxT(""), wxT(""), true}, + wxT(""), wxT(""), wxT(""), wxT(""), true}, {CPDetector_AutoPano, wxT("Autopano"), wxT("autopano.exe"),wxT("/allinone /path:%d /keys:%p /project:oto /name:%o /size:1024 /f %i"), - wxT(""), wxT(""), true}, - {CPDetector_AutoPanoSift, wxT("Panomatic"),wxT("panomatic.exe"),wxT("-o %o %i"),wxT(""), wxT(""), true}, - {CPDetector_AutoPanoSift, wxT("Align image stack"),wxT("align_image_stack.exe"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), true}, - {CPDetector_AutoPanoSift, wxT("Match-n-shift"),wxT("match-n-shift.exe"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT(""), true} + wxT(""), wxT(""), wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift, wxT("Panomatic"),wxT("panomatic.exe"),wxT("-o %o %i"),wxT(""), wxT(""), wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift, wxT("Align image stack"),wxT("align_image_stack.exe"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift, wxT("Match-n-shift"),wxT("match-n-shift.exe"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true} #else #if !defined MAC_SELF_CONTAINED_BUNDLE // Since medio 2008 the MacOSX bundle is built without patent/license restricted CP detectors. - {CPDetector_AutoPanoSift,wxT("Autopano-SIFT-C"),wxT("autopano-noop.sh"),wxT("--maxmatches %p --projection %f,%v %o %i"),wxT(""),wxT(""), true}, - {CPDetector_AutoPanoSift,wxT("Panomatic"),wxT("panomatic"),wxT("-o %o %i"),wxT(""),wxT(""), true}, - {CPDetector_AutoPanoSift,wxT("Match-n-shift"),wxT("match-n-shift"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT(""),true}, - {CPDetector_AutoPanoSift,wxT("Align image stack"),wxT("align_image_stack"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), true}, - {CPDetector_AutoPanoSift,wxT("Align_image_stack FullFrameFisheye"),wxT("align_image_stack"),wxT("-f %v -p -e %o %i"),wxT(""),wxT(""), true} + {CPDetector_AutoPanoSift,wxT("Autopano-SIFT-C"),wxT("autopano-noop.sh"),wxT("--maxmatches %p --projection %f,%v %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift,wxT("Panomatic"),wxT("panomatic"),wxT("-o %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift,wxT("Match-n-shift"),wxT("match-n-shift"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT(""),wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift,wxT("Align image stack"),wxT("align_image_stack"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift,wxT("Align_image_stack FullFrameFisheye"),wxT("align_image_stack"),wxT("-f %v -p -e %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true} #else - {CPDetector_AutoPanoSift,wxT("Align_image_stack linear"),wxT("align_image_stack"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), true}, - {CPDetector_AutoPanoSift,wxT("Align_image_stack FullFrameFisheye"),wxT("align_image_stack"),wxT("-f %v -p -e %o %i"),wxT(""),wxT(""), true} + {CPDetector_AutoPanoSift,wxT("Align_image_stack linear"),wxT("align_image_stack"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift,wxT("Align_image_stack FullFrameFisheye"),wxT("align_image_stack"),wxT("-f %v -p -e %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true} #endif #endif }; Modified: hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc 2010-01-17 22:23:48 UTC (rev 4906) +++ hugin/trunk/src/hugin1/hugin/xrc/cpdetector_dialog.xrc 2010-01-18 06:37:32 UTC (rev 4907) @@ -4,183 +4,310 @@ <object class="wxBoxSizer"> <orient>wxVERTICAL</orient> <object class="sizeritem"> - <object class="wxStaticBoxSizer"> + <object class="wxBoxSizer"> <orient>wxVERTICAL</orient> <object class="sizeritem"> - <object class="wxFlexGridSizer"> - <cols>2</cols> + <object class="wxBoxSizer"> + <orient>wxVERTICAL</orient> <object class="sizeritem"> - <object class="wxStaticText"> - <label>Description:</label> - </object> - <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> - <border>5</border> - </object> - <object class="sizeritem"> - <object class="wxTextCtrl" name="prefs_cpdetector_desc"/> - <flag>wxALL|wxEXPAND</flag> - <border>5</border> - </object> - <object class="sizeritem"> - <object class="wxStaticText"> - <label>Type:</label> - </object> - <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> - <border>5</border> - </object> - <object class="sizeritem"> - <object class="wxChoice" name="prefs_cpdetector_type"> - <content> - <item>Autopano (by A. Jenny)</item> - <item>All images at once</item> - <item>Panorama with stacks</item> - <item>Multi-row panorama</item> - <item>Multi-row panorama with stacks</item> - <item>Prealigned panorama</item> - </content> - </object> - <flag>wxALL</flag> - <border>5</border> - </object> - <object class="sizeritem"> - <object class="wxStaticText"> - <label>Program:</label> - </object> - <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> - <border>5</border> - </object> - <object class="sizeritem"> - <object class="wxBoxSizer"> - <orient>wxHORIZONTAL</orient> + <object class="wxFlexGridSizer"> + <cols>2</cols> <object class="sizeritem"> - <object class="wxTextCtrl" name="prefs_cpdetector_program"/> - <option>1</option> - <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + <object class="wxStaticText"> + <label>Description:</label> + </object> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> <border>5</border> </object> <object class="sizeritem"> - <object class="wxButton" name="prefs_cpdetector_program_select"> - <label>Choose...</label> + <object class="wxTextCtrl" name="prefs_cpdetector_desc"/> + <flag>wxALL|wxEXPAND</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Type:</label> </object> - <flag>wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> <border>5</border> </object> + <object class="sizeritem"> + <object class="wxChoice" name="prefs_cpdetector_type"> + <content> + <item>Autopano (by A. Jenny)</item> + <item>All images at once</item> + <item>Panorama with stacks</item> + <item>Multi-row panorama</item> + <item>Multi-row panorama with stacks</item> + <item>Prealigned panorama</item> + </content> + </object> + <flag>wxALL</flag> + <border>5</border> + </object> + <growablecols>1</growablecols> </object> <flag>wxEXPAND</flag> </object> <object class="sizeritem"> - <object class="wxStaticText"> - <label>Arguments:</label> - </object> - <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> - <border>5</border> - </object> - <object class="sizeritem"> - <object class="wxTextCtrl" name="prefs_cpdetector_args"/> - <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> - <border>5</border> - </object> - <growablecols>1</growablecols> - </object> - <flag>wxEXPAND</flag> - </object> - <object class="sizeritem"> - <object class="wxPanel" name="panel_stack"> - <object class="wxStaticBoxSizer"> - <object class="sizeritem"> - <object class="wxStaticText"> - <label>Leave empty, when no control point detector should run on stacks.</label> - </object> - <flag>wxALL|wxEXPAND</flag> - <border>5</border> - </object> - <object class="sizeritem"> - <object class="wxFlexGridSizer"> - <object class="sizeritem"> - <object class="wxStaticText"> - <label>Program:</label> + <object class="wxNotebook" name="notebook_detector"> + <object class="notebookpage"> + <label>Detector</label> + <object class="wxPanel" name="panel_detector"> + <object class="wxBoxSizer"> + <orient>wxVERTICAL</orient> + <object class="sizeritem"> + <object class="wxChoicebook" name="choicebook_steps"> + <object class="choicebookpage"> + <label>One step detector</label> + <object class="wxPanel"> + <object class="wxFlexGridSizer"> + <cols>2</cols> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Program:</label> + </object> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxBoxSizer"> + <orient>wxHORIZONTAL</orient> + <object class="sizeritem"> + <object class="wxTextCtrl" name="prefs_cpdetector_program"/> + <option>1</option> + <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxButton" name="prefs_cpdetector_program_select"> + <label>Choose...</label> + </object> + <flag>wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + </object> + <flag>wxEXPAND</flag> + </object> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Arguments:</label> + </object> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxTextCtrl" name="prefs_cpdetector_args"/> + <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <growablecols>1</growablecols> + </object> + </object> + </object> + <object class="choicebookpage"> + <label>Two step detector</label> + <object class="wxPanel"> + <object class="wxFlexGridSizer"> + <cols>2</cols> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Feature descriptor:</label> + </object> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxBoxSizer"> + <orient>wxHORIZONTAL</orient> + <object class="sizeritem"> + <object class="wxTextCtrl" name="prefs_cpdetector_program_descriptor"/> + <option>1</option> + <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxButton" name="prefs_cpdetector_program_descriptor_select"> + <label>Choose...</label> + </object> + <flag>wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + </object> + <flag>wxEXPAND</flag> + </object> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Arguments:</label> + </object> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxTextCtrl" name="prefs_cpdetector_args_descriptor"/> + <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <growablecols>1</growablecols> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Feature matcher:</label> + </object> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxBoxSizer"> + <orient>wxHORIZONTAL</orient> + <object class="sizeritem"> + <object class="wxTextCtrl" name="prefs_cpdetector_program_matcher"/> + <option>1</option> + <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxButton" name="prefs_cpdetector_program_matcher_select"> + <label>Choose...</label> + </object> + <flag>wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + </object> + <flag>wxEXPAND</flag> + </object> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Arguments:</label> + </object> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxTextCtrl" name="prefs_cpdetector_args_matcher"/> + <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + </object> + </object> + </object> + </object> + <flag>wxALL|wxEXPAND</flag> + <border>5</border> + </object> </object> - <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> - <border>5</border> </object> - <object class="sizeritem"> + </object> + <object class="notebookpage"> + <label>Detector for stacks</label> + <object class="wxPanel" name="panel_stack"> <object class="wxBoxSizer"> - <orient>wxHORIZONTAL</orient> <object class="sizeritem"> - <object class="wxTextCtrl" name="prefs_cpdetector_program_stack"/> - <option>1</option> - <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + <object class="wxStaticText"> + <label>Leave empty, when no control point detector should run on stacks.</label> + </object> + <flag>wxALL|wxEXPAND</flag> <border>5</border> </object> <object class="sizeritem"> - <object class="wxButton" name="prefs_cpdetector_program_stack_select"> - <label>Choose...</label> + <object class="wxFlexGridSizer"> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Program:</label> + </object> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxBoxSizer"> + <orient>wxHORIZONTAL</orient> + <object class="sizeritem"> + <object class="wxTextCtrl" name="prefs_cpdetector_program_stack"/> + <option>1</option> + <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxButton" name="prefs_cpdetector_program_stack_select"> + <label>Choose...</label> + </object> + <flag>wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + </object> + <flag>wxEXPAND</flag> + </object> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Arguments:</label> + </object> + <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxTextCtrl" name="prefs_cpdetector_args_stack"/> + <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <cols>2</cols> + <growablecols>1</growablecols> </object> - <flag>wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag> - <border>5</border> + <flag>wxEXPAND</flag> </object> + <orient>wxVERTICAL</orient> </object> - <flag>wxEXPAND</flag> </object> - <object class="sizeritem"> - <object class="wxStaticText"> - <label>Arguments:</label> + </object> + <object class="notebookpage"> + <label>Advanced option</label> + <object class="wxPanel" name="panel_option"> + <object class="wxBoxSizer"> + <orient>wxVERTICAL</orient> + <object class="sizeritem"> + <object class="wxCheckBox" name="prefs_cpdetector_option"> + <label></label> + <checked>1</checked> + </object> + <flag>wxALL|wxEXPAND</flag> + <border>10</border> + </object> + <object class="sizeritem"> + <object class="wxStaticText" name="prefs_cpdetector_no_option"> + <label>This setting has no advanced options.</label> + </object> + <flag>wxALL|wxEXPAND</flag> + <border>10</border> + </object> </object> - <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag> - <border>5</border> </object> - <object class="sizeritem"> - <object class="wxTextCtrl" name="prefs_cpdetector_args_stack"/> - <flag>wxALL|wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> - <border>5</border> - </object> - <cols>2</cols> - <growablecols>1</growablecols> </object> - <flag>wxEXPAND</flag> + <style></style> </object> - <label>Control Point Detector for stacks</label> - <orient>wxVERTICAL</orient> + <flag>wxALL|wxEXPAND</flag> + <border>5</border> </object> - </object> - <flag>wxEXPAND</flag> - </object> - <object class="sizeritem"> - <object class="wxPanel" name="panel_option"> - <object class="wxStaticBoxSizer"> - <label>Advanced option</label> - <orient>wxVERTICAL</... [truncated message content] |
From: <jl...@us...> - 2010-02-15 22:14:35
|
Revision: 4983 http://hugin.svn.sourceforge.net/hugin/?rev=4983&view=rev Author: jlegg Date: 2010-02-15 22:14:29 +0000 (Mon, 15 Feb 2010) Log Message: ----------- In the fast preview, separate drawing images over the top of the others and drawing overlays. This allows some constraint on blending order. Previously the blending order depended entierly on the order the tools were in memory. Fixes bug where sometimes the crop highlight was included in the difference mode. Fixes bug where sometimes the guides in drag mode inverted something that should have been masked out by difference mode. Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/PreviewCropTool.cpp hugin/trunk/src/hugin1/hugin/PreviewCropTool.h hugin/trunk/src/hugin1/hugin/PreviewDragTool.cpp hugin/trunk/src/hugin1/hugin/PreviewDragTool.h hugin/trunk/src/hugin1/hugin/PreviewPanoMaskTool.cpp hugin/trunk/src/hugin1/hugin/PreviewPanoMaskTool.h hugin/trunk/src/hugin1/hugin/PreviewTool.h hugin/trunk/src/hugin1/hugin/PreviewToolHelper.cpp hugin/trunk/src/hugin1/hugin/PreviewToolHelper.h Modified: hugin/trunk/src/hugin1/hugin/PreviewCropTool.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewCropTool.cpp 2010-02-15 20:27:32 UTC (rev 4982) +++ hugin/trunk/src/hugin1/hugin/PreviewCropTool.cpp 2010-02-15 22:14:29 UTC (rev 4983) @@ -46,7 +46,7 @@ { helper->NotifyMe(PreviewToolHelper::MOUSE_MOVE, this); helper->NotifyMe(PreviewToolHelper::MOUSE_PRESS, this); - helper->NotifyMe(PreviewToolHelper::DRAW_OVER_IMAGES, this); + helper->NotifyMe(PreviewToolHelper::REALLY_DRAW_OVER_IMAGES, this); mouse_down = false; moving_left = false; moving_right = false; @@ -55,7 +55,7 @@ helper->SetStatusMessage(_("Drag the inside of the cropping rectangle to adjust the crop.")); } -void PreviewCropTool::AfterDrawImagesEvent() +void PreviewCropTool::ReallyAfterDrawImagesEvent() { // draw lines for the border to crop: // We use 1/4 of the smallest dimension as the size of an internal margin Modified: hugin/trunk/src/hugin1/hugin/PreviewCropTool.h =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewCropTool.h 2010-02-15 20:27:32 UTC (rev 4982) +++ hugin/trunk/src/hugin1/hugin/PreviewCropTool.h 2010-02-15 22:14:29 UTC (rev 4983) @@ -33,7 +33,7 @@ public: PreviewCropTool(PreviewToolHelper *helper); void Activate(); - void AfterDrawImagesEvent(); + void ReallyAfterDrawImagesEvent(); void MouseMoveEvent(double x, double y, wxMouseEvent & e); void MouseButtonEvent(wxMouseEvent &e); private: Modified: hugin/trunk/src/hugin1/hugin/PreviewDragTool.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewDragTool.cpp 2010-02-15 20:27:32 UTC (rev 4982) +++ hugin/trunk/src/hugin1/hugin/PreviewDragTool.cpp 2010-02-15 22:14:29 UTC (rev 4983) @@ -48,7 +48,7 @@ // register notifications helper->NotifyMe(PreviewToolHelper::MOUSE_MOVE, this); helper->NotifyMe(PreviewToolHelper::MOUSE_PRESS, this); - helper->NotifyMe(PreviewToolHelper::DRAW_OVER_IMAGES, this); + helper->NotifyMe(PreviewToolHelper::REALLY_DRAW_OVER_IMAGES, this); // a handy message for the user: helper->SetStatusMessage(_("Drag to move images (optionally use shift to constrain), or roll with right-drag or ctrl-drag.")); } @@ -261,7 +261,7 @@ } } -void PreviewDragTool::AfterDrawImagesEvent() +void PreviewDragTool::ReallyAfterDrawImagesEvent() { // draw guide lines down the middle. HuginBase::PanoramaOptions *opts = helper->GetViewStatePtr()->GetOptions(); Modified: hugin/trunk/src/hugin1/hugin/PreviewDragTool.h =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewDragTool.h 2010-02-15 20:27:32 UTC (rev 4982) +++ hugin/trunk/src/hugin1/hugin/PreviewDragTool.h 2010-02-15 22:14:29 UTC (rev 4983) @@ -53,7 +53,7 @@ void Activate(); void MouseMoveEvent(double x, double y, wxMouseEvent & e); void MouseButtonEvent(wxMouseEvent &e); - void AfterDrawImagesEvent(); + void ReallyAfterDrawImagesEvent(); class AngleStore { public: Modified: hugin/trunk/src/hugin1/hugin/PreviewPanoMaskTool.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewPanoMaskTool.cpp 2010-02-15 20:27:32 UTC (rev 4982) +++ hugin/trunk/src/hugin1/hugin/PreviewPanoMaskTool.cpp 2010-02-15 22:14:29 UTC (rev 4983) @@ -37,14 +37,14 @@ // we draw to the sentcil buffer the desired shape, and enable the stencil // test before the images are rendered. After they have all been drawn, we // turn off stenciling so the other tools can draw of the complete area. - helper->NotifyMe(PreviewToolHelper::DRAW_OVER_IMAGES, this); + helper->NotifyMe(PreviewToolHelper::REALLY_DRAW_OVER_IMAGES, this); } void PreviewPanoMaskTool::BeforeDrawImagesEvent() { } -void PreviewPanoMaskTool::AfterDrawImagesEvent() +void PreviewPanoMaskTool::ReallyAfterDrawImagesEvent() { switch (helper->GetViewStatePtr()->GetOptions()->getProjection()) { Modified: hugin/trunk/src/hugin1/hugin/PreviewPanoMaskTool.h =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewPanoMaskTool.h 2010-02-15 20:27:32 UTC (rev 4982) +++ hugin/trunk/src/hugin1/hugin/PreviewPanoMaskTool.h 2010-02-15 22:14:29 UTC (rev 4983) @@ -34,7 +34,7 @@ PreviewPanoMaskTool(PreviewToolHelper *helper); void Activate(); void BeforeDrawImagesEvent(); - void AfterDrawImagesEvent(); + void ReallyAfterDrawImagesEvent(); }; #endif Modified: hugin/trunk/src/hugin1/hugin/PreviewTool.h =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewTool.h 2010-02-15 20:27:32 UTC (rev 4982) +++ hugin/trunk/src/hugin1/hugin/PreviewTool.h 2010-02-15 22:14:29 UTC (rev 4983) @@ -79,8 +79,10 @@ virtual void KeypressEvent(int keycode, int modifiers, bool pressed) {} /// Draw using OpenGL anything the tool requires underneath the images. virtual void BeforeDrawImagesEvent() {} - /// Draw using OpenGL anything the tool requires over the images. + /// Draw (using OpenGL) images above the others. virtual void AfterDrawImagesEvent() {} + /// Draw (using OpenGL) the overlays, e.g. crop highlights, guides. + virtual void ReallyAfterDrawImagesEvent() {} /** Draw what the tool requires just before a given image is drawn. * This can be used to modify how the images are drawn, prevent drawing of * the image, or change the order of the image drawing (with another event Modified: hugin/trunk/src/hugin1/hugin/PreviewToolHelper.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewToolHelper.cpp 2010-02-15 20:27:32 UTC (rev 4982) +++ hugin/trunk/src/hugin1/hugin/PreviewToolHelper.cpp 2010-02-15 22:14:29 UTC (rev 4983) @@ -61,6 +61,7 @@ RemoveTool(tool, &image_draw_begin_tools); RemoveTool(tool, &image_draw_end_tools); RemoveTool(tool, &images_under_mouse_notified_tools); + RemoveTool(tool, &really_draw_over_notified_tools); } void PreviewToolHelper::MouseMoved(int x, int y, wxMouseEvent & e) @@ -149,6 +150,12 @@ { (*iterator)->AfterDrawImagesEvent(); } + // The overlays are done separetly to avoid errors with blending order. + for (iterator = really_draw_over_notified_tools.begin(); + iterator != really_draw_over_notified_tools.end(); iterator++) + { + (*iterator)->ReallyAfterDrawImagesEvent(); + } } bool PreviewToolHelper::BeforeDrawImageNumber(unsigned int image) @@ -241,6 +248,9 @@ case IMAGES_UNDER_MOUSE_CHANGE: AddTool(tool, &images_under_mouse_notified_tools); break; + case REALLY_DRAW_OVER_IMAGES: + AddTool(tool, &really_draw_over_notified_tools); + break; } } Modified: hugin/trunk/src/hugin1/hugin/PreviewToolHelper.h =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewToolHelper.h 2010-02-15 20:27:32 UTC (rev 4982) +++ hugin/trunk/src/hugin1/hugin/PreviewToolHelper.h 2010-02-15 22:14:29 UTC (rev 4983) @@ -70,7 +70,7 @@ { MOUSE_MOVE, MOUSE_PRESS, KEY_PRESS, DRAW_UNDER_IMAGES, DRAW_OVER_IMAGES, - IMAGES_UNDER_MOUSE_CHANGE + IMAGES_UNDER_MOUSE_CHANGE, REALLY_DRAW_OVER_IMAGES }; PreviewToolHelper(PT::Panorama *pano, ViewState *view_state, @@ -128,6 +128,7 @@ PreviewTool * keypress_notified_tool; std::set<PreviewTool *> draw_under_notified_tools; std::set<PreviewTool *> draw_over_notified_tools; + std::set<PreviewTool *> really_draw_over_notified_tools; std::set<PreviewTool *> images_under_mouse_notified_tools; // these are vectors: the index is the image that a single tool uses. std::vector<PreviewTool *> image_draw_begin_tools; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-02-18 06:20:40
|
Revision: 4990 http://hugin.svn.sourceforge.net/hugin/?rev=4990&view=rev Author: tmodes Date: 2010-02-18 06:20:31 +0000 (Thu, 18 Feb 2010) Log Message: ----------- Some small changes to lenspanel Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/LensPanel.cpp hugin/trunk/src/hugin1/hugin/xrc/lens_panel.xrc Modified: hugin/trunk/src/hugin1/hugin/LensPanel.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/LensPanel.cpp 2010-02-18 06:19:36 UTC (rev 4989) +++ hugin/trunk/src/hugin1/hugin/LensPanel.cpp 2010-02-18 06:20:31 UTC (rev 4990) @@ -250,12 +250,8 @@ void LensPanel::UpdateLensDisplay () { DEBUG_TRACE(""); - if (m_selectedLenses.size() == 0) { - // no lens selected - return; - } - if (m_selectedImages.size() == 0) { + if ((m_selectedImages.size() == 0) || (m_selectedLenses.size() == 0)){ // no image selected wxListEvent ev; ListSelectionChanged(ev); @@ -621,6 +617,7 @@ DEBUG_DEBUG("no selection, disabling value display"); // clear & disable display XRCCTRL(*this, "lens_val_projectionFormat", wxChoice)->Disable(); + XRCCTRL(*this, "lens_val_responseType", wxChoice)->Disable(); XRCCTRL(*this, "lens_val_v", wxTextCtrl)->Disable(); XRCCTRL(*this, "lens_val_focalLength", wxTextCtrl)->Disable(); XRCCTRL(*this, "lens_val_flFactor", wxTextCtrl)->Disable(); @@ -666,6 +663,7 @@ // one or more images selected if (XRCCTRL(*this, "lens_val_projectionFormat", wxChoice)->Enable()) { // enable all other textboxes as well. + XRCCTRL(*this, "lens_val_responseType", wxChoice)->Enable(); XRCCTRL(*this, "lens_val_v", wxTextCtrl)->Enable(); XRCCTRL(*this, "lens_val_focalLength", wxTextCtrl)->Enable(); XRCCTRL(*this, "lens_val_flFactor", wxTextCtrl)->Enable(); Modified: hugin/trunk/src/hugin1/hugin/xrc/lens_panel.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/lens_panel.xrc 2010-02-18 06:19:36 UTC (rev 4989) +++ hugin/trunk/src/hugin1/hugin/xrc/lens_panel.xrc 2010-02-18 06:20:31 UTC (rev 4990) @@ -761,6 +761,22 @@ </object> <flag>wxALIGN_CENTRE_VERTICAL</flag> </object> + </object> + <flag>wxLEFT|wxEXPAND</flag> + <border>12</border> + </object> + <object class="spacer"> + <size>0,12</size> + </object> + <object class="sizeritem"> + <object class="wxBoxSizer"> + <orient>wxHORIZONTAL</orient> + <object class="sizeritem"> + <object class="wxStaticText"> + <label>Parameters:</label> + </object> + <flag>wxALIGN_CENTRE_VERTICAL</flag> + </object> <object class="spacer"> <size>6,0</size> </object> @@ -778,16 +794,6 @@ <size>0,6</size> </object> <object class="sizeritem"> - <object class="wxStaticText"> - <label>Parameters:</label> - </object> - <flag>wxLEFT</flag> - <border>12</border> - </object> - <object class="spacer"> - <size>0,12</size> - </object> - <object class="sizeritem"> <object class="wxFlexGridSizer"> <object class="sizeritem"> <object class="wxTextCtrl" name="lens_val_Ra"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-02-19 20:53:33
|
Revision: 4997 http://hugin.svn.sourceforge.net/hugin/?rev=4997&view=rev Author: tmodes Date: 2010-02-19 20:53:24 +0000 (Fri, 19 Feb 2010) Log Message: ----------- Changed text for mask type to exclude/include Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp hugin/trunk/src/hugin1/hugin/xrc/mask_editor_panel.xrc Modified: hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp 2010-02-19 17:28:01 UTC (rev 4996) +++ hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp 2010-02-19 20:53:24 UTC (rev 4997) @@ -395,10 +395,10 @@ switch(m_currentMasks[i].getMaskType()) { case HuginBase::MaskPolygon::Mask_negative: - m_maskList->SetItem(i,1,_("negative")); + m_maskList->SetItem(i,1,_("exclude")); break; case HuginBase::MaskPolygon::Mask_positive: - m_maskList->SetItem(i,1,_("positive")); + m_maskList->SetItem(i,1,_("include")); break; }; if(!restoreSelection && i==oldSelection) Modified: hugin/trunk/src/hugin1/hugin/xrc/mask_editor_panel.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/mask_editor_panel.xrc 2010-02-19 17:28:01 UTC (rev 4996) +++ hugin/trunk/src/hugin1/hugin/xrc/mask_editor_panel.xrc 2010-02-19 20:53:24 UTC (rev 4997) @@ -52,8 +52,8 @@ <object class="sizeritem"> <object class="wxChoice" name="mask_editor_choice_masktype"> <content> - <item>negative</item> - <item>positive</item> + <item>exclude</item> + <item>include</item> </content> <selection>0</selection> </object> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2010-02-19 23:39:35
|
Revision: 5000 http://hugin.svn.sourceforge.net/hugin/?rev=5000&view=rev Author: jlegg Date: 2010-02-19 23:39:28 +0000 (Fri, 19 Feb 2010) Log Message: ----------- Fix bug: mask textures were often shared between images with the same filename in the fast preview even if they had different masks. This fix compares the masks, if they are not the same a new texture and associated mask is used. It would have been possible to seperate masks and image textures, this would have provided better memory use (the image textrure doesn't need to be loaded multiple times when masked differently), but leaving masks and associated images tied as one unit is simpler. Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/TextureManager.cpp hugin/trunk/src/hugin1/hugin/TextureManager.h Modified: hugin/trunk/src/hugin1/hugin/TextureManager.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/TextureManager.cpp 2010-02-19 20:55:44 UTC (rev 4999) +++ hugin/trunk/src/hugin1/hugin/TextureManager.cpp 2010-02-19 23:39:28 UTC (rev 5000) @@ -790,7 +790,7 @@ pix_start[1] = out_img[h][w].green(); pix_start[2] = out_img[h][w].blue(); pix_start[3] = (*out_alpha)[h][w]; - pix_start += 4; + pix_start += 4; } } // We don't need to worry about levels with the ATI bug work around, @@ -849,7 +849,7 @@ { pix_start[0] = 255; pix_start[1] = mask[h][w]; - pix_start += 2; + pix_start += 2; } } gluBuild2DMipmaps(GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, maskSize, maskSize, @@ -916,6 +916,9 @@ // first try the filename. if (filename < comp.filename) return true; if (filename > comp.filename) return false; + // Are there different masks? + if (masks < comp.masks) return true; + if (masks > comp.masks) return false; // if we are not using photometric correction, the textures are equivalent. if (!(*photometric_correct)) return false; // now try the photometric properties @@ -946,6 +949,12 @@ void TextureManager::TextureKey::SetOptions(HuginBase::SrcPanoImage *source) { filename = source->getFilename(); + // Record the masks. Images with different masks require different + // textures since the mask is stored with them. + std::stringstream mask_ss; + source->printMaskLines(mask_ss, 0); + masks = mask_ss.str(); + exposure = source->getExposure(); white_balance_red = source->getWhiteBalanceRed(); white_balance_blue = source->getWhiteBalanceBlue(); Modified: hugin/trunk/src/hugin1/hugin/TextureManager.h =================================================================== --- hugin/trunk/src/hugin1/hugin/TextureManager.h 2010-02-19 20:55:44 UTC (rev 4999) +++ hugin/trunk/src/hugin1/hugin/TextureManager.h 2010-02-19 23:39:28 UTC (rev 5000) @@ -139,6 +139,7 @@ std::vector<double> radial_distortion_red; std::vector<double> radial_distortion_blue; double gamma; + std::string masks; // when stored in the textures map, this should be set to something that // always indicates if photometric correction comparisons should be made This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-02-20 07:43:00
|
Revision: 5001 http://hugin.svn.sourceforge.net/hugin/?rev=5001&view=rev Author: tmodes Date: 2010-02-20 07:42:53 +0000 (Sat, 20 Feb 2010) Log Message: ----------- Some better labels, add hint for adding masks. Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp hugin/trunk/src/hugin1/hugin/xrc/mask_editor_panel.xrc Modified: hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp 2010-02-19 23:39:28 UTC (rev 5000) +++ hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp 2010-02-20 07:42:53 UTC (rev 5001) @@ -34,6 +34,7 @@ #include "panoinc.h" // hugin's +#include "hugin/MainFrame.h" #include "hugin/config_defaults.h" #include "hugin/CommandHistory.h" #include "hugin/MaskEditorPanel.h" @@ -291,6 +292,7 @@ if(m_MaskNr<UINT_MAX) m_maskList->SetItemState(m_MaskNr,0,wxLIST_STATE_SELECTED); setMask(UINT_MAX); + MainFrame::Get()->SetStatusText(_("Create a polygon mask by clicking with left mouse button on image, set last point with right mouse button."),0); m_editImg->startNewPolygon(); }; }; @@ -395,10 +397,10 @@ switch(m_currentMasks[i].getMaskType()) { case HuginBase::MaskPolygon::Mask_negative: - m_maskList->SetItem(i,1,_("exclude")); + m_maskList->SetItem(i,1,_("Exclude region")); break; case HuginBase::MaskPolygon::Mask_positive: - m_maskList->SetItem(i,1,_("include")); + m_maskList->SetItem(i,1,_("Include region")); break; }; if(!restoreSelection && i==oldSelection) Modified: hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp 2010-02-19 23:39:28 UTC (rev 5000) +++ hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp 2010-02-20 07:42:53 UTC (rev 5001) @@ -29,6 +29,7 @@ #include "panoinc_WX.h" #include "panoinc.h" #include "base_wx/platform.h" +#include "hugin/MainFrame.h" #include "hugin/config_defaults.h" #include "hugin/MaskImageCtrl.h" #include "hugin/MaskEditorPanel.h" @@ -394,6 +395,7 @@ HuginBase::MaskPolygon mask; m_editingMask=mask; m_selectedPoints.clear(); + MainFrame::Get()->SetStatusText(wxT(""),0); break; }; case NEW_POLYGON_CREATING: @@ -416,6 +418,7 @@ m_selectedPoints.clear(); update(); }; + MainFrame::Get()->SetStatusText(wxT(""),0); break; }; }; @@ -469,6 +472,7 @@ HuginBase::MaskPolygon mask; m_editingMask=mask; m_selectedPoints.clear(); + MainFrame::Get()->SetStatusText(wxT(""),0); break; }; case NEW_POLYGON_CREATING: @@ -489,6 +493,7 @@ m_selectedPoints.clear(); update(); }; + MainFrame::Get()->SetStatusText(wxT(""),0); break; }; case POINTS_DELETING: Modified: hugin/trunk/src/hugin1/hugin/xrc/mask_editor_panel.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/mask_editor_panel.xrc 2010-02-19 23:39:28 UTC (rev 5000) +++ hugin/trunk/src/hugin1/hugin/xrc/mask_editor_panel.xrc 2010-02-20 07:42:53 UTC (rev 5001) @@ -52,8 +52,8 @@ <object class="sizeritem"> <object class="wxChoice" name="mask_editor_choice_masktype"> <content> - <item>exclude</item> - <item>include</item> + <item>Exclude region</item> + <item>Include region</item> </content> <selection>0</selection> </object> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-02-20 10:06:25
|
Revision: 5004 http://hugin.svn.sourceforge.net/hugin/?rev=5004&view=rev Author: tmodes Date: 2010-02-20 10:06:19 +0000 (Sat, 20 Feb 2010) Log Message: ----------- Rotate image in mask editor depending on roll and pitch values Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp hugin/trunk/src/hugin1/hugin/MaskEditorPanel.h hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp hugin/trunk/src/hugin1/hugin/MaskImageCtrl.h Modified: hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp 2010-02-20 09:30:27 UTC (rev 5003) +++ hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp 2010-02-20 10:06:19 UTC (rev 5004) @@ -170,11 +170,17 @@ updateImage=(m_File!=m_pano->getImage(imgNr).getFilename()); if(updateImage) m_File=m_pano->getImage(imgNr).getFilename(); + else + if(GetRot(imgNr)!=m_editImg->getCurrentRotation()) + { + updateImage=true; + m_File=m_pano->getImage(imgNr).getFilename(); + }; m_currentMasks=m_pano->getImage(imgNr).getMasks(); }; // update mask editor if(updateImage) - m_editImg->setImage(m_File,m_currentMasks); + m_editImg->setImage(m_File,m_currentMasks,GetRot(imgNr)); else m_editImg->setNewMasks(m_currentMasks); if(m_currentMasks.size()==0) @@ -432,6 +438,44 @@ wxConfigBase::Get()->Write( wxString::Format(wxT("/MaskEditorPanel/ColumnWidth%d"),colNum), m_maskList->GetColumnWidth(colNum) ); } +MaskImageCtrl::ImageRotation MaskEditorPanel::GetRot(const unsigned int imgNr) +{ + if(imgNr==UINT_MAX) + return MaskImageCtrl::ROT0; + + double pitch=m_pano->getImage(imgNr).getPitch(); + double roll=m_pano->getImage(imgNr).getRoll(); + + MaskImageCtrl::ImageRotation rot = MaskImageCtrl::ROT0; + // normalize roll angle + while (roll > 360) roll-= 360; + while (roll < 0) roll += 360; + + while (pitch > 180) pitch -= 360; + while (pitch < -180) pitch += 360; + bool headOver = (pitch > 90 || pitch < -90); + + if (roll >= 315 || roll < 45) + { + rot = headOver ? MaskImageCtrl::ROT180 : MaskImageCtrl::ROT0; + } + else + if (roll >= 45 && roll < 135) + { + rot = headOver ? MaskImageCtrl::ROT270 : MaskImageCtrl::ROT90; + } + else + if (roll >= 135 && roll < 225) + { + rot = headOver ? MaskImageCtrl::ROT0 : MaskImageCtrl::ROT180; + } + else + { + rot = headOver ? MaskImageCtrl::ROT90 : MaskImageCtrl::ROT270; + } + return rot; +} + IMPLEMENT_DYNAMIC_CLASS(MaskEditorPanel, wxPanel) MaskEditorPanelXmlHandler::MaskEditorPanelXmlHandler() Modified: hugin/trunk/src/hugin1/hugin/MaskEditorPanel.h =================================================================== --- hugin/trunk/src/hugin1/hugin/MaskEditorPanel.h 2010-02-20 09:30:27 UTC (rev 5003) +++ hugin/trunk/src/hugin1/hugin/MaskEditorPanel.h 2010-02-20 10:06:19 UTC (rev 5004) @@ -100,6 +100,8 @@ unsigned int GetSelectedMask(); /** called, when column with of mask list box was changed */ void OnColumnWidthChange( wxListEvent & e ); + /** determines, if the image should be rotated for display */ + MaskImageCtrl::ImageRotation GetRot(const unsigned int imgNr); // GUI controls MaskImageCtrl *m_editImg; Modified: hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp 2010-02-20 09:30:27 UTC (rev 5003) +++ hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp 2010-02-20 10:06:19 UTC (rev 5004) @@ -65,6 +65,7 @@ { wxScrolledWindow::Create(parent, id, pos, size, style, name); maskEditState = NO_IMAGE; + m_imgRotation = ROT0; scaleFactor = 1; fitToWindow = false; @@ -76,7 +77,7 @@ m_editPanel = parent; } -void MaskImageCtrl::setImage(const std::string & file, HuginBase::MaskPolygonVector newMask) +void MaskImageCtrl::setImage(const std::string & file, HuginBase::MaskPolygonVector newMask, ImageRotation rot) { DEBUG_TRACE("setting Image " << file); imageFilename = file; @@ -86,6 +87,7 @@ m_img = ImageCache::getInstance().getImage(imageFilename); maskEditState = NO_MASK; m_imageMask=newMask; + m_imgRotation=rot; setActiveMask(UINT_MAX); rescaleImage(); } @@ -98,6 +100,7 @@ m_img = ImageCache::EntryPtr(new ImageCache::Entry); HuginBase::MaskPolygonVector mask; m_imageMask=mask; + m_imgRotation=ROT0; setActiveMask(UINT_MAX); Refresh(true); } @@ -148,7 +151,7 @@ wxPoint mpos; CalcUnscrolledPosition(mouse.GetPosition().x, mouse.GetPosition().y, &mpos.x, & mpos.y); - FDiff2D currentPos=invtransform(mpos); + FDiff2D currentPos=applyRotInv(invtransform(mpos)); bool doUpdate = false; switch(maskEditState) { @@ -167,7 +170,7 @@ doUpdate=true; m_editingMask=m_imageMask[m_activeMask]; { - FDiff2D delta=currentPos-invtransform(m_dragStartPos); + FDiff2D delta=currentPos-applyRotInv(invtransform(m_dragStartPos)); for(HuginBase::UIntSet::const_iterator it=m_selectedPoints.begin();it!=m_selectedPoints.end();it++) m_editingMask.movePointBy(*it,delta); }; @@ -187,7 +190,7 @@ DEBUG_DEBUG("LEFT MOUSE DOWN"); CalcUnscrolledPosition(mouse.GetPosition().x, mouse.GetPosition().y, &m_dragStartPos.x, & m_dragStartPos.y); - FDiff2D currentPos=invtransform(m_dragStartPos); + FDiff2D currentPos=applyRotInv(invtransform(m_dragStartPos)); m_currentPos=m_dragStartPos; if(!HasCapture()) CaptureMouse(); @@ -282,7 +285,7 @@ wxPoint mpos; CalcUnscrolledPosition(mouse.GetPosition().x, mouse.GetPosition().y, &mpos.x, & mpos.y); - FDiff2D currentPos=invtransform(mpos); + FDiff2D currentPos=applyRotInv(invtransform(mpos)); bool doUpdate=false; switch(maskEditState) { @@ -302,7 +305,7 @@ if(HasCapture()) ReleaseMouse(); { - FDiff2D delta=currentPos-invtransform(m_dragStartPos); + FDiff2D delta=currentPos-applyRotInv(invtransform(m_dragStartPos)); if(sqr(delta.x)+sqr(delta.y)>sqr(maxSelectionDistance)) { for(HuginBase::UIntSet::const_iterator it=m_selectedPoints.begin();it!=m_selectedPoints.end();it++) @@ -328,6 +331,7 @@ hugin_utils::FDiff2D p; p.x=invtransform(m_dragStartPos.x+(m_currentPos.x-m_dragStartPos.x)/2); p.y=invtransform(m_dragStartPos.y+(m_currentPos.y-m_dragStartPos.y)/2); + p=applyRotInv(p); FindPolygon(p); }; break; @@ -357,6 +361,7 @@ hugin_utils::FDiff2D p; p.x=invtransform(m_dragStartPos.x+(m_currentPos.x-m_dragStartPos.x)/2); p.y=invtransform(m_dragStartPos.y+(m_currentPos.y-m_dragStartPos.y)/2); + p=applyRotInv(p); FindPolygon(p); }; maskEditState=NO_SELECTION; @@ -386,7 +391,7 @@ wxPoint mpos; CalcUnscrolledPosition(mouse.GetPosition().x, mouse.GetPosition().y, &mpos.x, & mpos.y); - FDiff2D currentPos=invtransform(mpos); + FDiff2D currentPos=applyRotInv(invtransform(mpos)); switch(maskEditState) { case NEW_POLYGON_STARTED: @@ -429,7 +434,7 @@ wxPoint mpos; CalcUnscrolledPosition(mouse.GetPosition().x, mouse.GetPosition().y, &m_dragStartPos.x, & m_dragStartPos.y); - FDiff2D currentPos=invtransform(m_dragStartPos); + FDiff2D currentPos=applyRotInv(invtransform(m_dragStartPos)); m_currentPos=m_dragStartPos; if(!HasCapture()) CaptureMouse(); @@ -461,7 +466,7 @@ wxPoint mpos; CalcUnscrolledPosition(mouse.GetPosition().x, mouse.GetPosition().y, &mpos.x, & mpos.y); - FDiff2D currentPos=invtransform(mpos); + FDiff2D currentPos=applyRotInv(invtransform(mpos)); if(HasCapture()) ReleaseMouse(); switch(maskEditState) @@ -541,7 +546,7 @@ }; case POINTS_MOVING: { - FDiff2D delta=currentPos-invtransform(m_dragStartPos); + FDiff2D delta=currentPos-applyRotInv(invtransform(m_dragStartPos)); if(sqr(delta.x)+sqr(delta.y)>sqr(maxSelectionDistance)) { for(HuginBase::UIntSet::const_iterator it=m_selectedPoints.begin();it!=m_selectedPoints.end();it++) @@ -658,8 +663,7 @@ wxPoint *polygonPoints=new wxPoint[nrOfPoints]; for(unsigned int j=0;j<nrOfPoints;j++) { - polygonPoints[j].x=transform(poly.getMaskPolygon()[j].x); - polygonPoints[j].y=transform(poly.getMaskPolygon()[j].y); + polygonPoints[j]=transform(applyRot(poly.getMaskPolygon()[j])); }; if(isSelected) dc.SetPen(wxPen(m_colour_point_unselected,1,wxSOLID)); @@ -774,8 +778,8 @@ return; } imageSize = wxSize(img.GetWidth(), img.GetHeight()); + m_realSize = imageSize; imageSize.IncBy(2*HuginBase::maskOffset); - m_realSize = imageSize; if (fitToWindow) scaleFactor = calcAutoScaleFactor(imageSize); //draw border around image to allow selection of position outside of image @@ -793,11 +797,60 @@ imageSize.SetWidth(scale(imageSize.GetWidth())); imageSize.SetHeight(scale(imageSize.GetHeight())); wxImage tmp=bitmap.ConvertToImage(); - bitmap=wxBitmap(tmp.Scale(imageSize.GetWidth(), imageSize.GetHeight())); + tmp=tmp.Scale(imageSize.GetWidth(), imageSize.GetHeight()); + switch(m_imgRotation) + { + case ROT90: + tmp = tmp.Rotate90(true); + break; + case ROT180: + // this is slower than it needs to be... + tmp = tmp.Rotate90(true); + tmp = tmp.Rotate90(true); + break; + case ROT270: + tmp = tmp.Rotate90(false); + break; + default: + break; + } + bitmap=wxBitmap(tmp); DEBUG_DEBUG("rescaling finished"); } + else + { + // need to rotate full image. warning. this can be very memory intensive + if (m_imgRotation != ROT0) + { + wxImage tmp=bitmap.ConvertToImage(); + switch(m_imgRotation) + { + case ROT90: + tmp = tmp.Rotate90(true); + break; + case ROT180: + // this is slower than it needs to be... + tmp = tmp.Rotate90(true); + tmp = tmp.Rotate90(true); + break; + case ROT270: + tmp = tmp.Rotate90(false); + break; + default: + break; + } + bitmap = wxBitmap(tmp); + }; + }; - SetVirtualSize(imageSize.GetWidth(), imageSize.GetHeight()); + if (m_imgRotation == ROT90 || m_imgRotation == ROT270) + { + SetVirtualSize(imageSize.GetHeight(), imageSize.GetWidth()); + } + else + { + SetVirtualSize(imageSize.GetWidth(), imageSize.GetHeight()); + }; SetScrollRate(1,1); Refresh(true); }; @@ -830,10 +883,12 @@ bool MaskImageCtrl::SelectPointsInsideMouseRect(HuginBase::UIntSet &points,const bool considerSelectedOnly) { bool founded=false; - double xmin=invtransform(std::min(m_dragStartPos.x,m_currentPos.x))-maxSelectionDistance; - double xmax=invtransform(std::max(m_dragStartPos.x,m_currentPos.x))+maxSelectionDistance; - double ymin=invtransform(std::min(m_dragStartPos.y,m_currentPos.y))-maxSelectionDistance; - double ymax=invtransform(std::max(m_dragStartPos.y,m_currentPos.y))+maxSelectionDistance; + hugin_utils::FDiff2D p1=applyRotInv(invtransform(m_dragStartPos)); + hugin_utils::FDiff2D p2=applyRotInv(invtransform(m_currentPos)); + double xmin=std::min(p1.x,p2.x)-maxSelectionDistance; + double xmax=std::max(p1.x,p2.x)+maxSelectionDistance; + double ymin=std::min(p1.y,p2.y)-maxSelectionDistance; + double ymax=std::max(p1.y,p2.y)+maxSelectionDistance; const HuginBase::VectorPolygon poly=m_editingMask.getMaskPolygon(); for(unsigned int i=0;i<poly.size();i++) { @@ -874,6 +929,12 @@ { int w = size.GetWidth(); int h = size.GetHeight(); + if (m_imgRotation == ROT90 || m_imgRotation == ROT270) + { + int t = w; + w = h; + h = t; + } wxSize csize = GetSize(); DEBUG_DEBUG("csize: " << csize.GetWidth() << "x" << csize.GetHeight() << "image: " << w << "x" << h); Modified: hugin/trunk/src/hugin1/hugin/MaskImageCtrl.h =================================================================== --- hugin/trunk/src/hugin1/hugin/MaskImageCtrl.h 2010-02-20 09:30:27 UTC (rev 5003) +++ hugin/trunk/src/hugin1/hugin/MaskImageCtrl.h 2010-02-20 10:06:19 UTC (rev 5004) @@ -47,8 +47,14 @@ void Init(MaskEditorPanel * parent); + /** image rotation. + * Useful to display images depending on their roll setting. + * rotation is clockwise + */ + enum ImageRotation { ROT0=0, ROT90, ROT180, ROT270 }; + /** set the current image and mask list, this loads also the image from cache */ - void setImage (const std::string & filename, HuginBase::MaskPolygonVector newMask); + void setImage (const std::string & filename, HuginBase::MaskPolygonVector newMask, ImageRotation rot); /** updates masks for currently selected image */ void setNewMasks(HuginBase::MaskPolygonVector newMasks); /** mark mask with image as beeing editing */ @@ -93,6 +99,9 @@ double getScale() { return fitToWindow ? 0 : scaleFactor; } + /** returns the current rotation of displayed image */ + ImageRotation getCurrentRotation() { return m_imgRotation; }; + /** initiate redraw */ void update(); @@ -121,6 +130,8 @@ wxBitmap bitmap; //filename of current editing file std::string imageFilename; + // stores rotation of image + ImageRotation m_imgRotation; // size of displayed (probably scaled) image wxSize imageSize; // size of real image @@ -140,6 +151,14 @@ double transform(double x) const { return (x+HuginBase::maskOffset) * getScaleFactor(); } + wxPoint transform(hugin_utils::FDiff2D p) const + { + wxPoint r; + r.x = transform(p.x); + r.y = transform(p.y); + return r; + }; + /** translate screen coordinates to image coordinates, considers additional added border */ int invtransform(int x) const { return (int) (x/getScaleFactor()-HuginBase::maskOffset + 0.5); }; @@ -155,6 +174,52 @@ return r; }; + // rotate coordinate to fit possibly rotated image display + // useful for drawing something on the rotated display + template <class T> + T applyRot(const T & p) const + { + switch (m_imgRotation) { + case ROT0: + return p; + break; + case ROT90: + return T(m_realSize.GetHeight()-1 - p.y, p.x); + break; + case ROT180: + return T(m_realSize.GetWidth()-1 - p.x, m_realSize.GetHeight()-1 - p.y); + break; + case ROT270: + return T(p.y, m_realSize.GetWidth()-1 - p.x); + break; + default: + return p; + break; + } + } + + // rotate coordinate to fit possibly rotated image display + // useful for converting rotated display coordinates to image coordinates + template <class T> + T applyRotInv(const T & p) const + { + switch (m_imgRotation) { + case ROT90: + return T(p.y, m_realSize.GetHeight()-1 - p.x); + break; + case ROT180: + return T(m_realSize.GetWidth()-1 - p.x, m_realSize.GetHeight()-1 - p.y); + break; + case ROT270: + return T(m_realSize.GetWidth()-1 - p.y, p.x); + break; + case ROT0: + default: + return p; + break; + } + } + //draw the given polygon void DrawPolygon(wxDC &dc, HuginBase::MaskPolygon poly, bool isSelected, bool drawMarker); //draw a selection rectange, when called the second time the rectangle is deleted This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-02-21 08:25:32
|
Revision: 5007 http://hugin.svn.sourceforge.net/hugin/?rev=5007&view=rev Author: tmodes Date: 2010-02-21 08:25:24 +0000 (Sun, 21 Feb 2010) Log Message: ----------- Prevent double drawing of image when selecting new image in mask editor Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp hugin/trunk/src/hugin1/hugin/MaskImageCtrl.h Modified: hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp 2010-02-20 22:29:18 UTC (rev 5006) +++ hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp 2010-02-21 08:25:24 UTC (rev 5007) @@ -88,7 +88,7 @@ maskEditState = NO_MASK; m_imageMask=newMask; m_imgRotation=rot; - setActiveMask(UINT_MAX); + setActiveMask(UINT_MAX,false); rescaleImage(); } else @@ -114,7 +114,7 @@ Refresh(false); }; -void MaskImageCtrl::setActiveMask(unsigned int newMask) +void MaskImageCtrl::setActiveMask(unsigned int newMask, bool doUpdate) { if(m_activeMask!=newMask) { @@ -136,7 +136,8 @@ HuginBase::MaskPolygon mask; m_editingMask=mask; }; - Refresh(true); + if(doUpdate) + Refresh(true); }; void MaskImageCtrl::selectAllMarkers() Modified: hugin/trunk/src/hugin1/hugin/MaskImageCtrl.h =================================================================== --- hugin/trunk/src/hugin1/hugin/MaskImageCtrl.h 2010-02-20 22:29:18 UTC (rev 5006) +++ hugin/trunk/src/hugin1/hugin/MaskImageCtrl.h 2010-02-21 08:25:24 UTC (rev 5007) @@ -58,7 +58,7 @@ /** updates masks for currently selected image */ void setNewMasks(HuginBase::MaskPolygonVector newMasks); /** mark mask with image as beeing editing */ - void setActiveMask(unsigned int newMask); + void setActiveMask(unsigned int newMask, bool doUpdate=true); /** returns the vector of all mask (including new created mask) */ HuginBase::MaskPolygonVector getNewMask() const { return m_imageMask; }; /** select all points of active mask */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-02-21 09:46:14
|
Revision: 5008 http://hugin.svn.sourceforge.net/hugin/?rev=5008&view=rev Author: tmodes Date: 2010-02-21 09:46:05 +0000 (Sun, 21 Feb 2010) Log Message: ----------- Added function to remove cp in masks to edit menu Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/MainFrame.cpp hugin/trunk/src/hugin1/hugin/MainFrame.h hugin/trunk/src/hugin1/hugin/xrc/main_menu.xrc Modified: hugin/trunk/src/hugin1/hugin/MainFrame.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/MainFrame.cpp 2010-02-21 08:25:24 UTC (rev 5007) +++ hugin/trunk/src/hugin1/hugin/MainFrame.cpp 2010-02-21 09:46:05 UTC (rev 5008) @@ -167,6 +167,7 @@ EVT_BUTTON(XRCID("action_optimize"), MainFrame::OnOptimize) EVT_MENU(XRCID("action_finetune_all_cp"), MainFrame::OnFineTuneAll) // EVT_BUTTON(XRCID("action_finetune_all_cp"), MainFrame::OnFineTuneAll) + EVT_MENU(XRCID("action_remove_cp_in_masks"), MainFrame::OnRemoveCPinMasks) EVT_MENU(XRCID("ID_CP_TABLE"), MainFrame::OnShowCPFrame) EVT_BUTTON(XRCID("ID_CP_TABLE"),MainFrame::OnShowCPFrame) @@ -1467,6 +1468,62 @@ ); } +void MainFrame::OnRemoveCPinMasks(wxCommandEvent & e) +{ + HuginBase::UIntSet cps; + HuginBase::CPVector cpList=pano.getCtrlPoints(); + if(cpList.size()>0) + { + for(unsigned int i=0;i<cpList.size();i++) + { + HuginBase::ControlPoint cp=cpList[i]; + // ignore line control points + if(cp.mode!=HuginBase::ControlPoint::X_Y) + continue; + bool insideMask=false; + // check first image + // remark: we could also use pano.getImage(cp.image1Nr).isInside(vigra::Point2D(cp.x1,cp.y1)) + // this would also check the crop rectangles/circles + // but it would require that the pano is correctly align, otherwise the positive masks + // would not correctly checked + HuginBase::MaskPolygonVector masks=pano.getImage(cp.image1Nr).getMasks(); + if(masks.size()>0) + { + unsigned int j=0; + while((!insideMask) && (j<masks.size())) + { + insideMask=masks[j].isInside(hugin_utils::FDiff2D(cp.x1,cp.y1)); + j++; + }; + }; + // and now the second + if(!insideMask) + { + masks=pano.getImage(cp.image2Nr).getMasks(); + if(masks.size()>0) + { + unsigned int j=0; + while((!insideMask) && (j<masks.size())) + { + insideMask=masks[j].isInside(hugin_utils::FDiff2D(cp.x2,cp.y2)); + j++; + }; + }; + }; + if(insideMask) + cps.insert(i); + }; + if(cps.size()>0) + { + GlobalCmdHist::getInstance().addCommand( + new PT::RemoveCtrlPointsCmd(pano,cps) + ); + }; + }; + wxMessageBox(wxString::Format(_("Removed %d control points"), cps.size()), + _("Removing control points in masks"),wxOK|wxICON_INFORMATION,this); +} + void MainFrame::OnUndo(wxCommandEvent & e) { DEBUG_TRACE("OnUndo"); Modified: hugin/trunk/src/hugin1/hugin/MainFrame.h =================================================================== --- hugin/trunk/src/hugin1/hugin/MainFrame.h 2010-02-21 08:25:24 UTC (rev 5007) +++ hugin/trunk/src/hugin1/hugin/MainFrame.h 2010-02-21 09:46:05 UTC (rev 5008) @@ -184,6 +184,7 @@ void OnNewProject(wxCommandEvent & e); void OnAddTimeImages(wxCommandEvent & e); void OnFineTuneAll(wxCommandEvent & e); + void OnRemoveCPinMasks(wxCommandEvent & e); void OnImportProject(wxCommandEvent & e); void OnApplyTemplate(wxCommandEvent & e); void OnSendToBatch(wxCommandEvent & e); Modified: hugin/trunk/src/hugin1/hugin/xrc/main_menu.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/main_menu.xrc 2010-02-21 08:25:24 UTC (rev 5007) +++ hugin/trunk/src/hugin1/hugin/xrc/main_menu.xrc 2010-02-21 09:46:05 UTC (rev 5008) @@ -77,6 +77,10 @@ <label>Fine-&tune all Points</label> <help>Runs fine-tune on all control points. useful for projects created with other tools, like PTGui or PTAssembler</help> </object> + <object class="wxMenuItem" name="action_remove_cp_in_masks"> + <label>Remove control points in masks</label> + <help>Removes all control points, which are in one mask</help> + </object> <object class="separator"/> <object class="wxMenuItem" name="action_optimize"> <label>&Optimize</label> @@ -141,4 +145,4 @@ </object> </object> </object> -</resource> +</resource> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-02-22 06:35:21
|
Revision: 5010 http://hugin.svn.sourceforge.net/hugin/?rev=5010&view=rev Author: tmodes Date: 2010-02-22 06:35:11 +0000 (Mon, 22 Feb 2010) Log Message: ----------- Fixes small issue with numeric locale and cp detector Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h Modified: hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp 2010-02-21 10:28:18 UTC (rev 5009) +++ hugin/trunk/src/hugin1/hugin/AutoCtrlPointCreator.cpp 2010-02-22 06:35:11 UTC (rev 5010) @@ -190,6 +190,10 @@ if(!setting.GetProgStack().IsEmpty()) if(!CanStartProg(setting.GetProgStack(),parent)) return cps; + //change locale for correct numeric output + char * p = setlocale(LC_NUMERIC,NULL); + char * old_locale = strdup(p); + setlocale(LC_NUMERIC,"C"); switch (t) { case CPDetector_AutoPano: { @@ -236,6 +240,8 @@ default: DEBUG_ERROR("Invalid autopano type"); } + setlocale(LC_NUMERIC,old_locale); + free(old_locale); return cps; } Modified: hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h =================================================================== --- hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h 2010-02-21 10:28:18 UTC (rev 5009) +++ hugin/trunk/src/hugin1/hugin/CPDetectorConfig_default.h 2010-02-22 06:35:11 UTC (rev 5010) @@ -68,7 +68,10 @@ wxT("autopano.exe"),wxT("/allinone /path:%d /keys:%p /project:oto /name:%o /size:1024 /f %i"), wxT(""), wxT(""), wxT(""), wxT(""), true}, {CPDetector_AutoPanoSift, wxT("Panomatic"),wxT("panomatic.exe"),wxT("-o %o %i"),wxT(""), wxT(""), wxT(""), wxT(""), true}, - {CPDetector_AutoPanoSift, wxT("Align image stack"),wxT("align_image_stack.exe"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSift, wxT("Align image stack"),wxT("align_image_stack.exe"),wxT("-f %v -v -p %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSiftMultiRowStack, wxT("Autopano-SIFT-C (multirow/stacked)"), + wxT("generatekeys.exe"),wxT("%i %k 800"), wxT("autopano.exe"),wxT("--maxmatches %p %o %k"), + wxT("align_image_stack.exe"),wxT("-f %v -v -p %o %i"), true}, {CPDetector_AutoPanoSift, wxT("Match-n-shift"),wxT("match-n-shift.exe"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true} #else #if !defined MAC_SELF_CONTAINED_BUNDLE @@ -76,6 +79,9 @@ {CPDetector_AutoPanoSift,wxT("Autopano-SIFT-C"),wxT("autopano-noop.sh"),wxT("--maxmatches %p --projection %f,%v %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true}, {CPDetector_AutoPanoSift,wxT("Panomatic"),wxT("panomatic"),wxT("-o %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true}, {CPDetector_AutoPanoSift,wxT("Match-n-shift"),wxT("match-n-shift"),wxT("-b -a -f %f -v %v -c -p %p -o %o %i"),wxT(""),wxT(""),wxT(""), wxT(""), true}, + {CPDetector_AutoPanoSiftMultiRowStack, wxT("Autopano-SIFT-C (multirow/stacked)"), + wxT("generatekeys"),wxT("%i %k 800"), wxT("autopano"),wxT("--maxmatches %p %o %k"), + wxT("align_image_stack"),wxT("-f %v -p %o %i"), true}, {CPDetector_AutoPanoSift,wxT("Align image stack"),wxT("align_image_stack"),wxT("-f %v -p %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true}, {CPDetector_AutoPanoSift,wxT("Align_image_stack FullFrameFisheye"),wxT("align_image_stack"),wxT("-f %v -p -e %o %i"),wxT(""),wxT(""), wxT(""), wxT(""), true} #else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gpa...@us...> - 2010-02-23 03:18:12
|
Revision: 5013 http://hugin.svn.sourceforge.net/hugin/?rev=5013&view=rev Author: gpatters1 Date: 2010-02-23 03:18:06 +0000 (Tue, 23 Feb 2010) Log Message: ----------- Add Image mask save and restore buttons to mask image panel. Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp hugin/trunk/src/hugin1/hugin/MaskEditorPanel.h hugin/trunk/src/hugin1/hugin/xrc/mask_editor_panel.xrc Modified: hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp 2010-02-22 23:09:12 UTC (rev 5012) +++ hugin/trunk/src/hugin1/hugin/MaskEditorPanel.cpp 2010-02-23 03:18:06 UTC (rev 5013) @@ -34,6 +34,7 @@ #include "panoinc.h" // hugin's +#include "base_wx/platform.h" #include "hugin/MainFrame.h" #include "hugin/config_defaults.h" #include "hugin/CommandHistory.h" @@ -48,6 +49,8 @@ EVT_COMBOBOX(XRCID("mask_editor_zoom_box"), MaskEditorPanel::OnZoom) EVT_CHOICE(XRCID("mask_editor_choice_masktype"), MaskEditorPanel::OnMaskTypeChange) EVT_BUTTON(XRCID("mask_editor_add"), MaskEditorPanel::OnMaskAdd) + EVT_BUTTON(XRCID("mask_editor_load"), MaskEditorPanel::OnMaskLoad) + EVT_BUTTON(XRCID("mask_editor_save"), MaskEditorPanel::OnMaskSave) EVT_BUTTON(XRCID("mask_editor_delete"), MaskEditorPanel::OnMaskDelete) EVT_COLOURPICKER_CHANGED(XRCID("mask_editor_colour_polygon_negative"),MaskEditorPanel::OnColourChanged) EVT_COLOURPICKER_CHANGED(XRCID("mask_editor_colour_polygon_positive"),MaskEditorPanel::OnColourChanged) @@ -130,6 +133,8 @@ m_maskType->Disable(); XRCCTRL(*this, "mask_editor_zoom_box", wxComboBox)->Disable(); XRCCTRL(*this, "mask_editor_add", wxButton)->Disable(); + XRCCTRL(*this, "mask_editor_load", wxButton)->Disable(); + XRCCTRL(*this, "mask_editor_save", wxButton)->Disable(); XRCCTRL(*this, "mask_editor_delete", wxButton)->Disable(); // apply zoom specified in xrc file @@ -190,6 +195,8 @@ XRCCTRL(*this, "mask_editor_zoom_box", wxComboBox)->Enable(enableCtrl); XRCCTRL(*this, "mask_editor_add", wxButton)->Enable(enableCtrl); XRCCTRL(*this, "mask_editor_delete", wxButton)->Enable(enableCtrl && m_MaskNr<UINT_MAX); + XRCCTRL(*this, "mask_editor_load", wxButton)->Enable(enableCtrl); + XRCCTRL(*this, "mask_editor_save", wxButton)->Enable(enableCtrl && m_MaskNr<UINT_MAX); UpdateMaskList(restoreMaskSelection); // FIXME: lets hope that nobody holds references to these images.. ImageCache::getInstance().softFlush(); @@ -201,6 +208,7 @@ m_maskType->Enable(m_MaskNr<UINT_MAX); m_editImg->setActiveMask(m_MaskNr); XRCCTRL(*this,"mask_editor_delete", wxButton)->Enable(m_MaskNr<UINT_MAX); + XRCCTRL(*this, "mask_editor_save", wxButton)->Enable(m_MaskNr<UINT_MAX); if(m_ImageNr<UINT_MAX && m_MaskNr<UINT_MAX) m_maskType->SetSelection(m_currentMasks[m_MaskNr].getMaskType()); else @@ -303,6 +311,114 @@ }; }; +void MaskEditorPanel::OnMaskSave(wxCommandEvent &e) +{ + if(m_ImageNr<UINT_MAX && m_MaskNr<UINT_MAX) + { + wxFileDialog dlg(this, _("Save mask"), + wxConfigBase::Get()->Read(wxT("/actualPath"), wxT("")), + wxT(""), _("Mask files (*.msk)|*.msk|All files (*)|*"), + wxSAVE, wxDefaultPosition); + if (dlg.ShowModal() == wxID_OK) + { + wxString fn = dlg.GetPath(); + if (fn.Right(4) != wxT(".msk")) + { + fn.Append(wxT(".msk")); + } + if (wxFile::Exists(fn)) + { + int d = wxMessageBox(wxString::Format(_("File %s exists. Overwrite?"), + fn.c_str()),_("Save Mask"), + wxYES_NO | wxICON_QUESTION); + if (d != wxYES) { + return; + } + } + wxFileName filename = fn; + std::ofstream maskFile(filename.GetFullPath().mb_str(HUGIN_CONV_FILENAME)); + vigra::Size2D imageSize = m_pano->getImage(m_ImageNr).getSize(); + maskFile << "# w" << imageSize.width() << " h" << imageSize.height() << std::endl; + HuginBase::MaskPolygon maskToWrite = m_currentMasks[m_MaskNr]; + maskToWrite.printPolygonLine(maskFile,m_ImageNr); + maskFile.close(); + }; + } +}; + +void MaskEditorPanel::OnMaskLoad(wxCommandEvent &e) +{ + if (m_ImageNr<UINT_MAX) { + wxFileDialog dlg(this,_("Load mask"), + wxConfigBase::Get()->Read(wxT("/actualPath"),wxT("")), + wxT(""),_("Mask files (*.msk)|*.msk|All files (*)|*"), + wxOPEN, wxDefaultPosition); + if (dlg.ShowModal() != wxID_OK) { + MainFrame::Get()->SetStatusText(_("Load mask: cancel")); + return; + } + wxFileName filename(dlg.GetPath()); + std::ifstream in(filename.GetFullPath().mb_str(HUGIN_CONV_FILENAME)); + vigra::Size2D maskImageSize; + HuginBase::MaskPolygonVector imgMasks=m_currentMasks; + while (in.good()) + { + std::string line; + std::getline(in,line); + switch (line[0]) + { + case '#': + { + unsigned int w; + if (getIntParam(w, line, "w")) + maskImageSize.setWidth(w); + unsigned int h; + if (getIntParam(h, line, "h")) + maskImageSize.setHeight(h); + break; + } + case 'k': + { + HuginBase::MaskPolygon newPolygon; + //Ignore image number set in mask + newPolygon.setImgNr(m_ImageNr); + unsigned int param; + if (getIntParam(param,line,"t")) + { + newPolygon.setMaskType((HuginBase::MaskPolygon::MaskType)param); + } + std::string format; + if (getPTParam(format,line,"p")) + { + if(newPolygon.parsePolygonString(format)) { + imgMasks.push_back(newPolygon); + } + } + break; + } + default: + { + break; + } + } + } + in.close(); + // compare image size from file with that of current image alert user + // if different. + if (maskImageSize != m_pano->getImage(m_ImageNr).getSize()) + { + int cont = wxMessageBox(_("Mask size does not match image size.\n\nContinue?"),_("Warn"), wxYES_NO,this); + if (cont == wxNO) + { + // abort + return; + } + } + // Update the pano with the imported masks + GlobalCmdHist::getInstance().addCommand(new PT::UpdateMaskForImgCmd(*m_pano,m_ImageNr,imgMasks)); + } +} + void MaskEditorPanel::OnMaskDelete(wxCommandEvent &e) { if(m_ImageNr<UINT_MAX && m_MaskNr<UINT_MAX) Modified: hugin/trunk/src/hugin1/hugin/MaskEditorPanel.h =================================================================== --- hugin/trunk/src/hugin1/hugin/MaskEditorPanel.h 2010-02-22 23:09:12 UTC (rev 5012) +++ hugin/trunk/src/hugin1/hugin/MaskEditorPanel.h 2010-02-23 03:18:06 UTC (rev 5013) @@ -83,6 +83,10 @@ void OnMaskTypeChange(wxCommandEvent &e); /** called when user wants to create new polygon */ void OnMaskAdd(wxCommandEvent &e); + /** called when user wants to save active mask */ + void OnMaskSave(wxCommandEvent &e); + /** called when user wants to load a mask into the selected image */ + void OnMaskLoad(wxCommandEvent &e); /** called when user wants to delete active mask */ void OnMaskDelete(wxCommandEvent &e); /** sets the actual zoom factor */ Modified: hugin/trunk/src/hugin1/hugin/xrc/mask_editor_panel.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/mask_editor_panel.xrc 2010-02-22 23:09:12 UTC (rev 5012) +++ hugin/trunk/src/hugin1/hugin/xrc/mask_editor_panel.xrc 2010-02-23 03:18:06 UTC (rev 5013) @@ -33,6 +33,21 @@ <border>5</border> </object> <object class="sizeritem"> + <object class="wxButton" name="mask_editor_load"> + <label>Load Mask</label> + </object> + <option>0</option> + <flag>wxALL|wxEXPAND</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxButton" name="mask_editor_save"> + <label>Save mask</label> + </object> + <flag>wxALL|wxEXPAND</flag> + <border>5</border> + </object> + <object class="sizeritem"> <object class="wxListCtrl" name="mask_editor_mask_list"> <style>wxLC_REPORT|wxLC_SINGLE_SEL</style> </object> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2010-02-24 01:59:10
|
Revision: 5023 http://hugin.svn.sourceforge.net/hugin/?rev=5023&view=rev Author: jlegg Date: 2010-02-24 01:59:03 +0000 (Wed, 24 Feb 2010) Log Message: ----------- Fix use of uninitalised memory in MaskImageCtrl and PreviewLayoutLinesTool. Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp hugin/trunk/src/hugin1/hugin/PreviewLayoutLinesTool.cpp Modified: hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp 2010-02-24 00:45:16 UTC (rev 5022) +++ hugin/trunk/src/hugin1/hugin/MaskImageCtrl.cpp 2010-02-24 01:59:03 UTC (rev 5023) @@ -69,6 +69,7 @@ scaleFactor = 1; fitToWindow = false; m_previewOnly = false; + m_activeMask = UINT_MAX; return true; } @@ -760,15 +761,15 @@ //and now the actual polygon if(maskEditState==POINTS_ADDING || maskEditState==POINTS_MOVING || maskEditState==NEW_POLYGON_CREATING) DrawPolygon(dc,m_editingMask,true,true); - } + } else { - // clear the rectangle and exit + // clear the rectangle and exit dc.SetPen(wxPen(GetBackgroundColour(), 1, wxSOLID)); dc.SetBrush(wxBrush(GetBackgroundColour(),wxSOLID)); dc.Clear(); - return; - }; + return; + }; } void MaskImageCtrl::OnSize(wxSizeEvent &e) Modified: hugin/trunk/src/hugin1/hugin/PreviewLayoutLinesTool.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewLayoutLinesTool.cpp 2010-02-24 00:45:16 UTC (rev 5022) +++ hugin/trunk/src/hugin1/hugin/PreviewLayoutLinesTool.cpp 2010-02-24 01:59:03 UTC (rev 5023) @@ -82,6 +82,7 @@ PreviewLayoutLinesTool::PreviewLayoutLinesTool(PreviewToolHelper *helper) : PreviewTool(helper), m_updateStatistics(true), + m_nearestLine(-1), m_useNearestLine(false) { helper->GetPanoramaPtr()->addObserver(this); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tm...@us...> - 2010-03-13 15:34:21
|
Revision: 5062 http://hugin.svn.sourceforge.net/hugin/?rev=5062&view=rev Author: tmodes Date: 2010-03-13 15:34:07 +0000 (Sat, 13 Mar 2010) Log Message: ----------- Don't draw crosses on great circle arcs in layout mode Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/GreatCircles.cpp hugin/trunk/src/hugin1/hugin/GreatCircles.h hugin/trunk/src/hugin1/hugin/PreviewLayoutLinesTool.cpp Modified: hugin/trunk/src/hugin1/hugin/GreatCircles.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/GreatCircles.cpp 2010-03-13 12:39:30 UTC (rev 5061) +++ hugin/trunk/src/hugin1/hugin/GreatCircles.cpp 2010-03-13 15:34:07 UTC (rev 5062) @@ -206,7 +206,7 @@ } } -void GreatCircleArc::draw() const +void GreatCircleArc::draw(bool withCross) const { // Just draw all the previously worked out line segments /** @todo It is probably more apropriate to use thin rectangles than lines. @@ -221,17 +221,20 @@ it->doGL(); } glEnd(); - double scale = 4 / getxscale(); - // The scale to draw them: this is 5 pixels outside in every direction. - { - std::vector<GreatCircleArc::LineSegment>::const_iterator it; - it = m_lines.begin(); - it->doGLcross(0,scale); + if(withCross) + { + double scale = 4 / getxscale(); + // The scale to draw them: this is 5 pixels outside in every direction. + { + std::vector<GreatCircleArc::LineSegment>::const_iterator it; + it = m_lines.begin(); + it->doGLcross(0,scale); - it = m_lines.end(); - it--; //.end points beyond last point. - it->doGLcross(1,scale); - } + it = m_lines.end(); + it--; //.end points beyond last point. + it->doGLcross(1,scale); + } + }; } void GreatCircleArc::LineSegment::doGL() const Modified: hugin/trunk/src/hugin1/hugin/GreatCircles.h =================================================================== --- hugin/trunk/src/hugin1/hugin/GreatCircles.h 2010-03-13 12:39:30 UTC (rev 5061) +++ hugin/trunk/src/hugin1/hugin/GreatCircles.h 2010-03-13 15:34:07 UTC (rev 5062) @@ -79,7 +79,7 @@ double endLat, double endLong, ViewState & m_viewState); /// Draw the great circle arc on the fast preview - void draw() const; + void draw(bool withCross=true) const; /** Return the square of the minimal distance between the great circle arc and a coorinate on the panorama. * This is an approximation, but should be reasonable. */ Modified: hugin/trunk/src/hugin1/hugin/PreviewLayoutLinesTool.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewLayoutLinesTool.cpp 2010-03-13 12:39:30 UTC (rev 5061) +++ hugin/trunk/src/hugin1/hugin/PreviewLayoutLinesTool.cpp 2010-03-13 15:34:07 UTC (rev 5062) @@ -560,7 +560,7 @@ if (lineWidth > 5.0) lineWidth = 5.0; glLineWidth(lineWidth); - arc.draw(); + arc.draw(false); } PreviewLayoutLinesTool::LineDetails::LineDetails() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2010-03-16 23:27:41
|
Revision: 5065 http://hugin.svn.sourceforge.net/hugin/?rev=5065&view=rev Author: brunopostle Date: 2010-03-16 23:27:34 +0000 (Tue, 16 Mar 2010) Log Message: ----------- Optimisation preset for Everything not x,y,z (Felix Hagemann) Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/OptimizePanel.cpp hugin/trunk/src/hugin1/hugin/xrc/optimize_panel.xrc Modified: hugin/trunk/src/hugin1/hugin/OptimizePanel.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/OptimizePanel.cpp 2010-03-15 22:05:23 UTC (rev 5064) +++ hugin/trunk/src/hugin1/hugin/OptimizePanel.cpp 2010-03-16 23:27:34 UTC (rev 5065) @@ -82,7 +82,7 @@ // local optimize definition. need to be in sync with the xrc file enum OptimizeMode { OPT_PAIRWISE=0, OPT_YRP, OPT_YRP_XYZ, OPT_YRP_V, OPT_YRP_XYZ_V, - OPT_YRP_B, OPT_YRP_XYZ_B, OPT_YRP_BV, OPT_YRP_XYZ_BV, OPT_ALL, OPT_CUSTOM, + OPT_YRP_B, OPT_YRP_XYZ_B, OPT_YRP_BV, OPT_YRP_XYZ_BV, OPT_ALL_NOTXYZ, OPT_ALL, OPT_CUSTOM, OPT_END_MARKER}; OptimizePanel::OptimizePanel() @@ -901,11 +901,26 @@ SetCheckMark(m_d_list,false); SetCheckMark(m_e_list,false); break; - case OPT_ALL: + case OPT_ALL_NOTXYZ: // everything SetCheckMark(m_yaw_list,true); SetCheckMark(m_roll_list,true); SetCheckMark(m_pitch_list,true); + SetCheckMark(m_x_list,false); + SetCheckMark(m_y_list,false); + SetCheckMark(m_z_list,false); + SetCheckMark(m_v_list,true); + SetCheckMark(m_a_list,true); + SetCheckMark(m_b_list,true); + SetCheckMark(m_c_list,true); + SetCheckMark(m_d_list,true); + SetCheckMark(m_e_list,true); + break; + case OPT_ALL: + // everything + SetCheckMark(m_yaw_list,true); + SetCheckMark(m_roll_list,true); + SetCheckMark(m_pitch_list,true); SetCheckMark(m_x_list,true); SetCheckMark(m_y_list,true); SetCheckMark(m_z_list,true); Modified: hugin/trunk/src/hugin1/hugin/xrc/optimize_panel.xrc =================================================================== --- hugin/trunk/src/hugin1/hugin/xrc/optimize_panel.xrc 2010-03-15 22:05:23 UTC (rev 5064) +++ hugin/trunk/src/hugin1/hugin/xrc/optimize_panel.xrc 2010-03-16 23:27:34 UTC (rev 5065) @@ -44,6 +44,7 @@ <item>Positions, Translation and Barrel (y,p,r,x,y,z,b)</item> <item>Positions, View and Barrel (y,p,r,v,b)</item> <item>Positions, Translation, View and Barrel (y,p,r,x,y,z,v,b)</item> + <item>Everything (not x,y,z)</item> <item>Everything</item> <item>the Custom parameters below</item> </content> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |