UNPKG

molstar

Version:

A comprehensive macromolecular library.

818 lines (817 loc) 67.5 kB
"use strict"; /** * Copyright (c) 2018-2020 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> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.StructureSelectionsOrientation3D = exports.StructureSelectionsLabel3D = exports.StructureSelectionsDihedral3D = exports.StructureSelectionsAngle3D = exports.StructureSelectionsDistance3D = exports.StructureBoundingBox3D = exports.ModelUnitcell3D = exports.ShapeRepresentation3D = exports.VolumeRepresentation3DHelpers = exports.VolumeRepresentation3D = exports.ClippingStructureRepresentation3DFromBundle = exports.ClippingStructureRepresentation3DFromScript = exports.TransparencyStructureRepresentation3DFromBundle = exports.TransparencyStructureRepresentation3DFromScript = exports.OverpaintStructureRepresentation3DFromBundle = exports.OverpaintStructureRepresentation3DFromScript = exports.UnwindStructureAssemblyRepresentation3D = exports.SpinStructureRepresentation3D = exports.ExplodeStructureRepresentation3D = exports.StructureRepresentation3D = void 0; var tslib_1 = require("tslib"); var structure_1 = require("../../mol-model/structure"); var volume_1 = require("../../mol-model/volume"); var mol_state_1 = require("../../mol-state"); var mol_task_1 = require("../../mol-task"); var theme_1 = require("../../mol-theme/theme"); var param_definition_1 = require("../../mol-util/param-definition"); var objects_1 = require("../objects"); var names_1 = require("../../mol-util/color/names"); var representation_1 = require("../../mol-repr/shape/representation"); var unit_transforms_1 = require("../../mol-model/structure/structure/util/unit-transforms"); var helpers_1 = require("../animation/helpers"); var color_1 = require("../../mol-util/color"); var overpaint_1 = require("../../mol-theme/overpaint"); var transparency_1 = require("../../mol-theme/transparency"); var base_1 = require("../../mol-geo/geometry/base"); var script_1 = require("../../mol-script/script"); var unitcell_1 = require("../../mol-repr/shape/model/unitcell"); var distance_1 = require("../../mol-repr/shape/loci/distance"); var helpers_2 = require("./helpers"); var label_1 = require("../../mol-repr/shape/loci/label"); var orientation_1 = require("../../mol-repr/shape/loci/orientation"); var angle_1 = require("../../mol-repr/shape/loci/angle"); var dihedral_1 = require("../../mol-repr/shape/loci/dihedral"); var symmetry_1 = require("../../mol-model-formats/structure/property/symmetry"); var clipping_1 = require("../../mol-theme/clipping"); var type_helpers_1 = require("../../mol-util/type-helpers"); var mesh_1 = require("../../mol-geo/geometry/mesh/mesh"); var shape_1 = require("./shape"); var shape_2 = require("../../mol-model/shape"); var StructureRepresentation3D = objects_1.PluginStateTransform.BuiltIn({ name: 'structure-representation-3d', display: '3D Representation', from: objects_1.PluginStateObject.Molecule.Structure, to: objects_1.PluginStateObject.Molecule.Structure.Representation3D, params: function (a, ctx) { var _a = ctx.representation.structure, registry = _a.registry, themeCtx = _a.themes; var type = registry.get(registry.default.name); if (!a) { var colorThemeInfo_1 = { help: function (value) { var name = value.name, params = value.params; var p = themeCtx.colorThemeRegistry.get(name); var ct = p.factory({}, params); return { description: ct.description, legend: ct.legend }; } }; return { type: param_definition_1.ParamDefinition.Mapped(registry.default.name, registry.types, function (name) { return param_definition_1.ParamDefinition.Group(registry.get(name).getParams(themeCtx, structure_1.Structure.Empty)); }), colorTheme: param_definition_1.ParamDefinition.Mapped(type.defaultColorTheme.name, themeCtx.colorThemeRegistry.types, function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.colorThemeRegistry.get(name).getParams({ structure: structure_1.Structure.Empty })); }, colorThemeInfo_1), sizeTheme: param_definition_1.ParamDefinition.Mapped(type.defaultSizeTheme.name, themeCtx.sizeThemeRegistry.types, function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.sizeThemeRegistry.get(name).getParams({ structure: structure_1.Structure.Empty })); }) }; } var dataCtx = { structure: a.data }; var colorThemeInfo = { help: function (value) { var name = value.name, params = value.params; var p = themeCtx.colorThemeRegistry.get(name); var ct = p.factory(dataCtx, params); return { description: ct.description, legend: ct.legend }; } }; return ({ type: param_definition_1.ParamDefinition.Mapped(registry.default.name, registry.getApplicableTypes(a.data), function (name) { return param_definition_1.ParamDefinition.Group(registry.get(name).getParams(themeCtx, a.data)); }), colorTheme: param_definition_1.ParamDefinition.Mapped(type.defaultColorTheme.name, themeCtx.colorThemeRegistry.getApplicableTypes(dataCtx), function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.colorThemeRegistry.get(name).getParams(dataCtx)); }, colorThemeInfo), sizeTheme: param_definition_1.ParamDefinition.Mapped(type.defaultSizeTheme.name, themeCtx.sizeThemeRegistry.types, function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.sizeThemeRegistry.get(name).getParams(dataCtx)); }) }); } })({ canAutoUpdate: function (_a) { var a = _a.a, oldParams = _a.oldParams, newParams = _a.newParams; // TODO: other criteria as well? return a.data.elementCount < 10000 || (oldParams.type.name === newParams.type.name && newParams.type.params.quality !== 'custom'); }, apply: function (_a, plugin) { var _this = this; var a = _a.a, params = _a.params, cache = _a.cache; return mol_task_1.Task.create('Structure Representation', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var propertyCtx, provider, data, repr, props; var _a, _b; return (0, tslib_1.__generator)(this, function (_c) { switch (_c.label) { case 0: propertyCtx = { runtime: ctx, assetManager: plugin.managers.asset }; provider = plugin.representation.structure.registry.get(params.type.name); data = ((_a = provider.getData) === null || _a === void 0 ? void 0 : _a.call(provider, a.data, params.type.params)) || a.data; if (!provider.ensureCustomProperties) return [3 /*break*/, 2]; return [4 /*yield*/, provider.ensureCustomProperties.attach(propertyCtx, data)]; case 1: _c.sent(); _c.label = 2; case 2: repr = provider.factory((0, tslib_1.__assign)({ webgl: (_b = plugin.canvas3d) === null || _b === void 0 ? void 0 : _b.webgl }, plugin.representation.structure.themes), provider.getParams); return [4 /*yield*/, theme_1.Theme.ensureDependencies(propertyCtx, plugin.representation.structure.themes, { structure: data }, params)]; case 3: _c.sent(); repr.setTheme(theme_1.Theme.create(plugin.representation.structure.themes, { structure: data }, params)); props = params.type.params || {}; return [4 /*yield*/, repr.createOrUpdate(props, data).runInContext(ctx)]; case 4: _c.sent(); return [2 /*return*/, new objects_1.PluginStateObject.Molecule.Structure.Representation3D({ repr: repr, sourceData: a.data }, { label: provider.label })]; } }); }); }); }, update: function (_a, plugin) { var _this = this; var a = _a.a, b = _a.b, oldParams = _a.oldParams, newParams = _a.newParams, cache = _a.cache; return mol_task_1.Task.create('Structure Representation', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var provider, data, propertyCtx, props; var _a, _b; return (0, tslib_1.__generator)(this, function (_c) { switch (_c.label) { case 0: if (newParams.type.name !== oldParams.type.name) return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Recreate]; provider = plugin.representation.structure.registry.get(newParams.type.name); if ((_a = provider.mustRecreate) === null || _a === void 0 ? void 0 : _a.call(provider, oldParams.type.params, newParams.type.params)) return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Recreate]; data = ((_b = provider.getData) === null || _b === void 0 ? void 0 : _b.call(provider, a.data, newParams.type.params)) || a.data; propertyCtx = { runtime: ctx, assetManager: plugin.managers.asset }; if (!provider.ensureCustomProperties) return [3 /*break*/, 2]; return [4 /*yield*/, provider.ensureCustomProperties.attach(propertyCtx, data)]; case 1: _c.sent(); _c.label = 2; case 2: // TODO: if themes had a .needsUpdate method the following block could // be optimized and only executed conditionally theme_1.Theme.releaseDependencies(plugin.representation.structure.themes, { structure: b.data.sourceData }, oldParams); return [4 /*yield*/, theme_1.Theme.ensureDependencies(propertyCtx, plugin.representation.structure.themes, { structure: data }, newParams)]; case 3: _c.sent(); b.data.repr.setTheme(theme_1.Theme.create(plugin.representation.structure.themes, { structure: data }, newParams)); props = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, b.data.repr.props), newParams.type.params); return [4 /*yield*/, b.data.repr.createOrUpdate(props, data).runInContext(ctx)]; case 4: _c.sent(); b.data.sourceData = a.data; return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Updated]; } }); }); }); }, dispose: function (_a, plugin) { var b = _a.b, params = _a.params; if (!b || !params) return; var structure = b.data.sourceData; var provider = plugin.representation.structure.registry.get(params.type.name); if (provider.ensureCustomProperties) provider.ensureCustomProperties.detach(structure); theme_1.Theme.releaseDependencies(plugin.representation.structure.themes, { structure: structure }, params); }, interpolate: function (src, tar, t) { if (src.colorTheme.name !== 'uniform' || tar.colorTheme.name !== 'uniform') { return t <= 0.5 ? src : tar; } var from = src.colorTheme.params.value, to = tar.colorTheme.params.value; var value = color_1.Color.interpolate(from, to, t); return { type: t <= 0.5 ? src.type : tar.type, colorTheme: { name: 'uniform', params: { value: value } }, sizeTheme: t <= 0.5 ? src.sizeTheme : tar.sizeTheme, }; } }); exports.StructureRepresentation3D = StructureRepresentation3D; var UnwindStructureAssemblyRepresentation3D = objects_1.PluginStateTransform.BuiltIn({ name: 'unwind-structure-assembly-representation-3d', display: 'Unwind Assembly 3D Representation', from: objects_1.PluginStateObject.Molecule.Structure.Representation3D, to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState, params: { t: param_definition_1.ParamDefinition.Numeric(0, { min: 0, max: 1, step: 0.01 }) } })({ canAutoUpdate: function () { return true; }, apply: function (_a) { var a = _a.a, params = _a.params; var structure = a.data.sourceData; var unitTransforms = new unit_transforms_1.StructureUnitTransforms(structure); (0, helpers_1.unwindStructureAssembly)(structure, unitTransforms, params.t); return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({ state: { unitTransforms: unitTransforms }, initialState: { unitTransforms: new unit_transforms_1.StructureUnitTransforms(structure) }, info: structure, repr: a.data.repr }, { label: "Unwind T = " + params.t.toFixed(2) }); }, update: function (_a) { var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams; var structure = b.data.info; if (a.data.sourceData !== structure) return mol_state_1.StateTransformer.UpdateResult.Recreate; if (a.data.repr !== b.data.repr) return mol_state_1.StateTransformer.UpdateResult.Recreate; if (oldParams.t === newParams.t) return mol_state_1.StateTransformer.UpdateResult.Unchanged; var unitTransforms = b.data.state.unitTransforms; (0, helpers_1.unwindStructureAssembly)(structure, unitTransforms, newParams.t); b.label = "Unwind T = " + newParams.t.toFixed(2); b.data.repr = a.data.repr; return mol_state_1.StateTransformer.UpdateResult.Updated; } }); exports.UnwindStructureAssemblyRepresentation3D = UnwindStructureAssemblyRepresentation3D; var ExplodeStructureRepresentation3D = objects_1.PluginStateTransform.BuiltIn({ name: 'explode-structure-representation-3d', display: 'Explode 3D Representation', from: objects_1.PluginStateObject.Molecule.Structure.Representation3D, to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState, params: { t: param_definition_1.ParamDefinition.Numeric(0, { min: 0, max: 1, step: 0.01 }) } })({ canAutoUpdate: function () { return true; }, apply: function (_a) { var a = _a.a, params = _a.params; var structure = a.data.sourceData; var unitTransforms = new unit_transforms_1.StructureUnitTransforms(structure); (0, helpers_1.explodeStructure)(structure, unitTransforms, params.t, structure.root.boundary.sphere); return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({ state: { unitTransforms: unitTransforms }, initialState: { unitTransforms: new unit_transforms_1.StructureUnitTransforms(structure) }, info: structure, repr: a.data.repr }, { label: "Explode T = " + params.t.toFixed(2) }); }, update: function (_a) { var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams; var structure = a.data.sourceData; if (b.data.info !== structure) return mol_state_1.StateTransformer.UpdateResult.Recreate; if (a.data.repr !== b.data.repr) return mol_state_1.StateTransformer.UpdateResult.Recreate; if (oldParams.t === newParams.t) return mol_state_1.StateTransformer.UpdateResult.Unchanged; var unitTransforms = b.data.state.unitTransforms; (0, helpers_1.explodeStructure)(structure, unitTransforms, newParams.t, structure.root.boundary.sphere); b.label = "Explode T = " + newParams.t.toFixed(2); b.data.repr = a.data.repr; return mol_state_1.StateTransformer.UpdateResult.Updated; } }); exports.ExplodeStructureRepresentation3D = ExplodeStructureRepresentation3D; var SpinStructureRepresentation3D = objects_1.PluginStateTransform.BuiltIn({ name: 'spin-structure-representation-3d', display: 'Spin 3D Representation', from: objects_1.PluginStateObject.Molecule.Structure.Representation3D, to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState, params: (0, tslib_1.__assign)({ t: param_definition_1.ParamDefinition.Numeric(0, { min: 0, max: 1, step: 0.01 }) }, helpers_1.SpinStructureParams) })({ canAutoUpdate: function () { return true; }, apply: function (_a) { var a = _a.a, params = _a.params; var structure = a.data.sourceData; var unitTransforms = new unit_transforms_1.StructureUnitTransforms(structure); var _b = (0, helpers_1.getSpinStructureAxisAndOrigin)(structure.root, params), axis = _b.axis, origin = _b.origin; (0, helpers_1.spinStructure)(structure, unitTransforms, params.t, axis, origin); return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({ state: { unitTransforms: unitTransforms }, initialState: { unitTransforms: new unit_transforms_1.StructureUnitTransforms(structure) }, info: structure, repr: a.data.repr }, { label: "Spin T = " + params.t.toFixed(2) }); }, update: function (_a) { var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams; var structure = a.data.sourceData; if (b.data.info !== structure) return mol_state_1.StateTransformer.UpdateResult.Recreate; if (a.data.repr !== b.data.repr) return mol_state_1.StateTransformer.UpdateResult.Recreate; if (oldParams.t === newParams.t && oldParams.axis === newParams.axis && oldParams.origin === newParams.origin) return mol_state_1.StateTransformer.UpdateResult.Unchanged; var unitTransforms = b.data.state.unitTransforms; var _b = (0, helpers_1.getSpinStructureAxisAndOrigin)(structure.root, newParams), axis = _b.axis, origin = _b.origin; (0, helpers_1.spinStructure)(structure, unitTransforms, newParams.t, axis, origin); b.label = "Spin T = " + newParams.t.toFixed(2); b.data.repr = a.data.repr; return mol_state_1.StateTransformer.UpdateResult.Updated; } }); exports.SpinStructureRepresentation3D = SpinStructureRepresentation3D; var OverpaintStructureRepresentation3DFromScript = objects_1.PluginStateTransform.BuiltIn({ name: 'overpaint-structure-representation-3d-from-script', display: 'Overpaint 3D Representation', from: objects_1.PluginStateObject.Molecule.Structure.Representation3D, to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState, params: function () { return ({ layers: param_definition_1.ParamDefinition.ObjectList({ script: param_definition_1.ParamDefinition.Script((0, script_1.Script)('(sel.atom.all)', 'mol-script')), color: param_definition_1.ParamDefinition.Color(names_1.ColorNames.blueviolet), clear: param_definition_1.ParamDefinition.Boolean(false) }, function (e) { return "" + (e.clear ? 'Clear' : color_1.Color.toRgbString(e.color)); }, { defaultValue: [{ script: (0, script_1.Script)('(sel.atom.all)', 'mol-script'), color: names_1.ColorNames.blueviolet, clear: false }] }), }); } })({ canAutoUpdate: function () { return true; }, apply: function (_a) { var a = _a.a, params = _a.params; var structure = a.data.sourceData; var overpaint = overpaint_1.Overpaint.ofScript(params.layers, structure); return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({ state: { overpaint: overpaint }, initialState: { overpaint: overpaint_1.Overpaint.Empty }, info: structure, repr: a.data.repr }, { label: "Overpaint (" + overpaint.layers.length + " Layers)" }); }, update: function (_a) { var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams; var oldStructure = b.data.info; var newStructure = a.data.sourceData; if (newStructure !== oldStructure) return mol_state_1.StateTransformer.UpdateResult.Recreate; if (a.data.repr !== b.data.repr) return mol_state_1.StateTransformer.UpdateResult.Recreate; var oldOverpaint = b.data.state.overpaint; var newOverpaint = overpaint_1.Overpaint.ofScript(newParams.layers, newStructure); if (overpaint_1.Overpaint.areEqual(oldOverpaint, newOverpaint)) return mol_state_1.StateTransformer.UpdateResult.Unchanged; b.data.state.overpaint = newOverpaint; b.data.repr = a.data.repr; b.label = "Overpaint (" + newOverpaint.layers.length + " Layers)"; return mol_state_1.StateTransformer.UpdateResult.Updated; } }); exports.OverpaintStructureRepresentation3DFromScript = OverpaintStructureRepresentation3DFromScript; var OverpaintStructureRepresentation3DFromBundle = objects_1.PluginStateTransform.BuiltIn({ name: 'overpaint-structure-representation-3d-from-bundle', display: 'Overpaint 3D Representation', from: objects_1.PluginStateObject.Molecule.Structure.Representation3D, to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState, params: function () { return ({ layers: param_definition_1.ParamDefinition.ObjectList({ bundle: param_definition_1.ParamDefinition.Value(structure_1.StructureElement.Bundle.Empty), color: param_definition_1.ParamDefinition.Color(names_1.ColorNames.blueviolet), clear: param_definition_1.ParamDefinition.Boolean(false) }, function (e) { return "" + (e.clear ? 'Clear' : color_1.Color.toRgbString(e.color)); }, { defaultValue: [{ bundle: structure_1.StructureElement.Bundle.Empty, color: names_1.ColorNames.blueviolet, clear: false }], isHidden: true }), }); } })({ canAutoUpdate: function () { return true; }, apply: function (_a) { var a = _a.a, params = _a.params; var structure = a.data.sourceData; var overpaint = overpaint_1.Overpaint.ofBundle(params.layers, structure); return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({ state: { overpaint: overpaint }, initialState: { overpaint: overpaint_1.Overpaint.Empty }, info: structure, repr: a.data.repr }, { label: "Overpaint (" + overpaint.layers.length + " Layers)" }); }, update: function (_a) { var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams; var oldStructure = b.data.info; var newStructure = a.data.sourceData; if (newStructure !== oldStructure) return mol_state_1.StateTransformer.UpdateResult.Recreate; if (a.data.repr !== b.data.repr) return mol_state_1.StateTransformer.UpdateResult.Recreate; var oldOverpaint = b.data.state.overpaint; var newOverpaint = overpaint_1.Overpaint.ofBundle(newParams.layers, newStructure); if (overpaint_1.Overpaint.areEqual(oldOverpaint, newOverpaint)) return mol_state_1.StateTransformer.UpdateResult.Unchanged; b.data.state.overpaint = newOverpaint; b.data.repr = a.data.repr; b.label = "Overpaint (" + newOverpaint.layers.length + " Layers)"; return mol_state_1.StateTransformer.UpdateResult.Updated; } }); exports.OverpaintStructureRepresentation3DFromBundle = OverpaintStructureRepresentation3DFromBundle; var TransparencyStructureRepresentation3DFromScript = objects_1.PluginStateTransform.BuiltIn({ name: 'transparency-structure-representation-3d-from-script', display: 'Transparency 3D Representation', from: objects_1.PluginStateObject.Molecule.Structure.Representation3D, to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState, params: function () { return ({ layers: param_definition_1.ParamDefinition.ObjectList({ script: param_definition_1.ParamDefinition.Script((0, script_1.Script)('(sel.atom.all)', 'mol-script')), value: param_definition_1.ParamDefinition.Numeric(0.5, { min: 0, max: 1, step: 0.01 }, { label: 'Transparency' }), }, function (e) { return "Transparency (" + e.value + ")"; }, { defaultValue: [{ script: (0, script_1.Script)('(sel.atom.all)', 'mol-script'), value: 0.5, }] }) }); } })({ canAutoUpdate: function () { return true; }, apply: function (_a) { var a = _a.a, params = _a.params; var structure = a.data.sourceData; var transparency = transparency_1.Transparency.ofScript(params.layers, structure); return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({ state: { transparency: transparency }, initialState: { transparency: transparency_1.Transparency.Empty }, info: structure, repr: a.data.repr }, { label: "Transparency (" + transparency.layers.length + " Layers)" }); }, update: function (_a) { var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams; var structure = b.data.info; if (a.data.sourceData !== structure) return mol_state_1.StateTransformer.UpdateResult.Recreate; if (a.data.repr !== b.data.repr) return mol_state_1.StateTransformer.UpdateResult.Recreate; var oldTransparency = b.data.state.transparency; var newTransparency = transparency_1.Transparency.ofScript(newParams.layers, structure); if (transparency_1.Transparency.areEqual(oldTransparency, newTransparency)) return mol_state_1.StateTransformer.UpdateResult.Unchanged; b.data.state.transparency = newTransparency; b.data.repr = a.data.repr; b.label = "Transparency (" + newTransparency.layers.length + " Layers)"; return mol_state_1.StateTransformer.UpdateResult.Updated; } }); exports.TransparencyStructureRepresentation3DFromScript = TransparencyStructureRepresentation3DFromScript; var TransparencyStructureRepresentation3DFromBundle = objects_1.PluginStateTransform.BuiltIn({ name: 'transparency-structure-representation-3d-from-bundle', display: 'Transparency 3D Representation', from: objects_1.PluginStateObject.Molecule.Structure.Representation3D, to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState, params: function () { return ({ layers: param_definition_1.ParamDefinition.ObjectList({ bundle: param_definition_1.ParamDefinition.Value(structure_1.StructureElement.Bundle.Empty), value: param_definition_1.ParamDefinition.Numeric(0.5, { min: 0, max: 1, step: 0.01 }, { label: 'Transparency' }), }, function (e) { return "Transparency (" + e.value + ")"; }, { defaultValue: [{ bundle: structure_1.StructureElement.Bundle.Empty, value: 0.5, }], isHidden: true }) }); } })({ canAutoUpdate: function () { return true; }, apply: function (_a) { var a = _a.a, params = _a.params; var structure = a.data.sourceData; var transparency = transparency_1.Transparency.ofBundle(params.layers, structure); return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({ state: { transparency: transparency }, initialState: { transparency: transparency_1.Transparency.Empty }, info: structure, repr: a.data.repr }, { label: "Transparency (" + transparency.layers.length + " Layers)" }); }, update: function (_a) { var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams; var structure = b.data.info; if (a.data.sourceData !== structure) return mol_state_1.StateTransformer.UpdateResult.Recreate; if (a.data.repr !== b.data.repr) return mol_state_1.StateTransformer.UpdateResult.Recreate; var oldTransparency = b.data.state.transparency; var newTransparency = transparency_1.Transparency.ofBundle(newParams.layers, structure); if (transparency_1.Transparency.areEqual(oldTransparency, newTransparency)) return mol_state_1.StateTransformer.UpdateResult.Unchanged; b.data.state.transparency = newTransparency; b.data.repr = a.data.repr; b.label = "Transparency (" + newTransparency.layers.length + " Layers)"; return mol_state_1.StateTransformer.UpdateResult.Updated; } }); exports.TransparencyStructureRepresentation3DFromBundle = TransparencyStructureRepresentation3DFromBundle; var ClippingStructureRepresentation3DFromScript = objects_1.PluginStateTransform.BuiltIn({ name: 'clipping-structure-representation-3d-from-script', display: 'Clipping 3D Representation', from: objects_1.PluginStateObject.Molecule.Structure.Representation3D, to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState, params: function () { return ({ layers: param_definition_1.ParamDefinition.ObjectList({ script: param_definition_1.ParamDefinition.Script((0, script_1.Script)('(sel.atom.all)', 'mol-script')), groups: param_definition_1.ParamDefinition.Converted(function (g) { return clipping_1.Clipping.Groups.toNames(g); }, function (n) { return clipping_1.Clipping.Groups.fromNames(n); }, param_definition_1.ParamDefinition.MultiSelect((0, type_helpers_1.ObjectKeys)(clipping_1.Clipping.Groups.Names), param_definition_1.ParamDefinition.objectToOptions(clipping_1.Clipping.Groups.Names))), }, function (e) { return clipping_1.Clipping.Groups.toNames(e.groups).length + " group(s)"; }, { defaultValue: [{ script: (0, script_1.Script)('(sel.atom.all)', 'mol-script'), groups: 0 /* None */, }] }), }); } })({ canAutoUpdate: function () { return true; }, apply: function (_a) { var a = _a.a, params = _a.params; var structure = a.data.sourceData; var clipping = clipping_1.Clipping.ofScript(params.layers, structure); return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({ state: { clipping: clipping }, initialState: { clipping: clipping_1.Clipping.Empty }, info: structure, repr: a.data.repr }, { label: "Clipping (" + clipping.layers.length + " Layers)" }); }, update: function (_a) { var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams; var structure = b.data.info; if (a.data.sourceData !== structure) return mol_state_1.StateTransformer.UpdateResult.Recreate; if (a.data.repr !== b.data.repr) return mol_state_1.StateTransformer.UpdateResult.Recreate; var oldClipping = b.data.state.clipping; var newClipping = clipping_1.Clipping.ofScript(newParams.layers, structure); if (clipping_1.Clipping.areEqual(oldClipping, newClipping)) return mol_state_1.StateTransformer.UpdateResult.Unchanged; b.data.state.clipping = newClipping; b.data.repr = a.data.repr; b.label = "Clipping (" + newClipping.layers.length + " Layers)"; return mol_state_1.StateTransformer.UpdateResult.Updated; } }); exports.ClippingStructureRepresentation3DFromScript = ClippingStructureRepresentation3DFromScript; var ClippingStructureRepresentation3DFromBundle = objects_1.PluginStateTransform.BuiltIn({ name: 'clipping-structure-representation-3d-from-bundle', display: 'Clipping 3D Representation', from: objects_1.PluginStateObject.Molecule.Structure.Representation3D, to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState, params: function () { return ({ layers: param_definition_1.ParamDefinition.ObjectList({ bundle: param_definition_1.ParamDefinition.Value(structure_1.StructureElement.Bundle.Empty), groups: param_definition_1.ParamDefinition.Converted(function (g) { return clipping_1.Clipping.Groups.toNames(g); }, function (n) { return clipping_1.Clipping.Groups.fromNames(n); }, param_definition_1.ParamDefinition.MultiSelect((0, type_helpers_1.ObjectKeys)(clipping_1.Clipping.Groups.Names), param_definition_1.ParamDefinition.objectToOptions(clipping_1.Clipping.Groups.Names))), }, function (e) { return clipping_1.Clipping.Groups.toNames(e.groups).length + " group(s)"; }, { defaultValue: [{ bundle: structure_1.StructureElement.Bundle.Empty, groups: 0 /* None */, }], isHidden: true }), }); } })({ canAutoUpdate: function () { return true; }, apply: function (_a) { var a = _a.a, params = _a.params; var structure = a.data.sourceData; var clipping = clipping_1.Clipping.ofBundle(params.layers, structure); return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({ state: { clipping: clipping }, initialState: { clipping: clipping_1.Clipping.Empty }, info: structure, repr: a.data.repr }, { label: "Clipping (" + clipping.layers.length + " Layers)" }); }, update: function (_a) { var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams; var structure = b.data.info; if (a.data.sourceData !== structure) return mol_state_1.StateTransformer.UpdateResult.Recreate; if (a.data.repr !== b.data.repr) return mol_state_1.StateTransformer.UpdateResult.Recreate; var oldClipping = b.data.state.clipping; var newClipping = clipping_1.Clipping.ofBundle(newParams.layers, structure); if (clipping_1.Clipping.areEqual(oldClipping, newClipping)) return mol_state_1.StateTransformer.UpdateResult.Unchanged; b.data.state.clipping = newClipping; b.data.repr = a.data.repr; b.label = "Clipping (" + newClipping.layers.length + " Layers)"; return mol_state_1.StateTransformer.UpdateResult.Updated; } }); exports.ClippingStructureRepresentation3DFromBundle = ClippingStructureRepresentation3DFromBundle; // var VolumeRepresentation3DHelpers; (function (VolumeRepresentation3DHelpers) { function getDefaultParams(ctx, name, volume, volumeParams) { var type = ctx.representation.volume.registry.get(name); var themeDataCtx = { volume: volume }; var colorParams = ctx.representation.volume.themes.colorThemeRegistry.get(type.defaultColorTheme.name).getParams(themeDataCtx); var sizeParams = ctx.representation.volume.themes.sizeThemeRegistry.get(type.defaultSizeTheme.name).getParams(themeDataCtx); var volumeDefaultParams = param_definition_1.ParamDefinition.getDefaultValues(type.getParams(ctx.representation.volume.themes, volume)); return ({ type: { name: name, params: volumeParams ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, volumeDefaultParams), volumeParams) : volumeDefaultParams }, colorTheme: { name: type.defaultColorTheme.name, params: param_definition_1.ParamDefinition.getDefaultValues(colorParams) }, sizeTheme: { name: type.defaultSizeTheme.name, params: param_definition_1.ParamDefinition.getDefaultValues(sizeParams) } }); } VolumeRepresentation3DHelpers.getDefaultParams = getDefaultParams; function getDefaultParamsStatic(ctx, name, volumeParams, colorName, colorParams, sizeName, sizeParams) { var type = ctx.representation.volume.registry.get(name); var colorType = ctx.representation.volume.themes.colorThemeRegistry.get(colorName || type.defaultColorTheme.name); var sizeType = ctx.representation.volume.themes.sizeThemeRegistry.get(sizeName || type.defaultSizeTheme.name); return ({ type: { name: name, params: volumeParams ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, type.defaultValues), volumeParams) : type.defaultValues }, colorTheme: { name: type.defaultColorTheme.name, params: colorParams ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, colorType.defaultValues), colorParams) : colorType.defaultValues }, sizeTheme: { name: type.defaultSizeTheme.name, params: sizeParams ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, sizeType.defaultValues), sizeParams) : sizeType.defaultValues } }); } VolumeRepresentation3DHelpers.getDefaultParamsStatic = getDefaultParamsStatic; function getDescription(props) { var _a, _b, _c, _d; if (props.isoValue) { return volume_1.Volume.IsoValue.toString(props.isoValue); } else if ((_b = (_a = props.renderMode) === null || _a === void 0 ? void 0 : _a.params) === null || _b === void 0 ? void 0 : _b.isoValue) { return volume_1.Volume.IsoValue.toString((_d = (_c = props.renderMode) === null || _c === void 0 ? void 0 : _c.params) === null || _d === void 0 ? void 0 : _d.isoValue); } } VolumeRepresentation3DHelpers.getDescription = getDescription; })(VolumeRepresentation3DHelpers = exports.VolumeRepresentation3DHelpers || (exports.VolumeRepresentation3DHelpers = {})); var VolumeRepresentation3D = objects_1.PluginStateTransform.BuiltIn({ name: 'volume-representation-3d', display: '3D Representation', from: objects_1.PluginStateObject.Volume.Data, to: objects_1.PluginStateObject.Volume.Representation3D, params: function (a, ctx) { var _a = ctx.representation.volume, registry = _a.registry, themeCtx = _a.themes; var type = registry.get(registry.default.name); if (!a) { return { type: param_definition_1.ParamDefinition.Mapped(registry.default.name, registry.types, function (name) { return param_definition_1.ParamDefinition.Group(registry.get(name).getParams(themeCtx, volume_1.Volume.One)); }), colorTheme: param_definition_1.ParamDefinition.Mapped(type.defaultColorTheme.name, themeCtx.colorThemeRegistry.types, function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.colorThemeRegistry.get(name).getParams({ volume: volume_1.Volume.One })); }), sizeTheme: param_definition_1.ParamDefinition.Mapped(type.defaultSizeTheme.name, themeCtx.sizeThemeRegistry.types, function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.sizeThemeRegistry.get(name).getParams({ volume: volume_1.Volume.One })); }) }; } var dataCtx = { volume: a.data }; return ({ type: param_definition_1.ParamDefinition.Mapped(registry.default.name, registry.types, function (name) { return param_definition_1.ParamDefinition.Group(registry.get(name).getParams(themeCtx, a.data)); }), colorTheme: param_definition_1.ParamDefinition.Mapped(type.defaultColorTheme.name, themeCtx.colorThemeRegistry.getApplicableTypes(dataCtx), function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.colorThemeRegistry.get(name).getParams(dataCtx)); }), sizeTheme: param_definition_1.ParamDefinition.Mapped(type.defaultSizeTheme.name, themeCtx.sizeThemeRegistry.types, function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.sizeThemeRegistry.get(name).getParams(dataCtx)); }) }); } })({ canAutoUpdate: function (_a) { var oldParams = _a.oldParams, newParams = _a.newParams; return oldParams.type.name === newParams.type.name; }, apply: function (_a, plugin) { var _this = this; var a = _a.a, params = _a.params; return mol_task_1.Task.create('Volume Representation', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var propertyCtx, provider, repr, props; var _a; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: propertyCtx = { runtime: ctx, assetManager: plugin.managers.asset }; provider = plugin.representation.volume.registry.get(params.type.name); if (!provider.ensureCustomProperties) return [3 /*break*/, 2]; return [4 /*yield*/, provider.ensureCustomProperties.attach(propertyCtx, a.data)]; case 1: _b.sent(); _b.label = 2; case 2: repr = provider.factory((0, tslib_1.__assign)({ webgl: (_a = plugin.canvas3d) === null || _a === void 0 ? void 0 : _a.webgl }, plugin.representation.volume.themes), provider.getParams); repr.setTheme(theme_1.Theme.create(plugin.representation.volume.themes, { volume: a.data }, params)); props = params.type.params || {}; return [4 /*yield*/, repr.createOrUpdate(props, a.data).runInContext(ctx)]; case 3: _b.sent(); return [2 /*return*/, new objects_1.PluginStateObject.Volume.Representation3D({ repr: repr, sourceData: a.data }, { label: provider.label, description: VolumeRepresentation3DHelpers.getDescription(props) })]; } }); }); }); }, update: function (_a, plugin) { var _this = this; var a = _a.a, b = _a.b, oldParams = _a.oldParams, newParams = _a.newParams; return mol_task_1.Task.create('Volume Representation', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var oldProvider, props; var _a; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: if (newParams.type.name !== oldParams.type.name) { oldProvider = plugin.representation.volume.registry.get(oldParams.type.name); (_a = oldProvider.ensureCustomProperties) === null || _a === void 0 ? void 0 : _a.detach(a.data); return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Recreate]; } props = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, b.data.repr.props), newParams.type.params); b.data.repr.setTheme(theme_1.Theme.create(plugin.representation.volume.themes, { volume: a.data }, newParams)); return [4 /*yield*/, b.data.repr.createOrUpdate(props, a.data).runInContext(ctx)]; case 1: _b.sent(); b.data.sourceData = a.data; b.description = VolumeRepresentation3DHelpers.getDescription(props); return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Updated]; } }); }); }); } }); exports.VolumeRepresentation3D = VolumeRepresentation3D; var ShapeRepresentation3D = objects_1.PluginStateTransform.BuiltIn({ name: 'shape-representation-3d', display: '3D Representation', from: objects_1.PluginStateObject.Shape.Provider, to: objects_1.PluginStateObject.Shape.Representation3D, params: function (a, ctx) { return a ? a.data.params : base_1.BaseGeometry.Params; } })({ canAutoUpdate: function () { return true; }, apply: function (_a, plugin) { var _this = this; var a = _a.a, params = _a.params; return mol_task_1.Task.create('Shape Representation', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var props, repr; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: props = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, param_definition_1.ParamDefinition.getDefaultValues(a.data.params)), params); repr = (0, representation_1.ShapeRepresentation)(a.data.getShape, a.data.geometryUtils); return [4 /*yield*/, repr.createOrUpdate(props, a.data.data).runInContext(ctx)]; case 1: _a.sent(); return [2 /*return*/, new objects_1.PluginStateObject.Shape.Representation3D({ repr: repr, sourceData: a.data }, { label: a.data.label })]; } }); }); }); }, update: function (_a, plugin) { var _this = this; var a = _a.a, b = _a.b, oldParams = _a.oldParams, newParams = _a.newParams; return mol_task_1.Task.create('Shape Representation', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var props; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: props = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, b.data.repr.props), newParams); return [4 /*yield*/, b.data.repr.createOrUpdate(props, a.data.data).runInContext(ctx)]; case 1: _a.sent(); b.data.sourceData = a.data; return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Updated]; } }); }); }); } }); exports.ShapeRepresentation3D = ShapeRepresentation3D; var ModelUnitcell3D = objects_1.PluginStateTransform.BuiltIn({ name: 'model-unitcell-3d', display: 'Model Unit Cell', from: objects_1.PluginStateObject.Molecule.Model, to: objects_1.PluginStateObject.Shape.Representation3D, params: function () { return ((0, tslib_1.__assign)({}, unitcell_1.UnitcellParams)); } })({ isApplicable: function (a) { return !!symmetry_1.ModelSymmetry.Provider.get(a.data); }, canAutoUpdate: function (_a) { var oldParams = _a.oldParams, newParams = _a.newParams; return true; }, apply: function (_a, plugin) { var _this = this; var a = _a.a, params = _a.params; return mol_task_1.Task.create('Model Unit Cell', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var symmetry, data, repr; var _a; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: symmetry = symmetry_1.ModelSymmetry.Provider.get(a.data); if (!symmetry) return [2 /*return*/, mol_state_1.StateObject.Null]; data = (0, unitcell_1.getUnitcellData)(a.data, symmetry, params); repr = (0, unitcell_1.UnitcellRepresentation)((0, tslib_1.__assign)({ webgl: (_a = plugin.canvas3d) === null || _a === void 0 ? void 0 : _a.webgl }, plugin.representation.structure.themes), function () { return unitcell_1.UnitcellParams; }); return [4 /*yield*/, repr.createOrUpdate(params, data).runInContext(ctx)]; case 1: _b.sent(); return [2 /*return*/, new objects_1.PluginStateObject.Shape.Representation3D({ repr: repr, sourceData: data }, { label: "Unit Cell", description: symmetry.spacegroup.name })]; } }); }); }); }, update: function (_a) { var _this = this; var a = _a.a, b = _a.b, newParams = _a.newParams; return mol_task_1.Task.create('Model Unit Cell', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var symmetry, props, data; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: symmetry = symmetry_1.ModelSymmetry.Provider.get(a.data); if (!symmetry) return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Null]; props = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, b.data.repr.props), newParams);