# -*- 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) Правило сопровождения: # - Любое изменение сценария должно сопровождаться обновлением этого блока с сохранением фактического порядка вызовов. # - При добавлении метода указывать его место в цепочке сценария (запуск, основной шаг, завершение, вспомогательная логика).