Skip to content

editor › Globals › SymmetryExtractor

Class: SymmetryExtractor

This class searches for symmetries in the give meshes using the following approach.

  1. Assemblies are added using SymmetryExtractor.addAssembly.
  2. Features are extracted from the given meshes of the assembly. A feature is a vertex and the vertex normal e.g. for the meshes A and B.

\ / \ / \ / \ / X-------X X-------X | | / \ | B | | |/ \ | | | X-----------X-------X | A |\ | | \ X---------------------------X / \ / \

  1. Sample the feature pairwise to extract candidate symmetry planes. e.g. symmetric pair: ---X X---

non-symmetric pair: / / ---X X

  1. Deduplicate the candidates
  2. Test the candidates for their quality by examining the local geometry around each feature. The space around the feature is sampled randomly, for each sample it is evaluated whether the sample lies inside or outside the mesh and we expect to find the same situation in the mirrored position. The ratio of samples that passed this test is considered the quality of that symmetry plane.

Hierarchy

  • SymmetryExtractor

Index

Properties

Methods

Properties

Private axisTestCache

• axisTestCache: Map‹Vector3[], number› = new Map()

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:136


Private features

• features: IFeature[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:134


Private logisticFunctionSmootheningFactor

• logisticFunctionSmootheningFactor: number = 0.8

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:137


Private planeTestCache

• planeTestCache: Map‹Plane, number› = new Map()

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:135


Private rawFeatures

• rawFeatures: IRawFeature[] = []

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:133

Methods

Private _addMakerAsset

▸ _addMakerAsset(makerAsset: MakerAsset): IRawFeature

Defined in src/modules/kyub.core.symmetry/src/FeatureExtractor.ts:38

Parameters:

Name Type
makerAsset MakerAsset

Returns: IRawFeature


Private _addMesh

▸ _addMesh(mesh: Mesh, mapLocalPositionToGlobal?: function, mapLocalDirectionToGlobal?: function): IRawFeature[]

Defined in src/modules/kyub.core.symmetry/src/FeatureExtractor.ts:200

Parameters:

▪ mesh: Mesh

▪Optional mapLocalPositionToGlobal: function

▸ (position: Vector3): Vector3

Parameters:

Name Type
position Vector3

▪Optional mapLocalDirectionToGlobal: function

▸ (direction: Vector3): Vector3

Parameters:

Name Type
direction Vector3

Returns: IRawFeature[]


Private _addOrnamentDescriptor

▸ _addOrnamentDescriptor(ornamentDescriptor: OrnamentDescriptor): IRawFeature

Defined in src/modules/kyub.core.symmetry/src/FeatureExtractor.ts:83

Parameters:

Name Type
ornamentDescriptor OrnamentDescriptor

Returns: IRawFeature


Private _addParametricHoleDescriptor

▸ _addParametricHoleDescriptor(parametricHoleDescriptor: ParametricHoleDescriptor): IRawFeature

Defined in src/modules/kyub.core.symmetry/src/FeatureExtractor.ts:56

Parameters:

Name Type
parametricHoleDescriptor ParametricHoleDescriptor

Returns: IRawFeature


Private _addRoundCornerDescriptor

▸ _addRoundCornerDescriptor(roundCornerDescriptor: RoundCornerDescriptor): IRawFeature

Defined in src/modules/kyub.core.symmetry/src/FeatureExtractor.ts:111

Parameters:

Name Type
roundCornerDescriptor RoundCornerDescriptor

Returns: IRawFeature


Private _addRoundEdgeDescriptor

▸ _addRoundEdgeDescriptor(roundEdgeDescriptor: RoundEdgeDescriptor): IRawFeature[]

Defined in src/modules/kyub.core.symmetry/src/FeatureExtractor.ts:150

Parameters:

Name Type
roundEdgeDescriptor RoundEdgeDescriptor

Returns: IRawFeature[]


Private _assignWeightToMappedFeatures

▸ _assignWeightToMappedFeatures(mappedFeatures: IMappedFeature[]): IMappedFeature[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:538

Parameters:

Name Type
mappedFeatures IMappedFeature[]

Returns: IMappedFeature[]


Private _compareTwoFeatures

▸ _compareTwoFeatures(mappedFeature: IMappedFeature, otherMappedFeature: IMappedFeature, transformedPosition: Vector3, transformedNormal: Vector3): number

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:688

Parameters:

Name Type
mappedFeature IMappedFeature
otherMappedFeature IMappedFeature
transformedPosition Vector3
transformedNormal Vector3

Returns: number


Private _computeMiddleDimensionConceptionPosition

▸ _computeMiddleDimensionConceptionPosition(featureGroup: IRawFeature[]): Vector3

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:1116

Parameters:

Name Type
featureGroup IRawFeature[]

Returns: Vector3


Private _convertRawFeatures

▸ _convertRawFeatures(): void

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:1021

Returns: void


Private _deduplicateFeaturesInFeatureGroup

▸ _deduplicateFeaturesInFeatureGroup(group: IRawFeature[]): IRawFeature[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:1086

Parameters:

Name Type
group IRawFeature[]

Returns: IRawFeature[]


Private _deduplicateSurfaceNormalsInFeatureGroup

▸ _deduplicateSurfaceNormalsInFeatureGroup(group: IRawFeature[]): IRawFeature[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:1098

Parameters:

Name Type
group IRawFeature[]

Returns: IRawFeature[]


Private _deduplicateSymmetryAxes

▸ _deduplicateSymmetryAxes(symmetries: IRotationalSymmetry[]): IRotationalSymmetry[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:992

Parameters:

Name Type
symmetries IRotationalSymmetry[]

Returns: IRotationalSymmetry[]


Private _deduplicateSymmetryAxisCandidates

▸ _deduplicateSymmetryAxisCandidates(candidates: IRotationalSymmetryCandidate[]): IRotationalSymmetryCandidate[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:949

Parameters:

Name Type
candidates IRotationalSymmetryCandidate[]

Returns: IRotationalSymmetryCandidate[]


Private _deduplicateSymmetryPlaneCandidates

▸ _deduplicateSymmetryPlaneCandidates(candidates: IReflectionalSymmetryCandidate[]): IReflectionalSymmetryCandidate[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:922

Parameters:

Name Type
candidates IReflectionalSymmetryCandidate[]

Returns: IReflectionalSymmetryCandidate[]


_deduplicateSymmetryPlanes

▸ _deduplicateSymmetryPlanes(symmetries: IReflectionalSymmetry[]): IReflectionalSymmetry[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:340

Parameters:

Name Type
symmetries IReflectionalSymmetry[]

Returns: IReflectionalSymmetry[]


Private _evaluateInfiniteOrderCandidate

▸ _evaluateInfiniteOrderCandidate(candidate: IRotationalSymmetryCandidate): IRotationalSymmetry

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:465

Parameters:

Name Type
candidate IRotationalSymmetryCandidate

Returns: IRotationalSymmetry


Private _extractInfiniteOrderCandidates

▸ _extractInfiniteOrderCandidates(): IRotationalSymmetryCandidate[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:438

Returns: IRotationalSymmetryCandidate[]


Private _extractReflectionalSymmetries

▸ _extractReflectionalSymmetries(minimumQuality: number, filter: function, reflectionalCandidates: IReflectionalSymmetryCandidate[]): IReflectionalSymmetry[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:388

Parameters:

▪Default value minimumQuality: number= 0

▪Default value filter: function= () => true

▸ (candidate: IReflectionalSymmetryCandidate): boolean

Parameters:

Name Type
candidate IReflectionalSymmetryCandidate

▪Default value reflectionalCandidates: IReflectionalSymmetryCandidate[]= []

Returns: IReflectionalSymmetry[]


Private _extractRotationalSymmetries

▸ _extractRotationalSymmetries(minimumQuality: number, filter: function, rotationalCandidates: IRotationalSymmetryCandidate[]): IRotationalSymmetry[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:402

Parameters:

▪Default value minimumQuality: number= 0

▪Default value filter: function= () => true

▸ (candidate: IRotationalSymmetryCandidate): boolean

Parameters:

Name Type
candidate IRotationalSymmetryCandidate

▪Default value rotationalCandidates: IRotationalSymmetryCandidate[]= []

Returns: IRotationalSymmetry[]


Private _extractSymmetryCandidates

▸ _extractSymmetryCandidates(maxSamples: any): object

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:742

Parameters:

Name Type Default Description
maxSamples any Config.get("symmetryDetection.maxSampleSize") defines accuracy by setting maximum amount of comparisons between points

Returns: object

possible symmetries in the model as proposed by two points that are symmetric

At first we find reflectional and rotational candidates by looking at all pairs of features. To improve performance we only look at maxSamples pairs by choosing random pairs if there are too many features. After finding the candidates we also limit the maximum number of candidates by throwing out the ones with the lowest score.


Private _featureIsOnAxis

▸ _featureIsOnAxis(mappedFeature: any): boolean

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:659

Parameters:

Name Type
mappedFeature any

Returns: boolean


Private _featureIsOnPlane

▸ _featureIsOnPlane(mappedFeature: any): boolean

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:603

Parameters:

Name Type
mappedFeature any

Returns: boolean


Private _getAdditionalRotationCandidates

▸ _getAdditionalRotationCandidates(reflectionalCandidates: IReflectionalSymmetryCandidate[]): IRotationalSymmetryCandidate[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:874

Parameters:

Name Type
reflectionalCandidates IReflectionalSymmetryCandidate[]

Returns: IRotationalSymmetryCandidate[]


Private _getBestFeatureMatch

▸ _getBestFeatureMatch(mappedFeature: IMappedFeature, mappedFeatures: IMappedFeature[], transformedPosition: Vector3, transformedNormal: Vector3): number

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:667

Parameters:

Name Type
mappedFeature IMappedFeature
mappedFeatures IMappedFeature[]
transformedPosition Vector3
transformedNormal Vector3

Returns: number


Private _getFeatures

▸ _getFeatures(): IFeature[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:424

Returns: IFeature[]


Private _getRadiusSizePenalty

▸ _getRadiusSizePenalty(feature1: IFeature, feature2: IFeature): number

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:719

Parameters:

Name Type
feature1 IFeature
feature2 IFeature

Returns: number


Private _getReflectionalMatches

▸ _getReflectionalMatches(mappedFeatures: IMappedFeature[]): number

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:569

Parameters:

Name Type
mappedFeatures IMappedFeature[]

Returns: number


Private _getRotationalCounterParts

▸ _getRotationalCounterParts(mappedFeature: IMappedFeature, order: number): Array‹object›

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:639

Parameters:

Name Type
mappedFeature IMappedFeature
order number

Returns: Array‹object›


Private _getRotationalMatches

▸ _getRotationalMatches(mappedFeatures: IMappedFeature[], candidate: IRotationalSymmetryCandidate): number

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:609

Parameters:

Name Type
mappedFeatures IMappedFeature[]
candidate IRotationalSymmetryCandidate

Returns: number


Private _getScalePenalty

▸ _getScalePenalty(feature1: IFeature, feature2: IFeature): number

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:705

Parameters:

Name Type
feature1 IFeature
feature2 IFeature

Returns: number


Private _getSymmetryCandidateFromTwoFeatures

▸ _getSymmetryCandidateFromTwoFeatures(feature: IFeature, otherFeature: IFeature): IReflectionalSymmetryCandidate | IRotationalSymmetryCandidate

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:811

Parameters:

Name Type
feature IFeature
otherFeature IFeature

Returns: IReflectionalSymmetryCandidate | IRotationalSymmetryCandidate


Private _isReflectionalCandidate

▸ _isReflectionalCandidate(candidate: IReflectionalSymmetryCandidate | IRotationalSymmetryCandidate): candidate is IReflectionalSymmetryCandidate

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:432

Parameters:

Name Type
candidate IReflectionalSymmetryCandidate | IRotationalSymmetryCandidate

Returns: candidate is IReflectionalSymmetryCandidate


Private _mapToSymmetryCoordinates

▸ _mapToSymmetryCoordinates(feature: IFeature, transforms: Transforms): IMappedFeature

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:550

Parameters:

Name Type
feature IFeature
transforms Transforms

Returns: IMappedFeature


Private _sampleArray

▸ _sampleArray‹T›(features: T[]): T

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:918

Type parameters:

▪ T

Parameters:

Name Type
features T[]

Returns: T


addAssembly

▸ addAssembly(assembly: Assembly): void

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:361

Parameters:

Name Type
assembly Assembly

Returns: void


addModelElement

▸ addModelElement(modelElement: IModelElement, mapLocalPositionToGlobal?: function, mapLocalDirectionToGlobal?: function): IRawFeature[]

Defined in src/modules/kyub.core.symmetry/src/FeatureExtractor.ts:15

Parameters:

▪ modelElement: IModelElement

▪Optional mapLocalPositionToGlobal: function

▸ (position: Vector3): Vector3

Parameters:

Name Type
position Vector3

▪Optional mapLocalDirectionToGlobal: function

▸ (direction: Vector3): Vector3

Parameters:

Name Type
direction Vector3

Returns: IRawFeature[]


addModelElements

▸ addModelElements(modelElements: Iterable‹IModelElement›, mapLocalPositionToGlobal?: function, mapLocalDirectionToGlobal?: function): void

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:365

Parameters:

▪ modelElements: Iterable‹IModelElement›

▪Optional mapLocalPositionToGlobal: function

▸ (position: Vector3): Vector3

Parameters:

Name Type
position Vector3

▪Optional mapLocalDirectionToGlobal: function

▸ (direction: Vector3): Vector3

Parameters:

Name Type
direction Vector3

Returns: void


evaluateSymmetryCandidate

▸ evaluateSymmetryCandidate(candidate: IReflectionalSymmetryCandidate): IReflectionalSymmetry

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:207

Evaluate the quality of the symmetry described by either a given symmetry plane or a symmetry axis

Parameters:

Name Type
candidate IReflectionalSymmetryCandidate

Returns: IReflectionalSymmetry

▸ evaluateSymmetryCandidate(candidate: IRotationalSymmetryCandidate): IRotationalSymmetry

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:208

Parameters:

Name Type
candidate IRotationalSymmetryCandidate

Returns: IRotationalSymmetry


extractReflectionalSymmetries

▸ extractReflectionalSymmetries(minimumQuality: number, filter: function): IReflectionalSymmetry[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:180

Find reflectional symmetries in the meshes, singleSurfaceDescriptors, roundEdgeDescriptors and roundCornerDescriptors added to this instance.

Parameters:

▪Default value minimumQuality: number= 0

Only symmetries with quality of at least minimumQuality will be returned. Should be in [0,1].

▪Default value filter: function= () => true

This allows you to filter the reflectional symmetry candidates before their quality is determined, which is an expensive operation. The passed candidate is in mesh coordinates.

▸ (candidate: IReflectionalSymmetryCandidate): boolean

Parameters:

Name Type
candidate IReflectionalSymmetryCandidate

Returns: IReflectionalSymmetry[]


extractRotationalSymmetries

▸ extractRotationalSymmetries(minimumQuality: number, filter: function): IRotationalSymmetry[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:195

Find reflectional and rotational symmetries in the meshes, singleSurfaceDescriptors, roundEdgeDescriptors and roundCornerDescriptors added to this instance.

Parameters:

▪Default value minimumQuality: number= 0

Only symmetries with quality of at least minimumQuality will be returned. Should be in [0,1].

▪Default value filter: function= () => true

This allows you to filter the rotational symmetry candidates before their quality is determined, which is an expensive operation. The passed candidate is in mesh coordinates.

▸ (candidate: IRotationalSymmetryCandidate): boolean

Parameters:

Name Type
candidate IRotationalSymmetryCandidate

Returns: IRotationalSymmetry[]


extractSymmetries

▸ extractSymmetries(minimumQuality: number, reflectionFilter: function, rotationFilter: function): ISymmetryDetectionResult

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:147

Find reflectional and rotational symmetries in the meshes, singleSurfaceDescriptors, roundEdgeDescriptors and roundCornerDescriptors added to this instance.

Parameters:

▪Default value minimumQuality: number= 0

Only symmetries with quality of at least minimumQuality will be returned. Should be in [0,1].

▪Default value reflectionFilter: function= () => true

This allows you to filter the reflectional symmetry candidates before their quality is determined, which is an expensive operation. The passed candidate is in mesh coordinates.

▸ (candidate: IReflectionalSymmetryCandidate): boolean

Parameters:

Name Type
candidate IReflectionalSymmetryCandidate

▪Default value rotationFilter: function= () => true

This allows you to filter the rotational symmetry candidates before their quality is determined, which is an expensive operation. The passed candidate is in mesh coordinates.

▸ (candidate: IRotationalSymmetryCandidate): boolean

Parameters:

Name Type
candidate IRotationalSymmetryCandidate

Returns: ISymmetryDetectionResult


removeFeatures

▸ removeFeatures(): void

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:383

Returns: void


scoreFeatureOnExistingSymmetries

▸ scoreFeatureOnExistingSymmetries(position: Vector3, normal: Vector3, featureType: string, reflectionalSymmetries: IReflectionalSymmetry[], rotationalSymmetries: IRotationalSymmetry[]): number[]

Defined in src/modules/kyub.core.symmetry/src/SymmetryExtractor.ts:268

Parameters:

Name Type
position Vector3
normal Vector3
featureType string
reflectionalSymmetries IReflectionalSymmetry[]
rotationalSymmetries IRotationalSymmetry[]

Returns: number[]