Skip to content

editorGlobalsSymmetryExtractor

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

_sampleArrayT›(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[]