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

LeroyProtoLIB — цепочка построения: ниша → дверь → фасад → петли → крепёж

Раздел 2 документации LeroyProtoLIB (см. 01-families-map.md). Составлен агентом-аналитиком 2026-07-24, проверка — по ссылкам файл:строка.

0. Отправная точка

Proto/LeroyProtoLIB/pedestal_pivot_duo/boad.py:305-372setDoorNiche/ 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.

SetFillNiche_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.SetSpacingGMethods.py:855.

2. Дверь StandartDoor → фасад, петли, ручка

Классы: Proto/user_build/Door_user.py:554 class StandartDoor(BaseDoor. StandartDoor, StraightDoor); StraightDoorDoor_user.py:258; DoorDoor_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-294make_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_vbp VB) и shell.py:350-357, 630-638.
  • Базовая деталь: Proto/LeroyProtoLIB/based_shell_panel.py:19 BasedShellPanel (обёртка над 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), полка-стяжка SideShelfScreedfix_mf (120-125), задняя стенка BackSideSU_Flipperfixbw + 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/AddSlotbased_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/SetCommonbased_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.spacing1SpacingDoor (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 (ниша, __MakeDoor 349, Make 503)
  • Proto/based_build/Niche.py (база ниши, полки/крепёж)
  • Proto/user_build/Door_user.py (StandartDoor 554, Make 718, WingBuilder 2584, init_fasad 905, _addDoorHinges 946)
  • Proto/user_build/uFurnFuncs.py (CreateDoor 156, CreateFasad 185)
  • Proto/user_build/GMethods.py (миксины door/fasad/box, SetHinge 803, SetSpacing 855, SetFasBand 624)
  • Proto/user_build/hinge_position.py (BuilderOfDoorHinges 252)
  • Proto/LeroyProtoLIB/piv_param_nichenumber_utilites.py (setNicheFasFromIndex 285, FacadeParameters 125, get_fasrtype 106, determine_hinge_type 229, spacing_calculate 437)
  • Proto/LeroyProtoLIB/based_shell_panel.py (change_fix 170), details.py (крепёж/пропилы корпуса), shell.py (fix_*/slotpars)
  • Proto/based_build/Panel.py (Slot 49, Band 720, Fixline 940, AddSlot 2592)
  • Proto/engine/uFurnObject.py (InitAttributes 502, set_proto_pars 402)