LeroyProtoLIB — цепочка построения: ниша → дверь → фасад → петли → крепёж¶
Раздел 2 документации LeroyProtoLIB (см.
01-families-map.md). Составлен агентом-аналитиком 2026-07-24, проверка — по ссылкам файл:строка.
0. Отправная точка¶
Proto/LeroyProtoLIB/pedestal_pivot_duo/boad.py:305-372 — setDoorNiche/
createDoorNiche. Создают Niche_user.StraightNiche(inst), задают _parent,
SetFurnType("110105"), SetFill(SHELVES,0), SetDoorType(inst.doortype),
зазоры SetSpacing(...), вызывают setNicheFasFromIndex(inst, num_niche)
(импорт из ..piv_param_nichenumber_utilites, boad.py:35), затем
SetPosition/SetGabs.
1. Ниша StraightNiche: как рождаются дверь и наполнение¶
Класс: Proto/user_build/Niche_user.py:203 class StraightNiche(GMethods.GM,
GMethods.box, GMethods.door, GMethods.fasad, BaseNiche.StraightNiche, Niche).
База: Proto/based_build/Niche.py:26 class StraightNiche(Niche).
Диспетчер построения — Make() (Niche_user.py:503-539): по
self._typefill выбирает наполнение:
FILLTYPE_SHELVES→__MakeFixShelves()(жёсткие полки) + если_fstype!=0→__MakeDoor()(Niche_user.py:511-514).FILLTYPE_SHELVES_REM→__MakeRemoveShelves()+ дверь (515-518).FILLTYPE_BOX_VERT→__MakeBoxVert()(вертикальные ящики черезBox.GroupBox, 463) — двери нет.FILLTYPE_DRYER→ сушка + дверь (528-534).
Ключевой момент: дверь строится только когда _fstype != 0 (тип фасада;
ставится через setNicheFasFromIndex, см. §2/§5).
Наполнение (полки). __MakeFixShelves (базовый based_build/Niche.py:390-422)
для каждой полки создаёт Panel.Panel(), SetMater(_prmater),
SetCuts(PANELSIDE_E, __shelfcut), кромку Band.SetCommon(PANELSIDE_E,
_bandtypereal) и крепёж Fixline.SetCommon(PANELSIDE_B/C, _fixcorp).
Пользовательский override Niche_user.py:277-297 добавляет боковой крепёж
GetLeftFix/GetRightFix(_fixcorp) (стяжка Blum, Niche_user.py:98-116) и
pan.ChFixId(...). Съёмные полки — make_remove_shelf
(based_build/Niche.py:436-473), крепёж _fixshelfrem.
SetFill — Niche_user.py:155-179 и based_build/Niche.py:222-242. Тип в
_typefill, количество в _numfill. FILLTYPE
(SHELVES/BOX_VERT/TECHNICS/SHELVES_REM/BOX_HORIZ/DRYER) —
based_build/Niche.py:222-232.
Дверь — __MakeDoor() (Niche_user.py:349-410) — ядро цепочки:
door = FurnFuncs.CreateDoor(self._doortype, self)(Niche_user.py:363).- Передаёт двери:
SetGabs(_w,_d,_h),SetSpacing(...)(из_right_s/_left_s/_top_s/_bottom_s/_double_s, иначе умолчанияDNRight/DNLeft/DNUp/DNDown/Door_ZwизGetEntity, 366-371),SetMater(_fsmater),SetBand(_fas_bandtype,_fas_bandcolor),SetDoorType(_doortype),SetOpen(_openside,_doubledoor),SetHinge(_hingetype, 0, md_plate=_md_plate, mplate=_mplan)(385),SetLiftType(_lifttype),SetThickness(16). - Петельные сдвиги:
door.auto_hinge_kray=False,putDoorPoshinge(door)копирует_poshinge21/_poshinge22из родителя (Niche_user.py:79-87). - Для задней стенки под мойку (
BACKWALLTYPE_FOR_SINK) —SetAutoHinges(2),_kray=182(396-403).
Spacing (зазоры створок). Из прототипа: boad.py:327-333
SetSpacing(right_s, left_s, top_s, bottom_s, double_s); значения — из
inst.spacing1 (SpacingDoor, piv_param_nichenumber_utilites.py:421-462
spacing_calculate — целочисленная ширина фасада; для полунакладной петли
halpside). GMethods.door.SetSpacing — GMethods.py:855.
2. Дверь StandartDoor → фасад, петли, ручка¶
Классы: Proto/user_build/Door_user.py:554 class StandartDoor(BaseDoor.
StandartDoor, StraightDoor); StraightDoor — Door_user.py:258; Door —
Door_user.py:195.
CreateDoor (user_build/uFurnFuncs.py:156-175): резолвит класс двери по
свойству справочника (py_obj_finder, умолчание based_build.Door.StandartDoor),
возвращает door(parcls) — parcls = ниша. __init__ StandartDoor
(Door_user.py:576-585) вызывает InitAttributes(self._protoid, parcls)
(_protoid=121), _kray=118.
Make() (Door_user.py:718-758): _SetAddVars() (659) →
requester_setter, set_hinge_two, расчёт ширины под угол петли. Выбор створок:
- одинарная →
_makeOneWing()(835) →_MakeDoorWing(...)→StandartDoorWingBuilder(...).Make(); - двойная вбок →
_makeTwoWingsOpensSideways()(873): две створки L/R сhinge_id=_hingetypeи_p_type2; - двойная вертикально →
_makeTwoWingsOpensSideVertically()(842).
Создание ФАСАДА — в билдере створки StandartDoorWingBuilder.Make()
(Door_user.py:2809-2967):
fasad = self.door.init_fasad()(2819).init_fasad(Door_user.py:905-911) =FurnFuncs.CreateFasad(self._fstype, parcls=self), затемfasad.fas_mater = self._prmater.CreateFasad(uFurnFuncs.py:185-210): приfastype==0→ 318; резолв класса черезpy_obj_finder, проверка наследникаuser_build.Fasad_user.Fasad, возвратfasad(parcls)(parcls = створка-билдер). Тип_fstype— изGetFasType()(GMethods.fasad, GMethods.py:504-513).- Фасаду задаются:
SetMater(door._prmater),SetFasBand(door._bandtype)(2828),SetOpen(openside),SetPosition+AddPosition,SetGabs(fasw,fash), гдеfasw/fash=door._calculateDimSizeFacade(нахлёсты/double_s, Door_user.py:1048-1066) и_getPositionFacade(1068-1107). Фасад складывается вdoor._fasads(2848) иobjects(2854).
ПЕТЛИ. hinges = self.door._addDoorHinges(fasad, objects, hinge_id) (2870).
_addDoorHinges (Door_user.py:946-1019) →
BuilderOfDoorHinges.makeHingesFromDoor(door_, fasad, hinge_id)
(user_build/hinge_position.py:252-294 → make_hinges_from_door_default,
297+). Отступ края door.hinge_kray, число петель getNHingesOfLengthSide.
Доп. верхняя петля на широких фасадах (_addDopHinge, 1021). Накладная/
полунакладная уточняется на уровне прототипа в determine_hinge_type
(piv_param_nichenumber_utilites.py:229-282) по свойству uHinge4Type и свесам
(Hinge4Type/HingeSpaceType, Door_user.py:154-193).
РУЧКА. handles = self.door._Handle(...) (2917). _Handle
(Door_user.py:1119-1172) выбирает функцию установки по свойству HNDMac типа
двери/фасада, либо Accessory.DefaultHandle. Нет ручки → псевдообъект с
_handletype=-14 (2922-2932). Демпфер — _MakeDempfer (2667/2906).
Подъёмники — make_lifts/_Lifts (1185-…).
Тип фасада _fstype/_fasrtype определяется на уровне прототипа:
get_fasrtype(inst, num_niche) (piv_param_nichenumber_utilites.py:106-122 —
читает _fasrtype{N}, при uParsLogic подменяет через uFasFromDoorType);
FacadeParameters (125-226) вычисляет fasrtype, материал fsmater (по группам
отделок PanMaterDef{n}), сторону. setNicheFasFromIndex (285-419) кладёт всё
в нишу: SetFasType/SetFasMater/SetOpen/SetFasDir/SetFasBand + отделки/скретчи
(ScrDoorContext, pickle_data).
InitAttributes (engine/uFurnObject.py:502-507): set_proto_pars(protoid)
(402-470) читает параметры прототипа из БД (mproto.read_current_property_proto,
TProtoPar) и через setattr создаёт атрибуты _имя; затем
direct_transit_variables(parcls) (472-500) — прямая передача одноимённых
_-атрибутов из родителя в дочерний объект. Так дверь «наследует» значения от
ниши, а ниша — от прототипа inst.
3. Крепёж и пропилы на панелях¶
Полки ниши получают крепёж при построении в Make-методах ниши (§1):
Panel.Fixline().SetCommon(side, fix_id) + AddFixline/ChFixId
(based_build/Niche.py:410-415, 461-467; Niche_user.py:286-289). Крепёж полок
— _fixcorp (жёсткие) и _fixshelfrem (съёмные), задаются SetFix
(Niche_user.py:133-143).
Корпус (shell) — крепёж и пропилы назначают фабрики деталей корпуса:
- Поля крепежа в датаклассах:
boad.py:409-416(RSH_DUO:fix_eckуголок,fix_mfминификс+шкант,fix_konfконфирмат+шкант,fix_skшкант,fix_vb/fix_vb_ds/fix_vb_skvz/fix_vbpVB) иshell.py:350-357, 630-638. - Базовая деталь:
Proto/LeroyProtoLIB/based_shell_panel.py:19BasedShellPanel(обёртка надPanel.Panel).change_fix(d)(170-180) для каждой стороны создаётPanel.Fixline().SetCommon(side, fix_id, zdown)+AddFixline. Крепёж назначается черезfix_panel_adapter/put_fix_panel(68-128). - Конкретные детали:
Proto/LeroyProtoLIB/details.py— фабрикиfactory(unit_inst). КрышкаSideTopTable(51-87), полка-стяжкаSideShelfScreed—fix_mf(120-125), задняя стенкаBackSideSU_Flipper—fixbw+SetCutsCustom+Fixline.SetCommon(196-212). - Пропилы под заднюю стенку (slots) создаёт сама деталь в
factory:Panel.Slot(); slot.SetSlot(planeA, side, stype, cpr, cps=slotpars._depthbp, cpd=slotpars._incutbp, cpw=slotpars._h_dvp, ...); panel.panel.AddSlot(slot)— details.py:71-86, 342-357, 383-398, 437-452, 489-504, 548-563, 599-614. Параметры —RSH_Slot(entityes/rsh_common.py:12-13), полеslotparsвshell.py:362, 644.Panel.Slot/SetSlot/AddSlot—based_build/Panel.py:49, 116, 2592. - Спец-крепёж по типу задней стенки (
fix_vb_skvzдля сквозного) переназначается вshell.py:1595-1606(RmFixline+ новые).
Итог: Panel сама пропилы/крепёж не проставляет — их назначают фабрики
деталей корпуса (details.py) и shell.py через
BasedShellPanel.change_fix/AddFixline/AddSlot; полки ниши — методы
__MakeFixShelves/make_remove_shelf самой ниши.
4. Кромка (Band)¶
- Полки/корпус ниши:
Panel.Band(); band.SetCommon(side, _bandtypereal); band.SetBandFace(True); shelf.AddBand(band)—based_build/Niche.py:406-409, 455-458._bandtypereal— черезFurnFuncs.FindBand(_bandtype, _bandcolor)(based_build/Niche.py:192-215).Band/SetCommon—based_build/Panel.py:720, 909. - Фасад:
SetFasBand(fas_band, bandcolor)(GMethods.py:624-643) — задаёт_fas_bandtype,_fas_bandcolor,_bandtypefasreal = FurnFuncs.FindBand(...). Путь:setNicheFasFromIndex → niche.SetFasBand(piv_param…:325) → дверьdoor.SetBand(Niche_user.py:377) → фасадfasad.SetFasBand(door._bandtype)(Door_user.py:2828). - Корпус (детали): кромка — декоратором
@add_bands_wrap(list_sides=(...))наfactoryдетали (details.py:43-50, 96, 135, 169, 220, 255…). bandtyperealкорпуса —functions.get_bandtypereal(shell.py:41).
5. Входные атрибуты, обязательные у прототипа inst¶
Для полного createDoorNiche(inst, N) (полки+дверь+фасад+петли+ручка+крепёж):
Геометрия/секции (boad.py, RSH_DUO):
inst.shell,inst.rsh_shell(нужныh_dsp,y_niche,h_cok,wpos1,inst_data.width,w_small);inst._d,inst.inst_data.w_small,inst.closed_interval_z,inst.doortype.inst.spacing1—SpacingDoor(fullside,halpside,top,bot,doublespacing) изspacing_calculate(piv_param…:437).
Для двери (в нишу из setNicheFasFromIndex/SetSpacing):
_fstype(из_fasrtype{N}черезget_fasrtype/FacadeParameters) — БЕЗ него дверь не строится._fsmater,_fas_bandtype/_fas_bandcolor,_fas_nshp(текстура)._doortype,_openside,_doubledoor._hingetype,_p_type2,_md_plate,_mplan,_lifttype.- Зазоры:
_right_s/_left_s/_top_s/_bottom_s/_double_s(иначе умолчания изGetEntity). - Петельные сдвиги:
_poshinge21,_poshinge22. - Ручка (setNicheFasFromIndex:331-338):
_handletype/DfHandl,_handleplace/BxHandPlace,_handle_h/BxHandZ,_handle_a/BxHandAngle,_handlemove/BxHandX.
Для наполнения/крепежа полок ниши: _prmater, _bandtypereal/_bandtype+
_bandcolor, _fixcorp, _fixshelfrem, _shelfcut, _cutsh, _numfill,
_typefill.
Для крепежа/пропилов корпуса (RSH_DUO/shell inst_data): fix_eck, fix_mf,
fix_konf, fix_sk, fix_vb(+_ds/_skvz/vbp), fixbw; slotpars
(RSH_Slot: _depthbp, _incutbp, _h_dvp); prmater, bandtypereal.
Отделки фасада (опционально): _decofsmatc{N}, свойства PanMaterDef{1..4}
у материала.
Все _-атрибуты создаются из TProtoPar в set_proto_pars
(uFurnObject.py:402-470) при InitAttributes и пробрасываются в дочерние
объекты через direct_transit_variables (472-500).
Ключевые файлы¶
Proto/user_build/Niche_user.py(ниша,__MakeDoor349,Make503)Proto/based_build/Niche.py(база ниши, полки/крепёж)Proto/user_build/Door_user.py(StandartDoor554,Make718,WingBuilder2584,init_fasad905,_addDoorHinges946)Proto/user_build/uFurnFuncs.py(CreateDoor156,CreateFasad185)Proto/user_build/GMethods.py(миксины door/fasad/box,SetHinge803,SetSpacing855,SetFasBand624)Proto/user_build/hinge_position.py(BuilderOfDoorHinges252)Proto/LeroyProtoLIB/piv_param_nichenumber_utilites.py(setNicheFasFromIndex285,FacadeParameters125,get_fasrtype106,determine_hinge_type229,spacing_calculate437)Proto/LeroyProtoLIB/based_shell_panel.py(change_fix170),details.py(крепёж/пропилы корпуса),shell.py(fix_*/slotpars)Proto/based_build/Panel.py(Slot49,Band720,Fixline940,AddSlot2592)Proto/engine/uFurnObject.py(InitAttributes502,set_proto_pars402)