def run_as_data_tool(self): from cellprofiler.gui.editobjectsdlg import EditObjectsDialog import wx from wx.lib.filebrowsebutton import FileBrowseButton from cellprofiler.modules.namesandtypes import ObjectsImageProvider from bioformats import load_image with wx.Dialog(None) as dlg: dlg.Title = "Choose files for editing" dlg.Sizer = wx.BoxSizer(wx.VERTICAL) sub_sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.Sizer.Add(sub_sizer, 0, wx.EXPAND | wx.ALL, 5) new_or_existing_rb = wx.RadioBox(dlg, style=wx.RA_VERTICAL, choices=("New", "Existing")) sub_sizer.Add(new_or_existing_rb, 0, wx.EXPAND) objects_file_fbb = FileBrowseButton( dlg, size=(300, -1), fileMask= "Objects file (*.tif, *.tiff, *.png, *.bmp, *.jpg)|*.tif;*.tiff;*.png;*.bmp;*.jpg", dialogTitle="Select objects file", labelText="Objects file:", ) objects_file_fbb.Enable(False) sub_sizer.AddSpacer(5) sub_sizer.Add(objects_file_fbb, 0, wx.ALIGN_TOP | wx.ALIGN_RIGHT) def on_radiobox(event): objects_file_fbb.Enable(new_or_existing_rb.GetSelection() == 1) new_or_existing_rb.Bind(wx.EVT_RADIOBOX, on_radiobox) image_file_fbb = FileBrowseButton( dlg, size=(300, -1), fileMask= "Objects file (*.tif, *.tiff, *.png, *.bmp, *.jpg)|*.tif;*.tiff;*.png;*.bmp;*.jpg", dialogTitle="Select guide image file", labelText="Guide image:", ) dlg.Sizer.Add(image_file_fbb, 0, wx.EXPAND | wx.ALL, 5) allow_overlap_checkbox = wx.CheckBox(dlg, -1, "Allow objects to overlap") allow_overlap_checkbox.Value = True dlg.Sizer.Add(allow_overlap_checkbox, 0, wx.EXPAND | wx.ALL, 5) buttons = wx.StdDialogButtonSizer() dlg.Sizer.Add(buttons, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.ALL, 5) buttons.Add(wx.Button(dlg, wx.ID_OK)) buttons.Add(wx.Button(dlg, wx.ID_CANCEL)) buttons.Realize() dlg.Fit() result = dlg.ShowModal() if result != wx.ID_OK: return self.allow_overlap.value = allow_overlap_checkbox.Value fullname = objects_file_fbb.GetValue() guidename = image_file_fbb.GetValue() if new_or_existing_rb.GetSelection() == 1: provider = ObjectsImageProvider("InputObjects", pathname2url(fullname), None, None) image = provider.provide_image(None) pixel_data = image.pixel_data shape = pixel_data.shape[:2] labels = [pixel_data[:, :, i] for i in range(pixel_data.shape[2])] else: labels = None # # Load the guide image # guide_image = load_image(guidename) if np.min(guide_image) != np.max(guide_image): guide_image = (guide_image - np.min(guide_image)) / ( np.max(guide_image) - np.min(guide_image)) if labels is None: shape = guide_image.shape[:2] labels = [np.zeros(shape, int)] with EditObjectsDialog(guide_image, labels, self.allow_overlap, self.object_name.value) as dialog_box: result = dialog_box.ShowModal() if result != wx.OK: return labels = dialog_box.labels n_frames = len(labels) with wx.FileDialog(None, style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as dlg: dlg.Path = fullname dlg.Wildcard = ("Object image file (*.tif,*.tiff)|*.tif;*.tiff|" "Ilastik project file (*.ilp)|*.ilp") result = dlg.ShowModal() fullname = dlg.Path if result == wx.ID_OK: if fullname.endswith(".ilp"): self.save_into_ilp(fullname, labels, guidename) else: from bioformats.formatwriter import write_image from bioformats.omexml import PT_UINT16 if os.path.exists(fullname): os.unlink(fullname) for i, l in enumerate(labels): write_image(fullname, l, PT_UINT16, t=i, size_t=len(labels))
class panelConfigure(wx.Panel): """ """ def __init__(self, parent): """ """ wx.Panel.__init__(self, parent, wx.ID_ANY, size=(-1, 300), style=wx.SUNKEN_BORDER | wx.TAB_TRAVERSAL) self.parent = parent self.thumbnail = None self.mask_file = None self.source = None self.sourceType = None self.track = None self.trackType = None lowerSizer = wx.BoxSizer(wx.HORIZONTAL) #Static box1 (LEFT) sb_1 = wx.StaticBox(self, -1, "Select Monitor") #, size=(250,-1)) sbSizer_1 = wx.StaticBoxSizer(sb_1, wx.VERTICAL) n_monitors = options.GetOption("Monitors") self.MonitorList = [ 'Monitor %s' % (int(m) + 1) for m in range(n_monitors) ] self.thumbnailNumber = wx.ComboBox(self, -1, size=(-1, -1), choices=self.MonitorList, style=wx.CB_DROPDOWN | wx.CB_READONLY | wx.CB_SORT) self.Bind(wx.EVT_COMBOBOX, self.onChangingMonitor, self.thumbnailNumber) self.currentSource = wx.TextCtrl(self, -1, "No Source Selected", style=wx.TE_READONLY) btnSizer_1 = wx.BoxSizer(wx.HORIZONTAL) self.btnPlay = wx.Button(self, wx.ID_FORWARD, label="Play") self.btnStop = wx.Button(self, wx.ID_STOP, label="Stop") self.Bind(wx.EVT_BUTTON, self.onPlay, self.btnPlay) self.Bind(wx.EVT_BUTTON, self.onStop, self.btnStop) self.btnPlay.Enable(False) self.btnStop.Enable(False) self.applyButton = wx.Button(self, wx.ID_APPLY) self.applyButton.SetToolTip(wx.ToolTip("Apply and Save to file")) self.Bind(wx.EVT_BUTTON, self.onApplySource, self.applyButton) btnSizer_1.Add(self.btnPlay, 0, wx.ALIGN_LEFT | wx.ALL, 5) btnSizer_1.Add(self.btnStop, 0, wx.ALIGN_CENTER | wx.LEFT | wx.TOP | wx.DOWN, 5) btnSizer_1.Add(self.applyButton, 0, wx.ALIGN_RIGHT | wx.LEFT | wx.RIGHT | wx.TOP, 5) sbSizer_1.Add(self.thumbnailNumber, 0, wx.ALIGN_CENTRE | wx.LEFT | wx.RIGHT | wx.TOP, 5) sbSizer_1.Add( self.currentSource, 0, wx.EXPAND | wx.ALIGN_CENTRE | wx.LEFT | wx.RIGHT | wx.TOP, 5) sbSizer_1.Add(btnSizer_1, 0, wx.EXPAND | wx.ALIGN_BOTTOM | wx.TOP, 5) lowerSizer.Add(sbSizer_1, 0, wx.EXPAND | wx.ALL, 5) #Static box2 (CENTER) sb_2 = wx.StaticBox(self, -1, "Select Video input") sbSizer_2 = wx.StaticBoxSizer(sb_2, wx.VERTICAL) grid2 = wx.FlexGridSizer(0, 2, 0, 0) n_cams = options.GetOption("Webcams") self.WebcamsList = ['Webcam %s' % (int(w) + 1) for w in range(n_cams)] rb1 = wx.RadioButton(self, -1, 'Camera', style=wx.RB_GROUP) source1 = wx.ComboBox(self, -1, size=(285, -1), choices=self.WebcamsList, style=wx.CB_DROPDOWN | wx.CB_READONLY | wx.CB_SORT) self.Bind(wx.EVT_COMBOBOX, self.sourceCallback, source1) rb2 = wx.RadioButton(self, -1, 'File') source2 = FileBrowseButton(self, -1, labelText='', size=(300, -1), changeCallback=self.sourceCallback) rb3 = wx.RadioButton(self, -1, 'Folder') source3 = DirBrowseButton(self, style=wx.DD_DIR_MUST_EXIST, labelText='', size=(300, -1), changeCallback=self.sourceCallback) self.controls = [] self.controls.append((rb1, source1)) self.controls.append((rb2, source2)) self.controls.append((rb3, source3)) for radio, source in self.controls: grid2.Add(radio, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2) grid2.Add(source, 0, wx.ALIGN_CENTRE | wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2) self.Bind(wx.EVT_RADIOBUTTON, self.onChangeSource, radio) source.Enable(False) self.controls[0][1].Enable(True) #grid2.Add(wx.StaticText(self, -1, "")) sbSizer_2.Add(grid2) lowerSizer.Add(sbSizer_2, 0, wx.EXPAND | wx.ALL, 5) #Static box3 (RIGHT) sb_3 = wx.StaticBox(self, -1, "Set Tracking Parameters") sbSizer_3 = wx.StaticBoxSizer(sb_3, wx.VERTICAL) sbSizer_31 = wx.BoxSizer(wx.HORIZONTAL) self.activateTracking = wx.CheckBox(self, -1, "Activate Tracking") self.activateTracking.SetValue(False) self.activateTracking.Bind(wx.EVT_CHECKBOX, self.onActivateTracking) self.isSDMonitor = wx.CheckBox(self, -1, "Sleep Deprivation Monitor") self.isSDMonitor.SetValue(False) self.isSDMonitor.Bind(wx.EVT_CHECKBOX, self.onSDMonitor) self.isSDMonitor.Enable(False) sbSizer_31.Add(self.activateTracking, 0, wx.ALIGN_LEFT | wx.LEFT | wx.RIGHT | wx.TOP, 5) sbSizer_31.Add(self.isSDMonitor, 0, wx.ALIGN_LEFT | wx.LEFT | wx.RIGHT | wx.TOP, 5) self.pickMaskBrowser = FileBrowseButton(self, -1, labelText='Mask File') #sbSizer_3.Add ( self.activateTracking , 0, wx.ALIGN_LEFT|wx.LEFT|wx.RIGHT|wx.TOP, 5 ) sbSizer_3.Add(sbSizer_31, 0, wx.ALIGN_LEFT | wx.LEFT | wx.RIGHT | wx.TOP, 5) sbSizer_3.Add(self.pickMaskBrowser, 0, wx.ALIGN_LEFT | wx.LEFT | wx.RIGHT | wx.TOP | wx.EXPAND, 5) #trackingTypeSizer = wx.Sizer(wx.HORIZONTAL) self.trackDistanceRadio = wx.RadioButton( self, -1, "Activity as distance traveled", style=wx.RB_GROUP) self.trackVirtualBM = wx.RadioButton( self, -1, "Activity as midline crossings count") self.trackPosition = wx.RadioButton(self, -1, "Only position of flies") sbSizer_3.Add(wx.StaticText(self, -1, "Calculate fly activity as..."), 0, wx.ALIGN_LEFT | wx.LEFT | wx.RIGHT | wx.TOP, 5) sbSizer_3.Add(self.trackDistanceRadio, 0, wx.ALIGN_LEFT | wx.LEFT | wx.RIGHT | wx.TOP, 2) sbSizer_3.Add(self.trackVirtualBM, 0, wx.ALIGN_LEFT | wx.LEFT | wx.RIGHT | wx.TOP, 2) sbSizer_3.Add(self.trackPosition, 0, wx.ALIGN_LEFT | wx.LEFT | wx.RIGHT | wx.TOP, 2) lowerSizer.Add(sbSizer_3, -1, wx.EXPAND | wx.ALL, 5) self.SetSizer(lowerSizer) self.Bind(EVT_THUMBNAIL_CLICKED, self.onThumbnailClicked) def __getSource(self): """ check which source is ticked and what is the associated value """ for (r, s), st in zip(self.controls, range(3)): if r.GetValue(): source = s.GetValue() sourceType = st return source, sourceType def __getTrackingType(self): """ return which tracking we are chosing ['DISTANCE','VBS','XY_COORDS'] """ if self.trackDistanceRadio.GetValue(): trackType = "DISTANCE" elif self.trackVirtualBM.GetValue(): trackType = "VBS" elif self.trackPosition.GetValue(): trackType = "XY_COORDS" return trackType def onPlay(self, event=None): """ """ if self.thumbnail: self.thumbnail.Play() self.btnStop.Enable(True) def onStop(self, event=None): """ """ if self.thumbnail and self.thumbnail.isPlaying: self.thumbnail.Stop() self.btnStop.Enable(False) def onThumbnailClicked(self, evt): """ Picking thumbnail by clicking on it """ self.monitor_number = evt.number + 1 self.thumbnail = evt.thumbnail self.thumbnailNumber.SetValue(self.MonitorList[self.monitor_number - 1]) self.updateThumbnail() def onChangingMonitor(self, evt): """ Picking thumbnail by using the dropbox """ sel = evt.GetString() self.monitor_number = self.MonitorList.index(sel) + 1 self.thumbnail = self.parent.scrollThumbnails.previewPanels[ self.monitor_number] #this is not very elegant self.updateThumbnail() def updateThumbnail(self): """ Refreshing thumbnail data """ if options.HasMonitor(self.monitor_number): sourceType, source, track, mask_file, trackType, isSDMonitor = options.GetMonitor( self.monitor_number) else: sourceType, source, track, mask_file, trackType, isSDMonitor = [ 0, '', False, '', 1, False ] if sourceType == 0 and source != '': source = self.WebcamsList[source] self.source = self.thumbnail.source = source self.sourceType = self.thumbnail.sourceType = sourceType self.thumbnail.track = track if self.thumbnail.hasMonitor(): self.thumbnail.mon.isSDMonitor = isSDMonitor #update first static box active = self.thumbnail.hasMonitor() self.applyButton.Enable(active) self.btnPlay.Enable(active) self.btnStop.Enable(active and self.thumbnail.isPlaying) text = os.path.split(str(self.source))[1] or "No Source Selected" self.currentSource.SetValue(text) #update second static box for radio, src in self.controls: src.Enable(False) src.SetValue('') radio, src = self.controls[self.sourceType] radio.SetValue(True) src.Enable(True) src.SetValue(self.source) #update third static box self.activateTracking.SetValue(self.thumbnail.track) self.isSDMonitor.SetValue(isSDMonitor) self.pickMaskBrowser.SetValue(mask_file or '') [self.trackDistanceRadio, self.trackVirtualBM, self.trackPosition][trackType].SetValue(True) def sourceCallback(self, event): """ """ self.applyButton.Enable(True) def onChangeSource(self, event): """ """ radio_selected = event.GetEventObject() for radio, source in self.controls: if radio is radio_selected: source.Enable(True) else: source.Enable(False) self.applyButton.Enable(True) def onApplySource(self, event): """ """ source, sourceType = self.__getSource() track = self.activateTracking.GetValue() self.mask_file = self.pickMaskBrowser.GetValue() self.trackType = self.__getTrackingType() if self.thumbnail: if sourceType > 0: camera = source else: camera = self.WebcamsList.index(source) self.thumbnail.source = camera self.thumbnail.sourceType = sourceType #Change the source text self.currentSource.SetValue(os.path.split(source)[1]) #Set thumbnail's source self.thumbnail.setMonitor(camera) #Enable buttons self.btnPlay.Enable(True) self.activateTracking.Enable(True) self.pickMaskBrowser.Enable(True) self.saveMonitorConfiguration() def saveMonitorConfiguration(self): """ """ options.SetMonitor(self.monitor_number, self.thumbnail.sourceType, self.thumbnail.source + 1, self.thumbnail.track, self.mask_file, self.trackType, self.thumbnail.mon.isSDMonitor) options.Save() def onActivateTracking(self, event): """ """ if self.thumbnail: self.thumbnail.track = event.IsChecked() def onSDMonitor(self, event): """ """ if self.thumbnail: self.thumbnail.mon.isSDMonitor = event.IsChecked()