Measurement Operations
Measurement Operations Tutorial.
This tutorial demonstrates operations on 3D measurements including creation, querying values, appearance settings, import/export, and snapping.
Prerequisites
- Volvicon application must be running
- For snapping operations, surfaces or masks must be present
Listing Measurements​
all_measurements = app.get_all_measurement_names()
all_surfaces = app.get_all_surface_names()
all_masks = app.get_all_mask_names()
print(f"Available measurements: {all_measurements}")
# Get measurements by type
# point_measurements = MeasurementOperations.get_measurement_names_by_type(api.MeasurementType.Point)
# distance_measurements = MeasurementOperations.get_measurement_names_by_type(api.MeasurementType.Distance)
# angle_measurements = MeasurementOperations.get_measurement_names_by_type(api.MeasurementType.Angle)
Importing and Exporting Measurements​
# Import measurements from file
# success = MeasurementOperations.import_measurements_settings_from_disk(r'C:\data\measurements.ini', False) # deleteExisting=False (bool)
# Export all measurements to file
# success = MeasurementOperations.export_measurements_settings_to_disk(r'C:\output\measurements.ini')
# Export specific measurements to file
# success = MeasurementOperations.export_measurements_to_disk(['Point 001', 'Distance 001'], r'C:\output\selected.json')
Creating Measurements​
# Create a point measurement
# point_name = MeasurementOperations.create_point(
# [10.0, 20.0, 30.0], # position [x, y, z]
# "MyPoint" # name (str, optional)
# )
# Create a distance measurement
# distance_name = MeasurementOperations.create_distance(
# [0.0, 0.0, 0.0], # point1 [x, y, z]
# [100.0, 50.0, 25.0], # point2 [x, y, z]
# "MyDistance" # name (str, optional)
# )
# Create an angle measurement
# angle_name = MeasurementOperations.create_angle(
# [0.0, 0.0, 0.0], # point1 [x, y, z]
# [50.0, 0.0, 0.0], # vertex [x, y, z]
# [50.0, 50.0, 0.0], # point3 [x, y, z]
# "MyAngle" # name (str, optional)
# )
# Create a contour measurement
# contour_name = MeasurementOperations.create_contour(
# [[0.0, 0.0, 0.0], [100.0, 0.0, 0.0], [100.0, 100.0, 0.0], [0.0, 100.0, 0.0]], # points (list of [x,y,z])
# True, # closedLoop (bool)
# "MyContour" # name (str, optional)
# )
# Create a caption (text annotation)
# annotation_name = MeasurementOperations.create_annotation(
# [50.0, 50.0, 50.0], # position [x, y, z]
# "Sample annotation", # text (str)
# "MyAnnotation" # name (str, optional)
# )
# Create a diameter measurement (three points define diameter endpoints and a third point)
# diameter_name = MeasurementOperations.create_diameter(
# [0.0, 0.0, 0.0], # point1 [x, y, z]
# [100.0, 0.0, 0.0], # point2 [x, y, z]
# [50.0, 50.0, 0.0], # point3 [x, y, z]
# "MyDiameter" # name (str, optional)
# )
# Create a circle measurement using center and a boundary point
# circle_name = MeasurementOperations.create_circle(
# [0.0, 0.0, 0.0], # center [x, y, z]
# [10.0, 0.0, 0.0], # a point on circumference
# "MyCircle"
# )
# Create an ellipse measurement using center and two axis-defining points
# ellipse_name = MeasurementOperations.create_ellipse(
# [0.0, 0.0, 0.0], # center [x, y, z]
# [10.0, 0.0, 0.0], # first axis point
# [0.0, 5.0, 0.0], # second axis point
# "MyEllipse"
# )
# Create a rectangle measurement using center and two extent points
# rectangle_name = MeasurementOperations.create_rectangle(
# [0.0, 0.0, 0.0], # center [x, y, z]
# [10.0, 0.0, 0.0], # second point
# [0.0, 5.0, 0.0], # third point
# "MyRectangle"
# )
# Create a box measurement (center-based)
# box_name = MeasurementOperations.create_box(
# [50.0, 50.0, 50.0], # center [x, y, z]
# "MyBox"
# )
Querying Measurement Values​
# if all_measurements:
# # Get measurement type
# MeasurementType = MeasurementOperations.get_measurement_type(all_measurements[0])
# print(f"Type: {MeasurementType}")
#
# # Get formatted measurement value string (e.g., "12.5 mm")
# value_str = MeasurementOperations.get_measurement_value_string(all_measurements[0])
# print(f"Value: \n{value_str}")
#
# # Get measurement data (name, visibility, locked status, points)
# data = MeasurementOperations.get_measurement_data(all_measurements[0])
# print(f"Name: {data.name}, Visible: {data.visible}, Locked: {data.locked}")
# print(f"Points: {data.points}")
#
# # Get point coordinates
# points = MeasurementOperations.get_points(all_measurements[0])
# print(f"Points: {points}")
Querying Specific Measurement Types​
# PointMeasurement = MeasurementOperations.get_point_measurement("Point 001")
# print(f"Position: {PointMeasurement.position}, Gray value: {PointMeasurement.gray_value}")
# DistanceMeasurement = MeasurementOperations.get_distance_measurement("Distance 003")
# print(f"Point1: {DistanceMeasurement.point1}, Point2: {DistanceMeasurement.point2}")
# print(f"Distance: {DistanceMeasurement.distance} mm")
# AngleMeasurement = MeasurementOperations.get_angle_measurement("Angle 005")
# print(f"Point1: {AngleMeasurement.point1}, Center: {AngleMeasurement.center}, Point2: {AngleMeasurement.point2}")
# print(f"Angle: {AngleMeasurement.angle} degrees")
# DiameterMeasurement = MeasurementOperations.get_diameter_measurement("Diameter 007")
# print(f"Diameter: {DiameterMeasurement.diameter}, Centroid: {DiameterMeasurement.centroid}")
# ContourMeasurement = MeasurementOperations.get_contour_measurement("Contour 008")
# print(f"Area: {ContourMeasurement.area}, Perimeter: {ContourMeasurement.perimeter}")
# print(f"Centroid: {ContourMeasurement.centroid}, Max distance: {ContourMeasurement.max_distance_through_centroid}")
# CircleMeasurement = MeasurementOperations.get_circle_measurement("Circle 016")
# print(f"Diameter: {CircleMeasurement.diameter}, Centroid: {CircleMeasurement.centroid}")
# EllipseMeasurement = MeasurementOperations.get_ellipse_measurement("Ellipse 017")
# print(f"D1: {EllipseMeasurement.d1}, D2: {EllipseMeasurement.d2}")
# print(f"Area: {EllipseMeasurement.area}, Perimeter: {EllipseMeasurement.perimeter}")
# print(f"Eccentricity: {EllipseMeasurement.eccentricity}, Centroid: {EllipseMeasurement.centroid}")
# RectangleMeasurement = MeasurementOperations.get_rectangle_measurement("Rectangle 018")
# print(f"Width: {RectangleMeasurement.width}, Height: {RectangleMeasurement.height}")
# print(f"Area: {RectangleMeasurement.area}, Perimeter: {RectangleMeasurement.perimeter}")
# BoxMeasurement = MeasurementOperations.get_box_measurement("Box 019")
# print(f"Width: {BoxMeasurement.width}, Height: {BoxMeasurement.height}, Depth: {BoxMeasurement.depth}")
# print(f"Volume: {BoxMeasurement.volume}, Perimeter: {BoxMeasurement.perimeter}")
# AnnotationMeasurement = MeasurementOperations.get_annotation_measurement("Text Annotation 009")
# print(f"Position: {AnnotationMeasurement.position}, Gray value: {AnnotationMeasurement.gray_value}")
Modifying Measurements​
# if all_measurements:
# # Set measurement points
# MeasurementOperations.set_points(all_measurements[0], [[10.0, 20.0, 30.0]])
#
# # Apply transformation matrix
# # matrix = [1,0,0,0, 0,1,0,0, 0,0,1,0, 10,20,30,1] # Translation example
# # MeasurementOperations.transform([all_measurements[0]], matrix)
#
# # Lock/unlock measurement (locked cannot be moved interactively)
# MeasurementOperations.set_lock([all_measurements[0]], True) # Lock
# MeasurementOperations.set_lock([all_measurements[0]], False) # Unlock
#
# # Set active measurement for editing
# MeasurementOperations.set_active(all_measurements[0])
Snapping to Objects​
# if all_measurements and all_surfaces:
# # Snap measurement points to nearest surface
# MeasurementOperations.snap_to_surface([all_measurements[0]], all_surfaces[0])
# if all_measurements and all_masks:
# # Snap measurement points to nearest mask surface
# MeasurementOperations.snap_to_mask([all_measurements[0]], all_masks[0])
Appearance Settings​
# if all_measurements:
# # Set color (RGB values 0.0-1.0)
# MeasurementOperations.set_color([all_measurements[0]], [1.0, 0.0, 0.0]) # Red
#
# # Set opacity (0.0-1.0)
# MeasurementOperations.set_opacity([all_measurements[0]], 0.8)
#
# # Set line width
# MeasurementOperations.set_line_width([all_measurements[0]], 2.0)
#
# # Set end point (handle) color
# MeasurementOperations.set_end_point_color([all_measurements[0]], [0.0, 1.0, 0.0]) # Green
#
# # Set end point (handle) size factor
# MeasurementOperations.set_end_point_size_factor([all_measurements[0]], 1.5)
Annotation Settings​
# if all_measurements:
# # Set annotation visibility
# MeasurementOperations.set_annotation_visibility([all_measurements[0]], True)
#
# # Set annotation type
# MeasurementOperations.set_annotation_type(
# [all_measurements[0]],
# api.MeasurementAnnotationType.NameAndValue # Name, Value, NameAndValue, Position, NameAndPosition, NotAny
# )
#
# # Set annotation background color
# MeasurementOperations.set_annotation_background_color([all_measurements[0]], [0.0, 0.0, 0.0]) # Black
#
# # Set annotation background opacity
# MeasurementOperations.set_annotation_background_opacity([all_measurements[0]], 0.5)
#
# # Show annotation only on active measurement
# MeasurementOperations.set_annotation_visibility_on_active_only()
Visibility Settings​
# if all_measurements:
# # Set 3D axes visibility
# MeasurementOperations.set_3d_axes_visibility([all_measurements[0]], True)
#
# # Show 3D axes only on active measurement
# MeasurementOperations.set_3d_axes_visibility_on_active_only()
#
# # Set 2D cross visibility in slice views
# MeasurementOperations.set_2d_cross_visibility([all_measurements[0]], True)
#
# # Set handle visibility
# MeasurementOperations.set_handle_visibility([all_measurements[0]], True)
#
# # Set slice views visibility
# MeasurementOperations.set_slice_views_visibility([all_measurements[0]], True)
Always Show Mode​
# Enable "always show" mode (measurements visible even when markup tool inactive)
# MeasurementOperations.set_always_show(True)
# Check if always show is enabled
# is_always_show = MeasurementOperations.is_always_show_enabled()
# print(f"Always show enabled: {is_always_show}")
# Hide/show based on always show flag
# MeasurementOperations.hide_based_on_always_show_flag(True) # Hide
# MeasurementOperations.hide_based_on_always_show_flag(False) # Restore
print("Measurement operations tutorial completed successfully.")
Related Resources​
- API Reference - API documentation
- Quick Reference - Common methods at a glance