From: <hug...@li...> - 2011-07-10 18:45:27
|
branch: gsoc2011_onomou details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/94187fe4ce13 changeset: 5381:94187fe4ce13 user: onomou <on...@gm...> date: Tue Jul 05 22:48:56 2011 -0700 description: Main primitive straight line code in - seg faults on line pair adding diffstat: src/hugin1/hugin/CPEditorPanel.cpp | 147 ++++++++++++++++++++++++++++-------- src/hugin1/hugin/CPEditorPanel.h | 8 +- src/hugin1/hugin/CPImageCtrl.cpp | 111 +++++++++++++++++++-------- src/hugin1/hugin/CPImageCtrl.h | 25 ++++- 4 files changed, 215 insertions(+), 76 deletions(-) diffs (truncated from 527 to 500 lines): diff -r 1eb794e209e3 -r 94187fe4ce13 src/hugin1/hugin/CPEditorPanel.cpp --- a/src/hugin1/hugin/CPEditorPanel.cpp Mon Jul 04 22:43:28 2011 -0700 +++ b/src/hugin1/hugin/CPEditorPanel.cpp Tue Jul 05 22:48:56 2011 -0700 @@ -295,6 +295,8 @@ m_rightChoice->Disable(); #endif + tempPair.img1Nr = tempPair.img2Nr = UINT_MAX; + // apply zoom specified in xrc file wxCommandEvent dummy; dummy.SetInt(XRCCTRL(*this,"cp_editor_choice_zoom",wxChoice)->GetSelection()); @@ -546,6 +548,12 @@ d = m_leftImg->MaxScrollDelta(d); m_rightImg->ScrollDelta(d); m_leftImg->ScrollDelta(d); + break; + } + case CPEvent::NEW_LINE: + { + NewLineAdded(ev.getLine(),left); + break; } break; @@ -1238,6 +1246,63 @@ #endif +void CPEditorPanel::NewLineAdded(StraightLine l, bool left) +{ + if( left ) { // new line is in left image + if( tempPair.img1Nr == UINT_MAX ) { // first image has not been set, add the line + tempPair.img1Nr = m_leftImageNr; + tempPair.img1Lines.push_back(l); + } else { // first image has been set, is it the same one? + if( tempPair.img1Nr == m_leftImageNr ) { // must be redoing the first line + tempPair.img1Nr = m_leftImageNr; + tempPair.img1Lines.pop_back(); + tempPair.img1Lines.push_back(l); + } else { // new line in other image - now there is a pair + tempPair.img2Nr = m_leftImageNr; + tempPair.img2Lines.push_back(l); + } + } + m_leftImg->setNewLine(l); + } else { // new line is in right image + if( tempPair.img1Nr == UINT_MAX ) { // see above + tempPair.img1Nr = m_rightImageNr; + tempPair.img1Lines.push_back(l); + } else { + if( tempPair.img1Nr == m_rightImageNr ) { + tempPair.img1Nr = m_rightImageNr; + tempPair.img1Lines.pop_back(); + tempPair.img1Lines.push_back(l); + } else { + tempPair.img2Nr = m_rightImageNr; + tempPair.img2Lines.push_back(l); + } + } + m_rightImg->setNewLine(l); + } + + if( tempPair.img1Nr < UINT_MAX && tempPair.img2Nr < UINT_MAX ) // completed corresponding lines + { + bool found = false; + for( int i = 0; i < allLines.size(), found == false; i++ ) // find other entries for this image pair + { + if( (allLines[i].img1Nr == tempPair.img1Nr) && (allLines[i].img2Nr == tempPair.img2Nr) ) { + allLines[i].img1Lines.push_back(tempPair.img1Lines[1]); + allLines[i].img2Lines.push_back(tempPair.img2Lines[1]); + found = true; + } else if( (allLines[i].img1Nr == tempPair.img2Nr) && (allLines[i].img2Nr == tempPair.img1Nr) ) { + allLines[i].img1Lines.push_back(tempPair.img2Lines[1]); + allLines[i].img2Lines.push_back(tempPair.img1Lines[1]); + found = true; + } + } + if( !found ) + allLines.push_back(tempPair); + // reset tempPair + tempPair.img1Nr = tempPair.img2Nr = UINT_MAX; + tempPair.img1Lines.clear(); + tempPair.img2Lines.clear(); + } +} void CPEditorPanel::panoramaChanged(PT::Panorama &pano) { int nGui = m_cpModeChoice->GetCount(); @@ -1584,14 +1649,14 @@ // get list of control lines - for (int i = 0; i < allLines.size(); i++) { + for (unsigned int i = 0; i < allLines.size(); i++) { if ((allLines[i].img1Nr == m_leftImageNr) && (allLines[i].img2Nr == m_rightImageNr)) { - m_leftImg->setCtrlLines( allLines[i].img1lines ); - m_rightImg->setCtrlLines( allLines[i].img2lines ); + m_leftImg->setCtrlLines( allLines[i].img1Lines ); + m_rightImg->setCtrlLines( allLines[i].img2Lines ); i = allLines.size(); } else if ((allLines[i].img2Nr == m_leftImageNr) && (allLines[i].img1Nr == m_rightImageNr)) { - m_leftImg->setCtrlLines( allLines[i].img2lines ); - m_rightImg->setCtrlLines( allLines[i].img1lines ); + m_leftImg->setCtrlLines( allLines[i].img2Lines ); + m_rightImg->setCtrlLines( allLines[i].img1Lines ); i = allLines.size(); } } @@ -2034,48 +2099,60 @@ void CPEditorPanel::OnAddLine(wxCommandEvent & e) { - //wxListEvent dummy; - //OnCPListDeselect(dummy); - - const char* addl = "Add Line"; const char* cncl = "Cancel"; // toggle add line mode if (addingLine) { - m_cpModeChoice->Enable(); - m_autoAddCB->Enable(); - m_fineTuneCB->Enable(); - m_estimateCB->Enable(); - m_addLineButton->Enable(); - XRCCTRL(*this, "cp_editor_finetune_button", wxButton)->Enable(); - XRCCTRL(*this, "cp_editor_celeste_button", wxButton)->Enable(); - //XRCCTRL(*this, "cp_editor_choice_zoom", wxChoice)->Enable(); - XRCCTRL(*this, "cp_editor_previous_img", wxButton)->Enable(); - XRCCTRL(*this, "cp_editor_swap_img", wxButton)->Enable(); - XRCCTRL(*this, "cp_editor_next_img", wxButton)->Enable(); + EnableButtons(); m_addLineButton->SetLabel(wxString(addl,wxConvUTF8)); addingLine = false; + m_leftImg->cancelNewLine(); + m_rightImg->cancelNewLine(); } else { - m_autoAddCB->Disable(); - m_fineTuneCB->Disable(); - m_estimateCB->Disable(); - m_cpModeChoice->Disable(); - m_addButton->Disable(); - m_delButton->Disable(); - XRCCTRL(*this, "cp_editor_finetune_button", wxButton)->Disable(); - XRCCTRL(*this, "cp_editor_celeste_button", wxButton)->Disable(); - //XRCCTRL(*this, "cp_editor_choice_zoom", wxChoice)->Disable(); - XRCCTRL(*this, "cp_editor_previous_img", wxButton)->Disable(); - XRCCTRL(*this, "cp_editor_swap_img", wxButton)->Disable(); - XRCCTRL(*this, "cp_editor_next_img", wxButton)->Disable(); - m_selectedPoint = UINT_MAX; - changeState(NO_POINT); - UpdateDisplay(true); + DisableButtons(); m_addLineButton->SetLabel(wxString(cncl,wxConvUTF8)); addingLine = true; + m_leftImg->startNewLine(); + m_rightImg->startNewLine(); } } +void CPEditorPanel::DisableButtons(void) +{ + m_cpList->Disable(); + m_autoAddCB->Disable(); + m_fineTuneCB->Disable(); + m_estimateCB->Disable(); + m_cpModeChoice->Disable(); + m_addButton->Disable(); + m_delButton->Disable(); + XRCCTRL(*this, "cp_editor_finetune_button", wxButton)->Disable(); + XRCCTRL(*this, "cp_editor_celeste_button", wxButton)->Disable(); + //XRCCTRL(*this, "cp_editor_choice_zoom", wxChoice)->Disable(); + XRCCTRL(*this, "cp_editor_previous_img", wxButton)->Disable(); + XRCCTRL(*this, "cp_editor_swap_img", wxButton)->Disable(); + XRCCTRL(*this, "cp_editor_next_img", wxButton)->Disable(); + m_selectedPoint = UINT_MAX; + changeState(NO_POINT); + UpdateDisplay(true); +} + +void CPEditorPanel::EnableButtons(void) +{ + m_cpList->Enable(); + m_cpModeChoice->Enable(); + m_autoAddCB->Enable(); + m_fineTuneCB->Enable(); + m_estimateCB->Enable(); + m_addLineButton->Enable(); + XRCCTRL(*this, "cp_editor_finetune_button", wxButton)->Enable(); + XRCCTRL(*this, "cp_editor_celeste_button", wxButton)->Enable(); + //XRCCTRL(*this, "cp_editor_choice_zoom", wxChoice)->Enable(); + XRCCTRL(*this, "cp_editor_previous_img", wxButton)->Enable(); + XRCCTRL(*this, "cp_editor_swap_img", wxButton)->Enable(); + XRCCTRL(*this, "cp_editor_next_img", wxButton)->Enable(); +} + void CPEditorPanel::OnDeleteButton(wxCommandEvent & e) { DEBUG_TRACE(""); diff -r 1eb794e209e3 -r 94187fe4ce13 src/hugin1/hugin/CPEditorPanel.h --- a/src/hugin1/hugin/CPEditorPanel.h Mon Jul 04 22:43:28 2011 -0700 +++ b/src/hugin1/hugin/CPEditorPanel.h Tue Jul 05 22:48:56 2011 -0700 @@ -154,6 +154,9 @@ void NewPointChange(hugin_utils::FDiff2D p, bool left); // void CreateNewPointRight(wxPoint p); + // function called when a new line is added + void NewLineAdded(StraightLine l, bool left); + /// this is used to finally create the point in the panorama model void CreateNewPoint(); @@ -185,6 +188,8 @@ void OnCPListDeselect(wxListEvent & e); void OnAddButton(wxCommandEvent & e); void OnAddLine(wxCommandEvent & e); + void DisableButtons(void); + void EnableButtons(void); void OnZoom(wxCommandEvent & e); void OnTextPointChange(wxCommandEvent &e); void OnKey(wxKeyEvent & e); @@ -260,7 +265,8 @@ // Line controls bool addingLine; - struct linesPair { int img1Nr, img2Nr; std::vector<StraightLine> img1lines, img2lines; }; + struct linesPair { unsigned int img1Nr, img2Nr; std::vector<StraightLine> img1Lines, img2Lines; }; + linesPair tempPair; std::vector<linesPair> allLines; // GUI controls diff -r 1eb794e209e3 -r 94187fe4ce13 src/hugin1/hugin/CPImageCtrl.cpp --- a/src/hugin1/hugin/CPImageCtrl.cpp Mon Jul 04 22:43:28 2011 -0700 +++ b/src/hugin1/hugin/CPImageCtrl.cpp Tue Jul 05 22:48:56 2011 -0700 @@ -74,7 +74,15 @@ point = p; } -CPEvent::CPEvent(wxWindow *win, unsigned int cpNr) +CPEvent::CPEvent(wxWindow* win, StraightLine & l) +{ + SetEventType( EVT_CPEVENT ); // ? + SetEventObject( win ); + mode = NEW_LINE; + line = l; +} + +CPEvent::CPEvent(wxWindow* win, unsigned int cpNr) { SetEventType( EVT_CPEVENT ); SetEventObject( win ); @@ -255,20 +263,22 @@ return; } - // draw known points. - unsigned int i=0; - m_labelPos.resize(points.size()); - vector<FDiff2D>::const_iterator it; - for (it = points.begin(); it != points.end(); ++it) { - if (! (editState == KNOWN_POINT_SELECTED && i==selectedPointNr)) { - m_labelPos[i] = drawPoint(dc, *it, i); + if( editState != PREP_LINE && editState != ADDING_LINE ) { + // draw known points. + unsigned int i=0; + m_labelPos.resize(points.size()); + vector<FDiff2D>::const_iterator it; + for (it = points.begin(); it != points.end(); ++it) { + if (! (editState == KNOWN_POINT_SELECTED && i==selectedPointNr)) { + m_labelPos[i] = drawPoint(dc, *it, i); + } + i++; } - i++; } + + drawLines(dc); switch(editState) { - case NEW_LINE: // fix these - break; case SELECT_REGION: dc.SetLogicalFunction(wxINVERT); dc.SetPen(wxPen(wxT("WHITE"), 1, wxSOLID)); @@ -305,7 +315,10 @@ m_labelPos[selectedPointNr] = drawPoint(dc, points[selectedPointNr], selectedPointNr, true); break; case ADDING_LINE: - drawLine(dc, newLine); + drawLine(dc, newLine.start, m_mousePos); + break; + case PREP_LINE: + //m_showSearchArea = true; break; case NO_SELECTION: case NO_IMAGE: @@ -542,15 +555,21 @@ #endif -void CPImageCtrl::drawLine(wxDC & dc, const StraightLine in) +void CPImageCtrl::drawLine(wxDC & dc, const hugin_utils::FDiff2D start, const hugin_utils::FDiff2D end) { wxCoord x1,x2,y1,y2; - x1 = roundi(in.start.x); - y1 = roundi(in.start.y); - x2 = m_mousePos.x; - y2 = m_mousePos.y; + x1 = start.x; + y1 = start.y; + x2 = end.x; + y2 = end.y; dc.DrawLine(x1,y1,x2,y2); } +void CPImageCtrl::drawLines(wxDC & dc) +{ + for( unsigned int i = 0; i < lines.size(); i++ ) { + drawLine( dc, lines[i].start, lines[i].end ); + } +} class ScalingTransform { @@ -925,11 +944,6 @@ // only if the shift key is not pressed. if (mouse.LeftIsDown() && ! mouse.ShiftDown()) { switch(editState) { - case ADDING_LINE: // fix these - //mousePos = mouse.GetLogicalPosition(); - case NEW_LINE: - doUpdate = true; - break; case NO_SELECTION: DEBUG_DEBUG("mouse down movement without selection, in NO_SELECTION state!"); break; @@ -971,6 +985,14 @@ break; case NO_IMAGE: break; + case ADDING_LINE: // fix these + doUpdate = true; + showPosition(mpos); + break; + case PREP_LINE: + doUpdate = true; + showPosition(mpos); + break; } } @@ -1012,7 +1034,8 @@ unsigned int selPointNr; if (isOccupied(mouse.GetPosition(), mpos, selPointNr) == KNOWN_POINT_SELECTED && - (! (editState == KNOWN_POINT_SELECTED && selectedPointNr == selPointNr) ) ) { + (! (editState == KNOWN_POINT_SELECTED && selectedPointNr == selPointNr) ) && + (editState != ADDING_LINE && editState != PREP_LINE)) { SetCursor(wxCursor(wxCURSOR_ARROW)); } else { SetCursor(*m_CPSelectCursor); @@ -1049,15 +1072,15 @@ // EditorState oldstate = editState; EditorState clickState = isOccupied(mouse.GetPosition(), mpos, selPointNr); // check if mouse is over a CP + // if mouse is inside image boundaries if (mouse.LeftDown() && editState != NO_IMAGE - && mpos.x < m_realSize.x && mpos.y < m_realSize.y) + && mpos.x < m_realSize.x && mpos.y < m_realSize.y) // mouse.LeftIsDown()? { + // we can always select a new point if (editState == ADDING_LINE) { // clicking second point on line - - } else if (editState == NEW_LINE) { // clicking first point on line - editState = ADDING_LINE; - - // we can always select a new point + showPosition(mpos); + } else if (editState == PREP_LINE) { // clicking first point on line + showPosition(mpos); } else if (clickState == KNOWN_POINT_SELECTED) { DEBUG_DEBUG("click on point: " << selPointNr); selectedPointNr = selPointNr; @@ -1113,9 +1136,6 @@ // EditorState oldState = editState; if (mouse.LeftUp()) { switch(editState) { - case ADDING_LINE: // fix these - case NEW_LINE: - break; case NO_SELECTION: DEBUG_DEBUG("mouse release without selection"); break; @@ -1170,7 +1190,20 @@ } case NO_IMAGE: break; - + case ADDING_LINE: // just clicked line endpoint + { + newLine.end = m_mousePos; + //m_showSearchArea = false; + CPEvent e( this, newLine ); // emit newLine event + emit(e); + break; + } + case PREP_LINE: + { + newLine.start = m_mousePos; + editState = ADDING_LINE; + break; + } } // DEBUG_DEBUG("ImageDisplay: mouse release, state change: " << oldState // << " -> " << editState); @@ -1524,7 +1557,17 @@ void CPImageCtrl::setNewLine(const StraightLine & l) { - + lines.push_back(l); +} + +void CPImageCtrl::startNewLine(void) +{ + editState = PREP_LINE; +} + +void CPImageCtrl::cancelNewLine(void) +{ + editState = NO_SELECTION; } void CPImageCtrl::showSearchArea(bool show) diff -r 1eb794e209e3 -r 94187fe4ce13 src/hugin1/hugin/CPImageCtrl.h --- a/src/hugin1/hugin/CPImageCtrl.h Mon Jul 04 22:43:28 2011 -0700 +++ b/src/hugin1/hugin/CPImageCtrl.h Tue Jul 05 22:48:56 2011 -0700 @@ -43,7 +43,7 @@ { DECLARE_DYNAMIC_CLASS(CPEvent) - enum CPEventMode { NONE, NEW_POINT_CHANGED, POINT_SELECTED, POINT_CHANGED, REGION_SELECTED, RIGHT_CLICK, SCROLLED, DELETE_REGION_SELECTED }; + enum CPEventMode { NONE, NEW_POINT_CHANGED, POINT_SELECTED, POINT_CHANGED, REGION_SELECTED, RIGHT_CLICK, SCROLLED, DELETE_REGION_SELECTED, NEW_LINE }; public: CPEvent( ); @@ -51,8 +51,10 @@ CPEvent(wxWindow* win, CPEventMode mode); /// a new point has been created. CPEvent(wxWindow* win, hugin_utils::FDiff2D & p); + /// a new line has been created + CPEvent(wxWindow* win, StraightLine & l); /// a point has been selected - CPEvent(wxWindow *win, unsigned int cpNr); + CPEvent(wxWindow* win, unsigned int cpNr); /// a point has been moved CPEvent(wxWindow* win, unsigned int cpNr, const hugin_utils::FDiff2D & p); /// region selected @@ -74,6 +76,9 @@ const hugin_utils::FDiff2D & getPoint() { return point; } + + const StraightLine & getLine() + { return line; } unsigned int getPointNr() { return pointNr; } @@ -81,6 +86,7 @@ CPEventMode mode; wxRect region; hugin_utils::FDiff2D point; + StraightLine line; int pointNr; }; @@ -139,7 +145,6 @@ void setCtrlPoints(const std::vector<hugin_utils::FDiff2D> & points); /// control lines inside this image - //extern struct StraightLine; void setCtrlLines(const std::vector<StraightLine> & linesIn); /// clear new point @@ -148,8 +153,10 @@ /// set new point to a specific point void setNewPoint(const hugin_utils::FDiff2D & p); - /// set new point to a specific point + /// start new line void setNewLine(const StraightLine & l); + void startNewLine(); + void cancelNewLine(); /// select a point for usage void selectPoint(unsigned int); @@ -208,7 +215,8 @@ protected: wxRect drawPoint(wxDC & p, const hugin_utils::FDiff2D & point, int i, bool selected = false) const; |