1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.definitions;
18
19 import org.orekit.bodies.CelestialBody;
20 import org.orekit.bodies.CelestialBodyFactory;
21 import org.orekit.errors.OrekitException;
22 import org.orekit.errors.OrekitMessages;
23 import org.orekit.frames.Frame;
24 import org.orekit.time.AbsoluteDate;
25
26
27
28
29
30
31
32 public class OrekitCcsdsFrameMapper implements CcsdsFrameMapper {
33
34
35 private static final String NO_REFERENCE_FRAME = "No reference frame";
36
37
38 public OrekitCcsdsFrameMapper() {
39
40 }
41
42 @Override
43 public Frame buildCcsdsFrame(final FrameFacade orientation,
44 final AbsoluteDate frameEpoch) {
45 if (orientation == null) {
46 throw new OrekitException(OrekitMessages.CCSDS_INVALID_FRAME, NO_REFERENCE_FRAME);
47 }
48 return orientation.asFrame().
49 orElseThrow(() -> new OrekitException(OrekitMessages.CCSDS_INVALID_FRAME, orientation.getName()));
50
51 }
52
53 @Override
54 public Frame buildCcsdsFrame(final BodyFacade center,
55 final FrameFacade orientation,
56 final AbsoluteDate frameEpoch) {
57 if (center == null) {
58 throw new OrekitException(OrekitMessages.NO_DATA_LOADED_FOR_CELESTIAL_BODY, "No Orbit center name");
59 }
60 final CelestialBody body =
61 center.
62 getBody().
63 orElseThrow(() -> new OrekitException(OrekitMessages.NO_DATA_LOADED_FOR_CELESTIAL_BODY,
64 center.getName()));
65 if (orientation == null) {
66 throw new OrekitException(OrekitMessages.CCSDS_INVALID_FRAME, NO_REFERENCE_FRAME);
67 }
68 final Frame frame =
69 orientation.asFrame().
70 orElseThrow(() -> new OrekitException(OrekitMessages.CCSDS_INVALID_FRAME, orientation.getName()));
71
72
73 final CelestialBodyFrame celestialBodyFrame = orientation.asCelestialBodyFrame().orElse(null);
74 final boolean isMci = celestialBodyFrame == CelestialBodyFrame.MCI;
75 final boolean isIcrf = celestialBodyFrame == CelestialBodyFrame.ICRF;
76 final String centerName = center.getBody().get().getName();
77 final boolean isCenterEarth = CelestialBodyFactory.EARTH.equals(centerName);
78 final boolean isCenterMars = CelestialBodyFactory.MARS.equals(centerName);
79 if (isIcrf) {
80
81 return body.getIcrfAlignedFrame();
82 }
83 if (!isMci && isCenterEarth || isMci && isCenterMars) {
84
85
86
87
88 return frame;
89 }
90
91 return new ModifiedFrame(frame, celestialBodyFrame,
92 body, center.getName());
93 }
94
95 @Override
96 public int hashCode() {
97 return this.getClass().hashCode();
98 }
99
100 @Override
101 public boolean equals(final Object obj) {
102 return this == obj || this.getClass() == OrekitCcsdsFrameMapper.class &&
103 obj.getClass() == OrekitCcsdsFrameMapper.class;
104 }
105
106 }