Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
227 changes: 135 additions & 92 deletions cuvis/FileWriteSettings.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
from ._cuvis_il import cuvis_il
from .cuvis_aux import SDKException
from .cuvis_types import PanSharpeningInterpolationType, \
PanSharpeningAlgorithm, \
TiffCompressionMode, TiffFormat, \
OperationMode, ProcessingMode
from .cuvis_types import (
PanSharpeningInterpolationType,
PanSharpeningAlgorithm,
TiffCompressionMode,
TiffFormat,
OperationMode,
ProcessingMode,
SessionMergeMode,
)

import cuvis.cuvis_types as internal
import os
Expand All @@ -13,12 +18,16 @@

@dataclass
class GeneralExportSettings(object):
export_dir: str = '.'
channel_selection: str = 'all'
export_dir: str = "."
channel_selection: str = "all"
spectra_multiplier: int = 1
pan_scale: float = 0.0
pan_sharpening_interpolation_type: PanSharpeningInterpolationType = PanSharpeningInterpolationType.Linear
pan_sharpening_algorithm: PanSharpeningAlgorithm = PanSharpeningAlgorithm.CubertMacroPixel
pan_sharpening_interpolation_type: PanSharpeningInterpolationType = (
PanSharpeningInterpolationType.Linear
)
pan_sharpening_algorithm: PanSharpeningAlgorithm = (
PanSharpeningAlgorithm.CubertMacroPixel
)
pre_pan_sharpen_cube: bool = False
add_pan: bool = False
add_fullscale_pan: bool = False
Expand All @@ -31,9 +40,11 @@ def _get_internal(self):
ge.spectra_multiplier = int(self.spectra_multiplier)
ge.pan_scale = float(self.pan_scale)
ge.pan_interpolation_type = internal.__CuvisPanSharpeningInterpolationType__[
self.pan_sharpening_interpolation_type]
self.pan_sharpening_interpolation_type
]
ge.pan_algorithm = internal.__CuvisPanSharpeningAlgorithm__[
self.pan_sharpening_algorithm]
self.pan_sharpening_algorithm
]
ge.pre_pan_sharpen_cube = int(self.pre_pan_sharpen_cube)
ge.add_pan = int(self.add_pan)
ge.add_fullscale_pan = int(self.add_fullscale_pan)
Expand All @@ -42,30 +53,32 @@ def _get_internal(self):

@classmethod
def _from_internal(cls, ge: cuvis_il.cuvis_export_general_settings_t):
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),
add_fullscale_pan=bool(ge.add_fullscale_pan),
permissive=bool(ge.permissive))
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),
add_fullscale_pan=bool(ge.add_fullscale_pan),
permissive=bool(ge.permissive),
)


@dataclass
class EnviExportSettings(GeneralExportSettings):

def _get_internal(self):
ge = super()._get_internal()
es = None
return ge, es

@classmethod
def _from_internal(cls,
ge: cuvis_il.cuvis_export_general_settings_t, es):
def _from_internal(cls, ge: cuvis_il.cuvis_export_general_settings_t, es):
ge = super()._from_internal(ge)
return cls(**ge.__dict__)

Expand All @@ -79,19 +92,23 @@ def _get_internal(self):
ge = super()._get_internal()
ts = cuvis_il.cuvis_export_tiff_settings_t()
ts.compression_mode = internal.__CuvisTiffCompressionMode__[
self.compression_mode]
self.compression_mode
]
ts.format = internal.__CuvisTiffFormat__[self.format]
return ge, ts

@classmethod
def _from_internal(cls,
ge: cuvis_il.cuvis_export_general_settings_t,
ts: cuvis_il.cuvis_export_tiff_settings_t):
def _from_internal(
cls,
ge: cuvis_il.cuvis_export_general_settings_t,
ts: cuvis_il.cuvis_export_tiff_settings_t,
):
ge = super()._from_internal(ge)
return cls(**ge.__dict__,
compression_mode=internal.__TiffCompressionMode__[
ts.compression_mode],
format=internal.__TiffFormat__[ts.format])
return cls(
**ge.__dict__,
compression_mode=internal.__TiffCompressionMode__[ts.compression_mode],
format=internal.__TiffFormat__[ts.format],
)


@dataclass(repr=False)
Expand All @@ -101,7 +118,10 @@ class ViewExportSettings(GeneralExportSettings):

def __post_init__(self, userplugin: str):
if userplugin is not None:
if '<userplugin xmlns="http://cubert-gmbh.de/user/plugin/userplugin.xsd">' in userplugin:
if (
'<userplugin xmlns="http://cubert-gmbh.de/user/plugin/userplugin.xsd">'
in userplugin
):
# Seems to be a valid plugin
self._userplugin = userplugin
return
Expand All @@ -111,7 +131,8 @@ def __post_init__(self, userplugin: str):
self._userplugin = "".join(f.readlines())
else:
raise SDKException(
'Error when validating plugin data. Please provide a valid plugin or a path to a plugin file')
"Error when validating plugin data. Please provide a valid plugin or a path to a plugin file"
)

@property
def userplugin(self) -> str:
Expand All @@ -123,12 +144,14 @@ def userplugin(self, v: str) -> None:

def __repr__(self):
def short_str(s: str, l: int) -> str:
return (s[:l] + '...') if len(s) > l else s
return (s[:l] + "...") if len(s) > l else s

"""Returns a string containing but shortens the userplugin field."""
s = ', '.join(list(f'{field.name}={getattr(self, field.name)}'
for field in fields(self)) + [f'userplugin={short_str(self._userplugin, 15)}'])
return f'{type(self).__name__}({s})'
s = ", ".join(
list(f"{field.name}={getattr(self, field.name)}" for field in fields(self))
+ [f"userplugin={short_str(self._userplugin, 15)}"]
)
return f"{type(self).__name__}({s})"

def _get_internal(self):
ge = super()._get_internal()
Expand All @@ -138,17 +161,20 @@ def _get_internal(self):
return ge, vs

@classmethod
def _from_internal(cls,
ge: cuvis_il.cuvis_export_general_settings_t,
vs: cuvis_il.cuvis_viewer_settings_t):
def _from_internal(
cls,
ge: cuvis_il.cuvis_export_general_settings_t,
vs: cuvis_il.cuvis_viewer_settings_t,
):
ge = super()._from_internal(ge)
return cls(**ge.__dict__,
userplugin=vs.userplugin, pan_failback=vs.pan_failback)
return cls(
**ge.__dict__, userplugin=vs.userplugin, pan_failback=vs.pan_failback
)


@dataclass
class SaveArgs(GeneralExportSettings):
allow_overwrite: bool = False
merge_mode: SessionMergeMode = SessionMergeMode.Default
allow_fragmentation: bool = False
allow_drop: bool = False
allow_session_file: bool = True
Expand All @@ -163,13 +189,11 @@ class SaveArgs(GeneralExportSettings):
def _get_internal(self):
ge = super()._get_internal()
sa = cuvis_il.cuvis_save_args_t()
sa.allow_overwrite = int(self.allow_overwrite)
sa.allow_fragmentation = int(self.allow_fragmentation)
sa.merge_mode = internal.__CuvisSessionMergeMode__(self.merge_mode)
sa.allow_drop = int(self.allow_drop)
sa.allow_session_file = int(self.allow_session_file)
sa.allow_info_file = int(self.allow_info_file)
sa.operation_mode = internal.__CuvisOperationMode__[
self.operation_mode]
sa.operation_mode = internal.__CuvisOperationMode__[self.operation_mode]
sa.fps = int(self.fps)
sa.soft_limit = int(self.soft_limit)
sa.hard_limit = int(self.hard_limit)
Expand All @@ -178,24 +202,27 @@ def _get_internal(self):
return ge, sa

@classmethod
def _from_internal(cls,
ge: cuvis_il.cuvis_export_general_settings_t,
sa: cuvis_il.cuvis_save_args_t):
def _from_internal(
cls,
ge: cuvis_il.cuvis_export_general_settings_t,
sa: cuvis_il.cuvis_save_args_t,
):
ge = super()._from_internal(ge)
return cls(**ge.__dict__,
allow_overwrite=bool(sa.allow_overwrite),
allow_fragmentation=bool(sa.allow_fragmentation),
allow_drop=bool(sa.allow_drop),
allow_session_file=bool(sa.allow_session_file),
allow_info_file=bool(sa.allow_info_file),
operation_mode=internal.__OperationMode__[
sa.operation_mode],
fps=sa.fps,
soft_limit=sa.soft_limit,
hard_limit=sa.hard_limit,
max_buftime=sa.max_buftime,
full_export=sa.full_export
)
return cls(
**ge.__dict__,
allow_overwrite=bool(sa.allow_overwrite),
merge_mode=internal.__SessionMergeMode__[sa.merge_mode],
allow_fragmentation=bool(sa.allow_fragmentation),
allow_drop=bool(sa.allow_drop),
allow_session_file=bool(sa.allow_session_file),
allow_info_file=bool(sa.allow_info_file),
operation_mode=internal.__OperationMode__[sa.operation_mode],
fps=sa.fps,
soft_limit=sa.soft_limit,
hard_limit=sa.hard_limit,
max_buftime=sa.max_buftime,
full_export=sa.full_export,
)


@dataclass
Expand All @@ -206,14 +233,15 @@ class ProcessingArgs(object):
def _get_internal(self):
pa = cuvis_il.cuvis_proc_args_t()
pa.allow_recalib = int(self.allow_recalib)
pa.processing_mode = int(internal.__CuvisProcessingMode__[
self.processing_mode])
pa.processing_mode = int(internal.__CuvisProcessingMode__[self.processing_mode])
return pa

@classmethod
def _from_internal(cls, pa: cuvis_il.cuvis_proc_args_t):
return cls(allow_recalib=bool(pa.allow_recalib),
processing_mode=internal.__ProcessingMode__[pa.processing_mode])
return cls(
allow_recalib=bool(pa.allow_recalib),
processing_mode=internal.__ProcessingMode__[pa.processing_mode],
)


@dataclass
Expand All @@ -233,26 +261,32 @@ def _get_internal(self):
wa.supplementary_queue_size = int(self.supplementary_queue_size)
wa.output_queue_size = int(self.output_queue_size)
wa.can_skip_measurements = int(self.can_skip_measurements)
wa.can_skip_supplementary_steps = int(
self.can_skip_supplementary_steps)
wa.can_skip_supplementary_steps = int(self.can_skip_supplementary_steps)
wa.can_drop_results = int(self.can_drop_results)
return wa


@dataclass(repr=False)
class ViewerSettings():
class ViewerSettings:
userplugin: InitVar[str] = None
pan_scale: float = 0.0
pan_sharpening_interpolation_type: PanSharpeningInterpolationType = PanSharpeningInterpolationType.Linear
pan_sharpening_algorithm: PanSharpeningAlgorithm = PanSharpeningAlgorithm.CubertMacroPixel
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

def __post_init__(self, userplugin: str):
if userplugin is not None:
if '<userplugin xmlns="http://cubert-gmbh.de/user/plugin/userplugin.xsd">' in userplugin:
if (
'<userplugin xmlns="http://cubert-gmbh.de/user/plugin/userplugin.xsd">'
in userplugin
):
# Seems to be a valid plugin
self._userplugin = userplugin
return
Expand All @@ -262,7 +296,8 @@ def __post_init__(self, userplugin: str):
self._userplugin = "".join(f.readlines())
else:
raise SDKException(
'Error when validating plugin data. Please provide a valid plugin or a path to a plugin file')
"Error when validating plugin data. Please provide a valid plugin or a path to a plugin file"
)

@property
def userplugin(self) -> str:
Expand All @@ -274,21 +309,25 @@ def userplugin(self, v: str) -> None:

def __repr__(self):
def short_str(s: str, l: int) -> str:
return (s[:l] + '...') if len(s) > l else s
return (s[:l] + "...") if len(s) > l else s

"""Returns a string containing but shortens the userplugin field."""
s = ', '.join(list(f'{field.name}={getattr(self, field.name)}'
for field in fields(self)) + [f'userplugin={short_str(self._userplugin, 15)}'])
return f'{type(self).__name__}({s})'
s = ", ".join(
list(f"{field.name}={getattr(self, field.name)}" for field in fields(self))
+ [f"userplugin={short_str(self._userplugin, 15)}"]
)
return f"{type(self).__name__}({s})"

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]
self.pan_sharpening_interpolation_type
]
vs.pan_algorithm = internal.__CuvisPanSharpeningAlgorithm__[
self.pan_sharpening_algorithm]
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)
Expand All @@ -297,13 +336,17 @@ def _get_internal(self):

@classmethod
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))
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),
)
Loading