pygeodesy 25.11.5__py2.py3-none-any.whl → 25.12.31__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. pygeodesy/__init__.py +46 -25
  2. pygeodesy/__main__.py +1 -1
  3. pygeodesy/albers.py +1 -1
  4. pygeodesy/angles.py +960 -0
  5. pygeodesy/auxilats/_CX_4.py +1 -1
  6. pygeodesy/auxilats/_CX_6.py +1 -1
  7. pygeodesy/auxilats/_CX_8.py +1 -1
  8. pygeodesy/auxilats/_CX_Rs.py +1 -1
  9. pygeodesy/auxilats/__init__.py +2 -2
  10. pygeodesy/auxilats/__main__.py +1 -1
  11. pygeodesy/auxilats/auxAngle.py +7 -8
  12. pygeodesy/auxilats/auxDLat.py +1 -1
  13. pygeodesy/auxilats/auxDST.py +1 -1
  14. pygeodesy/auxilats/auxLat.py +1 -1
  15. pygeodesy/auxilats/auxily.py +1 -1
  16. pygeodesy/azimuthal.py +6 -5
  17. pygeodesy/basics.py +14 -10
  18. pygeodesy/booleans.py +1 -1
  19. pygeodesy/cartesianBase.py +7 -7
  20. pygeodesy/clipy.py +1 -1
  21. pygeodesy/constants.py +29 -24
  22. pygeodesy/css.py +1 -1
  23. pygeodesy/datums.py +1 -1
  24. pygeodesy/deprecated/__init__.py +1 -1
  25. pygeodesy/deprecated/bases.py +1 -1
  26. pygeodesy/deprecated/classes.py +14 -7
  27. pygeodesy/deprecated/consterns.py +1 -1
  28. pygeodesy/deprecated/datum.py +1 -1
  29. pygeodesy/deprecated/functions.py +1 -1
  30. pygeodesy/deprecated/nvector.py +1 -1
  31. pygeodesy/deprecated/rhumbBase.py +1 -1
  32. pygeodesy/deprecated/rhumbaux.py +1 -1
  33. pygeodesy/deprecated/rhumbsolve.py +1 -1
  34. pygeodesy/deprecated/rhumbx.py +1 -1
  35. pygeodesy/dms.py +1 -1
  36. pygeodesy/ecef.py +1 -1
  37. pygeodesy/ecefLocals.py +1 -1
  38. pygeodesy/elevations.py +1 -1
  39. pygeodesy/ellipsoidalBase.py +1 -1
  40. pygeodesy/ellipsoidalBaseDI.py +1 -1
  41. pygeodesy/ellipsoidalExact.py +1 -1
  42. pygeodesy/ellipsoidalGeodSolve.py +1 -1
  43. pygeodesy/ellipsoidalKarney.py +1 -1
  44. pygeodesy/ellipsoidalNvector.py +1 -1
  45. pygeodesy/ellipsoidalVincenty.py +1 -1
  46. pygeodesy/ellipsoids.py +30 -17
  47. pygeodesy/elliptic.py +1 -1
  48. pygeodesy/epsg.py +1 -1
  49. pygeodesy/errors.py +8 -4
  50. pygeodesy/etm.py +1 -1
  51. pygeodesy/fmath.py +19 -14
  52. pygeodesy/formy.py +251 -10
  53. pygeodesy/frechet.py +1 -1
  54. pygeodesy/fstats.py +1 -1
  55. pygeodesy/fsums.py +41 -29
  56. pygeodesy/gars.py +1 -1
  57. pygeodesy/geod3solve.py +489 -0
  58. pygeodesy/geodesici.py +9 -8
  59. pygeodesy/geodesicw.py +1 -1
  60. pygeodesy/geodesicx/_C4_24.py +1 -1
  61. pygeodesy/geodesicx/_C4_27.py +1 -1
  62. pygeodesy/geodesicx/_C4_30.py +1 -1
  63. pygeodesy/geodesicx/__init__.py +2 -2
  64. pygeodesy/geodesicx/__main__.py +1 -1
  65. pygeodesy/geodesicx/gx.py +1 -1
  66. pygeodesy/geodesicx/gxarea.py +54 -24
  67. pygeodesy/geodesicx/gxbases.py +1 -1
  68. pygeodesy/geodesicx/gxline.py +1 -1
  69. pygeodesy/geodsolve.py +73 -104
  70. pygeodesy/geohash.py +1 -1
  71. pygeodesy/geoids.py +1 -1
  72. pygeodesy/hausdorff.py +1 -1
  73. pygeodesy/heights.py +1 -1
  74. pygeodesy/internals.py +1 -1
  75. pygeodesy/interns.py +3 -3
  76. pygeodesy/iters.py +1 -1
  77. pygeodesy/karney.py +152 -151
  78. pygeodesy/ktm.py +1 -1
  79. pygeodesy/latlonBase.py +1 -1
  80. pygeodesy/lazily.py +24 -13
  81. pygeodesy/lcc.py +1 -1
  82. pygeodesy/ltp.py +1 -1
  83. pygeodesy/ltpTuples.py +1 -1
  84. pygeodesy/mgrs.py +3 -3
  85. pygeodesy/named.py +15 -10
  86. pygeodesy/namedTuples.py +1 -1
  87. pygeodesy/nvectorBase.py +1 -1
  88. pygeodesy/osgr.py +1 -1
  89. pygeodesy/points.py +1 -1
  90. pygeodesy/props.py +6 -4
  91. pygeodesy/resections.py +1 -1
  92. pygeodesy/rhumb/__init__.py +8 -6
  93. pygeodesy/rhumb/aux_.py +1 -1
  94. pygeodesy/rhumb/bases.py +1 -1
  95. pygeodesy/rhumb/ekx.py +1 -1
  96. pygeodesy/rhumb/solve.py +91 -84
  97. pygeodesy/simplify.py +1 -1
  98. pygeodesy/solveBase.py +72 -49
  99. pygeodesy/sphericalBase.py +1 -1
  100. pygeodesy/sphericalNvector.py +1 -1
  101. pygeodesy/sphericalTrigonometry.py +1 -1
  102. pygeodesy/streprs.py +6 -4
  103. pygeodesy/trf.py +2 -4
  104. pygeodesy/triaxials/__init__.py +70 -0
  105. pygeodesy/triaxials/bases.py +966 -0
  106. pygeodesy/triaxials/conformal3.py +617 -0
  107. pygeodesy/triaxials/triaxial3.py +968 -0
  108. pygeodesy/{triaxials.py → triaxials/triaxial5.py} +353 -781
  109. pygeodesy/units.py +1 -1
  110. pygeodesy/unitsBase.py +1 -1
  111. pygeodesy/ups.py +2 -3
  112. pygeodesy/utily.py +17 -14
  113. pygeodesy/utm.py +1 -1
  114. pygeodesy/utmups.py +1 -1
  115. pygeodesy/utmupsBase.py +1 -1
  116. pygeodesy/vector2d.py +1 -1
  117. pygeodesy/vector3d.py +1 -1
  118. pygeodesy/vector3dBase.py +1 -1
  119. pygeodesy/webmercator.py +1 -1
  120. pygeodesy/wgrs.py +1 -1
  121. {pygeodesy-25.11.5.dist-info → pygeodesy-25.12.31.dist-info}/METADATA +28 -21
  122. pygeodesy-25.12.31.dist-info/RECORD +125 -0
  123. pygeodesy-25.11.5.dist-info/RECORD +0 -119
  124. {pygeodesy-25.11.5.dist-info → pygeodesy-25.12.31.dist-info}/WHEEL +0 -0
  125. {pygeodesy-25.11.5.dist-info → pygeodesy-25.12.31.dist-info}/top_level.txt +0 -0
pygeodesy/solveBase.py CHANGED
@@ -23,7 +23,7 @@ from pygeodesy.units import Precision_
23
23
  from pygeodesy.utily import unroll180
24
24
 
25
25
  __all__ = _ALL_LAZY.solveBase
26
- __version__ = '25.09.02'
26
+ __version__ = '25.12.06'
27
27
 
28
28
  _ERROR_ = 'ERROR'
29
29
 
@@ -54,8 +54,8 @@ class _SolveCapsBase(_CapsBase):
54
54
  _invokat = _AT_
55
55
  _invokation = 0
56
56
  _linelimit = 0
57
- _prec = Precision_(prec=DIG)
58
- _prec2stdin = DIG
57
+ _prec = Precision_(prec=DIG) # -5 stdout
58
+ _prec2stdin = DIG - 1
59
59
  _Xable_name = NN # executable basename
60
60
  _Xable_path = NN # executable path
61
61
  _status = None
@@ -304,6 +304,11 @@ class _SolveCapsBase(_CapsBase):
304
304
  '''
305
305
  return self._status
306
306
 
307
+ def _toStdin(self, floats):
308
+ '''(INTERNAL) Convert C{floats} to strings.
309
+ '''
310
+ return strs(floats, prec=self._prec2stdin, fmt=Fmt.F) # not .G!
311
+
307
312
  @property
308
313
  def verbose(self):
309
314
  '''Get the C{verbose} option (C{bool}).
@@ -347,6 +352,17 @@ class _SolveBase(_SolveCapsBase):
347
352
  _update_all(self)
348
353
  self._reverse2 = reverse2
349
354
 
355
+ def toStr(self, prec=6, sep=_COMMASPACE_, **other): # PYCHOK signature
356
+ '''Return this instance as string.
357
+
358
+ @kwarg prec_sep: Keyword argumens C{B{prec}=6} and C{B{sep}=", "}
359
+ for the C{float} C{prec}ision, number of decimal digits
360
+ (0..9) and the C{sep}arator string to join. Trailing
361
+ zero decimals are stripped for B{C{prec}} values of 1
362
+ and above, but kept for negative B{C{prec}} values.
363
+ '''
364
+ return sep.join(pairs(other, prec=prec))
365
+
350
366
  @Property
351
367
  def unroll(self):
352
368
  '''Get the C{lon2} unroll'ing (C{bool}).
@@ -363,7 +379,51 @@ class _SolveBase(_SolveCapsBase):
363
379
  self._unroll = unroll
364
380
 
365
381
 
366
- class _SolveGDictBase(_SolveBase):
382
+ class _Solve3Base(_SolveBase):
383
+ '''(NTERNAL) Base class for C{_Geodesic[3]SolveBase}.
384
+ '''
385
+
386
+ @Property_RO
387
+ def _cmdDirect(self):
388
+ '''(INTERNAL) Get the C{[3]Solve} I{Direct} cmd (C{tuple}).
389
+ '''
390
+ return self._cmdBasic
391
+
392
+ @Property_RO
393
+ def _cmdInverse(self):
394
+ '''(INTERNAL) Get the C{[3]Solve} I{Inverse} cmd (C{tuple}).
395
+ '''
396
+ return self._cmdBasic + ('-i',)
397
+
398
+ def _GDictDirect(self, lat, lon, azi, arcmode, s12_a12, outmask=_UNUSED_, **floats): # PYCHOK for .geodesicx.gxarea
399
+ '''(INTERNAL) Get C{_GenDirect}-like result as C{GDict}.
400
+ '''
401
+ if arcmode:
402
+ raise self._Error(arcmode=arcmode, txt=str(NotImplemented))
403
+ return self._GDictInvoke(self._cmdDirect, self._Names_Direct,
404
+ lat, lon, azi, s12_a12, **floats)
405
+
406
+ def _GDictInverse(self, lat1, lon1, lat2, lon2, outmask=_UNUSED_, **floats): # PYCHOK for .geodesicx.gxarea
407
+ '''(INTERNAL) Get C{_GenInverse}-like result as C{GDict}, but I{without} C{_SALP_CALPs_}.
408
+ '''
409
+ return self._GDictInvoke(self._cmdInverse, self._Names_Inverse,
410
+ lat1, lon1, lat2, lon2, **floats)
411
+
412
+ def _GDictInvoke(self, cmd, Names, *args, **floats):
413
+ '''(INTERNAL) Invoke C{Solve}, return results as C{Dict}.
414
+ '''
415
+ return self._DictInvoke2(cmd, args, Names, GDict, **floats)[0] # _R
416
+
417
+ def toStr(self, **prec_sep_other): # PYCHOK signature
418
+ '''Return this instance as string.
419
+
420
+ @kwarg prec_sep: See L{toStr<pygeodesy.solveBase._SolveBase.toStr>}.
421
+ '''
422
+ return _SolveBase.toStr(self, invokation=self.invokation,
423
+ status=self.status, **prec_sep_other)
424
+
425
+
426
+ class _SolveGDictBase(_Solve3Base):
367
427
  '''(NTERNAL) Base class for C{_GeodesicSolveBase} and C{_RhumbSolveBase}.
368
428
  '''
369
429
 
@@ -392,42 +452,11 @@ class _SolveGDictBase(_SolveBase):
392
452
  '''
393
453
  return self._GDictDirect(lat1, lon1, azi1, True, a12)
394
454
 
395
- @Property_RO
396
- def _cmdDirect(self):
397
- '''(INTERNAL) Get the C{Solve} I{Direct} cmd (C{tuple}).
398
- '''
399
- return self._cmdBasic
400
-
401
- @Property_RO
402
- def _cmdInverse(self):
403
- '''(INTERNAL) Get the C{Solve} I{Inverse} cmd (C{tuple}).
404
- '''
405
- return self._cmdBasic + ('-i',)
406
-
407
455
  def Direct(self, lat1, lon1, azi1, s12, outmask=_UNUSED_): # PYCHOK unused
408
456
  '''Return the C{Direct} result at distance C{s12}.
409
457
  '''
410
458
  return self._GDictDirect(lat1, lon1, azi1, False, s12)
411
459
 
412
- def _GDictDirect(self, lat, lon, azi, arcmode, s12_a12, outmask=_UNUSED_, **floats): # PYCHOK for .geodesicx.gxarea
413
- '''(INTERNAL) Get C{_GenDirect}-like result as C{GDict}.
414
- '''
415
- if arcmode:
416
- raise self._Error(arcmode=arcmode, txt=str(NotImplemented))
417
- return self._GDictInvoke(self._cmdDirect, self._Names_Direct,
418
- lat, lon, azi, s12_a12, **floats)
419
-
420
- def _GDictInverse(self, lat1, lon1, lat2, lon2, outmask=_UNUSED_, **floats): # PYCHOK for .geodesicx.gxarea
421
- '''(INTERNAL) Get C{_GenInverse}-like result as C{GDict}, but I{without} C{_SALP_CALPs_}.
422
- '''
423
- return self._GDictInvoke(self._cmdInverse, self._Names_Inverse,
424
- lat1, lon1, lat2, lon2, **floats)
425
-
426
- def _GDictInvoke(self, cmd, Names, *args, **floats):
427
- '''(INTERNAL) Invoke C{Solve}, return results as C{Dict}.
428
- '''
429
- return self._DictInvoke2(cmd, args, Names, GDict, **floats)[0] # _R
430
-
431
460
  def Inverse(self, lat1, lon1, lat2, lon2, outmask=_UNUSED_): # PYCHOK unused
432
461
  '''Return the C{Inverse} result.
433
462
  '''
@@ -443,12 +472,10 @@ class _SolveGDictBase(_SolveBase):
443
472
  # XXX self.DISTANCE needed for 'a12'?
444
473
  return abs(float(r.a12))
445
474
 
446
- def _toStr(self, prec=6, sep=_COMMASPACE_, **Solve): # PYCHOK signature
447
- '''(INTERNAL) Return this C{_Solve} as string..
475
+ def toStr(self, **prec_sep_other): # PYCHOK signature
476
+ '''Return this C{_Solve} as string.
448
477
  '''
449
- d = dict(ellipsoid=self.ellipsoid, invokation=self.invokation,
450
- status=self.status, **Solve)
451
- return sep.join(pairs(d, prec=prec))
478
+ return _Solve3Base.toStr(self, ellipsoid=self.ellipsoid, **prec_sep_other)
452
479
 
453
480
 
454
481
  class _SolveGDictLineBase(_SolveGDictBase):
@@ -476,8 +503,7 @@ class _SolveGDictLineBase(_SolveGDictBase):
476
503
  _, azi = _xkwds_item2(azi)
477
504
  return lat1, lon1, azi
478
505
 
479
- t = strs(_lla3(**self._lla1), prec=DIG, fmt=Fmt.F) # self._solve.prec
480
- return self._cmdBasic + ('-L',) + t
506
+ return self._cmdBasic + ('-L',) + self._toStdin(_lla3(**self._lla1))
481
507
 
482
508
  @property_RO
483
509
  def datum(self):
@@ -503,20 +529,17 @@ class _SolveGDictLineBase(_SolveGDictBase):
503
529
  '''
504
530
  return self._lla1.lon1
505
531
 
506
- def _toStr(self, prec=6, sep=_COMMASPACE_, **solve): # PYCHOK signature
507
- '''(INTERNAL) Return this C{_LineSolve} as string..
532
+ def toStr(self, **prec_sep_other): # PYCHOK signature
533
+ '''Return this C{_LineSolve} as string.
508
534
  '''
509
- d = dict(ellipsoid=self.ellipsoid, invokation=self._solve.invokation,
510
- lat1=self.lat1, lon1=self.lon1,
511
- status=self._solve.status, **solve)
512
- return sep.join(pairs(d, prec=prec))
535
+ return _Solve3Base.toStr(self, **prec_sep_other)
513
536
 
514
537
 
515
538
  __all__ += _ALL_DOCS(_SolveBase, _SolveCapsBase, _SolveGDictBase, _SolveGDictLineBase)
516
539
 
517
540
  # **) MIT License
518
541
  #
519
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
542
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
520
543
  #
521
544
  # Permission is hereby granted, free of charge, to any person obtaining a
522
545
  # copy of this software and associated documentation files (the "Software"),
@@ -701,7 +701,7 @@ __all__ += _ALL_DOCS(CartesianSphericalBase, LatLonSphericalBase)
701
701
 
702
702
  # **) MIT License
703
703
  #
704
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
704
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
705
705
  #
706
706
  # Permission is hereby granted, free of charge, to any person obtaining a
707
707
  # copy of this software and associated documentation files (the "Software"),
@@ -1205,7 +1205,7 @@ __all__ += _ALL_OTHER(Cartesian, LatLon, Nvector, # classes
1205
1205
 
1206
1206
  # **) MIT License
1207
1207
  #
1208
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1208
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1209
1209
  #
1210
1210
  # Permission is hereby granted, free of charge, to any person obtaining a
1211
1211
  # copy of this software and associated documentation files (the "Software"),
@@ -1411,7 +1411,7 @@ __all__ += _ALL_OTHER(Cartesian, LatLon, # classes
1411
1411
 
1412
1412
  # **) MIT License
1413
1413
  #
1414
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1414
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1415
1415
  #
1416
1416
  # Permission is hereby granted, free of charge, to any person obtaining a
1417
1417
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/streprs.py CHANGED
@@ -22,7 +22,7 @@ from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS
22
22
  from math import fabs, log10 as _log10
23
23
 
24
24
  __all__ = _ALL_LAZY.streprs
25
- __version__ = '25.10.10'
25
+ __version__ = '25.11.24'
26
26
 
27
27
  _at_ = 'at' # PYCHOK used!
28
28
  _EN_PREC = 6 # max MGRS/OSGR precision, 1 micrometer
@@ -321,9 +321,11 @@ def fstr(floats, prec=6, fmt=Fmt.F, ints=False, sep=_COMMASPACE_, strepr=None, f
321
321
  C{strs((floats,), ...)} (C{str}) if B{C{floats}} is C{scalar}.
322
322
  '''
323
323
  if isscalar(floats): # see Fstr.__call__ above
324
- return next(_streprs(prec, (floats,), fmt, ints, force, strepr))
324
+ t = next(_streprs(prec, (floats,), fmt, ints, force, strepr))
325
325
  else:
326
- return sep.join(_streprs(prec, floats, fmt, ints, force, strepr))
326
+ t = _streprs(prec, floats, fmt, ints, force, strepr)
327
+ t = sep.join(t) if sep else tuple(t)
328
+ return t
327
329
 
328
330
 
329
331
  def _fstrENH2(inst, prec, m, fmt=Fmt.F): # in .css, .lcc, .utmupsBase
@@ -605,7 +607,7 @@ def _xzipairs(names, values, sep=_COMMASPACE_, fmt=NN, pair_fmt=Fmt.COLON):
605
607
 
606
608
  # **) MIT License
607
609
  #
608
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
610
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
609
611
  #
610
612
  # Permission is hereby granted, free of charge, to any person obtaining a
611
613
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/trf.py CHANGED
@@ -1,9 +1,7 @@
1
1
 
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
- u'''I{Veness}' Terrestrial Reference Frames (TRF).
5
-
6
- Classes L{RefFrame}, registry L{RefFrames} and L{TRFError}.
4
+ u'''I{Veness}' Terrestrial Reference Frames (TRF), classes L{RefFrame}, registry L{RefFrames} and L{TRFError}.
7
5
 
8
6
  Transcoded from I{Chris Veness'} (C) 2006-2024 JavaScript originals U{latlon-ellipsoidal-referenceframe.js
9
7
  <https://GitHub.com/ChrisVeness/geodesy/blob/master/latlon-ellipsoidal-referenceframe.js>} and
@@ -1786,7 +1784,7 @@ if __name__ == _DMAIN_:
1786
1784
 
1787
1785
  # **) MIT License
1788
1786
  #
1789
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1787
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1790
1788
  #
1791
1789
  # Permission is hereby granted, free of charge, to any person obtaining a
1792
1790
  # copy of this software and associated documentation files (the "Software"),
@@ -0,0 +1,70 @@
1
+
2
+ # -*- coding: utf-8 -*-
3
+
4
+ u'''Package of lazily imported modules L{triaxials.conformal3}, L{triaxials.triaxial3}
5
+ and L{triaxials.triaxial5} for triaxial ellipsoids.
6
+
7
+ Mostly transcoded to pure Python from I{Karney}'s U{GeographicLib 2.7 Triaxial<https://
8
+ GeographicLib.SourceForge.io/C++/doc/namespaceGeographicLib_1_1Triaxial.html} classes
9
+ and the I{experimental} U{GeographicLib 2.52 Jacobi<https://GeographicLib.SourceForge.io/
10
+ C++/2.5.2/jacobi.html>} class.
11
+
12
+ Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2024, 2024-2025) and
13
+ licensed under the MIT/X11 License. For more information, see the U{GeographicLib 2.5.2
14
+ and 2.7<https://GeographicLib.SourceForge.io>} documentation.
15
+ '''
16
+ from pygeodesy.lazily import _ALL_LAZY, _ALL_OTHER, _lazy_import_as, _unLazy0
17
+ # from pygeodesy.triaxials.triaxial5 import * # PYCHOK for backward compatibility
18
+ # from pygeodesy.triaxials.bases import TriaxialError # likewise
19
+
20
+ __all__ = _ALL_LAZY.triaxials # _triaxial5 # likewise
21
+ __version__ = '25.12.04'
22
+
23
+ if _unLazy0: # or _isfrozen
24
+ from pygeodesy.triaxials.bases import LLK, TriaxialError
25
+ from pygeodesy.triaxials.conformal3 import BetOmgGam5Tuple, Conformal3, Conformal3B, \
26
+ Conformal3Sphere, Conformal5Tuple
27
+ from pygeodesy.triaxials.triaxial3 import BetOmgAlp5Tuple, Cartesian5Tuple, PhiLamZet5Tuple, \
28
+ Triaxial3, Triaxial3B, Triaxial3s
29
+ from pygeodesy.triaxials.triaxial5 import BetaOmega2Tuple, BetaOmega3Tuple, \
30
+ Conformal, ConformalSphere, Conformal2Tuple, \
31
+ Triaxial, Triaxial_, Triaxials, \
32
+ hartzell4, height4
33
+
34
+ __all__ += _ALL_OTHER(LLK, TriaxialError,
35
+ BetOmgGam5Tuple, Conformal3, Conformal3B, ConformalSphere,
36
+ Conformal5Tuple,
37
+ BetOmgAlp5Tuple, Cartesian5Tuple, PhiLamZet5Tuple,
38
+ Triaxial3, Triaxial3B, Triaxial3s,
39
+ BetaOmega2Tuple, BetaOmega3Tuple,
40
+ Conformal, Conformal3Sphere, Conformal2Tuple, Triaxial,
41
+ Triaxial_, Triaxials, hartzell4, height4)
42
+ # assert set(_ALL_LAZY.triaxials + _ALL_LAZY.triaxials_bases
43
+ # + _ALL_LAZY.triaxials_conformal3
44
+ # + _ALL_LAZY.triaxials_triaxial3
45
+ # + _ALL_LAZY.triaxials_triaxial5) == set(__all__)
46
+
47
+ else: # lazily import modules and exported attrs
48
+ __getattr__ = _lazy_import_as(__name__)
49
+
50
+ # **) MIT License
51
+ #
52
+ # Copyright (C) 2025-2026 -- mrJean1 at Gmail -- All Rights Reserved.
53
+ #
54
+ # Permission is hereby granted, free of charge, to any person obtaining a
55
+ # copy of this software and associated documentation files (the "Software"),
56
+ # to deal in the Software without restriction, including without limitation
57
+ # the rights to use, copy, modify, merge, publish, distribute, sublicense,
58
+ # and/or sell copies of the Software, and to permit persons to whom the
59
+ # Software is furnished to do so, subject to the following conditions:
60
+ #
61
+ # The above copyright notice and this permission notice shall be included
62
+ # in all copies or substantial portions of the Software.
63
+ #
64
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
65
+ # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
66
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
67
+ # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
68
+ # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
69
+ # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
70
+ # OTHER DEALINGS IN THE SOFTWARE.