editor › Globals › SymmetryExtractor
Class: SymmetryExtractor
This class searches for symmetries in the give meshes using the following approach.
- Assemblies are added using SymmetryExtractor.addAssembly.
- 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 / \ / \
- Sample the feature pairwise to extract candidate symmetry planes. e.g. symmetric pair: ---X X---
non-symmetric pair: / / ---X X
- Deduplicate the candidates
- 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
- _addMakerAsset
- _addMesh
- _addOrnamentDescriptor
- _addParametricHoleDescriptor
- _addRoundCornerDescriptor
- _addRoundEdgeDescriptor
- _assignWeightToMappedFeatures
- _compareTwoFeatures
- _computeMiddleDimensionConceptionPosition
- _convertRawFeatures
- _deduplicateFeaturesInFeatureGroup
- _deduplicateSurfaceNormalsInFeatureGroup
- _deduplicateSymmetryAxes
- _deduplicateSymmetryAxisCandidates
- _deduplicateSymmetryPlaneCandidates
- _deduplicateSymmetryPlanes
- _evaluateInfiniteOrderCandidate
- _extractInfiniteOrderCandidates
- _extractReflectionalSymmetries
- _extractRotationalSymmetries
- _extractSymmetryCandidates
- _featureIsOnAxis
- _featureIsOnPlane
- _getAdditionalRotationCandidates
- _getBestFeatureMatch
- _getFeatures
- _getRadiusSizePenalty
- _getReflectionalMatches
- _getRotationalCounterParts
- _getRotationalMatches
- _getScalePenalty
- _getSymmetryCandidateFromTwoFeatures
- _isReflectionalCandidate
- _mapToSymmetryCoordinates
- _sampleArray
- addAssembly
- addModelElement
- addModelElements
- evaluateSymmetryCandidate
- extractReflectionalSymmetries
- extractRotationalSymmetries
- extractSymmetries
- removeFeatures
- scoreFeatureOnExistingSymmetries
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.
-
reflectionalCandidates: IReflectionalSymmetryCandidate[]
-
rotationalCandidates: IRotationalSymmetryCandidate[]
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[]