Skip to content

Commit 434ef04

Browse files
committed
fix: vtk issues
1 parent bf1e0b5 commit 434ef04

File tree

1 file changed

+55
-27
lines changed

1 file changed

+55
-27
lines changed

src/visualization/vtkSolutionScript.js

Lines changed: 55 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,41 @@
77
* ════════════════════════════════════════════════════════════════
88
*/
99

10-
import vtkActor from "@kitware/vtk.js/Rendering/Core/Actor";
11-
import vtkColorTransferFunction from "@kitware/vtk.js/Rendering/Core/ColorTransferFunction";
12-
import vtkColorMaps from "@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps";
13-
import vtkDataArray from "@kitware/vtk.js/Common/Core/DataArray";
14-
import vtkImageData from "@kitware/vtk.js/Common/DataModel/ImageData";
15-
import vtkImageMarchingSquares from "@kitware/vtk.js/Filters/General/ImageMarchingSquares";
16-
import vtkGenericRenderWindow from "@kitware/vtk.js/Rendering/Misc/GenericRenderWindow";
17-
import vtkMapper from "@kitware/vtk.js/Rendering/Core/Mapper";
18-
import vtkPolyData from "@kitware/vtk.js/Common/DataModel/PolyData";
19-
import vtkScalarBarActor from "@kitware/vtk.js/Rendering/Core/ScalarBarActor";
10+
let _vtkModules = null;
11+
12+
async function loadVtkModules() {
13+
if (_vtkModules) return _vtkModules;
14+
await import("@kitware/vtk.js/Rendering/Profiles/Geometry");
15+
const [
16+
{ default: vtkActor },
17+
{ default: vtkColorTransferFunction },
18+
{ default: vtkColorMaps },
19+
{ default: vtkDataArray },
20+
{ default: vtkImageData },
21+
{ default: vtkImageMarchingSquares },
22+
{ default: vtkGenericRenderWindow },
23+
{ default: vtkMapper },
24+
{ default: vtkPolyData },
25+
{ default: vtkScalarBarActor },
26+
] = await Promise.all([
27+
import("@kitware/vtk.js/Rendering/Core/Actor"),
28+
import("@kitware/vtk.js/Rendering/Core/ColorTransferFunction"),
29+
import("@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps"),
30+
import("@kitware/vtk.js/Common/Core/DataArray"),
31+
import("@kitware/vtk.js/Common/DataModel/ImageData"),
32+
import("@kitware/vtk.js/Filters/General/ImageMarchingSquares"),
33+
import("@kitware/vtk.js/Rendering/Misc/GenericRenderWindow"),
34+
import("@kitware/vtk.js/Rendering/Core/Mapper"),
35+
import("@kitware/vtk.js/Common/DataModel/PolyData"),
36+
import("@kitware/vtk.js/Rendering/Core/ScalarBarActor"),
37+
]);
38+
_vtkModules = {
39+
vtkActor, vtkColorTransferFunction, vtkColorMaps, vtkDataArray,
40+
vtkImageData, vtkImageMarchingSquares, vtkGenericRenderWindow,
41+
vtkMapper, vtkPolyData, vtkScalarBarActor,
42+
};
43+
return _vtkModules;
44+
}
2045

2146
import {
2247
prepareMesh,
@@ -47,35 +72,35 @@ export function createContourLineOptions(options = {}) {
4772
};
4873
}
4974

50-
export function plotSolution(model, result, plotType, plotDivId, renderOptions = {}) {
75+
export async function plotSolution(model, result, plotType, plotDivId, renderOptions = {}) {
5176
console.time("plottingTime");
5277

5378
const meshDimension = model.meshConfig.meshDimension;
5479
const meshData = prepareMesh(model.meshConfig);
55-
const vtkData = transformSolverOutputToVtkData(model, result, meshData, {
80+
const vtkData = await transformSolverOutputToVtkData(model, result, meshData, {
5681
mode: meshDimension === "1D" && plotType === "line" ? "line" : "surface",
5782
});
5883

59-
renderVtkScene(vtkData, plotDivId, model.solverConfig, plotType, renderOptions);
84+
await renderVtkScene(vtkData, plotDivId, model.solverConfig, plotType, renderOptions);
6085
console.timeEnd("plottingTime");
6186
}
6287

63-
export function plotInterpolatedSolution(model, result, plotType, plotDivId, renderOptions = {}) {
88+
export async function plotInterpolatedSolution(model, result, plotType, plotDivId, renderOptions = {}) {
6489
console.time("plottingTime");
6590

6691
if (model.meshConfig.meshDimension !== "2D" || plotType !== "contour") {
67-
plotSolution(model, result, plotType, plotDivId, renderOptions);
92+
await plotSolution(model, result, plotType, plotDivId, renderOptions);
6893
console.timeEnd("plottingTime");
6994
return;
7095
}
7196

7297
const meshData = prepareMesh(model.meshConfig);
73-
const interpolatedVtkData = buildInterpolatedVtkData(model, result, meshData);
74-
renderVtkScene(interpolatedVtkData, plotDivId, model.solverConfig, `${plotType}-interpolated`, renderOptions);
98+
const interpolatedVtkData = await buildInterpolatedVtkData(model, result, meshData);
99+
await renderVtkScene(interpolatedVtkData, plotDivId, model.solverConfig, `${plotType}-interpolated`, renderOptions);
75100
console.timeEnd("plottingTime");
76101
}
77102

78-
export function transformSolverOutputToVtkData(model, result, meshData = null, options = {}) {
103+
export async function transformSolverOutputToVtkData(model, result, meshData = null, options = {}) {
79104
const preparedMesh = meshData ?? prepareMesh(model.meshConfig);
80105
const { nodesXCoordinates, nodesYCoordinates } = result.nodesCoordinates;
81106
const solutionArray = extractScalarSolution(result.solutionVector, nodesXCoordinates.length);
@@ -87,7 +112,7 @@ export function transformSolverOutputToVtkData(model, result, meshData = null, o
87112
? buildLineCellsFromPoints(nodesXCoordinates.length)
88113
: buildCellArrayFromNop(preparedMesh.nop ?? []);
89114

90-
const polyData = buildPolyData(points, solutionArray, cells, mode);
115+
const polyData = await buildPolyData(points, solutionArray, cells, mode);
91116

92117
return {
93118
points,
@@ -104,8 +129,8 @@ export function transformSolverOutputToVtkData(model, result, meshData = null, o
104129
};
105130
}
106131

107-
export function transformSolverOutputToVTP(model, result, meshData = null, options = {}) {
108-
const vtkData = transformSolverOutputToVtkData(model, result, meshData, options);
132+
export async function transformSolverOutputToVTP(model, result, meshData = null, options = {}) {
133+
const vtkData = await transformSolverOutputToVtkData(model, result, meshData, options);
109134
return buildVTPString(vtkData);
110135
}
111136

@@ -129,11 +154,12 @@ export function transformSolverOutputToMLBuffers(result) {
129154
};
130155
}
131156

132-
function renderVtkScene(vtkData, plotDivId, solverConfig, plotType, renderOptions = {}) {
157+
async function renderVtkScene(vtkData, plotDivId, solverConfig, plotType, renderOptions = {}) {
133158
if (typeof document === "undefined") {
134159
errorLog("vtk.js visualization requires a browser environment");
135160
return;
136161
}
162+
const { vtkActor, vtkColorTransferFunction, vtkColorMaps, vtkGenericRenderWindow, vtkMapper, vtkScalarBarActor } = await loadVtkModules();
137163

138164
const container = document.getElementById(plotDivId);
139165
if (!container) {
@@ -191,7 +217,7 @@ function renderVtkScene(vtkData, plotDivId, solverConfig, plotType, renderOption
191217

192218
const contourLines = createContourLineOptions(renderOptions.contourLines ?? { enabled: false });
193219
if (contourLines.enabled && vtkData.mode !== "line") {
194-
addContourLinesToRenderer(renderer, vtkData, scalarRange, contourLines);
220+
await addContourLinesToRenderer(renderer, vtkData, scalarRange, contourLines);
195221
}
196222

197223
renderer.resetCamera();
@@ -200,11 +226,12 @@ function renderVtkScene(vtkData, plotDivId, solverConfig, plotType, renderOption
200226
container.title = `${plotType} plot - ${solverConfig}`;
201227
}
202228

203-
function addContourLinesToRenderer(renderer, vtkData, scalarRange, contourOptions) {
229+
async function addContourLinesToRenderer(renderer, vtkData, scalarRange, contourOptions) {
204230
const gridMeta = vtkData.metadata?.interpolationGrid;
205231
if (!gridMeta) {
206232
return;
207233
}
234+
const { vtkActor, vtkDataArray, vtkImageData, vtkImageMarchingSquares, vtkMapper } = await loadVtkModules();
208235

209236
const imageData = vtkImageData.newInstance();
210237
imageData.setDimensions(gridMeta.nx, gridMeta.ny, 1);
@@ -259,7 +286,8 @@ function reverseColorMapPreset(preset, reverse) {
259286
return { ...preset, RGBPoints: reversed };
260287
}
261288

262-
function buildPolyData(points, scalars, cells, mode = "surface") {
289+
async function buildPolyData(points, scalars, cells, mode = "surface") {
290+
const { vtkPolyData, vtkDataArray } = await loadVtkModules();
263291
const polyData = vtkPolyData.newInstance();
264292
polyData.getPoints().setData(points, 3);
265293
if (cells.length > 0) {
@@ -422,7 +450,7 @@ function buildVTPString(vtkData) {
422450
].join("\n");
423451
}
424452

425-
function buildInterpolatedVtkData(model, result, meshData) {
453+
async function buildInterpolatedVtkData(model, result, meshData) {
426454
const { nodesXCoordinates, nodesYCoordinates } = result.nodesCoordinates;
427455
const basisFunctions = new BasisFunctions({
428456
meshDimension: model.meshConfig.meshDimension,
@@ -527,7 +555,7 @@ function buildInterpolatedVtkData(model, result, meshData) {
527555

528556
const points = buildPointsArray(visNodeXCoordinates, visNodeYCoordinates);
529557
const cells = buildStructuredGridCells(visNodesX, visNodesY, insideMask);
530-
const polyData = buildPolyData(points, visSolution, cells, "surface");
558+
const polyData = await buildPolyData(points, visSolution, cells, "surface");
531559

532560
return {
533561
points,

0 commit comments

Comments
 (0)