diff --git a/sensecarbon_tsv.py b/sensecarbon_tsv.py index c1a9df36cd069d1087cf9da96ab6d789e0f5ac79..a10d6ed9b3833c25d6e350115d73b476004123ad 100644 --- a/sensecarbon_tsv.py +++ b/sensecarbon_tsv.py @@ -40,7 +40,7 @@ except: import numpy as np import pickle - +import tsv_widgets import six import multiprocessing @@ -58,7 +58,9 @@ sys.path.append(pluginDir) sys.path.append(os.path.join(pluginDir, 'libs')) #sys.path.append(os.path.join(pluginDir, *['libs','qimage2ndarray'])) sys.path.append(os.path.join(pluginDir, *['libs','qrangeslider-0.1.1'])) +sys.path.append(os.path.join(pluginDir, *['libs','pyqtgraph'])) +import pyqtgraph as pg import qimage2ndarray import qrangeslider @@ -265,7 +267,8 @@ class BandView(object): assert type(sensor) is SensorConfiguration if sensor not in self.bandMappings.keys(): #self.bandMappings[sensor] = ((0, 0, 5000), (1, 0, 5000), (2, 0, 5000)) - x = imagechipviewsettings_widget.ImageChipViewSettings(sensor) + #x = imagechipviewsettings_widget.ImageChipViewSettings(sensor) + x = tsv_widgets.BandViewSettings(sensor) x.create() self.bandMappings[sensor] = x @@ -359,6 +362,29 @@ class SensorConfiguration(object): +class ImageChipLabel(QLabel): + def __init__(self, parent=None, iface=None, path=None, bands=None): + super(ImageChipLabel, self).__init__(parent) + self.path=path + self.iface=iface + self.bands=bands + self.setContextMenuPolicy(Qt.DefaultContextMenu) + + def contextMenuEvent(self, event): + menu = QMenu() + #add general options + action = menu.addAction('Copy to clipboard') + action.triggered.connect(lambda : QApplication.clipboard().setPixmap(self.pixmap())) + + #add QGIS specific options + if self.iface: + action = menu.addAction('Show image in QGIS') + action.triggered.connect(lambda : qgis_add_ins.add_QgsRasterLayer(self.iface, self.path, self.bands)) + + menu.exec_(event.globalPos()) + + + class TimeSeries(QObject): datumAdded = pyqtSignal(name='datumAdded') @@ -617,8 +643,8 @@ class TimeSeries(QObject): def addFile(self, pathImg, pathMsk=None, _quiet=False): - print(pathImg) - print('Add image {}...'.format(pathImg)) + six.print_(pathImg) + six.print_('Add image {}...'.format(pathImg)) try: sensorAdded = False @@ -1119,6 +1145,43 @@ class ImageChipBuffer(object): def getDataCube(self, TSD): return self.data.get(TSD) + def getChipArray(self, TSD, band_view, mode='rgb'): + assert mode in ['rgb', 'bgr'] + bands = band_view.getBands(TSD.sensor) + band_ranges = band_view.getRanges(TSD.sensor) + nb = len(bands) + assert nb == 3 and nb == len(band_ranges) + assert TSD in self.data.keys(), 'Time Series Datum {} is not in buffer'.format(TSD.getDate()) + chipData = self.data[TSD] + for b in bands: + assert b in chipData.keys() + + + + nl, ns = chipData[bands[0]].shape + + dtype= 'uint8' + array_data = np.ndarray((ns, nl, nb), dtype=dtype) + + if mode == 'rgb': + ch_dst = [0,1,2] + elif mode == 'bgr': + # r -> dst channel 2 + # g -> dst channel 1 + # b -> dst channel 0 + ch_dst = [2,1,0] + for i, i_dst in enumerate(ch_dst): + + offset = band_ranges[i][0] + scale = 255./band_ranges[i][1] + + res = pg.rescaleData(chipData[bands[i]], scale, offset, dtype='float') + np.clip(res, 0, 255, out=res) + array_data[:,:,i_dst] = res + + return array_data + + def getChipRGB(self, TSD, band_view): bands = band_view.getBands(TSD.sensor) band_ranges = band_view.getRanges(TSD.sensor) @@ -1525,7 +1588,7 @@ class SenseCarbon_TSV: parent=self.iface.mainWindow()) - def ua_addTSD_to_QGIS(self): + def ua_addTSD_to_QGIS(self, TSD, bands): s = "" @@ -1561,6 +1624,8 @@ class SenseCarbon_TSV: #get date INDEX that is closest to requested date if type(date) is str: date = np.datetime64(date) + if type(date) is not np.datetime64: + s = "" assert type(date) is np.datetime64, 'type is: '+str(type(date)) i_doi = TSDs.index(sorted(TSDs, key=lambda TSD: abs(date - TSD.getDate()))[0]) @@ -1651,19 +1716,21 @@ class SenseCarbon_TSV: j = 1 for view in self.BAND_VIEWS: bands = view.getBands(TSD.sensor) - imageLabel = QLabel() - imageLabel.setFrameShape(QFrame.StyledPanel) - imageLabel.setMinimumSize(size_x, size_y) - imageLabel.setMaximumSize(size_x+1, size_y+1) - imageLabel.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + #imageLabel = QLabel() + #imv = pg.GraphicsView() + #imv = QGraphicsView(self.dlg.scrollArea_imageChip_content) + #imv = MyGraphicsView(self.dlg.scrollArea_imageChip_content, iface=self.iface, path=TSD.pathImg, bands=bands) + #imv = pg.ImageView(view=None) + imgLabel = ImageChipLabel() + imgLabel.setFrameShape(QFrame.StyledPanel) + imgLabel.setMinimumSize(size_x, size_y) + imgLabel.setMaximumSize(size_x, size_y) + imgLabel.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) tt = [TSD.date, TSD.pathImg, 'RGB={}'.format(','.join([str(b) for b in bands]))] - imageLabel.setToolTip(list2str(tt)) - - #add context menue - menu = QMenu(self) + imgLabel.setToolTip(list2str(tt)) - viewList.append(imageLabel) - self.ICP.addWidget(imageLabel, j, cnt_chips) + viewList.append(imgLabel) + self.ICP.addWidget(imgLabel, j, cnt_chips) j += 1 textLabel = QLabel(info_label_text) @@ -1686,8 +1753,10 @@ class SenseCarbon_TSV: required_bands = dict() for j, view in enumerate(self.BAND_VIEWS): for S in view.Sensors.keys(): - - bands = set(view.getBands(S)) + bands = set() + bands.update(view.getBands(S)) + if len(bands) != 3: + s = "" assert len(bands) == 3 if S not in required_bands.keys(): required_bands[S] = set() @@ -1719,25 +1788,43 @@ class SenseCarbon_TSV: assert TSD in self.CHIPWIDGETS.keys() - for imageLabel, bandView in zip(self.CHIPWIDGETS[TSD], self.BAND_VIEWS): - imageLabel.clear() + for imgChipLabel, bandView in zip(self.CHIPWIDGETS[TSD], self.BAND_VIEWS): + #imgView.clear() #imageLabel.setScaledContents(True) - rgb = self.ImageChipBuffer.getChipRGB(TSD, bandView) - rgb2 = rgb.transpose([1,2,0]).copy('C') - qImg = qimage2ndarray.array2qimage(rgb2) - #img = QImage(rgb2.data, nl, ns, QImage.Format_RGB888) + #rgb = self.ImageChipBuffer.getChipRGB(TSD, bandView) + array = self.ImageChipBuffer.getChipArray(TSD, bandView, mode = 'bgr') + qimg = pg.makeQImage(array, copy=True, transpose=False) - pxMap = QPixmap.fromImage(qImg) - pxMap = pxMap.scaled(imageLabel.size(), Qt.KeepAspectRatio) + #rgb2 = rgb.transpose([1,2,0]).copy('C') + #qImg = qimage2ndarray.array2qimage(rgb2) + #img = QImage(rgb2.data, nl, ns, QImage.Format_RGB888) - imageLabel.setPixmap(pxMap) + pxMap = QPixmap.fromImage(qimg).scaled(imgChipLabel.size(), Qt.KeepAspectRatio) + imgChipLabel.setPixmap(pxMap) + imgChipLabel.update() + #imgView.setPixmap(pxMap) #imageLabel.update() - imageLabel.adjustSize() + #imgView.adjustSize() + #pxmap = QPixmap.fromImage(qimg) + # + + """ + pxmapitem = QGraphicsPixmapItem(pxmap) + if imgChipLabel.scene() is None: + imgChipLabel.setScene(QGraphicsScene()) + else: + imgChipLabel.scene().clear() + + scene = imgChipLabel.scene() + scene.addItem(pxmapitem) + + imgChipLabel.fitInView(scene.sceneRect(), Qt.KeepAspectRatio) + """ - s = "" pass self.ICP.layout().update() + self.dlg.scrollArea_imageChip_content.update() s = "" pass @@ -1954,9 +2041,9 @@ def run_tests(): filesImgLS = file_search(dirSrcLS, '20*_BOA.vrt') filesImgRE = file_search(dirSrcRE, '*.vrt', recursive=True) #filesMsk = file_search(dirSrc, '2014*_Msk.vrt') - #S.ua_addTSImages(files=filesImg[0:1]) - # S.ua_addTSImages(files=filesImgLS) - S.ua_addTSImages(files=filesImgRE) + S.ua_addTSImages(files=filesImgLS[0:3]) + #S.ua_addTSImages(files=filesImgLS) + #S.ua_addTSImages(files=filesImgRE) #S.ua_loadExampleTS() @@ -1986,7 +2073,7 @@ def run_tests(): filesImgLS = file_search(dirSrcLS, '2014*_BOA.vrt') filesMsk = file_search(dirSrcLS, '2014*_Msk.vrt') S.ua_addTSImages(files=filesImgLS) - #S.ua_addTSMasks(files=filesMsk) + S.ua_addTSMasks(files=filesMsk) #S.ua_addView(bands=[4,5,3])