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 :674 → build_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), dataclassRSH_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 строк). - Ниш распашных: 2 —
createNiche1(: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), dataclassRSH_MONO. Комод MONO = 1 секция с ящиками. SetBoxNiche/createBoxNiche(:51/:88),createNiche1(:146);Make:367→createNiche1:373cnums_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), dataclassRSH_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.py (в params_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 ТипФас в цикле → Make → Draw →
guid → k3.fixing/holes → selbyattr).
Ср. pedestal_pivot_mono/boad.py:836-867 ≈ commode_pivot_duo/boad.py:769-806
≈ cab_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. Минимальный набор сущностей для построения ЛЮБОГО семейства¶
- Резолвер прототипа:
core_k.proto_func._get_proto_id(data_proto)+DataProto(default_name_module/proto/lib)— получаемid_prototype. - Unit-класс семейства (
UnitMONO/UnitDUO/UnitTRIO/WallPanel) из<family>/boad.py: конструктор читает параметры (set_proto_pars→inst_data.params_adapter). - Корпус:
based_shell.shell.ShellBased.factory(unit_inst=..., default_name_proto="__Базовый корпус Парамкаталога")(или конкретныйshell.ShellPivotMono/Duo/Trioдля cab_*). Внутри —RSH_ShellBasedcwpos1/wpos2,w_small. - Цоколь:
shell.ShellSocle.factory(socle_inst=...)+ обязательныйShellSocle.validate_cokle_height(inst_data). - Комплектация метизов/навесов:
RSH_Complect.propbuilder(inst_data, rshcomplect)+functions.get_*(prmater/band/id_leg/id_naves…). - Ниши-наполнения (фабрики из
shell.py):Niche_Box_Pivot.factory,Niche_shelves.factory,Niche_SotShelf.factory,NicheVesh(Prod).factory,SoftSeats.factory(details), плюс распашнаяNiche_user.StraightNiche. - Фасады/петли:
get_param_from_nichenumber,setNicheFasFromIndex,spacing_calculate,get_fasrtype[_from_box],FacadeParameters. - Оркестратор:
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.