[ci] Restore macos builds
[survex.git] / src / model.h
blob9cb3cbb997b17444f9c1a8d950140a6128acb057
1 //
2 // model.h
3 //
4 // Cave survey model.
5 //
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
8 //
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
24 #ifndef model_h
25 #define model_h
27 #include "wx.h"
29 #include "labelinfo.h"
30 #include "vector3.h"
32 #include <ctime>
33 #include <list>
34 #include <set>
35 #include <vector>
37 using namespace std;
39 class MainFrm;
41 class PointInfo : public Point {
42 int date;
44 public:
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; }
52 class XSect {
53 friend class MainFrm;
54 const LabelInfo* stn;
55 int date;
56 double l, r, u, d;
57 double right_bearing;
59 public:
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> {
85 public:
86 int n_legs = 0;
87 // Bitmask of img_FLAG_SURFACE, img_FLAG_SPLAY and img_FLAG_DUPLICATE.
88 int flags = 0;
89 // An img_STYLE_* value.
90 int style = 0;
91 double length = 0.0;
92 enum { ERROR_3D = 0, ERROR_H = 1, ERROR_V = 2 };
93 double errors[3] = {-1, -1, -1};
94 wxString name;
96 explicit
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);
104 if (name.empty()) {
105 // Or if that doesn't work (ConvCP1252 doesn't like
106 // strings with some bytes in) let's just go for
107 // ISO8859-1.
108 name = wxString(name_, wxConvISO8859_1);
114 class SurveyFilter {
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 = '.';
121 public:
122 SurveyFilter() {}
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;
137 /// Cave model.
138 class Model {
139 list<traverse> traverses[8];
140 mutable list<vector<XSect>> tubes;
142 public: // FIXME
143 list<LabelInfo*> m_Labels;
145 private:
146 Vector3 m_Ext;
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 '.')
162 wxChar m_separator;
164 wxString m_Title, m_cs_proj, m_DateStamp;
166 time_t m_DateStamp_numeric;
168 Vector3 m_Offset;
170 void do_prepare_tubes() const;
172 void CentreDataset(const Vector3& vmin);
174 public:
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();
215 if (filter) {
216 while (it != traverses[flags].end() &&
217 !filter->CheckVisible(it->name)) {
218 ++it;
221 return it;
224 list<traverse>::const_iterator
225 traverses_next(unsigned flags, const SurveyFilter* filter,
226 list<traverse>::const_iterator it) const {
227 ++it;
228 if (filter) {
229 while (it != traverses[flags].end() &&
230 !filter->CheckVisible(it->name)) {
231 ++it;
234 return it;
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 {
243 prepare_tubes();
244 return tubes.begin();
247 list<vector<XSect>>::const_iterator tubes_end() const {
248 return tubes.end();
251 list<vector<XSect>>::iterator tubes_begin() {
252 prepare_tubes();
253 return tubes.begin();
256 list<vector<XSect>>::iterator tubes_end() {
257 return 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) {
286 do_prepare_tubes();
287 m_TubesPrepared = true;
292 #endif