1818from spatialdata import get_element_annotators , get_element_instances
1919from spatialdata ._core .query .relational_query import _left_join_spatialelement_table
2020from spatialdata ._types import ArrayLike
21- from spatialdata .models import PointsModel , ShapesModel , TableModel , force_2d , get_channel_names
21+ from spatialdata .models import PointsModel , ShapesModel , TableModel , force_2d , get_axes_names , get_channel_names
2222from spatialdata .transformations import Affine , Identity
2323
2424from napari_spatialdata ._model import DataModel
2525from napari_spatialdata .constants import config
26- from napari_spatialdata .constants .config import CIRCLES_AS_POINTS
2726from napari_spatialdata .utils ._utils import (
2827 _adjust_channels_order ,
2928 _get_ellipses_from_circles ,
@@ -470,7 +469,7 @@ def get_sdata_image(self, sdata: SpatialData, key: str, selected_cs: str, multi:
470469 if multi :
471470 original_name = original_name [: original_name .rfind ("_" )]
472471
473- affine = _get_transform (sdata .images [original_name ], selected_cs )
472+ affine = _get_transform (sdata .images [original_name ], selected_cs , include_z = True )
474473 rgb_image , rgb = _adjust_channels_order (element = sdata .images [original_name ])
475474
476475 channels = ("RGB(A)" ,) if rgb else get_channel_names (sdata .images [original_name ])
@@ -517,6 +516,7 @@ def get_sdata_circles(self, sdata: SpatialData, key: str, selected_cs: str, mult
517516 df = sdata .shapes [original_name ]
518517 affine = _get_transform (sdata .shapes [original_name ], selected_cs )
519518
519+ # 2.5D circles not supported yet
520520 xy = np .array ([df .geometry .x , df .geometry .y ]).T
521521 yx = np .fliplr (xy )
522522 radii = df .radius .to_numpy ()
@@ -541,10 +541,10 @@ def get_sdata_circles(self, sdata: SpatialData, key: str, selected_cs: str, mult
541541 version = get_napari_version ()
542542 kwargs : dict [str , Any ] = (
543543 {"edge_width" : 0.0 }
544- if version <= packaging .version .parse ("0.4.20" ) or not CIRCLES_AS_POINTS
544+ if version <= packaging .version .parse ("0.4.20" ) or not config . CIRCLES_AS_POINTS
545545 else {"border_width" : 0.0 }
546546 )
547- if CIRCLES_AS_POINTS :
547+ if config . CIRCLES_AS_POINTS :
548548 layer = Points (
549549 yx ,
550550 name = key ,
@@ -556,7 +556,7 @@ def get_sdata_circles(self, sdata: SpatialData, key: str, selected_cs: str, mult
556556 assert affine is not None
557557 self ._adjust_radii_of_points_layer (layer = layer , affine = affine )
558558 else :
559- if version <= packaging .version .parse ("0.4.20" ) or not CIRCLES_AS_POINTS :
559+ if version <= packaging .version .parse ("0.4.20" ) or not config . CIRCLES_AS_POINTS :
560560 kwargs |= {"edge_color" : "white" }
561561 else :
562562 kwargs |= {"border_color" : "white" }
@@ -597,7 +597,8 @@ def get_sdata_shapes(self, sdata: SpatialData, key: str, selected_cs: str, multi
597597 original_name = original_name [: original_name .rfind ("_" )]
598598
599599 df = sdata .shapes [original_name ]
600- affine = _get_transform (sdata .shapes [original_name ], selected_cs )
600+ include_z = not config .PROJECT_2_5D_SHAPES_TO_2D
601+ affine = _get_transform (sdata .shapes [original_name ], selected_cs , include_z = include_z )
601602
602603 # when mulitpolygons are present, we select the largest ones
603604 if "MultiPolygon" in np .unique (df .geometry .type ):
@@ -609,7 +610,7 @@ def get_sdata_shapes(self, sdata: SpatialData, key: str, selected_cs: str, multi
609610 df = df .sort_index () # reset the index to the first order
610611
611612 simplify = len (df ) > config .POLYGON_THRESHOLD
612- polygons , indices = _get_polygons_properties (df , simplify )
613+ polygons , indices = _get_polygons_properties (df , simplify , include_z = include_z )
613614
614615 # this will only work for polygons and not for multipolygons
615616 polygons = _transform_coordinates (polygons , f = lambda x : x [::- 1 ])
@@ -662,7 +663,7 @@ def get_sdata_labels(self, sdata: SpatialData, key: str, selected_cs: str, multi
662663 original_name = original_name [: original_name .rfind ("_" )]
663664
664665 indices = get_element_instances (sdata .labels [original_name ])
665- affine = _get_transform (sdata .labels [original_name ], selected_cs )
666+ affine = _get_transform (sdata .labels [original_name ], selected_cs , include_z = True )
666667 rgb_labels , _ = _adjust_channels_order (element = sdata .labels [original_name ])
667668
668669 adata , table_name , table_names = self ._get_table_data (sdata , original_name )
@@ -706,8 +707,10 @@ def get_sdata_points(self, sdata: SpatialData, key: str, selected_cs: str, multi
706707 if multi :
707708 original_name = original_name [: original_name .rfind ("_" )]
708709
710+ axes = get_axes_names (sdata .points [original_name ])
709711 points = sdata .points [original_name ].compute ()
710- affine = _get_transform (sdata .points [original_name ], selected_cs )
712+ include_z = "z" in axes and not config .PROJECT_3D_POINTS_TO_2D
713+ affine = _get_transform (sdata .points [original_name ], selected_cs , include_z = include_z )
711714 adata , table_name , table_names = self ._get_table_data (sdata , original_name )
712715
713716 if len (points ) < config .POINT_THRESHOLD :
@@ -727,14 +730,16 @@ def get_sdata_points(self, sdata: SpatialData, key: str, selected_cs: str, multi
727730 _ , adata = _left_join_spatialelement_table (
728731 {"points" : {original_name : subsample_points }}, sdata [table_name ], match_rows = "left"
729732 )
730- xy = subsample_points [["y" , "x" ]].values
731- np .fliplr (xy )
733+ axes = sorted (axes , reverse = True )
734+ if not include_z and "z" in axes :
735+ axes .remove ("z" )
736+ coords = subsample_points [axes ].values
732737 # radii_size = _calc_default_radii(self.viewer, sdata, selected_cs)
733738 radii_size = 3
734739 version = get_napari_version ()
735740 kwargs = {"edge_width" : 0.0 } if version <= packaging .version .parse ("0.4.20" ) else {"border_width" : 0.0 }
736741 layer = Points (
737- xy ,
742+ coords ,
738743 name = key ,
739744 size = radii_size * 2 ,
740745 affine = affine ,
0 commit comments