Skip to content

obstacle

ObstacleEntity #

Bases: QEntity

An obstacle on the table.

It is represented as a cube (QCuboidMesh).

When selected with a mouse click, a property window is displayed to modify the obstacle properties.

The obstacle can also be moved using the mouse.

Attributes:

Name Type Description
enable_controller

Qt signal used to disable the camera controller when moving the obstacle using the mouse

Source code in cogip/entities/obstacle.py
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
class ObstacleEntity(Qt3DCore.QEntity):
    """
    An obstacle on the table.

    It is represented as a cube ([QCuboidMesh](https://doc.qt.io/qtforpython-6/PySide6/Qt3DExtras/QCuboidMesh.html)).

    When selected with a mouse click, a property window is displayed
    to modify the obstacle properties.

    The obstacle can also be moved using the mouse.

    Attributes:
        enable_controller: Qt signal used to disable the camera controller
            when moving the obstacle using the mouse
    """

    enable_controller = qtSignal(bool)

    def __init__(
        self,
        parent_widget: QtWidgets.QWidget,
        x: int = 0,
        y: int = 0,
        rotation: int = 0,
        length: int = 225,
        width: int = 225,
        height: int = 350,
    ):
        """
        Class constructor.

        Arguments:
            parent_widget: Parent widget
            x: X position
            y: Y position
            rotation: Rotation
            length: Length
            width: Width
            height: Height
        """
        super().__init__()

        self.parent_widget = parent_widget

        self.mesh = Qt3DExtras.QCuboidMesh()
        self.mesh.setXExtent(width)
        self.mesh.setYExtent(length)
        self.mesh.setZExtent(height)
        self.addComponent(self.mesh)

        self.material = Qt3DExtras.QPhongMaterial(self)
        self.addComponent(self.material)

        self.transform = Qt3DCore.QTransform(self)
        self.transform.setTranslation(QtGui.QVector3D(x, y, self.mesh.zExtent() / 2))
        self.transform.setRotationZ(rotation)
        self.addComponent(self.transform)

        self.picker = Qt3DRender.QObjectPicker()
        self.picker.setDragEnabled(True)
        self.picker.pressed.connect(self.pressed_obstacle)
        self.picker.released.connect(self.released_obstacle)
        self.picker.moved.connect(self.moved_obstacle)
        self.addComponent(self.picker)

        self.beacon_entity = Qt3DCore.QEntity(self)
        self.beacon_mesh = Qt3DExtras.QCylinderMesh(self.beacon_entity)
        self.beacon_mesh.setLength(80)
        self.beacon_mesh.setRadius(35)
        self.beacon_entity.addComponent(self.beacon_mesh)

        self.beacon_material = Qt3DExtras.QPhongMaterial(self.beacon_entity)
        self.beacon_entity.addComponent(self.beacon_material)

        self.beacon_transform = Qt3DCore.QTransform(self.beacon_entity)
        self.beacon_transform.setTranslation(
            QtGui.QVector3D(0, 0, self.mesh.zExtent() / 2 + self.beacon_mesh.length() / 2)
        )
        self.beacon_transform.setRotationX(90)
        self.beacon_entity.addComponent(self.beacon_transform)

        self.moving = False

        self.mesh.zExtentChanged.connect(self.updateZTranslation)

        # Create a layer used by sensors to activate detection on the obstacles
        self.layer = Qt3DRender.QLayer(self)
        self.layer.setRecursive(True)
        self.layer.setEnabled(True)
        self.addComponent(self.layer)

        # Create properties dialog
        self.properties = ObstacleProperties(self.parent_widget, self)

        Sensor.add_obstacle(self)

    @qtSlot(float)
    def updateZTranslation(self, zExtent: float):
        """
        Qt Slot

        Update the Z position based on the obstacle height.
        This function is called each time the height is modified
        to set the bottom on Z=0.
        """
        translation = self.transform.translation()
        translation.setZ(zExtent / 2)
        self.transform.setTranslation(translation)

    @qtSlot(int)
    def setXTranslation(self, x: int):
        """
        Qt Slot

        Set the X position.
        """
        translation = self.transform.translation()
        translation.setX(float(x))
        self.transform.setTranslation(translation)

    @qtSlot(int)
    def setYTranslation(self, y: int):
        """
        Qt Slot

        Set the Y position.
        """
        translation = self.transform.translation()
        translation.setY(float(y))
        self.transform.setTranslation(translation)

    @qtSlot(Qt3DRender.QPickEvent)
    def pressed_obstacle(self, pick: Qt3DRender.QPickEvent):
        """
        Qt Slot

        Slot called on a ```pressed``` mouse event on the obstacle.

        Emit a signal to disable the camera controller before moving the obstacle.
        """
        self.enable_controller.emit(False)

    @qtSlot(Qt3DRender.QPickEvent)
    def released_obstacle(self, pick: Qt3DRender.QPickEvent):
        """
        Qt Slot

        Slot called on a ```released``` mouse event on the obstacle.

        If this event occurs just after a ```pressed``` event, it is only a mouse click,
        so display the property window.

        Emit a signal to re-enable the camera controller after moving the obstacle.
        """
        if not self.moving:
            if ObstacleProperties.active_properties:
                ObstacleProperties.active_properties.close()
            self.properties.show()
            self.properties.raise_()
            self.properties.activateWindow()
            ObstacleProperties.set_active_properties(self.properties)
        self.moving = False
        self.enable_controller.emit(True)

    @qtSlot(Qt3DRender.QPickEvent)
    def moved_obstacle(self, pick: Qt3DRender.QPickEvent):
        """
        Qt Slot

        Slot called on a ```moved``` mouse event on the obstacle.

        Just record that the obstacle is moving, the translation is computed
        in the [GameView][cogip.widgets.gameview.GameView] object.
        """
        self.moving = True

    def get_model(self) -> models.Obstacle:
        """
        Returns the [Obstacle][cogip.models.models.Obstacle] model.
        Used to save the obstacles list.

        Returns:
            The obstacle model
        """
        return models.Obstacle(
            x=self.transform.translation().x(),
            y=self.transform.translation().y(),
            rotation=self.transform.rotationZ(),
            length=self.mesh.yExtent(),
            width=self.mesh.xExtent(),
            height=self.mesh.zExtent(),
        )

    @qtSlot(QtGui.QVector3D)
    def new_move_delta(self, delta: QtGui.QVector3D):
        """
        Qt Slot

        Update the obstacle position.

        Arguments:
            delta: The difference between current and new position
        """
        if not delta:
            self.moving = False
        elif self.moving:
            new_translation = self.transform.translation() + delta
            self.transform.setTranslation(new_translation)
            self.properties.spin_x.setValue(new_translation.x())
            self.properties.spin_y.setValue(new_translation.y())

__init__(parent_widget, x=0, y=0, rotation=0, length=225, width=225, height=350) #

Class constructor.

Parameters:

Name Type Description Default
parent_widget QWidget

Parent widget

required
x int

X position

0
y int

Y position

0
rotation int

Rotation

0
length int

Length

225
width int

Width

225
height int

Height

350
Source code in cogip/entities/obstacle.py
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
def __init__(
    self,
    parent_widget: QtWidgets.QWidget,
    x: int = 0,
    y: int = 0,
    rotation: int = 0,
    length: int = 225,
    width: int = 225,
    height: int = 350,
):
    """
    Class constructor.

    Arguments:
        parent_widget: Parent widget
        x: X position
        y: Y position
        rotation: Rotation
        length: Length
        width: Width
        height: Height
    """
    super().__init__()

    self.parent_widget = parent_widget

    self.mesh = Qt3DExtras.QCuboidMesh()
    self.mesh.setXExtent(width)
    self.mesh.setYExtent(length)
    self.mesh.setZExtent(height)
    self.addComponent(self.mesh)

    self.material = Qt3DExtras.QPhongMaterial(self)
    self.addComponent(self.material)

    self.transform = Qt3DCore.QTransform(self)
    self.transform.setTranslation(QtGui.QVector3D(x, y, self.mesh.zExtent() / 2))
    self.transform.setRotationZ(rotation)
    self.addComponent(self.transform)

    self.picker = Qt3DRender.QObjectPicker()
    self.picker.setDragEnabled(True)
    self.picker.pressed.connect(self.pressed_obstacle)
    self.picker.released.connect(self.released_obstacle)
    self.picker.moved.connect(self.moved_obstacle)
    self.addComponent(self.picker)

    self.beacon_entity = Qt3DCore.QEntity(self)
    self.beacon_mesh = Qt3DExtras.QCylinderMesh(self.beacon_entity)
    self.beacon_mesh.setLength(80)
    self.beacon_mesh.setRadius(35)
    self.beacon_entity.addComponent(self.beacon_mesh)

    self.beacon_material = Qt3DExtras.QPhongMaterial(self.beacon_entity)
    self.beacon_entity.addComponent(self.beacon_material)

    self.beacon_transform = Qt3DCore.QTransform(self.beacon_entity)
    self.beacon_transform.setTranslation(
        QtGui.QVector3D(0, 0, self.mesh.zExtent() / 2 + self.beacon_mesh.length() / 2)
    )
    self.beacon_transform.setRotationX(90)
    self.beacon_entity.addComponent(self.beacon_transform)

    self.moving = False

    self.mesh.zExtentChanged.connect(self.updateZTranslation)

    # Create a layer used by sensors to activate detection on the obstacles
    self.layer = Qt3DRender.QLayer(self)
    self.layer.setRecursive(True)
    self.layer.setEnabled(True)
    self.addComponent(self.layer)

    # Create properties dialog
    self.properties = ObstacleProperties(self.parent_widget, self)

    Sensor.add_obstacle(self)

get_model() #

Returns the Obstacle model. Used to save the obstacles list.

Returns:

Type Description
Obstacle

The obstacle model

Source code in cogip/entities/obstacle.py
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
def get_model(self) -> models.Obstacle:
    """
    Returns the [Obstacle][cogip.models.models.Obstacle] model.
    Used to save the obstacles list.

    Returns:
        The obstacle model
    """
    return models.Obstacle(
        x=self.transform.translation().x(),
        y=self.transform.translation().y(),
        rotation=self.transform.rotationZ(),
        length=self.mesh.yExtent(),
        width=self.mesh.xExtent(),
        height=self.mesh.zExtent(),
    )

moved_obstacle(pick) #

Qt Slot

Slot called on a moved mouse event on the obstacle.

Just record that the obstacle is moving, the translation is computed in the GameView object.

Source code in cogip/entities/obstacle.py
176
177
178
179
180
181
182
183
184
185
186
@qtSlot(Qt3DRender.QPickEvent)
def moved_obstacle(self, pick: Qt3DRender.QPickEvent):
    """
    Qt Slot

    Slot called on a ```moved``` mouse event on the obstacle.

    Just record that the obstacle is moving, the translation is computed
    in the [GameView][cogip.widgets.gameview.GameView] object.
    """
    self.moving = True

new_move_delta(delta) #

Qt Slot

Update the obstacle position.

Parameters:

Name Type Description Default
delta QVector3D

The difference between current and new position

required
Source code in cogip/entities/obstacle.py
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
@qtSlot(QtGui.QVector3D)
def new_move_delta(self, delta: QtGui.QVector3D):
    """
    Qt Slot

    Update the obstacle position.

    Arguments:
        delta: The difference between current and new position
    """
    if not delta:
        self.moving = False
    elif self.moving:
        new_translation = self.transform.translation() + delta
        self.transform.setTranslation(new_translation)
        self.properties.spin_x.setValue(new_translation.x())
        self.properties.spin_y.setValue(new_translation.y())

pressed_obstacle(pick) #

Qt Slot

Slot called on a pressed mouse event on the obstacle.

Emit a signal to disable the camera controller before moving the obstacle.

Source code in cogip/entities/obstacle.py
143
144
145
146
147
148
149
150
151
152
@qtSlot(Qt3DRender.QPickEvent)
def pressed_obstacle(self, pick: Qt3DRender.QPickEvent):
    """
    Qt Slot

    Slot called on a ```pressed``` mouse event on the obstacle.

    Emit a signal to disable the camera controller before moving the obstacle.
    """
    self.enable_controller.emit(False)

released_obstacle(pick) #

Qt Slot

Slot called on a released mouse event on the obstacle.

If this event occurs just after a pressed event, it is only a mouse click, so display the property window.

Emit a signal to re-enable the camera controller after moving the obstacle.

Source code in cogip/entities/obstacle.py
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
@qtSlot(Qt3DRender.QPickEvent)
def released_obstacle(self, pick: Qt3DRender.QPickEvent):
    """
    Qt Slot

    Slot called on a ```released``` mouse event on the obstacle.

    If this event occurs just after a ```pressed``` event, it is only a mouse click,
    so display the property window.

    Emit a signal to re-enable the camera controller after moving the obstacle.
    """
    if not self.moving:
        if ObstacleProperties.active_properties:
            ObstacleProperties.active_properties.close()
        self.properties.show()
        self.properties.raise_()
        self.properties.activateWindow()
        ObstacleProperties.set_active_properties(self.properties)
    self.moving = False
    self.enable_controller.emit(True)

setXTranslation(x) #

Qt Slot

Set the X position.

Source code in cogip/entities/obstacle.py
121
122
123
124
125
126
127
128
129
130
@qtSlot(int)
def setXTranslation(self, x: int):
    """
    Qt Slot

    Set the X position.
    """
    translation = self.transform.translation()
    translation.setX(float(x))
    self.transform.setTranslation(translation)

setYTranslation(y) #

Qt Slot

Set the Y position.

Source code in cogip/entities/obstacle.py
132
133
134
135
136
137
138
139
140
141
@qtSlot(int)
def setYTranslation(self, y: int):
    """
    Qt Slot

    Set the Y position.
    """
    translation = self.transform.translation()
    translation.setY(float(y))
    self.transform.setTranslation(translation)

updateZTranslation(zExtent) #

Qt Slot

Update the Z position based on the obstacle height. This function is called each time the height is modified to set the bottom on Z=0.

Source code in cogip/entities/obstacle.py
108
109
110
111
112
113
114
115
116
117
118
119
@qtSlot(float)
def updateZTranslation(self, zExtent: float):
    """
    Qt Slot

    Update the Z position based on the obstacle height.
    This function is called each time the height is modified
    to set the bottom on Z=0.
    """
    translation = self.transform.translation()
    translation.setZ(zExtent / 2)
    self.transform.setTranslation(translation)

ObstacleProperties #

Bases: QDialog

The property window.

Each obstacle has its own property window.

Attributes:

Name Type Description
active_properties ObstacleProperties

The current property window displayed.

Source code in cogip/entities/obstacle.py
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
class ObstacleProperties(QtWidgets.QDialog):
    """
    The property window.

    Each obstacle has its own property window.

    Attributes:
        active_properties: The current property window displayed.
    """

    active_properties: "ObstacleProperties" = None

    def __init__(self, parent: QtWidgets.QWidget, obstacle_entity: ObstacleEntity):
        """
        Class constructor.

        Arguments:
            parent: The parent widget
            obstacle_entity: The related obstacle entity
        """
        super().__init__(parent)

        self.obstacle_entity = obstacle_entity
        self.setWindowTitle("Obstacle Properties")
        self.setModal(False)
        self.setMinimumWidth(self.fontMetrics().horizontalAdvance(self.windowTitle()))

        layout = QtWidgets.QGridLayout()
        self.setLayout(layout)

        row = 0

        label_x = QtWidgets.QLabel("X")
        self.spin_x = QtWidgets.QSpinBox()
        self.spin_x.setStepType(QtWidgets.QAbstractSpinBox.AdaptiveDecimalStepType)
        self.spin_x.setMinimum(-1000)
        self.spin_x.setMaximum(1000)
        self.spin_x.setValue(int(self.obstacle_entity.transform.translation().x()))
        self.spin_x.valueChanged.connect(self.obstacle_entity.setXTranslation)
        layout.addWidget(label_x, row, 0)
        layout.addWidget(self.spin_x, row, 1)
        row += 1

        label_y = QtWidgets.QLabel("Y")
        self.spin_y = QtWidgets.QSpinBox()
        self.spin_y.setStepType(QtWidgets.QAbstractSpinBox.AdaptiveDecimalStepType)
        self.spin_y.setMinimum(-1500)
        self.spin_y.setMaximum(1500)
        self.spin_y.setValue(int(self.obstacle_entity.transform.translation().y()))
        self.spin_y.valueChanged.connect(self.obstacle_entity.setYTranslation)
        layout.addWidget(label_y, row, 0)
        layout.addWidget(self.spin_y, row, 1)
        row += 1

        label_rotation = QtWidgets.QLabel("Rotation")
        self.spin_rotation = QtWidgets.QSpinBox()
        self.spin_rotation.setSuffix("°")
        self.spin_rotation.setMinimum(-180)
        self.spin_rotation.setMaximum(180)
        self.spin_rotation.setValue(int(self.obstacle_entity.transform.rotationZ()))
        self.spin_rotation.valueChanged.connect(self.obstacle_entity.transform.setRotationZ)
        layout.addWidget(label_rotation, row, 0)
        layout.addWidget(self.spin_rotation, row, 1)
        row += 1

        label_width = QtWidgets.QLabel("Width")
        self.spin_width = QtWidgets.QSpinBox()
        self.spin_width.setMaximum(2000)
        self.spin_width.setSingleStep(10)
        self.spin_width.setValue(int(self.obstacle_entity.mesh.xExtent()))
        self.spin_width.valueChanged.connect(self.obstacle_entity.mesh.setXExtent)
        layout.addWidget(label_width, row, 0)
        layout.addWidget(self.spin_width, row, 1)
        row += 1

        label_length = QtWidgets.QLabel("Length")
        self.spin_length = QtWidgets.QSpinBox()
        self.spin_length.setMaximum(2000)
        self.spin_length.setSingleStep(10)
        self.spin_length.setValue(int(self.obstacle_entity.mesh.yExtent()))
        self.spin_length.valueChanged.connect(self.obstacle_entity.mesh.setYExtent)
        layout.addWidget(label_length, row, 0)
        layout.addWidget(self.spin_length, row, 1)
        row += 1

        label_height = QtWidgets.QLabel("Height")
        self.spin_height = QtWidgets.QSpinBox()
        self.spin_height.setMaximum(1000)
        self.spin_height.setSingleStep(10)
        self.spin_height.setValue(int(self.obstacle_entity.mesh.zExtent()))
        self.spin_height.valueChanged.connect(self.obstacle_entity.mesh.setZExtent)
        layout.addWidget(label_height, row, 0)
        layout.addWidget(self.spin_height, row, 1)
        row += 1

        self.readSettings()

    @classmethod
    def set_active_properties(cls, properties: "ObstacleProperties"):
        """
        Class method.

        Set the current property window displayed.

        Arguments:
            properties: The current property
        """
        cls.active_properties = properties

    def closeEvent(self, event: QtGui.QCloseEvent):
        """
        Close the property windows.

        Arguments:
            event: The close event (unused)
        """
        ObstacleProperties.set_active_properties(None)

        settings = QtCore.QSettings("COGIP", "monitor")
        settings.setValue("obstacle_dialog/geometry", self.saveGeometry())

        super().closeEvent(event)

    def readSettings(self):
        settings = QtCore.QSettings("COGIP", "monitor")
        self.restoreGeometry(settings.value("obstacle_dialog/geometry"))

__init__(parent, obstacle_entity) #

Class constructor.

Parameters:

Name Type Description Default
parent QWidget

The parent widget

required
obstacle_entity ObstacleEntity

The related obstacle entity

required
Source code in cogip/entities/obstacle.py
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
def __init__(self, parent: QtWidgets.QWidget, obstacle_entity: ObstacleEntity):
    """
    Class constructor.

    Arguments:
        parent: The parent widget
        obstacle_entity: The related obstacle entity
    """
    super().__init__(parent)

    self.obstacle_entity = obstacle_entity
    self.setWindowTitle("Obstacle Properties")
    self.setModal(False)
    self.setMinimumWidth(self.fontMetrics().horizontalAdvance(self.windowTitle()))

    layout = QtWidgets.QGridLayout()
    self.setLayout(layout)

    row = 0

    label_x = QtWidgets.QLabel("X")
    self.spin_x = QtWidgets.QSpinBox()
    self.spin_x.setStepType(QtWidgets.QAbstractSpinBox.AdaptiveDecimalStepType)
    self.spin_x.setMinimum(-1000)
    self.spin_x.setMaximum(1000)
    self.spin_x.setValue(int(self.obstacle_entity.transform.translation().x()))
    self.spin_x.valueChanged.connect(self.obstacle_entity.setXTranslation)
    layout.addWidget(label_x, row, 0)
    layout.addWidget(self.spin_x, row, 1)
    row += 1

    label_y = QtWidgets.QLabel("Y")
    self.spin_y = QtWidgets.QSpinBox()
    self.spin_y.setStepType(QtWidgets.QAbstractSpinBox.AdaptiveDecimalStepType)
    self.spin_y.setMinimum(-1500)
    self.spin_y.setMaximum(1500)
    self.spin_y.setValue(int(self.obstacle_entity.transform.translation().y()))
    self.spin_y.valueChanged.connect(self.obstacle_entity.setYTranslation)
    layout.addWidget(label_y, row, 0)
    layout.addWidget(self.spin_y, row, 1)
    row += 1

    label_rotation = QtWidgets.QLabel("Rotation")
    self.spin_rotation = QtWidgets.QSpinBox()
    self.spin_rotation.setSuffix("°")
    self.spin_rotation.setMinimum(-180)
    self.spin_rotation.setMaximum(180)
    self.spin_rotation.setValue(int(self.obstacle_entity.transform.rotationZ()))
    self.spin_rotation.valueChanged.connect(self.obstacle_entity.transform.setRotationZ)
    layout.addWidget(label_rotation, row, 0)
    layout.addWidget(self.spin_rotation, row, 1)
    row += 1

    label_width = QtWidgets.QLabel("Width")
    self.spin_width = QtWidgets.QSpinBox()
    self.spin_width.setMaximum(2000)
    self.spin_width.setSingleStep(10)
    self.spin_width.setValue(int(self.obstacle_entity.mesh.xExtent()))
    self.spin_width.valueChanged.connect(self.obstacle_entity.mesh.setXExtent)
    layout.addWidget(label_width, row, 0)
    layout.addWidget(self.spin_width, row, 1)
    row += 1

    label_length = QtWidgets.QLabel("Length")
    self.spin_length = QtWidgets.QSpinBox()
    self.spin_length.setMaximum(2000)
    self.spin_length.setSingleStep(10)
    self.spin_length.setValue(int(self.obstacle_entity.mesh.yExtent()))
    self.spin_length.valueChanged.connect(self.obstacle_entity.mesh.setYExtent)
    layout.addWidget(label_length, row, 0)
    layout.addWidget(self.spin_length, row, 1)
    row += 1

    label_height = QtWidgets.QLabel("Height")
    self.spin_height = QtWidgets.QSpinBox()
    self.spin_height.setMaximum(1000)
    self.spin_height.setSingleStep(10)
    self.spin_height.setValue(int(self.obstacle_entity.mesh.zExtent()))
    self.spin_height.valueChanged.connect(self.obstacle_entity.mesh.setZExtent)
    layout.addWidget(label_height, row, 0)
    layout.addWidget(self.spin_height, row, 1)
    row += 1

    self.readSettings()

closeEvent(event) #

Close the property windows.

Parameters:

Name Type Description Default
event QCloseEvent

The close event (unused)

required
Source code in cogip/entities/obstacle.py
333
334
335
336
337
338
339
340
341
342
343
344
345
def closeEvent(self, event: QtGui.QCloseEvent):
    """
    Close the property windows.

    Arguments:
        event: The close event (unused)
    """
    ObstacleProperties.set_active_properties(None)

    settings = QtCore.QSettings("COGIP", "monitor")
    settings.setValue("obstacle_dialog/geometry", self.saveGeometry())

    super().closeEvent(event)

set_active_properties(properties) classmethod #

Class method.

Set the current property window displayed.

Parameters:

Name Type Description Default
properties ObstacleProperties

The current property

required
Source code in cogip/entities/obstacle.py
321
322
323
324
325
326
327
328
329
330
331
@classmethod
def set_active_properties(cls, properties: "ObstacleProperties"):
    """
    Class method.

    Set the current property window displayed.

    Arguments:
        properties: The current property
    """
    cls.active_properties = properties