From 2b5b1144fa29d24e135cc954399fefa0f6078ec2 Mon Sep 17 00:00:00 2001 From: William Moore Date: Wed, 25 Oct 2023 13:54:01 +0100 Subject: [PATCH 01/10] Add set_image() to handle each image --- src/omero_cli_render.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/omero_cli_render.py b/src/omero_cli_render.py index 97fc493a..58e09bb8 100755 --- a/src/omero_cli_render.py +++ b/src/omero_cli_render.py @@ -690,7 +690,16 @@ def set(self, args): iids = [] for img in self.render_images(self.gateway, args.object, batch=1): iids.append(img.id) + self.set_image(img, data, cindices, rangelist, colourlist, greyscale, minmaxlist, args) + if not iids: + self.ctx.die(113, "ERROR: No images found for %s %d" % + (args.object.__class__.__name__, args.object.id._val)) + + if namedict: + self._update_channel_names(self.gateway, iids, namedict) + + def set_image(self, img, data, cindices, rangelist, colourlist, greyscale, minmaxlist, args): (def_z, def_t) = self._read_default_planes( img, data, ignore_errors=args.ignore_errors) @@ -751,13 +760,6 @@ def set(self, args): finally: img._closeRE() - if not iids: - self.ctx.die(113, "ERROR: No images found for %s %d" % - (args.object.__class__.__name__, args.object.id._val)) - - if namedict: - self._update_channel_names(self.gateway, iids, namedict) - def edit(self, args): self.ctx.die(112, "ERROR: 'edit' command has been renamed to 'set'") From dfc4bf87e056d92e95dbc55c3f0c3d7662866f45 Mon Sep 17 00:00:00 2001 From: William Moore Date: Wed, 25 Oct 2023 13:58:51 +0100 Subject: [PATCH 02/10] Rename self.render_images() to self.get_images() --- src/omero_cli_render.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/omero_cli_render.py b/src/omero_cli_render.py index 58e09bb8..829d8da5 100755 --- a/src/omero_cli_render.py +++ b/src/omero_cli_render.py @@ -436,7 +436,7 @@ def _lookup(self, gateway, type, oid): self.ctx.die(110, "No such %s: %s" % (type, oid)) return obj - def render_images(self, gateway, object, batch=100): + def get_images(self, gateway, object, batch=100): """ Get the images. @@ -451,12 +451,12 @@ def render_images(self, gateway, object, batch=100): if isinstance(object, list): for x in object: - for rv in self.render_images(gateway, x, batch): + for rv in self.get_images(gateway, x, batch): yield rv elif isinstance(object, Screen): scr = self._lookup(gateway, "Screen", object.id) for plate in scr.listChildren(): - for rv in self.render_images(gateway, plate._obj, batch): + for rv in self.get_images(gateway, plate._obj, batch): yield rv elif isinstance(object, Plate): plt = self._lookup(gateway, "Plate", object.id) @@ -477,7 +477,7 @@ def render_images(self, gateway, object, batch=100): elif isinstance(object, Project): prj = self._lookup(gateway, "Project", object.id) for ds in prj.listChildren(): - for rv in self.render_images(gateway, ds._obj, batch): + for rv in self.get_images(gateway, ds._obj, batch): yield rv elif isinstance(object, Dataset): @@ -515,7 +515,7 @@ def info(self, args): def __info(self, args): first = True - for img in self.render_images(self.gateway, args.object, batch=1): + for img in self.get_images(self.gateway, args.object, batch=1): try: ro = RenderObject(img) if args.style == 'plain': @@ -540,8 +540,8 @@ def __info(self, args): @gateway_required def copy(self, args): """ Implements the 'copy' command """ - for src_img in self.render_images(self.gateway, args.object, batch=1): - for targets in self.render_images(self.gateway, args.target): + for src_img in self.get_images(self.gateway, args.object, batch=1): + for targets in self.get_images(self.gateway, args.target): batch = dict() for target in targets: if target.id == src_img.id: @@ -566,7 +566,7 @@ def copy(self, args): self._generate_thumbs(list(batch.values())) def update_channel_names(self, gateway, obj, namedict): - for targets in self.render_images(gateway, obj): + for targets in self.get_images(gateway, obj): iids = [img.id for img in targets] self._update_channel_names(self, iids, namedict) @@ -688,7 +688,7 @@ def set(self, args): self.ctx.dbg('greyscale=%s' % greyscale) iids = [] - for img in self.render_images(self.gateway, args.object, batch=1): + for img in self.get_images(self.gateway, args.object, batch=1): iids.append(img.id) self.set_image(img, data, cindices, rangelist, colourlist, greyscale, minmaxlist, args) @@ -767,7 +767,7 @@ def edit(self, args): def test(self, args): """ Implements the 'test' command """ self.gateway.SERVICE_OPTS.setOmeroGroup('-1') - for img in self.render_images(self.gateway, args.object, batch=1): + for img in self.get_images(self.gateway, args.object, batch=1): self.test_per_image( self.client, img, args.force, args.thumb) From 132c47c7542ef4ca9b5e8024eaa2f95345c7fd0a Mon Sep 17 00:00:00 2001 From: William Moore Date: Wed, 25 Oct 2023 18:22:24 +0100 Subject: [PATCH 03/10] Use applySettingsToSet(iid, 'Plaate', pid) for copy to Plate --- src/omero_cli_render.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/omero_cli_render.py b/src/omero_cli_render.py index 829d8da5..15ffae2d 100755 --- a/src/omero_cli_render.py +++ b/src/omero_cli_render.py @@ -541,6 +541,19 @@ def __info(self, args): def copy(self, args): """ Implements the 'copy' command """ for src_img in self.get_images(self.gateway, args.object, batch=1): + + # If target is a single Plate... + target = args.target + if isinstance(target, list) and len(target) == 1: + target = target[0] + if isinstance(target, Plate): + self.ctx.dbg("apply settings to Plate...") + self.gateway.applySettingsToSet(src_img.id, "Plate", [target.id.val]) + if not args.skipthumbs: + for imgs in self.get_images(self.gateway, args.target): + self._generate_thumbs(imgs) + return + for targets in self.get_images(self.gateway, args.target): batch = dict() for target in targets: From 35089403998581db74d26e2f107bdb5b622ae953 Mon Sep 17 00:00:00 2001 From: William Moore Date: Wed, 25 Oct 2023 20:26:21 +0100 Subject: [PATCH 04/10] Fix indentation error --- src/omero_cli_render.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/omero_cli_render.py b/src/omero_cli_render.py index 15ffae2d..2fb27d5c 100755 --- a/src/omero_cli_render.py +++ b/src/omero_cli_render.py @@ -552,7 +552,7 @@ def copy(self, args): if not args.skipthumbs: for imgs in self.get_images(self.gateway, args.target): self._generate_thumbs(imgs) - return + return for targets in self.get_images(self.gateway, args.target): batch = dict() From b8fba620a2b882050c1858f3a7d8bee8c8efdede Mon Sep 17 00:00:00 2001 From: William Moore Date: Tue, 31 Oct 2023 09:43:05 +0000 Subject: [PATCH 05/10] Use batch=1 for generating thumbnails for Plate --- src/omero_cli_render.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/omero_cli_render.py b/src/omero_cli_render.py index 2fb27d5c..a2bb2887 100755 --- a/src/omero_cli_render.py +++ b/src/omero_cli_render.py @@ -550,8 +550,8 @@ def copy(self, args): self.ctx.dbg("apply settings to Plate...") self.gateway.applySettingsToSet(src_img.id, "Plate", [target.id.val]) if not args.skipthumbs: - for imgs in self.get_images(self.gateway, args.target): - self._generate_thumbs(imgs) + for img in self.get_images(self.gateway, args.target, batch=1): + self._generate_thumbs([img]) return for targets in self.get_images(self.gateway, args.target): From 75fc40970592eca2babd405b65a372f328fb679a Mon Sep 17 00:00:00 2001 From: William Moore Date: Wed, 4 Dec 2024 09:49:16 +0000 Subject: [PATCH 06/10] Fix flake8 --- src/omero_cli_render.py | 126 +++++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 61 deletions(-) diff --git a/src/omero_cli_render.py b/src/omero_cli_render.py index 97a8e749..49632919 100755 --- a/src/omero_cli_render.py +++ b/src/omero_cli_render.py @@ -716,9 +716,11 @@ def copy(self, args): target = target[0] if isinstance(target, Plate): self.ctx.dbg("apply settings to Plate...") - self.gateway.applySettingsToSet(src_img.id, "Plate", [target.id.val]) + self.gateway.applySettingsToSet(src_img.id, + "Plate", [target.id.val]) if not args.skipthumbs: - for img in self.get_images(self.gateway, args.target, batch=1): + for img in self.get_images(self.gateway, + args.target, batch=1): self._generate_thumbs([img]) return @@ -871,7 +873,8 @@ def set(self, args): iids = [] for img in self.get_images(self.gateway, args.object, batch=1): iids.append(img.id) - self.set_image(img, data, cindices, rangelist, colourlist, greyscale, minmaxlist, args) + self.set_image_settings(img, data, cindices, rangelist, + colourlist, greyscale, minmaxlist, args) if not iids: self.ctx.die(113, "ERROR: No images found for %s %d" % @@ -880,66 +883,67 @@ def set(self, args): if namedict: self._update_channel_names(self.gateway, iids, namedict) - def set_image(self, img, data, cindices, rangelist, colourlist, greyscale, minmaxlist, args): - (def_z, def_t) = self._read_default_planes( - img, data, ignore_errors=args.ignore_errors) - - active_channels = [] - if not args.disable: - # Calling set_active_channels will disable channels which - # are not specified. - # Need to reset ALL active channels after set_active_channels() - imgchannels = img.getChannels() - for ci, ch in enumerate(imgchannels, 1): - if (-ci not in cindices and ch.isActive()) \ - or ci in cindices: - active_channels.append(ci) - - img.set_active_channels( - cindices, windows=rangelist, colors=colourlist, - set_inactive=True) - - if greyscale is not None: - if greyscale: - img.setGreyscaleRenderingModel() - else: - img.setColorRenderingModel() - - # Re-activate any un-listed channels - if len(active_channels) > 0: - img.set_active_channels(active_channels) + def set_image_settings(self, img, data, cindices, rangelist, + colourlist, greyscale, minmaxlist, args): + (def_z, def_t) = self._read_default_planes( + img, data, ignore_errors=args.ignore_errors) + + active_channels = [] + if not args.disable: + # Calling set_active_channels will disable channels which + # are not specified. + # Need to reset ALL active channels after set_active_channels() + imgchannels = img.getChannels() + for ci, ch in enumerate(imgchannels, 1): + if (-ci not in cindices and ch.isActive()) \ + or ci in cindices: + active_channels.append(ci) + + img.set_active_channels( + cindices, windows=rangelist, colors=colourlist, + set_inactive=True) - # Set statsInfo min & max - for minmax, ch in zip(minmaxlist, img.getChannels(noRE=True)): - if minmax[0] is None and minmax[1] is None: - continue - si = ch.getStatsInfo() - if si is None: - si = StatsInfoI() - else: - si = si._obj - if minmax[0] is not None: - si.globalMin = rdouble(minmax[0]) - if minmax[1] is not None: - si.globalMax = rdouble(minmax[1]) - ch._obj.statsInfo = si - ch.save() - - if def_z: - img.setDefaultZ(def_z - 1) - if def_t: - img.setDefaultT(def_t - 1) + if greyscale is not None: + if greyscale: + img.setGreyscaleRenderingModel() + else: + img.setColorRenderingModel() + + # Re-activate any un-listed channels + if len(active_channels) > 0: + img.set_active_channels(active_channels) + + # Set statsInfo min & max + for minmax, ch in zip(minmaxlist, img.getChannels(noRE=True)): + if minmax[0] is None and minmax[1] is None: + continue + si = ch.getStatsInfo() + if si is None: + si = StatsInfoI() + else: + si = si._obj + if minmax[0] is not None: + si.globalMin = rdouble(minmax[0]) + if minmax[1] is not None: + si.globalMax = rdouble(minmax[1]) + ch._obj.statsInfo = si + ch.save() + + if def_z: + img.setDefaultZ(def_z - 1) + if def_t: + img.setDefaultT(def_t - 1) - try: - img.saveDefaults() - self.ctx.dbg( - "Updated rendering settings for Image:%s" % img.id) - if not args.skipthumbs: - self._generate_thumbs([img]) - except Exception as e: - self.ctx.err('ERROR: %s' % e) - finally: - img._closeRE() + try: + img.saveDefaults() + self.ctx.dbg( + "Updated rendering settings for Image:%s" % img.id) + if not args.skipthumbs: + self._generate_thumbs([img]) + except Exception as e: + self.ctx.err('ERROR: %s' % e) + finally: + img._closeRE() def edit(self, args): self.ctx.die(112, "ERROR: 'edit' command has been renamed to 'set'") From 792025ca74dfe851db76ac95cea6ff76c3c0468d Mon Sep 17 00:00:00 2001 From: Dominik Lindner Date: Thu, 11 Dec 2025 13:44:11 +0000 Subject: [PATCH 07/10] Add deprecated render_images method again --- src/omero_cli_render.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/omero_cli_render.py b/src/omero_cli_render.py index 49632919..e7e9647d 100755 --- a/src/omero_cli_render.py +++ b/src/omero_cli_render.py @@ -23,6 +23,7 @@ import json import yaml import omero +import warnings from functools import wraps @@ -479,6 +480,17 @@ def _lookup(self, gateway, type, oid): self.ctx.die(110, "No such %s: %s" % (type, oid)) return obj + def render_images(self, gateway, object, batch=100): + """ + DEPRECATED: Use `get_images` instead. This will be removed in a future release. + """ + warnings.warn( + "RenderControl.get_images is deprecated and will be removed in a future release; " + "use `get_images` instead.", + DeprecationWarning + ) + return self.get_images(gateway, object, batch) + def get_images(self, gateway, object, batch=100): """ Get the images. From 4005bbcd09cf1ba01d97253d5674a9874b577139 Mon Sep 17 00:00:00 2001 From: Dominik Lindner Date: Thu, 11 Dec 2025 14:06:01 +0000 Subject: [PATCH 08/10] Update src/omero_cli_render.py Co-authored-by: jean-marie burel --- src/omero_cli_render.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/omero_cli_render.py b/src/omero_cli_render.py index e7e9647d..a1836007 100755 --- a/src/omero_cli_render.py +++ b/src/omero_cli_render.py @@ -485,7 +485,7 @@ def render_images(self, gateway, object, batch=100): DEPRECATED: Use `get_images` instead. This will be removed in a future release. """ warnings.warn( - "RenderControl.get_images is deprecated and will be removed in a future release; " + "RenderControl.render_images is deprecated and will be removed in a future release; " "use `get_images` instead.", DeprecationWarning ) From fdda0c39e0af9d6f822f277be77d2675b1db8431 Mon Sep 17 00:00:00 2001 From: William Moore Date: Thu, 11 Dec 2025 14:26:57 +0000 Subject: [PATCH 09/10] flake8 fix --- src/omero_cli_render.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/omero_cli_render.py b/src/omero_cli_render.py index a1836007..a78c2700 100755 --- a/src/omero_cli_render.py +++ b/src/omero_cli_render.py @@ -482,11 +482,12 @@ def _lookup(self, gateway, type, oid): def render_images(self, gateway, object, batch=100): """ - DEPRECATED: Use `get_images` instead. This will be removed in a future release. + DEPRECATED: Use `get_images` instead. + This will be removed in a future release. """ warnings.warn( - "RenderControl.render_images is deprecated and will be removed in a future release; " - "use `get_images` instead.", + "RenderControl.render_images is deprecated and will be " + "removed in a future release; use `get_images` instead.", DeprecationWarning ) return self.get_images(gateway, object, batch) From 38c5fff61b004cd2efee36b3f5c034d2b8f01c99 Mon Sep 17 00:00:00 2001 From: William Moore Date: Thu, 11 Dec 2025 14:55:48 +0000 Subject: [PATCH 10/10] rename colourlist to colorlist --- src/omero_cli_render.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/omero_cli_render.py b/src/omero_cli_render.py index a78c2700..9486b966 100755 --- a/src/omero_cli_render.py +++ b/src/omero_cli_render.py @@ -897,7 +897,7 @@ def set(self, args): self._update_channel_names(self.gateway, iids, namedict) def set_image_settings(self, img, data, cindices, rangelist, - colourlist, greyscale, minmaxlist, args): + colorlist, greyscale, minmaxlist, args): (def_z, def_t) = self._read_default_planes( img, data, ignore_errors=args.ignore_errors) @@ -913,7 +913,7 @@ def set_image_settings(self, img, data, cindices, rangelist, active_channels.append(ci) img.set_active_channels( - cindices, windows=rangelist, colors=colourlist, + cindices, windows=rangelist, colors=colorlist, set_inactive=True) if greyscale is not None: