Hello all,
I am very new to vtk.js and trying to recreate one of the example in react.js. I am getting this error : TypeError: vtiReader.parseAsArrayBuffer is not a function
import 'vtk.js/Sources/Rendering/Profiles/Volume';
import 'vtk.js/Sources/IO/Core/DataAccessHelper/HttpDataAccessHelper';
import vtkFullScreenRenderWindow from 'vtk.js/Sources/Rendering/Misc/FullScreenRenderWindow';
import vtkVolume from 'vtk.js/Sources/Rendering/Core/Volume';
import vtkVolumeMapper from 'vtk.js/Sources/Rendering/Core/VolumeMapper';
import vtkVolumeController from 'vtk.js/Sources/Interaction/UI/VolumeController';
import vtkHttpDataSetReader from 'vtk.js/Sources/IO/Core/HttpDataSetReader';
const View = () => {
const vtkContainerRef = useRef(null);
const context = useRef(null);
function makeRequest(method, url) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.responseType = "blob";
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.statusText,
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText,
});
};
xhr.send();
});
}
useEffect( () => {
if (!context.current) {
const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({
rootContainer : vtkContainerRef.current
});
const createViewer = (res) => {
const vtiReader = vtkHttpDataSetReader.newInstance();
const renderer = fullScreenRenderer.getRenderer();
const renderWindow = fullScreenRenderer.getRenderWindow();
vtiReader.parseAsArrayBuffer(res);
const source = vtiReader.getOutputData(0);
const mapper = vtkVolumeMapper.newInstance();
const actor = vtkVolume.newInstance();
actor.setMapper(mapper);
mapper.setInputData(source);
renderer.addVolume(actor);
const controllerWidget = vtkVolumeController.newInstance({
size : [400, 150], rescaleColorMap: true
});
controllerWidget.setContainer(vtkContainerRef);
controllerWidget.setupContent(renderWindow, actor, true);
fullScreenRenderer.setResizeCallback(({ width, height }) => {
// 2px padding + 2x1px boder + 5px edge = 14
if (width > 414) {
controllerWidget.setSize(400, 150);
} else {
controllerWidget.setSize(width - 14, 150);
}
controllerWidget.render();
});
renderer.resetCamera();
renderWindow.render();
global.pipeline = {
actor,
renderer,
renderWindow,
mapper,
source,
fullScreenRenderer,
};
context.current = {
fullScreenRenderer,
renderWindow,
renderer,
actor,
mapper,
};
};
makeRequest("GET","../head-binary.vti").then((res) => {
const reader = new FileReader();
reader.onload = function onLoad(e) {
createViewer(reader.result);
};
const file = new File([res], "head-binary.vti");
const fileObj = { file, ext: "vti" };
console.log(fileObj);
reader.readAsArrayBuffer(fileObj.file);
})
}
return () => {
if (context.current) {
const { fullScreenRenderer, actor, mapper } = context.current;
actor.delete();
mapper.delete();
fullScreenRenderer.delete();
context.current = null;
}
};
},[])
return (
<div ref={vtkContainerRef}>
View
</div>
)
}
export default View; ```
Please suggest what am i doing wrong...