def test_material_checkerboard(): expected_result = """{ "evenColor": { "rgba": [ 0, 0, 0, 255 ] }, "oddColor": { "rgba": [ 255, 255, 255, 255 ] }, "repeat": 4 }""" pol_mat = CheckerboardMaterial( evenColor=Color.from_list([0, 0, 0]), oddColor=Color.from_list([255, 255, 255]), repeat=4, ) assert repr(pol_mat) == expected_result
def test_material_stripe(): expected_result = """{ "orientation": "HORIZONTAL", "evenColor": { "rgba": [ 0, 0, 0, 255 ] }, "oddColor": { "rgba": [ 255, 255, 255, 255 ] }, "offset": 0.3, "repeat": 4 }""" pol_mat = StripeMaterial( evenColor=Color.from_list([0, 0, 0]), oddColor=Color.from_list([255, 255, 255]), offset=0.3, repeat=4, ) assert repr(pol_mat) == expected_result
def test_material_image(): expected_result = """{ "image": { "image": "https://site.com/image.png", "repeat": [ 2, 2 ], "color": { "rgba": [ 200, 100, 30, 255 ] }, "transparent": false } }""" mat = Material(image=ImageMaterial( image=Uri(uri="https://site.com/image.png"), repeat=[2, 2], color=Color.from_list([200, 100, 30]), )) assert repr(mat) == expected_result pol_mat = PolylineMaterial(image=ImageMaterial( image=Uri(uri="https://site.com/image.png"), repeat=[2, 2], color=Color.from_list([200, 100, 30]), )) assert repr(pol_mat) == expected_result
def test_material_grid(): expected_result = """{ "color": { "rgba": [ 20, 20, 30, 255 ] }, "cellAlpha": 1.0, "lineCount": [ 16, 16 ], "lineThickness": [ 2.0, 2.0 ], "lineOffset": [ 0.3, 0.4 ] }""" pol_mat = GridMaterial( color=Color.from_list([20, 20, 30]), cellAlpha=1.0, lineCount=[16, 16], lineThickness=[2.0, 2.0], lineOffset=[0.3, 0.4], ) assert repr(pol_mat) == expected_result
def test_packet_label(): expected_result = """{ "id": "0", "label": { "show": true, "font": "20px sans-serif", "style": "FILL", "fillColor": { "rgbaf": [ 0.2, 0.3, 0.4, 1.0 ] }, "outlineColor": { "rgba": [ 0, 233, 255, 2 ] }, "outlineWidth": 2.0 } }""" packet = Packet( id="0", label=Label( font="20px sans-serif", fillColor=Color.from_list([0.2, 0.3, 0.4]), outlineColor=Color.from_list([0, 233, 255, 2]), outlineWidth=2.0, ), ) assert repr(packet) == expected_result
def test_packet_point(): expected_result = """{ "id": "id_00", "point": { "color": { "rgba": [ 255, 0, 0, 255 ] } } }""" packet = Packet(id="id_00", point=Point(color=Color.from_list([255, 0, 0, 255]))) assert repr(packet) == expected_result
def add_trajectory( self, positions, epochs, groundtrack_show=False, groundtrack_lead_time=None, groundtrack_trail_time=None, groundtrack_width=None, groundtrack_color=None, id_name=None, id_description=None, path_width=None, path_show=None, path_color=None, label_fill_color=None, label_outline_color=None, label_font=None, label_text=None, label_show=None, ): """ Adds trajectory. Parameters ---------- positions: ~astropy.coordinates.CartesianRepresentation Trajectory to plot. epochs: ~astropy.time.Time Epochs for positions. groundtrack_show: bool If set to true, the groundtrack is displayed. groundtrack_lead_time: float The time the animation is ahead of the real-time groundtrack groundtrack_trail_time: float The time the animation is behind the real-time groundtrack groundtrack_width: int Groundtrack width groundtrack_color: list (int) Rgba groundtrack color. By default, it is set to the path color id_name: str Set orbit name id_description: str Set orbit description path_width: int Path width path_show: bool Indicates whether the path is visible path_color: list (int) Rgba path color label_fill_color: list (int) Fill Color in rgba format label_outline_color: list (int) Outline Color in rgba format label_font: str Set label font style and size (CSS syntax) label_text: str Set label text label_show: bool Indicates whether the label is visible """ positions = (positions.represent_as(CartesianRepresentation).get_xyz( 1).to_value(u.m)) epochs = Time(epochs, format="isot") if len(epochs) != len(positions): raise ValueError("Number of Points and Epochs must be equal.") epochs = np.fromiter( map(lambda epoch: (epoch - epochs[0]).to_value(u.s), epochs), dtype=float, ) positions = np.around( np.concatenate([epochs[..., None], positions], axis=1).ravel(), 1).tolist() self.trajectories.append([positions, None, label_text, path_color]) start_epoch = Time(self.start_epoch, format="isot") pckt = Packet( id=self.i, name=id_name, description=id_description, availability=TimeInterval(start=self.start_epoch, end=self.end_epoch), position=Position( interpolationDegree=5, interpolationAlgorithm=InterpolationAlgorithms.LAGRANGE, referenceFrame=ReferenceFrames.INERTIAL, cartesian=positions, # Use explicit UTC timezone, rather than the default, which is a local timezone. epoch=start_epoch.datetime.replace(tzinfo=timezone.utc), ), path=Path( show=path_show, width=path_width, material=Material(solidColor=SolidColorMaterial( color=Color.from_list(path_color))) if path_color is not None else Material(solidColor=SolidColorMaterial( color=Color.from_list([255, 255, 0]))), resolution=120, ), label=Label( text=label_text, font=label_font if label_font is not None else "11pt Lucida Console", show=label_show, fillColor=Color(rgba=label_fill_color) if label_fill_color is not None else Color(rgba=[255, 255, 0, 255]), outlineColor=Color(rgba=label_outline_color) if label_outline_color is not None else Color( rgba=[255, 255, 0, 255]), ), billboard=Billboard(image=PIC_SATELLITE, show=True), ) self.packets.append(pckt) if groundtrack_show: raise NotImplementedError( "Ground tracking for trajectory not implemented yet") self.i += 1
def add_orbit( self, orbit, rtol=1e-10, N=None, groundtrack_show=False, groundtrack_lead_time=None, groundtrack_trail_time=None, groundtrack_width=None, groundtrack_color=None, id_name=None, id_description=None, path_width=None, path_show=None, path_color=None, label_fill_color=None, label_outline_color=None, label_font=None, label_text=None, label_show=None, ): """ Adds an orbit Parameters ---------- orbit: poliastro.twobody.orbit.Orbit Orbit to be added rtol: float Maximum relative error permitted N: int Number of sample points groundtrack_show: bool If set to true, the groundtrack is displayed. groundtrack_lead_time: float The time the animation is ahead of the real-time groundtrack groundtrack_trail_time: float The time the animation is behind the real-time groundtrack groundtrack_width: int Groundtrack width groundtrack_color: list (int) Rgba groundtrack color. By default, it is set to the path color id_name: str Set orbit name id_description: str Set orbit description path_width: int Path width path_show: bool Indicates whether the path is visible path_color: list (int) Rgba path color label_fill_color: list (int) Fill Color in rgba format label_outline_color: list (int) Outline Color in rgba format label_font: str Set label font style and size (CSS syntax) label_text: str Set label text label_show: bool Indicates whether the label is visible """ if N is None: N = self.N if orbit.epoch < self.start_epoch: orbit = orbit.propagate(self.start_epoch - orbit.epoch) elif orbit.epoch > self.end_epoch: raise ValueError( "The orbit's epoch cannot exceed the constructor's ending epoch" ) if rtol <= 0 or rtol >= 1: raise ValueError( "The relative tolerance must be a value in the range (0, 1)") self.orbits.append([orbit, N, orbit.epoch]) cartesian_cords = self._init_orbit_packet_cords_(self.i, rtol=rtol) start_epoch = Time(min(self.orbits[self.i][2], self.start_epoch), format="isot") pckt = Packet( id=self.i, name=id_name, description=id_description, availability=TimeInterval(start=self.start_epoch, end=self.end_epoch), position=Position( interpolationDegree=5, interpolationAlgorithm=InterpolationAlgorithms.LAGRANGE, referenceFrame=ReferenceFrames.INERTIAL, cartesian=cartesian_cords, # Use explicit UTC timezone, rather than the default, which is a local timezone. epoch=start_epoch.datetime.replace(tzinfo=timezone.utc), ), path=Path( show=path_show, width=path_width, material=Material(solidColor=SolidColorMaterial( color=Color.from_list(path_color))) if path_color is not None else Material(solidColor=SolidColorMaterial( color=Color.from_list([255, 255, 0]))), resolution=120, ), label=Label( text=label_text, font=label_font if label_font is not None else "11pt Lucida Console", show=label_show, fillColor=Color(rgba=label_fill_color) if label_fill_color is not None else Color(rgba=[255, 255, 0, 255]), outlineColor=Color(rgba=label_outline_color) if label_outline_color is not None else Color( rgba=[255, 255, 0, 255]), ), billboard=Billboard(image=PIC_SATELLITE, show=True), ) self.packets.append(pckt) if groundtrack_show: groundtrack_color = path_color groundtrack_cords = self._init_groundtrack_packet_cords_(self.i, rtol=rtol) pckt = Packet( id="groundtrack" + str(self.i), availability=TimeInterval(start=self.start_epoch, end=self.end_epoch), position=Position( interpolationDegree=5, interpolationAlgorithm=InterpolationAlgorithms.LAGRANGE, referenceFrame=ReferenceFrames.INERTIAL, cartesian=groundtrack_cords, # Use explicit UTC timezone, rather than the default, which is a local timezone. epoch=start_epoch.datetime.replace(tzinfo=timezone.utc), ), path=Path( show=True, material=Material(solidColor=SolidColorMaterial( color=Color(rgba=groundtrack_color))) if groundtrack_color is not None else Material( solidColor=SolidColorMaterial(color=Color( rgba=[255, 255, 0, 255]))), resolution=60, width=groundtrack_width, leadTime=groundtrack_lead_time if groundtrack_lead_time else 100, trailTime=groundtrack_trail_time if groundtrack_trail_time else 100, ), ) self.packets.append(pckt) self.i += 1
name="AGI to Sensor", parent=accesses_id, description="<h2>No accesses</h2>", ), Packet( id="AreaTarget/Pennsylvania", name="Pennsylvania", label=Label( horizontalOrigin=HorizontalOrigins.LEFT, show=True, font="11pt Lucida Console", style=LabelStyles.FILL_AND_OUTLINE, outlineWidth=2, text="Pennsylvania", verticalOrigin=VerticalOrigins.CENTER, fillColor=Color.from_list([255, 0, 0]), outlineColor=Color.from_list([0, 0, 0]), ), position=Position( cartesian=[1152255.80150063, -4694317.951340558, 4147335.9067563135] ), ), Packet( id="Facility/AGI", name="AGI", availability=TimeInterval(start=start, end=end), billboard=Billboard( horizontalOrigin=HorizontalOrigins.CENTER, image=( "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/" "9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAc"