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

LeroyProtoLIB — корпус, цоколь, параметры прототипа и статус порта

Раздел 3 документации LeroyProtoLIB (см. 01-families-map.md). Составлен агентом-аналитиком 2026-07-24, проверка — по ссылкам файл:строка. Порт: packages/arline-geometry (Model) и Proto/SParamProtoLib (Controller + рендерер K3).

1. Классы корпуса и ниш (shell.py)

Иерархия базовых типов:

  • RSH — базовый класс параметров (данные), entityes/rsh_common.py:81. Свойство h_dsp читает толщину материала из номенклатуры (:99-101).
  • RSH_Complect — комплекс умолчаний крепежа, entityes/rsh_common.py:17. propbuilder(rsh, rsid) (:50-79) заполняет fix_mf/fix_konf/fix_sk/fix_vb/fix_vbp/fix_vb_ds/fix_vb_skvz/fix_eck/ fix_eckmet/fix_pin/acc_hex_key/acc_instruction/fix_backwall_midwall из справочника сборочных изделий (priceinfo(..., tableid=2)), дефолты-константы goods-id в теле класса (:36-48).
  • RSH_Slot — параметры пропила под заднюю стенку, rsh_common.py:12-15: _depthbp=16, _h_dvp=4 (толщина ДВП), _incutbp=7 (глубина пропила).
  • BasedShellPanel — базовая деталь-панель, based_shell_panel.py:19. Держит Panel.Panel(), методы put_position_and_forma (:110), put_fix_panel/ fix_panel_adapter (:122), change_fix (:170), классовые адаптеры set_gab_panel_adapter/set_symmetry_position_adapter/set_fix_panel_adapter.

Корпуса (наследуют Shell(uFurnObject.FurnObject), shell.py:1200):

  • ShellMINI :1208, ShellDUO :1959 («Шкаф Купе»), ShellTRIO :3096.
  • ShellPivotMono :6353, ShellPivotDuo :7029, ShellPivotDuoThree :7861, ShellPivotTrio :8811 — распашные (pivot), используются cab_*.
  • Параметры: RSH_ShellPivot :281 (params_adapter :430), RSH_ShellCupe :582.

Каждый Shell — набор классметодов-«адаптеров», которые передаются деталям: gab_panel_adapter, symmetry_pan_position_adapter, gab_niche_adapter/ symmetry_niche_position_adapter, fix_panel_adapter, nleggs_adapter/ nfixpin_adapter/backwal_width_adapter.

Как ShellPivotMono.Make (:6843) строит корпус

Порядок (:6862-6966):

  1. Подставляет адаптеры в BasedShellPanel и BackWallsMaxsize (:6847-6858), AddFixPin.set_nfixpin_adapter.
  2. Боковины: SideLeft.factory (commonpos=1), SideRight.factory (cp=2) — :6862-6867.
  3. Крыша/дно: SideTop.factory (cp=3), SideDown.factory (cp=4) — :6870-6871.
  4. Жёсткие полки SideHorisLarge (верх/низ, cp=6) — :6874-6879; царги WallStrong (cp=7) — :6882-6887.
  5. Задняя стенка: BackWallsMaxsize.factory (services.py, режет ≤600), cp=8 — :6890.
  6. Гвозди ЗС: AddFixPin.factory, :6895; ключ AccHexKey, инструкция AccInstruction.
  7. put_position_and_forma каждой панели. Крыша/дно: SetCutsCustom(B=h_dsp, C=h_dsp) — подрез торцов под боковины (:6908-6915).
  8. Навесы make_naves (:6958).
  9. Цоколь при h_cok>0: ShellSocle.factory(socle_inst=self, is_konf=False) (:6962-6964).

КТО ставит пропилы под заднюю стенку и крепёж

  • Пазы под ЗС ставит САМА деталь-боковина в factory: SideLeft.factory (details.py:342-357), SideRight.factory (details.py:383-398) — Panel.Slot(); slot.SetSlot(..., PANELSIDE_D, SLOTTYPE_THROUGH, cps=slotpars._depthbp(16), cpd=slotpars._incutbp(7), cpw=slotpars._h_dvp(4), map_=MAP_D); panel.AddSlot(slot). Сквозной паз D16[4×7] под ДВП — из slotpars (RSH_Slot).
  • Подрезы торцов: корпус в Make через SetCutsCustom (крыша/дно B/C=h_dsp, цоколь D/E=h_dsp).
  • Крепёж на панелях: fix_panel_adapter корпуса (пример ShellDUO.fix_panel_adapter, shell.py:2781-2816): SideTop/SideDownfix_vb_skvz по B/C; SideIntWallfix_vb_ds + fix_backwall_midwall по D. Механизм: paninst.change_fix(d, zdown, usespot)Panel.Fixline().SetCommon(side, goods_id). У ShellPivotMono.Make адаптер крепежа выключен (set_fix_panel_adapter(None), :6851) — крепёж по стыкам добавляется через make_naves и умолчания панелей.
  • Крепёж ЗС — гвозди: AddFixPin (entityes/addcomponents.py:130, factory :161) → Accessory_user.Fixer(acc_id=fix_pin); число — nfixpin_adapter корпуса.

Цоколь

  • RSH_Socle :63 (params_adapter :91): _w/_h/_d/_sokletype, RSH_Complect.propbuilder, резолв prmater/bandtypereal/id_leg/id_fetr_leg, dbsetvar("prmater"/"band").
  • Socle(FurnObject) :860ShellSocle(Socle) :947:
  • Make :1065: по sokletypemake_sokle_commode (:1106) или make_sokle_shoemaker (:1087).
  • make_sokle_commode: планки SideLining.factory (BACK/FRONT, cp=5), боковые SideLiningP (LEFT/RIGHT, cp=6, только при width>899, :1144), опоры AccLeggs. Планки: SetCutsCustom(D=h_dsp,E=h_dsp).
  • make_sokle_shoemaker: скрытая планка SideLiningHid + опоры.
  • validate_cokle_height :1047 — 0 → нет цоколя; 1-39 → недопустимо (правится); ≥40 — как есть.
  • factory(socle_inst, is_konf) :1149: наследует width/depth/h_cok от корпуса; при is_konf=False крепёж цоколя = fix_mf корпуса.

Ниши и наполнения (наследуют Niche(FurnObject) :4419)

Niche базовый: SetGabs/GetGabs, адаптеры (из Shell через set_*), put_position_and_forma :4518, count :4529.

  • NicheVesh :4544 — торцевое (выдвижное) вешало, Make :4586.
  • NicheVeshProd :4748 — продольная штанга, Make :4781: тянет K3-прототип rack_long.Rack из P_niche_vesh_prod.py, при широкой нише — средний держатель.
  • NicheBRHolder :4657, NichePantograf :4841 (make_pantograf), NicheSideBruckHolder :4939 (брючница, make_holder).
  • Niche_shelves :5035 — равномерные съёмные полки. Make :5141: get_zpos_shelves() (:5119) даёт Z-позиции; каждая полка shelf_class.factorySetGabs(width, depth), SetPosition(0,0,z), ClosedInterval, put_fix_panel. SetZPosShelves :5100 — ручные позиции. factory :5167.
  • Niche_Box :5214 / Niche_Box_Pivot :5406 — блок ящиков. Niche_Box_Pivot.Make :5496: make_block_panels (:5517) — рама (стойка+фальшпанель со стороны петли, L/R варианты :5563/:5592) + make_gr_box (:5652) — Box_user.GroupBox (ассет). limit_size_depth_checker :5481.
  • Niche_SotShelf :5865 — наклонная обувная полка. Draw :5957: make_sot_shelf (:5978) вызывает макрос MakeSotShelf.mac. Niche_ShoeShelfGK :6041, Niche_SotKorGK :5729, Niche_BoxGK :6206 — варианты для ГК.
  • TerminalAngle :4179 — угловой терминал (боковой блок полок), Make :4277.

Выбор типа вешалки — по глубине/ширине через таблицы veshalo_type (:523), veshalo_count (:539) на RSH_ShellPivot, данные — based_shell/limits.py.

2. Точка входа (cab_pivot_mono.py) — сборка сверху вниз

  • RSH_Mono :129 — данные корпуса, params_adapter(protopars) :164:
  • копирует _w/_h/_d/_termangleft/_termangright/_openside1/_doubledoor1/ _hcok/_hpolktp1/_ishpolkdp1/_hpolkdp1/_sotshelf1/_pants_1/_symmetry (:165-191);
  • shell.ShellSocle.validate_cokle_height(self) :177;
  • ccmater = get_ccmater(protopars) (_colorcmmater), fsmater1 = _colorfsmat1;
  • материалы: priceinfo(ccmater, "MatId"/"mBandId"/"mHdfId"/"mHdfCon"/ "mKompl_1"/"mKompl_2"/"mKompl_3"/"uFixPODP", 0) (:193-201);
  • k3.dbsetvar("prmater"/"band"/"dvpMaterial"/"HDFConnector", ...) :208-211 — запись обратно в переменные прототипа.
  • UnitMONO(uFurnObject.FurnObject) :214:
  • __init__ :217: SetFurnType("100011"), shell_cls=shell.ShellPivotMono, rsh_shell_cls=shell.RSH_ShellPivot, width_diapason, limit_size=LimitSize_PIVOT_MONO1. При id_prototype: set_proto_pars(id_prototype)self.inst_data.params_adapter(self) (:240-243).
  • make_shell :358: self.shell = shell_cls.factory(unit_inst=self).
  • Make :419 — главная сборка:
    1. make_shell() — корпус (внутри и цоколь);
    2. Niche_Box_Pivot.factory (:425);
    3. Niche_shelves.factory (:435, :450); ручные Z из _polkstd1hN (:446-448);
    4. cls_veshalo.factory (:459/:466);
    5. Niche_SotShelf.factory (:471); NicheSideBruckHolder.factory (:477);
    6. замена штоков (fix_vb=fix_vb_ds, :484-489);
    7. put_position_and_forma(...) всех ниш (:492-502);
    8. переименование полок (taile_elemname_changer, :506-520);
    9. objects.append(...) (:522-529);
    10. терминалы (TerminalAngle.factory, :531-553);
    11. дверь: self.pivot_niche1 = self.createNiche1(self) (:558).
  • createNiche1 (:89) / SetNiche1 (:59) — проём = полный фронт, Niche_user.StraightNiche, SetSpacing из spacing_calculate.
  • build_aboad :631: proto_id = _get_proto_id(...)UnitMONO(id_prototype=proto_id, inst_data=RSH_Mono())unit.Make()unit.Draw()k3.fixing/k3.holes. main :674 задаёт DATA_PROTO.

cab_duo_two.py — аналогично, shell_cls=shell.ShellPivotDuo, две секции.

3. Подстановки из «цвета» (комплексы номенклатуры)

functions.py. Вход — ccmater (id «цвета», группа 727) из protopars._colorcmmater через get_ccmater (:33-49, CCMaterException при 0). Каждое свойство — priceinfo(ccmater, <property>, default):

  • get_prmater :52"MatId" (ЛДСП корпуса);
  • get_bandtypereal :67"mBandId" (кромка);
  • get_bpmater :189"mHdfId" (ХДФ ЗС);
  • get_bp_connector :204"mHdfCon";
  • get_fix_vb/vbp/vb_skvz/vb_ds :101/:116/:131/:146"ID_FixCS1/1/2/3";
  • get_id_leg :160"mKompl_1", get_id_naves :221"mKompl_2", get_id_fetr_leg :237"mKompl_3", get_fix_podp :174"uFixPODP".

Одна запись «цвета» несёт материал+кромку+ХДФ+соединитель+крепёж+опоры. Thickness берётся у выведенного MatId.

rshcomplect: get_rshcomplect(protopars) :84protopars._rshcomplectRSH_Complect.propbuilder(rsh, rshcomplect) (rsh_common.py:50) заполняет крепёж/аксессуары из свойств записи (uFixMF/uFixKonf/uFixVB…/uFixECK/ uAccHexKey/uAccInstruction/uFixBWMid, tableid=1/2). Вызывается в каждом params_adapter (напр. RSH_Socle.params_adapter:100-101).

4. Что портировано в новую архитектуру

Сущность оракула Наш аналог Статус
ShellPivotMono адаптеры (панели корпуса) corpus.py:build_section_parts (:59) Есть (бит-в-бит 12 панелей при h=2500)
ShellPivotDuo (2 секции, средняя стенка) families/duo.py:build_duo_parts (:102) Частично (ЗС секции — открытый вопрос, corpus.py:100-108)
RSH_Mono.params_adapter + чтение proto mono_controller.py:build_mono_params (:342) Есть
RSH_Duo.params_adapter duo_controller.py Есть
functions.get_prmater/bandtypereal/bpmater nomenclature.py (:28/:39/:49) + ColorComplexMaterialAdapter (mono_controller.py:93) Есть
ShellSocle/RSH_Socle (цоколь) corpus.py ветвь PLINTH (:168-182), _validate_h_cok (:31) Частично (2 планки commode; нет SideLiningP при w>899, shoemaker, опор AccLeggs)
Niche_shelves niches/shelves.py (:51), Fill.SHELVES Есть
NicheVesh/NicheVeshProd niches/hangers.py (:98), Fill.HANGER Частично (отступ штанги — вопрос :107; PartTag.ROD — место, ассет на рендерере)
Niche_Box_Pivot niches/boxes.py (:160), Fill.BOX Частично (рама+места; GroupBox — место BOX_FRONT)
Niche_SotShelf/ShoeShelf/SotKor/Pantograf/BRHolder Нет (Fill.* объявлены в base_types.py:110-114, провайдеров нет)
Дверь (createNiche1+StraightDoor+spacing_calculate) doors.py (:188), FacadeLayout (:142) Есть
Петли hinges.py + renderer_k3._make_hinge (:262) Есть
Тип фасада (Спарта/…, CreateFasad) resolve_facade_type (mono_controller.py:244) + renderer_k3._make_facade Есть-НО: подход _make_facade-shim ОТВЕРГНУТ владельцем — переделать на настоящую дверь
TerminalAngle Нет
Пазы под ЗС (SideLeft/Right Slot) base_types.Cuts (только подрезы) Нет пазов-Slot
Крепёж (минификс/конфирмат/VB/гвозди, RSH_Complect, fix_panel_adapter, AddFixPin) Нет (в Model крепежа нет)
Кромка (наложение) id резолвится (get_bandtypereal) Не накладывается (renderer_k3:163-165 TODO)
Навесы (make_naves) Нет

Итог по отсутствующему: крепёж (весь), пазы под ЗС, кромка (наложение), навесы, угловые терминалы, наполнения обувь/сотовые/пантограф/брючница, боковые/shoemaker-планки цоколя и опоры.

5. Готовые оракульные классы для прямого переиспользования (1:1 в K3)

  1. shell.ShellSocle (shell.py:947) — весь цоколь. ShellSocle.factory(socle_inst=<объект с inst_data.width/depth/h_cok>, is_konf=False).Make(). Входы: inst_data c width, depth, h_cok, sokletype, prmater, bandtypereal, id_leg, fix_mf.
  2. shell.Niche_shelves (:5035) — съёмные полки. factory(shell_inst, positionniche, count, prev_niche, commonpos, pan_name). Нужен shell_inst с адаптерами и inst_data (RSH_Niche).
  3. shell.Niche_Box_Pivot (:5406) — блок ящиков целиком (рама + GroupBox
  4. крепёж). factory(shell_inst, positionniche, count, openside, doubledoor).
  5. shell.NicheVeshProd / NicheVesh (:4748/:4544) — вешала (реальные ассеты rack_long.Rack). factory(shell_inst, positionniche, enable, count).
  6. shell.Niche_SotShelf, NicheSideBruckHolder, NichePantograf (:5865/:4939/:4841) — обувь/брючница/пантограф. В порте их нет — переиспользование напрямую = самый быстрый путь к 1:1.
  7. shell.TerminalAngle (:4179) — угловой терминал.
  8. Детали-панели с пазами/крепежом: details.SideLeft/SideRight (:316/:361) — несут Slot и кромку; entityes.addcomponents.AddFixPin/ AccLeggs/AccHexKey. Вход: unit_inst (RSH) со slotpars, prmater, fix_pin, bandtypereal.
  9. Резолверы номенклатуры: functions.get_* и RSH_Complect.propbuilder. Вход: protopars._colorcmmater, protopars._rshcomplect.

Общий приём для 1:1: любой оракульный *.factory(...) требует «shell-подобный» объект: (а) inst_data (RSH-датакласс, заполняется params_adapter) и (б) классовые адаптеры gab_*/symmetry_*. Минимальный мост — отдать оракулу реальный UnitMONO/ShellPivotMono для деталей, которые Model ещё не покрывает (крепёж, пазы, наполнения, навесы), и оставить Model там, где расхождений нет (панели корпуса, полки, двери, петли).