LeroyProtoLIB — инвентарь модулей ядра¶
Раздел 4c документации LeroyProtoLIB (см.
01-families-map.md). Составлен агентом-документатором 2026-07-24 на основе модульных докстрингов и TODO(АУДИТ), добавленных в правках (коммитaed3be70). Ссылки —файл:строкаПОСЛЕ правок.
Ядро библиотеки — пять модулей, на которые опираются все cab_* и family
boad.py: piv_param_nichenumber_utilites (посекционные параметры ниш),
functions (резолв материалов/крепежа из «цвета»), details (детали корпуса),
based_shell/shell (новое поколение корпуса), url_data_reader (загрузка заказа).
1. piv_param_nichenumber_utilites.py — посекционные параметры ниш¶
Роль. Механизм ПОСЕКЦИОННЫХ параметров: прототипы РШ хранят параметры каждой
секции в атрибутах с числовым суффиксом = номер ниши (_fasrtype1, fsmater2,
_openside3, _doubledoor1, _blockbox2, _polkstd3h{i}, …). Ниши
нумеруются СПРАВА НАЛЕВО. Базовый примитив — get_param_from_nichenumber.
| Функция/класс | Строка | Назначение |
|---|---|---|
get_param_from_nichenumber(inst, name_param, index) |
55 |
читает getattr(inst, f"{name_param}{index}"), нет атрибута → 0 (не исключение). База всего механизма. |
read_fas_code(goods_id) |
84 |
строковый код записи типа фасада. |
get_fasrtype_from_box(inst, num_niche, hfas) |
98 |
тип фасада ЯЩИКА по высоте фасада (селектор по словарю высот из свойства uposition1). |
get_fasrtype(inst, num_niche) |
140 |
тип фасада распашной двери в нише N (резолв записи-селектора: uParsLogic → uFasFromDoorType). |
FacadeParameters |
168 |
агрегат всех параметров фасада ниши N: материал fsmater, кромка fas_bandtype, тип fasrtype, сторона openside, двудверность doubledoor, отделки decofsmatc. |
determine_hinge_type(inst, fp) |
274 |
уточнить накладная/полунакладная петля по свойству uHinge4Type и свесам (Hinge4Type/HingeSpaceType). Пишет в fp. |
setNicheFasFromIndex(inst, num_niche, nums_fas) |
333 |
центральная процедура: собрать FacadeParameters, записать фасад в нишу (SetFasType/SetFasMater/SetOpen/SetFasDir/SetFasBand), петли (determine_hinge_type), ручку (SetHandle), отделки фасадов в Scratch/pickle. |
SpacingDoor |
470 |
габ-агрегат зазоров створок: fullside, halpside (полунакладная), top, bot, doublespacing. |
spacing_calculate(inst, countfas, bot, top) |
485 |
целочисленная ширина фасада → SpacingDoor. |
Как зовётся. В Make/create*Niche сначала считается список номеров
физических фасадов nums_fas (учёт двудверности/ящиков), затем
setNicheFasFromIndex(inst, num_niche, nums_fas=nums_fas) (см. 01 §5).
2. functions.py — резолв номенклатуры из «цвета»¶
Роль. Паттерн Адаптер: одна запись «цвета» ccmater (группа 727) несёт
материал + кромку + ХДФ + соединитель + крепёж + опоры + комплект РШ. Каждое
свойство — priceinfo(ccmater, <property>, default). Вход — ccmater из
protopars._colorcmmater через get_ccmater.
| Функция | Свойство | Назначение |
|---|---|---|
get_ccmater(protopars) :39 |
protopars._colorcmmater |
ID «цвета» (бросает ColorcmmaterException при 0); вход для всех ниже. |
get_prmater :58 |
MatId |
ЛДСП корпуса |
get_bandtypereal :73 |
mBandId |
кромка корпуса |
get_rshcomplect(protopars) :90 |
protopars._rshcomplect |
ID записи комплекса крепежа → RSH_Complect.propbuilder |
get_fix_vb :107 / get_fix_vbp :122 / get_fix_vb_skvz :142 / get_fix_vb_ds :157 |
ID_FixCS1 / ID_FixCS1 / ID_FixCS2 / ID_FixCS3 |
VB-крепёж (шток/перфорация/сквозной/длинный) |
get_id_leg :172 / get_id_naves :235 / get_id_fetr_leg :251 |
mKompl_1 / mKompl_2 / mKompl_3 |
опора / навес / опора-ножка |
get_fix_podp :188 |
uFixPODP |
крепёж поддона |
get_bpmater :203 |
mHdfId |
ХДФ задней стенки |
get_bp_connector :218 |
mHdfCon |
соединитель ХДФ |
make_naves(...) :343 |
— | поднимается по parent до rsh_shell.id_naves, ставит левый/правый навес |
add_bands :266 / add_bands_wrap :289 |
— | кромкование панели / декоратор factory детали |
divide_max_size(size, max_size=600) :324 |
— | разбиение размера ≤600 (для ЗС) |
Утилиты кромкования: add_bands / add_bands_wrap (декоратор для
factory деталей), divide_max_size (разбиение размера).
3. details.py — каталог деталей корпуса (66 классов)¶
Роль. Каждый класс — одна деталь (боковина, крышка, дно, полка, задняя
стенка, цоколь, стенка жёсткости, мягкие элементы) с classmethod factory(),
который задаёт имя, UnitCode, MajorPlace, материал, кромки (декоратор
add_bands_wrap) и крепёж/пазы. Габариты и позиция здесь не вычисляются —
их назначает корпус через адаптеры BasedShellPanel.set_* +
put_position_and_forma().
Группы по префиксам:
- Side* — панели корпуса (Left/Right/Top/Down/Shelf/Horis/Lining/Cokle);
суффиксы: CMF — минификс, Dn — накладное дно, Slot — с пазом под ЗС,
Hid — обувница (скрытая), VB — VB-крепёж, GK — гардеробная, SU —
санузел, DS — дверная система.
- Wall* — стенки (царга, панели на стену, задние).
- BackWall* — задние стенки (BackSideSU_Flipper, BackWallsMaxsize в
services.py — режет ≤600); особые: BackwallConnector — профиль-соединитель
ХДФ, BackWallHandle — аксессуар-ручка ЗС.
- Dobor* — доборы; Soft* — мягкие сиденья/валики; *Terminal — терминал.
Кто ставит пазы под ЗС. Сама деталь в factory:
details.py SideLeft/SideRight → Panel.Slot(); slot.SetSlot(planeA, side,
stype, cps=slotpars._depthbp, cpd=slotpars._incutbp, cpw=slotpars._h_dvp);
panel.AddSlot(slot) (см. 02 §3).
4. based_shell/shell.py — новое поколение корпуса (ShellBased)¶
Роль. «Базовый корпус Парамкаталога» (точка входа P_based_shell.py).
Универсальный корпус, который используют все семейства-подпакеты
(pedestal/commode/shoemaker/antresol/bathroom). Импортирует примитивы из корневого
shell.py, добавляет свой датакласс параметров и свои адаптеры.
| Класс | Строка | Назначение |
|---|---|---|
RSH_ShellBased(RSH, metaclass=field_property_support) |
52 |
данные корпуса: секции (wpos1/wpos2, w_small), материалы, крепёж fix_*, slotpars; params_adapter читает protopars. |
ShellBased(Shell) |
332 |
корпус: набор classmethod-адаптеров (gab_panel_adapter, symmetry_pan_position_adapter, gab_niche_adapter, fix_panel_adapter…), Make собирает панели + ниши. |
factory(unit_inst=..., default_name_proto="__Базовый корпус Парамкаталога") —
стандартный вызов из family boad.py.
5. url_data_reader.py — загрузка заказа из веб-конфигуратора¶
Роль. Конвейер main(): код заказа → URL генератора JSON → get_url_data
парсит → по data["Program"] (raspash|wardrobe|doors|kupe) сценарий расстановки
(шкафы справа налево, антресоли над шкафами, предметы над комодами) → каждый
предмет cab_order_produce по proto_id из словаря CabLib берёт
DPROTOID_NNN, заполняет атрибуты из JSON (set_items_cab_class) и создаёт
прототип k3.protoobj.
| Сущность | Строка | Назначение |
|---|---|---|
get_url_data(url) |
294 |
чтение/парс JSON (с восстановлением битого через _repair_broken_json 323). |
read_URL(ordercod) |
428 |
код → URL через url_k3_json_factory 401 → JSON. |
OrderINFO |
475 |
агрегат заказа; order_info_changer 503. |
Wardrobes / WardrobePosition |
498 / 649 |
список предметов / позиция шкафа. |
is_wardrobe_base_items / is_antresole / is_comode / is_midle_item / is_pan_soft |
676/700/724/712/736 |
классификация предмета по proto_id. |
calculate_wardrobe_position / calculate_antresole_position / calculate_midle_item_position |
763/801/779 |
координаты расстановки. |
cab_order_produce(...) |
891 |
создать предмет: подобрать DPROTOID_NNN, set_items_cab_class 967, k3.protoobj. При несоответствии идентификаторов (K3Error) — регенерация модуля. |
set_items_cab_class(data, orderinfo, current_cab) |
967 |
заполнить атрибуты датакласса из JSON. |
update_protoparams_minvalue(protoid, b) |
1773 |
зажать значения JSON в границы MinValue/MaxValue свойств. |
validate_data_proc(data, protoid) |
1703 |
подменить нулевые материалы на DefValue из БД. |
main(data) |
1194 |
точка входа конвейера. |
Требует requests (ставится в Proto/site-packages).
TODO(АУДИТ) в модулях ядра (потенциальные баги, помечены в коде)¶
Полный реестр TODO(АУДИТ) по всей библиотеке — в
04b-inventory-shell.md§ «TODO(АУДИТ)» и ниже. Здесь — относящиеся к ядру.
shell.py (см. 04b §«TODO(АУДИТ)», 10 пунктов)¶
329RSH_ShellGS:hpolkdp{i}умножается сам на себя (квадрат; ожидалось* ishpolkdp{i}) — вероятный баг.337RSH_ShellGS:prmater/bandtyperealв цикле поi(не зависят отi).389RSH_ShellPivot:h_cokобъявлен дважды, второе затирает первое.434,724:slotpars: RSH_Slot = RSH_Slot()— mutable default (общий экземпляр на все объекты dataclass).442,732: опечаткаDict[int.int](→Dict[int, int]); не падает из-заfrom __future__ import annotations.901ExtWidth.check (и ExtHeight/ExtDepth): аннотация-> bool, при успехе возвращаетNone.1599ShellMINI.gab_panel_adapter (BackWallLarge):lengthне используется; приh_small_int_d==0длина ЗС занижена (в ShellDUO стоитlength=length).2753ShellDUO.symmetry_pan_position_adapter:any([_isp(SideDown), _isp(SideTopWithEck)])— вероятноSideDownWithEck; условие мёртвое.2868WallStrong/BOTTOM:h_cok + + h_dsp— двойной плюс (остаток правки).
functions.py¶
get_fix_vbp(:122): тело полностью совпадает сget_fix_vb(то же свойствоID_FixCS1). Уточнить: отдельный ключ (ID_FixCS1P?) или дубликат намеренный.get_id_leg(:172) и др.: аргументdefaultобъявлен, но не используется — вpriceinfoпередан литерал0(то же вget_fix_podp/get_bpmater/get_bp_connector/get_id_naves/get_id_fetr_leg).make_naves(:343): если ни у одного родителя нетrsh_shell/inst_data.id_naves, циклwhile not id_navesбезусловногоbreakне имеет — возможно зависание.
based_shell/shell.py¶
- недостижимый
return pointниже — мёртвый код. - заглушка: всегда возвращает пустой
Gabs(); хелпер_ispне … - метод не вызывается из
Make()(там только*_1и*_2).
details.py¶
:1«Main details…» — строка стоит после импортов: это не докстринг модуля, а безвредный строковый литерал; настоящий докстринг добавлен в начало файла (NOTE, не баг).
cab_* (точки входа)¶
cab_duo_two.py:is_vesh_large— сеттер без …; метод определён в классе ДВАЖДЫ; ветки используют разные атрибуты (_bandtypevs …);range(1,4)пишет ТипФас1..3, но при двух двойных дверях — несоответствие; не читаетсяid_naves(в отличие от MONO).cab_duo_three.py: класс/DOUBLESPACING/spacing_calculateзатеняют импортированные; нетk3.fixing/k3.holes(в отличие от DUO-2) — намеренно?;range(1,3)пишет ТипФас1..2, а фасадов у DUO-3 три.cab_duo_four.py:num_nicheперезатирается единицей; до 4 фасадов, а слотов ТипФас — 3 (range(1,4)).cab_pivot_mono.py: getter читает_dveshlarge_1, setter пишет_dveshlarge;params_adapterпишетinst_data.openside1, а здесь …; передtryнетskf = None— еслиbuild_aboadупадёт, … .cab_mono_two.py:main()не возвращает построенный объект (в отличие от соседей).
family boad.py (дубли вынесены в общий модуль — кандидат на рефакторинг)¶
pedestal_pivot_duo/boad.py:SetBoxNiche/createBoxNicheзакомментированы (мёртвый код);num_nicheигнорируется; дословные дубли вpedestal_pivot_mono/duo_top;Draw/DrawUnit/PostDraw/_Assign*— дубль всех семейств; условие проверяет_blockbox1(не_blockbox2); хвостguid/fixing/holes/selbyattr— дословный повтор.pedestal_pivot_duo_top/boad.py: суффикс «_top» из кода не выводится; дословные копииSetNiche1/2изpedestal_pivot_duo;num_nicheигнорируется.commode_pivot_mono/boad.py:SetBoxNiche— почти дословный дубль;build_aboadне используется; мёртвая функция;Draw/_Assign*и свойстваdoortype/fsmater1— дубли всех семейств; хвостguid/fixing/holes/selbyattr.
antresol / bathroom¶
antresol_pivot_duo/antresol_duo_three.py:set_calculatе_shell_wpos1присваивается функция вместо вызова.antresol_pivot_trio/limits.py:LimitSize_PIVOT_DUO4объявлен и здесь, и вantresol_pivot_duo/limits.py— дубль.bathroom/dnboads/cokle_utils.py: модуль нигде не импортируется.bathroom/dnboads/common_boad.py: в заголовке ранее значилось «Распашной DUO» — по коду это MONO; NameError — имяccmaterвmake_shellне определено (скопировано изparams_adapter).bathroom/dnboads/mono_two.py:build_aboadНЕ передаёт … (в отличие отtpboads/mono_two.py).bathroom/dobor_handler.py: файлыbathroom/__init__,pyиbathroom/dnboads/__init__,pyназваны …old_modules/*(antresol): кандидаты на удаление — нигде не импортируются; актуальный корпус —based_shell/shell.py(ShellBased).
Связанные документы: 01-families-map (карта семейств, посекционные
параметры §5), 02-niche-door-facade-chain (кто ставит крепёж/пазы/кромку),
03-shell-socle-params-port (таблица «оракул→порт→статус» §4), 04a (url_entityes
+ tests), 04b (shell.py + 10 TODO(АУДИТ)).