Перейти к содержанию

LeroyProtoLIB — инвентарь модулей ядра

Раздел 4c документации LeroyProtoLIB (см. 01-families-map.md). Составлен агентом-документатором 2026-07-24 на основе модульных докстрингов и TODO(АУДИТ), добавленных в правках (коммит aed3be70). Ссылки — файл:строка ПОСЛЕ правок.

Ядро библиотеки — пять модулей, на которые опираются все cab_* и family boad.py: piv_param_nichenumber_utilites (посекционные параметры ниш), functions (резолв материалов/крепежа из «цвета»), details (детали корпуса), based_shell/shell (новое поколение корпуса), url_data_reader (загрузка заказа).


1. piv_param_nichenumber_utilites.py — посекционные параметры ниш

Роль. Механизм ПОСЕКЦИОННЫХ параметров: прототипы РШ хранят параметры каждой секции в атрибутах с числовым суффиксом = номер ниши (_fasrtype1, fsmater2, _openside3, _doubledoor1, _blockbox2, _polkstd3h{i}, …). Ниши нумеруются СПРАВА НАЛЕВО. Базовый примитив — get_param_from_nichenumber.

Функция/класс Строка Назначение
get_param_from_nichenumber(inst, name_param, index) 55 читает getattr(inst, f"{name_param}{index}"), нет атрибута → 0 (не исключение). База всего механизма.
read_fas_code(goods_id) 84 строковый код записи типа фасада.
get_fasrtype_from_box(inst, num_niche, hfas) 98 тип фасада ЯЩИКА по высоте фасада (селектор по словарю высот из свойства uposition1).
get_fasrtype(inst, num_niche) 140 тип фасада распашной двери в нише N (резолв записи-селектора: uParsLogicuFasFromDoorType).
FacadeParameters 168 агрегат всех параметров фасада ниши N: материал fsmater, кромка fas_bandtype, тип fasrtype, сторона openside, двудверность doubledoor, отделки decofsmatc.
determine_hinge_type(inst, fp) 274 уточнить накладная/полунакладная петля по свойству uHinge4Type и свесам (Hinge4Type/HingeSpaceType). Пишет в fp.
setNicheFasFromIndex(inst, num_niche, nums_fas) 333 центральная процедура: собрать FacadeParameters, записать фасад в нишу (SetFasType/SetFasMater/SetOpen/SetFasDir/SetFasBand), петли (determine_hinge_type), ручку (SetHandle), отделки фасадов в Scratch/pickle.
SpacingDoor 470 габ-агрегат зазоров створок: fullside, halpside (полунакладная), top, bot, doublespacing.
spacing_calculate(inst, countfas, bot, top) 485 целочисленная ширина фасада → SpacingDoor.

Как зовётся. В Make/create*Niche сначала считается список номеров физических фасадов nums_fas (учёт двудверности/ящиков), затем setNicheFasFromIndex(inst, num_niche, nums_fas=nums_fas) (см. 01 §5).


2. functions.py — резолв номенклатуры из «цвета»

Роль. Паттерн Адаптер: одна запись «цвета» ccmater (группа 727) несёт материал + кромку + ХДФ + соединитель + крепёж + опоры + комплект РШ. Каждое свойство — priceinfo(ccmater, <property>, default). Вход — ccmater из protopars._colorcmmater через get_ccmater.

Функция Свойство Назначение
get_ccmater(protopars) :39 protopars._colorcmmater ID «цвета» (бросает ColorcmmaterException при 0); вход для всех ниже.
get_prmater :58 MatId ЛДСП корпуса
get_bandtypereal :73 mBandId кромка корпуса
get_rshcomplect(protopars) :90 protopars._rshcomplect ID записи комплекса крепежа → RSH_Complect.propbuilder
get_fix_vb :107 / get_fix_vbp :122 / get_fix_vb_skvz :142 / get_fix_vb_ds :157 ID_FixCS1 / ID_FixCS1 / ID_FixCS2 / ID_FixCS3 VB-крепёж (шток/перфорация/сквозной/длинный)
get_id_leg :172 / get_id_naves :235 / get_id_fetr_leg :251 mKompl_1 / mKompl_2 / mKompl_3 опора / навес / опора-ножка
get_fix_podp :188 uFixPODP крепёж поддона
get_bpmater :203 mHdfId ХДФ задней стенки
get_bp_connector :218 mHdfCon соединитель ХДФ
make_naves(...) :343 поднимается по parent до rsh_shell.id_naves, ставит левый/правый навес
add_bands :266 / add_bands_wrap :289 кромкование панели / декоратор factory детали
divide_max_size(size, max_size=600) :324 разбиение размера ≤600 (для ЗС)

Утилиты кромкования: add_bands / add_bands_wrap (декоратор для factory деталей), divide_max_size (разбиение размера).


3. details.py — каталог деталей корпуса (66 классов)

Роль. Каждый класс — одна деталь (боковина, крышка, дно, полка, задняя стенка, цоколь, стенка жёсткости, мягкие элементы) с classmethod factory(), который задаёт имя, UnitCode, MajorPlace, материал, кромки (декоратор add_bands_wrap) и крепёж/пазы. Габариты и позиция здесь не вычисляются — их назначает корпус через адаптеры BasedShellPanel.set_* + put_position_and_forma().

Группы по префиксам: - Side* — панели корпуса (Left/Right/Top/Down/Shelf/Horis/Lining/Cokle); суффиксы: CMF — минификс, Dn — накладное дно, Slot — с пазом под ЗС, Hid — обувница (скрытая), VB — VB-крепёж, GK — гардеробная, SU — санузел, DS — дверная система. - Wall* — стенки (царга, панели на стену, задние). - BackWall* — задние стенки (BackSideSU_Flipper, BackWallsMaxsize в services.py — режет ≤600); особые: BackwallConnector — профиль-соединитель ХДФ, BackWallHandle — аксессуар-ручка ЗС. - Dobor* — доборы; Soft* — мягкие сиденья/валики; *Terminal — терминал.

Кто ставит пазы под ЗС. Сама деталь в factory: details.py SideLeft/SideRight → Panel.Slot(); slot.SetSlot(planeA, side, stype, cps=slotpars._depthbp, cpd=slotpars._incutbp, cpw=slotpars._h_dvp); panel.AddSlot(slot) (см. 02 §3).


4. based_shell/shell.py — новое поколение корпуса (ShellBased)

Роль. «Базовый корпус Парамкаталога» (точка входа P_based_shell.py). Универсальный корпус, который используют все семейства-подпакеты (pedestal/commode/shoemaker/antresol/bathroom). Импортирует примитивы из корневого shell.py, добавляет свой датакласс параметров и свои адаптеры.

Класс Строка Назначение
RSH_ShellBased(RSH, metaclass=field_property_support) 52 данные корпуса: секции (wpos1/wpos2, w_small), материалы, крепёж fix_*, slotpars; params_adapter читает protopars.
ShellBased(Shell) 332 корпус: набор classmethod-адаптеров (gab_panel_adapter, symmetry_pan_position_adapter, gab_niche_adapter, fix_panel_adapter…), Make собирает панели + ниши.

factory(unit_inst=..., default_name_proto="__Базовый корпус Парамкаталога") — стандартный вызов из family boad.py.


5. url_data_reader.py — загрузка заказа из веб-конфигуратора

Роль. Конвейер main(): код заказа → URL генератора JSON → get_url_data парсит → по data["Program"] (raspash|wardrobe|doors|kupe) сценарий расстановки (шкафы справа налево, антресоли над шкафами, предметы над комодами) → каждый предмет cab_order_produce по proto_id из словаря CabLib берёт DPROTOID_NNN, заполняет атрибуты из JSON (set_items_cab_class) и создаёт прототип k3.protoobj.

Сущность Строка Назначение
get_url_data(url) 294 чтение/парс JSON (с восстановлением битого через _repair_broken_json 323).
read_URL(ordercod) 428 код → URL через url_k3_json_factory 401 → JSON.
OrderINFO 475 агрегат заказа; order_info_changer 503.
Wardrobes / WardrobePosition 498 / 649 список предметов / позиция шкафа.
is_wardrobe_base_items / is_antresole / is_comode / is_midle_item / is_pan_soft 676/700/724/712/736 классификация предмета по proto_id.
calculate_wardrobe_position / calculate_antresole_position / calculate_midle_item_position 763/801/779 координаты расстановки.
cab_order_produce(...) 891 создать предмет: подобрать DPROTOID_NNN, set_items_cab_class 967, k3.protoobj. При несоответствии идентификаторов (K3Error) — регенерация модуля.
set_items_cab_class(data, orderinfo, current_cab) 967 заполнить атрибуты датакласса из JSON.
update_protoparams_minvalue(protoid, b) 1773 зажать значения JSON в границы MinValue/MaxValue свойств.
validate_data_proc(data, protoid) 1703 подменить нулевые материалы на DefValue из БД.
main(data) 1194 точка входа конвейера.

Требует requests (ставится в Proto/site-packages).


TODO(АУДИТ) в модулях ядра (потенциальные баги, помечены в коде)

Полный реестр TODO(АУДИТ) по всей библиотеке — в 04b-inventory-shell.md § «TODO(АУДИТ)» и ниже. Здесь — относящиеся к ядру.

shell.py (см. 04b §«TODO(АУДИТ)», 10 пунктов)

  • 329 RSH_ShellGS: hpolkdp{i} умножается сам на себя (квадрат; ожидалось * ishpolkdp{i}) — вероятный баг.
  • 337 RSH_ShellGS: prmater/bandtypereal в цикле по i (не зависят от i).
  • 389 RSH_ShellPivot: h_cok объявлен дважды, второе затирает первое.
  • 434, 724: slotpars: RSH_Slot = RSH_Slot()mutable default (общий экземпляр на все объекты dataclass).
  • 442, 732: опечатка Dict[int.int] (→ Dict[int, int]); не падает из-за from __future__ import annotations.
  • 901 ExtWidth.check (и ExtHeight/ExtDepth): аннотация -> bool, при успехе возвращает None.
  • 1599 ShellMINI.gab_panel_adapter (BackWallLarge): length не используется; при h_small_int_d==0 длина ЗС занижена (в ShellDUO стоит length=length).
  • 2753 ShellDUO.symmetry_pan_position_adapter: any([_isp(SideDown), _isp(SideTopWithEck)]) — вероятно SideDownWithEck; условие мёртвое.
  • 2868 WallStrong/BOTTOM: h_cok + + h_dsp — двойной плюс (остаток правки).

functions.py

  • get_fix_vbp (:122): тело полностью совпадает с get_fix_vb (то же свойство ID_FixCS1). Уточнить: отдельный ключ (ID_FixCS1P?) или дубликат намеренный.
  • get_id_leg (:172) и др.: аргумент default объявлен, но не используется — в priceinfo передан литерал 0 (то же в get_fix_podp/get_bpmater/ get_bp_connector/get_id_naves/get_id_fetr_leg).
  • make_naves (:343): если ни у одного родителя нет rsh_shell/inst_data.id_naves, цикл while not id_naves безусловного break не имеет — возможно зависание.

based_shell/shell.py

  • недостижимый return point ниже — мёртвый код.
  • заглушка: всегда возвращает пустой Gabs(); хелпер _isp не …
  • метод не вызывается из Make() (там только *_1 и *_2).

details.py

  • :1 «Main details…» — строка стоит после импортов: это не докстринг модуля, а безвредный строковый литерал; настоящий докстринг добавлен в начало файла (NOTE, не баг).

cab_* (точки входа)

  • cab_duo_two.py: is_vesh_large — сеттер без …; метод определён в классе ДВАЖДЫ; ветки используют разные атрибуты (_bandtype vs …); range(1,4) пишет ТипФас1..3, но при двух двойных дверях — несоответствие; не читается id_naves (в отличие от MONO).
  • cab_duo_three.py: класс/DOUBLESPACING/spacing_calculate затеняют импортированные; нет k3.fixing/k3.holes (в отличие от DUO-2) — намеренно?; range(1,3) пишет ТипФас1..2, а фасадов у DUO-3 три.
  • cab_duo_four.py: num_niche перезатирается единицей; до 4 фасадов, а слотов ТипФас — 3 (range(1,4)).
  • cab_pivot_mono.py: getter читает _dveshlarge_1, setter пишет _dveshlarge; params_adapter пишет inst_data.openside1, а здесь …; перед try нет skf = None — если build_aboad упадёт, … .
  • cab_mono_two.py: main() не возвращает построенный объект (в отличие от соседей).

family boad.py (дубли вынесены в общий модуль — кандидат на рефакторинг)

  • pedestal_pivot_duo/boad.py: SetBoxNiche/createBoxNiche закомментированы (мёртвый код); num_niche игнорируется; дословные дубли в pedestal_pivot_mono/duo_top; Draw/DrawUnit/PostDraw/_Assign* — дубль всех семейств; условие проверяет _blockbox1 (не _blockbox2); хвост guid/fixing/holes/selbyattr — дословный повтор.
  • pedestal_pivot_duo_top/boad.py: суффикс «_top» из кода не выводится; дословные копии SetNiche1/2 из pedestal_pivot_duo; num_niche игнорируется.
  • commode_pivot_mono/boad.py: SetBoxNiche — почти дословный дубль; build_aboad не используется; мёртвая функция; Draw/_Assign* и свойства doortype/fsmater1 — дубли всех семейств; хвост guid/fixing/holes/selbyattr.

antresol / bathroom

  • antresol_pivot_duo/antresol_duo_three.py: set_calculatе_shell_wpos1 присваивается функция вместо вызова.
  • antresol_pivot_trio/limits.py: LimitSize_PIVOT_DUO4 объявлен и здесь, и в antresol_pivot_duo/limits.py — дубль.
  • bathroom/dnboads/cokle_utils.py: модуль нигде не импортируется.
  • bathroom/dnboads/common_boad.py: в заголовке ранее значилось «Распашной DUO» — по коду это MONO; NameError — имя ccmater в make_shell не определено (скопировано из params_adapter).
  • bathroom/dnboads/mono_two.py: build_aboad НЕ передаёт … (в отличие от tpboads/mono_two.py).
  • bathroom/dobor_handler.py: файлы bathroom/__init__,py и bathroom/dnboads/__init__,py названы …
  • old_modules/* (antresol): кандидаты на удаление — нигде не импортируются; актуальный корпус — based_shell/shell.py (ShellBased).

Связанные документы: 01-families-map (карта семейств, посекционные параметры §5), 02-niche-door-facade-chain (кто ставит крепёж/пазы/кромку), 03-shell-socle-params-port (таблица «оракул→порт→статус» §4), 04a (url_entityes + tests), 04b (shell.py + 10 TODO(АУДИТ)).