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:
objectRegistry 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:
objectMatches 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:
objectRule 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#
- internal_chains: int | tuple[int | None, int | None] | None = None#
- name: str | None = None#
- opposite_normals: 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:
objectRule 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#
- 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:
objectRule 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#
- 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:
objectRule 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#
- internal_chains: int | tuple[int | None, int | None] | None = None#
- name: str | None = None#
- opposite_normals: 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:
objectRule 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#
- 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:
objectRule 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#
- 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:
objectRegistry 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:
objectMatches 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