diff --git a/meshroom/ui/commands.py b/meshroom/ui/commands.py index bbfb30631c..fd3db6726d 100755 --- a/meshroom/ui/commands.py +++ b/meshroom/ui/commands.py @@ -350,6 +350,31 @@ def undoImpl(self): listAttribute.insert(self.index, self.value) +class ClearImagesCommand(GraphCommand): + def __init__(self, graph, cameraInitNodes, parent=None): + super(ClearImagesCommand, self).__init__(graph, parent) + self.cameraInits = cameraInitNodes + self.viewpoints = { cameraInit.name: cameraInit.attribute("viewpoints").getExportValue() for cameraInit in self.cameraInits } + self.intrinsics = { cameraInit.name: cameraInit.attribute("intrinsics").getExportValue() for cameraInit in self.cameraInits } + self.title = "Clear{}Images".format(" " if len(self.cameraInits) == 1 else " All ") + self.setText(self.title) + + def redoImpl(self): + for i in range(len(self.cameraInits)): + # Reset viewpoints + self.cameraInits[i].viewpoints.resetValue() + self.cameraInits[i].viewpoints.valueChanged.emit() + # Reset intrinsics + self.cameraInits[i].intrinsics.resetValue() + self.cameraInits[i].intrinsics.valueChanged.emit() + + def undoImpl(self): + for cameraInit in self.viewpoints: + with GraphModification(self.graph): + self.graph.node(cameraInit).viewpoints.value = self.viewpoints[cameraInit] + self.graph.node(cameraInit).intrinsics.value = self.intrinsics[cameraInit] + + class MoveNodeCommand(GraphCommand): """ Move a node to a given position. """ def __init__(self, graph, node, position, parent=None): diff --git a/meshroom/ui/graph.py b/meshroom/ui/graph.py index 978bd55440..9055a3690c 100644 --- a/meshroom/ui/graph.py +++ b/meshroom/ui/graph.py @@ -733,6 +733,16 @@ def appendAttribute(self, attribute, value=QJsonValue()): def removeAttribute(self, attribute): self.push(commands.ListAttributeRemoveCommand(self._graph, attribute)) + @Slot() + def clearImages(self): + with self.groupedGraphModification("Clear Images"): + self.push(commands.ClearImagesCommand(self._graph, [self.cameraInit])) + + @Slot() + def clearAllImages(self): + with self.groupedGraphModification("Clear All Images"): + self.push(commands.ClearImagesCommand(self._graph, list(self.cameraInits))) + @Slot(Node) def appendSelection(self, node): """ Append 'node' to the selection if it is not already part of the selection. """ diff --git a/meshroom/ui/qml/main.qml b/meshroom/ui/qml/main.qml index 283f115bcf..0dbff6618c 100644 --- a/meshroom/ui/qml/main.qml +++ b/meshroom/ui/qml/main.qml @@ -427,6 +427,26 @@ ApplicationWindow { uigraph: _reconstruction } + Action { + id: clearImagesAction + property string tooltip: "Clear images for the current CameraInit group" + text: "Clear Images" + onTriggered: { + _reconstruction.clearImages() + _reconstruction.selectedViewId = "-1" + } + } + + Action { + id: clearAllImagesAction + property string tooltip: "Clear all the images for all the CameraInit groups" + text: "Clear All Images" + onTriggered: { + _reconstruction.clearAllImages() + _reconstruction.selectedViewId = "-1" + } + } + Action { id: undoAction @@ -638,28 +658,12 @@ ApplicationWindow { } } - Action { - id: clearImagesAction - text: "Clear Images" - onTriggered: { - //Loop through all the camera inits - for(var i = 0 ; i < _reconstruction.cameraInits.count; i++){ - var cameraInit = _reconstruction.cameraInits.at(i) - - //Delete all viewpoints - var viewpoints = cameraInit.attribute('viewpoints') - for(var y = viewpoints.value.count - 1 ; y >= 0 ; y--){ - _reconstruction.removeAttribute(viewpoints.value.at(y)) - } - - //Delete all intrinsics - var intrinsics = cameraInit.attribute('intrinsics') - for(var z = intrinsics.value.count - 1 ; z >= 0 ; z--){ - _reconstruction.removeAttribute(intrinsics.value.at(z)) - } - } - } + MenuItem { + action: clearImagesAction + ToolTip.visible: hovered + ToolTip.text: clearImagesAction.tooltip } + MenuSeparator { } Menu { id: advancedMenu @@ -692,6 +696,12 @@ ApplicationWindow { importProjectDialog.open(); } } + + MenuItem { + action: clearAllImagesAction + ToolTip.visible: hovered + ToolTip.text: clearAllImagesAction.tooltip + } } MenuSeparator { } Action {