source: git/src/cavern.h @ 8d74d05

stereo-2025
Last change on this file since 8d74d05 was c77682a, checked in by Olly Betts <olly@…>, 4 months ago

Stop reporting node stats

These are kind of interesting, but since the advent of surveying with
Disto-X and similar devices which make it quick to shoot multiple
splay legs from each station the number of larger order nodes has
increased and this information is now quite verbose and any utility
it had has substantially declined.

If they're still wanted they could make a reappearance in the future in
aven, with splays excluded when counting the number of legs at each
station.

Fixes #86, reported by Wookey.

  • Property mode set to 100644
File size: 16.1 KB
Line 
1/* cavern.h
2 * SURVEX Cave surveying software - header file
3 * Copyright (C) 1991-2024 Olly Betts
4 * Copyright (C) 2004 Simeon Warner
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
19 */
20
21#ifndef CAVERN_H
22#define CAVERN_H
23
24/* Using covariances increases the memory required somewhat - may be
25 * desirable to disable this for small memory machines */
26
27/* #define NO_COVARIANCES 1 */
28
29#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32#include <ctype.h>
33#include <math.h>
34#include <float.h>
35
36#include <proj.h>
37
38#include "img_hosted.h"
39#include "str.h"
40#include "useful.h"
41
42typedef double real; /* so we can change the precision used easily */
43#define HUGE_REAL HUGE_VAL
44#define REAL_EPSILON DBL_EPSILON
45
46#define WGS84_DATUM_STRING "EPSG:4326"
47
48#define SPECIAL_EOL             0x0001
49#define SPECIAL_BLANK           0x0002
50#define SPECIAL_KEYWORD         0x0004
51#define SPECIAL_COMMENT         0x0008
52#define SPECIAL_OMIT            0x0010
53#ifndef NO_DEPRECATED
54#define SPECIAL_ROOT            0x0020
55#endif
56#define SPECIAL_SEPARATOR       0x0040
57#define SPECIAL_NAMES           0x0080
58#define SPECIAL_DECIMAL         0x0100
59#define SPECIAL_MINUS           0x0200
60#define SPECIAL_PLUS            0x0400
61#define SPECIAL_OPEN            0x0800
62#define SPECIAL_CLOSE           0x1000
63
64extern char *fnm_output_base;
65extern int fnm_output_base_is_dir;
66
67extern bool fExportUsed;
68
69extern int current_days_since_1900;
70
71/* Types */
72
73typedef enum {
74   Q_NULL = -1, Q_DEFAULT, Q_POS, Q_PLUMB, Q_LEVEL,
75   Q_GRADIENT, Q_BACKGRADIENT, Q_BEARING, Q_BACKBEARING,
76   Q_LENGTH, Q_BACKLENGTH, Q_DEPTH, Q_DX, Q_DY, Q_DZ, Q_COUNT, Q_DECLINATION,
77   Q_LEFT, Q_RIGHT, Q_UP, Q_DOWN,
78   Q_MAC
79} q_quantity;
80
81typedef enum {
82   INFER_NULL = -1,
83   INFER_EQUATES,
84   INFER_EXPORTS,
85   INFER_PLUMBS,
86   INFER_SUBSURVEYS,
87   /* In Compass DAT files a dummy zero-length leg from a station to itself is
88    * used to provide a place to specify LRUD for the start or end of a
89    * traverse (depending if dimensions are measured at the from or to
90    * station), so we shouldn't warn about equating a station to itself.
91    * This should be set *as well as* INFER_EQUATES.
92    */
93   INFER_EQUATES_SELF_OK
94} infer_what;
95
96/* unsigned long to cope with 16-bit int-s */
97#define BIT(N) (1UL << (N))
98#define BITA(N) (1UL << ((N) - 'a'))
99
100#define TSTBIT(W, N) (((W)>>(N))&1)
101
102/* masks for quantities which are length and angles respectively */
103#define LEN_QMASK (BIT(Q_LENGTH) | BIT(Q_BACKLENGTH) | BIT(Q_DEPTH) |\
104   BIT(Q_DX) | BIT(Q_DY) | BIT(Q_DZ) | BIT(Q_POS) | BIT(Q_COUNT) |\
105   BIT(Q_LEFT) | BIT(Q_RIGHT) | BIT(Q_UP) | BIT(Q_DOWN))
106#define ANG_QMASK (BIT(Q_BEARING) | BIT(Q_BACKBEARING) |\
107   BIT(Q_GRADIENT) | BIT(Q_BACKGRADIENT) | BIT(Q_PLUMB) | BIT(Q_LEVEL) |\
108   BIT(Q_DECLINATION))
109
110/* if you add/change the order, check factor_tab in commands.c */
111typedef enum {
112   UNITS_NULL = -1, UNITS_METRES, UNITS_FEET, UNITS_YARDS,
113   UNITS_DEGS, UNITS_QUADRANTS, UNITS_GRADS, UNITS_PERCENT, UNITS_MINUTES,
114   UNITS_MAC, UNITS_DEPRECATED_ALIAS_FOR_GRADS
115} u_units;
116
117/* don't reorder these values!  They need to match with img.h too */
118typedef enum {
119   FLAGS_NOT = -2, FLAGS_UNKNOWN = -1, FLAGS_SURFACE, FLAGS_DUPLICATE,
120   FLAGS_SPLAY,
121#if 0
122   /* underground, but through rock (e.g. radiolocation).  Want to hide from
123    * plots by default (so not cave) but don't want to include in surface
124    * triangulation nets (so not surface) */
125   FLAGS_SKELETAL, /* FIXME */
126#endif
127   /* Don't need to match img.h: */
128   FLAGS_ANON_ONE_END,
129   FLAGS_IMPLICIT_SPLAY,
130   FLAGS_STYLE_BIT0, FLAGS_STYLE_BIT1, FLAGS_STYLE_BIT2
131} flags;
132
133/* flags are currently stored in an unsigned char */
134typedef int compiletimeassert_flags0[FLAGS_STYLE_BIT2 <= 7 ? 1 : -1];
135
136/* Mask to AND with to get bits to pass to img library. */
137#define FLAGS_MASK \
138    (BIT(FLAGS_SURFACE) | BIT(FLAGS_DUPLICATE) | BIT(FLAGS_SPLAY))
139
140typedef int compiletimeassert_flags1[BIT(FLAGS_SURFACE) == img_FLAG_SURFACE ? 1 : -1];
141typedef int compiletimeassert_flags2[BIT(FLAGS_DUPLICATE) == img_FLAG_DUPLICATE ? 1 : -1];
142typedef int compiletimeassert_flags3[BIT(FLAGS_SPLAY) == img_FLAG_SPLAY ? 1 : -1];
143
144typedef enum {
145   /* Don't reorder these values!  They need to match with img.h too. */
146   SFLAGS_SURFACE = 0, SFLAGS_UNDERGROUND, SFLAGS_ENTRANCE, SFLAGS_EXPORTED,
147   SFLAGS_FIXED, SFLAGS_ANON, SFLAGS_WALL,
148   /* These values don't need to match img.h, but mustn't clash. */
149   SFLAGS_HANGING = 9,
150   SFLAGS_UNUSED_FIXED_POINT = 10,
151   SFLAGS_SOLVED = 11,
152   SFLAGS_SUSPECTTYPO = 12,
153   SFLAGS_SURVEY = 13,
154   SFLAGS_PREFIX_ENTERED = 14,
155   // If set, use ident.i; if unset, use ident.p
156   SFLAGS_IDENT_INLINE = 15
157} sflags;
158
159/* Mask to AND with to get bits to pass to img library. */
160#define SFLAGS_MASK (BIT(SFLAGS_SURFACE) | BIT(SFLAGS_UNDERGROUND) |\
161        BIT(SFLAGS_ENTRANCE) | BIT(SFLAGS_EXPORTED) | BIT(SFLAGS_FIXED) |\
162        BIT(SFLAGS_ANON) | BIT(SFLAGS_WALL))
163
164typedef int compiletimeassert_sflags1[BIT(SFLAGS_SURFACE) == img_SFLAG_SURFACE ? 1 : -1];
165typedef int compiletimeassert_sflags2[BIT(SFLAGS_UNDERGROUND) == img_SFLAG_UNDERGROUND ? 1 : -1];
166typedef int compiletimeassert_sflags3[BIT(SFLAGS_ENTRANCE) == img_SFLAG_ENTRANCE ? 1 : -1];
167typedef int compiletimeassert_sflags4[BIT(SFLAGS_EXPORTED) == img_SFLAG_EXPORTED ? 1 : -1];
168typedef int compiletimeassert_sflags5[BIT(SFLAGS_FIXED) == img_SFLAG_FIXED ? 1 : -1];
169typedef int compiletimeassert_sflags6[BIT(SFLAGS_ANON) == img_SFLAG_ANON ? 1 : -1];
170typedef int compiletimeassert_sflags7[BIT(SFLAGS_WALL) == img_SFLAG_WALL ? 1 : -1];
171
172/* enumeration of field types */
173typedef enum {
174   End = 0, Tape, Comp, Clino, BackTape, BackComp, BackClino,
175   Left, Right, Up, Down,
176   FrDepth, ToDepth, Dx, Dy, Dz, FrCount, ToCount,
177   /* Up to here are readings are allowed multiple values
178    * and have slot in the value[] array in datain.c.
179    * (Depth, DepthChange, and Count can have multiple
180    * readings, but are actually handled using tokens
181    * above rather than as themselves).
182    *
183    * Fr must be the first reading after this comment!
184    */
185   Fr, To, Station, Depth, DepthChange, Count, Dir,
186   Newline, IgnoreAllAndNewLine, Ignore, IgnoreAll,
187   /* IgnoreAll must be the last reading before this comment!
188    *
189    * Readings after this comment are only used in datain.c
190    * so can have enum values >= 32 because we only use a
191    * bitmask for those readings used in commands.c.
192    */
193   CompassDATFr, CompassDATTo,
194   CompassDATComp, CompassDATClino, CompassDATBackComp, CompassDATBackClino,
195   CompassDATLeft, CompassDATRight, CompassDATUp, CompassDATDown,
196   CompassDATFlags,
197
198   WallsSRVFr, WallsSRVTo, WallsSRVTape, WallsSRVComp, WallsSRVClino,
199   // Optional pair of readings giving heights above stations on CT surveys.
200   WallsSRVHeights,
201   // Optional delimited LRUD and variance overrides.
202   WallsSRVExtras
203} reading;
204
205/* if IgnoreAll is >= 32, the compiler will choke on this */
206typedef char compiletimeassert_reading[IgnoreAll < 32 ? 1 : -1];
207
208/* position or length vector */
209typedef real delta[3];
210
211/* variance */
212#ifdef NO_COVARIANCES
213typedef real var[3];
214typedef var svar;
215#else
216typedef real var[3][3];
217typedef real svar[6];
218#endif
219
220/* station name */
221typedef struct Prefix {
222   struct Prefix *up, *down, *right;
223   struct Node *stn;
224   struct Pos *pos;
225   union {
226       const char *p;
227       char i[sizeof(const char*)];
228   } ident;
229   // A filename:line where this name was used.  If it's a station used in *fix
230   // then this will be the location of such a *fix, otherwise if it's a
231   // station used in *equate then it's the location of such a *equate.
232   // Otherwise it's the first place it was used.
233   const char *filename;
234   unsigned int line;
235   /* If (min_export == 0) then max_export is max # levels above is this
236    * prefix is used (and so needs to be exported) (0 == parent only).
237    * If (min_export > 0) then max_export is max # levels above this
238    * prefix has been exported, and min_export is how far down the exports
239    * have got (if min_export > 1 after a run, this prefix hasn't been
240    * exported from below enough).
241    * If INFER_EXPORTS is active when a station is encountered, we
242    * set min_export = USHRT_MAX and max_export gets set as usual.  Then at
243    * the end of the run, we also mark stations with min_export == USHRT_MAX
244    * and max_export > 0 as exported. */
245   unsigned short max_export, min_export;
246   /* stn flags - e.g. surface, underground, entrance
247    * also suspecttypo and survey */
248   unsigned short sflags;
249} prefix;
250
251static inline const char *prefix_ident(const prefix *p) {
252    return TSTBIT(p->sflags, SFLAGS_IDENT_INLINE) ? p->ident.i : p->ident.p;
253}
254
255/* survey metadata */
256typedef struct Meta_data {
257    size_t ref_count;
258    /* Days since 1900 for start and end date of survey, or -1 if undated. */
259    int days1, days2;
260} meta_data;
261
262/* stuff stored for both forward & reverse legs */
263typedef struct {
264   struct Node *to;
265   /* bits 0..1 = reverse leg number; bit7 is fFullLeg */
266   /* bit6 = fReplacementLeg (by reduction rules) */
267   /* bit5 = articulation leg (i.e. carries no error) */
268   unsigned char reverse;
269   /* flags - e.g. surface, duplicate survey
270    * only used if (FLAG_DATAHERE & !(FLAG_REPLACEMENTLEG|FLAG_FAKE))
271    * This could be only in linkfor, but this is actually more space
272    * efficient.
273    */
274   unsigned char flags;
275} linkcommon;
276
277#define FLAG_DATAHERE 0x80
278#define FLAG_REPLACEMENTLEG 0x40
279#define FLAG_ARTICULATION 0x20
280#define FLAG_FAKE 0x10 /* an equate or leg inside an sdfix */
281#define MASK_REVERSEDIRN 0x03
282
283/* forward leg - deltas & vars stored here */
284typedef struct Link {
285   linkcommon l;
286   delta d; /* Delta */
287   svar v; /* Variances */
288   meta_data *meta;
289} linkfor;
290
291/* node - like a station, except several nodes are used to represent a
292 * station with more than 3 legs connected to it
293 */
294typedef struct Node {
295   struct Prefix *name;
296   struct Link *leg[3];
297   struct Node *prev, *next;
298   // Used in netartic.c to identify unconnected components and articulation
299   // points within components.
300   //
301   // Used in matrix.c to record the matrix row corresponding to this node
302   // or -1 for nodes already fixed (more than one node may map to the same
303   // row).
304   long colour;
305} node;
306
307/* station position */
308typedef struct Pos {
309   // Easting, Northing, Altitude.
310   real p[3];
311} pos;
312
313/*
314typedef struct Inst {
315   real zero, scale, units;
316} inst;
317*/
318
319/* Survey data styles */
320#define STYLE_NORMAL     0
321#define STYLE_DIVING     1
322#define STYLE_CARTESIAN  2
323#define STYLE_CYLPOLAR   3
324#define STYLE_NOSURVEY   4
325#define STYLE_PASSAGE    5
326#define STYLE_IGNORE     6
327
328typedef int compiletimeassert_style1[STYLE_NORMAL == img_STYLE_NORMAL ? 1 : -1];
329typedef int compiletimeassert_style2[STYLE_DIVING == img_STYLE_DIVING ? 1 : -1];
330typedef int compiletimeassert_style3[STYLE_CARTESIAN == img_STYLE_CARTESIAN ? 1 : -1];
331typedef int compiletimeassert_style4[STYLE_CYLPOLAR == img_STYLE_CYLPOLAR ? 1 : -1];
332typedef int compiletimeassert_style5[STYLE_NOSURVEY == img_STYLE_NOSURVEY ? 1 : -1];
333
334/* various settings preserved by *BEGIN and *END */
335typedef struct Settings {
336   struct Settings *next;
337   unsigned int Truncate;
338   bool f_clino_percent;
339   bool f_backclino_percent;
340   bool f_bearing_quadrants;
341   bool f_backbearing_quadrants;
342   bool dash_for_anon_wall_station;
343   bool from_equals_to_is_only_a_warning;
344   unsigned char infer;
345   enum {OFF, LOWER, UPPER} Case;
346   /* STYLE_xxx value to process data as. */
347   int style;
348   /* STYLE_xxx value to put in 3d file (different for Compass DAT diving
349    * data, as the data in the DAT file is always presented in the format
350    * tape,compass,clino even if that isn't how it was really measured).
351    */
352   int recorded_style;
353   prefix *Prefix;
354   prefix *begin_survey; /* used to check BEGIN and END match */
355   short *Translate; /* if short is >= 16 bits, which ANSI requires */
356   real Var[Q_MAC];
357   real z[Q_MAC];
358   real sc[Q_MAC];
359   real units[Q_MAC];
360   const reading *ordering;
361   long begin_lpos; /* File offset for start of BEGIN line */
362   int begin_lineno; /* 0 means no block started in this file */
363   int begin_col; /* Column of prefix in BEGIN line (or 0 if none) */
364   int flags;
365   char* proj_str;
366   /* Location at which we calculate the declination if
367    * z[Q_DECLINATION] == HUGE_REAL.
368    *
369    * Latitude and longitude are in radians; altitude is in metres above the
370    * ellipsoid.
371    */
372   real dec_lat, dec_lon, dec_alt;
373   /* Cached auto-declination in radians, or HUGE_REAL for no cached value.
374    * Only meaningful if days1 != -1.
375    */
376   real declination;
377   double min_declination, max_declination;
378   int min_declination_days, max_declination_days;
379   const char* dec_filename;
380   int dec_line;
381   /* Copy of the text of the `*declination auto ...` line (malloced). */
382   char* dec_context;
383   /* Grid convergence in radians. */
384   real convergence;
385   /* Input grid convergence in radians. */
386   real input_convergence;
387   /* Rotation from North for `*data cartesian`. */
388   real cartesian_rotation;
389   /* Which North to use for `*data cartesian`. */
390   enum { TRUE_NORTH, GRID_NORTH, MAGNETIC_NORTH } cartesian_north;
391   meta_data * meta;
392} settings;
393
394/* global variables */
395extern settings *pcs;
396extern prefix *root;
397extern prefix *anon_list;
398extern node *fixedlist;
399extern node *stnlist;
400extern unsigned long optimize;
401extern char * proj_str_out;
402extern PJ * pj_cached;
403
404extern string survey_title;
405
406extern bool fExplicitTitle;
407extern long cLegs, cStns, cComponents, cSolves;
408extern FILE *fhErrStat;
409extern img *pimg;
410extern real totadj, total, totplan, totvert;
411extern real min[9], max[9];
412extern prefix *pfxHi[9], *pfxLo[9];
413extern bool fQuiet; /* just show brief summary + errors */
414extern bool fMute; /* just show errors */
415extern bool fSuppress; /* only output 3d file */
416
417/* macros */
418
419#define POS(S, D) ((S)->name->pos->p[(D)])
420#define POSD(S) ((S)->name->pos->p)
421
422#define data_here(L) ((L)->l.reverse & FLAG_DATAHERE)
423#define reverse_leg_dirn(L) ((L)->l.reverse & MASK_REVERSEDIRN)
424#define reverse_leg(L) ((L)->l.to->leg[reverse_leg_dirn(L)])
425
426/* if p[0]==UNFIXED_VAL, station is unfixed */
427#define UNFIXED_VAL HUGE_VAL
428#define pfx_fixed(N) ((N)->pos->p[0] != UNFIXED_VAL)
429#define pos_fixed(P) ((P)->p[0] != UNFIXED_VAL)
430#define unfix(S) POS((S), 0) = UNFIXED_VAL
431#define fixed(S) pfx_fixed((S)->name)
432
433/* macros for special chars */
434
435#define isEol(c)    (pcs->Translate[(c)] & SPECIAL_EOL)
436#define isBlank(c)  (pcs->Translate[(c)] & SPECIAL_BLANK)
437#define isKeywd(c)  (pcs->Translate[(c)] & SPECIAL_KEYWORD)
438#define isComm(c)   (pcs->Translate[(c)] & SPECIAL_COMMENT)
439#define isOmit(c)   (pcs->Translate[(c)] & SPECIAL_OMIT)
440#ifndef NO_DEPRECATED
441#define isRoot(c)   (pcs->Translate[(c)] & SPECIAL_ROOT)
442#endif
443#define isSep(c)    (pcs->Translate[(c)] & SPECIAL_SEPARATOR)
444#define isNames(c)  (pcs->Translate[(c)] & SPECIAL_NAMES)
445#define isDecimal(c) (pcs->Translate[(c)] & SPECIAL_DECIMAL)
446#define isMinus(c)  (pcs->Translate[(c)] & SPECIAL_MINUS)
447#define isPlus(c)   (pcs->Translate[(c)] & SPECIAL_PLUS)
448#define isOpen(c)   (pcs->Translate[(c)] & SPECIAL_OPEN)
449#define isClose(c)  (pcs->Translate[(c)] & SPECIAL_CLOSE)
450
451#define isSign(c)   (pcs->Translate[(c)] & (SPECIAL_PLUS | SPECIAL_MINUS))
452#define isData(c)   (pcs->Translate[(c)] & (SPECIAL_OMIT | SPECIAL_ROOT|\
453   SPECIAL_SEPARATOR | SPECIAL_NAMES | SPECIAL_DECIMAL | SPECIAL_PLUS |\
454   SPECIAL_MINUS))
455
456typedef struct nosurveylink {
457   node *fr, *to;
458   int flags;
459   meta_data *meta;
460   struct nosurveylink *next;
461} nosurveylink;
462
463extern nosurveylink *nosurveyhead;
464
465typedef struct lrud {
466    struct lrud * next;
467    prefix *stn;
468    meta_data *meta;
469    real l, r, u, d;
470} lrud;
471
472typedef struct lrudlist {
473    lrud * tube;
474    struct lrudlist * next;
475} lrudlist;
476
477extern lrudlist * model;
478
479extern lrud ** next_lrud;
480
481extern char output_separator;
482
483#endif /* CAVERN_H */
Note: See TracBrowser for help on using the repository browser.