ccsds-ndm-py 0.0.4__tar.gz → 0.0.5__tar.gz

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 (101) hide show
  1. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/PKG-INFO +1 -1
  2. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/Cargo.lock +2 -2
  3. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/Cargo.toml +1 -1
  4. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/ccsds_ndm/__init__.pyi +43 -0
  5. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/acm.rs +0 -1
  6. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/aem.rs +1 -2
  7. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/apm.rs +0 -1
  8. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/attitude.rs +2 -0
  9. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/cdm.rs +59 -60
  10. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/ndm.rs +0 -1
  11. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/ocm.rs +0 -1
  12. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/oem.rs +2 -2
  13. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/omm.rs +62 -1
  14. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/opm.rs +0 -1
  15. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/rdm.rs +1 -1
  16. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/tdm.rs +0 -1
  17. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_omm.py +70 -0
  18. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/Cargo.toml +1 -1
  19. ccsds_ndm_py-0.0.5/ccsds-ndm/src/messages/omm/tle.rs +1256 -0
  20. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/messages/omm.rs +197 -8
  21. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds_ndm/__init__.pyi +43 -0
  22. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/README.md +0 -0
  23. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/.pre-commit-config.yaml +0 -0
  24. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/README.md +0 -0
  25. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/audit_bindings.py +0 -0
  26. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/binding_mappings.py +0 -0
  27. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/ccsds_ndm/__init__.py +0 -0
  28. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/check_xml.py +0 -0
  29. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/common.rs +0 -0
  30. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/errors.rs +0 -0
  31. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/lib.rs +0 -0
  32. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/src/types.rs +0 -0
  33. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/stubs.py +0 -0
  34. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/sync_docstrings.py +0 -0
  35. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_acm.py +0 -0
  36. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_aem.py +0 -0
  37. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_apm.py +0 -0
  38. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_attitude_common.py +0 -0
  39. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_cdm.py +0 -0
  40. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_cdm.xml +0 -0
  41. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_ndm.py +0 -0
  42. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_ocm.py +0 -0
  43. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_oem.py +0 -0
  44. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_opm.py +0 -0
  45. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_rdm.py +0 -0
  46. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_tdm.py +0 -0
  47. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/bindings/python/tests/test_user_defined.py +0 -0
  48. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/.pre-commit-config.yaml +0 -0
  49. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/README.md +0 -0
  50. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/benches/kvn_benches.rs +0 -0
  51. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/benches/xml_benches.rs +0 -0
  52. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/examples/builder_demo.rs +0 -0
  53. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/examples/convert_format.rs +0 -0
  54. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/examples/simple_parse.rs +0 -0
  55. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/common.rs +0 -0
  56. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/detect.rs +0 -0
  57. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/error.rs +0 -0
  58. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/acm.rs +0 -0
  59. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/aem.rs +0 -0
  60. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/apm.rs +0 -0
  61. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/cdm.rs +0 -0
  62. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/mod.rs +0 -0
  63. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/ocm.rs +0 -0
  64. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/oem.rs +0 -0
  65. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/omm.rs +0 -0
  66. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/opm.rs +0 -0
  67. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/parser.rs +0 -0
  68. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/rdm.rs +0 -0
  69. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/ser.rs +0 -0
  70. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/kvn/tdm.rs +0 -0
  71. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/lib.rs +0 -0
  72. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/messages/acm.rs +0 -0
  73. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/messages/aem.rs +0 -0
  74. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/messages/apm.rs +0 -0
  75. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/messages/cdm.rs +0 -0
  76. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/messages/mod.rs +0 -0
  77. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/messages/ndm.rs +0 -0
  78. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/messages/ocm.rs +0 -0
  79. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/messages/oem.rs +0 -0
  80. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/messages/opm.rs +0 -0
  81. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/messages/rdm.rs +0 -0
  82. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/messages/tdm.rs +0 -0
  83. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/traits.rs +0 -0
  84. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/types.rs +0 -0
  85. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/utils.rs +0 -0
  86. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/validation.rs +0 -0
  87. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/versioning.rs +0 -0
  88. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/src/xml.rs +0 -0
  89. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/tests/auto_detection.rs +0 -0
  90. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/tests/case_matrix.json +0 -0
  91. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/tests/case_matrix.rs +0 -0
  92. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/tests/combined_ndm.rs +0 -0
  93. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/tests/common/mod.rs +0 -0
  94. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/tests/error_reporting.rs +0 -0
  95. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/tests/integration_lib.rs +0 -0
  96. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/tests/integration_parsing.rs +0 -0
  97. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/tests/repro_kvn_empty.rs +0 -0
  98. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/tests/verify_cdm_optional.rs +0 -0
  99. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds-ndm/tests/xml_wrappers.rs +0 -0
  100. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/ccsds_ndm/__init__.py +0 -0
  101. {ccsds_ndm_py-0.0.4 → ccsds_ndm_py-0.0.5}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ccsds-ndm-py
3
- Version: 0.0.4
3
+ Version: 0.0.5
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Science/Research
6
6
  Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
@@ -35,7 +35,7 @@ dependencies = [
35
35
 
36
36
  [[package]]
37
37
  name = "ccsds-ndm"
38
- version = "0.0.4"
38
+ version = "0.0.5"
39
39
  dependencies = [
40
40
  "bon",
41
41
  "fast-float",
@@ -49,7 +49,7 @@ dependencies = [
49
49
 
50
50
  [[package]]
51
51
  name = "ccsds-ndm-py"
52
- version = "0.0.4"
52
+ version = "0.0.5"
53
53
  dependencies = [
54
54
  "ccsds-ndm",
55
55
  "numpy",
@@ -4,7 +4,7 @@
4
4
 
5
5
  [package]
6
6
  name = "ccsds-ndm-py"
7
- version = "0.0.4"
7
+ version = "0.0.5"
8
8
  authors = ["Jochim Maene <jochim.maene+github@gmail.com>"]
9
9
  edition = "2021"
10
10
  description = "Python bindings for ccsds-ndm"
@@ -9318,6 +9318,38 @@ class Omm:
9318
9318
  """ """
9319
9319
  ...
9320
9320
 
9321
+ @staticmethod
9322
+ def from_tle_lines(
9323
+ line1,
9324
+ line2,
9325
+ object_name=None,
9326
+ object_id=None,
9327
+ originator=None,
9328
+ message_id=None,
9329
+ creation_date=None,
9330
+ ):
9331
+ """
9332
+ Build a minimal OMM from canonical NORAD TLE line 1 and line 2.
9333
+
9334
+ Parameters
9335
+ ----------
9336
+ line1 : str
9337
+ TLE line 1 (69 chars including checksum).
9338
+ line2 : str
9339
+ TLE line 2 (69 chars including checksum).
9340
+ object_name : str, optional
9341
+ Metadata OBJECT_NAME override (default: "UNKNOWN").
9342
+ object_id : str, optional
9343
+ Metadata OBJECT_ID override (default: derived from TLE launch designator).
9344
+ originator : str, optional
9345
+ Header ORIGINATOR override (default: "UNKNOWN").
9346
+ message_id : str, optional
9347
+ Header MESSAGE_ID override.
9348
+ creation_date : str, optional
9349
+ Header CREATION_DATE override in CCSDS epoch format.
9350
+ """
9351
+ ...
9352
+
9321
9353
  @property
9322
9354
  def header(self) -> OdmHeader:
9323
9355
  """
@@ -9388,6 +9420,17 @@ class Omm:
9388
9420
  """
9389
9421
  ...
9390
9422
 
9423
+ def to_tle_lines(self):
9424
+ """
9425
+ Generate canonical NORAD TLE lines (line 1 and line 2) from this OMM.
9426
+
9427
+ Returns
9428
+ -------
9429
+ tuple[str, str]
9430
+ `(line1, line2)` without a line 0.
9431
+ """
9432
+ ...
9433
+
9391
9434
  def validate(self, strict=True):
9392
9435
  """
9393
9436
  Validate the message against CCSDS rules.
@@ -78,7 +78,6 @@ impl Acm {
78
78
  /// If False, returns a list of validation error messages (or None if valid).
79
79
  #[pyo3(signature = (strict=true))]
80
80
  fn validate(&self, strict: bool) -> PyResult<Option<Vec<String>>> {
81
-
82
81
  if strict {
83
82
  self.inner
84
83
  .validate()
@@ -128,7 +128,6 @@ impl Aem {
128
128
  /// If False, returns a list of validation error messages (or None if valid).
129
129
  #[pyo3(signature = (strict=true))]
130
130
  fn validate(&self, strict: bool) -> PyResult<Option<Vec<String>>> {
131
-
132
131
  if strict {
133
132
  self.inner
134
133
  .validate()
@@ -604,7 +603,7 @@ impl AemData {
604
603
  QuaternionEphemeris {
605
604
  epoch: s.epoch,
606
605
  quaternion: Quaternion {
607
- q1: s.values.get(0).copied().unwrap_or(0.0),
606
+ q1: s.values.first().copied().unwrap_or(0.0),
608
607
  q2: s.values.get(1).copied().unwrap_or(0.0),
609
608
  q3: s.values.get(2).copied().unwrap_or(0.0),
610
609
  qc: s.values.get(3).copied().unwrap_or(1.0),
@@ -112,7 +112,6 @@ impl Apm {
112
112
  /// If False, returns a list of validation error messages (or None if valid).
113
113
  #[pyo3(signature = (strict=true))]
114
114
  fn validate(&self, strict: bool) -> PyResult<Option<Vec<String>>> {
115
-
116
115
  if strict {
117
116
  self.inner
118
117
  .validate()
@@ -19,6 +19,7 @@ pub struct QuaternionState {
19
19
  #[pymethods]
20
20
  impl QuaternionState {
21
21
  #[new]
22
+ #[allow(clippy::too_many_arguments)]
22
23
  fn new(
23
24
  ref_frame_a: String,
24
25
  ref_frame_b: String,
@@ -643,6 +644,7 @@ pub struct InertiaState {
643
644
  #[pymethods]
644
645
  impl InertiaState {
645
646
  #[new]
647
+ #[allow(clippy::too_many_arguments)]
646
648
  fn new(
647
649
  inertia_ref_frame: String,
648
650
  ixx: f64,
@@ -48,7 +48,7 @@ fn build_cdm_covariance_from_array(
48
48
  ));
49
49
  }
50
50
  let dim = shape[0];
51
- if dim < 6 || dim > 9 {
51
+ if !(6..=9).contains(&dim) {
52
52
  return Err(PyValueError::new_err(
53
53
  "Covariance matrix must be 6x6, 7x7, 8x8, or 9x9",
54
54
  ));
@@ -242,7 +242,6 @@ impl Cdm {
242
242
  /// If False, returns a list of validation error messages (or None if valid).
243
243
  #[pyo3(signature = (strict=true))]
244
244
  fn validate(&self, strict: bool) -> PyResult<Option<Vec<String>>> {
245
-
246
245
  if strict {
247
246
  self.inner
248
247
  .validate()
@@ -787,7 +786,7 @@ impl RelativeMetadataData {
787
786
  comment,
788
787
  tca: parse_epoch_str(&tca)?,
789
788
  miss_distance: Length::new(miss_distance, None),
790
- relative_speed: relative_speed.map(|v| Dv::new(v)),
789
+ relative_speed: relative_speed.map(Dv::new),
791
790
  relative_state_vector: rel_state,
792
791
  start_screen_period: start_screen_period
793
792
  .map(|s| parse_epoch_str(&s))
@@ -850,7 +849,7 @@ impl RelativeMetadataData {
850
849
  }
851
850
  #[setter]
852
851
  fn set_relative_speed(&mut self, value: Option<f64>) {
853
- self.inner.relative_speed = value.map(|v| Dv::new(v));
852
+ self.inner.relative_speed = value.map(Dv::new);
854
853
  }
855
854
 
856
855
  /// The probability (denoted 'p' where 0.0<=p<=1.0), that Object1 and Object2 will collide.
@@ -2561,10 +2560,10 @@ impl AdditionalParameters {
2561
2560
  area_drg: area_drg.map(|v| core_types::Area::new(v, None).unwrap()),
2562
2561
  area_srp: area_srp.map(|v| core_types::Area::new(v, None).unwrap()),
2563
2562
  mass: mass.map(|v| core_types::Mass::new(v, None).unwrap()),
2564
- cd_area_over_mass: cd_area_over_mass.map(|v| core_types::M2kgRequired::new(v)),
2565
- cr_area_over_mass: cr_area_over_mass.map(|v| core_types::M2kgRequired::new(v)),
2566
- thrust_acceleration: thrust_acceleration.map(|v| core_types::Ms2::new(v)),
2567
- sedr: sedr.map(|v| core_types::Wkg::new(v)),
2563
+ cd_area_over_mass: cd_area_over_mass.map(core_types::M2kgRequired::new),
2564
+ cr_area_over_mass: cr_area_over_mass.map(core_types::M2kgRequired::new),
2565
+ thrust_acceleration: thrust_acceleration.map(core_types::Ms2::new),
2566
+ sedr: sedr.map(core_types::Wkg::new),
2568
2567
  },
2569
2568
  }
2570
2569
  }
@@ -2651,7 +2650,7 @@ impl AdditionalParameters {
2651
2650
  }
2652
2651
  #[setter]
2653
2652
  fn set_cd_area_over_mass(&mut self, v: Option<f64>) {
2654
- self.inner.cd_area_over_mass = v.map(|x| core_types::M2kgRequired::new(x));
2653
+ self.inner.cd_area_over_mass = v.map(core_types::M2kgRequired::new);
2655
2654
  }
2656
2655
 
2657
2656
  /// The object's CR•A/m used to propagate the state vector and covariance to TCA. (See
@@ -2666,7 +2665,7 @@ impl AdditionalParameters {
2666
2665
  }
2667
2666
  #[setter]
2668
2667
  fn set_cr_area_over_mass(&mut self, v: Option<f64>) {
2669
- self.inner.cr_area_over_mass = v.map(|x| core_types::M2kgRequired::new(x));
2668
+ self.inner.cr_area_over_mass = v.map(core_types::M2kgRequired::new);
2670
2669
  }
2671
2670
 
2672
2671
  /// The object's acceleration due to in-track thrust used to propagate the state vector and
@@ -2681,7 +2680,7 @@ impl AdditionalParameters {
2681
2680
  }
2682
2681
  #[setter]
2683
2682
  fn set_thrust_acceleration(&mut self, v: Option<f64>) {
2684
- self.inner.thrust_acceleration = v.map(|x| core_types::Ms2::new(x));
2683
+ self.inner.thrust_acceleration = v.map(core_types::Ms2::new);
2685
2684
  }
2686
2685
 
2687
2686
  /// The amount of energy being removed from the object's orbit by atmospheric drag. This
@@ -2696,7 +2695,7 @@ impl AdditionalParameters {
2696
2695
  }
2697
2696
  #[setter]
2698
2697
  fn set_sedr(&mut self, v: Option<f64>) {
2699
- self.inner.sedr = v.map(|x| core_types::Wkg::new(x));
2698
+ self.inner.sedr = v.map(core_types::Wkg::new);
2700
2699
  }
2701
2700
  }
2702
2701
 
@@ -2926,30 +2925,30 @@ impl CdmCovarianceMatrix {
2926
2925
  cndot_rdot: core_types::M2s2::new(cndot_rdot),
2927
2926
  cndot_tdot: core_types::M2s2::new(cndot_tdot),
2928
2927
  cndot_ndot: core_types::M2s2::new(cndot_ndot),
2929
- cdrg_r: cdrg_r.map(|v| core_types::M3kg::new(v)),
2930
- cdrg_t: cdrg_t.map(|v| core_types::M3kg::new(v)),
2931
- cdrg_n: cdrg_n.map(|v| core_types::M3kg::new(v)),
2932
- cdrg_rdot: cdrg_rdot.map(|v| core_types::M3kgs::new(v)),
2933
- cdrg_tdot: cdrg_tdot.map(|v| core_types::M3kgs::new(v)),
2934
- cdrg_ndot: cdrg_ndot.map(|v| core_types::M3kgs::new(v)),
2935
- cdrg_drg: cdrg_drg.map(|v| core_types::M4kg2::new(v)),
2936
- csrp_r: csrp_r.map(|v| core_types::M3kg::new(v)),
2937
- csrp_t: csrp_t.map(|v| core_types::M3kg::new(v)),
2938
- csrp_n: csrp_n.map(|v| core_types::M3kg::new(v)),
2939
- csrp_rdot: csrp_rdot.map(|v| core_types::M3kgs::new(v)),
2940
- csrp_tdot: csrp_tdot.map(|v| core_types::M3kgs::new(v)),
2941
- csrp_ndot: csrp_ndot.map(|v| core_types::M3kgs::new(v)),
2942
- csrp_drg: csrp_drg.map(|v| core_types::M4kg2::new(v)),
2943
- csrp_srp: csrp_srp.map(|v| core_types::M4kg2::new(v)),
2944
- cthr_r: cthr_r.map(|v| core_types::M2s2::new(v)),
2945
- cthr_t: cthr_t.map(|v| core_types::M2s2::new(v)),
2946
- cthr_n: cthr_n.map(|v| core_types::M2s2::new(v)),
2947
- cthr_rdot: cthr_rdot.map(|v| core_types::M2s3::new(v)),
2948
- cthr_tdot: cthr_tdot.map(|v| core_types::M2s3::new(v)),
2949
- cthr_ndot: cthr_ndot.map(|v| core_types::M2s3::new(v)),
2950
- cthr_drg: cthr_drg.map(|v| core_types::M3kgs2::new(v)),
2951
- cthr_srp: cthr_srp.map(|v| core_types::M3kgs2::new(v)),
2952
- cthr_thr: cthr_thr.map(|v| core_types::M2s4::new(v)),
2928
+ cdrg_r: cdrg_r.map(core_types::M3kg::new),
2929
+ cdrg_t: cdrg_t.map(core_types::M3kg::new),
2930
+ cdrg_n: cdrg_n.map(core_types::M3kg::new),
2931
+ cdrg_rdot: cdrg_rdot.map(core_types::M3kgs::new),
2932
+ cdrg_tdot: cdrg_tdot.map(core_types::M3kgs::new),
2933
+ cdrg_ndot: cdrg_ndot.map(core_types::M3kgs::new),
2934
+ cdrg_drg: cdrg_drg.map(core_types::M4kg2::new),
2935
+ csrp_r: csrp_r.map(core_types::M3kg::new),
2936
+ csrp_t: csrp_t.map(core_types::M3kg::new),
2937
+ csrp_n: csrp_n.map(core_types::M3kg::new),
2938
+ csrp_rdot: csrp_rdot.map(core_types::M3kgs::new),
2939
+ csrp_tdot: csrp_tdot.map(core_types::M3kgs::new),
2940
+ csrp_ndot: csrp_ndot.map(core_types::M3kgs::new),
2941
+ csrp_drg: csrp_drg.map(core_types::M4kg2::new),
2942
+ csrp_srp: csrp_srp.map(core_types::M4kg2::new),
2943
+ cthr_r: cthr_r.map(core_types::M2s2::new),
2944
+ cthr_t: cthr_t.map(core_types::M2s2::new),
2945
+ cthr_n: cthr_n.map(core_types::M2s2::new),
2946
+ cthr_rdot: cthr_rdot.map(core_types::M2s3::new),
2947
+ cthr_tdot: cthr_tdot.map(core_types::M2s3::new),
2948
+ cthr_ndot: cthr_ndot.map(core_types::M2s3::new),
2949
+ cthr_drg: cthr_drg.map(core_types::M3kgs2::new),
2950
+ cthr_srp: cthr_srp.map(core_types::M3kgs2::new),
2951
+ cthr_thr: cthr_thr.map(core_types::M2s4::new),
2953
2952
  },
2954
2953
  }
2955
2954
  }
@@ -3374,7 +3373,7 @@ impl CdmCovarianceMatrix {
3374
3373
  }
3375
3374
  #[setter]
3376
3375
  fn set_cdrg_r(&mut self, v: Option<f64>) {
3377
- self.inner.cdrg_r = v.map(|x| core_types::M3kg::new(x));
3376
+ self.inner.cdrg_r = v.map(core_types::M3kg::new);
3378
3377
  }
3379
3378
 
3380
3379
  /// Object covariance matrix `[7,2]`.
@@ -3388,7 +3387,7 @@ impl CdmCovarianceMatrix {
3388
3387
  }
3389
3388
  #[setter]
3390
3389
  fn set_cdrg_t(&mut self, v: Option<f64>) {
3391
- self.inner.cdrg_t = v.map(|x| core_types::M3kg::new(x));
3390
+ self.inner.cdrg_t = v.map(core_types::M3kg::new);
3392
3391
  }
3393
3392
 
3394
3393
  /// Object covariance matrix `[7,3]`.
@@ -3402,7 +3401,7 @@ impl CdmCovarianceMatrix {
3402
3401
  }
3403
3402
  #[setter]
3404
3403
  fn set_cdrg_n(&mut self, v: Option<f64>) {
3405
- self.inner.cdrg_n = v.map(|x| core_types::M3kg::new(x));
3404
+ self.inner.cdrg_n = v.map(core_types::M3kg::new);
3406
3405
  }
3407
3406
 
3408
3407
  /// Object covariance matrix `[7,4]`.
@@ -3416,7 +3415,7 @@ impl CdmCovarianceMatrix {
3416
3415
  }
3417
3416
  #[setter]
3418
3417
  fn set_cdrg_rdot(&mut self, v: Option<f64>) {
3419
- self.inner.cdrg_rdot = v.map(|x| core_types::M3kgs::new(x));
3418
+ self.inner.cdrg_rdot = v.map(core_types::M3kgs::new);
3420
3419
  }
3421
3420
 
3422
3421
  /// Object covariance matrix `[7,5]`.
@@ -3430,7 +3429,7 @@ impl CdmCovarianceMatrix {
3430
3429
  }
3431
3430
  #[setter]
3432
3431
  fn set_cdrg_tdot(&mut self, v: Option<f64>) {
3433
- self.inner.cdrg_tdot = v.map(|x| core_types::M3kgs::new(x));
3432
+ self.inner.cdrg_tdot = v.map(core_types::M3kgs::new);
3434
3433
  }
3435
3434
 
3436
3435
  /// Object covariance matrix `[7,6]`.
@@ -3444,7 +3443,7 @@ impl CdmCovarianceMatrix {
3444
3443
  }
3445
3444
  #[setter]
3446
3445
  fn set_cdrg_ndot(&mut self, v: Option<f64>) {
3447
- self.inner.cdrg_ndot = v.map(|x| core_types::M3kgs::new(x));
3446
+ self.inner.cdrg_ndot = v.map(core_types::M3kgs::new);
3448
3447
  }
3449
3448
 
3450
3449
  /// Object covariance matrix `[7,7]`.
@@ -3458,7 +3457,7 @@ impl CdmCovarianceMatrix {
3458
3457
  }
3459
3458
  #[setter]
3460
3459
  fn set_cdrg_drg(&mut self, v: Option<f64>) {
3461
- self.inner.cdrg_drg = v.map(|x| core_types::M4kg2::new(x));
3460
+ self.inner.cdrg_drg = v.map(core_types::M4kg2::new);
3462
3461
  }
3463
3462
 
3464
3463
  /// Object covariance matrix `[8,1]`.
@@ -3472,7 +3471,7 @@ impl CdmCovarianceMatrix {
3472
3471
  }
3473
3472
  #[setter]
3474
3473
  fn set_csrp_r(&mut self, v: Option<f64>) {
3475
- self.inner.csrp_r = v.map(|x| core_types::M3kg::new(x));
3474
+ self.inner.csrp_r = v.map(core_types::M3kg::new);
3476
3475
  }
3477
3476
 
3478
3477
  /// Object covariance matrix `[8,2]`.
@@ -3486,7 +3485,7 @@ impl CdmCovarianceMatrix {
3486
3485
  }
3487
3486
  #[setter]
3488
3487
  fn set_csrp_t(&mut self, v: Option<f64>) {
3489
- self.inner.csrp_t = v.map(|x| core_types::M3kg::new(x));
3488
+ self.inner.csrp_t = v.map(core_types::M3kg::new);
3490
3489
  }
3491
3490
 
3492
3491
  /// Object covariance matrix `[8,3]`.
@@ -3500,7 +3499,7 @@ impl CdmCovarianceMatrix {
3500
3499
  }
3501
3500
  #[setter]
3502
3501
  fn set_csrp_n(&mut self, v: Option<f64>) {
3503
- self.inner.csrp_n = v.map(|x| core_types::M3kg::new(x));
3502
+ self.inner.csrp_n = v.map(core_types::M3kg::new);
3504
3503
  }
3505
3504
 
3506
3505
  /// Object covariance matrix `[8,4]`.
@@ -3514,7 +3513,7 @@ impl CdmCovarianceMatrix {
3514
3513
  }
3515
3514
  #[setter]
3516
3515
  fn set_csrp_rdot(&mut self, v: Option<f64>) {
3517
- self.inner.csrp_rdot = v.map(|x| core_types::M3kgs::new(x));
3516
+ self.inner.csrp_rdot = v.map(core_types::M3kgs::new);
3518
3517
  }
3519
3518
 
3520
3519
  /// Object covariance matrix `[8,5]`.
@@ -3528,7 +3527,7 @@ impl CdmCovarianceMatrix {
3528
3527
  }
3529
3528
  #[setter]
3530
3529
  fn set_csrp_tdot(&mut self, v: Option<f64>) {
3531
- self.inner.csrp_tdot = v.map(|x| core_types::M3kgs::new(x));
3530
+ self.inner.csrp_tdot = v.map(core_types::M3kgs::new);
3532
3531
  }
3533
3532
 
3534
3533
  /// Object covariance matrix `[8,6]`.
@@ -3542,7 +3541,7 @@ impl CdmCovarianceMatrix {
3542
3541
  }
3543
3542
  #[setter]
3544
3543
  fn set_csrp_ndot(&mut self, v: Option<f64>) {
3545
- self.inner.csrp_ndot = v.map(|x| core_types::M3kgs::new(x));
3544
+ self.inner.csrp_ndot = v.map(core_types::M3kgs::new);
3546
3545
  }
3547
3546
 
3548
3547
  /// Object covariance matrix `[8,7]`.
@@ -3556,7 +3555,7 @@ impl CdmCovarianceMatrix {
3556
3555
  }
3557
3556
  #[setter]
3558
3557
  fn set_csrp_drg(&mut self, v: Option<f64>) {
3559
- self.inner.csrp_drg = v.map(|x| core_types::M4kg2::new(x));
3558
+ self.inner.csrp_drg = v.map(core_types::M4kg2::new);
3560
3559
  }
3561
3560
 
3562
3561
  /// Object covariance matrix `[8,8]`.
@@ -3570,7 +3569,7 @@ impl CdmCovarianceMatrix {
3570
3569
  }
3571
3570
  #[setter]
3572
3571
  fn set_csrp_srp(&mut self, v: Option<f64>) {
3573
- self.inner.csrp_srp = v.map(|x| core_types::M4kg2::new(x));
3572
+ self.inner.csrp_srp = v.map(core_types::M4kg2::new);
3574
3573
  }
3575
3574
 
3576
3575
  /// Object covariance matrix `[9,1]`.
@@ -3584,7 +3583,7 @@ impl CdmCovarianceMatrix {
3584
3583
  }
3585
3584
  #[setter]
3586
3585
  fn set_cthr_r(&mut self, v: Option<f64>) {
3587
- self.inner.cthr_r = v.map(|x| core_types::M2s2::new(x));
3586
+ self.inner.cthr_r = v.map(core_types::M2s2::new);
3588
3587
  }
3589
3588
 
3590
3589
  /// Object covariance matrix `[9,2]`.
@@ -3598,7 +3597,7 @@ impl CdmCovarianceMatrix {
3598
3597
  }
3599
3598
  #[setter]
3600
3599
  fn set_cthr_t(&mut self, v: Option<f64>) {
3601
- self.inner.cthr_t = v.map(|x| core_types::M2s2::new(x));
3600
+ self.inner.cthr_t = v.map(core_types::M2s2::new);
3602
3601
  }
3603
3602
 
3604
3603
  /// Object covariance matrix `[9,3]`.
@@ -3612,7 +3611,7 @@ impl CdmCovarianceMatrix {
3612
3611
  }
3613
3612
  #[setter]
3614
3613
  fn set_cthr_n(&mut self, v: Option<f64>) {
3615
- self.inner.cthr_n = v.map(|x| core_types::M2s2::new(x));
3614
+ self.inner.cthr_n = v.map(core_types::M2s2::new);
3616
3615
  }
3617
3616
 
3618
3617
  /// Object covariance matrix `[9,4]`.
@@ -3626,7 +3625,7 @@ impl CdmCovarianceMatrix {
3626
3625
  }
3627
3626
  #[setter]
3628
3627
  fn set_cthr_rdot(&mut self, v: Option<f64>) {
3629
- self.inner.cthr_rdot = v.map(|x| core_types::M2s3::new(x));
3628
+ self.inner.cthr_rdot = v.map(core_types::M2s3::new);
3630
3629
  }
3631
3630
 
3632
3631
  /// Object covariance matrix `[9,5]`.
@@ -3640,7 +3639,7 @@ impl CdmCovarianceMatrix {
3640
3639
  }
3641
3640
  #[setter]
3642
3641
  fn set_cthr_tdot(&mut self, v: Option<f64>) {
3643
- self.inner.cthr_tdot = v.map(|x| core_types::M2s3::new(x));
3642
+ self.inner.cthr_tdot = v.map(core_types::M2s3::new);
3644
3643
  }
3645
3644
 
3646
3645
  /// Object covariance matrix `[9,6]`.
@@ -3654,7 +3653,7 @@ impl CdmCovarianceMatrix {
3654
3653
  }
3655
3654
  #[setter]
3656
3655
  fn set_cthr_ndot(&mut self, v: Option<f64>) {
3657
- self.inner.cthr_ndot = v.map(|x| core_types::M2s3::new(x));
3656
+ self.inner.cthr_ndot = v.map(core_types::M2s3::new);
3658
3657
  }
3659
3658
 
3660
3659
  /// Object covariance matrix `[9,7]`.
@@ -3668,7 +3667,7 @@ impl CdmCovarianceMatrix {
3668
3667
  }
3669
3668
  #[setter]
3670
3669
  fn set_cthr_drg(&mut self, v: Option<f64>) {
3671
- self.inner.cthr_drg = v.map(|x| core_types::M3kgs2::new(x));
3670
+ self.inner.cthr_drg = v.map(core_types::M3kgs2::new);
3672
3671
  }
3673
3672
 
3674
3673
  /// Object covariance matrix `[9,8]`.
@@ -3682,7 +3681,7 @@ impl CdmCovarianceMatrix {
3682
3681
  }
3683
3682
  #[setter]
3684
3683
  fn set_cthr_srp(&mut self, v: Option<f64>) {
3685
- self.inner.cthr_srp = v.map(|x| core_types::M3kgs2::new(x));
3684
+ self.inner.cthr_srp = v.map(core_types::M3kgs2::new);
3686
3685
  }
3687
3686
 
3688
3687
  /// Object covariance matrix `[9,9]`.
@@ -3696,6 +3695,6 @@ impl CdmCovarianceMatrix {
3696
3695
  }
3697
3696
  #[setter]
3698
3697
  fn set_cthr_thr(&mut self, v: Option<f64>) {
3699
- self.inner.cthr_thr = v.map(|x| core_types::M2s4::new(x));
3698
+ self.inner.cthr_thr = v.map(core_types::M2s4::new);
3700
3699
  }
3701
3700
  }
@@ -89,7 +89,6 @@ impl Ndm {
89
89
  /// If False, returns a list of validation error messages (or None if valid).
90
90
  #[pyo3(signature = (strict=true))]
91
91
  fn validate(&self, strict: bool) -> PyResult<Option<Vec<String>>> {
92
-
93
92
  if strict {
94
93
  self.inner
95
94
  .validate()
@@ -153,7 +153,6 @@ impl Ocm {
153
153
  /// If False, returns a list of validation error messages (or None if valid).
154
154
  #[pyo3(signature = (strict=true))]
155
155
  fn validate(&self, strict: bool) -> PyResult<Option<Vec<String>>> {
156
-
157
156
  if strict {
158
157
  self.inner
159
158
  .validate()
@@ -1491,7 +1491,7 @@ impl OemData {
1491
1491
  for (i, existing) in self.inner.state_vector.iter().enumerate() {
1492
1492
  let row = array_view.row(i);
1493
1493
  state_vectors.push(ccsds_ndm::common::StateVectorAcc {
1494
- epoch: existing.epoch.clone(),
1494
+ epoch: existing.epoch,
1495
1495
  x: Position {
1496
1496
  value: row[0],
1497
1497
  units: None,
@@ -1772,7 +1772,7 @@ impl OemData {
1772
1772
 
1773
1773
  let current = &existing[i];
1774
1774
  covariance_matrices.push(build_covariance_matrix(
1775
- current.epoch.clone(),
1775
+ current.epoch,
1776
1776
  current.cov_ref_frame.clone(),
1777
1777
  current.comment.clone(),
1778
1778
  v,
@@ -87,7 +87,6 @@ impl Omm {
87
87
  /// If False, returns a list of validation error messages (or None if valid).
88
88
  #[pyo3(signature = (strict=true))]
89
89
  fn validate(&self, strict: bool) -> PyResult<Option<Vec<String>>> {
90
-
91
90
  if strict {
92
91
  self.inner
93
92
  .validate()
@@ -259,6 +258,68 @@ impl Omm {
259
258
  ))),
260
259
  }
261
260
  }
261
+
262
+ /// Generate canonical NORAD TLE lines (line 1 and line 2) from this OMM.
263
+ ///
264
+ /// Returns
265
+ /// -------
266
+ /// tuple[str, str]
267
+ /// `(line1, line2)` without a line 0.
268
+ fn to_tle_lines(&self) -> PyResult<(String, String)> {
269
+ self.inner
270
+ .to_tle_lines()
271
+ .map_err(|e| PyValueError::new_err(e.to_string()))
272
+ }
273
+
274
+ /// Build a minimal OMM from canonical NORAD TLE line 1 and line 2.
275
+ ///
276
+ /// Parameters
277
+ /// ----------
278
+ /// line1 : str
279
+ /// TLE line 1 (69 chars including checksum).
280
+ /// line2 : str
281
+ /// TLE line 2 (69 chars including checksum).
282
+ /// object_name : str, optional
283
+ /// Metadata OBJECT_NAME override (default: "UNKNOWN").
284
+ /// object_id : str, optional
285
+ /// Metadata OBJECT_ID override (default: derived from TLE launch designator).
286
+ /// originator : str, optional
287
+ /// Header ORIGINATOR override (default: "UNKNOWN").
288
+ /// message_id : str, optional
289
+ /// Header MESSAGE_ID override.
290
+ /// creation_date : str, optional
291
+ /// Header CREATION_DATE override in CCSDS epoch format.
292
+ #[staticmethod]
293
+ #[pyo3(signature = (
294
+ line1,
295
+ line2,
296
+ object_name=None,
297
+ object_id=None,
298
+ originator=None,
299
+ message_id=None,
300
+ creation_date=None
301
+ ))]
302
+ fn from_tle_lines(
303
+ line1: &str,
304
+ line2: &str,
305
+ object_name: Option<String>,
306
+ object_id: Option<String>,
307
+ originator: Option<String>,
308
+ message_id: Option<String>,
309
+ creation_date: Option<String>,
310
+ ) -> PyResult<Self> {
311
+ let options = core_omm::TleToOmmOptions {
312
+ object_name,
313
+ object_id,
314
+ originator,
315
+ message_id,
316
+ creation_date: creation_date.map(|s| parse_epoch(&s)).transpose()?,
317
+ };
318
+
319
+ let inner = core_omm::Omm::from_tle_lines_with_options(line1, line2, &options)
320
+ .map_err(|e| PyValueError::new_err(e.to_string()))?;
321
+ Ok(Self { inner })
322
+ }
262
323
  }
263
324
 
264
325
  /// Create a new OMM Segment.
@@ -81,7 +81,6 @@ impl Opm {
81
81
  /// If False, returns a list of validation error messages (or None if valid).
82
82
  #[pyo3(signature = (strict=true))]
83
83
  fn validate(&self, strict: bool) -> PyResult<Option<Vec<String>>> {
84
-
85
84
  if strict {
86
85
  self.inner
87
86
  .validate()
@@ -89,7 +89,6 @@ impl Rdm {
89
89
  /// If False, returns a list of validation error messages (or None if valid).
90
90
  #[pyo3(signature = (strict=true))]
91
91
  fn validate(&self, strict: bool) -> PyResult<Option<Vec<String>>> {
92
-
93
92
  if strict {
94
93
  self.inner
95
94
  .validate()
@@ -1249,6 +1248,7 @@ impl RdmData {
1249
1248
  user_defined_parameters=None,
1250
1249
  comment=None
1251
1250
  ))]
1251
+ #[allow(clippy::too_many_arguments)]
1252
1252
  fn new(
1253
1253
  atmospheric_reentry_parameters: AtmosphericReentryParameters,
1254
1254
  ground_impact_parameters: Option<GroundImpactParameters>,
@@ -86,7 +86,6 @@ impl Tdm {
86
86
  /// If False, returns a list of validation error messages (or None if valid).
87
87
  #[pyo3(signature = (strict=true))]
88
88
  fn validate(&self, strict: bool) -> PyResult<Option<Vec<String>>> {
89
-
90
89
  if strict {
91
90
  self.inner
92
91
  .validate()