diff --git a/src/mol-plugin/behavior/static/representation.ts b/src/mol-plugin/behavior/static/representation.ts index 06959d02bbc9a8354c8e04ebdf288c73806c795f..b84697c9d7237d9ec824fba879929dfdc19f7eca 100644 --- a/src/mol-plugin/behavior/static/representation.ts +++ b/src/mol-plugin/behavior/static/representation.ts @@ -72,6 +72,13 @@ export function SyncStructureRepresentation3DState(ctx: PluginContext) { ctx.canvas3d.update(data.source.data.repr); ctx.canvas3d.requestDraw(true); }); + events.object.removed.subscribe(e => { + if (!SO.Molecule.Structure.Representation3DState.is(e.obj)) return; + const data = e.obj.data as SO.Molecule.Structure.Representation3DStateData; + data.source.data.repr.setState(data.initialState); + ctx.canvas3d.update(data.source.data.repr); + ctx.canvas3d.requestDraw(true); + }); } diff --git a/src/mol-plugin/state/objects.ts b/src/mol-plugin/state/objects.ts index 003da6788d40e9f23d032e0555ee0082c33bd61f..c73a2d03df02236ad1204e229ae0bf8a65816ba5 100644 --- a/src/mol-plugin/state/objects.ts +++ b/src/mol-plugin/state/objects.ts @@ -84,7 +84,14 @@ export namespace PluginStateObject { export namespace Structure { export class Representation3D extends CreateRepresentation3D<StructureRepresentation<any> | ShapeRepresentation<any, any, any>, Structure>({ name: 'Structure 3D' }) { } - export interface Representation3DStateData { source: Representation3D, state: Partial<StructureRepresentationState>, info?: unknown } + + export interface Representation3DStateData { + source: Representation3D, + /** used to restore state when the obj is removed */ + initialState: Partial<StructureRepresentationState>, + state: Partial<StructureRepresentationState>, + info?: unknown + } export class Representation3DState extends Create<Representation3DStateData>({ name: 'Structure 3D State', typeClass: 'Object' }) { } } } diff --git a/src/mol-plugin/state/transforms/representation.ts b/src/mol-plugin/state/transforms/representation.ts index d4bba69643e0e65643da8ed51532092e2f88e140..c1e9e8bef41b344141e87001ba50bf5bab96b6b0 100644 --- a/src/mol-plugin/state/transforms/representation.ts +++ b/src/mol-plugin/state/transforms/representation.ts @@ -247,7 +247,12 @@ const UnwindStructureAssemblyRepresentation3D = PluginStateTransform.BuiltIn({ const structure = a.data.source.data; const unitTransforms = new StructureUnitTransforms(structure); unwindStructureAssembly(structure, unitTransforms, params.t); - return new SO.Molecule.Structure.Representation3DState({ state: { unitTransforms }, info: structure, source: a }, { label: `Unwind T = ${params.t.toFixed(2)}` }); + return new SO.Molecule.Structure.Representation3DState({ + state: { unitTransforms }, + initialState: { unitTransforms: new StructureUnitTransforms(structure) }, + info: structure, + source: a + }, { label: `Unwind T = ${params.t.toFixed(2)}` }); }, update({ a, b, newParams, oldParams }) { const structure = b.data.info as Structure; @@ -274,15 +279,20 @@ const ExplodeStructureRepresentation3D = PluginStateTransform.BuiltIn({ return true; }, apply({ a, params, spine }) { - const srcStructure = spine.getRootOfType(SO.Molecule.Structure)!.data; - const unitTransforms = new StructureUnitTransforms(srcStructure); - explodeStructure(srcStructure, unitTransforms, params.t); - return new SO.Molecule.Structure.Representation3DState({ state: { unitTransforms }, info: srcStructure, source: a }, { label: `Explode T = ${params.t.toFixed(2)}` }); + const rootStructure = spine.getRootOfType(SO.Molecule.Structure)!.data; + const unitTransforms = new StructureUnitTransforms(rootStructure); + explodeStructure(rootStructure, unitTransforms, params.t); + return new SO.Molecule.Structure.Representation3DState({ + state: { unitTransforms }, + initialState: { unitTransforms: new StructureUnitTransforms(rootStructure) }, + info: rootStructure, + source: a + }, { label: `Explode T = ${params.t.toFixed(2)}` }); }, update({ a, b, newParams, oldParams, spine }) { - const srcStructure = spine.getRootOfType(SO.Molecule.Structure)!.data; + const rootStructure = spine.getRootOfType(SO.Molecule.Structure)!.data; const structure = b.data.info as Structure; - if (srcStructure !== structure) return StateTransformer.UpdateResult.Recreate; + if (rootStructure !== structure) return StateTransformer.UpdateResult.Recreate; if (oldParams.t === newParams.t) return StateTransformer.UpdateResult.Unchanged; const unitTransforms = b.data.state.unitTransforms!; explodeStructure(structure, unitTransforms, newParams.t);