diff --git a/src/mol-model/structure/structure/element/loci.ts b/src/mol-model/structure/structure/element/loci.ts index 617f869a57916cf5402bb8bd18409376ee0111a2..53c2780c60f4191ab4300bb880b507b9ee490370 100644 --- a/src/mol-model/structure/structure/element/loci.ts +++ b/src/mol-model/structure/structure/element/loci.ts @@ -582,6 +582,20 @@ export namespace Loci { return PrincipalAxes.ofPositions(positions); } + export function getPrincipalAxesMany(locis: Loci[]): PrincipalAxes { + let elementCount = 0; + locis.forEach(l => { + elementCount += size(l); + }); + const positions = new Float32Array(3 * elementCount); + let offset = 0; + locis.forEach(l => { + toPositionsArray(l, positions, offset); + offset += size(l) * 3; + }); + return PrincipalAxes.ofPositions(positions); + } + function sourceIndex(unit: Unit, element: ElementIndex) { return Unit.isAtomic(unit) ? unit.model.atomicHierarchy.atomSourceIndex.value(element) diff --git a/src/mol-plugin-state/manager/structure/selection.ts b/src/mol-plugin-state/manager/structure/selection.ts index a8e99b6d0f709cda0a278e8871ab4c72d5e7d531..c043a9e614cde87c2312401549f90828ff847b96 100644 --- a/src/mol-plugin-state/manager/structure/selection.ts +++ b/src/mol-plugin-state/manager/structure/selection.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2019-2020 mol* contributors, licensed under MIT, See LICENSE file for more info. + * Copyright (c) 2019-2021 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> * @author Alexander Rose <alexander.rose@weirdbyte.de> @@ -22,6 +22,7 @@ import { PluginStateObject as PSO } from '../../objects'; import { UUID } from '../../../mol-util'; import { StructureRef } from './hierarchy-state'; import { Boundary } from '../../../mol-math/geometry/boundary'; +import { iterableToArray } from '../../../mol-data/util'; interface StructureSelectionManagerState { entries: Map<string, SelectionEntry>, @@ -405,14 +406,8 @@ export class StructureSelectionManager extends StatefulPluginComponent<Structure } getPrincipalAxes(): PrincipalAxes { - const elementCount = this.elementCount(); - const positions = new Float32Array(3 * elementCount); - let offset = 0; - this.entries.forEach(v => { - StructureElement.Loci.toPositionsArray(v.selection, positions, offset); - offset += StructureElement.Loci.size(v.selection) * 3; - }); - return PrincipalAxes.ofPositions(positions); + const values = iterableToArray(this.entries.values()); + return StructureElement.Loci.getPrincipalAxesMany(values.map(v => v.selection)); } modify(modifier: StructureSelectionModifier, loci: Loci) { diff --git a/src/mol-theme/label.ts b/src/mol-theme/label.ts index 73c123a859f98f572151db59980b1841fd6500cf..d43df4dd7e87a0d2904d8afb271e9f0303849d2f 100644 --- a/src/mol-theme/label.ts +++ b/src/mol-theme/label.ts @@ -92,6 +92,14 @@ export function structureElementStatsLabel(stats: StructureElement.Stats, option return o.htmlStyling ? label : stripTags(label); } +export function structureElementLociLabelMany(locis: StructureElement.Loci[], options: Partial<LabelOptions> = {}): string { + const stats = StructureElement.Stats.create(); + for (const l of locis) { + StructureElement.Stats.add(stats, stats, StructureElement.Stats.ofLoci(l)); + } + return structureElementStatsLabel(stats, options); +} + function _structureElementStatsLabel(stats: StructureElement.Stats, countsOnly = false, hidePrefix = false, condensed = false, reverse = false): string { const { structureCount, chainCount, residueCount, conformationCount, elementCount } = stats;