@@ -44,23 +44,6 @@ def __init__(self):
44
44
45
45
self .setLayout (layout )
46
46
47
- # def get_selected_layer_data(self, selector_name):
48
- # """Return the data for the layer currently selected in a given selector."""
49
- # if selector_name in self.layer_selectors:
50
- # selector_widget = self.layer_selectors[selector_name]
51
-
52
- # # Retrieve the QComboBox from the QWidget's layout
53
- # image_selector = selector_widget.layout().itemAt(1).widget()
54
-
55
- # if isinstance(image_selector, QComboBox):
56
- # selected_layer_name = image_selector.currentText()
57
- # if selected_layer_name in self.viewer.layers:
58
- # return self.viewer.layers[selected_layer_name].data
59
- # # selected_layer_name = self.layer_selectors[selector_name].currentText()
60
- # # if selected_layer_name in self.viewer.layers:
61
- # # return self.viewer.layers[selected_layer_name].data
62
- # return None # Return None if layer not found
63
-
64
47
def on_measure_segmentation_to_object (self ):
65
48
segmentation1_data = self ._get_layer_selector_data (self .image_selector_name1 )
66
49
segmentation2_data = self ._get_layer_selector_data (self .image_selector_name2 )
@@ -72,144 +55,79 @@ def on_measure_segmentation_to_object(self):
72
55
(distances ,
73
56
endpoints1 ,
74
57
endpoints2 ,
75
- seg_ids ,
76
- object_ids ) = distance_measurements .measure_segmentation_to_object_distances (
58
+ seg_ids ) = distance_measurements .measure_segmentation_to_object_distances (
77
59
segmentation = segmentation1_data ,
78
60
segmented_object = segmentation2_data ,
79
61
distance_type = "boundary" ,
80
62
# save_path=self.save_path
81
63
)
82
- if self .save_path is not None :
83
- file_path = save_to_csv (self .save_path , data = (distances , endpoints1 , endpoints2 , seg_ids , object_ids ))
64
+ if self .save_path .text () != "" :
65
+ # save to csv
66
+ header = "distances endpoints1 endpoints2 seg_ids"
67
+ header_list = header .split (" " )
68
+ file_path = save_to_csv (
69
+ self .save_path .text (),
70
+ data = (distances , endpoints1 , endpoints2 , seg_ids ),
71
+ header = header_list
72
+ )
84
73
show_info (f"Measurements saved to { file_path } " )
74
+ lines , properties = distance_measurements .create_object_distance_lines (
75
+ distances = distances ,
76
+ endpoints1 = endpoints1 ,
77
+ endpoints2 = endpoints2 ,
78
+ seg_ids = seg_ids
79
+ )
85
80
86
- show_info ("Not implemented yet." )
81
+ # Add the lines layer
82
+ self .viewer .add_shapes (
83
+ lines ,
84
+ name = "Distance Lines" ,
85
+ shape_type = "line" , # Specify the shape type as 'line'
86
+ edge_width = 2 ,
87
+ edge_color = "red" ,
88
+ blending = "additive" , # Use 'additive' for blending if needed
89
+ )
90
+ if self .save_path .text () != "" :
91
+ show_info (f"Added distance lines and saved file to { file_path } ." )
92
+ else :
93
+ show_info ("Added distance lines." )
87
94
return
88
95
89
96
def on_measure_pairwise (self ):
90
97
if self .image is None :
91
98
show_info ("Please choose a segmentation." )
92
99
return
93
- if self .save_path is None :
100
+ if self .save_path . value () is None :
94
101
show_info ("Please choose a save path." )
95
102
return
96
- # get segmentation
97
- segmentation = self .image
98
- # run measurements
99
103
show_info ("Not implemented yet." )
100
104
return
101
- distance_measurements .measure_pairwise_object_distances (
102
- segmentation = segmentation , distance_type = "boundary" ,
103
- save_path = self .save_path
104
- )
105
- lines , properties = distance_measurements .create_distance_lines (
106
- measurement_path = self .save_path
107
- )
108
-
109
- # Add the lines layer
110
- self .viewer .add_lines (
111
- lines , name = "Distance Lines" , visible = True , edge_width = 2 , edge_color = "red" , edge_blend = "additive"
112
- )
113
-
114
- # layer_kwargs = {"colormap": "inferno", "blending": "additive"}
115
- # return segmentation, layer_kwargs
116
-
117
- # def create_image_selector(self, selector_name):
118
- # attribute_dict = {}
119
- # viewer = self.viewer
120
- # """Create an image selector widget for a specific layer attribute."""
121
- # selector_widget = QWidget()
122
- # image_selector = QComboBox()
123
- # title_label = QLabel(f"Select Layer for {selector_name}:")
124
-
125
- # # Populate initial options
126
- # self.update_selector(viewer, image_selector)
127
-
128
- # # Connect selection change to update image data in attribute_dict
129
- # image_selector.currentIndexChanged.connect(
130
- # lambda: self.update_image_data(viewer, image_selector, attribute_dict, selector_name)
131
- # )
132
-
133
- # # Update selector on layer events
134
- # viewer.layers.events.inserted.connect(lambda event: self.update_selector(viewer, image_selector))
135
- # viewer.layers.events.removed.connect(lambda event: self.update_selector(viewer, image_selector))
136
-
137
- # # Store this combo box in the selectors dictionary
138
- # self.selectors[selector_name] = image_selector
139
-
140
- # # Set up layout
141
- # layout = QVBoxLayout()
142
- # layout.addWidget(title_label)
143
- # layout.addWidget(image_selector)
144
- # selector_widget.setLayout(layout)
145
-
146
- # return selector_widget
147
-
148
- # def update_selector(self, viewer, selector):
149
- # """Update a single selector with the current image layers in the viewer."""
150
- # selector.clear()
151
- # image_layers = [layer.name for layer in viewer.layers] # if isinstance(layer, napari.layers.Image)
152
- # selector.addItems(image_layers)
153
-
154
- # def update_image_data(self, viewer, selector, attribute_dict, attribute_name):
155
- # """Update the specified attribute in the attribute_dict with selected layer data."""
156
- # selected_layer_name = selector.currentText()
157
- # if selected_layer_name in viewer.layers:
158
- # attribute_dict[attribute_name] = viewer.layers[selected_layer_name].data
159
- # else:
160
- # attribute_dict[attribute_name] = None # Reset if no valid selection
105
+ # distance_measurements.measure_pairwise_object_distances(
106
+ # segmentation=segmentation, distance_type="boundary",
107
+ # save_path=self.save_path
108
+ # )
109
+ # lines, properties = distance_measurements.create_distance_lines(
110
+ # measurement_path=self.save_path
111
+ # )
112
+
113
+ # # Add the lines layer
114
+ # self.viewer.add_lines(
115
+ # lines, name="Distance Lines", visible=True, edge_width=2, edge_color="red", edge_blend="additive"
116
+ # )
161
117
162
118
def _create_settings_widget (self ):
163
119
setting_values = QWidget ()
164
120
# setting_values.setToolTip(get_tooltip("embedding", "settings"))
165
121
setting_values .setLayout (QVBoxLayout ())
166
122
167
123
self .save_path , layout = self ._add_path_param (
168
- name = "Save Directory" , select_type = "directory" , value = None
124
+ name = "Save Directory" , select_type = "directory" , value = ""
169
125
)
170
126
setting_values .layout ().addLayout (layout )
171
127
172
128
settings = self ._make_collapsible (widget = setting_values , title = "Advanced Settings" )
173
129
return settings
174
130
175
- # def create_image_selector(self):
176
- # selector_widget = QWidget()
177
- # self.image_selector = QComboBox()
178
-
179
- # title_label = QLabel("Select Image Layer:")
180
-
181
- # # Populate initial options
182
- # self.update_image_selector()
183
-
184
- # # Connect selection change to update self.image
185
- # self.image_selector.currentIndexChanged.connect(self.update_image_data)
186
-
187
- # # Connect to Napari layer events to update the list
188
- # self.viewer.layers.events.inserted.connect(self.update_image_selector)
189
- # self.viewer.layers.events.removed.connect(self.update_image_selector)
190
-
191
- # layout = QVBoxLayout()
192
- # layout.addWidget(title_label)
193
- # layout.addWidget(self.image_selector)
194
- # selector_widget.setLayout(layout)
195
- # return selector_widget
196
-
197
- # def update_image_selector(self, event=None):
198
- # """Update dropdown options with current image layers in the viewer."""
199
- # self.image_selector.clear()
200
-
201
- # # Add each image layer's name to the dropdown
202
- # image_layers = [layer.name for layer in self.viewer.layers if isinstance(layer, napari.layers.Image)]
203
- # self.image_selector.addItems(image_layers)
204
-
205
- # def update_image_data(self):
206
- # """Update the self.image attribute with data from the selected layer."""
207
- # selected_layer_name = self.image_selector.currentText()
208
- # if selected_layer_name in self.viewer.layers:
209
- # self.image = self.viewer.layers[selected_layer_name].data
210
- # else:
211
- # self.image = None # Reset if no valid selection
212
-
213
131
214
132
def get_distance_measure_widget ():
215
133
return DistanceMeasureWidget ()
0 commit comments