Browse Source

mol-model: Loci.Bundle

David Sehnal 5 years ago
parent
commit
2daac955f4

+ 2 - 3
src/mol-model/loci.ts

@@ -54,9 +54,8 @@ export { Loci }
 type Loci = StructureElement.Loci | Structure.Loci | Link.Loci | EveryLoci | EmptyLoci | DataLoci | Shape.Loci | ShapeGroup.Loci
 
 namespace Loci {
-    export type Pair = { lociA: Loci, lociB: Loci }
-    export type Triple = { lociA: Loci, lociB: Loci, lociC: Loci }
-    export type Quad = { lociA: Loci, lociB: Loci, lociC: Loci, lociD: Loci }
+    interface FiniteArray<T, L extends number = number> extends ReadonlyArray<T> { length: L };
+    export interface Bundle<L extends number> { loci: FiniteArray<Loci, L> }
 
     export function areEqual(lociA: Loci, lociB: Loci) {
         if (isEveryLoci(lociA) && isEveryLoci(lociB)) return true

+ 3 - 3
src/mol-plugin/state/transforms/helpers.ts

@@ -30,14 +30,14 @@ export async function ensureSecondaryStructure(s: Structure) {
 export function getDistanceDataFromStructureSelections(s: ReadonlyArray<PluginStateObject.Molecule.Structure.SelectionEntry>): DistanceData {
     const lociA = s[0].loci
     const lociB = s[1].loci
-    return { pairs: [{ lociA, lociB }] }
+    return { pairs: [ { loci: [lociA, lociB] as const }] }
 }
 
 export function getAngleDataFromStructureSelections(s: ReadonlyArray<PluginStateObject.Molecule.Structure.SelectionEntry>): AngleData {
     const lociA = s[0].loci
     const lociB = s[1].loci
     const lociC = s[2].loci
-    return { triples: [{ lociA, lociB, lociC }] }
+    return { triples: [{ loci: [lociA, lociB, lociC] as const }] }
 }
 
 export function getDihedralDataFromStructureSelections(s: ReadonlyArray<PluginStateObject.Molecule.Structure.SelectionEntry>): DihedralData {
@@ -45,7 +45,7 @@ export function getDihedralDataFromStructureSelections(s: ReadonlyArray<PluginSt
     const lociB = s[1].loci
     const lociC = s[2].loci
     const lociD = s[3].loci
-    return { quads: [{ lociA, lociB, lociC, lociD }] }
+    return { quads: [{ loci: [lociA, lociB, lociC, lociD] as const }] }
 }
 
 export function getLabelDataFromStructureSelections(s: ReadonlyArray<PluginStateObject.Molecule.Structure.SelectionEntry>): LabelData {

+ 4 - 4
src/mol-repr/shape/loci/angle.ts

@@ -24,7 +24,7 @@ import { Circle } from '../../../mol-geo/primitive/circle';
 import { transformPrimitive } from '../../../mol-geo/primitive/primitive';
 
 export interface AngleData {
-    triples: Loci.Triple[]
+    triples: Loci.Bundle<3>[]
 }
 
 const SharedParams = {
@@ -106,11 +106,11 @@ type AngleState = ReturnType<typeof getAngleState>
 const tmpVec = Vec3()
 const tmpMat = Mat4()
 
-function setAngleState(triple: Loci.Triple, state: AngleState, arcScale: number) {
+function setAngleState(triple: Loci.Bundle<3>, state: AngleState, arcScale: number) {
     const { pointA, pointB, pointC } = state
     const { arcDirA, arcDirC, arcNormal } = state
 
-    const { lociA, lociB, lociC } = triple
+    const [lociA, lociB, lociC] = triple.loci
     Loci.getCenter(lociA, pointA)
     Loci.getCenter(lociB, pointB)
     Loci.getCenter(lociC, pointC)
@@ -142,7 +142,7 @@ function getCircle(state: AngleState, segmentLength?: number) {
 
 const tmpState = getAngleState()
 
-function angleLabel(triple: Loci.Triple, arcScale: number) {
+function angleLabel(triple: Loci.Bundle<3>, arcScale: number) {
     setAngleState(triple, tmpState, arcScale)
     const angle = radToDeg(tmpState.angle).toFixed(2)
     return `Angle ${angle}\u00B0`

+ 4 - 4
src/mol-repr/shape/loci/dihedral.ts

@@ -24,7 +24,7 @@ import { Circle } from '../../../mol-geo/primitive/circle';
 import { transformPrimitive } from '../../../mol-geo/primitive/primitive';
 
 export interface DihedralData {
-    quads: Loci.Quad[]
+    quads: Loci.Bundle<4>[]
 }
 
 const SharedParams = {
@@ -124,11 +124,11 @@ const tmpVec = Vec3()
 const tmpMat = Mat4()
 
 // TODO improper dihedrals are not handled correctly
-function setDihedralState(quad: Loci.Quad, state: DihedralState, arcScale: number) {
+function setDihedralState(quad: Loci.Bundle<4>, state: DihedralState, arcScale: number) {
     const { pointA, pointB, pointC, pointD, dirBA, dirCD, projA, projD } = state
     const { arcPointA, arcPointD, arcDirA, arcDirD, arcCenter, arcNormal } = state
 
-    const { lociA, lociB, lociC, lociD } = quad
+    const [lociA, lociB, lociC, lociD] = quad.loci
     Loci.getCenter(lociA, pointA)
     Loci.getCenter(lociB, pointB)
     Loci.getCenter(lociC, pointC)
@@ -184,7 +184,7 @@ function getCircle(state: DihedralState, segmentLength?: number) {
 }
 
 const tmpState = getDihedralState()
-function dihedralLabel(quad: Loci.Quad, arcScale: number) {
+function dihedralLabel(quad: Loci.Bundle<4>, arcScale: number) {
     setDihedralState(quad, tmpState, arcScale)
     const angle = radToDeg(tmpState.angle).toFixed(2)
     return `Dihedral ${angle}\u00B0`

+ 4 - 4
src/mol-repr/shape/loci/distance.ts

@@ -19,7 +19,7 @@ import { TextBuilder } from '../../../mol-geo/geometry/text/text-builder';
 import { Vec3 } from '../../../mol-math/linear-algebra';
 
 export interface DistanceData {
-    pairs: Loci.Pair[]
+    pairs: Loci.Bundle<2>[]
 }
 
 const SharedParams = {
@@ -73,10 +73,10 @@ function getDistanceState() {
 }
 type DistanceState = ReturnType<typeof getDistanceState>
 
-function setDistanceState(pair: Loci.Pair, state: DistanceState) {
+function setDistanceState(pair: Loci.Bundle<2>, state: DistanceState) {
     const { pointA, pointB, center } = state
 
-    const { lociA, lociB } = pair
+    const [lociA, lociB] = pair.loci
     Loci.getCenter(lociA, pointA)
     Loci.getCenter(lociB, pointB)
 
@@ -89,7 +89,7 @@ function setDistanceState(pair: Loci.Pair, state: DistanceState) {
 
 const tmpState = getDistanceState()
 
-function distanceLabel(pair: Loci.Pair, unitLabel: string) {
+function distanceLabel(pair: Loci.Bundle<2>, unitLabel: string) {
     setDistanceState(pair, tmpState)
     return `Distance ${tmpState.distance.toFixed(2)} ${unitLabel}`
 }