Analysis Operations
Analysis Operations Tutorial.
This tutorial demonstrates complete workflows for various types of 3D analyses, including wall thickness, deviation, curvature, extrema, gray value, and void/inclusion. Each section covers the full lifecycle from creation to export.
Note: The UI analysis tools are heavily based on user interaction, such as picking points on the target object to find values, viewing frequency vs. statistics distribution charts, etc. Since user interactions cannot be performed through the scripting interface, the scripting analysis operations have certain limitations. For interactive analysis, it is highly recommended to use the UI tools located under the Analyze ribbon tab. The UI tools also provide options to generate detailed 3D PDF reports, including snapshots, measurements, interactive 3D scenes, charts, and more.
- Volvicon application must be running
- Relevant objects loaded (volumes, masks, and surfaces as required)
Creating Analyses​
# # Wall thickness (mask)
# WallThicknessParams = api.WallThicknessParams()
# WallThicknessParams.mask_preview_surface_quality = api.Mask3dPreviewQuality.High
# WallThicknessParams.method = api.WallThicknessMethod.ShrinkingSphere
# WallThicknessParams.max_wall_thickness = 10000
# WallThicknessParams.search_angle = 20
# wt_name = AnalysisOperations.create_wall_thickness_analysis_mask(
# "WallThickness_Mask_1",
# active_mask_name, # mask_name (string)
# WallThicknessParams
# )
# # Wall thickness (surface)
# WallThicknessParamsSurface = api.WallThicknessParams()
# WallThicknessParamsSurface.mask_preview_surface_quality = api.Mask3dPreviewQuality.High
# WallThicknessParamsSurface.method = api.WallThicknessMethod.RayCasting
# WallThicknessParamsSurface.max_wall_thickness = 10000
# WallThicknessParamsSurface.search_angle = 20
# wt_surf_name = AnalysisOperations.create_wall_thickness_analysis_surface(
# "WallThickness_Surface_1",
# active_surface_name, # surface_name (string)
# WallThicknessParamsSurface
# )
# # Deviation (mask vs mask / surface vs surface / mask vs surface)
# DeviationParamsSigned = api.DeviationParams()
# DeviationParamsSigned.method = api.DeviationMethod.Signed
# dev_mvm_name = AnalysisOperations.create_deviation_analysis_mask_vs_mask(
# "Deviation_MvM",
# active_mask_name,
# app.get_all_mask_names()[0],
# DeviationParamsSigned
# )
#
# DeviationParamsUnsigned = api.DeviationParams()
# DeviationParamsUnsigned.method = api.DeviationMethod.Unsigned
# dev_svs_name = AnalysisOperations.create_deviation_analysis_surface_vs_surface(
# "Deviation_SvS",
# active_surface_name,
# app.get_all_surface_names()[0],
# DeviationParamsUnsigned
# )
#
# DeviationParamsDefault = api.DeviationParams()
# dev_mvs_name = AnalysisOperations.create_deviation_analysis_mask_vs_surface(
# "Deviation_MvS",
# active_mask_name,
# active_surface_name,
# DeviationParamsDefault
# )
# # Curvature (mask / surface)
# CurvatureParamsMask = api.CurvatureParams()
# CurvatureParamsMask.method = api.CurvatureMethod.Gaussian
# curv_mask = AnalysisOperations.create_curvature_analysis_mask(
# "Curvature_Mask",
# active_mask_name,
# CurvatureParamsMask
# )
#
# CurvatureParamsSurface = api.CurvatureParams()
# CurvatureParamsSurface.method = api.CurvatureMethod.Mean
# curv_surface = AnalysisOperations.create_curvature_analysis_surface(
# "Curvature_Surface",
# active_surface_name,
# CurvatureParamsSurface
# )
# # Extrema (mask / surface)
# ExtremaParamsMask = api.ExtremaParams()
# ExtremaParamsMask.method = api.ExtremaMethod.MaximumAndMinimum
# ExtremaParamsMask.axis = [0.0, 0.0, 1.0]
# ext_mask = AnalysisOperations.create_extrema_analysis_mask(
# "Extrema_Mask",
# active_mask_name,
# ExtremaParamsMask
# )
#
# ExtremaParamsSurface = api.ExtremaParams()
# ExtremaParamsSurface.method = api.ExtremaMethod.Maximum
# ext_surface = AnalysisOperations.create_extrema_analysis_surface(
# "Extrema_Surface",
# active_surface_name,
# ExtremaParamsSurface
# )
# # Gray value (mask / surface)
# GrayValueParamsMask = api.GrayValueParams()
# GrayValueParamsMask.mask_preview_surface_quality = api.Mask3dPreviewQuality.Optimal
# gv_mask = AnalysisOperations.create_gray_value_analysis_mask(
# "GrayValue_Mask",
# active_mask_name,
# active_volume_name,
# GrayValueParamsMask
# )
#
# GrayValueParamsSurface = api.GrayValueParams()
# GrayValueParamsSurface.mask_preview_surface_quality = api.Mask3dPreviewQuality.Optimal
# gv_surface = AnalysisOperations.create_gray_value_analysis_surface(
# "GrayValue_Surface",
# active_surface_name,
# active_volume_name,
# GrayValueParamsSurface
# )
# # Void / inclusion
# VoidInclusionParams = api.VoidInclusionParams()
# VoidInclusionParams.mode = api.VoidInclusionTargetType.Void
# VoidInclusionParams.method = api.VoidInclusionMethod.Absolute
# VoidInclusionParams.auto_absolute_contrast = True
# VoidInclusionParams.auto_air_gray_value = True
# VoidInclusionParams.requested_statistics = [
# "Volume (mm³)",
# "Volume fraction (%)",
# "Centroid X (mm)",
# "Centroid Y (mm)",
# "Centroid Z (mm)",
# "Compactness",
# "Sphericity",
# "Equivalent diameter (mm)"
# ]
# VoidInclusionFilteringParams = api.VoidInclusionFilteringParams()
# VoidInclusionFilteringParams.enable_geometric_filtering = True
# VoidInclusionFilteringParams.probability_threshold = 0.0
# VoidInclusionFilteringParams.min_voxel_count = 8
# VoidInclusionFilteringParams.max_voxel_count = 10000000
# VoidInclusionFilteringParams.min_compactness = 0.0
# VoidInclusionFilteringParams.max_compactness = 1.0
# VoidInclusionFilteringParams.min_sphericity = 0.0
# VoidInclusionFilteringParams.max_sphericity = 1.0
# VoidInclusionFilteringParams.min_volume_fraction_percent = 0.0
# VoidInclusionFilteringParams.max_volume_fraction_percent = 100.0
# VoidInclusionFilteringParams.min_equivalent_diameter = 0.0
# VoidInclusionFilteringParams.max_equivalent_diameter = 1000000.0
# VoidInclusionFilteringParams.max_count = 10000
# VoidInclusionParams.filter_result_params = VoidInclusionFilteringParams
# vi_name = AnalysisOperations.create_void_inclusion_analysis(
# "VoidInclusion_1",
# active_volume_name,
# "", # roi_mask_name (string, empty to disable)
# VoidInclusionParams
# )
# all_analyses = app.get_all_analysis_names()
# print(f"Available analyses: {all_analyses}")
1. Wall Thickness Analysis Workflow​
# # A. Creation
# WallThicknessParams = api.WallThicknessParams()
# WallThicknessParams.mask_preview_surface_quality = api.Mask3dPreviewQuality.High
# WallThicknessParams.method = api.WallThicknessMethod.ShrinkingSphere
# WallThicknessParams.max_wall_thickness = 10.0
# WallThicknessParams.search_angle = 20.0
# wt_name = AnalysisOperations.create_wall_thickness_analysis_mask(
# "WallThickness_Mask_1",
# active_mask_name,
# WallThicknessParams
# )
#
# # B. Running
# AnalysisOperations.run_analysis(wt_name)
#
# # C. Getting Info and Results
# AnalysisInfo = AnalysisOperations.get_analysis_info(wt_name)
# print(f"Analysis info: name={AnalysisInfo.name}, type={AnalysisInfo.type}")
#
# # Get specific analysis type name
# analysis_type_str = AnalysisOperations.get_analysis_type_as_string(wt_name)
# print(f"Analysis type name: {analysis_type_str}")
#
# # Check if analysis has results
# has_results = AnalysisOperations.has_analysis_results(wt_name)
# print(f"Has results: {has_results}")
#
# WallThicknessAnalysisResults = AnalysisOperations.get_wall_thickness_analysis_results(wt_name)
# print(f"Wall Thickness Mean: {WallThicknessAnalysisResults.statistics.mean_value}")
#
# # D. Writing Results to Disk
# AnalysisOperations.write_wall_thickness_results_to_disk(WallThicknessAnalysisResults, r'C:\output\wall_thickness.txt')
#
# # E. Changing Display Settings
# AnalysisDisplaySettings = api.AnalysisDisplaySettings()
# AnalysisDisplaySettings.above_max_range_color = [1.0, 0.6, 0.6]
# AnalysisDisplaySettings.lookup_table_type = api.LookupTableType.ReverseRainbow
# AnalysisDisplaySettings.below_min_range_color = [0.6, 0.0, 1.0]
# AnalysisDisplaySettings.constant_color = [0.0, 0.0, 1.0]
# AnalysisDisplaySettings.lookup_table_opacity = 1.0
# AnalysisDisplaySettings.range = [0.0, 5.0]
# AnalysisOperations.set_display_settings(wt_name, AnalysisDisplaySettings)
# current_settings = AnalysisOperations.get_display_settings(wt_name)
#
# # Restoring visualization defaults
# # AnalysisOperations.restore_visualizations(wt_name)
#
# # F. Updating Analysis
# # AnalysisOperations.update_analysis(wt_name)
2. Deviation Analysis Workflow​
# # A. Creation (Mask vs Mask)
# DeviationParams = api.DeviationParams()
# DeviationParams.method = api.DeviationMethod.Signed
# dev_name = AnalysisOperations.create_deviation_analysis_mask_vs_mask(
# "Deviation_MvM_1",
# active_mask_name,
# app.get_all_mask_names()[0],
# DeviationParams
# )
#
# # B. Running
# AnalysisOperations.run_analysis(dev_name)
#
# # C. Getting Info and Results
# AnalysisInfo = AnalysisOperations.get_analysis_info(dev_name)
# print(f"Analysis info: name={AnalysisInfo.name}, type={AnalysisInfo.type}")
#
# DeviationAnalysisResults = AnalysisOperations.get_deviation_analysis_results(dev_name)
# print(f"Deviation Mean: {DeviationAnalysisResults.statistics.mean_value}")
#
# # D. Writing Results to Disk
# AnalysisOperations.write_deviation_results_to_disk(DeviationAnalysisResults, r'C:\output\deviation.txt')
#
# # E. Changing Display Settings
# display = api.AnalysisDisplaySettings()
# display.lookup_table_type = api.LookupTableType.ReverseRainbow
# display.range = [-1.0, 1.0]
# AnalysisOperations.set_display_settings(dev_name, display)
#
# # F. Updating Analysis
# # AnalysisOperations.update_analysis(dev_name)
3. Curvature Analysis Workflow​
# # A. Creation
# CurvatureParams = api.CurvatureParams()
# CurvatureParams.method = api.CurvatureMethod.Gaussian
# curv_name = AnalysisOperations.create_curvature_analysis_mask(
# "Curvature_Mask_1",
# active_mask_name,
# CurvatureParams
# )
#
# # B. Running
# AnalysisOperations.run_analysis(curv_name)
#
# # C. Getting Info and Results
# AnalysisInfo = AnalysisOperations.get_analysis_info(curv_name)
# print(f"Analysis info: name={AnalysisInfo.name}, type={AnalysisInfo.type}")
#
# CurvatureAnalysisResults = AnalysisOperations.get_curvature_analysis_results(curv_name)
# print(f"Curvature Mean: {CurvatureAnalysisResults.statistics.mean_value}")
#
# # D. Writing Results to Disk
# AnalysisOperations.write_curvature_results_to_disk(CurvatureAnalysisResults, r'C:\output\curvature.txt')
#
# # E. Changing Display Settings
# display = api.AnalysisDisplaySettings()
# display.lookup_table_type = api.LookupTableType.ReverseRainbow
# AnalysisOperations.set_display_settings(curv_name, display)
#
# # F. Updating Analysis
# # AnalysisOperations.update_analysis(curv_name)
4. Extrema Analysis Workflow​
# # A. Creation
# ExtremaParams = api.ExtremaParams()
# ExtremaParams.method = api.ExtremaMethod.MaximumAndMinimum
# ExtremaParams.axis = [0.0, 0.0, 1.0]
# ext_name = AnalysisOperations.create_extrema_analysis_mask(
# "Extrema_Mask_1",
# active_mask_name,
# ExtremaParams
# )
#
# # B. Running
# AnalysisOperations.run_analysis(ext_name)
#
# # C. Getting Info and Results
# AnalysisInfo = AnalysisOperations.get_analysis_info(ext_name)
# print(f"Analysis info: name={AnalysisInfo.name}, type={AnalysisInfo.type}")
#
# ExtremaAnalysisResults = AnalysisOperations.get_extrema_analysis_results(ext_name)
# print(f"Extrema Max: {ExtremaAnalysisResults.statistics.max_value}")
#
# # D. Writing Results to Disk
# AnalysisOperations.write_extrema_results_to_disk(ExtremaAnalysisResults, r'C:\output\extrema.txt')
#
# # E. Changing Display Settings
# display = api.AnalysisDisplaySettings()
# display.constant_color = [1.0, 0.0, 0.0] # Red for extrema points
# AnalysisOperations.set_display_settings(ext_name, display)
#
# # F. Updating Analysis
# # AnalysisOperations.update_analysis(ext_name)
5. Gray Value Analysis Workflow​
# # A. Creation
# GrayValueParams = api.GrayValueParams()
# GrayValueParams.mask_preview_surface_quality = api.Mask3dPreviewQuality.Optimal
# gv_name = AnalysisOperations.create_gray_value_analysis_mask(
# "GrayValue_Mask_1",
# active_mask_name,
# active_volume_name,
# GrayValueParams
# )
#
# # B. Running
# AnalysisOperations.run_analysis(gv_name)
#
# # C. Getting Info and Results
# AnalysisInfo = AnalysisOperations.get_analysis_info(gv_name)
# print(f"Analysis info: name={AnalysisInfo.name}, type={AnalysisInfo.type}")
#
# GrayValueAnalysisResults = AnalysisOperations.get_gray_value_analysis_results(gv_name)
# print(f"Gray Value Mean: {GrayValueAnalysisResults.statistics.mean_value}")
#
# # D. Writing Results to Disk
# AnalysisOperations.write_gray_value_results_to_disk(GrayValueAnalysisResults, r'C:\output\gray_value.txt')
#
# # E. Changing Display Settings
# display = api.AnalysisDisplaySettings()
# display.lookup_table_type = api.LookupTableType.ReverseRainbow
# AnalysisOperations.set_display_settings(gv_name, display)
#
# # F. Updating Analysis
# # AnalysisOperations.update_analysis(gv_name)
6. Void / Inclusion Analysis Workflow​
# # A. Creation
# VoidInclusionParams = api.VoidInclusionParams()
# VoidInclusionParams.mode = api.VoidInclusionTargetType.Void
# VoidInclusionParams.method = api.VoidInclusionMethod.Absolute
# VoidInclusionParams.auto_absolute_contrast = True
# VoidInclusionParams.auto_air_gray_value = True
# VoidInclusionParams.requested_statistics = [
# "Volume (mm³)",
# "Volume fraction (%)",
# "Centroid X (mm)",
# "Centroid Y (mm)",
# "Centroid Z (mm)",
# "Compactness",
# "Sphericity",
# "Equivalent diameter (mm)"
# ]
#
# VoidInclusionFilteringParams = api.VoidInclusionFilteringParams()
# VoidInclusionFilteringParams.enable_geometric_filtering = True
# VoidInclusionFilteringParams.probability_threshold = 0.0
# VoidInclusionFilteringParams.min_voxel_count = 8
# VoidInclusionFilteringParams.max_voxel_count = 10000000
# VoidInclusionFilteringParams.min_compactness = 0.0
# VoidInclusionFilteringParams.max_compactness = 1.0
# VoidInclusionFilteringParams.min_sphericity = 0.0
# VoidInclusionFilteringParams.max_sphericity = 1.0
# VoidInclusionFilteringParams.min_volume_fraction_percent = 0.0
# VoidInclusionFilteringParams.max_volume_fraction_percent = 100.0
# VoidInclusionFilteringParams.min_equivalent_diameter = 0.0
# VoidInclusionFilteringParams.max_equivalent_diameter = 1000000.0
# VoidInclusionFilteringParams.max_count = 10000
# VoidInclusionParams.filter_result_params = VoidInclusionFilteringParams
#
# vi_name = AnalysisOperations.create_void_inclusion_analysis(
# "VoidInclusion_1",
# active_volume_name,
# "", # No ROI mask
# VoidInclusionParams
# )
#
# # B. Running
# if AnalysisOperations.run_analysis(vi_name):
# print(f"Analysis run successfully: {vi_name}")
# last_mask = app.get_all_mask_names()[len(app.get_all_mask_names())-1]
# app.isolate_masks([last_mask])
# app.set_mask_3d_preview_quality(api.Mask3dPreviewQuality.Optimal)
# app.generate_mask_3d_preview(app.get_visible_mask_names())
#
# # C. Getting Info and Results
# AnalysisInfo = AnalysisOperations.get_analysis_info(vi_name)
# print(f"Analysis info: name={AnalysisInfo.name}, type={AnalysisInfo.type}")
#
# # Get defect results
# VoidInclusionResults = AnalysisOperations.get_void_inclusion_results(vi_name)
# print(f"Void/Inclusion Stats:")
# print(f" Total defects: {VoidInclusionResults.total_defects_found}")
# print(f" Total defect volume: {VoidInclusionResults.total_defect_volume}")
# print(f" Porosity: {VoidInclusionResults.porosity}")
# print(f" Label statistics count: {len(VoidInclusionResults.label_statistics)}")
#
# # Get descriptive statistics
# print(f"descriptive_statistics_count: {len(VoidInclusionResults.descriptive_statistics)}")
# for VoidInclusionDescriptiveStatistic in VoidInclusionResults.descriptive_statistics:
# statType = VoidInclusionDescriptiveStatistic.statistic_type
# stdDev = VoidInclusionDescriptiveStatistic.std_deviation
# print(f"{statType}: {stdDev}")
#
# # Get label statistics
# print(f"label_statistics_count: {len(VoidInclusionResults.label_statistics)}")
# for VoidInclusionLabelStatistics in VoidInclusionResults.label_statistics:
# label = VoidInclusionLabelStatistics.label
# for VoidInclusionStatistic in VoidInclusionLabelStatistics.statistics:
# statType = VoidInclusionStatistic.statistic_type
# value = VoidInclusionStatistic.values[0]
# print(f"{label} | {statType}: {value}")
#
# # D. Writing Results to Disk
# AnalysisOperations.write_void_inclusion_results_to_disk(VoidInclusionResults, r'C:\output\void_inclusion.txt')
#
# # E. Changing Display Settings
# display = api.AnalysisDisplaySettings()
# AnalysisOperations.set_display_settings(vi_name, display)
#
# # F. Updating Analysis
# # AnalysisOperations.update_analysis(vi_name)
print("Analysis operations tutorial completed successfully.")
Related Resources​
- API Reference - API documentation
- Quick Reference - Common methods at a glance