From e5c5f3ceb269eb886458d5b7f80a2016ceee2201 Mon Sep 17 00:00:00 2001 From: Patrick Warren <> Date: Sun, 22 Jan 2017 16:30:23 +1300 Subject: [PATCH] Show duplicate legs as dashed lines --- src/gfxcore.cc | 27 +++++++++++++++++++++++++-- src/gfxcore.h | 15 +++++++++++++++ src/guicontrol.cc | 31 +++++++++++++++++++++++++++++++ src/guicontrol.h | 7 +++++++ src/mainfrm.cc | 25 +++++++++++++++++++++++-- src/mainfrm.h | 16 +++++++++++++++- 6 files changed, 116 insertions(+), 5 deletions(-) diff --git a/src/gfxcore.cc b/src/gfxcore.cc index 517a2cb8..58a3c0f9 100644 --- a/src/gfxcore.cc +++ b/src/gfxcore.cc @@ -133,6 +133,7 @@ GfxCore::GfxCore(MainFrm* parent, wxWindow* parent_win, GUIControl* control) : m_Crosses(false), m_Legs(true), m_Splays(SPLAYS_SHOW_FADED), + m_Dupes(DUPES_SHOW_DASHED), m_Names(false), m_Scalebar(true), m_ColourKey(true), @@ -320,6 +321,11 @@ bool GfxCore::HasSplays() const return m_Parent->HasSplays(); } +bool GfxCore::HasDupes() const +{ + return m_Parent->HasDupes(); +} + bool GfxCore::HasSurfaceLegs() const { return m_Parent->HasSurfaceLegs(); @@ -2428,9 +2434,26 @@ void GfxCore::GenerateDisplayList() trav = m_Parent->traverses_begin(); } + if (m_Dupes == DUPES_SHOW_DASHED) { + EnableDashedLines(); + while (trav != tend) { + if ((*trav).isDupe) + (this->*AddPoly)(*trav); + ++trav; + } + DisableDashedLines(); + trav = m_Parent->traverses_begin(); + } + while (trav != tend) { - if (m_Splays == SPLAYS_SHOW_NORMAL || !(*trav).isSplay) - (this->*AddPoly)(*trav); + if ( ((*trav).isSplay && m_Splays == SPLAYS_SHOW_NORMAL) + || ((*trav).isDupe && m_Dupes == DUPES_SHOW_NORMAL) + || (!(*trav).isSplay && !(*trav).isDupe) ) + (this->*AddPoly)(*trav); + + //if (m_Splays == SPLAYS_SHOW_NORMAL || !(*trav).isSplay) + // (this->*AddPoly)(*trav); + ++trav; } } diff --git a/src/gfxcore.h b/src/gfxcore.h index 771e4b3a..338ceeef 100644 --- a/src/gfxcore.h +++ b/src/gfxcore.h @@ -108,6 +108,12 @@ enum { SPLAYS_SHOW_NORMAL, }; +enum { + DUPES_HIDE, + DUPES_SHOW_DASHED, + DUPES_SHOW_NORMAL, +}; + // It's pointless to redraw the screen as often as we can on a fast machine, // since the display hardware will only update so many times per second. // This is the maximum framerate we'll redraw at. @@ -180,6 +186,7 @@ private: bool m_Crosses; bool m_Legs; int m_Splays; + int m_Dupes; bool m_Names; bool m_Scalebar; bool m_ColourKey; @@ -436,11 +443,13 @@ public: bool HasUndergroundLegs() const; bool HasSplays() const; + bool HasDupes() const; bool HasSurfaceLegs() const; bool HasTubes() const; bool ShowingUndergroundLegs() const { return m_Legs; } int ShowingSplaysMode() const { return m_Splays; } + int ShowingDupesMode() const { return m_Dupes; } bool ShowingSurfaceLegs() const { return m_Surface; } bool ShowingColourKey() const { return m_ColourKey; } @@ -463,6 +472,12 @@ public: InvalidateList(LIST_UNDERGROUND_LEGS); ForceRefresh(); } + void SetDupesMode(int mode) { + m_Dupes = mode; + UpdateBlobs(); + InvalidateList(LIST_UNDERGROUND_LEGS); + ForceRefresh(); + } void ToggleSurfaceLegs() { ToggleFlag(&m_Surface, UPDATE_BLOBS_AND_CROSSES); } diff --git a/src/guicontrol.cc b/src/guicontrol.cc index 22ddfa3c..7fd3ef22 100644 --- a/src/guicontrol.cc +++ b/src/guicontrol.cc @@ -665,6 +665,37 @@ void GUIControl::OnShowSplaysFadedUpdate(wxUpdateUIEvent& cmd) cmd.Check(m_View->ShowingSplaysMode() == SPLAYS_SHOW_FADED); } +void GUIControl::OnHideDupes() { + m_View->SetDupesMode(DUPES_HIDE); +} + +void GUIControl::OnShowDupesNormal() { + m_View->SetDupesMode(DUPES_SHOW_NORMAL); +} + +void GUIControl::OnShowDupesDashed() { + m_View->SetDupesMode(DUPES_SHOW_DASHED); +} + +void GUIControl::OnDupesUpdate(wxUpdateUIEvent& cmd) { + cmd.Enable(m_View->HasData() && m_View->HasDupes()); +} + +void GUIControl::OnHideDupesUpdate(wxUpdateUIEvent& cmd) { + cmd.Enable(m_View->HasData() && m_View->HasDupes()); + cmd.Check(m_View->ShowingDupesMode() == DUPES_HIDE); +} + +void GUIControl::OnShowDupesNormalUpdate(wxUpdateUIEvent& cmd) { + cmd.Enable(m_View->HasData() && m_View->HasDupes()); + cmd.Check(m_View->ShowingDupesMode() == DUPES_SHOW_NORMAL); +} + +void GUIControl::OnShowDupesDashedUpdate(wxUpdateUIEvent& cmd) { + cmd.Enable(m_View->HasData() && m_View->HasDupes()); + cmd.Check(m_View->ShowingDupesMode() == DUPES_SHOW_DASHED); +} + void GUIControl::OnMoveEast() { m_View->TurnCaveTo(90.0); diff --git a/src/guicontrol.h b/src/guicontrol.h index c1bb8980..9ecdf1e8 100644 --- a/src/guicontrol.h +++ b/src/guicontrol.h @@ -83,6 +83,9 @@ public: void OnHideSplays(); void OnShowSplaysNormal(); void OnShowSplaysFaded(); + void OnHideDupes(); + void OnShowDupesNormal(); + void OnShowDupesDashed(); void OnShowSurface(); void OnMoveEast(); void OnMoveNorth(); @@ -136,6 +139,10 @@ public: void OnHideSplaysUpdate(wxUpdateUIEvent&); void OnShowSplaysNormalUpdate(wxUpdateUIEvent&); void OnShowSplaysFadedUpdate(wxUpdateUIEvent&); + void OnDupesUpdate(wxUpdateUIEvent&); + void OnHideDupesUpdate(wxUpdateUIEvent&); + void OnShowDupesNormalUpdate(wxUpdateUIEvent&); + void OnShowDupesDashedUpdate(wxUpdateUIEvent&); void OnShowSurfaceUpdate(wxUpdateUIEvent&); void OnMoveEastUpdate(wxUpdateUIEvent&); void OnMoveNorthUpdate(wxUpdateUIEvent&); diff --git a/src/mainfrm.cc b/src/mainfrm.cc index 75dc9568..e27d4134 100644 --- a/src/mainfrm.cc +++ b/src/mainfrm.cc @@ -571,6 +571,9 @@ BEGIN_EVENT_TABLE(MainFrm, wxFrame) EVT_MENU(menu_SPLAYS_HIDE, MainFrm::OnHideSplays) EVT_MENU(menu_SPLAYS_SHOW_NORMAL, MainFrm::OnShowSplaysNormal) EVT_MENU(menu_SPLAYS_SHOW_FADED, MainFrm::OnShowSplaysFaded) + EVT_MENU(menu_DUPES_HIDE, MainFrm::OnHideDupes) + EVT_MENU(menu_DUPES_SHOW_NORMAL, MainFrm::OnShowDupesNormal) + EVT_MENU(menu_DUPES_SHOW_DASHED, MainFrm::OnShowDupesDashed) EVT_MENU(menu_VIEW_SHOW_CROSSES, MainFrm::OnShowCrosses) EVT_MENU(menu_VIEW_SHOW_ENTRANCES, MainFrm::OnShowEntrances) EVT_MENU(menu_VIEW_SHOW_FIXED_PTS, MainFrm::OnShowFixedPts) @@ -625,6 +628,10 @@ BEGIN_EVENT_TABLE(MainFrm, wxFrame) EVT_UPDATE_UI(menu_SPLAYS_HIDE, MainFrm::OnHideSplaysUpdate) EVT_UPDATE_UI(menu_SPLAYS_SHOW_NORMAL, MainFrm::OnShowSplaysNormalUpdate) EVT_UPDATE_UI(menu_SPLAYS_SHOW_FADED, MainFrm::OnShowSplaysFadedUpdate) + EVT_UPDATE_UI(menu_VIEW_DUPES, MainFrm::OnDupesUpdate) + EVT_UPDATE_UI(menu_DUPES_HIDE, MainFrm::OnHideDupesUpdate) + EVT_UPDATE_UI(menu_DUPES_SHOW_NORMAL, MainFrm::OnShowDupesNormalUpdate) + EVT_UPDATE_UI(menu_DUPES_SHOW_DASHED, MainFrm::OnShowDupesDashedUpdate) EVT_UPDATE_UI(menu_VIEW_SHOW_CROSSES, MainFrm::OnShowCrossesUpdate) EVT_UPDATE_UI(menu_VIEW_SHOW_ENTRANCES, MainFrm::OnShowEntrancesUpdate) EVT_UPDATE_UI(menu_VIEW_SHOW_FIXED_PTS, MainFrm::OnShowFixedPtsUpdate) @@ -727,7 +734,7 @@ MainFrm::MainFrm(const wxString& title, const wxPoint& pos, const wxSize& size) m_Gfx(NULL), m_Log(NULL), m_NumEntrances(0), m_NumFixedPts(0), m_NumExportedPts(0), m_NumHighlighted(0), - m_HasUndergroundLegs(false), m_HasSplays(false), m_HasSurfaceLegs(false), + m_HasUndergroundLegs(false), m_HasSplays(false), m_HasDupes(false), m_HasSurfaceLegs(false), m_HasErrorInformation(false), m_IsExtendedElevation(false), pending_find(false), fullscreen_showing_menus(false) #ifdef PREFDLG @@ -874,6 +881,12 @@ void MainFrm::CreateMenuBar() splaymenu->AppendCheckItem(menu_SPLAYS_SHOW_NORMAL, wmsg(/*&Show*/409)); viewmenu->Append(menu_VIEW_SPLAYS, wmsg(/*Spla&y Legs*/406), splaymenu); + wxMenu* dupemenu = new wxMenu; + dupemenu->AppendCheckItem(menu_DUPES_HIDE, "Hide"); + dupemenu->AppendCheckItem(menu_DUPES_SHOW_DASHED, "Dashed"); + dupemenu->AppendCheckItem(menu_DUPES_SHOW_NORMAL, "Normal"); + viewmenu->Append(menu_VIEW_DUPES, "Duplicate legs", dupemenu); + viewmenu->AppendSeparator(); viewmenu->AppendCheckItem(menu_VIEW_SHOW_OVERLAPPING_NAMES, wmsg(/*&Overlapping Names*/273)); @@ -1134,6 +1147,7 @@ bool MainFrm::LoadData(const wxString& file, const wxString & prefix) m_NumEntrances = 0; m_HasUndergroundLegs = false; m_HasSplays = false; + m_HasDupes = false; m_HasSurfaceLegs = false; m_HasErrorInformation = false; @@ -1174,6 +1188,7 @@ bool MainFrm::LoadData(const wxString& file, const wxString & prefix) img_point prev_pt = {0,0,0}; bool current_polyline_is_surface = false; bool current_polyline_is_splay = false; + bool current_polyline_is_dupe = false; bool pending_move = false; // When a traverse is split between surface and underground, we split it // into contiguous traverses of each, but we need to track these so we can @@ -1220,13 +1235,17 @@ bool MainFrm::LoadData(const wxString& file, const wxString & prefix) if (survey->flags & img_FLAG_SPLAY) m_HasSplays = true; + if (survey->flags & img_FLAG_DUPLICATE) + m_HasDupes = true; bool is_surface = (survey->flags & img_FLAG_SURFACE); bool is_splay = (survey->flags & img_FLAG_SPLAY); + bool is_dupe = (survey->flags & img_FLAG_DUPLICATE); if (!is_surface) { if (pt.z < m_DepthMin) m_DepthMin = pt.z; if (pt.z > depthmax) depthmax = pt.z; } - if (pending_move || current_polyline_is_surface != is_surface || current_polyline_is_splay != is_splay) { + if (pending_move || current_polyline_is_surface != is_surface + || current_polyline_is_splay != is_splay || current_polyline_is_dupe != is_dupe) { if (!current_polyline_is_surface && current_traverse) { //FixLRUD(*current_traverse); } @@ -1242,6 +1261,7 @@ bool MainFrm::LoadData(const wxString& file, const wxString & prefix) traverses.push_back(traverse()); current_traverse = &traverses.back(); current_traverse->isSplay = is_splay; + current_traverse->isDupe = is_dupe; ++n_traverses; // The previous point was at a surface->ug transition. if (current_polyline_is_surface) { @@ -1252,6 +1272,7 @@ bool MainFrm::LoadData(const wxString& file, const wxString & prefix) current_polyline_is_surface = is_surface; current_polyline_is_splay = is_splay; + current_polyline_is_dupe = is_dupe; if (pending_move) { // Update survey extents. We only need to do this if diff --git a/src/mainfrm.h b/src/mainfrm.h index 1eece14c..6c163892 100644 --- a/src/mainfrm.h +++ b/src/mainfrm.h @@ -95,6 +95,10 @@ enum { menu_SPLAYS_HIDE, menu_SPLAYS_SHOW_FADED, menu_SPLAYS_SHOW_NORMAL, + menu_VIEW_DUPES, + menu_DUPES_HIDE, + menu_DUPES_SHOW_DASHED, + menu_DUPES_SHOW_NORMAL, menu_VIEW_SHOW_CROSSES, menu_VIEW_SHOW_NAMES, menu_VIEW_SHOW_SURFACE, @@ -174,10 +178,11 @@ class traverse : public vector { public: int n_legs; bool isSplay; + bool isDupe; double length; double E, H, V; - traverse() : n_legs(0), isSplay(false), length(0), E(-1), H(-1), V(-1) { } + traverse() : n_legs(0), isSplay(false), isDupe(false), length(0), E(-1), H(-1), V(-1) { } }; class MainFrm : public wxFrame { @@ -201,6 +206,7 @@ class MainFrm : public wxFrame { int m_NumHighlighted; bool m_HasUndergroundLegs; bool m_HasSplays; + bool m_HasDupes; bool m_HasSurfaceLegs; bool m_HasErrorInformation; wxSplitterWindow* m_Splitter; @@ -355,6 +361,10 @@ public: void OnHideSplaysUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnHideSplaysUpdate(event); } void OnShowSplaysNormalUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowSplaysNormalUpdate(event); } void OnShowSplaysFadedUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowSplaysFadedUpdate(event); } + void OnDupesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnDupesUpdate(event); } + void OnHideDupesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnHideDupesUpdate(event); } + void OnShowDupesNormalUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowDupesNormalUpdate(event); } + void OnShowDupesDashedUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowDupesDashedUpdate(event); } void OnShowSurfaceUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowSurfaceUpdate(event); } void OnMoveEastUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnMoveEastUpdate(event); } void OnMoveNorthUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnMoveNorthUpdate(event); } @@ -397,6 +407,9 @@ public: void OnHideSplays(wxCommandEvent&) { if (m_Control) m_Control->OnHideSplays(); } void OnShowSplaysNormal(wxCommandEvent&) { if (m_Control) m_Control->OnShowSplaysNormal(); } void OnShowSplaysFaded(wxCommandEvent&) { if (m_Control) m_Control->OnShowSplaysFaded(); } + void OnHideDupes(wxCommandEvent&) { if (m_Control) m_Control->OnHideDupes(); } + void OnShowDupesNormal(wxCommandEvent&) { if (m_Control) m_Control->OnShowDupesNormal(); } + void OnShowDupesDashed(wxCommandEvent&) { if (m_Control) m_Control->OnShowDupesDashed(); } void OnShowSurface(wxCommandEvent&) { if (m_Control) m_Control->OnShowSurface(); } void OnMoveEast(wxCommandEvent&) { if (m_Control) m_Control->OnMoveEast(); } void OnMoveNorth(wxCommandEvent&) { if (m_Control) m_Control->OnMoveNorth(); } @@ -468,6 +481,7 @@ public: bool HasUndergroundLegs() const { return m_HasUndergroundLegs; } bool HasSplays() const { return m_HasSplays; } + bool HasDupes() const { return m_HasDupes; } bool HasSurfaceLegs() const { return m_HasSurfaceLegs; } bool HasTubes() const { return !tubes.empty(); } bool HasErrorInformation() const { return m_HasErrorInformation; } -- 2.11.4.GIT