@@ -27,6 +27,8 @@ class ViewportInfo:
27
27
fov : float | Quantity | None = None
28
28
wcs : WCS | None = None
29
29
largest_dimension : int | None = None
30
+ stretch : BaseStretch | None = None
31
+ cuts : BaseInterval | tuple [numbers .Real , numbers .Real ] | None = None
30
32
31
33
@dataclass
32
34
class ImageViewer :
@@ -42,8 +44,6 @@ class ImageViewer:
42
44
zoom_level : float = 1
43
45
_cursor : str = ImageViewerInterface .ALLOWED_CURSOR_LOCATIONS [0 ]
44
46
marker : Any = "marker"
45
- _cuts : BaseInterval | tuple [numbers .Real , numbers .Real ] = AsymmetricPercentileInterval (upper_percentile = 95 )
46
- _stretch : BaseStretch = LinearStretch
47
47
# viewer: Any
48
48
49
49
# Allowed locations for cursor display
@@ -70,24 +70,37 @@ def __post_init__(self):
70
70
self ._images [None ].fov = None
71
71
self ._images [None ].wcs = None
72
72
73
- def get_stretch (self ) -> BaseStretch :
74
- return self ._stretch
73
+ def get_stretch (self , image_label : str | None = None ) -> BaseStretch :
74
+ image_label = self ._resolve_image_label (image_label )
75
+ if image_label not in self ._images :
76
+ raise ValueError (f"Image label '{ image_label } ' not found. Please load an image first." )
77
+ return self ._images [image_label ].stretch
75
78
76
- def set_stretch (self , value : BaseStretch ) -> None :
79
+ def set_stretch (self , value : BaseStretch , image_label : str | None = None ) -> None :
77
80
if not isinstance (value , BaseStretch ):
78
81
raise ValueError (f"Stretch option { value } is not valid. Must be an Astropy.visualization Stretch object." )
79
- self ._stretch = value
82
+ image_label = self ._resolve_image_label (image_label )
83
+ if image_label not in self ._images :
84
+ raise ValueError (f"Image label '{ image_label } ' not found. Please load an image first." )
85
+ self ._images [image_label ].stretch = value
80
86
81
- def get_cuts (self ) -> tuple :
82
- return self ._cuts
87
+ def get_cuts (self , image_label : str | None = None ) -> tuple :
88
+ image_label = self ._resolve_image_label (image_label )
89
+ if image_label not in self ._images :
90
+ raise ValueError (f"Image label '{ image_label } ' not found. Please load an image first." )
91
+ return self ._images [image_label ].cuts
83
92
84
- def set_cuts (self , value : tuple [numbers .Real , numbers .Real ] | BaseInterval ) -> None :
93
+ def set_cuts (self , value : tuple [numbers .Real , numbers .Real ] | BaseInterval , image_label : str | None = None ) -> None :
85
94
if isinstance (value , tuple ) and len (value ) == 2 :
86
95
self ._cuts = ManualInterval (value [0 ], value [1 ])
87
96
elif isinstance (value , BaseInterval ):
88
97
self ._cuts = value
89
98
else :
90
99
raise ValueError ("Cuts must be an Astropy.visualization Interval object or a tuple of two values." )
100
+ image_label = self ._resolve_image_label (image_label )
101
+ if image_label not in self ._images :
102
+ raise ValueError (f"Image label '{ image_label } ' not found. Please load an image first." )
103
+ self ._images [image_label ].cuts = self ._cuts
91
104
92
105
@property
93
106
def cursor (self ) -> str :
0 commit comments