# -*- coding: utf-8 -*- """ GEPARD - Gepard-Enabled PARticle Detection Copyright (C) 2018 Lars Bittrich and Josef Brandt, Leibniz-Institut für Polymerforschung Dresden e. V. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program, see COPYING. If not, see . """ import numpy as np from PyQt5 import QtCore, QtWidgets, QtGui class SegmentationContours(QtWidgets.QGraphicsItem): def __init__(self, parent=None, contours=[], pos=(0,0)): super().__init__() self.parent = parent self.setPos(pos[0], pos[1]) self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable) self.setAcceptedMouseButtons(QtCore.Qt.AllButtons) self.brect = QtCore.QRectF(0,0,1,1) self.resetContours(contours) self.colorList = [] self.selectedContours = [] def boundingRect(self): return self.brect def resetContours(self, contours=[]): cp = [] x0 = None for c in contours: polygon = QtGui.QPolygonF() if x0 is None: x0 = c[:,0,0].min() x1 = c[:,0,0].max() y0 = c[:,0,1].min() y1 = c[:,0,1].max() else: x0 = min(x0, c[:,0,0].min()) x1 = max(x1, c[:,0,0].max()) y0 = min(y0, c[:,0,1].min()) y1 = max(y1, c[:,0,1].max()) for ci in c: polygon.append(QtCore.QPointF(ci[0,0],ci[0,1])) cp.append(polygon) if x0 is None: self.brect = QtCore.QRectF(0,0,1,1) else: self.brect.setCoords(x0,y0,x1,y1) self.contours = cp self.update() def paint(self, painter, option, widget): painter.setPen(QtCore.Qt.green) lenColorList = len(self.colorList) for index, c in enumerate(self.contours): if index not in self.selectedContours: if lenColorList > 0: color = self.colorList[index] painter.setPen(QtGui.QColor(int(color.red()*0.7), int(color.green()*0.7), int(color.blue()*0.7), color.alpha())) else: color = QtCore.Qt.green painter.setPen(color) painter.setBrush(color) painter.drawPolygon(c) else: if lenColorList > 0: alpha = self.colorList[index].alpha() else: alpha = 255 painter.setBrush(QtGui.QColor(200, 200, 200, alpha)) painter.setPen(QtCore.Qt.white) painter.drawPolygon(c) def mousePressEvent(self, event): if event.button()==QtCore.Qt.LeftButton: p = event.pos() p = QtCore.QPointF(p.x(), p.y()) for index, cnt in enumerate(self.contours): if cnt.containsPoint(p, QtCore.Qt.OddEvenFill): if event.modifiers()==QtCore.Qt.ShiftModifier: self.selectedContours.append(index) else: self.selectedContours = [index] self.parent.selectContour(index, centerOn=False) self.update() return self.selectedContours = [] #reset selection, if nothing was hit... self.update() def contextMenuEvent(self, event): contextMenu = QtWidgets.QMenu("Particle options") combineMenu = QtWidgets.QMenu("Combine Particles into") combineActs = [] assignments = [] for index in self.selectedContours: # partIndex = int(np.where(self.parent.dataset.ramanscansortindex == index)[0]) partIndex = index assignments.append(self.parent.analysiswidget.particleResults[partIndex]) assignments.append("other") for assignment in np.unique(np.array(assignments)): combineActs.append(combineMenu.addAction(assignment)) reassignActs = [] reassignMenu = QtWidgets.QMenu("Reassign particle(s) into") for polymer in self.parent.analysiswidget.uniquePolymers: reassignActs.append(reassignMenu.addAction(polymer)) reassignActs.append(reassignMenu.addAction("other")) contextMenu.addMenu(combineMenu) contextMenu.addMenu(reassignMenu) deleteAct = contextMenu.addAction("Delete Particle(s)") numParticles = len(self.selectedContours) if numParticles == 0: reassignMenu.setDisabled(True) combineMenu.setDisabled(True) deleteAct.setDisabled(True) elif numParticles == 1: combineMenu.setDisabled(True) action = contextMenu.exec_(event.screenPos()) if action == deleteAct: print('deleting') elif action in combineActs: newAssignment = action.text() # if newAssignment == "other": # QtWidgets.QMessageBox.about(self.parent, "Not yet implemented", "we are getting there...") # return self.parent.analysiswidget.editor.combineParticles(self.selectedContours, newAssignment) elif action in reassignActs: newAssignment = action.text() # if newAssignment == "other": # QtWidgets.QMessageBox.about(self.parent, "Not yet implemented", "we are getting there...") # return self.parent.analysiswidget.editor.reassignParticles(self.selectedContours, newAssignment) class FitPosIndicator(QtWidgets.QGraphicsItem): indicatorSize = 80 def __init__(self, number, pos=(0,0)): super().__init__() self.setPos(pos[0], pos[1]) self.number = number self.setAcceptedMouseButtons(QtCore.Qt.NoButton) def boundingRect(self): return QtCore.QRectF(-self.indicatorSize-1,-self.indicatorSize-1, 2*self.indicatorSize+2,2*self.indicatorSize+2) def paint(self, painter, option, widget): painter.setPen(QtCore.Qt.green) painter.setBrush(QtGui.QColor(250,250,0,150)) rect = QtCore.QRectF(-self.indicatorSize,-self.indicatorSize, 2*self.indicatorSize,2*self.indicatorSize) font = painter.font() font.setPointSize(40) painter.setFont(font) painter.drawText(rect, QtCore.Qt.AlignCenter, str(self.number)) painter.drawEllipse(rect) def shape(self): path = QtGui.QPainterPath() path.addEllipse(self.boundingRect()) return path class RamanScanIndicator(QtWidgets.QGraphicsItem): def __init__(self, view, number, radius, pos=(0,0)): super().__init__() # self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable) self.setAcceptedMouseButtons(QtCore.Qt.NoButton) self.view = view self.number = number self.radius = radius self.highlight = False self.hidden = False self.setPos(pos[0], pos[1]) def setHighLight(self, highlight): if highlight!=self.highlight: self.highlight = highlight self.update() def boundingRect(self): return QtCore.QRectF(-self.radius-1,-self.radius-1, 2*self.radius+2,2*self.radius+2) def shape(self): path = QtGui.QPainterPath() path.addEllipse(self.boundingRect()) return path def paint(self, painter, option, widget): if not self.hidden: if self.highlight: painter.setPen(QtCore.Qt.red) painter.setBrush(QtGui.QColor(100,250,100,150)) else: painter.setPen(QtCore.Qt.green) painter.setBrush(QtGui.QColor(50,50,250,150)) rect = QtCore.QRectF(-self.radius, -self.radius, 2*self.radius, 2*self.radius) painter.drawEllipse(rect) font = painter.font() font.setPointSize(10) painter.setFont(font) painter.drawText(rect, QtCore.Qt.AlignCenter, str(self.number)) # def mousePressEvent(self, event): # p = event.pos() # x, y = p.x(), p.y() # r = np.sqrt(x**2+y**2) # if r