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 + Set Default Object Class … @@ -1535,11 +1541,15 @@ + Settings + + true + @@ -1577,6 +1587,9 @@ Z-Rotation Only Mode + + Only allows bounding box rotation around the z-axis. + @@ -1608,6 +1621,9 @@ Show Floor + + Shows a grid along the x-y-plane (z=0). + @@ -1630,6 +1646,10 @@ Keep Perspective + + Saves the last perspective and reuses it, +when opening that point cloud again. + @@ -1641,6 +1661,9 @@ Align Point Cloud + + Transforms the point cloud so that the floor is the x-y-plane. + @@ -1652,6 +1675,18 @@ test + + + true + + + Propagate Labels + + + Propagate Labels to the next Point Cloud +if it does not have labels yet. + + 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") )