6 // Copyright (C) 2000-2003,2005 Mark R. Shinwell
7 // Copyright (C) 2001-2003,2004,2005,2006,2010,2011,2012,2013,2014,2015,2016,2018 Olly Betts
9 // This program is free software; you can redistribute it and/or modify
10 // it under the terms of the GNU General Public License as published by
11 // the Free Software Foundation; either version 2 of the License, or
12 // (at your option) any later version.
14 // This program is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
19 // You should have received a copy of the GNU General Public License
20 // along with this program; if not, write to the Free Software
21 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "labelinfo.h"
41 class PointInfo
: public Point
{
45 PointInfo() : Point(), date(-1) { }
46 explicit PointInfo(const img_point
& pt
) : Point(pt
), date(-1) { }
47 PointInfo(const img_point
& pt
, int date_
) : Point(pt
), date(date_
) { }
48 PointInfo(const Point
& p
, int date_
) : Point(p
), date(date_
) { }
49 int GetDate() const { return date
; }
60 XSect(const LabelInfo
* stn_
, int date_
,
61 double l_
, double r_
, double u_
, double d_
)
62 : stn(stn_
), date(date_
), l(l_
), r(r_
), u(u_
), d(d_
), right_bearing(0) { }
63 double GetL() const { return l
; }
64 double GetR() const { return r
; }
65 double GetU() const { return u
; }
66 double GetD() const { return d
; }
67 double get_right_bearing() const { return right_bearing
; }
68 void set_right_bearing(double right_bearing_
) {
69 right_bearing
= right_bearing_
;
71 int GetDate() const { return date
; }
72 const wxString
& GetLabel() const { return stn
->GetText(); }
73 const Point
& GetPoint() const { return *stn
; }
74 double GetX() const { return stn
->GetX(); }
75 double GetY() const { return stn
->GetY(); }
76 double GetZ() const { return stn
->GetZ(); }
77 friend Vector3
operator-(const XSect
& a
, const XSect
& b
);
80 inline Vector3
operator-(const XSect
& a
, const XSect
& b
) {
81 return *(a
.stn
) - *(b
.stn
);
84 class traverse
: public vector
<PointInfo
> {
87 // Bitmask of img_FLAG_SURFACE, img_FLAG_SPLAY and img_FLAG_DUPLICATE.
89 // An img_STYLE_* value.
92 enum { ERROR_3D
= 0, ERROR_H
= 1, ERROR_V
= 2 };
93 double errors
[3] = {-1, -1, -1};
97 traverse(const char* name_
) : name(name_
, wxConvUTF8
) {
98 if (name
.empty() && !name_
[0]) {
99 // If name isn't valid UTF-8 then this conversion will
100 // give an empty string. In this case, assume that the
101 // label is CP1252 (the Microsoft superset of ISO8859-1).
102 static wxCSConv
ConvCP1252(wxFONTENCODING_CP1252
);
103 name
= wxString(name_
, ConvCP1252
);
105 // Or if that doesn't work (ConvCP1252 doesn't like
106 // strings with some bytes in) let's just go for
108 name
= wxString(name_
, wxConvISO8859_1
);
115 std::set
<wxString
, std::greater
<wxString
>> filters
;
116 std::set
<wxString
, std::greater
<wxString
>> redundant_filters
;
117 // Default to the Survex standard separator - then a filter created before
118 // the survey separator is known is likely to not need rebuilding.
119 wxChar separator
= '.';
124 void add(const wxString
& survey
);
126 void remove(const wxString
& survey
);
128 void clear() { filters
.clear(); redundant_filters
.clear(); }
130 bool empty() const { return filters
.empty(); }
132 void SetSeparator(wxChar separator_
);
134 bool CheckVisible(const wxString
& name
) const;
139 list
<traverse
> traverses
[8];
140 mutable list
<vector
<XSect
>> tubes
;
143 list
<LabelInfo
*> m_Labels
;
147 double m_DepthMin
, m_DepthExt
;
148 int m_DateMin
, m_DateExt
;
149 bool complete_dateinfo
;
150 int m_NumEntrances
= 0;
151 int m_NumFixedPts
= 0;
152 int m_NumExportedPts
= 0;
153 bool m_HasUndergroundLegs
= false;
154 bool m_HasSplays
= false;
155 bool m_HasDupes
= false;
156 bool m_HasSurfaceLegs
= false;
157 bool m_HasErrorInformation
= false;
158 bool m_IsExtendedElevation
= false;
159 mutable bool m_TubesPrepared
= false;
161 // Character separating survey levels (often '.')
164 wxString m_Title
, m_cs_proj
, m_DateStamp
;
166 time_t m_DateStamp_numeric
;
170 void do_prepare_tubes() const;
172 void CentreDataset(const Vector3
& vmin
);
175 int Load(const wxString
& file
, const wxString
& prefix
);
177 const Vector3
& GetExtent() const { return m_Ext
; }
179 const wxString
& GetSurveyTitle() const { return m_Title
; }
181 const wxString
& GetDateString() const { return m_DateStamp
; }
183 time_t GetDateStamp() const { return m_DateStamp_numeric
; }
185 double GetDepthExtent() const { return m_DepthExt
; }
186 double GetDepthMin() const { return m_DepthMin
; }
188 bool HasCompleteDateInfo() const { return complete_dateinfo
; }
189 int GetDateExtent() const { return m_DateExt
; }
190 int GetDateMin() const { return m_DateMin
; }
192 int GetNumFixedPts() const { return m_NumFixedPts
; }
193 int GetNumExportedPts() const { return m_NumExportedPts
; }
194 int GetNumEntrances() const { return m_NumEntrances
; }
196 bool HasUndergroundLegs() const { return m_HasUndergroundLegs
; }
197 bool HasSplays() const { return m_HasSplays
; }
198 bool HasDupes() const { return m_HasDupes
; }
199 bool HasSurfaceLegs() const { return m_HasSurfaceLegs
; }
200 bool HasTubes() const { return !tubes
.empty(); }
201 bool HasErrorInformation() const { return m_HasErrorInformation
; }
203 bool IsExtendedElevation() const { return m_IsExtendedElevation
; }
205 wxChar
GetSeparator() const { return m_separator
; }
207 const wxString
& GetCSProj() const { return m_cs_proj
; }
209 const Vector3
& GetOffset() const { return m_Offset
; }
211 list
<traverse
>::const_iterator
212 traverses_begin(unsigned flags
, const SurveyFilter
* filter
) const {
213 if (flags
>= sizeof(traverses
)) return traverses
[0].end();
214 auto it
= traverses
[flags
].begin();
216 while (it
!= traverses
[flags
].end() &&
217 !filter
->CheckVisible(it
->name
)) {
224 list
<traverse
>::const_iterator
225 traverses_next(unsigned flags
, const SurveyFilter
* filter
,
226 list
<traverse
>::const_iterator it
) const {
229 while (it
!= traverses
[flags
].end() &&
230 !filter
->CheckVisible(it
->name
)) {
237 list
<traverse
>::const_iterator
traverses_end(unsigned flags
) const {
238 if (flags
>= sizeof(traverses
)) flags
= 0;
239 return traverses
[flags
].end();
242 list
<vector
<XSect
>>::const_iterator
tubes_begin() const {
244 return tubes
.begin();
247 list
<vector
<XSect
>>::const_iterator
tubes_end() const {
251 list
<vector
<XSect
>>::iterator
tubes_begin() {
253 return tubes
.begin();
256 list
<vector
<XSect
>>::iterator
tubes_end() {
260 list
<LabelInfo
*>::const_iterator
GetLabels() const {
261 return m_Labels
.begin();
264 list
<LabelInfo
*>::const_iterator
GetLabelsEnd() const {
265 return m_Labels
.end();
268 list
<LabelInfo
*>::const_reverse_iterator
GetRevLabels() const {
269 return m_Labels
.rbegin();
272 list
<LabelInfo
*>::const_reverse_iterator
GetRevLabelsEnd() const {
273 return m_Labels
.rend();
276 list
<LabelInfo
*>::iterator
GetLabelsNC() {
277 return m_Labels
.begin();
280 list
<LabelInfo
*>::iterator
GetLabelsNCEnd() {
281 return m_Labels
.end();
284 void prepare_tubes() const {
285 if (!m_TubesPrepared
) {
287 m_TubesPrepared
= true;