diff --git a/meshroom/core/attribute.py b/meshroom/core/attribute.py index 43d7b4c715..704ed423ae 100644 --- a/meshroom/core/attribute.py +++ b/meshroom/core/attribute.py @@ -445,6 +445,9 @@ def __init__(self, node, attributeDesc, isOutput, root=None, parent=None): def __len__(self): return len(self._value) + def __iter__(self): + return iter(self._value) + def getBaseType(self): return self.attributeDesc.elementDesc.__class__.__name__ diff --git a/meshroom/ui/graph.py b/meshroom/ui/graph.py index d108030b7a..2e39f98310 100644 --- a/meshroom/ui/graph.py +++ b/meshroom/ui/graph.py @@ -816,6 +816,29 @@ def appendAttribute(self, attribute, value=QJsonValue()): def removeAttribute(self, attribute): self.push(commands.ListAttributeRemoveCommand(self._graph, attribute)) + @Slot(Attribute) + def removeImage(self, image): + with self.groupedGraphModification("Remove Image"): + # look if the viewpoint's intrinsic is used by another viewpoint + # if not, remove it + intrinsicId = image.intrinsicId.value + + intrinsicUsed = False + for intrinsic in self.cameraInit.attribute("viewpoints").getExportValue(): + if image.getExportValue() != intrinsic and intrinsic['intrinsicId'] == intrinsicId: + intrinsicUsed = True + break + + if not intrinsicUsed: + #find the intrinsic and remove it + for intrinsic in self.cameraInit.attribute("intrinsics"): + if intrinsic.getExportValue()["intrinsicId"] == intrinsicId: + self.removeAttribute(intrinsic) + break + + # After every check we finally remove the attribute + self.removeAttribute(image) + @Slot() def removeAllImages(self): with self.groupedGraphModification("Remove All Images"): diff --git a/meshroom/ui/qml/ImageGallery/ImageGallery.qml b/meshroom/ui/qml/ImageGallery/ImageGallery.qml index 1dddc95c23..b85eaebb1d 100644 --- a/meshroom/ui/qml/ImageGallery/ImageGallery.qml +++ b/meshroom/ui/qml/ImageGallery/ImageGallery.qml @@ -291,12 +291,14 @@ Panel { } function sendRemoveRequest() { - if (!readOnly) { - removeImageRequest(object) - // If the last image has been removed, make sure the viewpoints and intrinsics are reset - if (m.viewpoints.count === 0) - allViewpointsCleared() - } + if (readOnly) + return + + removeImageRequest(object) + + // If the last image has been removed, make sure the viewpoints and intrinsics are reset + if (m.viewpoints.count === 0) + allViewpointsCleared() } function removeAllImages() { diff --git a/meshroom/ui/qml/WorkspaceView.qml b/meshroom/ui/qml/WorkspaceView.qml index 9b8a632e54..990a12bdbe 100644 --- a/meshroom/ui/qml/WorkspaceView.qml +++ b/meshroom/ui/qml/WorkspaceView.qml @@ -78,8 +78,8 @@ Item { cameraInit: reconstruction ? reconstruction.cameraInit : null tempCameraInit: reconstruction ? reconstruction.tempCameraInit : null cameraInitIndex: reconstruction ? reconstruction.cameraInitIndex : -1 - onRemoveImageRequest: reconstruction.removeAttribute(attribute) - onAllViewpointsCleared: { reconstruction.removeAllImages(); reconstruction.selectedViewId = "-1" } + onRemoveImageRequest: reconstruction.removeImage(attribute) + onAllViewpointsCleared: { reconstruction.selectedViewId = "-1" } onFilesDropped: { if (drop["meshroomScenes"].length == 1) { ensureSaved(function() {