def __init__(self, handle, **kwds): kwds.pop('viewRect', None) self.data = handle.read() self.groupitem = pg.ItemGroup() self.pipettes = {} for dev in self.data.devices(): arrow = pg.ArrowItem() self.pipettes[dev] = arrow arrow.setParentItem(self.groupitem) opts = {'movable': False, 'rotatable': False, 'handle': handle} opts.update(kwds) if opts.get('name') is None: opts['name'] = handle.shortName() CanvasItem.__init__(self, self.groupitem, **opts) self._timeSliderResolution = 10. # 10 ticks per second on the time slider self._mpCtrlWidget = MultiPatchLogCtrlWidget() self.layout.addWidget(self._mpCtrlWidget, self.layout.rowCount(), 0, 1, 2) self._mpCtrlWidget.timeSlider.setMaximum( self._timeSliderResolution * (self.data.lastTime() - self.data.firstTime())) self._mpCtrlWidget.timeSlider.valueChanged.connect( self.timeSliderChanged) self._mpCtrlWidget.createMarkersBtn.clicked.connect( self.createMarkersClicked) self.timeSliderChanged(0)
def __init__(self, **opts): if 'scale' not in opts: opts['scale'] = [20e-6, 20e-6] item = QtGui.QGraphicsEllipseItem(-0.5, -0.5, 1., 1.) item.setPen(pg.mkPen((255, 255, 255))) item.setBrush(pg.mkBrush((0, 100, 255))) opts.setdefault('scalable', False) opts.setdefault('rotatable', False) CanvasItem.__init__(self, item, **opts) self.selectBox.addTranslateHandle([0.5, 0.5])
def __init__(self, points=None, **kwds): vr = kwds.pop('viewRect', None) if points is None: if vr is None: points = ((0, 0), (1, 1)) else: p1 = vr.center() p2 = p1 + 0.2 * (vr.topRight() - p1) points = ((p1.x(), p1.y()), (p2.x(), p2.y())) item = pg.graphicsItems.ROI.RulerROI(points) CanvasItem.__init__(self, item, **kwds)
def __init__(self, **opts): if 'scale' not in opts: opts['scale'] = [20e-6, 20e-6] #opts['size'] = [20e-6, 20e-6] #opts['scale'] = [1., 1.] item = QtGui.QGraphicsEllipseItem(-0.5, -0.5, 1., 1.) item.setPen(pg.mkPen((255,255,255))) item.setBrush(pg.mkBrush((0,100,255))) opts['scalable'] = False opts['rotatable'] = False CanvasItem.__init__(self, item, **opts) self.selectBox.addTranslateHandle([0.5,0.5])
def addGraphicsItem(self, item, **opts): """Add a new GraphicsItem to the scene at pos. Common options are name, pos, scale, and z """ citem = CanvasItem(item, **opts) item._canvasItem = citem self.addItem(citem) return citem
def __init__(self, parent=None, allowTransforms=True, hideCtrl=False, name=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_Form() self.ui.setupUi(self) #self.view = self.ui.view self.view = ViewBox() self.ui.view.setCentralItem(self.view) self.itemList = self.ui.itemList self.itemList.setSelectionMode(self.itemList.ExtendedSelection) self.allowTransforms = allowTransforms self.multiSelectBox = SelectBox() self.view.addItem(self.multiSelectBox) self.multiSelectBox.hide() self.multiSelectBox.setZValue(1e6) self.ui.mirrorSelectionBtn.hide() self.ui.reflectSelectionBtn.hide() self.ui.resetTransformsBtn.hide() self.redirect = None ## which canvas to redirect items to self.items = [] #self.view.enableMouse() self.view.setAspectLocked(True) self.view.invertY() grid = GridItem() self.grid = CanvasItem(grid, name='Grid', movable=False) self.addItem(self.grid) self.hideBtn = QtGui.QPushButton('>', self) self.hideBtn.setFixedWidth(20) self.hideBtn.setFixedHeight(20) self.ctrlSize = 200 self.sizeApplied = False self.hideBtn.clicked.connect(self.hideBtnClicked) self.ui.splitter.splitterMoved.connect(self.splitterMoved) self.ui.itemList.itemChanged.connect(self.treeItemChanged) self.ui.itemList.sigItemMoved.connect(self.treeItemMoved) self.ui.itemList.itemSelectionChanged.connect(self.treeItemSelected) self.ui.autoRangeBtn.clicked.connect(self.autoRange) self.ui.storeSvgBtn.clicked.connect(self.storeSvg) self.ui.storePngBtn.clicked.connect(self.storePng) self.ui.redirectCheck.toggled.connect(self.updateRedirect) self.ui.redirectCombo.currentIndexChanged.connect(self.updateRedirect) self.multiSelectBox.sigRegionChanged.connect(self.multiSelectBoxChanged) self.multiSelectBox.sigRegionChangeFinished.connect(self.multiSelectBoxChangeFinished) self.ui.mirrorSelectionBtn.clicked.connect(self.mirrorSelectionClicked) self.ui.reflectSelectionBtn.clicked.connect(self.reflectSelectionClicked) self.ui.resetTransformsBtn.clicked.connect(self.resetTransformsClicked) self.resizeEvent() if hideCtrl: self.hideBtnClicked() if name is not None: self.registeredName = CanvasManager.instance().registerCanvas(self, name) self.ui.redirectCombo.setHostName(self.registeredName)
def saveState(self, **kwds): state = CanvasItem.saveState(self, **kwds) state['imagestate'] = self.histogram.saveState() state['filter'] = self.filter.saveState() state['composition'] = self.imgModeCombo.currentText() return state
def __init__(self, handle, **opts): opts['handle'] = handle item = QtSvg.QGraphicsSvgItem(handle.name()) CanvasItem.__init__(self, item, **opts)
def __init__(self, image=None, **opts): """ CanvasItem displaying an image. The image may be 2 or 3-dimensional. Options: image: May be a fileHandle, ndarray, or GraphicsItem. handle: May optionally be specified in place of image """ ## If no image was specified, check for a file handle.. if image is None: image = opts.get('handle', None) item = None self.data = None self.currentT = None if isinstance(image, QtGui.QGraphicsItem): item = image elif isinstance(image, np.ndarray): self.data = image elif isinstance(image, DataManager.FileHandle): opts['handle'] = image self.handle = image self.data = self.handle.read() if 'name' not in opts: opts['name'] = self.handle.shortName() try: if 'transform' in self.handle.info(): tr = pg.SRTTransform3D(self.handle.info()['transform']) tr = pg.SRTTransform(tr) ## convert to 2D opts['pos'] = tr.getTranslation() opts['scale'] = tr.getScale() opts['angle'] = tr.getRotation() else: ## check for older info formats if 'imagePosition' in self.handle.info(): opts['scale'] = self.handle.info()['pixelSize'] opts['pos'] = self.handle.info()['imagePosition'] elif 'Downsample' in self.handle.info(): ### Needed to support an older format stored by 2p imager if 'pixelSize' in self.handle.info(): opts['scale'] = self.handle.info()['pixelSize'] if 'microscope' in self.handle.info(): m = self.handle.info()['microscope'] print 'm: ',m print 'mpos: ', m['position'] opts['pos'] = m['position'][0:2] else: info = self.data._info[-1] opts['pos'] = info.get('imagePosition', None) elif hasattr(self.data, '_info'): info = self.data._info[-1] opts['scale'] = info.get('pixelSize', None) opts['pos'] = info.get('imagePosition', None) else: opts['defaultUserTransform'] = {'scale': (1e-5, 1e-5)} opts['scalable'] = True except: debug.printExc('Error reading transformation for image file %s:' % image.name()) if item is None: item = pg.ImageItem() CanvasItem.__init__(self, item, **opts) self.histogram = pg.PlotWidget() self.blockHistogram = False self.histogram.setMaximumHeight(100) self.levelRgn = pg.LinearRegionItem() self.histogram.addItem(self.levelRgn) self.updateHistogram(autoLevels=True) # addWidget arguments: row, column, rowspan, colspan self.layout.addWidget(self.histogram, self.layout.rowCount(), 0, 1, 3) self.timeSlider = QtGui.QSlider(QtCore.Qt.Horizontal) #self.timeSlider.setMinimum(0) #self.timeSlider.setMaximum(self.data.shape[0]-1) self.layout.addWidget(self.timeSlider, self.layout.rowCount(), 0, 1, 3) self.timeSlider.valueChanged.connect(self.timeChanged) self.timeSlider.sliderPressed.connect(self.timeSliderPressed) self.timeSlider.sliderReleased.connect(self.timeSliderReleased) thisRow = self.layout.rowCount() self.edgeBtn = QtGui.QPushButton('Edge') self.edgeBtn.clicked.connect(self.edgeClicked) self.layout.addWidget(self.edgeBtn, thisRow, 0, 1, 1) self.meanBtn = QtGui.QPushButton('Mean') self.meanBtn.clicked.connect(self.meanClicked) self.layout.addWidget(self.meanBtn, thisRow+1, 0, 1, 1) self.tvBtn = QtGui.QPushButton('tv denoise') self.tvBtn.clicked.connect(self.tvClicked) self.layout.addWidget(self.tvBtn, thisRow+2, 0, 1, 1) self.maxBtn = QtGui.QPushButton('Max no Filter') self.maxBtn.clicked.connect(self.maxClicked) self.layout.addWidget(self.maxBtn, thisRow, 1, 1, 1) self.maxBtn2 = QtGui.QPushButton('Max w/Gaussian') self.maxBtn2.clicked.connect(self.max2Clicked) self.layout.addWidget(self.maxBtn2, thisRow+1, 1, 1, 1) self.maxMedianBtn = QtGui.QPushButton('Max w/Median') self.maxMedianBtn.clicked.connect(self.maxMedianClicked) self.layout.addWidget(self.maxMedianBtn, thisRow+2, 1, 1, 1) self.filterOrder = QtGui.QComboBox() self.filterLabel = QtGui.QLabel('Order') for n in range(1,11): self.filterOrder.addItem("%d" % n) self.layout.addWidget(self.filterLabel, thisRow+3, 2, 1, 1) self.layout.addWidget(self.filterOrder, thisRow+3, 3, 1, 1) self.zPlanes = QtGui.QComboBox() self.zPlanesLabel = QtGui.QLabel('# planes') for s in ['All', '1', '2', '3', '4', '5']: self.zPlanes.addItem("%s" % s) self.layout.addWidget(self.zPlanesLabel, thisRow+3, 0, 1, 1) self.layout.addWidget(self.zPlanes, thisRow + 3, 1, 1, 1) ## controls that only appear if there is a time axis self.timeControls = [self.timeSlider, self.edgeBtn, self.maxBtn, self.meanBtn, self.maxBtn2, self.maxMedianBtn, self.filterOrder, self.zPlanes] if self.data is not None: self.updateImage(self.data) self.graphicsItem().sigImageChanged.connect(self.updateHistogram) self.levelRgn.sigRegionChanged.connect(self.levelsChanged) self.levelRgn.sigRegionChangeFinished.connect(self.levelsChangeFinished)
def __init__(self, image=None, **opts): """ CanvasItem displaying an image. The image may be 2 or 3-dimensional. Options: image: May be a fileHandle, ndarray, or GraphicsItem. handle: May optionally be specified in place of image """ ## If no image was specified, check for a file handle.. if image is None: image = opts.get('handle', None) item = None self.data = None self.currentT = None if isinstance(image, QtGui.QGraphicsItem): item = image elif isinstance(image, np.ndarray): self.data = image elif isinstance(image, DataManager.FileHandle): opts['handle'] = image self.handle = image self.data = self.handle.read() if 'name' not in opts: opts['name'] = self.handle.shortName() try: if 'transform' in self.handle.info(): tr = pg.SRTTransform3D(self.handle.info()['transform']) tr = pg.SRTTransform(tr) ## convert to 2D opts['pos'] = tr.getTranslation() opts['scale'] = tr.getScale() opts['angle'] = tr.getRotation() else: ## check for older info formats if 'imagePosition' in self.handle.info(): opts['scale'] = self.handle.info()['pixelSize'] opts['pos'] = self.handle.info()['imagePosition'] elif 'Downsample' in self.handle.info(): ### Needed to support an older format stored by 2p imager if 'pixelSize' in self.handle.info(): opts['scale'] = self.handle.info()['pixelSize'] if 'microscope' in self.handle.info(): m = self.handle.info()['microscope'] print 'm: ', m print 'mpos: ', m['position'] opts['pos'] = m['position'][0:2] else: info = self.data._info[-1] opts['pos'] = info.get('imagePosition', None) elif hasattr(self.data, '_info'): info = self.data._info[-1] opts['scale'] = info.get('pixelSize', None) opts['pos'] = info.get('imagePosition', None) else: opts['defaultUserTransform'] = {'scale': (1e-5, 1e-5)} opts['scalable'] = True except: debug.printExc( 'Error reading transformation for image file %s:' % image.name()) if item is None: item = pg.ImageItem() CanvasItem.__init__(self, item, **opts) self.histogram = pg.PlotWidget() self.blockHistogram = False self.histogram.setMaximumHeight(100) self.levelRgn = pg.LinearRegionItem() self.histogram.addItem(self.levelRgn) self.updateHistogram(autoLevels=True) # addWidget arguments: row, column, rowspan, colspan self.layout.addWidget(self.histogram, self.layout.rowCount(), 0, 1, 3) self.timeSlider = QtGui.QSlider(QtCore.Qt.Horizontal) #self.timeSlider.setMinimum(0) #self.timeSlider.setMaximum(self.data.shape[0]-1) self.layout.addWidget(self.timeSlider, self.layout.rowCount(), 0, 1, 3) self.timeSlider.valueChanged.connect(self.timeChanged) self.timeSlider.sliderPressed.connect(self.timeSliderPressed) self.timeSlider.sliderReleased.connect(self.timeSliderReleased) thisRow = self.layout.rowCount() self.edgeBtn = QtGui.QPushButton('Edge') self.edgeBtn.clicked.connect(self.edgeClicked) self.layout.addWidget(self.edgeBtn, thisRow, 0, 1, 1) self.meanBtn = QtGui.QPushButton('Mean') self.meanBtn.clicked.connect(self.meanClicked) self.layout.addWidget(self.meanBtn, thisRow + 1, 0, 1, 1) self.tvBtn = QtGui.QPushButton('tv denoise') self.tvBtn.clicked.connect(self.tvClicked) self.layout.addWidget(self.tvBtn, thisRow + 2, 0, 1, 1) self.maxBtn = QtGui.QPushButton('Max no Filter') self.maxBtn.clicked.connect(self.maxClicked) self.layout.addWidget(self.maxBtn, thisRow, 1, 1, 1) self.maxBtn2 = QtGui.QPushButton('Max w/Gaussian') self.maxBtn2.clicked.connect(self.max2Clicked) self.layout.addWidget(self.maxBtn2, thisRow + 1, 1, 1, 1) self.maxMedianBtn = QtGui.QPushButton('Max w/Median') self.maxMedianBtn.clicked.connect(self.maxMedianClicked) self.layout.addWidget(self.maxMedianBtn, thisRow + 2, 1, 1, 1) self.filterOrder = QtGui.QComboBox() self.filterLabel = QtGui.QLabel('Order') for n in range(1, 11): self.filterOrder.addItem("%d" % n) self.layout.addWidget(self.filterLabel, thisRow + 3, 2, 1, 1) self.layout.addWidget(self.filterOrder, thisRow + 3, 3, 1, 1) self.zPlanes = QtGui.QComboBox() self.zPlanesLabel = QtGui.QLabel('# planes') for s in ['All', '1', '2', '3', '4', '5']: self.zPlanes.addItem("%s" % s) self.layout.addWidget(self.zPlanesLabel, thisRow + 3, 0, 1, 1) self.layout.addWidget(self.zPlanes, thisRow + 3, 1, 1, 1) ## controls that only appear if there is a time axis self.timeControls = [ self.timeSlider, self.edgeBtn, self.maxBtn, self.meanBtn, self.maxBtn2, self.maxMedianBtn, self.filterOrder, self.zPlanes ] if self.data is not None: self.updateImage(self.data) self.graphicsItem().sigImageChanged.connect(self.updateHistogram) self.levelRgn.sigRegionChanged.connect(self.levelsChanged) self.levelRgn.sigRegionChangeFinished.connect( self.levelsChangeFinished)
def saveState(self, **kwds): state = CanvasItem.saveState(self, **kwds) state['currentTime'] = self.currentTime() return state
def __init__(self, **kwds): kwds.pop('viewRect', None) item = pg.GridItem() CanvasItem.__init__(self, item, **kwds)
def __init__(self, **opts): self.defaultSize = 1e-4 # set a default spot size as 100 um. if 'handle' not in opts: raise Exception( "ScanCanvasItem must be initialized with 'handle' or 'handles' specified in opts" ) ## Top-level dirHandle tells us the default name of the item ## and may have a userTransform dirHandle = opts['handle'] if 'name' not in opts: opts['name'] = dirHandle.shortName() ## Get the specific list of subdirs to use from which to pull spot information if 'subDirs' in opts: dirs = opts['subDirs'] else: model = acq4.Manager.getManager().dataModel typ = model.dirType(dirHandle) if typ == 'ProtocolSequence': dirs = [dirHandle[d] for d in dirHandle.subDirs()] elif typ == 'Protocol': dirs = [dirHandle] else: raise Exception("Invalid dir type '%s'" % typ) ## Generate spot data and a scatterplotitem pts = [] for d in dirs: if 'Scanner' in d.info() and 'position' in d.info( )['Scanner']: #Note: this is expected to fail (gracefully) when a protocol sequence is incomplete pos = d.info()['Scanner']['position'] if 'spotSize' in d.info()['Scanner']: size = d.info()['Scanner']['spotSize'] else: size = self.defaultSize pts.append({'pos': pos, 'size': size, 'data': d}) self.scatterPlotData = pts if len(pts) == 0: raise Exception( "No data found in scan %s." % dirHandle.name(relativeTo=dirHandle.parent().parent())) gitem = pg.ScatterPlotItem(pts, pxMode=False, pen=(50, 50, 50, 200)) #citem = ScanCanvasItem(self, item, handle=dirHandle, **opts) #self._addCanvasItem(citem) #return [citem] CanvasItem.__init__(self, gitem, **opts) #self.scatterPlot = gitem self.originalSpotSize = size self._ctrlWidget = QtGui.QWidget() self.ui = ScanCanvasItemTemplate.Ui_Form() self.ui.setupUi(self._ctrlWidget) self.layout.addWidget(self._ctrlWidget, self.layout.rowCount(), 0, 1, 2) self.ui.outlineColorBtn.setColor((50, 50, 50, 200)) #self.transformGui.mirrorImageBtn.clicked.connect(self.mirrorY) self.ui.sizeSpin.setOpts(dec=True, step=1, minStep=1e-6, siPrefix=True, suffix='m', bounds=[1e-6, None]) self.ui.sizeSpin.setValue(self.originalSpotSize) self.ui.sizeSpin.valueChanged.connect(self.sizeSpinEdited) self.ui.sizeFromCalibrationRadio.clicked.connect(self.updateSpotSize) self.ui.outlineColorBtn.sigColorChanging.connect(self.updateOutline) self.addScanImageBtn = self.ui.loadSpotImagesBtn #self.createGradientBtn = self.ui.createGradientBtn #self.removeGradientBtn = self.ui.removeGradientBtn self.addScanImageBtn.connect(self.addScanImageBtn, QtCore.SIGNAL('clicked()'), self.loadScanImage)
def restoreState(self, state): CanvasItem.restoreState(self, state) self.filter.restoreState(state['filter']) self.imgModeCombo.setCurrentIndex( self.imgModeCombo.findText(state['composition'])) self.histogram.restoreState(state['imagestate'])
def restoreState(self, state): self.setCurrentTime(state.pop('currentTime')) CanvasItem.restoreState(self, state)
def __init__(self, image=None, **opts): ## If no image was specified, check for a file handle.. if image is None: image = opts.get('handle', None) item = None self.data = None if isinstance(image, QtGui.QGraphicsItem): item = image elif isinstance(image, np.ndarray): self.data = image elif isinstance(image, DataManager.FileHandle): opts['handle'] = image self.handle = image self.data = self.handle.read() if 'name' not in opts: opts['name'] = self.handle.shortName() try: if 'transform' in self.handle.info(): tr = pg.SRTTransform3D(self.handle.info()['transform']) tr = pg.SRTTransform(tr) ## convert to 2D opts['pos'] = tr.getTranslation() opts['scale'] = tr.getScale() opts['angle'] = tr.getRotation() else: ## check for older info formats if 'imagePosition' in self.handle.info(): opts['scale'] = self.handle.info()['pixelSize'] opts['pos'] = self.handle.info()['imagePosition'] elif 'Downsample' in self.handle.info(): ### Needed to support an older format stored by 2p imager if 'pixelSize' in self.handle.info(): opts['scale'] = self.handle.info()['pixelSize'] if 'microscope' in self.handle.info(): m = self.handle.info()['microscope'] opts['pos'] = m['position'][0:2] else: info = self.data._info[-1] opts['pos'] = info.get('imagePosition', None) elif hasattr(self.data, '_info'): info = self.data._info[-1] opts['scale'] = info.get('pixelSize', None) opts['pos'] = info.get('imagePosition', None) else: opts['defaultUserTransform'] = {'scale': (1e-5, 1e-5)} opts['scalable'] = True except: debug.printExc( 'Error reading transformation for image file %s:' % image.name()) if item is None: item = pg.ImageItem() CanvasItem.__init__(self, item, **opts) self.splitter = QtGui.QSplitter() self.splitter.setOrientation(QtCore.Qt.Vertical) self.layout.addWidget(self.splitter, self.layout.rowCount(), 0, 1, 2) self.filterGroup = pg.GroupBox("Image Filter") fgl = QtGui.QGridLayout() fgl.setContentsMargins(3, 3, 3, 3) fgl.setSpacing(1) self.filterGroup.setLayout(fgl) self.filter = ImageFilterWidget() self.filter.sigStateChanged.connect(self.filterStateChanged) fgl.addWidget(self.filter) self.splitter.addWidget(self.filterGroup) self.histogram = pg.HistogramLUTWidget() self.histogram.setImageItem(self.graphicsItem()) # addWidget arguments: row, column, rowspan, colspan self.splitter.addWidget(self.histogram) self.imgModeCombo = QtGui.QComboBox() self.imgModeCombo.addItems( ['SourceOver', 'Overlay', 'Plus', 'Multiply']) self.layout.addWidget(self.imgModeCombo, self.layout.rowCount(), 0, 1, 1) self.imgModeCombo.currentIndexChanged.connect(self.imgModeChanged) self.autoBtn = QtGui.QPushButton("Auto") self.autoBtn.setCheckable(True) self.autoBtn.setChecked(True) self.layout.addWidget(self.autoBtn, self.layout.rowCount() - 1, 1, 1, 1) self.timeSlider = QtGui.QSlider(QtCore.Qt.Horizontal) self.layout.addWidget(self.timeSlider, self.layout.rowCount(), 0, 1, 2) self.timeSlider.valueChanged.connect(self.timeChanged) # ## controls that only appear if there is a time axis self.timeControls = [self.timeSlider] if self.data is not None: if isinstance(self.data, pg.metaarray.MetaArray): self.filter.setInput(self.data.asarray()) else: self.filter.setInput(self.data) self.updateImage() # Needed to ensure selection box wraps the image properly tr = self.saveTransform() self.resetUserTransform() self.restoreTransform(tr)
def __init__(self, **opts): """ Create a new CanvasItem representing a scan. Options: handle: DirHandle where scan data is stored (required) subDirs: list of DirHandles to the individual Protocols for each spot (optional; this allows the inclusion of only part of a scan sequence) """ self.defaultSize = 1e-4 # set a default spot size as 100 um. if 'handle' not in opts: raise Exception("ScanCanvasItem must be initialized with 'handle' or 'handles' specified in opts") ## Top-level dirHandle tells us the default name of the item ## and may have a userTransform dirHandle = opts['handle'] if 'name' not in opts: opts['name'] = dirHandle.shortName() ## Get the specific list of subdirs to use from which to pull spot information if 'subDirs' in opts: dirs = opts['subDirs'] else: model = acq4.Manager.getManager().dataModel typ = model.dirType(dirHandle) if typ == 'ProtocolSequence': dirs = [dirHandle[d] for d in dirHandle.subDirs()] elif typ == 'Protocol': dirs = [dirHandle] else: raise Exception("Invalid dir type '%s'" % typ) ## Generate spot data and a scatterplotitem pts = [] for d in dirs: if 'Scanner' in d.info() and 'position' in d.info()['Scanner']: #Note: this is expected to fail (gracefully) when a protocol sequence is incomplete pos = d.info()['Scanner']['position'] if 'spotSize' in d.info()['Scanner']: size = d.info()['Scanner']['spotSize'] else: size = self.defaultSize pts.append({'pos': pos, 'size': size, 'data': d}) self.scatterPlotData = pts if len(pts) == 0: raise Exception("No data found in scan %s." % dirHandle.name(relativeTo=dirHandle.parent().parent())) gitem = pg.ScatterPlotItem(pts, pxMode=False, pen=(50,50,50,200)) #citem = ScanCanvasItem(self, item, handle=dirHandle, **opts) #self._addCanvasItem(citem) #return [citem] CanvasItem.__init__(self, gitem, **opts) #self.scatterPlot = gitem self.originalSpotSize = size self._ctrlWidget = QtGui.QWidget() self.ui = ScanCanvasItemTemplate.Ui_Form() self.ui.setupUi(self._ctrlWidget) self.layout.addWidget(self._ctrlWidget, self.layout.rowCount(), 0, 1, 2) self.ui.outlineColorBtn.setColor((50,50,50,200)) #self.transformGui.mirrorImageBtn.clicked.connect(self.mirrorY) self.ui.sizeSpin.setOpts(dec=True, step=1, minStep=1e-6, siPrefix=True, suffix='m', bounds=[1e-6, None]) self.ui.sizeSpin.setValue(self.originalSpotSize) self.ui.sizeSpin.valueChanged.connect(self.sizeSpinEdited) self.ui.sizeFromCalibrationRadio.clicked.connect(self.updateSpotSize) self.ui.outlineColorBtn.sigColorChanging.connect(self.updateOutline) self.addScanImageBtn = self.ui.loadSpotImagesBtn #self.createGradientBtn = self.ui.createGradientBtn #self.removeGradientBtn = self.ui.removeGradientBtn self.addScanImageBtn.connect(self.addScanImageBtn, QtCore.SIGNAL('clicked()'), self.loadScanImage)