Files
2026-04-29 08:18:54 +04:00

105 lines
5.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
# gui/components/model_view/_mv_racks.py
"""Логика работы с размещением стеллажей и связанными визуальными состояниями.
Этот модуль компонует полный ``RackPlacementMixin`` из набора
мелких подмиксинов, каждый из которых отвечает за отдельную область
логики размещения стеллажей. Также здесь хранятся константы уровня
класса, общие для всех подмиксинов.
"""
from __future__ import annotations
from gui.components.model_view._mv_racks_projection import RackPlacementProjectionMixin
from gui.components.model_view._mv_racks_visual import RackPlacementVisualMixin
from gui.components.model_view._mv_racks_lifecycle import RackLifecycleMixin
from gui.components.model_view._mv_racks_crud import RackCrudMixin
from gui.components.model_view._mv_racks_camera import RackCameraMixin
from gui.components.model_view._mv_racks_shelf import RackShelfMixin
from gui.components.model_view._mv_racks_selection import RackSelectionMixin
from gui.components.model_view._mv_racks_move import RackMoveMixin
from gui.components.model_view._mv_racks_picking import RackPickingMixin
from gui.components.model_view._mv_racks_shelf_render import RackShelfRenderMixin
from gui.components.model_view._mv_racks_hover import RackHoverMixin
from gui.components.model_view._mv_racks_preview import RackPreviewMixin
from gui.components.model_view._mv_racks_codes import RackCodesMixin
from gui.components.model_view._mv_racks_collision import RackCollisionMixin
from gui.components.model_view._mv_racks_mezzanine import RackMezzanineMixin
class RackPlacementMixin(
RackLifecycleMixin,
RackCrudMixin,
RackCameraMixin,
RackShelfMixin,
RackSelectionMixin,
RackMoveMixin,
RackPickingMixin,
RackShelfRenderMixin,
RackHoverMixin,
RackPreviewMixin,
RackCodesMixin,
RackCollisionMixin,
RackMezzanineMixin,
RackPlacementProjectionMixin,
RackPlacementVisualMixin,
):
"""Миксин с логикой размещения стеллажей внутри зоны."""
_PALLET_CENTER_SPAN_MM = 3706
_PALLET_FOOTPRINT_WIDTH_SINGLE_MM = 3796
_PALLET_DEPTH_MM = 1100
_PALLET_HEIGHT_MM = 2505
_PALLET_BUFFER_MM = 100
_RACK_COLLISION_BUFFER_MM = 100
_MAX_BUFFER_OVERLAP_MM = 100
_MEZZANINE_CONTAINMENT_MARGIN_MM = 100
_SHELF_NORMS = {
"A": {
"base_surface_offset_from_bbox_top_mm": 0.0,
"min_base_height_mm": 80.0,
"min_useful_height_mm": 16.0,
"min_inter_shelf_mm": 53.0,
"shelf_height_mm": 37.0,
"step_mm": 53.0,
},
"B": {
"base_surface_offset_from_bbox_top_mm": 15.0,
"min_base_height_mm": 130.0,
"min_useful_height_mm": 68.0,
"min_inter_shelf_mm": 113.0,
"shelf_height_mm": 45.0,
"step_mm": 37.5,
},
"PALLET": {
"base_surface_offset_from_bbox_top_mm": 55.0,
"min_base_height_mm": 252.0,
"min_useful_height_mm": 112.0,
"min_inter_shelf_mm": 250.0,
"shelf_height_mm": 250.0,
"step_mm": 50.0,
},
}
# ---------------------------------------------------------------------------
# Module workflow notes
# ---------------------------------------------------------------------------
# 1) Задача модуля:
# Композиционный фасад подсистемы стеллажей.
#
# 2) Последовательность действий и вызовов:
# A. Композиционный класс RackPlacementMixin:
# Назначение: объединяет поведение через RackLifecycleMixin, RackCrudMixin, RackCameraMixin, RackShelfMixin, RackSelectionMixin, RackMoveMixin, RackPickingMixin, RackShelfRenderMixin, RackHoverMixin, RackPreviewMixin, RackCodesMixin, RackCollisionMixin, RackMezzanineMixin, RackPlacementProjectionMixin, RackPlacementVisualMixin.
# Собственная вычислительная логика отсутствует; маршрутизация идёт в родительские миксины.
#
# 3) Важные ограничения и инварианты:
# - Модуль выполняется в составе ModelViewWidget и использует согласованные поля состояния self._... .
# - Межмодульная связность: только через фасад model_view; прямые обращения между zone, rack, shelf, cell запрещены.
# - Очистка состояния должна быть идемпотентной: повторный вызов не меняет корректное состояние в ошибочное.
#
# 4) Правило сопровождения:
# - Любое изменение сценария должно сопровождаться обновлением этого блока с сохранением фактического порядка вызовов.
# - При добавлении метода указывать его место в цепочке сценария (запуск, основной шаг, завершение, вспомогательная логика).