volmdlr_tools.features.classification package#

Rule-based feature classification system for categorizing sheet metal features.

Submodules#

volmdlr_tools.features.classification.registry module#

Feature rule registry - the Characteristics Matrix.

Contains all classification rules organized by feature category. Rules are ordered by specificity - more specific rules first.

Based on Tables 1, 2, 3 from Yang Yang et al. (2021).

class volmdlr_tools.features.classification.registry.FeatureRuleRegistry#

Bases: object

Registry holding all classification rules (the Characteristics Matrix).

Rules are organized as tuples for immutability and performance. Each rule set is ordered by specificity - more specific rules should come first.

To add a new feature: 1. Create the feature class in feature_types/sheet_metal/ 2. Add a rule to the appropriate tuple below 3. Ensure the rule is positioned correctly by specificity

COMPOSITE_RULES: tuple[CompositeFeatureRule, ...] = (CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.lances.Lance'>, internal_chains=2, boundary_subchains=0, fan_shaped_faces=8, fan_shaped_pairs=4, share_common_face=True, opposite_normals=True, d1_greater_d2=False, name='ShearWithBridge', description='Bridge feature spanning two sides'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.lances.Lance'>, internal_chains=2, boundary_subchains=0, fan_shaped_faces=8, fan_shaped_pairs=4, share_common_face=True, opposite_normals=True, d1_greater_d2=True, name='CutoutWithBridge', description='Bridge with cut-out feature'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.jogs.Jog'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=(4, None), fan_shaped_pairs=(2, None), share_common_face=True, opposite_normals=True, d1_greater_d2=False, name='ShearWithJog', description='Jog (offset) feature without cut-out'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.jogs.Jog'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=(4, None), fan_shaped_pairs=(2, None), share_common_face=True, opposite_normals=True, d1_greater_d2=True, name='CutoutWithJog', description='Jog with cut-out feature'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.lances.Lance'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=2, fan_shaped_pairs=1, share_common_face=True, opposite_normals=True, d1_greater_d2=False, name='ShearWithLance', description='Lance (tab) feature without cut-out'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.lances.Lance'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=2, fan_shaped_pairs=1, share_common_face=True, opposite_normals=True, d1_greater_d2=True, name='CutoutWithLance', description='Lance with cut-out feature'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.louvres.Louvre'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=(4, None), fan_shaped_pairs=0, share_common_face=True, opposite_normals=False, d1_greater_d2=False, name='ShearWithLouvre', description='Louvre feature without cut-out'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.louvres.Louvre'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=(4, None), fan_shaped_pairs=0, share_common_face=True, opposite_normals=False, d1_greater_d2=True, name='CutoutWithLouvre', description='Louvre with cut-out feature'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.cavities.Cavity'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=(2, None), fan_shaped_pairs=0, share_common_face=False, opposite_normals=True, d1_greater_d2=None, name='CutoutWithBendInternal', description='Internal bend with cut-out feature'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.jogs.Jog'>, internal_chains=0, boundary_subchains=1, fan_shaped_faces=4, fan_shaped_pairs=2, share_common_face=None, opposite_normals=True, d1_greater_d2=False, name='BoundaryJog', description='Jog on boundary'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.jogs.Jog'>, internal_chains=0, boundary_subchains=1, fan_shaped_faces=4, fan_shaped_pairs=2, share_common_face=None, opposite_normals=True, d1_greater_d2=True, name='BoundaryCutoutWithJog', description='Jog with cut-out on boundary'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.bends.Bend'>, internal_chains=0, boundary_subchains=1, fan_shaped_faces=2, fan_shaped_pairs=1, share_common_face=None, opposite_normals=True, d1_greater_d2=False, name='BoundaryBend', description='Simple bend on boundary'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.bends.Bend'>, internal_chains=0, boundary_subchains=1, fan_shaped_faces=2, fan_shaped_pairs=1, share_common_face=None, opposite_normals=True, d1_greater_d2=True, name='BoundaryCutoutWithBend', description='Bend with cut-out on boundary'))#
CUT_RULES: tuple[CutFeatureRule, ...] = (CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.cavities.RoundCavity'>, type_of_chain='Closed', total_faces=(None, 2), cylindrical_surfaces=2, different_radius_values=1, planar_surfaces=0, parallel_planar_pairs=0, all_angles_concave=None, is_fsf_neighbor=None, name='CircularHole', description='Simple circular hole through sheet metal'), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.cavities.RectangularCavity'>, type_of_chain='Closed', total_faces=(4, 8), cylindrical_surfaces=(None, 4), different_radius_values=(None, 1), planar_surfaces=4, parallel_planar_pairs=2, all_angles_concave=None, is_fsf_neighbor=None, name='RectangularHole', description='Simple rectangular hole through sheet metal'), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.cavities.SlottedCavity'>, type_of_chain='Closed', total_faces=(None, 4), cylindrical_surfaces=2, different_radius_values=1, planar_surfaces=2, parallel_planar_pairs=1, all_angles_concave=None, is_fsf_neighbor=None, name='Slot', description='Closed slot with cylindrical ends'), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.cavities.Cavity'>, type_of_chain='Closed', total_faces=(4, 5), cylindrical_surfaces=(2, 3), different_radius_values=2, planar_surfaces=2, parallel_planar_pairs=1, all_angles_concave=None, is_fsf_neighbor=None, name='KeySlot', description='Keyhole-shaped slot with two different radii'), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.corners.Corner'>, type_of_chain='Open', total_faces=(None, 1), cylindrical_surfaces=0, different_radius_values=0, planar_surfaces=1, parallel_planar_pairs=0, all_angles_concave=None, is_fsf_neighbor=None, name='Chanfer', description='Single-face Chanfer corner feature'), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.corners.Corner'>, type_of_chain='Open', total_faces=(None, 1), cylindrical_surfaces=1, different_radius_values=1, planar_surfaces=0, parallel_planar_pairs=0, all_angles_concave=None, is_fsf_neighbor=None, name='RoundCorner', description='Single-face Round corner feature'), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.reliefs.CornerRelief'>, type_of_chain='Open', total_faces=(4, None), cylindrical_surfaces=None, different_radius_values=None, planar_surfaces=None, parallel_planar_pairs=None, all_angles_concave=True, is_fsf_neighbor=None, name='CornerRelief', description=None), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.reliefs.Relief'>, type_of_chain='Open', total_faces=3, cylindrical_surfaces=None, different_radius_values=None, planar_surfaces=None, parallel_planar_pairs=None, all_angles_concave=True, is_fsf_neighbor=True, name='Relief', description=None), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.notches.Notch'>, type_of_chain='Open', total_faces=(1, 3), cylindrical_surfaces=None, different_radius_values=None, planar_surfaces=None, parallel_planar_pairs=None, all_angles_concave=True, is_fsf_neighbor=None, name='Notch', description=None))#
DEFORM_RULES: tuple[DeformFeatureRule, ...] = (DeformFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.deformations.Emboss'>, has_interconnected_faces=True, termination_criterion=1, inner_loop_shape='Circular', name=None, description=None), DeformFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.deformations.Emboss'>, has_interconnected_faces=True, termination_criterion=1, inner_loop_shape='Rectangular', name=None, description=None), DeformFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.deformations.Emboss'>, has_interconnected_faces=True, termination_criterion=1, inner_loop_shape=None, name=None, description=None))#

volmdlr_tools.features.classification.matcher module#

Rule matching logic for feature classification.

Provides RuleMatcher class that compares extracted properties against rule definitions.

class volmdlr_tools.features.classification.matcher.RuleMatcher#

Bases: object

Matches extracted properties against rule definitions.

Supports three types of property matching: - None: matches any value (wildcard) - Exact value: must match exactly - Range tuple (min, max): value must be in range (None means unbounded)

matches_deform_rule(rule: DeformFeatureRule, properties: dict) bool#

Check if properties match a deform feature rule.

Parameters:
  • rule – The deform feature rule to match against

  • properties – Extracted properties from TFCGroup.extract_deform_feature_properties()

Returns:

True if all rule properties match

matches_rule(rule: CutFeatureRule | CompositeFeatureRule, properties: dict) float#

Check if a rule matches a given set of properties.

Parameters:
  • rule – The rule to check

  • properties – The properties to check

Returns:

confidence rate.

static matches_value(rule_value: Any, actual_value: Any) bool#

Check if actual value matches a rule specification.

Parameters:
  • rule_value – The rule’s expected value (None, exact, or range tuple)

  • actual_value – The actual extracted value to check

Returns:

True if value matches the rule specification

volmdlr_tools.features.classification.rules module#

Rule dataclasses for feature classification based on Characteristics Matrix.

These dataclasses represent the rules from Tables 1, 2, 3 in Yang Yang et al. (2021): - CutFeatureRule: Table 1 - Cut features (Slot, Notch, CornerRelief, etc.) - CompositeFeatureRule: Table 2 - Bend/Composite features (Bend, Jog, Lance, Clip) - DeformFeatureRule: Table 3 - Deform features (Emboss)

class volmdlr_tools.features.classification.rules.CompositeFeatureRule(feature_class: type[Feature], internal_chains: int | tuple[int | None, int | None] | None = None, boundary_subchains: int | tuple[int | None, int | None] | None = None, fan_shaped_faces: int | tuple[int | None, int | None] | None = None, fan_shaped_pairs: int | tuple[int | None, int | None] | None = None, share_common_face: bool | None = None, opposite_normals: bool | None = None, d1_greater_d2: bool | None = None, name: str | None = None, description: str | None = None)#

Bases: object

Rule for Table 2 - Bend/Composite Features.

Composite features are characterized by fan-shaped faces and their relationships: - Number of internal chains and boundary sub-chains - Fan-shaped face counts and pairs - Geometric relationships (common face, opposite normals, width comparison)

Features: Bend, Jog, Lance, Clip, ClosedHem, OpenHem

boundary_subchains: int | tuple[int | None, int | None] | None = None#
d1_greater_d2: bool | None = None#
description: str | None = None#
fan_shaped_faces: int | tuple[int | None, int | None] | None = None#
fan_shaped_pairs: int | tuple[int | None, int | None] | None = None#
feature_class: type[Feature]#
internal_chains: int | tuple[int | None, int | None] | None = None#
name: str | None = None#
opposite_normals: bool | None = None#
share_common_face: bool | None = None#
class volmdlr_tools.features.classification.rules.CutFeatureRule(feature_class: type[Feature], type_of_chain: str | None = None, total_faces: int | tuple[int | None, int | None] | None = None, cylindrical_surfaces: int | tuple[int | None, int | None] | None = None, different_radius_values: int | tuple[int | None, int | None] | None = None, planar_surfaces: int | tuple[int | None, int | None] | None = None, parallel_planar_pairs: int | tuple[int | None, int | None] | None = None, all_angles_concave: bool = None, is_fsf_neighbor: bool = None, name: str | None = None, description: str | None = None)#

Bases: object

Rule for Table 1 - Cut Features.

Cut features are characterized by the geometry of the thickness face chain: - type of chain (open/closed) - Number of total faces - Surface types (cylindrical, planar) - Geometric relationships (parallel pairs, radius values)

Features: Slot, Notch, CornerRelief, Cutout, Hole, Tab

all_angles_concave: bool = None#
cylindrical_surfaces: int | tuple[int | None, int | None] | None = None#
description: str | None = None#
different_radius_values: int | tuple[int | None, int | None] | None = None#
feature_class: type[Feature]#
is_fsf_neighbor: bool = None#
name: str | None = None#
parallel_planar_pairs: int | tuple[int | None, int | None] | None = None#
planar_surfaces: int | tuple[int | None, int | None] | None = None#
total_faces: int | tuple[int | None, int | None] | None = None#
type_of_chain: str | None = None#
class volmdlr_tools.features.classification.rules.DeformFeatureRule(feature_class: type[Feature], has_interconnected_faces: bool | None = None, termination_criterion: int | None = None, inner_loop_shape: str | None = None, name: str | None = None, description: str | None = None)#

Bases: object

Rule for Table 3 - Deform Features.

Deform features are characterized by interconnected surface topology: - Presence of interconnected faces - Termination criterion (1 or 2) - Shape of inner loop

Features: Emboss, Louver, Drawn cutout

description: str | None = None#
feature_class: type[Feature]#
has_interconnected_faces: bool | None = None#
inner_loop_shape: str | None = None#
name: str | None = None#
termination_criterion: int | None = None#

Module contents#

Classification module for sheet metal features.

Implements the Characteristics Matrix approach from Yang Yang et al. (2021) for classifying thickness face chain groups into specific feature types.

class volmdlr_tools.features.classification.CompositeFeatureRule(feature_class: type[Feature], internal_chains: int | tuple[int | None, int | None] | None = None, boundary_subchains: int | tuple[int | None, int | None] | None = None, fan_shaped_faces: int | tuple[int | None, int | None] | None = None, fan_shaped_pairs: int | tuple[int | None, int | None] | None = None, share_common_face: bool | None = None, opposite_normals: bool | None = None, d1_greater_d2: bool | None = None, name: str | None = None, description: str | None = None)#

Bases: object

Rule for Table 2 - Bend/Composite Features.

Composite features are characterized by fan-shaped faces and their relationships: - Number of internal chains and boundary sub-chains - Fan-shaped face counts and pairs - Geometric relationships (common face, opposite normals, width comparison)

Features: Bend, Jog, Lance, Clip, ClosedHem, OpenHem

boundary_subchains: int | tuple[int | None, int | None] | None = None#
d1_greater_d2: bool | None = None#
description: str | None = None#
fan_shaped_faces: int | tuple[int | None, int | None] | None = None#
fan_shaped_pairs: int | tuple[int | None, int | None] | None = None#
feature_class: type[Feature]#
internal_chains: int | tuple[int | None, int | None] | None = None#
name: str | None = None#
opposite_normals: bool | None = None#
share_common_face: bool | None = None#
class volmdlr_tools.features.classification.CutFeatureRule(feature_class: type[Feature], type_of_chain: str | None = None, total_faces: int | tuple[int | None, int | None] | None = None, cylindrical_surfaces: int | tuple[int | None, int | None] | None = None, different_radius_values: int | tuple[int | None, int | None] | None = None, planar_surfaces: int | tuple[int | None, int | None] | None = None, parallel_planar_pairs: int | tuple[int | None, int | None] | None = None, all_angles_concave: bool = None, is_fsf_neighbor: bool = None, name: str | None = None, description: str | None = None)#

Bases: object

Rule for Table 1 - Cut Features.

Cut features are characterized by the geometry of the thickness face chain: - type of chain (open/closed) - Number of total faces - Surface types (cylindrical, planar) - Geometric relationships (parallel pairs, radius values)

Features: Slot, Notch, CornerRelief, Cutout, Hole, Tab

all_angles_concave: bool = None#
cylindrical_surfaces: int | tuple[int | None, int | None] | None = None#
description: str | None = None#
different_radius_values: int | tuple[int | None, int | None] | None = None#
feature_class: type[Feature]#
is_fsf_neighbor: bool = None#
name: str | None = None#
parallel_planar_pairs: int | tuple[int | None, int | None] | None = None#
planar_surfaces: int | tuple[int | None, int | None] | None = None#
total_faces: int | tuple[int | None, int | None] | None = None#
type_of_chain: str | None = None#
class volmdlr_tools.features.classification.DeformFeatureRule(feature_class: type[Feature], has_interconnected_faces: bool | None = None, termination_criterion: int | None = None, inner_loop_shape: str | None = None, name: str | None = None, description: str | None = None)#

Bases: object

Rule for Table 3 - Deform Features.

Deform features are characterized by interconnected surface topology: - Presence of interconnected faces - Termination criterion (1 or 2) - Shape of inner loop

Features: Emboss, Louver, Drawn cutout

description: str | None = None#
feature_class: type[Feature]#
has_interconnected_faces: bool | None = None#
inner_loop_shape: str | None = None#
name: str | None = None#
termination_criterion: int | None = None#
class volmdlr_tools.features.classification.FeatureRuleRegistry#

Bases: object

Registry holding all classification rules (the Characteristics Matrix).

Rules are organized as tuples for immutability and performance. Each rule set is ordered by specificity - more specific rules should come first.

To add a new feature: 1. Create the feature class in feature_types/sheet_metal/ 2. Add a rule to the appropriate tuple below 3. Ensure the rule is positioned correctly by specificity

COMPOSITE_RULES: tuple[CompositeFeatureRule, ...] = (CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.lances.Lance'>, internal_chains=2, boundary_subchains=0, fan_shaped_faces=8, fan_shaped_pairs=4, share_common_face=True, opposite_normals=True, d1_greater_d2=False, name='ShearWithBridge', description='Bridge feature spanning two sides'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.lances.Lance'>, internal_chains=2, boundary_subchains=0, fan_shaped_faces=8, fan_shaped_pairs=4, share_common_face=True, opposite_normals=True, d1_greater_d2=True, name='CutoutWithBridge', description='Bridge with cut-out feature'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.jogs.Jog'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=(4, None), fan_shaped_pairs=(2, None), share_common_face=True, opposite_normals=True, d1_greater_d2=False, name='ShearWithJog', description='Jog (offset) feature without cut-out'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.jogs.Jog'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=(4, None), fan_shaped_pairs=(2, None), share_common_face=True, opposite_normals=True, d1_greater_d2=True, name='CutoutWithJog', description='Jog with cut-out feature'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.lances.Lance'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=2, fan_shaped_pairs=1, share_common_face=True, opposite_normals=True, d1_greater_d2=False, name='ShearWithLance', description='Lance (tab) feature without cut-out'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.lances.Lance'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=2, fan_shaped_pairs=1, share_common_face=True, opposite_normals=True, d1_greater_d2=True, name='CutoutWithLance', description='Lance with cut-out feature'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.louvres.Louvre'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=(4, None), fan_shaped_pairs=0, share_common_face=True, opposite_normals=False, d1_greater_d2=False, name='ShearWithLouvre', description='Louvre feature without cut-out'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.louvres.Louvre'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=(4, None), fan_shaped_pairs=0, share_common_face=True, opposite_normals=False, d1_greater_d2=True, name='CutoutWithLouvre', description='Louvre with cut-out feature'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.cavities.Cavity'>, internal_chains=1, boundary_subchains=0, fan_shaped_faces=(2, None), fan_shaped_pairs=0, share_common_face=False, opposite_normals=True, d1_greater_d2=None, name='CutoutWithBendInternal', description='Internal bend with cut-out feature'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.jogs.Jog'>, internal_chains=0, boundary_subchains=1, fan_shaped_faces=4, fan_shaped_pairs=2, share_common_face=None, opposite_normals=True, d1_greater_d2=False, name='BoundaryJog', description='Jog on boundary'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.jogs.Jog'>, internal_chains=0, boundary_subchains=1, fan_shaped_faces=4, fan_shaped_pairs=2, share_common_face=None, opposite_normals=True, d1_greater_d2=True, name='BoundaryCutoutWithJog', description='Jog with cut-out on boundary'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.bends.Bend'>, internal_chains=0, boundary_subchains=1, fan_shaped_faces=2, fan_shaped_pairs=1, share_common_face=None, opposite_normals=True, d1_greater_d2=False, name='BoundaryBend', description='Simple bend on boundary'), CompositeFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.bends.Bend'>, internal_chains=0, boundary_subchains=1, fan_shaped_faces=2, fan_shaped_pairs=1, share_common_face=None, opposite_normals=True, d1_greater_d2=True, name='BoundaryCutoutWithBend', description='Bend with cut-out on boundary'))#
CUT_RULES: tuple[CutFeatureRule, ...] = (CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.cavities.RoundCavity'>, type_of_chain='Closed', total_faces=(None, 2), cylindrical_surfaces=2, different_radius_values=1, planar_surfaces=0, parallel_planar_pairs=0, all_angles_concave=None, is_fsf_neighbor=None, name='CircularHole', description='Simple circular hole through sheet metal'), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.cavities.RectangularCavity'>, type_of_chain='Closed', total_faces=(4, 8), cylindrical_surfaces=(None, 4), different_radius_values=(None, 1), planar_surfaces=4, parallel_planar_pairs=2, all_angles_concave=None, is_fsf_neighbor=None, name='RectangularHole', description='Simple rectangular hole through sheet metal'), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.cavities.SlottedCavity'>, type_of_chain='Closed', total_faces=(None, 4), cylindrical_surfaces=2, different_radius_values=1, planar_surfaces=2, parallel_planar_pairs=1, all_angles_concave=None, is_fsf_neighbor=None, name='Slot', description='Closed slot with cylindrical ends'), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.cavities.Cavity'>, type_of_chain='Closed', total_faces=(4, 5), cylindrical_surfaces=(2, 3), different_radius_values=2, planar_surfaces=2, parallel_planar_pairs=1, all_angles_concave=None, is_fsf_neighbor=None, name='KeySlot', description='Keyhole-shaped slot with two different radii'), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.corners.Corner'>, type_of_chain='Open', total_faces=(None, 1), cylindrical_surfaces=0, different_radius_values=0, planar_surfaces=1, parallel_planar_pairs=0, all_angles_concave=None, is_fsf_neighbor=None, name='Chanfer', description='Single-face Chanfer corner feature'), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.corners.Corner'>, type_of_chain='Open', total_faces=(None, 1), cylindrical_surfaces=1, different_radius_values=1, planar_surfaces=0, parallel_planar_pairs=0, all_angles_concave=None, is_fsf_neighbor=None, name='RoundCorner', description='Single-face Round corner feature'), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.reliefs.CornerRelief'>, type_of_chain='Open', total_faces=(4, None), cylindrical_surfaces=None, different_radius_values=None, planar_surfaces=None, parallel_planar_pairs=None, all_angles_concave=True, is_fsf_neighbor=None, name='CornerRelief', description=None), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.reliefs.Relief'>, type_of_chain='Open', total_faces=3, cylindrical_surfaces=None, different_radius_values=None, planar_surfaces=None, parallel_planar_pairs=None, all_angles_concave=True, is_fsf_neighbor=True, name='Relief', description=None), CutFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.notches.Notch'>, type_of_chain='Open', total_faces=(1, 3), cylindrical_surfaces=None, different_radius_values=None, planar_surfaces=None, parallel_planar_pairs=None, all_angles_concave=True, is_fsf_neighbor=None, name='Notch', description=None))#
DEFORM_RULES: tuple[DeformFeatureRule, ...] = (DeformFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.deformations.Emboss'>, has_interconnected_faces=True, termination_criterion=1, inner_loop_shape='Circular', name=None, description=None), DeformFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.deformations.Emboss'>, has_interconnected_faces=True, termination_criterion=1, inner_loop_shape='Rectangular', name=None, description=None), DeformFeatureRule(feature_class=<class 'volmdlr_tools.features.feature_types.sheet_metal.deformations.Emboss'>, has_interconnected_faces=True, termination_criterion=1, inner_loop_shape=None, name=None, description=None))#
class volmdlr_tools.features.classification.RuleMatcher#

Bases: object

Matches extracted properties against rule definitions.

Supports three types of property matching: - None: matches any value (wildcard) - Exact value: must match exactly - Range tuple (min, max): value must be in range (None means unbounded)

matches_deform_rule(rule: DeformFeatureRule, properties: dict) bool#

Check if properties match a deform feature rule.

Parameters:
  • rule – The deform feature rule to match against

  • properties – Extracted properties from TFCGroup.extract_deform_feature_properties()

Returns:

True if all rule properties match

matches_rule(rule: CutFeatureRule | CompositeFeatureRule, properties: dict) float#

Check if a rule matches a given set of properties.

Parameters:
  • rule – The rule to check

  • properties – The properties to check

Returns:

confidence rate.

static matches_value(rule_value: Any, actual_value: Any) bool#

Check if actual value matches a rule specification.

Parameters:
  • rule_value – The rule’s expected value (None, exact, or range tuple)

  • actual_value – The actual extracted value to check

Returns:

True if value matches the rule specification