소스 검색

mol-plugin: set initial repr state when modifer is removed

David Sehnal 6 년 전
부모
커밋
153f30a3f8
3개의 변경된 파일32개의 추가작업 그리고 8개의 파일을 삭제
  1. 7 0
      src/mol-plugin/behavior/static/representation.ts
  2. 8 1
      src/mol-plugin/state/objects.ts
  3. 17 7
      src/mol-plugin/state/transforms/representation.ts

+ 7 - 0
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);
+    });
 }
 
 

+ 8 - 1
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' }) { }
         }
     }

+ 17 - 7
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);