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

LeroyProtoLIB — карта семейств прототипов

Раздел 1 документации LeroyProtoLIB. Составлен агентом-аналитиком 2026-07-24 (сессия «фасады РШ»), проверка — по ссылкам файл:строка. Разделы: 01 — карта семейств (этот файл), 02 — цепочка ниша→дверь→фасад, 03 — корпус/параметры/порт, 04 — инвентарь модулей.

0. Двухслойная архитектура корпуса (ключ ко всему)

В библиотеке два «поколения» корпусов, и это главное деление:

  • shell.py (корень, 414 КБ) — «старое»/тяжёлое поколение и общий склад примитивов. Базовые классы RSH, Shell, ShellSocle, RSH_Complect, RSH_Slot, ниши Niche, Niche_Box_Pivot, Niche_shelves, Niche_SotShelf, NicheVesh, NicheVeshProd, TerminalAngle, а также конкретные корпуса высоких распашных/купейных шкафов: ShellPivotMono (shell.py:6353), ShellPivotDuo (shell.py:7029), ShellPivotDuoThree (shell.py:7861), ShellTRIO, ShellDUO, ShellMINI.
  • based_shell/shell.py — «новое» поколение: RSH_ShellBased(RSH) (based_shell/shell.py:43) и ShellBased(Shell) (based_shell/shell.py:320). Универсальный «__Базовый корпус Парамкаталога» (точка входа P_based_shell.py). Импортирует примитивы из корневого shell.py (based_shell/shell.py:32).

Все семейства-подпакеты (pedestal/commode/shoemaker) используют ShellBased как корпус, а ниши/цоколь/комплект берут из корневого shell.py.

1. Точки входа cab_*.py в корне (высокие распашные/купе)

Общий контракт: файл определяет класс Unit*, назначает shell_cls, и имеет build_aboad(data_proto) + main(default_name_proto=...). ProtoID не зашит — резолвится в рантайме через core_k.proto_func._get_proto_id(data_proto) по имени прототипа. K3 зовёт main() (последняя функция файла).

Файл Класс Unit shell_cls Семейство / имя прототипа Точка входа
cab_pivot_mono.py:214 UnitMONO shell.ShellPivotMono (:229) РШ MONO-1 (:676) main :674build_aboad :631
cab_duo_two.py:294 UnitDUO shell.ShellPivotDuo (:310) РШ DUO-2 (:915) main :913
cab_duo_three.py (Unit из cab_duo_two) shell.ShellPivotDuoThree (:237) РШ DUO-3 левый (:267) main :265
cab_duo_four.py Unit shell.ShellPivotDuo (:256) РШ DUO-4 (:286) main :284
cab_trio_three.py:438 UnitTrio shell.ShellPivotTrio (:441) РШ TRIO-3 (:1285) main :1283
cab_duo.py:131 UnitDUO shell.ShellDUO (:147) LM шкаф ДУО (купе) (:412) main :410
cab_trio.py:152 UnitTRIO shell.ShellTRIO (:168) LM шкаф ТРИО (купе) (:534) main :532
cab_mini.py:108 UnitMINI shell.ShellMINI (:124) LM шкаф МИНИ (:298) main :296
cab_gk_skaf.py Unit (ГК) спец. (WIDTH_DIAPASON_VESH :436) ГК Корпус (:1448) main :1446
cab_gk_doorsys.py Unit (ГК) спец. ГК Дверная система (:912) main :910

Плюс тонкие обёртки-точки входа K3 в корне: cab_duoL.py, cab_duoR.py, cab_mono_two.py, cab_trio_four/five/six.py, cab_duo_three_left/right.py — вызывают build_aboad/main «толстого» cab-модуля с другим диапазоном ширины / именем прототипа.

Новое поколение семейств вызывается НЕ через cab_*, а через префикс-обёртки P_*.py / Commode*.py (см. §2): from LeroyProtoLIB.<family> import boad; boad.main(...).

2. Семейства-подпакеты

Все подпакеты имеют идентичный костяк: boad.py (билдер) + limits.py (WIDTH_DIAPASON, LimitSize). Импортируют примитивы из ..shell, корпус из ..based_shell.shell, посекционные утилиты из ..piv_param_nichenumber_utilites, комплектацию из ..functions.

pedestal_pivot_mono — pedestal_pivot_mono/boad.py

  • Unit: UnitMONO (:311), shell_cls=_shell.ShellBased (:314), niches_count = 2 (:319), dataclass RSH_MONO (:201).
  • Ниш распашных: 1 (self.pivot_niche1 = self.createNiche1 :760); плюс внутренние ниши-наполнения (box/полки/сотополки/вешалка/мягкое сиденье SoftSeats).
  • create-функции: SetNiche1/createNiche1 (:60/:95), setDoorNiche/createDoorNiche (:140/:169).
  • Точки входа: P_PedestalMONO_1.py, P_PedestalMONO_2.py, P_PedestalNavMONO_1/2.py.

pedestal_pivot_duo — pedestal_pivot_duo/boad.py

  • Unit: UnitDUO (:496), ShellBased (:499), niches_count = 2 (:504), большой файл (~1300 строк).
  • Ниш распашных: 2createNiche1 (:166)/createNiche2 (:222), вызов в Make :1195/:1198.
  • build_aboad :1274 назначает unit.createNiche1/2 (:1304/:1305).
  • Точки входа: P_PedestalDUO_2.py, P_PedestalDUO_3L.py, P_PedestalDUO_3P.py.

pedestal_pivot_duo_top — pedestal_pivot_duo_top/boad.py

  • Unit: UnitDUO (:492), ShellBased (:495), niches_count = 2 (:500). Вариант DUO с верхней секцией.
  • createNiche1/2 (:166/:222), в Make :908/:910; build_aboad :984.
  • Точки входа: P_PedestalBoxNavDUO_2.py, P_PedestalNavDUO_2.py.

commode_pivot_mono — commode_pivot_mono/boad.py

  • Unit: UnitMONO (:276), dataclass RSH_MONO. Комод MONO = 1 секция с ящиками.
  • SetBoxNiche/createBoxNiche (:51/:88), createNiche1 (:146); Make :367createNiche1 :373 c nums_fas=[1..blockbox1] (:372).
  • module = (height - h_cok - 2*h_dsp)/blockbox1 (:267).
  • build_aboad :446, for i in range(1,6) заполнение ТипФас (:452).
  • Точки входа: CommodeMONO_1.py, а также переиспользуется для P_PedestalBoxNavMONO_1.py, P_PedestalNavMONO_1.py.

commode_pivot_duo — commode_pivot_duo/boad.py

  • Unit: UnitDUO (:311), ShellBased (:314), niches_count = 2 (:319), dataclass RSH_DUO (:207).
  • 2 секции: createNiche1/createNiche2 в Make :645/:650. Секции: одна ящичная (SetBoxNiche/createBoxNiche :56/:107), вторая дверная (setDoorNiche/createDoorNiche :137/:170). Порядок секций зависит от symmetry: в build_aboad :781-790 крест-накрест назначаются createNiche1/2.
  • Разделитель секций: shell.inst_data.wpos1 (:358,:362), ширина малой секции w_small (:214).
  • Точки входа: CommodeDUO_2L.py, CommodeDUO_2R.py.

commode_pivot_trio — commode_pivot_trio/boad.py

  • Unit: UnitTRIO (:334), niches_count = 3 (:344).
  • 3 секции: createNiche1/2/3 в Make :685/:687/:689. Центр — ящики (createBoxNiche :114), крайние — двери (createDoorNiche :181). Полки/сотополки — в правую (:691) и левую (:715) секции.
  • Два разделителя: wpos1 (:386) и wpos2 (:383).
  • build_aboad :825, for i in range(1,8) (до 7 фасадов, :831); назначение createNiche1=createDoorNiche, createNiche2=createBoxNiche, createNiche3=createDoorNiche (:839/:841/:843).
  • Точка входа: CommodeTRIO_3.py.

shoemaker_mono — shoemaker_mono/boad.py

  • Unit: UnitMONO (:305), ShellBased (:35). Импортирует SokleType (:4) — особый цоколь-обувница.
  • Наполнение: N откидных ниш обувницы в циклеMake :427: for i in range(blockbox1): createNiche1(number=i+1) (:440-445), опционально верхняя box-ниша (:446-451). createNiche1 :144.
  • Только RSH_Complect, ShellSocle из ..shell (:30) — без Niche_Box_Pivot/Vesh.
  • Точки входа: P_ShoemakerMONO_1_1.py, _1_2.py, _1_1_box.py, _1_2_box.py.

wallpanel — wallpanel/boad.py

  • Классы: RSH_WallPanel (:35), ShellWP (:92), WallPanel (:289). Плоская настенная панель, ниш нет. Make :303 создаёт ShellWP (:307). Использует BasedShellPanel, SideShelfPrimitive, WallPanelDSP, WallPanelMirror из ..details (:6-7), RSH_Complect из ..entityes.rsh_common (:9).
  • Точки входа: P_WallPanelHooks.py, P_WallPanelMirror.py.

wallpanellwithroll — wallpanellwithroll/boad.py

  • Копия wallpanel с валиками: RSH_WallPanel (:35), ShellWP (:133), WallPanel (:379), Make :397.
  • Точка входа: P_WallPanelRollers.py.

3. ОБЩЕЕ между семействами (что буквально повторяется)

Повторяющийся код вынесен в четыре общих места; семейства только «дёргают» его.

Общий модуль / сущность Определение Кто переиспользует
ShellBased (корпус) + RSH_ShellBased based_shell/shell.py:320 / :43 pedestal_mono/duo/duo_top, commode_mono/duo/trio, shoemaker_mono, antresol_, bathroom/
ShellSocle + validate_cokle_height shell.py:947 / :1047 все boad.pyparams_adapter), socle_rsh.py:27 как отдельный прототип цоколя (P_socleRSH.py)
RSH_Complect.propbuilder (комплект метизов/навесов) shell.py pedestal_duo/duo_top, commode_duo/trio, shoemaker
Niche_Box_Pivot, Niche_shelves, Niche_SotShelf, NicheVesh, NicheVeshProd shell.py pedestal_mono/duo/duo_top, commode_, cab_
get_param_from_nichenumber, setNicheFasFromIndex, spacing_calculate, get_fasrtype, FacadeParameters piv_param_nichenumber_utilites.py:34/285/437/106/125 все cab_* и все family boad.py
get_prmater, get_bandtypereal, get_rshcomplect, get_id_leg functions.py все family boad.py
Gabs, Point entityes/common.py все family boad.py
NichePosition, NicheVeshPosition, SokleType constants.py family boad.py
NomenclatureID, GoodsID objecttypes.py все family boad.py
utilites_hinge_mover.PostHingeMoverPV1 (постсдвиг петель) utilites_hinge_mover.py pedestal/commode Make() (SetHingeMoverProc)

Практически дословно повторяются в каждом family UnitXXX: методы Draw (сброс NumCounter.num=19), DrawUnit, PostDraw/__PostHingeMove, _AssignScratchAttributes, _AssignAttributes, getShelfesNiche, putDoorPoshinge, свойства number/doortype/fsmater1/fas_bandtype1, и весь скелет build_aboad (создать unit → Scratch ТипФас в цикле → MakeDraw → guid → k3.fixing/holesselbyattr). Ср. pedestal_pivot_mono/boad.py:836-867commode_pivot_duo/boad.py:769-806cab_pivot_mono.py:631-667.

setDoorNiche/createDoorNiche — почти идентичны между commode_duo (:137/:170), commode_trio (:151/:181), pedestal_mono (:140/:169); отличаются только расчётом xps-сдвига и xp-ширины по числу секций.

4. РАЗЛИЧИЯ mono / duo / trio

Признак MONO DUO TRIO
niches_count 2 (внутр.), 1 распашная 2 3
Число распашных ниш в Make createNiche1 createNiche1+createNiche2 createNiche1/2/3
wpos-разделители нет wpos1 wpos1 + wpos2
Ветвление по секциям if num_niche==1: ... else: в createBoxNiche/setDoorNiche (commode_duo :118,:152,:181) if/elif num_niche==1/==2 (commode_trio :67-72,:125-134,:163,:192)
Диапазон фасадов в build_aboad range(1,2) (cab_mono :644) / range(1,3) (pedestal_mono :842) / range(1,6) (commode_mono :452) range(1,7) (commode_duo :775) range(1,8) (commode_trio :831)
Позиция секции полок правая по symmetry: STANDART_LEFT/RIGHT (commode_duo :652-659) правая (:691) + левая (:715)

Где физически ветвление по числу секций:

  • Число ниш — жёстко в теле Make каждого boad (commode_pivot_trio/boad.py:685-689).
  • Позиция/ширина секции — по num_niche внутри create*Niche (напр. commode_pivot_duo/boad.py:118-122 — расчёт xps от wpos1).
  • Порядок «ящик/дверь» — в build_aboad через перестановку createNiche1/2/3 (commode_pivot_duo/boad.py:781-790, commode_pivot_trio/boad.py:839-843).

5. Посекционные параметры (суффиксы) — механизм

Ядро — piv_param_nichenumber_utilites.py.

Сигнатура и логика выбора по номеру ниши (:34):

def get_param_from_nichenumber(inst, name_param, index):
    try:
        return getattr(inst, f"{name_param}{int(index)}")   # :52
    except AttributeError:
        return 0

Посекционные параметры прототипа — атрибуты с числовым суффиксом = номеру ниши: _fasrtype1/2/3, _fsmater…/_colorfsmat1/2, _doubledoor1/2, _openside1/2, _blockbox1/2, _polkstd1/2/3, _sotshelf1/2/3, _decofsmatc1…, _polkstd{n}h{i} (позиции полок). Подтверждение имён — в дефолтах url_entityes/dprotoid_327.py (fasrtype1, doubledoor1, blockbox1, hpolkdp1, htwovs1_1/htwovs2_1, dpolklarge1, dveshlarge_1).

Класс-агрегатор FacadeParameters (:125, конструктор :143) читает по num_niche весь набор фасада: материал fsmater{n} (:149), кромка fas_bandtype{n} (:151), тип фасада _fasrtype{n} через get_fasrtype (:153), сторона _openside{n} (:162), двудверность _doubledoor{n} (:164), деление на равные части _n1delh_{n} (:159), группа/материал отделок _decofsmatc{n} (:191).

get_fasrtype (:106) и get_fasrtype_from_box (:72) — выбор GoodsID типа фасада; для ящиков — подбор по высоте фасада через uposition1-словарь (:88-99).

setNicheFasFromIndex (:285) — центральная процедура «записать фасад в нишу с индексом»:

  • строит FacadeParameters(inst, num_niche) (:313);
  • пишет в нишу: SetFasType/SetFasMater/SetOpen/SetFasDir/SetFasBand (:321-325);
  • подбор накладной/полунакладной петли determine_hinge_type (:328, реализация :229) по свесам и uHinge4Type;
  • SetHandle (:331);
  • для каждого фасада из nums_fas (:347) — через ScrDoorContext пишет отделки в Scratch/pickle (:348-418).

Как это зовётся из boad: в Make/create*Niche сначала считается nums_fas (список номеров физических фасадов с учётом двудверности/ящиков), напр. cab_pivot_mono.py:73-74 (if _doubledoor{n}: nums_fas.append(...)), затем setNicheFasFromIndex(inst, num_niche, nums_fas=nums_fas) (cab_pivot_mono.py:85, commode_pivot_duo/boad.py:166, pedestal_pivot_mono/boad.py:91). Зазоры створок считает spacing_calculate (:437), возвращая SpacingDoor (:421).

6. Минимальный набор сущностей для построения ЛЮБОГО семейства

  1. Резолвер прототипа: core_k.proto_func._get_proto_id(data_proto) + DataProto(default_name_module/proto/lib) — получаем id_prototype.
  2. Unit-класс семейства (UnitMONO/UnitDUO/UnitTRIO/WallPanel) из <family>/boad.py: конструктор читает параметры (set_proto_parsinst_data.params_adapter).
  3. Корпус: based_shell.shell.ShellBased.factory(unit_inst=..., default_name_proto="__Базовый корпус Парамкаталога") (или конкретный shell.ShellPivotMono/Duo/Trio для cab_*). Внутри — RSH_ShellBased c wpos1/wpos2, w_small.
  4. Цоколь: shell.ShellSocle.factory(socle_inst=...) + обязательный ShellSocle.validate_cokle_height(inst_data).
  5. Комплектация метизов/навесов: RSH_Complect.propbuilder(inst_data, rshcomplect) + functions.get_* (prmater/band/id_leg/id_naves…).
  6. Ниши-наполнения (фабрики из shell.py): Niche_Box_Pivot.factory, Niche_shelves.factory, Niche_SotShelf.factory, NicheVesh(Prod).factory, SoftSeats.factory (details), плюс распашная Niche_user.StraightNiche.
  7. Фасады/петли: get_param_from_nichenumber, setNicheFasFromIndex, spacing_calculate, get_fasrtype[_from_box], FacadeParameters.
  8. Оркестратор: unit.Make() (собирает всё в self.objects) → unit.Draw()k3.fixing/holes → выбор по guid. Всё инкапсулировано в <family>/boad.py::build_aboad(data_proto), запускается одной строкой boad.main(default_name_module=..., default_name_proto=..., default_name_lib="LeroyProtoLIB") из тонкой обёртки P_*.py.

Практический вывод: единая точка вызова для любого семейства — LeroyProtoLIB.<family>.boad.main(...); вся вариативность (число секций, ящики/двери, симметрия) задаётся параметрами прототипа с числовыми суффиксами и разбирается внутри Make/build_aboad через get_param_from_nichenumber + setNicheFasFromIndex.