# -*- coding: utf-8 -*-
# gui/components/model_view/_mv_dimension_lines.py
"""Выносные размерные линии в 3D-сцене PyVista.

Модуль хранит общие константы / типы и собирает финальный
``DimensionLinesMixin`` из двух подмиксинов:

- ``DimLineCoreMixin``    — рисование размерных линий от origin
- ``DimLineMeasureMixin`` — интерактивный режим «Измерить»

Подмиксины лежат в ``_mv_dim_lines_grid.py`` и
``_mv_dim_lines_volume.py`` и импортируют константы из этого файла.
"""

from __future__ import annotations

from typing import Tuple

# ── Настройки отображения ────────────────────────────────────────────
_DIM_LINE_COLOR_ORIGIN = "#FFD600"       # жёлтый — от origin
_DIM_LINE_COLOR_LAST = "#00E5FF"         # голубой — от последней точки
_DIM_TEXT_COLOR_ORIGIN = "#FFD600"
_DIM_TEXT_COLOR_LAST = "#00E5FF"
_EXTENSION_LINE_COLOR = "#AAAAAA"        # серый — выносные линии
_LINE_WIDTH = 2.0
_EXTENSION_LINE_WIDTH = 1.0
_FONT_SIZE = 26

# Смещение первого и второго ряда размерных линий (мм).
_DIM_OFFSET_1 = 800.0   # от origin (ближний)
_DIM_OFFSET_2 = 1500.0  # от последней точки (дальний)
_EXTENSION_OVERSHOOT = 200.0
_LABEL_CLEARANCE = 180.0
_LABEL_Z_LAYER_STEP = 18.0

# Триггер привязки — доля шага сетки.
_SNAP_TRIGGER_FRACTION = 1.0 / 3.0

# Подсветка узла
_HIGHLIGHT_COLOR = "#FFFF00"
_HIGHLIGHT_RADIUS = 40.0  # мм
_HIGHLIGHT_OPACITY = 0.85
_MEASURE_HIGHLIGHT_COLOR = "#00A3FF"
_MEASURE_HIGHLIGHT_RADIUS = 120.0  # мм
_MEASURE_HIGHLIGHT_OPACITY = 0.95

# Минимальный интервал между перерисовками (секунды).
_THROTTLE_S = 0.050
_MEASURE_SNAP_MM = 450.0
_MEASURE_SNAP_PX = 24.0
_MEASURE_LABEL_COLOR = "#00E5FF"


# ── Вспомогательные типы ─────────────────────────────────────────────
_Pt3 = Tuple[float, float, float]
_Seg = Tuple[_Pt3, _Pt3]


# ── Импорт подмиксинов (после констант, т.к. они импортируют их) ─────
from gui.components.model_view._mv_dim_lines_grid import DimLineCoreMixin       # noqa: E402
from gui.components.model_view._mv_dim_lines_volume import DimLineMeasureMixin  # noqa: E402


class DimensionLinesMixin(DimLineCoreMixin, DimLineMeasureMixin):
    """Mixin для ModelViewWidget: выносные размерные линии."""
    pass


# ---------------------------------------------------------------------------
# Module workflow notes
# ---------------------------------------------------------------------------
# 1) Задача модуля:
#    Единый фасад подсистемы размерных линий model_view.
#    Файл определяет общие константы отображения/привязки и собирает
#    финальный DimensionLinesMixin из двух независимых подсистем:
#    - DimLineCoreMixin   (размеры по узлам сетки для контура),
#    - DimLineMeasureMixin (измерение по bbox объемов).
#
# 2) Почему константы размещены именно здесь:
#    - Оба подмодуля импортируют одинаковые параметры цветов, толщин,
#      порогов привязки и типов данных.
#    - Централизация исключает дублирование и расхождения между режимами.
#    - Изменение параметра в одном месте автоматически применяет его в
#      обоих сценариях (сетка и измерение объемов).
#
# 3) Последовательность использования:
#    - ModelViewWidget наследует DimensionLinesMixin.
#    - При работе с контуром используются методы из _mv_dim_lines_grid.py.
#    - При включении режима «Измерить» используются методы из
#      _mv_dim_lines_volume.py.
#    - Внешние модули не должны напрямую импортировать подмиксины, если
#      достаточно интерфейса DimensionLinesMixin.
#
# 4) Правило сопровождения:
#    - Новые общие параметры и типы добавлять в этот файл.
#    - Логику сценариев добавлять в профильный подмодуль (grid/volume),
#      сохраняя этот файл как композиционный и конфигурационный центр.


