radioviz.tools.measurement_tool
Measurement tool module for radioviz application.
This module implements a built-in tool to measure segment lengths and angle amplitudes on image windows. It provides a dock widget with two tables (segments and angles), interactive selection sessions, overlays, and workspace serialization for both JSON and HDF5 formats.
Functions
|
Draw angle overlays. |
|
Draw segment overlays. |
Classes
|
Data class representing an angle measurement. |
|
Workspace specification for an angle measurement. |
|
Table model for displaying angle measurements. |
|
Protocol defining the common interface for measurement data types. |
|
Proxy model for filtering measurements by active image. |
|
Dialog for selecting measurement parameters. |
Tool for measuring segment lengths and angle amplitudes. |
|
|
Controller for the measurement tool. |
|
Dock widget for the measurement tool. |
|
Session for measurement creation. |
|
Measurement types supported by the measurement tool. |
|
Data class representing a segment measurement. |
|
Workspace specification for a segment measurement. |
|
Table model for displaying segment measurements. |
- class radioviz.tools.measurement_tool.AngleMeasurementData(name: str, color: Color, p1: tuple[float, float] | None = None, p2: tuple[float, float] | None = None, p3: tuple[float, float] | None = None, image_controller: ImageWindowController | None = None, session_id: UUID | None = None, measurement_id: UUID | None = None, show_overlay: bool | None = True, show_label: bool | None = False, show_measure: bool | None = True, angle_deg: float | None = None)[source]
Bases:
objectData class representing an angle measurement.
Initialize an AngleMeasurementData instance.
- Parameters:
name (str) – Measurement name
color (Color) – Measurement color
p1 (tuple[float, float], optional) – First point (x, y)
p2 (tuple[float, float], optional) – Vertex point (x, y)
p3 (tuple[float, float], optional) – Third point (x, y)
image_controller (Optional[ImageWindowController]) – Image controller owning the measurement
session_id (Optional[UUID]) – Session identifier
measurement_id (Optional[UUID]) – Unique identifier for the measurement
show_overlay (Optional[bool]) – Whether the overlay is visible
show_label (Optional[bool]) – Whether the label text is visible
show_measure (Optional[bool]) – Whether the measurement value is visible
angle_deg (Optional[float]) – Precomputed angle in degrees
- to_workspace_spec(include_data: bool) AngleMeasurementWorkspaceSpec[source]
Convert this measurement to a workspace specification.
- Parameters:
include_data (bool) – Whether to include computed data
- Returns:
Workspace specification
- Return type:
- Raises:
RuntimeError – when attempting to serialize incomplete geometry
- class radioviz.tools.measurement_tool.AngleMeasurementWorkspaceSpec(id: UUID, name: str, image_controller_id: UUID | None = None, color: tuple[float, float, float] = (0.0, 0.0, 0.0), p1: tuple[float, float] = (0.0, 0.0), p2: tuple[float, float] = (0.0, 0.0), p3: tuple[float, float] = (0.0, 0.0), show_overlay: bool = True, show_label: bool = False, show_measure: bool = True, angle_deg: float = 0.0)[source]
Bases:
objectWorkspace specification for an angle measurement.
- class radioviz.tools.measurement_tool.AngleTableModel(store: ItemStore[AngleMeasurementData], parent: QObject | None = None)[source]
Bases:
ItemModelTable model for displaying angle measurements.
Initialize the angle table model.
- Parameters:
store (AngleStore) – Store containing angle data
parent (QObject, optional) – Parent object
- data_for(item: AngleMeasurementData, column: int, role: int = ItemDataRole.DisplayRole) Any[source]
Return data for an angle cell.
- Parameters:
item (AngleMeasurementData) – Angle data item
column (int) – Column index
role (Qt.ItemDataRole) – Item data role
- Returns:
Cell data
- Return type:
Any
- flags(index: QModelIndex | QPersistentModelIndex, /) ItemFlag[source]
Return item flags for an angle cell.
- Parameters:
index (QModelIndex) – Index of the item
- Returns:
Item flags
- Return type:
Qt.ItemFlag
- set_data_for(item: AngleMeasurementData, column: int, value: Any, role: int = ItemDataRole.DisplayRole) bool[source]
Set data for a specific angle cell.
- Parameters:
item (AngleMeasurementData) – Angle data item
column (int) – Column index
value (Any) – Value to set
role (Qt.ItemDataRole) – Item data role
- Returns:
True if successful
- Return type:
bool
- class radioviz.tools.measurement_tool.MeasurementDataProtocol(*args, **kwargs)[source]
Bases:
ProtocolProtocol defining the common interface for measurement data types.
- class radioviz.tools.measurement_tool.MeasurementFilterProxyModel(parent: QObject | None = None)[source]
Bases:
QSortFilterProxyModelProxy model for filtering measurements by active image.
Initialize the proxy model.
- Parameters:
parent (QObject, optional) – Parent object
- filterAcceptsRow(source_row: int, source_parent: QModelIndex | QPersistentModelIndex) bool[source]
Decide whether a row should be accepted.
- Parameters:
source_row (int) – Row in the source model
source_parent (QModelIndex) – Source parent index
- Returns:
True if accepted
- Return type:
bool
- set_active_image(image_controller: ImageWindowController | None) None[source]
Set the active image controller for filtering.
- Parameters:
image_controller (Optional[ImageWindowController]) – Active image controller
- class radioviz.tools.measurement_tool.MeasurementSelectionDialog(measurement_type: MeasurementType, parent: QWidget | None = None)[source]
Bases:
QDialogDialog for selecting measurement parameters.
Initialize the measurement selection dialog.
- Parameters:
measurement_type (MeasurementType) – Initial measurement type
parent (QWidget, optional) – Parent widget
- _on_measurement_changed(measurement_type: MeasurementType) None[source]
Handle measurement type changes.
- Parameters:
measurement_type (MeasurementType) – New measurement type
- measurement_type_changed
Signal emitted when measurement type is changed.
- class radioviz.tools.measurement_tool.MeasurementTool[source]
Bases:
Tool[MeasurementToolController]Tool for measuring segment lengths and angle amplitudes.
- static _normalize_workspace_id(value: object) str | None[source]
Normalize a workspace id that may be stored as bytes or None.
- Parameters:
value (object) – Raw id value
- Returns:
Normalized string id or None
- Return type:
Optional[str]
- static _require_image_controller(item: SegmentMeasurementData | AngleMeasurementData) ImageWindowController[source]
Return the image controller for a measurement item or raise if missing.
- Parameters:
item (SegmentMeasurementData | AngleMeasurementData) – Segment or angle measurement data
- Returns:
Image window controller for the measurement
- Return type:
- Raises:
RuntimeError – If the measurement has no associated image controller
- create_controller(ctx: ToolContext) MeasurementToolController[source]
Create a controller for this tool.
- Parameters:
ctx (ToolContext) – Tool context
- Returns:
Tool controller
- Return type:
- from_workspace(spec: ToolWorkspace, context: WorkspaceReferenceManager) None[source]
Restore the tool from workspace specification.
- Parameters:
spec (ToolWorkspace) – Workspace specification
context (WorkspaceReferenceManager) – Workspace reference manager
- Raises:
RuntimeError – when no controller is available
- restore_phase() int[source]
Return the restore phase for workspace restore.
- Returns:
Restore phase
- Return type:
int
- to_workspace(include_data: bool) ToolWorkspace[source]
Generate a workspace specification for the measurement tool.
- Parameters:
include_data (bool) – Whether to include computed data
- Returns:
Workspace specification
- Return type:
- description: str = 'A tool to measure segment lengths and angle amplitudes'
Tooltip or description
- name: str = 'Measurement Tool'
Human-readable name
- overlays_to_be_registered: list[OverlaySpec] = [OverlaySpec(overlay_type='measure_segment', overlay_role=<OverlayRole.Permanent: 'permanent'>, renderer=<function draw_segment_overlay>), OverlaySpec(overlay_type='measure_segment', overlay_role=<OverlayRole.Highlight: 'highlight'>, renderer=<function draw_segment_overlay>), OverlaySpec(overlay_type='measure_angle', overlay_role=<OverlayRole.Permanent: 'permanent'>, renderer=<function draw_angle_overlay>), OverlaySpec(overlay_type='measure_angle', overlay_role=<OverlayRole.Highlight: 'highlight'>, renderer=<function draw_angle_overlay>)]
List of overlay specifications to register
- tool_id: str = 'measure'
Unique identifier of the tool
- class radioviz.tools.measurement_tool.MeasurementToolController(tool_ctx: ToolContext, tool: Tool[MeasurementToolController])[source]
Bases:
ToolController[ImageWindowController,MeasurementToolSession]Controller for the measurement tool.
Initialize the measurement tool controller.
- Parameters:
tool_ctx (ToolContext) – Tool context
tool (Tool) – Tool instance
- _handle_selection_changed(selected: MeasurementDataProtocol | None, deselected: MeasurementDataProtocol | None) None[source]
Handle selection changes for measurement data.
- Parameters:
selected (Optional[MeasurementDataProtocol]) – Newly selected measurement
deselected (Optional[MeasurementDataProtocol]) – Deselected measurement
- _on_active_image_changed(new_window_controller: SubWindowController[Any] | None) None[source]
Handle active image changes.
- Parameters:
new_window_controller (SubWindowController[Any]) – New active window controller
- _on_image_about_to_close(image_controller: ImageWindowController) None[source]
Remove measurements associated with the closing image.
- Parameters:
image_controller (ImageWindowController) – Image controller that is closing
- _remove_measurement(item: MeasurementDataType | None, store: ItemStore[MeasurementDataType]) None[source]
Remove a measurement from the store.
- Parameters:
item (Optional[MeasurementDataProtocol]) – Measurement to remove
store (SegmentStore | AngleStore) – Store to remove from
- _sync_angle(angle: AngleMeasurementData) None[source]
Synchronize angle overlays and metadata.
- Parameters:
angle (AngleMeasurementData) – Angle measurement
- _sync_segment(segment: SegmentMeasurementData) None[source]
Synchronize segment overlays and metadata.
- Parameters:
segment (SegmentMeasurementData) – Segment measurement
- count_dependencies_for_image(window_controller: SubWindowController[Any]) int[source]
Count measurement items attached to window_controller.
- create_dock(parent_window: QWidget) MeasurementToolDock[source]
Create and configure the measurement tool dock.
- Parameters:
parent_window (QWidget) – Parent window for the dock widget
- Returns:
Configured dock widget
- Return type:
- create_session(window_controller: ImageWindowController, measurement_type: MeasurementType | None = None, input_data: SegmentMeasurementData | AngleMeasurementData | None = None) MeasurementToolSession[source]
Create a new measurement tool session.
- Parameters:
window_controller (ImageWindowController) – Image window controller
measurement_type (Optional[MeasurementType]) – Measurement type override
input_data (Optional[SegmentMeasurementData | AngleMeasurementData]) – Input data for workspace restore
- Returns:
New tool session
- Return type:
- export_angles_csv(path: Path) None[source]
Export all angle measurements to CSV.
- Parameters:
path (pathlib.Path) – Output file path
- export_segments_csv(path: Path) None[source]
Export all segment measurements to CSV.
- Parameters:
path (pathlib.Path) – Output file path
- finalize_measurement(session_result: ToolSessionResult) None[source]
Finalize a measurement creation.
- Parameters:
session_result (ToolSessionResult) – Tool session result
- invalidate_dependencies_for_image(window_controller: SubWindowController[Any]) int[source]
Remove measurement items attached to window_controller.
Get the menu specifications for the measurement tool.
- Returns:
Menu specifications
- Return type:
list[ToolMenuSpec]
- on_angle_selection_changed(selected: AngleMeasurementData | None, deselected: AngleMeasurementData | None) None[source]
Handle changes to angle selection.
- Parameters:
selected (Optional[AngleMeasurementData]) – Newly selected angle
deselected (Optional[AngleMeasurementData]) – Deselected angle
- on_measurement_type_change(new_type: MeasurementType) None[source]
Handle measurement type changes during selection.
- Parameters:
new_type (MeasurementType) – New measurement type
- on_segment_selection_changed(selected: SegmentMeasurementData | None, deselected: SegmentMeasurementData | None) None[source]
Handle changes to segment selection.
- Parameters:
selected (Optional[SegmentMeasurementData]) – Newly selected segment
deselected (Optional[SegmentMeasurementData]) – Deselected segment
- remove_angle(item: AngleMeasurementData | None) None[source]
Remove an angle measurement.
- Parameters:
item (Optional[AngleMeasurementData]) – Angle measurement to remove
- remove_segment(item: SegmentMeasurementData | None) None[source]
Remove a segment measurement.
- Parameters:
item (Optional[SegmentMeasurementData]) – Segment measurement to remove
- update_angle_fields(event: StoreEvent, data: AngleMeasurementData | None = None, index: int = 0) None[source]
Sync angle overlays after store updates.
- update_segment_fields(event: StoreEvent, data: SegmentMeasurementData | None = None, index: int = 0) None[source]
Sync segment overlays after store updates.
- class radioviz.tools.measurement_tool.MeasurementToolDock(parent: QWidget, controller: MeasurementToolController)[source]
Bases:
ToolDockWidget[MeasurementToolController]Dock widget for the measurement tool.
Initialize the measurement tool dock.
- Parameters:
parent (QWidget) – Parent widget
controller (MeasurementToolController) – Measurement tool controller
- _set_default_action(measurement_type: MeasurementType) None[source]
Set the default action for the add button.
- Parameters:
measurement_type (MeasurementType) – Measurement type to set as default
- on_angle_selected(selected: QItemSelection, deselected: QItemSelection) None[source]
Handle angle selection changes.
- on_request_to_change_angle_selection(index: QModelIndex, flags: SelectionFlag) None[source]
Update angle selection from controller.
- on_request_to_change_segment_selection(index: QModelIndex, flags: SelectionFlag) None[source]
Update segment selection from controller.
- on_segment_selected(selected: QItemSelection, deselected: QItemSelection) None[source]
Handle segment selection changes.
- on_window_controller_changed(window_controller: SubWindowController[Any] | None) None[source]
Handle window controller changes.
- Parameters:
window_controller (Optional[SubWindowController[Any]]) – Active window controller
- class radioviz.tools.measurement_tool.MeasurementToolSession(tool_controller: MeasurementToolController, window_controller: ImageWindowController, measurement_type: MeasurementType, input_data: SegmentMeasurementData | AngleMeasurementData | None = None)[source]
Bases:
BaseToolSession[MeasurementToolController,ImageWindowController]Session for measurement creation.
Initialize the measurement tool session.
- Parameters:
tool_controller (MeasurementToolController) – Measurement tool controller
window_controller (ImageWindowController) – Image window controller
measurement_type (MeasurementType) – Measurement type
input_data (Optional[SegmentMeasurementData | AngleMeasurementData]) – Input data for workspace restore
- _angle_overlay_from_data() OverlayModel[source]
Build angle overlay from current angle data.
- Returns:
Overlay model
- Return type:
- _segment_overlay_from_data() OverlayModel[source]
Build segment overlay from current segment data.
- Returns:
Overlay model
- Return type:
- _setup_interactive(measurement_type: MeasurementType) None[source]
Initialize selector and data for the requested measurement type.
- Parameters:
measurement_type (MeasurementType) – Measurement type to initialize
- on_cancel(reason: str) None[source]
Cancel the session.
- Parameters:
reason (str) – Reason for cancellation
- switch_measurement_type(new_type: MeasurementType) None[source]
Switch the active measurement type during an interactive session.
- Parameters:
new_type (MeasurementType) – New measurement type
- class radioviz.tools.measurement_tool.MeasurementType(*values)[source]
Bases:
StrEnumMeasurement types supported by the measurement tool.
- static _generate_next_value_(name, start, count, last_values)
Return the lower-cased version of the member name.
- class radioviz.tools.measurement_tool.SegmentMeasurementData(name: str, color: Color, p1: tuple[float, float] | None = None, p2: tuple[float, float] | None = None, image_controller: ImageWindowController | None = None, session_id: UUID | None = None, measurement_id: UUID | None = None, show_overlay: bool | None = True, show_label: bool | None = False, show_measure: bool | None = True, pixel_size_m: tuple[float, float] | None = None, length_px: float | None = None, length_m: float | None = None, unit_name: str | None = None)[source]
Bases:
objectData class representing a segment measurement.
Initialize a SegmentMeasurementData instance.
- Parameters:
name (str) – Measurement name
color (Color) – Measurement color
p1 (tuple[float, float], optional) – Start point (x, y)
p2 (tuple[float, float], optional) – End point (x, y)
image_controller (Optional[ImageWindowController]) – Image controller owning the measurement
session_id (Optional[UUID]) – Session identifier
measurement_id (Optional[UUID]) – Unique identifier for the measurement
show_overlay (Optional[bool]) – Whether the overlay is visible
show_label (Optional[bool]) – Whether the label text is visible
show_measure (Optional[bool]) – Whether the measurement value is visible
pixel_size_m (Optional[tuple[float, float]]) – Pixel size in meters (x, y)
length_px (Optional[float]) – Precomputed length in pixels
length_m (Optional[float]) – Precomputed length in meters
unit_name (Optional[str]) – Display unit name for calibrated length
- length_display() str[source]
Format the calibrated length for display.
- Returns:
Formatted length string or ‘n/a’
- Return type:
str
- measurement_display() str[source]
Format the preferred measurement value for display.
- Returns:
Measurement display string
- Return type:
str
- to_workspace_spec(include_data: bool) SegmentMeasurementWorkspaceSpec[source]
Convert this measurement to a workspace specification.
- Parameters:
include_data (bool) – Whether to include computed data
- Returns:
Workspace specification
- Return type:
- Raises:
RuntimeError – when attempting to serialize incomplete geometry
- class radioviz.tools.measurement_tool.SegmentMeasurementWorkspaceSpec(id: UUID, name: str, image_controller_id: UUID | None = None, color: tuple[float, float, float] = (0.0, 0.0, 0.0), p1: tuple[float, float] = (0.0, 0.0), p2: tuple[float, float] = (0.0, 0.0), show_overlay: bool = True, show_label: bool = False, show_measure: bool = True, length_px: float = 0.0, length_m: float | None = None, unit_name: str | None = None, pixel_size_m: tuple[float, float] | None = None)[source]
Bases:
objectWorkspace specification for a segment measurement.
- class radioviz.tools.measurement_tool.SegmentTableModel(store: ItemStore[SegmentMeasurementData], parent: QObject | None = None)[source]
Bases:
ItemModelTable model for displaying segment measurements.
Initialize the segment table model.
- Parameters:
store (SegmentStore) – Store containing segment data
parent (QObject, optional) – Parent object
- data_for(item: SegmentMeasurementData, column: int, role: int = ItemDataRole.DisplayRole) Any[source]
Return data for a segment cell.
- Parameters:
item (SegmentMeasurementData) – Segment data item
column (int) – Column index
role (Qt.ItemDataRole) – Item data role
- Returns:
Cell data
- Return type:
Any
- flags(index: QModelIndex | QPersistentModelIndex, /) ItemFlag[source]
Return item flags for a segment cell.
- Parameters:
index (QModelIndex) – Index of the item
- Returns:
Item flags
- Return type:
Qt.ItemFlag
- set_data_for(item: SegmentMeasurementData, column: int, value: Any, role: int = ItemDataRole.DisplayRole) bool[source]
Set data for a specific segment cell.
- Parameters:
item (SegmentMeasurementData) – Segment data item
column (int) – Column index
value (Any) – Value to set
role (Qt.ItemDataRole) – Item data role
- Returns:
True if successful
- Return type:
bool
- radioviz.tools.measurement_tool._segment_caps(p1: tuple[float, float], p2: tuple[float, float], cap_length: float) list[Line2D][source]
Create cap lines for a segment.
- Parameters:
p1 (tuple[float, float]) – Segment start point
p2 (tuple[float, float]) – Segment end point
cap_length (float) – Cap length in data units
- Returns:
List of Line2D cap artists
- Return type:
list[Line2D]
- radioviz.tools.measurement_tool.draw_angle_overlay(overlay: OverlayModel, axes: Axes) list[Artist][source]
Draw angle overlays.
- Parameters:
overlay (OverlayModel) – Overlay model
axes (matplotlib.axes.Axes) – Matplotlib axes
- Returns:
List of artists
- Return type:
list
- radioviz.tools.measurement_tool.draw_segment_overlay(overlay: OverlayModel, axes: Axes) list[Artist][source]
Draw segment overlays.
- Parameters:
overlay (OverlayModel) – Overlay model
axes (matplotlib.axes.Axes) – Matplotlib axes
- Returns:
List of artists
- Return type:
list