绘制切片
<p>渲染数据的切片。下面是对代码的详细解释:</p>
<h3>函数签名和参数</h3>
<pre><code>async vtkLoadSlice(data, renderer) {
...
}</code></pre>
<ul>
<li>data: 这是待渲染的数据源,但在函数内部未直接使用,可能用于其他方法或上下文。</li>
<li>renderer: 这是 VTK 的渲染器对象,用于渲染数据。</li>
</ul>
<h3>初始化和配置</h3>
<pre><code>const source = global.RenderVtk.source;</code></pre>
<p>source: 从全局对象 global.RenderVtk 中获取数据源。</p>
<pre><code>let imageSliceSetting = await this.vm.$refs.canvasHeader.getConfig('ImageSlice');</code></pre>
<p>imageSliceSetting: 异步获取图像切片的配置设置。这些配置包括切片的范围、间隔和类型。</p>
<pre><code>let dataExtent = global.RenderVtk.dataExtent;
const dataRange = global.RenderVtk.dataRange;
console.log('获取切片的配置', imageSliceSetting);</code></pre>
<p>dataExtent 和 dataRange: 从全局对象获取数据的范围和扩展值。dataRange 用于确定数据的最小值和最大值。</p>
<pre><code>const colorLevel = 0;
global.RenderVtk.colorLevel = 0;
global.RenderVtk.colorWindow = dataRange[1] / 2;</code></pre>
<ul>
<li>colorLevel: 颜色级别设为 0。</li>
<li>global.RenderVtk.colorLevel 和 global.RenderVtk.colorWindow: 设置全局颜色级别和颜色窗口,这用于调整图像的对比度和亮度。</li>
</ul>
<h3>渲染不同类型的切片</h3>
<p>切片有三种类型:XY、XZ 和 YZ。根据配置中的设置,分别处理这些切片。</p>
<h3>处理 XY 切片</h3>
<pre><code>if (imageSliceSetting.xy.type !== 'none') {
for (let index = imageSliceSetting.xy.range[0]; index &lt; imageSliceSetting.xy.range[1]; index += imageSliceSetting.xy.interval) {
const sliceIndex = index - 1;
await this.setImageSlice(renderer, source, 'setKSlice', sliceIndex, colorLevel, dataRange[1] / 2);
if (imageSliceSetting.xy.type === 'single') {
break;
}
}
}</code></pre>
<ul>
<li>imageSliceSetting.xy.type !== 'none': 检查是否需要渲染 XY 切片。</li>
<li>循环遍历从 imageSliceSetting.xy.range[0] 到 imageSliceSetting.xy.range[1] 的切片索引,按 imageSliceSetting.xy.interval 步长增加。</li>
<li>setImageSlice: 调用此方法来渲染切片,其中 'setKSlice' 表示当前处理的是 XY 切片。</li>
<li>如果 imageSliceSetting.xy.type 为 'single',则仅渲染一个切片并终止循环。</li>
</ul>
<h3>处理 XZ 切片</h3>
<pre><code>if (imageSliceSetting.xz.type !== 'none') {
for (let index = imageSliceSetting.xz.range[0]; index &lt; imageSliceSetting.xz.range[1]; index += imageSliceSetting.xz.interval) {
const sliceIndex = index - 1;
await this.setImageSlice(renderer, source, 'setJSlice', sliceIndex, colorLevel, dataRange[1] / 2);
if (imageSliceSetting.xz.type === 'single') {
break;
}
}
}</code></pre>
<ul>
<li>imageSliceSetting.xz.type !== 'none': 检查是否需要渲染 XZ 切片。</li>
<li>按 imageSliceSetting.xz.range 和 imageSliceSetting.xz.interval 遍历切片,并调用 setImageSlice 渲染 XZ 切片 ('setJSlice')。</li>
</ul>
<h3>处理 YZ 切片</h3>
<pre><code>if (imageSliceSetting.yz.type !== 'none') {
for (let index = imageSliceSetting.yz.range[0]; index &lt; imageSliceSetting.yz.range[1]; index += imageSliceSetting.yz.interval) {
const sliceIndex = index - 1;
await this.setImageSlice(renderer, source, 'setISlice', sliceIndex, colorLevel, dataRange[1] / 2);
if (imageSliceSetting.yz.type === 'single') {
break;
}
}
}</code></pre>
<ul>
<li>imageSliceSetting.yz.type !== 'none': 检查是否需要渲染 YZ 切片。</li>
<li>按 imageSliceSetting.yz.range 和 imageSliceSetting.yz.interval 遍历切片,并调用 setImageSlice 渲染 YZ 切片 ('setISlice')。</li>
</ul>
<h3>调整相机剪裁范围</h3>
<pre><code>renderer.resetCameraClippingRange();</code></pre>
<p>调用 resetCameraClippingRange 方法调整相机的剪裁范围,以确保所有切片都在视野内。这有助于确保渲染效果正常,所有数据都能正确显示。</p>
<h3>总结</h3>
<p>vtkLoadSlice 函数根据配置加载并渲染不同类型的切片(XY、XZ 和 YZ)。它依次获取每种切片的设置,并使用 setImageSlice 方法将这些切片添加到渲染器中。最后,调整相机的剪裁范围以适应所有切片。</p>
<h1>setImageSlice</h1>
<p>setImageSlice 异步函数,用于在 VTK 渲染器中设置和渲染一个图像切片。下面是对这段代码的详细解释:</p>
<p>函数参数</p>
<ol>
<li>renderer: VTK 渲染器对象,用于显示切片。</li>
<li>source: 数据源,用于提供切片数据。</li>
<li>fnType: 指定切片类型的函数(如 'setKSlice'、'setJSlice'、'setISlice')。</li>
<li>index: 切片的索引位置。</li>
<li>colorLevel: 颜色级别,用于调整图像的对比度。</li>
<li>colorWindow: 颜色窗口,控制图像的亮度和对比度。</li>
</ol>
<h3>函数步骤</h3>
<h3>获取 VTK 模块:</h3>
<pre><code>const vtkImageMapper = window.vtk.Rendering.Core.vtkImageMapper;
const vtkImageSlice = window.vtk.Rendering.Core.vtkImageSlice;</code></pre>
<p>从 window.vtk.Rendering.Core 中获取 vtkImageMapper 和 vtkImageSlice 模块,用于映射和显示切片。</p>
<h3>创建和配置 vtkImageSlice 实例:</h3>
<pre><code>const imageActor = vtkImageSlice.newInstance();
global.RenderVtk.actors.push(imageActor);
renderer.addActor(imageActor);</code></pre>
<ul>
<li>vtkImageSlice.newInstance(): 创建一个新的图像切片实例。</li>
<li>将实例添加到全局 global.RenderVtk.actors 数组中,并将其添加到 renderer 中进行渲染。</li>
</ul>
<h3>创建和配置 vtkImageMapper 实例:</h3>
<pre><code>const imageMapper = vtkImageMapper.newInstance();</code></pre>
<p>vtkImageMapper.newInstance(): 创建一个新的图像映射器实例,用于将数据源映射到切片上。</p>
<h3>获取数据范围和配置:</h3>
<pre><code>const dataArray = source.getPointData().getScalars() || source.getPointData().getArrays()[0];
const dataRange = dataArray.getRange();
const config = global.RenderVtk.config;</code></pre>
<p>获取数据范围 (dataRange) 和配置 (config),其中 dataRange 用于颜色映射的范围。</p>
<h3>创建颜色传递函数 (vtkColorTransferFunction):</h3>
<pre><code>const vtkColorTransferFunction = window.vtk.Rendering.Core.vtkColorTransferFunction;
const lookupTable = vtkColorTransferFunction.newInstance();</code></pre>
<p>vtkColorTransferFunction.newInstance(): 创建颜色传递函数实例,用于定义数据值到颜色的映射。</p>
<h3>配置颜色传递函数:</h3>
<pre><code>const rangeBase = (dataRange[1] - dataRange[0]) / (config.color.length - 1);
for (let i = 0; i &lt; config.color.length; i++) {
const { r, g, b } = d3.rgb(config.color[i]);
lookupTable.addRGBPoint(dataRange[0] + rangeBase * i, r / 255, g / 255, b / 255);
}</code></pre>
<ul>
<li>计算颜色值的范围基数 (rangeBase)。</li>
<li>遍历配置的颜色数组,使用 d3.rgb 转换颜色并添加到颜色传递函数 (lookupTable) 中。</li>
</ul>
<h3>配置映射器和切片:</h3>
<pre><code>imageMapper.setInputData(source);
imageMapper[fnType](index);
imageActor.setMapper(imageMapper);
imageActor.getProperty().setRGBTransferFunction(0, lookupTable);
imageActor.getProperty().setColorLevel(colorWindow);
imageActor.getProperty().setColorWindow(colorWindow);
imageActor.getProperty().setOpacity(0.7);
imageActor.getProperty().setInterpolationTypeToLinear();</code></pre>
<ul>
<li>将数据源设置到映射器中。</li>
<li>使用 fnType 方法设置切片索引。</li>
<li>配置 imageActor 的映射器、颜色传递函数、颜色级别和窗口、透明度等属性。</li>
<li>设置插值类型为线性 (setInterpolationTypeToLinear)。</li>
</ul>
<h3>调用 renderSliceData 渲染切片数据:</h3>
<pre><code>
await this.renderSliceData(renderer, fnType, index, imageActor, dataRange);</code></pre>
<p>异步调用 renderSliceData 函数,传递渲染器、切片函数类型、索引、图像演员和数据范围,进行最终渲染。</p>
<h3>总结</h3>
<p>setImageSlice 函数创建并配置 vtkImageSlice 和 vtkImageMapper 实例,设置颜色传递函数,配置图像演员的属性,然后通过 renderSliceData 渲染切片数据。此函数确保切片正确显示在渲染器中,并根据数据范围和配置调整颜色映射。</p>