objects.ts 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /**
  2. * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  6. */
  7. import { CifFile } from '../mol-io/reader/cif';
  8. import { PlyFile } from '../mol-io/reader/ply/schema';
  9. import { Coordinates as _Coordinates } from '../mol-model/structure';
  10. import { Topology as _Topology } from '../mol-model/structure';
  11. import { Model as _Model, Structure as _Structure, StructureElement } from '../mol-model/structure';
  12. import { VolumeData } from '../mol-model/volume';
  13. import { PluginBehavior } from '../mol-plugin/behavior/behavior';
  14. import { Representation } from '../mol-repr/representation';
  15. import { StructureRepresentation, StructureRepresentationState } from '../mol-repr/structure/representation';
  16. import { VolumeRepresentation } from '../mol-repr/volume/representation';
  17. import { StateObject, StateTransformer } from '../mol-state';
  18. import { Ccp4File } from '../mol-io/reader/ccp4/schema';
  19. import { Dsn6File } from '../mol-io/reader/dsn6/schema';
  20. import { ShapeRepresentation } from '../mol-repr/shape/representation';
  21. import { Shape as _Shape } from '../mol-model/shape';
  22. import { ShapeProvider } from '../mol-model/shape/provider';
  23. import { File3DG } from '../mol-io/reader/3dg/parser';
  24. import { DcdFile } from '../mol-io/reader/dcd/parser';
  25. import { PsfFile } from '../mol-io/reader/psf/parser';
  26. export type TypeClass = 'root' | 'data' | 'prop'
  27. export namespace PluginStateObject {
  28. export type Any = StateObject<any, TypeInfo>
  29. export type TypeClass = 'Root' | 'Group' | 'Data' | 'Object' | 'Representation3D' | 'Behavior'
  30. export interface TypeInfo { name: string, typeClass: TypeClass }
  31. export const Create = StateObject.factory<TypeInfo>();
  32. export function isRepresentation3D(o?: Any): o is StateObject<Representation3DData<Representation.Any>, TypeInfo> {
  33. return !!o && o.type.typeClass === 'Representation3D';
  34. }
  35. export function isBehavior(o?: Any): o is StateObject<PluginBehavior, TypeInfo> {
  36. return !!o && o.type.typeClass === 'Behavior';
  37. }
  38. export interface Representation3DData<T extends Representation.Any, S extends StateObject = StateObject> { repr: T, source: S }
  39. export function CreateRepresentation3D<T extends Representation.Any, S extends StateObject = StateObject>(type: { name: string }) {
  40. return Create<Representation3DData<T, S>>({ ...type, typeClass: 'Representation3D' });
  41. }
  42. export function CreateBehavior<T extends PluginBehavior>(type: { name: string }) {
  43. return Create<T>({ ...type, typeClass: 'Behavior' })
  44. }
  45. export class Root extends Create({ name: 'Root', typeClass: 'Root' }) { }
  46. export class Group extends Create({ name: 'Group', typeClass: 'Group' }) { }
  47. export namespace Data {
  48. export class String extends Create<string>({ name: 'String Data', typeClass: 'Data', }) { }
  49. export class Binary extends Create<Uint8Array>({ name: 'Binary Data', typeClass: 'Data' }) { }
  50. export type BlobEntry = { id: string } & (
  51. { kind: 'string', data: string } |
  52. { kind: 'binary', data: Uint8Array }
  53. )
  54. export type BlobData = BlobEntry[]
  55. export class Blob extends Create<BlobData>({ name: 'Data Blob', typeClass: 'Data' }) { }
  56. }
  57. export namespace Format {
  58. export class Json extends Create<any>({ name: 'JSON Data', typeClass: 'Data' }) { }
  59. export class Cif extends Create<CifFile>({ name: 'CIF File', typeClass: 'Data' }) { }
  60. export class Pdb extends Create<CifFile>({ name: 'PDB File', typeClass: 'Data' }) { }
  61. export class Gro extends Create<CifFile>({ name: 'GRO File', typeClass: 'Data' }) { }
  62. export class _3dg extends Create<CifFile>({ name: '3DG File', typeClass: 'Data' }) { }
  63. export class Psf extends Create<PsfFile>({ name: 'PSF File', typeClass: 'Data' }) { }
  64. export class Dcd extends Create<CifFile>({ name: 'DCD File', typeClass: 'Data' }) { }
  65. export class Ply extends Create<PlyFile>({ name: 'PLY File', typeClass: 'Data' }) { }
  66. export class Ccp4 extends Create<Ccp4File>({ name: 'CCP4/MRC/MAP File', typeClass: 'Data' }) { }
  67. export class Dsn6 extends Create<Dsn6File>({ name: 'DSN6/BRIX File', typeClass: 'Data' }) { }
  68. export type BlobEntry = { id: string } & (
  69. { kind: 'json', data: unknown } |
  70. { kind: 'string', data: string } |
  71. { kind: 'binary', data: Uint8Array } |
  72. { kind: 'cif', data: CifFile } |
  73. { kind: 'pdb', data: CifFile } |
  74. { kind: 'gro', data: CifFile } |
  75. { kind: '3dg', data: File3DG } |
  76. { kind: 'dcd', data: DcdFile } |
  77. { kind: 'ccp4', data: Ccp4File } |
  78. { kind: 'dsn6', data: Dsn6File } |
  79. { kind: 'ply', data: PlyFile } |
  80. // For non-build in extensions
  81. { kind: 'custom', data: unknown, tag: string }
  82. )
  83. export type BlobData = BlobEntry[]
  84. export class Blob extends Create<BlobData>({ name: 'Format Blob', typeClass: 'Data' }) { }
  85. }
  86. export namespace Molecule {
  87. export class Coordinates extends Create<_Coordinates>({ name: 'Coordinates', typeClass: 'Object' }) { }
  88. export class Topology extends Create<_Topology>({ name: 'Topology', typeClass: 'Object' }) { }
  89. export class Model extends Create<_Model>({ name: 'Model', typeClass: 'Object' }) { }
  90. export class Trajectory extends Create<ReadonlyArray<_Model>>({ name: 'Trajectory', typeClass: 'Object' }) { }
  91. export class Structure extends Create<_Structure>({ name: 'Structure', typeClass: 'Object' }) { }
  92. export namespace Structure {
  93. export class Representation3D extends CreateRepresentation3D<StructureRepresentation<any> | ShapeRepresentation<any, any, any>, Structure>({ name: 'Structure 3D' }) { }
  94. export interface Representation3DStateData {
  95. source: Representation3D,
  96. /** used to restore state when the obj is removed */
  97. initialState: Partial<StructureRepresentationState>,
  98. state: Partial<StructureRepresentationState>,
  99. info?: unknown
  100. }
  101. export class Representation3DState extends Create<Representation3DStateData>({ name: 'Structure 3D State', typeClass: 'Object' }) { }
  102. export interface SelectionEntry { key: string, groupId?: string, loci: StructureElement.Loci }
  103. export class Selections extends Create<ReadonlyArray<SelectionEntry>>({ name: 'Selections', typeClass: 'Object' }) {}
  104. }
  105. }
  106. export namespace Volume {
  107. export class Data extends Create<VolumeData>({ name: 'Volume Data', typeClass: 'Object' }) { }
  108. export class Representation3D extends CreateRepresentation3D<VolumeRepresentation<any>>({ name: 'Volume 3D' }) { }
  109. }
  110. export namespace Shape {
  111. export class Provider extends Create<ShapeProvider<any, any, any>>({ name: 'Shape Provider', typeClass: 'Object' }) { }
  112. export class Representation3D extends CreateRepresentation3D<ShapeRepresentation<any, any, any>>({ name: 'Shape 3D' }) { }
  113. }
  114. }
  115. export namespace PluginStateTransform {
  116. export const CreateBuiltIn = StateTransformer.factory('ms-plugin');
  117. export const BuiltIn = StateTransformer.builderFactory('ms-plugin');
  118. }