open-space-toolkit-astrodynamics 14.0.0__py310-none-manylinux2014_x86_64.whl → 15.1.0__py310-none-manylinux2014_x86_64.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 (31) hide show
  1. {open_space_toolkit_astrodynamics-14.0.0.dist-info → open_space_toolkit_astrodynamics-15.1.0.dist-info}/METADATA +2 -2
  2. {open_space_toolkit_astrodynamics-14.0.0.dist-info → open_space_toolkit_astrodynamics-15.1.0.dist-info}/RECORD +30 -31
  3. ostk/astrodynamics/OpenSpaceToolkitAstrodynamicsPy.cpython-310-x86_64-linux-gnu.so +0 -0
  4. ostk/astrodynamics/__init__.pyi +4 -4
  5. ostk/astrodynamics/access.pyi +3 -3
  6. ostk/astrodynamics/conjunction/message/ccsds.pyi +4 -4
  7. ostk/astrodynamics/dynamics.pyi +1 -1
  8. ostk/astrodynamics/flight/__init__.pyi +1 -1
  9. ostk/astrodynamics/{libopen-space-toolkit-astrodynamics.so.14 → libopen-space-toolkit-astrodynamics.so.15} +0 -0
  10. ostk/astrodynamics/solver.pyi +4 -4
  11. ostk/astrodynamics/test/dynamics/test_dynamics.py +1 -1
  12. ostk/astrodynamics/test/flight/system/test_propulsion_system.py +2 -11
  13. ostk/astrodynamics/test/flight/system/test_satellite_system.py +6 -14
  14. ostk/astrodynamics/test/flight/test_system.py +5 -15
  15. ostk/astrodynamics/test/solvers/test_finite_difference_solver.py +9 -7
  16. ostk/astrodynamics/test/test_event_condition.py +4 -2
  17. ostk/astrodynamics/test/test_utilities.py +1 -1
  18. ostk/astrodynamics/test/test_viewer.py +64 -0
  19. ostk/astrodynamics/test/trajectory/state/test_numerical_solver.py +4 -2
  20. ostk/astrodynamics/test/trajectory/test_local_orbital_frame_factory.py +4 -2
  21. ostk/astrodynamics/test/trajectory/test_state_builder.py +1 -0
  22. ostk/astrodynamics/trajectory/__init__.pyi +26 -20
  23. ostk/astrodynamics/trajectory/orbit/message/spacex.pyi +1 -1
  24. ostk/astrodynamics/trajectory/orbit/model/__init__.pyi +5 -5
  25. ostk/astrodynamics/trajectory/state/__init__.pyi +4 -4
  26. ostk/astrodynamics/trajectory/state/coordinate_subset.pyi +1 -1
  27. ostk/astrodynamics/viewer.py +105 -4
  28. ostk/astrodynamics/py.typed +0 -0
  29. {open_space_toolkit_astrodynamics-14.0.0.dist-info → open_space_toolkit_astrodynamics-15.1.0.dist-info}/WHEEL +0 -0
  30. {open_space_toolkit_astrodynamics-14.0.0.dist-info → open_space_toolkit_astrodynamics-15.1.0.dist-info}/top_level.txt +0 -0
  31. {open_space_toolkit_astrodynamics-14.0.0.dist-info → open_space_toolkit_astrodynamics-15.1.0.dist-info}/zip-safe +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: open-space-toolkit-astrodynamics
3
- Version: 14.0.0
3
+ Version: 15.1.0
4
4
  Summary: Orbit, attitude, access.
5
5
  Author: Open Space Collective
6
6
  Author-email: contact@open-space-collective.org
@@ -14,7 +14,7 @@ Description-Content-Type: text/markdown
14
14
  Requires-Dist: open-space-toolkit-core~=5.0
15
15
  Requires-Dist: open-space-toolkit-io~=4.0
16
16
  Requires-Dist: open-space-toolkit-mathematics~=4.3
17
- Requires-Dist: open-space-toolkit-physics~=11.2
17
+ Requires-Dist: open-space-toolkit-physics~=12.0
18
18
 
19
19
  # Open Space Toolkit ▸ Astrodynamics
20
20
 
@@ -1,26 +1,25 @@
1
1
  ostk/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
2
- ostk/astrodynamics/OpenSpaceToolkitAstrodynamicsPy.cpython-310-x86_64-linux-gnu.so,sha256=jP3SQJpNw7ny8KXxqA6ZewZz0j3kZ_uR8bJDukw0cTM,2631776
2
+ ostk/astrodynamics/OpenSpaceToolkitAstrodynamicsPy.cpython-310-x86_64-linux-gnu.so,sha256=gYM0JjMm4ZqA-zE01ki8UIBkTPFGOOYoRBCeWOddkI4,2631776
3
3
  ostk/astrodynamics/__init__.py,sha256=3gWyqFIbhAfcdeMhmfBPQPlPQTmaOzm-6flkJe745Zk,251
4
- ostk/astrodynamics/__init__.pyi,sha256=0JLX_CIQHXziVm6A7j-GMrq8UdCCUqWn64UIVMZB5Ao,32224
5
- ostk/astrodynamics/access.pyi,sha256=bfnlkaHEbP62PC769OhkaL9QihJKIsFy4f9WcD5NijA,25292
4
+ ostk/astrodynamics/__init__.pyi,sha256=bR00BMMwv8B3E2WWEpnVJ_afWHWHr93CUvU5FeHPg3c,32231
5
+ ostk/astrodynamics/access.pyi,sha256=0GAFCSoMHT3L8wWOxU1-3ELqR7YGyEkt6wlpaL7UXzI,25313
6
6
  ostk/astrodynamics/converters.py,sha256=luPh30qMp9bzEkN7hUccmxlLf7zRp_AzqmBe8IUjPhU,3314
7
7
  ostk/astrodynamics/converters.pyi,sha256=HrZFyizkc6Hv_K38ZKZ80fX_bAxd6keA_NFWNQygvbs,1745
8
8
  ostk/astrodynamics/dataframe.py,sha256=9fXRk7sJl_OrBTCjZC_TFx6JMPE7IDGqv2JgEmGCdgM,18775
9
9
  ostk/astrodynamics/display.py,sha256=LZESZgx2wlrFO4cwAGMb3VPJfdtcjNgCgKFrqot0NYU,6339
10
- ostk/astrodynamics/dynamics.pyi,sha256=yOcj8-hwoi_nYCNC-heYtdOYigqAfjoAhI9DkEbcP4M,13731
10
+ ostk/astrodynamics/dynamics.pyi,sha256=AUNsUSR5LqOYFt626k4FZDbCPZRGoZV82AwCC3CDH8s,13738
11
11
  ostk/astrodynamics/event_condition.pyi,sha256=-Tq6cqr00lZPpoMnCPDRB0MB-MinM60oCNn1ZSA1Cik,25536
12
12
  ostk/astrodynamics/guidance_law.pyi,sha256=pEoAL9CDFWNulOLv6wea3xj1fJI3xFtgx-2eYMEftJI,12507
13
- ostk/astrodynamics/libopen-space-toolkit-astrodynamics.so.14,sha256=Tjgq0ubkHC3tYxL9DgfJ__1D0dOJT1zk68K2HOFGfC4,101373184
14
- ostk/astrodynamics/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- ostk/astrodynamics/solver.pyi,sha256=jOBvxADBaxGJC8C6tV9iwFMngnfmmM7-hKMrpunKo_c,9718
13
+ ostk/astrodynamics/libopen-space-toolkit-astrodynamics.so.15,sha256=_YtpT-mc45lP9dFMoUZvxx5Hw8zQZs75QIwmFJS8VEU,101370512
14
+ ostk/astrodynamics/solver.pyi,sha256=ugi73KdRXPKFvKXFMpYKIwxYUGC2KEMlBiLv0PFcigM,9746
16
15
  ostk/astrodynamics/utilities.py,sha256=mlKL3WrOASrY_pLt7bzUz0XZT7jagzLOZjMOIqjbQ1Y,6999
17
- ostk/astrodynamics/viewer.py,sha256=tmkHe4K4oQ2739ETdPDu8-3YtWhgLtFLMwbenxIu1VU,12670
16
+ ostk/astrodynamics/viewer.py,sha256=SpcvBqXx3CAZpk7UGOPT1ilxywmAmNpgqpuRY11Hwx0,16376
18
17
  ostk/astrodynamics/conjunction/__init__.pyi,sha256=HFvWl8bCmrq3cBkUh5X5RGIh8webmVGxaZdpsz3WN-E,79
19
18
  ostk/astrodynamics/conjunction/message/__init__.pyi,sha256=5H__sg_QUx7ybf9jtVWvXzrUHeK3ECotfhddAdHjJUc,75
20
- ostk/astrodynamics/conjunction/message/ccsds.pyi,sha256=eKWTwUa8895aAp3B3LORrxr4VHtGvK7SHx7-_bZrNEU,28667
19
+ ostk/astrodynamics/conjunction/message/ccsds.pyi,sha256=3FCWOnInqwI5FKfodR4-xYuiBS0UzemoIXsc1GWPDQI,28690
21
20
  ostk/astrodynamics/data/__init__.pyi,sha256=4l_mfVbnU_L7wImwgTCe8fVI81gK_tUmd0z7BY9lLi8,81
22
21
  ostk/astrodynamics/data/provider.pyi,sha256=O4Lg9FBq9itufgATnic5SMg90pn8vJJJMUdNcWP72NI,1492
23
- ostk/astrodynamics/flight/__init__.pyi,sha256=CrkOZJAgQ_AaNaV8_HHRkuFnhKR8_fEGEKnjn9sBJSA,21971
22
+ ostk/astrodynamics/flight/__init__.pyi,sha256=e3h1bK8VIbMR_vj_zEXavJx_3vsUjkSuGvTRLaRFCdg,21978
24
23
  ostk/astrodynamics/flight/system.pyi,sha256=HNoC__FuySH9RNiPRvCbL_oQfXQz1mLDUJzE30rkyc0,10742
25
24
  ostk/astrodynamics/flight/profile/__init__.pyi,sha256=bcvyB8BUlv2Mbjr98piFaiN_tBw9frqkcvoUF_GWelw,3766
26
25
  ostk/astrodynamics/flight/profile/model.pyi,sha256=EEN8V3JGTcvM5sX33lkJnE0av9yPtzn0gJcBmZeai9M,6963
@@ -34,12 +33,12 @@ ostk/astrodynamics/test/test_access.py,sha256=MCBsUPtuVm7NgHZR0z0DpWnPZ_qBu4aRhL
34
33
  ostk/astrodynamics/test/test_converters.py,sha256=mFpDD0YM8o356lj91GGIwYdMk2ut6xZFV3uYcgZepMY,8744
35
34
  ostk/astrodynamics/test/test_dataframe.py,sha256=IJMOODzTVYtiPxekmltH6lOMArPXbHwSEAl-jg0Ab2g,28414
36
35
  ostk/astrodynamics/test/test_display.py,sha256=6giw_i08YMOSRgqNpdVWtzDu6fFalEVKz_Uisu3N_X8,3870
37
- ostk/astrodynamics/test/test_event_condition.py,sha256=RSO2L5x3D8grWW4t7WK-aTMl7vFOMpj6F3ByN3EaovY,2175
36
+ ostk/astrodynamics/test/test_event_condition.py,sha256=fQ-rVYpQsa7xacxRMBOQDyn61CuAGX1QBOGZxGWR0_s,2204
38
37
  ostk/astrodynamics/test/test_import.py,sha256=py_hALBR0IYuUzv9dfgQZzrrLHJIpnyKvt3Oi1XBqCg,1251
39
38
  ostk/astrodynamics/test/test_root_solver.py,sha256=hQ8O6g-WP49gZH_H3Rdufv0F0gQorpzJyIcjBGGUQ34,1831
40
39
  ostk/astrodynamics/test/test_trajectory.py,sha256=0sgGPkMFy-u-33z6SF-sTvaBb_NU7OvaeMTVF6wevfY,3148
41
- ostk/astrodynamics/test/test_utilities.py,sha256=xmRt-5z9-FFYTMQxBpjGrcKP39trbOiH-NLxGcTWOJE,3048
42
- ostk/astrodynamics/test/test_viewer.py,sha256=rfA6daUqtATtaA2daE_kFWNK4oBBHreR5DKeXRKC-j0,6582
40
+ ostk/astrodynamics/test/test_utilities.py,sha256=NNIyzqOxMdsNpK2z0wU0utX06iZNfbMJDE36Upard28,3048
41
+ ostk/astrodynamics/test/test_viewer.py,sha256=kDstRH_WKufN_0JPSXttzLMk3Afv_ylcEBfHxc35yrA,8946
43
42
  ostk/astrodynamics/test/access/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
44
43
  ostk/astrodynamics/test/access/test_generator.py,sha256=i7TnM80kF0Q_9KmyoqKt5n1ufg3ZjAIEMPVVds8ZDdI,10315
45
44
  ostk/astrodynamics/test/access/test_visibility_criterion.py,sha256=0Q_lcs6PZC_mTIHDuIPc8adKF02q2EM_ZR6jT5UhnDg,6353
@@ -51,7 +50,7 @@ ostk/astrodynamics/test/data/provider/test_off_nadir.py,sha256=7Wz5sHWAX8WHGhvxC
51
50
  ostk/astrodynamics/test/dynamics/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
52
51
  ostk/astrodynamics/test/dynamics/test_atmospheric_drag.py,sha256=PryQJcYTi3EWjTDHPZ12-c6wVMzlgjaMdYxboWLgLJc,3737
53
52
  ostk/astrodynamics/test/dynamics/test_central_body_gravity.py,sha256=B8HvZz_ppsmeGijfMJArJbkLP9fSPciGtScuVT9AM_g,1782
54
- ostk/astrodynamics/test/dynamics/test_dynamics.py,sha256=KUyn8qwvzYkEHmhJV8AJXqK1MUnsXQXztSNr2GYZR4Q,1237
53
+ ostk/astrodynamics/test/dynamics/test_dynamics.py,sha256=4VHL3Khbh8qTBKZw7m-4gSUe0eGNfhks_SOpAxFENVQ,1241
55
54
  ostk/astrodynamics/test/dynamics/test_position_derivative.py,sha256=JRuq-oRrJfisbN75OnE-ldm6TeYcIc0qYaGVMflbn2g,1610
56
55
  ostk/astrodynamics/test/dynamics/test_tabulated.py,sha256=qFHA7nmcvJtWucpCOYHAFmNRtImhTGlAZ0CHGEadeX8,4029
57
56
  ostk/astrodynamics/test/dynamics/test_third_body_gravity.py,sha256=7xBOKbVio-zZ2-QQaje152cP38n_ALAaR5x6QIdBmXE,1879
@@ -67,26 +66,26 @@ ostk/astrodynamics/test/event_condition/test_real_condition.py,sha256=tle6HVzMFM
67
66
  ostk/astrodynamics/test/flight/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
68
67
  ostk/astrodynamics/test/flight/test_maneuver.py,sha256=HonAvD9qtax72lizoDLR6ELI-poC3LWk_umg-WYygYA,5388
69
68
  ostk/astrodynamics/test/flight/test_profile.py,sha256=V1IekQv7Mju3fMlQZuY4vc1LPNVHsPMtjpT9zI2L_DE,7865
70
- ostk/astrodynamics/test/flight/test_system.py,sha256=MVaE7lJYisH4vmJPD-G-Hw4wNj-Xe8yMksgu8IXCLvg,1322
69
+ ostk/astrodynamics/test/flight/test_system.py,sha256=5kJCULHdpkwAC7i6xLV7vdJnGfOdrOuhi0G22p_L160,1224
71
70
  ostk/astrodynamics/test/flight/system/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
72
- ostk/astrodynamics/test/flight/system/test_propulsion_system.py,sha256=jLUC74YjIQz7APr-kQcdYRYiKm8lfequjosptG29kmI,1964
73
- ostk/astrodynamics/test/flight/system/test_satellite_system.py,sha256=_9r_IgsGGPFTbpJ-6NQ3JU_T8Ac7-WUg-MaEsl6iUqU,2526
71
+ ostk/astrodynamics/test/flight/system/test_propulsion_system.py,sha256=SoxOt-fjHvs_86f6Xb3jAsHDOShJ6Puz7eO5wrqibaM,1835
72
+ ostk/astrodynamics/test/flight/system/test_satellite_system.py,sha256=dCFcl2RKiLxDKLI0sytPBXr3vHOFQIVNNCzpw5WzlAA,2437
74
73
  ostk/astrodynamics/test/flight/system/test_satellite_system_builder.py,sha256=QCk70dPcptvdpWQOxtYR0-iGnlbtOIx2V6oO0UhYIQ0,2426
75
74
  ostk/astrodynamics/test/guidance_law/test_constant_thrust.py,sha256=YpMkMvat4YnE1Fyy5vZ1Sf3VvbvDaC_UvbIKNNCG_B4,2635
76
75
  ostk/astrodynamics/test/guidance_law/test_qlaw.py,sha256=kZaBZeU_J8Qk2nFnnpSuu-2NXT_13g3vLamG--eZfeU,3634
77
76
  ostk/astrodynamics/test/solvers/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
78
- ostk/astrodynamics/test/solvers/test_finite_difference_solver.py,sha256=aJRULoOKIgZhVrqyk1WvyUuRkNeaqozCFGwYAo8nud0,5904
77
+ ostk/astrodynamics/test/solvers/test_finite_difference_solver.py,sha256=0tcarIg2HTpcdzItWlL5Kd6q2nHcDBA8ZE0D3ugUN_s,5953
79
78
  ostk/astrodynamics/test/solvers/test_temporal_condition_solver.py,sha256=OUb7QDwe5WNAtzOLBk-9cBL56PzzadZhXuBo_MiJ2K4,5189
80
79
  ostk/astrodynamics/test/trajectory/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
81
80
  ostk/astrodynamics/test/trajectory/test_local_orbital_frame_direction.py,sha256=d72J50UGG9m0Atei0UQ8sITU1WdJmws5xgUiacLZMbw,2515
82
- ostk/astrodynamics/test/trajectory/test_local_orbital_frame_factory.py,sha256=5N700Dm5r_SYUMq_GPF1csaJX4fpV6yQbUBHaIxjft8,3327
81
+ ostk/astrodynamics/test/trajectory/test_local_orbital_frame_factory.py,sha256=B5N0rIB4R_6t0s9eT_MRrC8-nGD4fRlJi8oETyHHGR8,3356
83
82
  ostk/astrodynamics/test/trajectory/test_model.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
84
83
  ostk/astrodynamics/test/trajectory/test_orbit.py,sha256=vp7gDMtjO7nqERe0yq1OQZ0p4QRtxGTjGKN5-I3LWZM,6739
85
84
  ostk/astrodynamics/test/trajectory/test_propagator.py,sha256=ALjMvzndO9r6dVVXllk0iqu61tEoqu2j25MtzEitDIQ,14076
86
85
  ostk/astrodynamics/test/trajectory/test_segment.py,sha256=aXdF5CpNLwN_hKRU5sG3ID3hJR-NZ1_kgtNA-xHMBkM,12223
87
86
  ostk/astrodynamics/test/trajectory/test_sequence.py,sha256=iCNDDqEGoo4WZIOOov0qKGzrxjg7yWVIk8ajfKMhgI4,14503
88
87
  ostk/astrodynamics/test/trajectory/test_state.py,sha256=8B7KVlxZZPzwwsfCrTudeSkTTC2wAjXcglB0PZdjD1Y,15688
89
- ostk/astrodynamics/test/trajectory/test_state_builder.py,sha256=PSlXtmGURCrlf0w50tn3dEBRo6p0x4NmIF9gJsNOR3k,4782
88
+ ostk/astrodynamics/test/trajectory/test_state_builder.py,sha256=LpCCYdCaLu_D2npm9wgA2sMlcekrtbRqP-afe5IE5L4,4871
90
89
  ostk/astrodynamics/test/trajectory/orbit/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
91
90
  ostk/astrodynamics/test/trajectory/orbit/test_model.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
92
91
  ostk/astrodynamics/test/trajectory/orbit/test_pass.py,sha256=LTHDGW26I0kujifCXFMcUFu9yaHMeUoIM-7jt6kJkJU,2492
@@ -109,24 +108,24 @@ ostk/astrodynamics/test/trajectory/orbit/models/sgp4/__init__.py,sha256=epnVn2Pw
109
108
  ostk/astrodynamics/test/trajectory/orbit/models/sgp4/test_tle.py,sha256=jkyRr5NJQMaSpI3ey7cKcH0E-BlalaUlf_mZPYTSow8,11482
110
109
  ostk/astrodynamics/test/trajectory/state/test_coordinate_broker.py,sha256=ho5FBfB3IvIjfQl7EYoIN1KBuH9lu76IiNMuweq8cqg,2844
111
110
  ostk/astrodynamics/test/trajectory/state/test_coordinate_subset.py,sha256=uSvwLSZ332IreBkHD6PmAF2TFE6g_-o4tRLu9mR-IDg,1580
112
- ostk/astrodynamics/test/trajectory/state/test_numerical_solver.py,sha256=PcLU8XTiDHZ-yplYvHZFX32yTUoua9MhKrMmQPINl9w,9386
111
+ ostk/astrodynamics/test/trajectory/state/test_numerical_solver.py,sha256=0uh87wFRRF7UNh4cSI6WWAcAEF13TY4_VRBJ_gifnyY,9415
113
112
  ostk/astrodynamics/test/trajectory/state/coordinate_subset/test_angular_velocity.py,sha256=xjyGREKpxDuT8gjtBPkV4osfW-6UyWv9hgvBXZVb_wk,625
114
113
  ostk/astrodynamics/test/trajectory/state/coordinate_subset/test_attitude_quaternion.py,sha256=UEu9ApzQLmT87eeISw6_gcHTlX-4b2scIvHz-uE1p_c,393
115
114
  ostk/astrodynamics/test/trajectory/state/coordinate_subset/test_cartesian_acceleration.py,sha256=1p37_FYN85d9SrOqO3iCkNecovJJayhnFeZ4QCOw2ao,3528
116
115
  ostk/astrodynamics/test/trajectory/state/coordinate_subset/test_cartesian_position.py,sha256=XvHdk1KjacTwtkgx2jUAc9I9N3nvjPDv03FAanpv8jQ,2702
117
116
  ostk/astrodynamics/test/trajectory/state/coordinate_subset/test_cartesian_velocity.py,sha256=-kd5TZO5TICihbkqDTew2i_tDpggdpe3Yf23046FATM,3057
118
- ostk/astrodynamics/trajectory/__init__.pyi,sha256=MV0fF6Np4EU02olhB0vouwIAQvSRo1V1oN8_ddlXmhY,76051
117
+ ostk/astrodynamics/trajectory/__init__.pyi,sha256=39XTt6Bx1cHi7--wjSyL6I8xulbjLTZDuwDVlUc1aog,76440
119
118
  ostk/astrodynamics/trajectory/orbit/__init__.pyi,sha256=5tSyJ6obT35BcXW8xQwcUhfTAeM9l9nWm72lAjRE7ik,13235
120
119
  ostk/astrodynamics/trajectory/orbit/message/__init__.pyi,sha256=-GNBlYPrsjelhKxWorYQYhIWzFsibiIQNZvMXjhRpfM,77
121
- ostk/astrodynamics/trajectory/orbit/message/spacex.pyi,sha256=6wzlkRNv2EcDQ6UUCo4lu_OvZJVoYLRibdtDawWBOBc,10809
122
- ostk/astrodynamics/trajectory/orbit/model/__init__.pyi,sha256=wZNe3GAaQAHniqh7Gi6A1k8O17Mmh4acUYFUOAwm6bo,20815
120
+ ostk/astrodynamics/trajectory/orbit/message/spacex.pyi,sha256=TFNTSfGQ4CK6CKCeKwC5s2ul8FCShFE7wMegZTuA5e0,10816
121
+ ostk/astrodynamics/trajectory/orbit/model/__init__.pyi,sha256=RWqYL6g7m7DRPq0vZBIg1pvfmK281eiOGsTcuI71XvM,20850
123
122
  ostk/astrodynamics/trajectory/orbit/model/brouwerLyddaneMean.pyi,sha256=8d-AiwUg-8HgU2m8bnQWetlawuhG7iPLLEeehcgph8k,6030
124
123
  ostk/astrodynamics/trajectory/orbit/model/kepler.pyi,sha256=09xlx_7dTiivctFDyW_37s8pHfxN2Be8qd6HoQz8JxU,26906
125
124
  ostk/astrodynamics/trajectory/orbit/model/sgp4.pyi,sha256=2rxyPPsSCtsEKAShuZQbhZSybK01Q9u1CMieGjwWxN4,14313
126
- ostk/astrodynamics/trajectory/state/__init__.pyi,sha256=GlBeiowveacU8YwZxjpgPX4SR83xooek1yiIJmk2G4k,17644
127
- ostk/astrodynamics/trajectory/state/coordinate_subset.pyi,sha256=8-5nPqRT8thr0n4IENM1N_BxQg3VlnWe8DEBwymcqso,10559
128
- open_space_toolkit_astrodynamics-14.0.0.dist-info/METADATA,sha256=lh84Yr8BJ_4Stj7fvBdGtR_vs1kNkwhZ62feHjKww_4,1913
129
- open_space_toolkit_astrodynamics-14.0.0.dist-info/WHEEL,sha256=esAQ49biZzN3Mxaws3kr8B8Sz08ER9fLpbEMXaWkwRw,110
130
- open_space_toolkit_astrodynamics-14.0.0.dist-info/top_level.txt,sha256=zOR18699uDYnafgarhL8WU_LmTZY_5NVqutv-flp_x4,5
131
- open_space_toolkit_astrodynamics-14.0.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
132
- open_space_toolkit_astrodynamics-14.0.0.dist-info/RECORD,,
125
+ ostk/astrodynamics/trajectory/state/__init__.pyi,sha256=-sq42oF9YgXSkP1LtPcSu7mmtpjUkEzjydD9VYdIQ6g,17672
126
+ ostk/astrodynamics/trajectory/state/coordinate_subset.pyi,sha256=iqoM-8RqiLNIsyiQXLfosvGO7ZP_KdQxrUWqiV04E1c,10566
127
+ open_space_toolkit_astrodynamics-15.1.0.dist-info/METADATA,sha256=52SOCFxHag6hxYwvZmHaYbAds9Sbi7efOiwqvUWHIj8,1913
128
+ open_space_toolkit_astrodynamics-15.1.0.dist-info/WHEEL,sha256=esAQ49biZzN3Mxaws3kr8B8Sz08ER9fLpbEMXaWkwRw,110
129
+ open_space_toolkit_astrodynamics-15.1.0.dist-info/top_level.txt,sha256=zOR18699uDYnafgarhL8WU_LmTZY_5NVqutv-flp_x4,5
130
+ open_space_toolkit_astrodynamics-15.1.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
131
+ open_space_toolkit_astrodynamics-15.1.0.dist-info/RECORD,,
@@ -14,8 +14,8 @@ from ostk import mathematics as OpenSpaceToolkitMathematicsPy
14
14
  from ostk.mathematics import curve_fitting
15
15
  from ostk.mathematics import geometry
16
16
  from ostk.mathematics import object
17
- from ostk import physics as OpenSpaceToolkitPhysicsPy
18
17
  import ostk.physics
18
+ from ostk import physics as OpenSpaceToolkitPhysicsPy
19
19
  from ostk.physics import Environment
20
20
  from ostk.physics import Manager
21
21
  from ostk.physics import Unit
@@ -24,10 +24,10 @@ from ostk.physics import coordinate
24
24
  import ostk.physics.coordinate.spherical
25
25
  from ostk.physics import environment
26
26
  import ostk.physics.environment.object
27
- import ostk.physics.time
28
27
  from ostk.physics import time
29
- import ostk.physics.unit
28
+ import ostk.physics.time
30
29
  from ostk.physics import unit
30
+ import ostk.physics.unit
31
31
  import typing
32
32
  from . import access
33
33
  from . import conjunction
@@ -722,7 +722,7 @@ class Trajectory:
722
722
  def __eq__(self, arg0: Trajectory) -> bool:
723
723
  ...
724
724
  @typing.overload
725
- def __init__(self, model: ...) -> None:
725
+ def __init__(self, model: typing.Any) -> None:
726
726
  """
727
727
  Construct a `Trajectory` object from a model.
728
728
 
@@ -68,7 +68,7 @@ class AccessTarget:
68
68
  def _pybind11_conduit_v1_(*args, **kwargs):
69
69
  ...
70
70
  @staticmethod
71
- def from_lla(visibility_criterion: ..., lla: ostk.physics.coordinate.spherical.LLA, celestial: ostk.physics.environment.object.Celestial) -> AccessTarget:
71
+ def from_lla(visibility_criterion: typing.Any, lla: ostk.physics.coordinate.spherical.LLA, celestial: ostk.physics.environment.object.Celestial) -> AccessTarget:
72
72
  """
73
73
  Create an AccessTarget from latitude, longitude, and altitude (LLA).
74
74
 
@@ -81,7 +81,7 @@ class AccessTarget:
81
81
  AccessTarget: The created AccessTarget instance.
82
82
  """
83
83
  @staticmethod
84
- def from_position(visibility_criterion: ..., position: ostk.physics.coordinate.Position) -> AccessTarget:
84
+ def from_position(visibility_criterion: typing.Any, position: ostk.physics.coordinate.Position) -> AccessTarget:
85
85
  """
86
86
  Create an AccessTarget from a fixed position.
87
87
 
@@ -93,7 +93,7 @@ class AccessTarget:
93
93
  AccessTarget: The created AccessTarget instance.
94
94
  """
95
95
  @staticmethod
96
- def from_trajectory(visibility_criterion: ..., trajectory: ostk.astrodynamics.Trajectory) -> AccessTarget:
96
+ def from_trajectory(visibility_criterion: typing.Any, trajectory: ostk.astrodynamics.Trajectory) -> AccessTarget:
97
97
  """
98
98
  Create an AccessTarget from a trajectory.
99
99
 
@@ -168,7 +168,7 @@ class CDM:
168
168
  @staticmethod
169
169
  def _pybind11_conduit_v1_(*args, **kwargs):
170
170
  ...
171
- def __init__(self, ccsds_cdm_version: ostk.core.type.String, comment: ostk.core.type.String = ..., creation_date: ostk.physics.time.Instant, originator: ostk.core.type.String, message_for: ostk.core.type.String = ..., message_id: ostk.core.type.String) -> None:
171
+ def __init__(self, *, ccsds_cdm_version: ostk.core.type.String, comment: ostk.core.type.String = ..., creation_date: ostk.physics.time.Instant, originator: ostk.core.type.String, message_for: ostk.core.type.String = ..., message_id: ostk.core.type.String) -> None:
172
172
  """
173
173
  Constructor.
174
174
 
@@ -222,7 +222,7 @@ class CDM:
222
222
  @staticmethod
223
223
  def _pybind11_conduit_v1_(*args, **kwargs):
224
224
  ...
225
- def __init__(self, comment: ostk.core.type.String = ..., object: ostk.core.type.String, object_designator: ostk.core.type.Integer, catalog_name: ostk.core.type.String = ..., object_name: ostk.core.type.String, international_designator: ostk.core.type.String, object_type: CDM.ObjectType, operator_contact_position: ostk.core.type.String = ..., operator_organization: ostk.core.type.String = ..., operator_phone: ostk.core.type.String = ..., operator_email: ostk.core.type.String = ..., ephemeris_name: ostk.core.type.String, covariance_method: ostk.core.type.String, maneuverable: ostk.core.type.String, orbit_center: ostk.core.type.String = ..., reference_frame: ostk.core.type.String, gravity_model: ostk.core.type.String = ..., atmospheric_model: ostk.core.type.String = ..., n_body_perturbations: ostk.core.type.String = ..., solar_radiation_pressure: bool = False, earth_tides: bool = False, in_track_thrust: bool = False) -> None:
225
+ def __init__(self, *, comment: ostk.core.type.String = ..., object: ostk.core.type.String, object_designator: ostk.core.type.Integer, catalog_name: ostk.core.type.String = ..., object_name: ostk.core.type.String, international_designator: ostk.core.type.String, object_type: CDM.ObjectType, operator_contact_position: ostk.core.type.String = ..., operator_organization: ostk.core.type.String = ..., operator_phone: ostk.core.type.String = ..., operator_email: ostk.core.type.String = ..., ephemeris_name: ostk.core.type.String, covariance_method: ostk.core.type.String, maneuverable: ostk.core.type.String, orbit_center: ostk.core.type.String = ..., reference_frame: ostk.core.type.String, gravity_model: ostk.core.type.String = ..., atmospheric_model: ostk.core.type.String = ..., n_body_perturbations: ostk.core.type.String = ..., solar_radiation_pressure: bool = False, earth_tides: bool = False, in_track_thrust: bool = False) -> None:
226
226
  """
227
227
  Constructor.
228
228
 
@@ -425,7 +425,7 @@ class CDM:
425
425
  @staticmethod
426
426
  def _pybind11_conduit_v1_(*args, **kwargs):
427
427
  ...
428
- def __init__(self, comment: ostk.core.type.String = ..., time_of_closest_approach: ostk.physics.time.Instant, miss_distance: ostk.physics.unit.Length, relative_position: ostk.physics.coordinate.Position = ..., relative_velocity: ostk.physics.coordinate.Velocity = ..., start_screen_period: ostk.physics.time.Instant, end_screen_period: ostk.physics.time.Instant, screen_volume_frame: ostk.core.type.String = ..., screen_volume_shape: ostk.core.type.String = ..., screen_volume_x: ostk.core.type.Real = ..., screen_volume_y: ostk.core.type.Real = ..., screen_volume_z: ostk.core.type.Real = ..., screen_entry_time: ostk.physics.time.Instant, screen_exit_time: ostk.physics.time.Instant, collision_probability: ostk.core.type.Real, collision_probability_method: ostk.core.type.String) -> None:
428
+ def __init__(self, *, comment: ostk.core.type.String = ..., time_of_closest_approach: ostk.physics.time.Instant, miss_distance: ostk.physics.unit.Length, relative_position: ostk.physics.coordinate.Position = ..., relative_velocity: ostk.physics.coordinate.Velocity = ..., start_screen_period: ostk.physics.time.Instant, end_screen_period: ostk.physics.time.Instant, screen_volume_frame: ostk.core.type.String = ..., screen_volume_shape: ostk.core.type.String = ..., screen_volume_x: ostk.core.type.Real = ..., screen_volume_y: ostk.core.type.Real = ..., screen_volume_z: ostk.core.type.Real = ..., screen_entry_time: ostk.physics.time.Instant, screen_exit_time: ostk.physics.time.Instant, collision_probability: ostk.core.type.Real, collision_probability_method: ostk.core.type.String) -> None:
429
429
  """
430
430
  Constructor.
431
431
 
@@ -579,7 +579,7 @@ class CDM:
579
579
  Returns:
580
580
  CDM: An undefined CDM.
581
581
  """
582
- def __init__(self, header: ..., relative_metadata: ..., objects_metadata_array: list[...], objects_data_array: list[...]) -> None:
582
+ def __init__(self, header: typing.Any, relative_metadata: typing.Any, objects_metadata_array: list[...], objects_data_array: list[...]) -> None:
583
583
  """
584
584
  Constructor.
585
585
 
@@ -281,7 +281,7 @@ class Thruster(ostk.astrodynamics.Dynamics):
281
281
  @staticmethod
282
282
  def _pybind11_conduit_v1_(*args, **kwargs):
283
283
  ...
284
- def __init__(self, satellite_system: ostk.astrodynamics.flight.system.SatelliteSystem, guidance_law: ..., name: ostk.core.type.String = ...) -> None:
284
+ def __init__(self, satellite_system: ostk.astrodynamics.flight.system.SatelliteSystem, guidance_law: typing.Any, name: ostk.core.type.String = ...) -> None:
285
285
  """
286
286
  Constructor.
287
287
 
@@ -420,7 +420,7 @@ class Profile:
420
420
  Returns:
421
421
  Profile: The undefined profile.
422
422
  """
423
- def __init__(self, model: ...) -> None:
423
+ def __init__(self, model: typing.Any) -> None:
424
424
  """
425
425
  Constructor.
426
426
 
@@ -97,7 +97,7 @@ class FiniteDifferenceSolver:
97
97
  ...
98
98
  def __str__(self) -> str:
99
99
  ...
100
- def compute_gradient(self, state: ..., generate_state_coordinates: typing.Callable[[..., ostk.physics.time.Instant], numpy.ndarray[numpy.float64[m, 1]]]) -> numpy.ndarray[numpy.float64[m, 1]]:
100
+ def compute_gradient(self, state: typing.Any, generate_state_coordinates: typing.Callable[[..., ostk.physics.time.Instant], numpy.ndarray[numpy.float64[m, 1]]]) -> numpy.ndarray[numpy.float64[m, 1]]:
101
101
  """
102
102
  Compute the gradient.
103
103
 
@@ -108,7 +108,7 @@ class FiniteDifferenceSolver:
108
108
  Returns:
109
109
  np.array: The gradient.
110
110
  """
111
- def compute_jacobian(self, state: ..., generate_state_coordinates: typing.Callable[[..., ostk.physics.time.Instant], numpy.ndarray[numpy.float64[m, 1]]]) -> numpy.ndarray[numpy.float64[m, n]]:
111
+ def compute_jacobian(self, state: typing.Any, generate_state_coordinates: typing.Callable[[..., ostk.physics.time.Instant], numpy.ndarray[numpy.float64[m, 1]]]) -> numpy.ndarray[numpy.float64[m, n]]:
112
112
  """
113
113
  Compute the jacobian.
114
114
 
@@ -120,7 +120,7 @@ class FiniteDifferenceSolver:
120
120
  np.array: The jacobian.
121
121
  """
122
122
  @typing.overload
123
- def compute_state_transition_matrix(self, state: ..., instants: list[ostk.physics.time.Instant], generate_states_coordinates: typing.Callable[[..., list[ostk.physics.time.Instant]], numpy.ndarray[numpy.float64[m, n]]]) -> list[numpy.ndarray[numpy.float64[m, n]]]:
123
+ def compute_state_transition_matrix(self, state: typing.Any, instants: list[ostk.physics.time.Instant], generate_states_coordinates: typing.Callable[[..., list[ostk.physics.time.Instant]], numpy.ndarray[numpy.float64[m, n]]]) -> list[numpy.ndarray[numpy.float64[m, n]]]:
124
124
  """
125
125
  Compute a list of state transition matrix (STM) at the provided instants.
126
126
 
@@ -133,7 +133,7 @@ class FiniteDifferenceSolver:
133
133
  np.array: The list of state transition matrices.
134
134
  """
135
135
  @typing.overload
136
- def compute_state_transition_matrix(self, state: ..., instant: ostk.physics.time.Instant, generate_state_coordinates: typing.Callable[[..., ostk.physics.time.Instant], numpy.ndarray[numpy.float64[m, 1]]]) -> numpy.ndarray[numpy.float64[m, n]]:
136
+ def compute_state_transition_matrix(self, state: typing.Any, instant: ostk.physics.time.Instant, generate_state_coordinates: typing.Callable[[..., ostk.physics.time.Instant], numpy.ndarray[numpy.float64[m, 1]]]) -> numpy.ndarray[numpy.float64[m, n]]:
137
137
  """
138
138
  Compute the state transition matrix (STM).
139
139
 
@@ -21,7 +21,7 @@ def environment() -> Environment:
21
21
  @pytest.fixture
22
22
  def dynamics(name: str) -> Dynamics:
23
23
  class MyDynamics(Dynamics):
24
- def is_defined():
24
+ def is_defined(self):
25
25
  return True
26
26
 
27
27
  def get_read_coordinate_subsets(self):
@@ -2,17 +2,8 @@
2
2
 
3
3
  import pytest
4
4
 
5
- import numpy as np
6
-
7
- import ostk.mathematics as mathematics
8
-
9
- import ostk.physics as physics
10
-
11
- import ostk.astrodynamics as astrodynamics
12
-
13
- Mass = physics.unit.Mass
14
-
15
- PropulsionSystem = astrodynamics.flight.system.PropulsionSystem
5
+ from ostk.physics.unit import Mass
6
+ from ostk.astrodynamics.flight.system import PropulsionSystem
16
7
 
17
8
 
18
9
  @pytest.fixture
@@ -4,20 +4,12 @@ import pytest
4
4
 
5
5
  import numpy as np
6
6
 
7
- import ostk.mathematics as mathematics
8
-
9
- import ostk.physics as physics
10
-
11
- import ostk.astrodynamics as astrodynamics
12
-
13
- Cuboid = mathematics.geometry.d3.object.Cuboid
14
- Composite = mathematics.geometry.d3.object.Composite
15
- Point = mathematics.geometry.d3.object.Point
16
-
17
- Mass = physics.unit.Mass
18
-
19
- SatelliteSystem = astrodynamics.flight.system.SatelliteSystem
20
- PropulsionSystem = astrodynamics.flight.system.PropulsionSystem
7
+ from ostk.mathematics.geometry.d3.object import Cuboid
8
+ from ostk.mathematics.geometry.d3.object import Composite
9
+ from ostk.mathematics.geometry.d3.object import Point
10
+ from ostk.physics.unit import Mass
11
+ from ostk.astrodynamics.flight.system import SatelliteSystem
12
+ from ostk.astrodynamics.flight.system import PropulsionSystem
21
13
 
22
14
 
23
15
  @pytest.fixture
@@ -2,21 +2,11 @@
2
2
 
3
3
  import pytest
4
4
 
5
- import numpy as np
6
-
7
- import ostk.mathematics as mathematics
8
-
9
- import ostk.physics as physics
10
-
11
- import ostk.astrodynamics as astrodynamics
12
-
13
- Cuboid = mathematics.geometry.d3.object.Cuboid
14
- Composite = mathematics.geometry.d3.object.Composite
15
- Point = mathematics.geometry.d3.object.Point
16
-
17
- Mass = physics.unit.Mass
18
-
19
- System = astrodynamics.flight.System
5
+ from ostk.mathematics.geometry.d3.object import Cuboid
6
+ from ostk.mathematics.geometry.d3.object import Composite
7
+ from ostk.mathematics.geometry.d3.object import Point
8
+ from ostk.physics.unit import Mass
9
+ from ostk.astrodynamics.flight import System
20
10
 
21
11
 
22
12
  @pytest.fixture
@@ -1,5 +1,7 @@
1
1
  # Apache License 2.0
2
2
 
3
+ from typing import Callable
4
+
3
5
  import pytest
4
6
  import math
5
7
 
@@ -71,7 +73,7 @@ def instants(initial_instant: Instant) -> list[Instant]:
71
73
 
72
74
 
73
75
  @pytest.fixture
74
- def generate_states_coordinates() -> callable:
76
+ def generate_states_coordinates() -> Callable:
75
77
  def state_fn(state, instants) -> np.ndarray:
76
78
  x0: float = state.get_coordinates()[0]
77
79
  v0: float = state.get_coordinates()[1]
@@ -84,7 +86,7 @@ def generate_states_coordinates() -> callable:
84
86
  x: float = x0 * math.cos(omega * t) + v0 / omega * math.sin(omega * t)
85
87
  v: float = -x0 * omega * math.sin(omega * t) + v0 * math.cos(omega * t)
86
88
 
87
- coordinates: list[float] = np.array([x, v])
89
+ coordinates: list[float] = list(np.array([x, v]).astype(float))
88
90
 
89
91
  states_coordinates.append(coordinates)
90
92
 
@@ -94,7 +96,7 @@ def generate_states_coordinates() -> callable:
94
96
 
95
97
 
96
98
  @pytest.fixture
97
- def generate_state_coordinates() -> callable:
99
+ def generate_state_coordinates() -> Callable:
98
100
  def state_fn(state, instant) -> np.ndarray:
99
101
  x0: float = state.get_coordinates()[0]
100
102
  v0: float = state.get_coordinates()[1]
@@ -131,7 +133,7 @@ class TestFiniteDifferenceSolver:
131
133
  finite_difference_solver: FiniteDifferenceSolver,
132
134
  state: State,
133
135
  instants: list[Instant],
134
- generate_states_coordinates: callable,
136
+ generate_states_coordinates: Callable,
135
137
  ):
136
138
  stms: list[np.ndarray] = finite_difference_solver.compute_state_transition_matrix(
137
139
  state=state,
@@ -150,7 +152,7 @@ class TestFiniteDifferenceSolver:
150
152
  self,
151
153
  finite_difference_solver: FiniteDifferenceSolver,
152
154
  state: State,
153
- generate_state_coordinates: callable,
155
+ generate_state_coordinates: Callable,
154
156
  instant: Instant,
155
157
  ):
156
158
  stm: np.ndarray = finite_difference_solver.compute_state_transition_matrix(
@@ -168,7 +170,7 @@ class TestFiniteDifferenceSolver:
168
170
  self,
169
171
  finite_difference_solver: FiniteDifferenceSolver,
170
172
  state: State,
171
- generate_state_coordinates: callable,
173
+ generate_state_coordinates: Callable,
172
174
  ):
173
175
  gradient = finite_difference_solver.compute_gradient(
174
176
  state=state,
@@ -181,7 +183,7 @@ class TestFiniteDifferenceSolver:
181
183
  self,
182
184
  finite_difference_solver: FiniteDifferenceSolver,
183
185
  state: State,
184
- generate_state_coordinates: callable,
186
+ generate_state_coordinates: Callable,
185
187
  ):
186
188
  gradient = finite_difference_solver.compute_jacobian(
187
189
  state=state,
@@ -1,5 +1,7 @@
1
1
  # Apache License 2.0
2
2
 
3
+ from typing import Callable
4
+
3
5
  import pytest
4
6
 
5
7
  from ostk.physics.time import Instant
@@ -15,7 +17,7 @@ def name() -> str:
15
17
 
16
18
 
17
19
  @pytest.fixture
18
- def evaluator() -> callable:
20
+ def evaluator() -> Callable:
19
21
  return lambda state: 5.0
20
22
 
21
23
 
@@ -31,7 +33,7 @@ def target(target_value: float) -> EventCondition.Target:
31
33
 
32
34
  @pytest.fixture
33
35
  def event_condition(
34
- name: str, evaluator: callable, target: EventCondition.Target
36
+ name: str, evaluator: Callable, target: EventCondition.Target
35
37
  ) -> EventCondition:
36
38
  class MyEventCondition(EventCondition):
37
39
  def is_satisfied(
@@ -61,7 +61,7 @@ class TestUtility:
61
61
  position: Position,
62
62
  environment: Environment,
63
63
  ):
64
- time_lla_aer: float[datetime, float, float, float, float, float, float] = (
64
+ time_lla_aer: tuple[datetime, float, float, float, float, float, float] = (
65
65
  utilities.compute_time_lla_aer_coordinates(state, position, environment)
66
66
  )
67
67
 
@@ -36,6 +36,24 @@ def orbit(environment: Environment) -> Orbit:
36
36
  )
37
37
 
38
38
 
39
+ @pytest.fixture
40
+ def orbits(environment: Environment) -> list[Orbit]:
41
+ return [
42
+ Orbit.sun_synchronous(
43
+ epoch=Instant.date_time(DateTime(2020, 1, 1, 0, 0, 0), Scale.UTC),
44
+ altitude=Length.kilometers(500.0),
45
+ local_time_at_descending_node=Time(14, 0, 0),
46
+ celestial_object=environment.access_celestial_object_with_name("Earth"),
47
+ ),
48
+ Orbit.sun_synchronous(
49
+ epoch=Instant.date_time(DateTime(2020, 1, 1, 0, 0, 0), Scale.UTC),
50
+ altitude=Length.kilometers(500.0),
51
+ local_time_at_descending_node=Time(12, 0, 0),
52
+ celestial_object=environment.access_celestial_object_with_name("Earth"),
53
+ ),
54
+ ]
55
+
56
+
39
57
  @pytest.fixture
40
58
  def profile(orbit: Orbit) -> Profile:
41
59
  return Profile.local_orbital_frame_pointing(
@@ -56,6 +74,8 @@ def interval() -> Interval:
56
74
  def viewer(interval: Interval) -> Viewer:
57
75
  return Viewer(
58
76
  interval=interval,
77
+ zoom_to_entity=False,
78
+ track_entity=False,
59
79
  )
60
80
 
61
81
 
@@ -74,6 +94,50 @@ class TestViewer:
74
94
  assert "var widget = new Cesium.Viewer" in rendered_html
75
95
  assert rendered_html.endswith("</script>")
76
96
 
97
+ def test_add_orbit_success(
98
+ self,
99
+ viewer: Viewer,
100
+ orbit: Orbit,
101
+ ):
102
+ viewer.add_orbit(
103
+ orbit=orbit,
104
+ step=Duration.seconds(5.0),
105
+ show_orbital_track=True,
106
+ )
107
+
108
+ rendered_html: str = viewer.render()
109
+
110
+ assert rendered_html.startswith('<meta charset="utf-8">')
111
+ assert "var widget = new Cesium.Viewer" in rendered_html
112
+ assert "new Cesium.SampledProperty(Cesium.Cartesian3)" in rendered_html
113
+ assert " widget.entities.add({position: widget" in rendered_html
114
+ assert "widget.entities.add({polyline:" in rendered_html
115
+ assert "billboard: {image:" in rendered_html
116
+ assert rendered_html.endswith("</script>")
117
+
118
+ def test_add_orbit_multiple_success(
119
+ self,
120
+ viewer: Viewer,
121
+ orbits: list[Orbit],
122
+ ):
123
+ for i, orbit in enumerate(orbits):
124
+ viewer.add_orbit(
125
+ orbit=orbit,
126
+ step=Duration.seconds(5.0),
127
+ show_orbital_track=True,
128
+ name=f"Satellite {i}",
129
+ )
130
+
131
+ rendered_html: str = viewer.render()
132
+
133
+ assert rendered_html.startswith('<meta charset="utf-8">')
134
+ assert "var widget = new Cesium.Viewer" in rendered_html
135
+ assert "new Cesium.SampledProperty(Cesium.Cartesian3)" in rendered_html
136
+ assert " widget.entities.add({position: widget" in rendered_html
137
+ assert "widget.entities.add({polyline:" in rendered_html
138
+ assert "billboard: {image:" in rendered_html
139
+ assert rendered_html.endswith("</script>")
140
+
77
141
  def test_add_profile_success(
78
142
  self,
79
143
  viewer: Viewer,
@@ -1,5 +1,7 @@
1
1
  # Apache License 2.0
2
2
 
3
+ from typing import Callable
4
+
3
5
  import pytest
4
6
 
5
7
  import numpy as np
@@ -99,7 +101,7 @@ def absolute_tolerance() -> float:
99
101
 
100
102
 
101
103
  @pytest.fixture
102
- def state_logger() -> callable:
104
+ def state_logger() -> Callable:
103
105
  def log_state(state: State) -> None:
104
106
  print(state.get_coordinates())
105
107
 
@@ -255,7 +257,7 @@ class TestNumericalSolver:
255
257
  def test_integrate_conditional_with_logger(
256
258
  self,
257
259
  initial_state: State,
258
- state_logger: callable,
260
+ state_logger: Callable,
259
261
  custom_condition: RealCondition,
260
262
  capsys,
261
263
  ):
@@ -1,5 +1,7 @@
1
1
  # Apache License 2.0
2
2
 
3
+ from typing import Callable
4
+
3
5
  import pytest
4
6
 
5
7
  from ostk.physics.time import Instant
@@ -26,7 +28,7 @@ def local_orbital_transform_provider_type() -> LocalOrbitalFrameTransformProvide
26
28
 
27
29
 
28
30
  @pytest.fixture
29
- def transform_generator() -> callable:
31
+ def transform_generator() -> Callable:
30
32
  return lambda state: Transform.identity(Transform.Type.passive)
31
33
 
32
34
 
@@ -107,7 +109,7 @@ class TestLocalOrbitalFrameFactory:
107
109
 
108
110
  def test_custom_constructor(
109
111
  self,
110
- transform_generator: callable,
112
+ transform_generator: Callable,
111
113
  parent_frame: Frame,
112
114
  ):
113
115
  assert (
@@ -169,3 +169,4 @@ class TestStateBuilder:
169
169
  ):
170
170
  assert state_builder.get_frame() == frame
171
171
  assert state_builder.get_coordinate_subsets() == coordinate_broker.get_subsets()
172
+ assert state_builder.get_size() == coordinate_broker.get_number_of_coordinates()
@@ -185,7 +185,7 @@ class LocalOrbitalFrameFactory:
185
185
  Returns:
186
186
  Frame: The parent frame.
187
187
  """
188
- def generate_frame(self, state: ...) -> ostk.physics.coordinate.Frame:
188
+ def generate_frame(self, state: typing.Any) -> ostk.physics.coordinate.Frame:
189
189
  """
190
190
  Generate a local orbital frame.
191
191
 
@@ -276,7 +276,7 @@ class LocalOrbitalFrameTransformProvider:
276
276
  def _pybind11_conduit_v1_(*args, **kwargs):
277
277
  ...
278
278
  @staticmethod
279
- def construct(type: LocalOrbitalFrameTransformProvider.Type, state: ...) -> LocalOrbitalFrameTransformProvider:
279
+ def construct(type: LocalOrbitalFrameTransformProvider.Type, state: typing.Any) -> LocalOrbitalFrameTransformProvider:
280
280
  """
281
281
  Constructs a local orbital frame transform provider for the provided type.
282
282
 
@@ -486,7 +486,7 @@ class Orbit(ostk.astrodynamics.Trajectory):
486
486
  list[tuple[int, Pass]]: List of index-pass pairs.
487
487
  """
488
488
  @staticmethod
489
- def compute_passes_with_model(model: ..., start_instant: ostk.physics.time.Instant, end_instant: ostk.physics.time.Instant, initial_revolution_number: ostk.core.type.Integer) -> list[...]:
489
+ def compute_passes_with_model(model: typing.Any, start_instant: ostk.physics.time.Instant, end_instant: ostk.physics.time.Instant, initial_revolution_number: ostk.core.type.Integer) -> list[...]:
490
490
  """
491
491
  Compute passes with the given model for the provided interval.
492
492
 
@@ -590,7 +590,7 @@ class Orbit(ostk.astrodynamics.Trajectory):
590
590
  def __eq__(self, arg0: Orbit) -> bool:
591
591
  ...
592
592
  @typing.overload
593
- def __init__(self, model: ..., celestial_object: ostk.physics.environment.object.Celestial) -> None:
593
+ def __init__(self, model: typing.Any, celestial_object: ostk.physics.environment.object.Celestial) -> None:
594
594
  """
595
595
  Constructs an `Orbit` object.
596
596
 
@@ -792,14 +792,14 @@ class Propagator:
792
792
  Returns:
793
793
  NumericalSolver&: The numerical solver.
794
794
  """
795
- def add_dynamics(self, dynamics: ...) -> None:
795
+ def add_dynamics(self, dynamics: typing.Any) -> None:
796
796
  """
797
797
  Add dynamics.
798
798
 
799
799
  Args:
800
800
  dynamics (Dynamics) The dynamics.
801
801
  """
802
- def add_maneuver(self, maneuver: ..., interpolation_type: ostk.mathematics.curve_fitting.Interpolator.Type = ...) -> None:
802
+ def add_maneuver(self, maneuver: typing.Any, interpolation_type: ostk.mathematics.curve_fitting.Interpolator.Type = ...) -> None:
803
803
  """
804
804
  Add a maneuver.
805
805
 
@@ -818,7 +818,7 @@ class Propagator:
818
818
  Returns:
819
819
  State: The state at the given instant.
820
820
  """
821
- def calculate_state_to_condition(self, state: State, instant: ostk.physics.time.Instant, event_condition: ...) -> state.NumericalSolver.ConditionSolution:
821
+ def calculate_state_to_condition(self, state: State, instant: ostk.physics.time.Instant, event_condition: typing.Any) -> state.NumericalSolver.ConditionSolution:
822
822
  """
823
823
  Calculate the state up to a given event condition.
824
824
 
@@ -890,7 +890,7 @@ class Segment:
890
890
  @staticmethod
891
891
  def _pybind11_conduit_v1_(*args, **kwargs):
892
892
  ...
893
- def __init__(self, name: ostk.core.type.String, dynamics: list[...], states: list[State], condition_is_satisfied: bool, segment_type: ...) -> None:
893
+ def __init__(self, name: ostk.core.type.String, dynamics: list[...], states: list[State], condition_is_satisfied: bool, segment_type: typing.Any) -> None:
894
894
  """
895
895
  Construct a Segment Solution.
896
896
 
@@ -964,7 +964,7 @@ class Segment:
964
964
  Returns:
965
965
  dict[Dynamics, np.ndarray]: The list of matrices with individual dynamics contributions.
966
966
  """
967
- def get_dynamics_acceleration_contribution(self, dynamics: ..., frame: ostk.physics.coordinate.Frame) -> numpy.ndarray[numpy.float64[m, n]]:
967
+ def get_dynamics_acceleration_contribution(self, dynamics: typing.Any, frame: ostk.physics.coordinate.Frame) -> numpy.ndarray[numpy.float64[m, n]]:
968
968
  """
969
969
  Compute the contribution of the provided dynamics to the acceleration in the provided frame for all states associated with the segment.
970
970
 
@@ -975,7 +975,7 @@ class Segment:
975
975
  Returns:
976
976
  np.ndarray: The matrix of dynamics contributions to acceleration.
977
977
  """
978
- def get_dynamics_contribution(self, dynamics: ..., frame: ostk.physics.coordinate.Frame, coordinate_subsets: list[state.CoordinateSubset] = []) -> numpy.ndarray[numpy.float64[m, n]]:
978
+ def get_dynamics_contribution(self, dynamics: typing.Any, frame: ostk.physics.coordinate.Frame, coordinate_subsets: list[state.CoordinateSubset] = []) -> numpy.ndarray[numpy.float64[m, n]]:
979
979
  """
980
980
  Compute the contribution of the provided dynamics in the provided frame for all states associated with the segment.
981
981
 
@@ -1098,7 +1098,7 @@ class Segment:
1098
1098
  def _pybind11_conduit_v1_(*args, **kwargs):
1099
1099
  ...
1100
1100
  @staticmethod
1101
- def coast(name: ostk.core.type.String, event_condition: ..., dynamics: list[...], numerical_solver: state.NumericalSolver) -> Segment:
1101
+ def coast(name: ostk.core.type.String, event_condition: typing.Any, dynamics: list[...], numerical_solver: state.NumericalSolver) -> Segment:
1102
1102
  """
1103
1103
  Create a coast segment.
1104
1104
 
@@ -1112,7 +1112,7 @@ class Segment:
1112
1112
  Segment: The coast segment.
1113
1113
  """
1114
1114
  @staticmethod
1115
- def maneuver(name: ostk.core.type.String, event_condition: ..., thruster_dynamics: ..., dynamics: list[...], numerical_solver: state.NumericalSolver) -> Segment:
1115
+ def maneuver(name: ostk.core.type.String, event_condition: typing.Any, thruster_dynamics: typing.Any, dynamics: list[...], numerical_solver: state.NumericalSolver) -> Segment:
1116
1116
  """
1117
1117
  Create a maneuver segment.
1118
1118
 
@@ -1320,14 +1320,14 @@ class Sequence:
1320
1320
  ...
1321
1321
  def __str__(self: typing.Sequence) -> str:
1322
1322
  ...
1323
- def add_coast_segment(self: typing.Sequence, event_condition: ...) -> None:
1323
+ def add_coast_segment(self: typing.Sequence, event_condition: typing.Any) -> None:
1324
1324
  """
1325
1325
  Add a coast segment.
1326
1326
 
1327
1327
  Args:
1328
1328
  event_condition (EventCondition): The event condition.
1329
1329
  """
1330
- def add_maneuver_segment(self: typing.Sequence, event_condition: ..., thruster_dynamics: ...) -> None:
1330
+ def add_maneuver_segment(self: typing.Sequence, event_condition: typing.Any, thruster_dynamics: typing.Any) -> None:
1331
1331
  """
1332
1332
  Add a maneuver segment.
1333
1333
 
@@ -1388,7 +1388,7 @@ class Sequence:
1388
1388
  Returns:
1389
1389
  SequenceSolution: The sequence solution.
1390
1390
  """
1391
- def solve_to_condition(self: typing.Sequence, state: State, event_condition: ..., maximum_propagation_duration_limit: ostk.physics.time.Duration = ...) -> Sequence.Solution:
1391
+ def solve_to_condition(self: typing.Sequence, state: State, event_condition: typing.Any, maximum_propagation_duration_limit: ostk.physics.time.Duration = ...) -> Sequence.Solution:
1392
1392
  """
1393
1393
  Solve the sequence until the event condition is met.
1394
1394
 
@@ -1500,7 +1500,7 @@ class State:
1500
1500
  attitude_frame (Frame): The attitude reference frame
1501
1501
  """
1502
1502
  @typing.overload
1503
- def __init__(self, instant: ostk.physics.time.Instant, coordinates: numpy.ndarray[numpy.float64[m, 1]], frame: ostk.physics.coordinate.Frame, coordinate_broker: ...) -> None:
1503
+ def __init__(self, instant: ostk.physics.time.Instant, coordinates: numpy.ndarray[numpy.float64[m, 1]], frame: ostk.physics.coordinate.Frame, coordinate_broker: typing.Any) -> None:
1504
1504
  """
1505
1505
  Constructor with a pre-defined Coordinates Broker.
1506
1506
 
@@ -1532,7 +1532,7 @@ class State:
1532
1532
  ...
1533
1533
  def __sub__(self, arg0: State) -> State:
1534
1534
  ...
1535
- def extract_coordinate(self, coordinate_subset: ...) -> numpy.ndarray[numpy.float64[m, 1]]:
1535
+ def extract_coordinate(self, coordinate_subset: typing.Any) -> numpy.ndarray[numpy.float64[m, 1]]:
1536
1536
  """
1537
1537
  Extract the coordinates associated to a subset of the state.
1538
1538
 
@@ -1615,7 +1615,7 @@ class State:
1615
1615
  Returns:
1616
1616
  Velocity: The velocity of the state.
1617
1617
  """
1618
- def has_subset(self, subset: ...) -> bool:
1618
+ def has_subset(self, subset: typing.Any) -> bool:
1619
1619
  """
1620
1620
  Check if the state has a given subset.
1621
1621
 
@@ -1647,7 +1647,6 @@ class StateBuilder:
1647
1647
 
1648
1648
  This class makes it convenient to build a `State` object.
1649
1649
 
1650
-
1651
1650
  """
1652
1651
  __hash__: typing.ClassVar[None] = None
1653
1652
  @staticmethod
@@ -1688,7 +1687,7 @@ class StateBuilder:
1688
1687
  coordinate_subsets list[CoordinateSubset]: The coordinate subsets.
1689
1688
 
1690
1689
  Returns:
1691
- StateBuilder
1690
+ StateBuilder
1692
1691
  """
1693
1692
  @typing.overload
1694
1693
  def __init__(self, frame: ostk.physics.coordinate.Frame, coordinate_broker: state.CoordinateBroker) -> None:
@@ -1777,6 +1776,13 @@ class StateBuilder:
1777
1776
  Returns:
1778
1777
  Frame: The reference frame of the `StateBuilder`.
1779
1778
  """
1779
+ def get_size(self) -> int:
1780
+ """
1781
+ Get the total size of all coordinates from all subsets.
1782
+
1783
+ Returns:
1784
+ Size: The total size of all coordinates from all subsets.
1785
+ """
1780
1786
  def is_defined(self) -> bool:
1781
1787
  """
1782
1788
  Check if the `StateBuilder` is defined.
@@ -222,7 +222,7 @@ class OPM:
222
222
  Returns:
223
223
  opm (OPM): An undefined OPM message.
224
224
  """
225
- def __init__(self, header: ..., deployments: list[...]) -> None:
225
+ def __init__(self, header: typing.Any, deployments: list[...]) -> None:
226
226
  """
227
227
  Constructor.
228
228
 
@@ -148,7 +148,7 @@ class Kepler(ostk.astrodynamics.trajectory.orbit.OrbitModel):
148
148
  def __eq__(self, arg0: Kepler) -> bool:
149
149
  ...
150
150
  @typing.overload
151
- def __init__(self, coe: ..., epoch: ostk.physics.time.Instant, gravitational_parameter: ostk.physics.unit.Derived, equatorial_radius: ostk.physics.unit.Length, j2: ostk.core.type.Real, j4: ostk.core.type.Real, perturbation_type: Kepler.PerturbationType) -> None:
151
+ def __init__(self, coe: typing.Any, epoch: ostk.physics.time.Instant, gravitational_parameter: ostk.physics.unit.Derived, equatorial_radius: ostk.physics.unit.Length, j2: ostk.core.type.Real, j4: ostk.core.type.Real, perturbation_type: Kepler.PerturbationType) -> None:
152
152
  """
153
153
  Constructor.
154
154
 
@@ -162,7 +162,7 @@ class Kepler(ostk.astrodynamics.trajectory.orbit.OrbitModel):
162
162
  perturbation_type (PerturbationType): The perturbation type.
163
163
  """
164
164
  @typing.overload
165
- def __init__(self, coe: ..., epoch: ostk.physics.time.Instant, celestial_object: ostk.physics.environment.object.Celestial, perturbation_type: Kepler.PerturbationType, in_fixed_frame: bool = False) -> None:
165
+ def __init__(self, coe: typing.Any, epoch: ostk.physics.time.Instant, celestial_object: ostk.physics.environment.object.Celestial, perturbation_type: Kepler.PerturbationType, in_fixed_frame: bool = False) -> None:
166
166
  """
167
167
  Constructor.
168
168
 
@@ -278,7 +278,7 @@ class Propagated(ostk.astrodynamics.trajectory.orbit.OrbitModel):
278
278
  def __eq__(self, arg0: Propagated) -> bool:
279
279
  ...
280
280
  @typing.overload
281
- def __init__(self, propagator: ..., state: ostk.astrodynamics.trajectory.State, initial_revolution_number: ostk.core.type.Integer = 1) -> None:
281
+ def __init__(self, propagator: typing.Any, state: ostk.astrodynamics.trajectory.State, initial_revolution_number: ostk.core.type.Integer = 1) -> None:
282
282
  """
283
283
  Constructor.
284
284
 
@@ -288,7 +288,7 @@ class Propagated(ostk.astrodynamics.trajectory.orbit.OrbitModel):
288
288
  initial_revolution_number (int, optional): The initial revolution number. Defaults to 1.
289
289
  """
290
290
  @typing.overload
291
- def __init__(self, propagator: ..., state_array: list[ostk.astrodynamics.trajectory.State], initial_revolution_number: ostk.core.type.Integer = 1) -> None:
291
+ def __init__(self, propagator: typing.Any, state_array: list[ostk.astrodynamics.trajectory.State], initial_revolution_number: ostk.core.type.Integer = 1) -> None:
292
292
  """
293
293
  Constructor.
294
294
 
@@ -387,7 +387,7 @@ class SGP4(ostk.astrodynamics.trajectory.orbit.OrbitModel):
387
387
  @staticmethod
388
388
  def _pybind11_conduit_v1_(*args, **kwargs):
389
389
  ...
390
- def __init__(self, tle: ...) -> None:
390
+ def __init__(self, tle: typing.Any) -> None:
391
391
  """
392
392
  Constructor.
393
393
 
@@ -44,14 +44,14 @@ class CoordinateBroker:
44
44
  Returns:
45
45
  list[CoordinateSubset]: The list of coordinate subsets.
46
46
  """
47
- def add_subset(self, coordinate_subset: ...) -> int:
47
+ def add_subset(self, coordinate_subset: typing.Any) -> int:
48
48
  """
49
49
  Add a coordinate subset.
50
50
 
51
51
  Args:
52
52
  coordinate_subset (CoordinateSubset): The coordinate subset to add.
53
53
  """
54
- def extract_coordinate(self, coordinates: numpy.ndarray[numpy.float64[m, 1]], coordinate_subset: ...) -> numpy.ndarray[numpy.float64[m, 1]]:
54
+ def extract_coordinate(self, coordinates: numpy.ndarray[numpy.float64[m, 1]], coordinate_subset: typing.Any) -> numpy.ndarray[numpy.float64[m, 1]]:
55
55
  """
56
56
  Extract the coordinates of a subset from a full coordinates vector.
57
57
 
@@ -94,7 +94,7 @@ class CoordinateBroker:
94
94
  Returns:
95
95
  list[CoordinateSubset]: The list of coordinate subsets.
96
96
  """
97
- def has_subset(self, coordinate_subset: ...) -> bool:
97
+ def has_subset(self, coordinate_subset: typing.Any) -> bool:
98
98
  """
99
99
  Check if the coordinate broker has a given coordinate subset.
100
100
 
@@ -384,7 +384,7 @@ class NumericalSolver(ostk.mathematics.solver.NumericalSolver):
384
384
  list[State]: The states at the requested times.
385
385
  """
386
386
  @typing.overload
387
- def integrate_time(self, state: ostk.astrodynamics.trajectory.State, instant: ostk.physics.time.Instant, system_of_equations: typing.Any, event_condition: ...) -> NumericalSolver.ConditionSolution:
387
+ def integrate_time(self, state: ostk.astrodynamics.trajectory.State, instant: ostk.physics.time.Instant, system_of_equations: typing.Any, event_condition: typing.Any) -> NumericalSolver.ConditionSolution:
388
388
  """
389
389
  Integrate the trajectory to a given instant, with an event condition.
390
390
 
@@ -25,7 +25,7 @@ class AngularVelocity(ostk.astrodynamics.trajectory.state.CoordinateSubset):
25
25
  Returns:
26
26
  AngularVelocity: The default Angular velocity subset.
27
27
  """
28
- def __init__(self, attitude_quaternion: ..., name: ostk.core.type.String) -> None:
28
+ def __init__(self, attitude_quaternion: typing.Any, name: ostk.core.type.String) -> None:
29
29
  """
30
30
  Constructor.
31
31
 
@@ -24,11 +24,16 @@ from ostk.physics.coordinate import Frame
24
24
  from ostk.physics.coordinate.spherical import LLA
25
25
 
26
26
  from ostk.astrodynamics.flight import Profile
27
+ from ostk.astrodynamics.trajectory import Orbit
27
28
  from ostk.astrodynamics.trajectory import State
28
29
 
29
30
  from .converters import coerce_to_datetime
30
31
  from .utilities import lla_from_position
31
32
 
33
+ DEFAULT_SATELLITE_IMAGE: str = (
34
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADJSURBVDhPnZHRDcMgEEMZjVEYpaNklIzSEfLfD4qNnXAJSFWfhO7w2Zc0Tf9QG2rXrEzSUeZLOGm47WoH95x3Hl3jEgilvDgsOQUTqsNl68ezEwn1vae6lceSEEYvvWNT/Rxc4CXQNGadho1NXoJ+9iaqc2xi2xbt23PJCDIB6TQjOC6Bho/sDy3fBQT8PrVhibU7yBFcEPaRxOoeTwbwByCOYf9VGp1BYI1BA+EeHhmfzKbBoJEQwn1yzUZtyspIQUha85MpkNIXB7GizqDEECsAAAAASUVORK5CYII="
35
+ )
36
+
32
37
 
33
38
  @dataclass
34
39
  class Sensor:
@@ -57,6 +62,8 @@ class Viewer:
57
62
  cesium_token: str | None = None,
58
63
  width: str = "1500px",
59
64
  height: str = "800px",
65
+ zoom_to_entity: bool = True,
66
+ track_entity: bool = True,
60
67
  ) -> None:
61
68
  self._interval: Interval = interval
62
69
 
@@ -81,8 +88,8 @@ class Viewer:
81
88
  scene_mode_picker=False,
82
89
  selection_indicator=False,
83
90
  scene3d_only=True,
84
- zoom_to_entity=True,
85
- track_entity=True,
91
+ zoom_to_entity=zoom_to_entity,
92
+ track_entity=track_entity,
86
93
  default_access_token=cesium_token,
87
94
  )
88
95
 
@@ -90,6 +97,73 @@ class Viewer:
90
97
  def interval(self) -> Interval:
91
98
  return self._interval
92
99
 
100
+ def add_orbit(
101
+ self,
102
+ orbit: Orbit,
103
+ step: Duration,
104
+ name: str = "Satellite",
105
+ show_orbital_track: bool = False,
106
+ color: str | None = None,
107
+ image: str | None = None,
108
+ ) -> None:
109
+ """
110
+ Add Orbit to Viewer.
111
+
112
+ Args:
113
+ orbit (Orbit): Orbit to be added.
114
+ step (Duration): Step between two consecutive states.
115
+ name (str, optional): Name of the orbit. Defaults to "Satellite".
116
+ show_orbital_track (bool, optional): Whether to show the orbital track. Defaults to False.
117
+ color (str, optional): Color of the orbit. Defaults to None.
118
+ image (str, optional): Logo to be added. Defaults to None.
119
+ """
120
+ instants: list[Instant] = self._interval.generate_grid(step)
121
+ states: list[State] = orbit.get_states_at(instants)
122
+ llas: list[LLA] = _generate_llas(states)
123
+
124
+ cesium_positions: cesiumpy.SampledPositionProperty = (
125
+ _generate_sampled_position_from_states(states)
126
+ )
127
+
128
+ self._viewer.entities.add(
129
+ cesiumpy.Billboard(
130
+ name=name,
131
+ position=cesium_positions,
132
+ image=image or DEFAULT_SATELLITE_IMAGE,
133
+ )
134
+ )
135
+
136
+ self._viewer.entities.add(
137
+ cesiumpy.Label(
138
+ position=cesium_positions,
139
+ text=name,
140
+ scale=1.0,
141
+ fill_color=color or cesiumpy.color.WHITE,
142
+ pixel_offset=[0.0, 20.0],
143
+ )
144
+ )
145
+
146
+ if show_orbital_track:
147
+ self._viewer.entities.add(
148
+ cesiumpy.Polyline(
149
+ positions=cesiumpy.entities.cartesian.Cartesian3Array(
150
+ functools.reduce(
151
+ operator.iconcat,
152
+ [
153
+ [
154
+ float(lla.get_longitude().in_degrees()),
155
+ float(lla.get_latitude().in_degrees()),
156
+ float(lla.get_altitude().in_meters()),
157
+ ]
158
+ for lla in llas
159
+ ],
160
+ [],
161
+ )
162
+ ),
163
+ width=1,
164
+ )
165
+ )
166
+
93
167
  def add_profile(
94
168
  self,
95
169
  profile: Profile,
@@ -144,7 +218,7 @@ class Viewer:
144
218
  )
145
219
 
146
220
  satellite = cesiumpy.Satellite(
147
- position=_generate_sampled_position(instants, llas),
221
+ position=_generate_sampled_position_from_llas(instants, llas),
148
222
  orientation=_generate_sampled_orientation(states),
149
223
  availability=cesiumpy.TimeIntervalCollection(
150
224
  intervals=[
@@ -294,7 +368,7 @@ def _generate_llas(states: list[State]) -> list[LLA]:
294
368
  ]
295
369
 
296
370
 
297
- def _generate_sampled_position(
371
+ def _generate_sampled_position_from_llas(
298
372
  instants: list[Instant],
299
373
  llas: list[LLA],
300
374
  ) -> cesiumpy.SampledPositionProperty:
@@ -344,6 +418,33 @@ def _generate_sampled_orientation(states: list[State]) -> cesiumpy.SampledProper
344
418
  )
345
419
 
346
420
 
421
+ def _generate_sampled_position_from_states(
422
+ states: list[State],
423
+ ) -> cesiumpy.SampledPositionProperty:
424
+ """
425
+ Generate a sampled position property from a list of OSTk States.
426
+
427
+ Args:
428
+ states (list[State]): A list of OSTk States.
429
+
430
+ Returns:
431
+ cesiumpy.SampledPositionProperty: Sampled position property.
432
+ """
433
+
434
+ return cesiumpy.SampledPositionProperty(
435
+ samples=[
436
+ (
437
+ coerce_to_datetime(state.get_instant()),
438
+ _cesium_from_ostk_position(
439
+ position=state.in_frame(Frame.ITRF()).get_position()
440
+ ),
441
+ None,
442
+ )
443
+ for state in states
444
+ ],
445
+ )
446
+
447
+
347
448
  def _cesium_from_ostk_position(
348
449
  position: Position,
349
450
  instant: Instant | None = None,
File without changes