Моделирование насос-форсунки EUI
Автор
# =============================================================================
# ui_builder.jl — Сборка и отрисовка панели
# =============================================================================
using Engee
function build_and_display_ui(data; uid::Union{String,Nothing} = nothing)
# Если uid не передан, генерируем новый через Base.time()
uid === nothing && (uid = string(trunc(Int, Base.time() * 1000)))
js_angles = string(data.clean_angles)
js_disp = string(data.initial_disp_mm)
js_raw_angles = string(data.raw_angles)
js_raw_disp = string(data.raw_disp .* 1e3)
sliders = build_slider_grid(
data.clean_angles[1:N_SLIDERS],
data.initial_disp_mm[1:N_SLIDERS],
uid,
)
js = replace(RAW_JS_TEMPLATE,
"JS_MATH_BLOCK_SUBSTITUTION" => get_js_math_block())
js = replace(js,
"JS_LOGIC_BLOCK_SUBSTITUTION" => get_js_logic_block())
html = RAW_HTML_TEMPLATE * js
html = replace(html, "UID_PLACEHOLDER" => uid)
html = replace(html, "SLIDERS_GRID_PLACEHOLDER" => sliders)
html = replace(html, "RBASE_INIT_PLACEHOLDER" => string(Int(R_BASE * 1000)))
html = replace(html, "R_ROLLER_VAL" => string(R_ROLLER))
html = replace(html, "OFFSET_VAL" => string(OFFSET))
html = replace(html, "ANGLES_ARR_VAL" => js_angles)
html = replace(html, "DISP_ARR_VAL" => js_disp)
html = replace(html, "RAW_FILE_ANGLES_ARR" => js_raw_angles)
html = replace(html, "RAW_FILE_DISP_ARR" => js_raw_disp)
# Экранируем HTML для безопасной вставки в атрибут srcdoc
escaped_html = replace(html, "\"" => """)
# Формируем iframe с разрешением на выполнение скриптов
# Высота 900px выбрана с запасом для размещения слайдеров и графиков
iframe_html = """
<iframe
srcdoc="$escaped_html"
width="100%"
height="900px"
style="border: none; overflow: hidden; border-radius: 6px;"
sandbox="allow-scripts allow-same-origin">
</iframe>
"""
display("text/html", iframe_html)
println("✔ UI построен (uid=$uid)")
return nothing
end