|
@@ -6,26 +6,24 @@
|
|
*/
|
|
*/
|
|
|
|
|
|
import { MarkerAction } from 'mol-geo/geometry/marker-data';
|
|
import { MarkerAction } from 'mol-geo/geometry/marker-data';
|
|
-import { Mat4, Vec3 } from 'mol-math/linear-algebra';
|
|
|
|
import { EmptyLoci, EveryLoci } from 'mol-model/loci';
|
|
import { EmptyLoci, EveryLoci } from 'mol-model/loci';
|
|
-import { StructureUnitTransforms } from 'mol-model/structure/structure/util/unit-transforms';
|
|
|
|
|
|
+import { QueryContext, StructureElement, StructureSelection } from 'mol-model/structure';
|
|
import { PluginContext } from 'mol-plugin/context';
|
|
import { PluginContext } from 'mol-plugin/context';
|
|
import { PluginStateObject } from 'mol-plugin/state/objects';
|
|
import { PluginStateObject } from 'mol-plugin/state/objects';
|
|
-import { StateObjectTracker, StateSelection } from 'mol-state';
|
|
|
|
-import { labelFirst } from 'mol-theme/label';
|
|
|
|
-import { ParamDefinition as PD } from 'mol-util/param-definition';
|
|
|
|
-import { PluginBehavior } from '../behavior';
|
|
|
|
import { Representation } from 'mol-repr/representation';
|
|
import { Representation } from 'mol-repr/representation';
|
|
-import { ButtonsType } from 'mol-util/input/input-observer';
|
|
|
|
-import { StructureElement, StructureSelection, QueryContext } from 'mol-model/structure';
|
|
|
|
-import { ColorNames } from 'mol-util/color/tables';
|
|
|
|
// import { MolScriptBuilder as MS } from 'mol-script/language/builder';
|
|
// import { MolScriptBuilder as MS } from 'mol-script/language/builder';
|
|
import Expression from 'mol-script/language/expression';
|
|
import Expression from 'mol-script/language/expression';
|
|
-import { Color } from 'mol-util/color';
|
|
|
|
-import { compile } from 'mol-script/runtime/query/compiler';
|
|
|
|
-import { Overpaint } from 'mol-theme/overpaint';
|
|
|
|
import { parseMolScript } from 'mol-script/language/parser';
|
|
import { parseMolScript } from 'mol-script/language/parser';
|
|
|
|
+import { compile } from 'mol-script/runtime/query/compiler';
|
|
import { transpileMolScript } from 'mol-script/script/mol-script/symbols';
|
|
import { transpileMolScript } from 'mol-script/script/mol-script/symbols';
|
|
|
|
+import { StateObjectTracker, StateSelection } from 'mol-state';
|
|
|
|
+import { labelFirst } from 'mol-theme/label';
|
|
|
|
+import { Overpaint } from 'mol-theme/overpaint';
|
|
|
|
+import { Color } from 'mol-util/color';
|
|
|
|
+import { ColorNames } from 'mol-util/color/tables';
|
|
|
|
+import { ButtonsType } from 'mol-util/input/input-observer';
|
|
|
|
+import { ParamDefinition as PD } from 'mol-util/param-definition';
|
|
|
|
+import { PluginBehavior } from '../behavior';
|
|
|
|
|
|
export const HighlightLoci = PluginBehavior.create({
|
|
export const HighlightLoci = PluginBehavior.create({
|
|
name: 'representation-highlight-loci',
|
|
name: 'representation-highlight-loci',
|
|
@@ -128,84 +126,6 @@ export const DefaultLociLabelProvider = PluginBehavior.create({
|
|
display: { name: 'Provide Default Loci Label' }
|
|
display: { name: 'Provide Default Loci Label' }
|
|
});
|
|
});
|
|
|
|
|
|
-export namespace ExplodeRepresentation3D {
|
|
|
|
- export const Params = {
|
|
|
|
- t: PD.Numeric(0, { min: 0, max: 1, step: 0.01 })
|
|
|
|
- }
|
|
|
|
- export type Params = PD.Values<typeof Params>
|
|
|
|
-
|
|
|
|
- export class Behavior implements PluginBehavior<Params> {
|
|
|
|
- private currentT = 0;
|
|
|
|
- private repr: StateObjectTracker<PluginStateObject.Molecule.Structure.Representation3D>;
|
|
|
|
- private structure: StateObjectTracker<PluginStateObject.Molecule.Structure>;
|
|
|
|
- private transforms: StructureUnitTransforms;
|
|
|
|
-
|
|
|
|
- private updateData() {
|
|
|
|
- const reprUpdated = this.repr.update();
|
|
|
|
- const strUpdated = this.structure.update();
|
|
|
|
- if (strUpdated && this.structure.data) {
|
|
|
|
- this.transforms = new StructureUnitTransforms(this.structure.data);
|
|
|
|
- }
|
|
|
|
- return reprUpdated || strUpdated;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- register(ref: string): void {
|
|
|
|
- this.repr.setQuery(StateSelection.Generators.byRef(ref).ancestorOfType([PluginStateObject.Molecule.Structure.Representation3D]));
|
|
|
|
- this.structure.setQuery(StateSelection.Generators.byRef(ref).rootOfType([PluginStateObject.Molecule.Structure]));
|
|
|
|
- this.update(this.params);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private centerVec = Vec3.zero();
|
|
|
|
- private transVec = Vec3.zero();
|
|
|
|
- private transMat = Mat4.zero();
|
|
|
|
-
|
|
|
|
- update(params: Params): boolean | Promise<boolean> {
|
|
|
|
- if (!this.updateData() && params.t === this.currentT) return false;
|
|
|
|
- this.currentT = params.t;
|
|
|
|
- if (!this.structure.data || !this.repr.data) return true;
|
|
|
|
-
|
|
|
|
- const structure = this.structure.data;
|
|
|
|
- const boundary = structure.boundary.sphere;
|
|
|
|
- const d = boundary.radius * params.t;
|
|
|
|
-
|
|
|
|
- for (let i = 0, _i = structure.units.length; i < _i; i++) {
|
|
|
|
- const u = structure.units[i];
|
|
|
|
-
|
|
|
|
- Vec3.transformMat4(this.centerVec, u.lookup3d.boundary.sphere.center, u.conformation.operator.matrix);
|
|
|
|
- Vec3.sub(this.transVec, this.centerVec, boundary.center);
|
|
|
|
- Vec3.setMagnitude(this.transVec, this.transVec, d);
|
|
|
|
- Mat4.fromTranslation(this.transMat, this.transVec)
|
|
|
|
-
|
|
|
|
- this.transforms.setTransform(this.transMat, u);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // TODO: should be be "auto updated"?
|
|
|
|
- // perhaps have Representation3D.setState(state, autoSync = false)?
|
|
|
|
-
|
|
|
|
- // TODO: where to handle unitTransforms composition?
|
|
|
|
- // Manually or inside the representation? "inside" would better compose with future additions.
|
|
|
|
- this.repr.data.repr.setState({ unitTransforms: this.transforms });
|
|
|
|
- this.ctx.canvas3d.add(this.repr.data.repr);
|
|
|
|
- this.ctx.canvas3d.requestDraw(true);
|
|
|
|
-
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- unregister(): void {
|
|
|
|
- this.update({ t: 0 })
|
|
|
|
- this.repr.cell = void 0;
|
|
|
|
- this.structure.cell = void 0;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- constructor(private ctx: PluginContext, private params: Params) {
|
|
|
|
- this.repr = new StateObjectTracker(ctx.state.dataState);
|
|
|
|
- this.structure = new StateObjectTracker(ctx.state.dataState);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- export class Obj extends PluginStateObject.CreateBehavior<Behavior>({ name: 'Explode Representation3D Behavior' }) { }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
type ColorMappings = { query: Expression, color: Color }[]
|
|
type ColorMappings = { query: Expression, color: Color }[]
|
|
namespace ColorMappings {
|
|
namespace ColorMappings {
|
|
export function areEqual(colorMappingsA: ColorMappings, colorMappingsB: ColorMappings) {
|
|
export function areEqual(colorMappingsA: ColorMappings, colorMappingsB: ColorMappings) {
|