<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Volvicon Blog</title>
        <link>https://help.volvicon.com/blog</link>
        <description>Volvicon Blog</description>
        <lastBuildDate>Wed, 18 Feb 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Automated Wall Thickness Analysis in Volvicon: From Segmentation to Results]]></title>
            <link>https://help.volvicon.com/blog/automated-wall-thickness-analysis-workflow</link>
            <guid>https://help.volvicon.com/blog/automated-wall-thickness-analysis-workflow</guid>
            <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A step-by-step walkthrough of Volvicon's automated wall thickness analysis pipeline — covering threshold segmentation, surface generation, ray-casting analysis, and statistical result export via the Python Scripting API.]]></description>
            <content:encoded><![CDATA[<p>Wall thickness is one of the most directly actionable measurements in volumetric CT analysis. Whether assessing compliance with geometric tolerances, identifying thin-wall failure risks in a casting, or validating a printed polymer part against a nominal CAD model, the underlying measurement task is the same: determine the shortest material distance from every point on the outer surface to the opposing inner boundary. This post demonstrates how to automate the complete pipeline in Volvicon — from raw volume data through to a statistical report — using the Python Scripting API.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://help.volvicon.com/blog/automated-wall-thickness-analysis-workflow#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>The workflow consists of four stages:</p>
<ol>
<li class=""><strong>Threshold segmentation</strong>: Extract the material region from the volumetric grayscale data as a binary mask.</li>
<li class=""><strong>Surface generation and cleanup</strong>: Convert the mask to a triangle mesh surface, apply remeshing and geometric repairs.</li>
<li class=""><strong>Wall thickness analysis</strong>: Run the ray-casting analysis on the surface to compute per-vertex thickness values.</li>
<li class=""><strong>Results export and visualisation</strong>: Write statistics to disk and configure colour-mapped display.</li>
</ol>
<p>This pipeline is well-suited to batch processing scenarios — for instance, comparing wall thickness distributions across multiple production parts scanned in the same session.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="threshold-segmentation">Threshold Segmentation<a href="https://help.volvicon.com/blog/automated-wall-thickness-analysis-workflow#threshold-segmentation" class="hash-link" aria-label="Direct link to Threshold Segmentation" title="Direct link to Threshold Segmentation" translate="no">​</a></h2>
<p>The first step isolates the material from the background by applying an intensity threshold to the grayscale volume. The segmentation quality at this stage directly affects the accuracy of the subsequent surface and therefore the wall thickness values. Thresholds that include background noise will inflate surface area and generate erroneous thin-wall regions at the part boundary.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">threshold_params </span><span class="token operator">=</span><span class="token plain"> api</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ThresholdParams</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">threshold_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">lower_threshold </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">31724.617</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">threshold_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">upper_threshold </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">65156</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">threshold_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">fill_cavities </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">threshold_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">filter_regions </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">threshold_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">keep_largest </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">True</span><br></span></code></pre></div></div>
<p>Key parameter choices:</p>
<ul>
<li class=""><strong><code>fill_cavities</code></strong>: Fills enclosed interior voids in the binary mask, ensuring the segmented object represents the full material region rather than a hollow shell. Disable this only if interior void geometry is relevant to the analysis.</li>
<li class=""><strong><code>keep_largest</code></strong>: Retains only the largest connected component, discarding small background fragments or debris that fall within the threshold range.</li>
<li class=""><strong><code>filter_regions</code></strong>: Removes disconnected region noise below a minimum size.</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Threshold selection</div><div class="admonitionContent_BuS1"><p>If the volume has been reconstructed from cone beam CT projections, beam hardening artefacts may produce a non-uniform intensity distribution across the part. In this case, a fixed global threshold may be insufficient. Consider cropping the volume to the region of interest or applying a beam hardening correction before segmentation.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="surface-generation-and-cleanup">Surface Generation and Cleanup<a href="https://help.volvicon.com/blog/automated-wall-thickness-analysis-workflow#surface-generation-and-cleanup" class="hash-link" aria-label="Direct link to Surface Generation and Cleanup" title="Direct link to Surface Generation and Cleanup" translate="no">​</a></h2>
<p>Once the mask is created, it is converted to a triangle mesh surface for analysis:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">mask_to_surface_params </span><span class="token operator">=</span><span class="token plain"> api</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">MaskToSurfaceParams</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">mask_to_surface_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">resolution_reduction </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">mask_to_surface_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">xy_resolution_reduction </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">mask_to_surface_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">smoothing </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">mask_to_surface_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">smooth_iterations </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">50</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">mask_to_surface_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">triangle_reduction </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">mask_to_surface_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">triangle_reduction_percent </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">90</span><br></span></code></pre></div></div>
<p>The <code>triangle_reduction_percent</code> value of 90 reduces the triangle count by 90%, which is appropriate for smooth, industrial parts where the mesh detail is well above the scale of the wall thickness variation of interest. For more geometrically complex parts with fine features, reduce this value to preserve surface fidelity.</p>
<p>After mesh extraction, two additional cleanup steps are applied:</p>
<p><strong>Remeshing</strong> (<code>surface_operations.remesh</code>) regularises element size and improves mesh uniformity. This reduces artefacts in the wall thickness analysis caused by highly irregular triangulations, where very elongated triangles can produce sampling bias.</p>
<p><strong>Surface diagnostics and repair</strong> (<code>surface_operations.fix_surface</code>) corrects common mesh pathologies: non-manifold edges, self-intersections, degenerate triangles, and open boundaries. The wall thickness ray-casting algorithm assumes a closed, manifold surface. Unrepaired mesh defects in these regions produce undefined or outlier thickness values.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Surface repair is a best-effort operation. For parts with complex internal geometry or fine features near the CT resolution limit, some mesh defects may persist. Inspect the mesh in the 3D view before proceeding to analysis, and compare the repaired mesh against 2D slice views to confirm that no material has been inadvertently added or removed.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="wall-thickness-analysis">Wall Thickness Analysis<a href="https://help.volvicon.com/blog/automated-wall-thickness-analysis-workflow#wall-thickness-analysis" class="hash-link" aria-label="Direct link to Wall Thickness Analysis" title="Direct link to Wall Thickness Analysis" translate="no">​</a></h2>
<p>With a clean, closed surface, the wall thickness analysis can proceed. The ray-casting method is used here:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">wall_thickness_params </span><span class="token operator">=</span><span class="token plain"> api</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">WallThicknessParams</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">wall_thickness_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">method </span><span class="token operator">=</span><span class="token plain"> api</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">WallThicknessMethod</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">RayCasting</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">wall_thickness_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">max_wall_thickness </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">20.0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">wall_thickness_params</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">search_angle </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">20.0</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ray-casting-vs-shrinking-sphere">Ray Casting vs. Shrinking Sphere<a href="https://help.volvicon.com/blog/automated-wall-thickness-analysis-workflow#ray-casting-vs-shrinking-sphere" class="hash-link" aria-label="Direct link to Ray Casting vs. Shrinking Sphere" title="Direct link to Ray Casting vs. Shrinking Sphere" translate="no">​</a></h3>
<p>The <strong>ray casting</strong> method fires a ray from each surface vertex along its outward normal (and inward normal) and records the distance to the first opposing surface intersection. This is fast and accurate for parts where inner and outer surfaces are roughly parallel — sheet metal, extrusions, simple castings, and similar geometry.</p>
<p>The <strong>shrinking sphere</strong> method instead finds the largest inscribed sphere centred on the normal axis that contacts both surfaces. This yields more physically meaningful results for curved walls and organic geometries where ray casting may underestimate thickness on the concave side of a curved section. The trade-off is substantially higher computation time.</p>
<p>For most industrial CT workflows, ray casting is the appropriate first choice. Switch to shrinking sphere when ray casting produces visible artefacts (typically seen as anomalously thin regions at corners or curved transitions).</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Search angle tuning</div><div class="admonitionContent_BuS1"><p>The <code>search_angle</code> parameter defines a cone half-angle around the surface normal within which the algorithm searches for an opposing surface. A value of 20° is a practical default:</p><ul>
<li class="">Too small (&lt; 5°): May miss opposing surfaces on coarse or irregular meshes.</li>
<li class="">Too large (&gt; 30°): May find oblique surfaces that are not geometrically opposing, inflating thickness values at part edges and thin ribs.</li>
</ul></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-the-maximum-wall-thickness">Setting the Maximum Wall Thickness<a href="https://help.volvicon.com/blog/automated-wall-thickness-analysis-workflow#setting-the-maximum-wall-thickness" class="hash-link" aria-label="Direct link to Setting the Maximum Wall Thickness" title="Direct link to Setting the Maximum Wall Thickness" translate="no">​</a></h3>
<p>The <code>max_wall_thickness</code> limit constrains the search distance. Setting this to a value slightly above the known nominal wall thickness improves performance without excluding any physically valid measurements. For parts with unknown thickness range, set it to 0 (unlimited) for the first run, observe the maximum value from the resulting statistics, and then re-run with a constrained value for batch processing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="results-and-visualisation">Results and Visualisation<a href="https://help.volvicon.com/blog/automated-wall-thickness-analysis-workflow#results-and-visualisation" class="hash-link" aria-label="Direct link to Results and Visualisation" title="Direct link to Results and Visualisation" translate="no">​</a></h2>
<p>On completion, the analysis returns a full statistical summary:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">results </span><span class="token operator">=</span><span class="token plain"> analysis_operations</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">get_wall_thickness_analysis_results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">wt_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Mean wall thickness: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">results</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">statistics</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">mean_value</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token string-interpolation interpolation format-spec">.3f</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> mm"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>The colour-mapped surface display uses a lookup table to map thickness values to colour. The configuration below uses a reverse rainbow scale with custom colours for out-of-range regions, which is effective for immediately identifying both critically thin regions (below the min range) and excess material (above the max range):</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">analysis_display_settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">lookup_table_type </span><span class="token operator">=</span><span class="token plain"> api</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">LookupTableType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ReverseRainbow</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">analysis_display_settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token builtin" style="color:rgb(189, 147, 249)">range</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">1.0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">20.0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">analysis_display_settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">below_min_range_color </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0.6</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0.0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">1.0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Violet for thin regions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">analysis_display_settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">above_max_range_color </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">1.0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0.6</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0.6</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Light red for thick regions</span><br></span></code></pre></div></div>
<p>Statistical results are written to disk for reporting or further analysis:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">analysis_operations</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">write_wall_thickness_results_to_disk</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">r'C:\Samples\wall_thickness.txt'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Interactive analysis via the UI</div><div class="admonitionContent_BuS1"><p>The scripting interface returns aggregate statistics. For interactive analysis — point picking, histogram brushing, identifying specific thin-wall locations by clicking in the 3D view, or generating a 3D PDF report — use the <strong>Wall Thickness Analysis</strong> tool in the <strong>Analyze</strong> ribbon tab. The scripting and UI analysis objects are compatible; a project saved after scripting analysis can be opened interactively for further inspection.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="video-tutorial">Video Tutorial<a href="https://help.volvicon.com/blog/automated-wall-thickness-analysis-workflow#video-tutorial" class="hash-link" aria-label="Direct link to Video Tutorial" title="Direct link to Video Tutorial" translate="no">​</a></h2>
<p>The complete workflow is demonstrated in the video below:</p>
<iframe width="100%" style="aspect-ratio:16/9;border-radius:8px" src="https://www.youtube.com/embed/eBK990MnfLw" title="Automated Wall Thickness Analysis Workflow in Volvicon" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-resources">Related Resources<a href="https://help.volvicon.com/blog/automated-wall-thickness-analysis-workflow#related-resources" class="hash-link" aria-label="Direct link to Related Resources" title="Direct link to Related Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://help.volvicon.com/docs/gui/ribbon-tabs/analyze/wall-thickness-analysis">Wall Thickness Analysis — GUI Reference</a></li>
<li class=""><a class="" href="https://help.volvicon.com/docs/tutorials/scripting/wall-thickness-analysis-workflow">Wall-Thickness Analysis Workflow — Scripting Tutorial</a></li>
<li class=""><a class="" href="https://help.volvicon.com/docs/api/overview">Python Scripting API Overview</a></li>
<li class=""><a class="" href="https://help.volvicon.com/docs/api/quick-reference">Scripting Quick Reference</a></li>
</ul>]]></content:encoded>
            <category>tutorial</category>
            <category>scripting</category>
            <category>wall-thickness</category>
            <category>analysis</category>
            <category>automation</category>
            <category>manufacturing</category>
        </item>
        <item>
            <title><![CDATA[Industrial CT with Volvicon: Cone Beam Reconstruction, Void Detection, and Automated Reporting]]></title>
            <link>https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis</link>
            <guid>https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis</guid>
            <pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A walkthrough of Volvicon's automated pipeline for cone beam CT reconstruction using the FDK algorithm, followed by void/inclusion detection and quantitative result export — fully scripted via the Python API.]]></description>
            <content:encoded><![CDATA[<p>Industrial CT inspection workflows typically involve three sequential stages: volume reconstruction from raw projections, defect characterisation within the reconstructed volume, and export of quantitative results for reporting or downstream processing. Each stage carries its own set of parameters and potential failure modes. This post walks through how to automate all three stages in Volvicon using the Python Scripting API, drawing on a worked example with cone beam CT data.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>The complete workflow covered here proceeds as follows:</p>
<ol>
<li class="">Reconstruct a 3D volume from a sequence of cone beam projection images using the FDK (Feldkamp–Davis–Kress) algorithm.</li>
<li class="">Apply post-reconstruction filtering and render properties to improve visual interpretability.</li>
<li class="">Run void/inclusion analysis to detect and characterise internal defects.</li>
<li class="">Export per-defect statistics and aggregate porosity metrics to disk.</li>
</ol>
<p>The same workflow applies to any industrial CT dataset where projection geometry is known — castings, welds, additive manufactured parts, composites, and similar materials.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cone-beam-ct-reconstruction">Cone Beam CT Reconstruction<a href="https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis#cone-beam-ct-reconstruction" class="hash-link" aria-label="Direct link to Cone Beam CT Reconstruction" title="Direct link to Cone Beam CT Reconstruction" translate="no">​</a></h2>
<p>The FDK algorithm requires accurate knowledge of the scanning geometry. Errors in source-to-detector distance, source-to-isocenter distance, or detector pixel size propagate directly into the reconstructed voxel dimensions and therefore into all downstream measurements. Before running reconstruction, verify these parameters against your scanner's calibration data.</p>
<p>The key geometry parameters are:</p>
<table><thead><tr><th>Parameter</th><th>Description</th></tr></thead><tbody><tr><td><code>source_to_detector_distance</code></td><td>Distance from the X-ray focal spot to the detector plane (mm).</td></tr><tr><td><code>source_to_isocenter_distance</code></td><td>Distance from the X-ray focal spot to the rotation axis (mm).</td></tr><tr><td><code>detector_pixel_size_x / y</code></td><td>Physical pixel pitch on the detector (mm).</td></tr><tr><td><code>xray_scan_total_angle</code></td><td>Total angular arc covered by the scan (360° for full circular scan).</td></tr><tr><td><code>is_clockwise</code></td><td>Rotation direction — must match the physical scanner.</td></tr></tbody></table>
<p>If your detector is not perfectly aligned with the rotation axis, the offset parameters (<code>projection_offset_x/y</code>, <code>source_offset_x/y</code>, <code>out_of_plane_angle</code>, <code>in_plane_angle</code>) allow you to compensate for translational and rotational misalignment before reconstruction rather than in post-processing.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Short scans and displaced detectors</div><div class="admonitionContent_BuS1"><p>For scans covering less than 360° or using an off-centre detector configuration, enable <code>enable_displaced_detector</code> and set <code>angular_gap_threshold</code> to match your scan arc. This activates the displaced detector FDK weighting function, which reduces truncation artefacts at the projection boundary.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reconstruction-filter">Reconstruction Filter<a href="https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis#reconstruction-filter" class="hash-link" aria-label="Direct link to Reconstruction Filter" title="Direct link to Reconstruction Filter" translate="no">​</a></h3>
<p>The Hann filter (<code>hann_cut_frequency</code>) controls the high-frequency roll-off applied during filtered back-projection. A value of 0.0 applies no additional filtering beyond the ramp filter. Increasing it toward 1.5 progressively smooths the reconstruction at the cost of spatial resolution. For defect detection, start at 0.0 and increase only if noise is visually dominant in the reconstructed volume.</p>
<p>Truncation correction (<code>truncation_correction</code>) is relevant when the object extends beyond the detector field of view. Setting a value greater than 0 applies a correction that partially compensates for the cupping artefact introduced by truncated projections, though it does not fully eliminate it.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-reconstruction-processing">Post-Reconstruction Processing<a href="https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis#post-reconstruction-processing" class="hash-link" aria-label="Direct link to Post-Reconstruction Processing" title="Direct link to Post-Reconstruction Processing" translate="no">​</a></h3>
<p>After reconstruction, a bilateral filter can be applied to reduce noise while preserving edge sharpness:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">volume_operations</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">bilateral_filter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">reconstructed_volume</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">8000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>The parameters control the spatial filter width and intensity range window. For typical metal or polymer CT data, the defaults above provide a reasonable starting point. The bilateral filter is preferable to Gaussian smoothing here because it does not diffuse high-contrast material boundaries — a property that matters for accurate void boundary delineation in the next stage.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="void--inclusion-analysis">Void / Inclusion Analysis<a href="https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis#void--inclusion-analysis" class="hash-link" aria-label="Direct link to Void / Inclusion Analysis" title="Direct link to Void / Inclusion Analysis" translate="no">​</a></h2>
<p>With a reconstructed and filtered volume, the void/inclusion analysis detects regions of anomalous intensity relative to the surrounding bulk material.</p>
<p><strong>Voids</strong> appear as locally lower-intensity regions (gas pockets, shrinkage cavities, cracks). <strong>Inclusions</strong> appear as locally higher-intensity regions (denser foreign materials). The mode is selected at analysis creation time and cannot be changed without creating a new analysis object.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="detection-method">Detection Method<a href="https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis#detection-method" class="hash-link" aria-label="Direct link to Detection Method" title="Direct link to Detection Method" translate="no">​</a></h3>
<p>Two detection modes are available:</p>
<ul>
<li class=""><strong>Absolute</strong>: Applies a fixed intensity contrast threshold relative to the estimated background level.</li>
<li class=""><strong>Relative</strong>: Applies a percentage-based contrast threshold relative to the local intensity range.</li>
</ul>
<p>For most industrial CT datasets, enabling <code>auto_absolute_contrast</code> is the appropriate starting point. This estimates the background (bulk material) intensity automatically, reducing the need for manual threshold tuning between datasets with different exposure or material properties. Manual override is available when the automatic estimate is unreliable — for example, in datasets with strong beam hardening artefacts.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="filtering-detected-regions">Filtering Detected Regions<a href="https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis#filtering-detected-regions" class="hash-link" aria-label="Direct link to Filtering Detected Regions" title="Direct link to Filtering Detected Regions" translate="no">​</a></h3>
<p>The filtering step determines which candidate regions are included in the final result. The most consequential parameters are:</p>
<table><thead><tr><th>Parameter</th><th>Guidance</th></tr></thead><tbody><tr><td><code>min_voxel_count</code></td><td>Sets the minimum detectable defect size. Use <code>27</code> voxels (a 3×3×3 cube) as a practical lower bound to discard single-voxel noise.</td></tr><tr><td><code>max_voxel_count</code></td><td>Prevents very large segmentation errors (e.g., partially segmented background) from appearing as defects.</td></tr><tr><td><code>min_sphericity</code> / <code>max_sphericity</code></td><td>Sphericity near 1.0 indicates near-spherical gas pockets. Lowering the minimum captures elongated crack-like features.</td></tr><tr><td><code>max_count</code></td><td>Hard cap on the number of returned defects. Useful for performance when processing datasets with thousands of small pores.</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Geometric filtering does not re-run the detection — it post-processes the candidate list. If you tighten filters and then loosen them again, no new candidates are generated; you must re-run the analysis to capture previously excluded regions.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="statistics">Statistics<a href="https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis#statistics" class="hash-link" aria-label="Direct link to Statistics" title="Direct link to Statistics" translate="no">​</a></h3>
<p>The analysis returns both per-defect label statistics and aggregate descriptive statistics. The per-defect table includes volume, centroid coordinates, compactness, sphericity, equivalent diameter, and volume fraction — sufficient for most engineering defect characterisation reports. The aggregate porosity value (<code>void_inclusion_results.porosity</code>) gives the total defect volume as a fraction of the analysed region.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Total defects: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">void_inclusion_results</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">total_defects_found</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Total defect volume (mm³): </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">void_inclusion_results</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">total_defect_volume</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Porosity: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">void_inclusion_results</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">porosity</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token string-interpolation interpolation format-spec">.4%</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Porosity interpretation</div><div class="admonitionContent_BuS1"><p>The porosity value computed here is relative to the full reconstructed volume bounding box, not the part volume. If the volume was reconstructed with significant air surrounding the part, the porosity fraction will be underestimated. Use a ROI mask or crop the volume to the part bounds before analysis to obtain a physically meaningful porosity metric.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="exporting-results">Exporting Results<a href="https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis#exporting-results" class="hash-link" aria-label="Direct link to Exporting Results" title="Direct link to Exporting Results" translate="no">​</a></h2>
<p>Results can be written to disk as plain-text statistical summaries:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">analysis_operations</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">write_void_inclusion_results_to_disk</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    void_inclusion_results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    os</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">output_dir</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'void_inclusion.txt'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>Snapshots of the 3D scene, application window, and individual views can be saved programmatically:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">save_snapshot_to_disk</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">api</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">SnapshotType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">View3D</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'C:/Samples/View3D.png'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>For structured reporting (PDF reports with 3D scenes, charts, and measurement tables), the interactive UI tools under the <strong>Analyze</strong> ribbon tab provide report generation features not available through the scripting interface.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="video-tutorial">Video Tutorial<a href="https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis#video-tutorial" class="hash-link" aria-label="Direct link to Video Tutorial" title="Direct link to Video Tutorial" translate="no">​</a></h2>
<p>The full workflow — reconstruction, void analysis, visualisation, and reporting — is demonstrated in the video below:</p>
<iframe width="100%" style="aspect-ratio:16/9;border-radius:8px" src="https://www.youtube.com/embed/hmqcJA1Avx8" title="Industrial CT with Volvicon — Reconstruction, Void Detection, Reporting, Automation" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-resources">Related Resources<a href="https://help.volvicon.com/blog/industrial-ct-cone-beam-reconstruction-void-analysis#related-resources" class="hash-link" aria-label="Direct link to Related Resources" title="Direct link to Related Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://help.volvicon.com/docs/gui/ribbon-tabs/analyze/void-inclusion-analysis">Void/Inclusion Analysis — GUI Reference</a></li>
<li class=""><a class="" href="https://help.volvicon.com/docs/tutorials/scripting/cone-beam-reconstruction-and-void-analysis-workflow">Cone Beam Reconstruction and Void Analysis Workflow — Scripting Tutorial</a></li>
<li class=""><a class="" href="https://help.volvicon.com/docs/api/overview">Python Scripting API Overview</a></li>
<li class=""><a class="" href="https://help.volvicon.com/docs/api/quick-reference">Scripting Quick Reference</a></li>
</ul>]]></content:encoded>
            <category>tutorial</category>
            <category>scripting</category>
            <category>industrial-ct</category>
            <category>void-analysis</category>
            <category>automation</category>
        </item>
    </channel>
</rss>