diff --git a/cuvis/AcquisitionContext.py b/cuvis/AcquisitionContext.py index abacc57..9717454 100644 --- a/cuvis/AcquisitionContext.py +++ b/cuvis/AcquisitionContext.py @@ -81,6 +81,34 @@ def _get_component_info(self, idref: int) -> ComponentInfo: raise SDKException() return ComponentInfo._from_internal(ci) + @property + @copydoc(cuvis_il.cuvis_acq_cont_dead_pixel_correction_available_get) + def dead_pixel_correction_available(self) -> bool: + val = cuvis_il.new_p_int() + if cuvis_il.status_ok != cuvis_il.cuvis_acq_cont_dead_pixel_correction_available_get( + self._handle, val): + raise SDKException() + return bool(cuvis_il.p_int_value(val)) + + + @dead_pixel_correction.getter + @copydoc(cuvis_il.cuvis_acq_cont_dead_pixel_correction_enabled_get) + def dead_pixel_correction(self) -> bool: + val = cuvis_il.new_p_int() + if cuvis_il.status_ok != cuvis_il.cuvis_acq_cont_dead_pixel_correction_enabled_get( + self._handle, val): + raise SDKException() + return bool(cuvis_il.p_int_value(val)) + + + @dead_pixel_correction.setter + @copydoc(cuvis_il.cuvis_acq_cont_dead_pixel_correction_enabled_set) + def dead_pixel_correction(self, value: bool): + if cuvis_il.status_ok != cuvis_il.cuvis_acq_cont_dead_pixel_correction_enabled_set( + self._handle, 1 if value else 0): + raise SDKException() + pass + @property @copydoc(cuvis_il.cuvis_acq_cont_queue_size_get) def queue_size(self) -> int: diff --git a/cuvis/FileWriteSettings.py b/cuvis/FileWriteSettings.py index c72f546..83362c3 100644 --- a/cuvis/FileWriteSettings.py +++ b/cuvis/FileWriteSettings.py @@ -17,8 +17,7 @@ @dataclass -class GeneralExportSettings(object): - export_dir: str = "." +class PanSharpeningSettings(object): channel_selection: str = "all" spectra_multiplier: int = 1 pan_scale: float = 0.0 @@ -30,46 +29,128 @@ class GeneralExportSettings(object): ) pre_pan_sharpen_cube: bool = False add_pan: bool = False - add_fullscale_pan: bool = False - permissive: bool = False - def _get_internal(self): - ge = cuvis_il.cuvis_export_general_settings_t() - ge.export_dir = self.export_dir - ge.channel_selection = self.channel_selection - ge.spectra_multiplier = int(self.spectra_multiplier) - ge.pan_scale = float(self.pan_scale) - ge.pan_interpolation_type = internal.__CuvisPanSharpeningInterpolationType__[ + def _get_internal(self) -> cuvis_il.cuvis_pansharpening_settings_t: + ps = cuvis_il.cuvis_pansharpening_settings_t() + ps.channel_selection = self.channel_selection + ps.spectra_multiplier = self.spectra_multiplier + ps.pan_scale = float(self.pan_scale) + ps.pan_interpolation_type = internal.__CuvisPanSharpeningInterpolationType__[ self.pan_sharpening_interpolation_type ] - ge.pan_algorithm = internal.__CuvisPanSharpeningAlgorithm__[ + ps.pan_algorithm = internal.__CuvisPanSharpeningAlgorithm__[ self.pan_sharpening_algorithm ] - ge.pre_pan_sharpen_cube = int(self.pre_pan_sharpen_cube) - ge.add_pan = int(self.add_pan) + ps.pre_pan_sharpen_cube = int(self.pre_pan_sharpen_cube) + ps.add_pan = int(self.add_pan) + return ps + + @classmethod + def _from_internal(cls, ps: cuvis_il.cuvis_pansharpening_settings_t): + if ps is None: + return cls() + return cls( + channel_selection=ps.channel_selection, + spectra_multiplier=ps.spectra_multiplier, + pan_scale=ps.pan_scale, + pan_sharpening_interpolation_type=internal.__PanSharpeningInterpolationType__[ + ps.pan_interpolation_type + ], + pan_sharpening_algorithm=internal.__PanSharpeningAlgorithm__[ + ps.pan_algorithm + ], + pre_pan_sharpen_cube=bool(ps.pre_pan_sharpen_cube), + add_pan=bool(ps.add_pan), + ) + +@dataclass +class GeneralExportSettings(object): + export_dir: str = "." + pan_sharpening: PanSharpeningSettings = field( + default_factory=PanSharpeningSettings + ) + add_fullscale_pan: bool = False + permissive: bool = False + + # ---- Backwards compatible “flat” attributes ---- + @property + def channel_selection(self) -> str: + return self.pan_sharpening.channel_selection + + @channel_selection.setter + def channel_selection(self, value: str) -> None: + self.pan_sharpening.channel_selection = value + + @property + def spectra_multiplier(self) -> int: + return self.pan_sharpening.spectra_multiplier + + @spectra_multiplier.setter + def spectra_multiplier(self, value: int) -> None: + self.pan_sharpening.spectra_multiplier = value + + @property + def pan_scale(self) -> float: + return self.pan_sharpening.pan_scale + + @pan_scale.setter + def pan_scale(self, value: float) -> None: + self.pan_sharpening.pan_scale = value + + @property + def pan_sharpening_interpolation_type(self) -> PanSharpeningInterpolationType: + return self.pan_sharpening.pan_sharpening_interpolation_type + + @pan_sharpening_interpolation_type.setter + def pan_sharpening_interpolation_type( + self, value: PanSharpeningInterpolationType + ) -> None: + self.pan_sharpening.pan_sharpening_interpolation_type = value + + @property + def pan_sharpening_algorithm(self) -> PanSharpeningAlgorithm: + return self.pan_sharpening.pan_sharpening_algorithm + + @pan_sharpening_algorithm.setter + def pan_sharpening_algorithm(self, value: PanSharpeningAlgorithm) -> None: + self.pan_sharpening.pan_sharpening_algorithm = value + + @property + def pre_pan_sharpen_cube(self) -> bool: + return self.pan_sharpening.pre_pan_sharpen_cube + + @pre_pan_sharpen_cube.setter + def pre_pan_sharpen_cube(self, value: bool) -> None: + self.pan_sharpening.pre_pan_sharpen_cube = value + + @property + def add_pan(self) -> bool: + return self.pan_sharpening.add_pan + + @add_pan.setter + def add_pan(self, value: bool) -> None: + self.pan_sharpening.add_pan = value + + def _get_internal(self) -> cuvis_il.cuvis_export_general_settings_t: + ge = cuvis_il.cuvis_export_general_settings_t() + ge.export_dir = self.export_dir ge.add_fullscale_pan = int(self.add_fullscale_pan) ge.permissive = int(self.permissive) + # nested pansharpening struct + ge.pansharpening_settings = self.pan_sharpening._get_internal() return ge @classmethod def _from_internal(cls, ge: cuvis_il.cuvis_export_general_settings_t): + ps = getattr(ge, "pansharpening_settings", None) + pan_sharpening = PanSharpeningSettings._from_internal(ps) return cls( export_dir=ge.export_dir, - channel_selection=ge.channel_selection, - spectra_multiplier=ge.spectra_multiplier, - pan_sharpening_interpolation_type=internal.__PanSharpeningInterpolationType__[ - ge.pan_interpolation_type - ], - pan_sharpening_algorithm=internal.__PanSharpeningAlgorithm__[ - ge.pan_algorithm - ], - pre_pan_sharpen_cube=ge.pre_pan_sharpen_cube, - add_pan=bool(ge.add_pan), + pan_sharpening=pan_sharpening, add_fullscale_pan=bool(ge.add_fullscale_pan), permissive=bool(ge.permissive), ) - @dataclass class EnviExportSettings(GeneralExportSettings): def _get_internal(self): @@ -164,7 +245,7 @@ def _get_internal(self): def _from_internal( cls, ge: cuvis_il.cuvis_export_general_settings_t, - vs: cuvis_il.cuvis_viewer_settings_t, + vs: cuvis_il.cuvis_export_view_settings_t, ): ge = super()._from_internal(ge) return cls( @@ -269,17 +350,11 @@ def _get_internal(self): @dataclass(repr=False) class ViewerSettings: userplugin: InitVar[str] = None - pan_scale: float = 0.0 - pan_sharpening_interpolation_type: PanSharpeningInterpolationType = ( - PanSharpeningInterpolationType.Linear - ) - pan_sharpening_algorithm: PanSharpeningAlgorithm = ( - PanSharpeningAlgorithm.CubertMacroPixel - ) - pre_pan_sharpen_cube: bool = False - complete: bool = False - blend_opacity: float = 0.0 pan_failback: bool = True + complete: bool = False + pan_sharpening: PanSharpeningSettings = field( + default_factory=PanSharpeningSettings + ) def __post_init__(self, userplugin: str): if userplugin is not None: @@ -307,6 +382,65 @@ def userplugin(self) -> str: def userplugin(self, v: str) -> None: self.__post_init__(v) + # ---- Backwards compatible “flat” attributes ---- + @property + def channel_selection(self) -> str: + return self.pan_sharpening.channel_selection + + @channel_selection.setter + def channel_selection(self, value: str) -> None: + self.pan_sharpening.channel_selection = value + + @property + def spectra_multiplier(self) -> int: + return self.pan_sharpening.spectra_multiplier + + @spectra_multiplier.setter + def spectra_multiplier(self, value: int) -> None: + self.pan_sharpening.spectra_multiplier = value + + @property + def pan_scale(self) -> float: + return self.pan_sharpening.pan_scale + + @pan_scale.setter + def pan_scale(self, value: float) -> None: + self.pan_sharpening.pan_scale = value + + @property + def pan_sharpening_interpolation_type(self) -> PanSharpeningInterpolationType: + return self.pan_sharpening.pan_sharpening_interpolation_type + + @pan_sharpening_interpolation_type.setter + def pan_sharpening_interpolation_type( + self, value: PanSharpeningInterpolationType + ) -> None: + self.pan_sharpening.pan_sharpening_interpolation_type = value + + @property + def pan_sharpening_algorithm(self) -> PanSharpeningAlgorithm: + return self.pan_sharpening.pan_sharpening_algorithm + + @pan_sharpening_algorithm.setter + def pan_sharpening_algorithm(self, value: PanSharpeningAlgorithm) -> None: + self.pan_sharpening.pan_sharpening_algorithm = value + + @property + def pre_pan_sharpen_cube(self) -> bool: + return self.pan_sharpening.pre_pan_sharpen_cube + + @pre_pan_sharpen_cube.setter + def pre_pan_sharpen_cube(self, value: bool) -> None: + self.pan_sharpening.pre_pan_sharpen_cube = value + + @property + def add_pan(self) -> bool: + return self.pan_sharpening.add_pan + + @add_pan.setter + def add_pan(self, value: bool) -> None: + self.pan_sharpening.add_pan = value + def __repr__(self): def short_str(s: str, l: int) -> str: return (s[:l] + "...") if len(s) > l else s @@ -321,17 +455,10 @@ def short_str(s: str, l: int) -> str: def _get_internal(self): vs = cuvis_il.cuvis_viewer_settings_t() vs.userplugin = self.userplugin - vs.pan_scale = float(self.pan_scale) - vs.pan_interpolation_type = internal.__CuvisPanSharpeningInterpolationType__[ - self.pan_sharpening_interpolation_type - ] - vs.pan_algorithm = internal.__CuvisPanSharpeningAlgorithm__[ - self.pan_sharpening_algorithm - ] - vs.pre_pan_sharpen_cube = int(self.pre_pan_sharpen_cube) - vs.complete = int(self.complete) - vs.blend_opacity = float(self.blend_opacity) vs.pan_failback = int(self.pan_failback) + vs.complete = int(self.complete) + # nested pansharpening struct + vs.pansharpening_settings = self.pan_sharpening._get_internal() return vs @classmethod @@ -339,14 +466,7 @@ def _from_internal(cls, vs: cuvis_il.cuvis_viewer_settings_t): return cls( userplugin=vs.userplugin, pan_scale=float(vs.pan_scale), - pan_sharpening_interpolation_type=internal.__PanSharpeningInterpolationType__[ - vs.pan_interpolation_type - ], - pan_sharpening_algorithm=internal.__PanSharpeningAlgorithm__[ - vs.pan_algorithm - ], - pre_pan_sharpen_cube=bool(vs.pre_pan_sharpen_cube), - complete=bool(vs.complete), - blend_opacity=float(vs.blend_opacity), pan_failback=bool(vs.pan_failback), + complete=bool(vs.complete), + pan_sharpening=pan_sharpening, ) diff --git a/cuvis/cuvis_types.py b/cuvis/cuvis_types.py index cb61b5c..e7dd417 100644 --- a/cuvis/cuvis_types.py +++ b/cuvis/cuvis_types.py @@ -136,14 +136,14 @@ class PanSharpeningAlgorithm(Enum): Noop = 1 CubertMacroPixel = 2 CubertPanRatio = 3 - AlphaBlendOverlay = 4 + PCAFusion = 4 __CuvisPanSharpeningAlgorithm__ = { - PanSharpeningAlgorithm.Noop: cuvis_il.pan_sharpening_algorithm_Noop, - PanSharpeningAlgorithm.CubertMacroPixel: cuvis_il.pan_sharpening_algorithm_CubertMacroPixel, - PanSharpeningAlgorithm.CubertPanRatio: cuvis_il.pan_sharpening_algorithm_CubertPanRatio, - PanSharpeningAlgorithm.AlphaBlendOverlay: cuvis_il.pan_sharpening_algorithm_AlphablendPanOverlay, + PanSharpeningAlgorithm.Noop : cuvis_il.pan_sharpening_algorithm_Noop, + PanSharpeningAlgorithm.CubertMacroPixel : cuvis_il.pan_sharpening_algorithm_CubertMacroPixel, + PanSharpeningAlgorithm.CubertPanRatio : cuvis_il.pan_sharpening_algorithm_CubertPanRatio, + PanSharpeningAlgorithm.PCAFusion : cuvis_il.pan_sharpening_algorithm_PCAFusion } __PanSharpeningAlgorithm__ = __inverseTranslationDict(__CuvisPanSharpeningAlgorithm__)