Skip to content

Commit

Permalink
Bug Fix: Update Plot when re-enabling, Disable Spine Lines and Labels…
Browse files Browse the repository at this point in the history
… with Spines
  • Loading branch information
jtle00 committed Jul 5, 2024
1 parent fcd4a14 commit d35b836
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 65 deletions.
86 changes: 39 additions & 47 deletions pymapmanager/interface2/stackWidgets/annotationPlotWidget2.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,49 +39,46 @@ def updateLabel(self, labelID):
2) Posiiton the label just beyond the point (Depends on 'spine angle'?).
"""
label = self._labels[labelID]
self.setLabelPos(labelID, label)

logger.info(f"check label update {label.x()}")
# set font outline based on "accept" column
acceptColumn = self._df.getDataFrame()["accept"]
if not acceptColumn[labelID]:
logger.info("Changing label color")
self._labels[labelID].setColor(QtGui.QColor(255, 255, 255, 120))

def setLabelPos(self, labelID, label):
x = self.df.getValue('x', labelID)
y = self.df.getValue('y', labelID)

# Check angle
# adjust + or - depending on angle
spineAngles = self._df.getDataFrame()["spineAngle"]
idSpineAngle = spineAngles[labelID]
logger.info(f"idSpineAngle {idSpineAngle}")
# self._labels[labelID].setPos(QtCore.QPointF(x - 9, y - 9))

adjustConstant = 2
adjustX = adjustConstant * math.cos(idSpineAngle * math.pi/180)
adjustY = adjustConstant * math.sin(idSpineAngle * math.pi/180)
adjustX = abs(adjustX)
adjustY = abs(adjustY)

if 0 <= abs(idSpineAngle) and abs(idSpineAngle) <= 90:
logger.info(f"labelID: {labelID}, newX: {x + adjustX}, newY: {y + adjustY}")
self._labels[labelID].setPos(QtCore.QPointF(x + adjustX, y + adjustY))
label.setPos(QtCore.QPointF(x + adjustX, y + adjustY))
elif 90 <= abs(idSpineAngle) and abs(idSpineAngle) <= 180:
logger.info(f"labelID: {labelID}, newX: {x + adjustX}, newY: {y + adjustY}")
self._labels[labelID].setPos(QtCore.QPointF(x - adjustX, y + adjustY))
label.setPos(QtCore.QPointF(x - adjustX, y + adjustY))
elif 180 <= idSpineAngle and idSpineAngle <= 270:
self._labels[labelID].setPos(QtCore.QPointF(x - adjustX, y - adjustY))
label.setPos(QtCore.QPointF(x - adjustX, y - adjustY))
elif 270 <= idSpineAngle and idSpineAngle <= 360:
self._labels[labelID].setPos(QtCore.QPointF(x + adjustX, y - adjustY))
label.setPos(QtCore.QPointF(x + adjustX, y - adjustY))

# set font outline based on "accept" column
acceptColumn = self._df.getDataFrame()["accept"]
# logger.info(f"acceptColumn {acceptColumn}")
# logger.info(f"labelID {labelID} acceptVal {acceptColumn[labelID]}")
if not acceptColumn[labelID]:
logger.info("Changing label color")
self._labels[labelID].setColor(QtGui.QColor(255, 255, 255, 120))
return label

def addedLabel(self, labelID):
"""Add a new label.
Called after new spine, among other things.
"""
x = self.df.getValue('x', labelID)
y = self.df.getValue('y', labelID)
newLabel = self._newLabel(labelID, x, y)
# x = self.df.getValue('x', labelID)
# y = self.df.getValue('y', labelID)
newLabel = self._newLabel(labelID)

# add to pg plotItem
self._plotItem.addItem(newLabel)
Expand Down Expand Up @@ -129,35 +126,15 @@ def _makeAllLabels(self):
labelID = row["index"] # could use index, it is row label???
self.addedLabel(labelID)

def _newLabel(self, labelID, x, y) -> pg.LabelItem:
def _newLabel(self, labelID) -> pg.LabelItem:
"""Make a new label.
"""
# label = pg.LabelItem("", **{"color": "#FFF", "size": "6pt", "anchor": (1,1)})
label = pg.TextItem('', anchor=(0.5,0.5))
# label = QtWidgets.QLabel('labelID', self._plotItem)
# label.setPos(QtCore.QPointF(x - 9, y - 9))

spineAngles = self._df.getDataFrame()["spineAngle"]
idSpineAngle = spineAngles[labelID]
adjustConstant = 2

adjustX = adjustConstant * math.cos(idSpineAngle * math.pi/180)
adjustY = adjustConstant * math.sin(idSpineAngle * math.pi/180)
adjustX = abs(adjustX)
adjustY = abs(adjustY)

# logger.info(f"labelID: {labelID}, angle(rads): {rads}, angle(degs): {idSpineAngle}, adjustX: {adjustX}, adjustY: {adjustY}, newX: {x + adjustX}, newY: {y + adjustY}")
# label.setPos(QtCore.QPointF(x + adjustX, y + adjustY))
# DO the ranges: 0-90, 90-180, 180-270, 270-360
if 0 <= abs(idSpineAngle) and abs(idSpineAngle) <= 90:
label.setPos(QtCore.QPointF(x + adjustX, y + adjustY))
elif 90 <= abs(idSpineAngle) and abs(idSpineAngle) <= 180:
label.setPos(QtCore.QPointF(x - adjustX, y + adjustY))
elif 180 <= idSpineAngle and idSpineAngle <= 270:
label.setPos(QtCore.QPointF(x - adjustX, y - adjustY))
elif 270 <= idSpineAngle and idSpineAngle <= 360:
label.setPos(QtCore.QPointF(x + adjustX, y - adjustY))

label = self.setLabelPos(labelID, label)

label.setText(str(labelID))
myFont=QtGui.QFont()
myFont.setBold(True)
Expand Down Expand Up @@ -330,7 +307,9 @@ def _buildUI(self):

# self._scatterUserSelection.sigPointsClicked.connect(self._on_highlighted_mouse_click)

def toggleScatterPlot(self):
def toggleScatterPlot(self) -> bool:
"""
"""
logger.info("")

visible = not self._scatter.isVisible()
Expand All @@ -342,6 +321,8 @@ def toggleScatterPlot(self):

self.showScatter = not self.showScatter

return self.showScatter

def _on_mouse_hover(self, points, event):
"""Respond to mouse hover over scatter plot.
Expand Down Expand Up @@ -1081,7 +1062,7 @@ def slot_setSlice(self, sliceNumber: int):
else:
self._spineConnections.setData(_xData, _yData)

# stopSec = time.time()
stopSec = time.time()
# logger.info(f'{self.getClassName()} took {round(stopSec-startSec,4)} seconds')

def _updateItem(self, rowIdx: int):
Expand Down Expand Up @@ -1262,6 +1243,15 @@ def toggleLabels(self):
self._pointLabels.hidShowLabels(_rows)
else:
self._pointLabels.hideAllLabels(_rows)
return self.showLabel

def areLabelsShown(self):
return self.showLabel

def toggleSpineLines(self):
visible = not self._spineConnections.isVisible()
self._spineConnections.setVisible(visible)
return visible

class linePlotWidget(annotationPlotWidget):
_widgetName = "line plot"
Expand Down Expand Up @@ -1344,6 +1334,8 @@ def toggleRadiusLines(self):

self.showRadiusLines = not self.showRadiusLines

return visible

def _getScatterColor(self):
logger.info(f'"{self.getClassName()}"')

Expand Down
30 changes: 21 additions & 9 deletions pymapmanager/interface2/stackWidgets/imagePlotWidget2.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,9 @@ def contextMenuEvent(self, event : QtGui.QContextMenuEvent):
# logger.info('')

stackSelection = self.getStackWidget().getStackSelection()
logger.info(f'imagePlotWidget stackSelection {stackSelection}')
hasPointSelection = stackSelection.hasPointSelection()

logger.info(f'imagePlotWidget hasPointSelection {hasPointSelection}')
if not hasPointSelection:
logger.warning('no selection -> no context menu')
return
Expand Down Expand Up @@ -687,7 +688,9 @@ def autoContrast(self):
return

def refreshSlice(self):
self._setSlice(self._currentSlice, doEmit=False)
# logger.info(self._currentSlice)
# self._setSlice(self._currentSlice, doEmit=False)
self._setSlice(self._currentSlice, doEmit=True)

def _setSlice(self, sliceNumber : int, doEmit = True):
"""
Expand Down Expand Up @@ -800,18 +803,27 @@ def togglePlot(self, plotName):
"""

logger.info(f"toggling plotName {plotName}")
visible = False
if plotName == "Spines":
self._aPointPlot.toggleScatterPlot()
visible = self._aPointPlot.toggleScatterPlot()
self._aPointPlot.toggleSpineLines()
# self.plotDict[plotName].toggleScatterPlot()
elif plotName == "Center Line":
self._aLinePlot.toggleScatterPlot()
visible = self._aLinePlot.toggleScatterPlot()
elif plotName == "Radius Lines":
self._aLinePlot.toggleRadiusLines()
elif plotName == "Labels":
visible = self._aLinePlot.toggleRadiusLines()
elif plotName == "UnRefreshed Labels": # Update Labels without Refreshing slice
self._aPointPlot.toggleLabels()
elif plotName == "Labels":
visible = self._aPointPlot.toggleLabels()
# self.plotDict["Spines"].toggleLabels()
elif plotName == "Image":
self.toggleImageView()
visible = self.toggleImageView()

if visible:
self.refreshSlice()



def slot_updateLineRadius(self, radius):
""" Called whenever radius is updated
Expand Down Expand Up @@ -1054,8 +1066,8 @@ def __init__(self, numSlices):
# self.sliderReleased.connect(self._updateSlice)

# was this
self.sliderMoved.connect(self._updateSlice)
# self.valueChanged.connect(self._updateSlice) # abb 20200829
# self.sliderMoved.connect(self._updateSlice)
self.valueChanged.connect(self._updateSlice) # abb 20200829

#self.valueChanged.connect(self.sliceSliderValueChanged)

Expand Down
41 changes: 34 additions & 7 deletions pymapmanager/interface2/stackWidgets/stackToolbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,13 +216,15 @@ def _buildUI(self):
plotMenu = QtWidgets.QMenu()

plotMenuList = ["Spines", "Center Line", "Radius Lines", "Labels", "Image"]
self.actionMenuDict = {}

for plotName in plotMenuList:
action = plotMenu.addAction(plotName)
action.setCheckable(True)
isChecked = True # set true by default
# logger.info(f"userType {userType} isChecked {isChecked}")
action.setChecked(isChecked)
self.actionMenuDict[plotName] = action

plotMenuButton.setMenu(plotMenu)
# menu.triggered.connect(lambda action: print(action.text()))
Expand All @@ -234,8 +236,37 @@ def _buildUI(self):
# self.colorPopup.addItems(colorList)
# self.addWidget(self.colorPopup)

def labelBoxUpdate(self):
""" Part of plot menu Change
Logic for when spine box is changed to update label box
"""
spinesAction = self.actionMenuDict["Spines"]
spineChecked = spinesAction.isChecked()

labelAction = self.actionMenuDict["Labels"]
labelChecked = labelAction.isChecked()

if not spineChecked and not labelChecked:
#
logger.info("entering edge case")
# keep them both off
pass
elif not spineChecked:
labelAction.setChecked(False)
self.signalPlotCheckBoxChanged.emit("UnRefreshed Labels")
else:
# check if label box is changed before setting checked
if labelAction.isChecked():
pass
else:
labelAction.setChecked(True)
self.signalPlotCheckBoxChanged.emit("UnRefreshed Labels")


def plotMenuChange(self, action):

logger.info(f"plotMenuChange {action.text()}")
if action.text() == "Radius Lines":
self._radiusSpinBox.setEnabled(action.isChecked())
self.radiusLabel.setEnabled(action.isChecked())
Expand All @@ -244,6 +275,9 @@ def plotMenuChange(self, action):
# self.slidingUpDownLabel.setEnabled(action.isChecked())
# self.slidingUpDown.setEnabled(action.isChecked())
# self.slidingCheckbox.setEnabled(action.isChecked())

if action.text() == "Spines":
self.labelBoxUpdate()

plotName = action.text()
self.signalPlotCheckBoxChanged.emit(plotName)
Expand All @@ -253,13 +287,6 @@ def _on_radius_value_changed(self, value):
Value to change the radius of the left/ right points. When changed the points also change.
"""
logger.info(f'Recalculate left/right given new radius {value}')
# call function to recaculate ALL left xy, right xy given a new radius
# la = self._myStack.getLineAnnotations()
# segmentID = None
# radius = value
# la.calculateAndStoreRadiusLines(segmentID = segmentID, radius = radius)

# send signal to backend to refresh
# AnnotationPlotWidget that displays the radius line points
self.signalRadiusChanged.emit(value)
# signalRadiusChanged
11 changes: 9 additions & 2 deletions pymapmanager/interface2/stackWidgets/stackWidget2.py
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ def _buildUI(self):
imagePlotName = ImagePlotWidget._widgetName
_imagePlotWidget = ImagePlotWidget(self)
hBoxLayout_main.addWidget(_imagePlotWidget)
self._widgetDict[imagePlotName] = _imagePlotWidget # the dock, not the widget ???
self._widgetDict[imagePlotName] = _imagePlotWidget # the dock, not the widget ??

#
# status toolbar (bottom)
Expand Down Expand Up @@ -432,7 +432,7 @@ def selectedEvent(self, event : "pmmEvent"):
_eventSelection = event.getStackSelection()

_state = self.getStackSelection().getState()

# logger.info(f'state is: {_state}')

if _state == pmmStates.manualConnectSpine:
Expand Down Expand Up @@ -462,9 +462,15 @@ def selectedEvent(self, event : "pmmEvent"):

# TODO: on spine selection, select segment
if _eventSelection.hasPointSelection():

# Setting current selection in stack widget
logger.info(" Setting current selection in stack widget")
_pointSelection = _eventSelection.getPointSelection()
self.getStackSelection().setPointSelection(_pointSelection)

temp= self.getStackSelection().hasPointSelection()
logger.info(f"hasPointSelection {temp}")

if len(_pointSelection) == 1:
_onePoint = _pointSelection[0]
segmentIndex = self.getStack().getPointAnnotations().getValue("segmentID", _onePoint)
Expand All @@ -476,6 +482,7 @@ def selectedEvent(self, event : "pmmEvent"):
logger.warning(f'not setting segment selection for multi point selection {_pointSelection}')

else:
logger.info("No Selection - Setting current selection as [] in Stack Widget")
self.getStackSelection().setPointSelection([])

if not _eventSelection.hasPointSelection():
Expand Down

0 comments on commit d35b836

Please sign in to comment.