diff --git a/config.ini b/config.ini
index 125f9e1..8ee053e 100644
--- a/config.ini
+++ b/config.ini
@@ -41,6 +41,8 @@ std_rotation = 0.5
std_scaling = 0.03
; minimum value for the length, width and height of a bounding box
min_boundingbox_dimension = 0.01
+; propagate labels to next point cloud if it has no labels yet
+propagate_labels = False
[USER_INTERFACE]
; only allow z-rotation of bounding boxes. set false to also label x- & y-rotation
diff --git a/labelCloud/control/controller.py b/labelCloud/control/controller.py
index de62d36..359d895 100644
--- a/labelCloud/control/controller.py
+++ b/labelCloud/control/controller.py
@@ -1,16 +1,16 @@
import logging
-from typing import Optional, Union
+from typing import Optional
+import numpy as np
from PyQt5 import QtCore, QtGui
from PyQt5.QtCore import QPoint
-import numpy as np
-
from ..definitions import BBOX_SIDES, Color, Context
from ..utils import oglhelper
from ..view.gui import GUI
from .alignmode import AlignMode
from .bbox_controller import BoundingBoxController
+from .config_manager import config
from .drawing_manager import DrawingManager
from .pcd_manager import PointCloudManger
@@ -63,9 +63,15 @@ def next_pcd(self, save: bool = True) -> None:
if save:
self.save()
if self.pcd_manager.pcds_left():
+ previous_bboxes = self.bbox_controller.bboxes
self.pcd_manager.get_next_pcd()
self.reset()
self.bbox_controller.set_bboxes(self.pcd_manager.get_labels_from_file())
+
+ if not self.bbox_controller.bboxes and config.getboolean(
+ "LABEL", "propagate_labels"
+ ):
+ self.bbox_controller.set_bboxes(previous_bboxes)
else:
self.view.update_progress(len(self.pcd_manager.pcds))
self.view.button_next_pcd.setEnabled(False)
diff --git a/labelCloud/resources/interfaces/interface.ui b/labelCloud/resources/interfaces/interface.ui
index d4e6781..c2faa4b 100644
--- a/labelCloud/resources/interfaces/interface.ui
+++ b/labelCloud/resources/interfaces/interface.ui
@@ -1521,6 +1521,9 @@
File
+
+ true
+
@@ -1528,6 +1531,9 @@
Labels
+
+ true
+
+
diff --git a/labelCloud/view/gui.py b/labelCloud/view/gui.py
index f2815ff..398884d 100644
--- a/labelCloud/view/gui.py
+++ b/labelCloud/view/gui.py
@@ -60,6 +60,10 @@ def set_keep_perspective(state: bool) -> None:
config.set("USER_INTERFACE", "keep_perspective", str(state))
+def set_propagate_labels(state: bool) -> None:
+ config.set("LABEL", "propagate_labels", str(state))
+
+
# CSS file paths need to be set dynamically
STYLESHEET = """
* {{
@@ -118,6 +122,7 @@ def __init__(self, control: "Controller") -> None:
self.act_delete_all_labels: QtWidgets.QAction
self.act_set_default_class: QtWidgets.QMenu
self.actiongroup_default_class = QActionGroup(self.act_set_default_class)
+ self.act_propagate_labels: QtWidgets.QAction
# Settings
self.act_z_rotation_only: QtWidgets.QAction
@@ -323,6 +328,7 @@ def connect_events(self) -> None:
self.act_delete_all_labels.triggered.connect(
self.controller.bbox_controller.reset
)
+ self.act_propagate_labels.toggled.connect(set_propagate_labels)
self.act_z_rotation_only.toggled.connect(set_zrotation_only)
self.act_show_floor.toggled.connect(set_floor_visibility)
self.act_show_orientation.toggled.connect(set_orientation_visibility)
@@ -331,6 +337,9 @@ def connect_events(self) -> None:
self.act_change_settings.triggered.connect(self.show_settings_dialog)
def set_checkbox_states(self) -> None:
+ self.act_propagate_labels.setChecked(
+ config.getboolean("LABEL", "propagate_labels")
+ )
self.act_show_floor.setChecked(
config.getboolean("USER_INTERFACE", "show_floor")
)