function mesh_refiner(dom, varargin) %MESH_REFINER Interactive refinement figure for a surfacemesh. % MESH_REFINER(DOM) opens a figure that renders the surfacemesh DOM and shows % a slider that refines it interactively. MESH_REFINER(DOM, 'MaxLevel', L) % sets the maximum refinement level (default 3). % % This holds all the wiring: it loads the prebuilt figure app, sends the mesh % to it (script -> figure), and refines the mesh whenever the slider in the % figure asks for a new level (figure -> script). The end-user script only % has to build a domain and call this. maxLevel = 3; for i = 1:2:numel(varargin) - 1 if strcmpi(varargin{i}, 'MaxLevel') maxLevel = varargin{i + 1}; end end % The figure app is the prebuilt single-file page, relative to the project root % (the current working directory when a top-level script is run). html = fileread(fullfile('app', 'dist', 'index.html')); fig = figure; gl = uigridlayout(fig, [1 1], 'Padding', [0 0 0 0], ... 'RowHeight', {'1x'}, 'ColumnWidth', {'1x'}); uihtml(gl, 'HTMLSource', html, 'Data', mesh_to_data(dom, 0, maxLevel), ... 'HTMLEventReceivedFcn', @(src, ev) on_refine(src, ev, dom, maxLevel)); end function on_refine(src, ev, dom0, maxLevel) % Slider in the figure -> refine the base mesh to the requested level and send % the new patches back to the figure. if ~strcmp(ev.HTMLEventName, 'refine') return end level = max(0, min(maxLevel, round(ev.HTMLEventData))); if level == 0 dom = dom0; else dom = refine(dom0, level); end sendEventToHTMLSource(src, 'mesh', mesh_to_data(dom, level, maxLevel)); end function data = mesh_to_data(dom, level, maxLevel) % Pack a surfacemesh into a plain struct the figure app can render: one flat % (column-major) x/y/z array per patch, each an n-by-n grid. real() drops any % all-zero imaginary part the solver may carry. np = length(dom); px = cell(1, np); py = cell(1, np); pz = cell(1, np); for k = 1:np px{k} = real(dom.x{k}(:).'); py{k} = real(dom.y{k}(:).'); pz{k} = real(dom.z{k}(:).'); end data = struct(); data.n = size(dom.x{1}, 1); data.x = px; data.y = py; data.z = pz; data.npatches = np; data.level = level; data.maxLevel = maxLevel; end