Skip to content
Snippets Groups Projects
Commit 728774f0 authored by Alexander Rose's avatar Alexander Rose
Browse files

added Structure.Loci

parent ac536d22
No related branches found
No related tags found
No related merge requests found
......@@ -11,6 +11,7 @@ import { Sphere3D } from 'mol-math/geometry';
import { CentroidHelper } from 'mol-math/geometry/centroid-helper';
import { Vec3 } from 'mol-math/linear-algebra';
import { OrderedSet } from 'mol-data/int';
import { Structure } from './structure/structure';
/** A Loci that includes every loci */
export const EveryLoci = { kind: 'every-loci' as 'every-loci' }
......@@ -29,6 +30,9 @@ export function isEmptyLoci(x: any): x is EmptyLoci {
export function areLociEqual(lociA: Loci, lociB: Loci) {
if (isEveryLoci(lociA) && isEveryLoci(lociB)) return true
if (isEmptyLoci(lociA) && isEmptyLoci(lociB)) return true
if (Structure.isLoci(lociA) && Structure.isLoci(lociB)) {
return Structure.areLociEqual(lociA, lociB)
}
if (StructureElement.isLoci(lociA) && StructureElement.isLoci(lociB)) {
return StructureElement.areLociEqual(lociA, lociB)
}
......@@ -44,7 +48,7 @@ export function areLociEqual(lociA: Loci, lociB: Loci) {
export { Loci }
type Loci = StructureElement.Loci | Link.Loci | EveryLoci | EmptyLoci | Shape.Loci
type Loci = StructureElement.Loci | Structure.Loci | Link.Loci | EveryLoci | EmptyLoci | Shape.Loci
namespace Loci {
......@@ -54,7 +58,9 @@ namespace Loci {
if (loci.kind === 'every-loci' || loci.kind === 'empty-loci') return void 0;
sphereHelper.reset();
if (loci.kind === 'element-loci') {
if (loci.kind === 'structure-loci') {
return Sphere3D.clone(loci.structure.boundary.sphere)
} else if (loci.kind === 'element-loci') {
for (const e of loci.elements) {
const { indices } = e;
const pos = e.unit.conformation.position;
......
......@@ -280,6 +280,23 @@ function getUniqueAtomicResidueIndices(structure: Structure): ReadonlyMap<UUID,
namespace Structure {
export const Empty = new Structure([]);
/** Represents a single structure */
export interface Loci {
readonly kind: 'structure-loci',
readonly structure: Structure,
}
export function Loci(structure: Structure): Loci {
return { kind: 'structure-loci', structure };
}
export function isLoci(x: any): x is Loci {
return !!x && x.kind === 'structure-loci';
}
export function areLociEqual(a: Loci, b: Loci) {
return a.structure === b.structure
}
export function create(units: ReadonlyArray<Unit>): Structure { return new Structure(units); }
/**
......
......@@ -20,6 +20,8 @@ function setElementLocation(loc: StructureElement, unit: Unit, index: StructureE
export function labelFirst(loci: Loci): string {
switch (loci.kind) {
case 'structure-loci':
return loci.structure.models.map(m => m.label).join(', ')
case 'element-loci':
const e = loci.elements[0]
if (e) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment