|
@@ -40,6 +40,7 @@ export { StructureFromTrajectory };
|
|
|
export { StructureFromModel };
|
|
|
export { StructureAssemblyFromModel };
|
|
|
export { StructureSymmetryFromModel };
|
|
|
+export { StructureSymmetryMatesFromModel };
|
|
|
export { TransformStructureConformation };
|
|
|
export { TransformStructureConformationByMatrix };
|
|
|
export { StructureSelectionFromExpression };
|
|
@@ -301,6 +302,31 @@ const StructureSymmetryFromModel = PluginStateTransform.BuiltIn({
|
|
|
}
|
|
|
});
|
|
|
|
|
|
+type StructureSymmetryMatesFromModel = typeof StructureSymmetryMatesFromModel
|
|
|
+const StructureSymmetryMatesFromModel = PluginStateTransform.BuiltIn({
|
|
|
+ name: 'structure-symmetry-mates-from-model',
|
|
|
+ display: { name: 'Structure Symmetry Mates', description: 'Create molecular structure symmetry mates.' },
|
|
|
+ from: SO.Molecule.Model,
|
|
|
+ to: SO.Molecule.Structure,
|
|
|
+ params(a) {
|
|
|
+ return {
|
|
|
+ radius: PD.Numeric(5),
|
|
|
+ }
|
|
|
+ }
|
|
|
+})({
|
|
|
+ apply({ a, params }, plugin: PluginContext) {
|
|
|
+ return Task.create('Build Symmetry Mates', async ctx => {
|
|
|
+ const { radius } = params
|
|
|
+ const model = a.data;
|
|
|
+ const base = Structure.ofModel(model);
|
|
|
+ const s = await StructureSymmetry.builderSymmetryMates(base, radius).runInContext(ctx);
|
|
|
+ await ensureSecondaryStructure(s)
|
|
|
+ const props = { label: `Symmetry Mates`, description: structureDesc(s) };
|
|
|
+ return new SO.Molecule.Structure(s, props);
|
|
|
+ })
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
const _translation = Vec3.zero(), _m = Mat4.zero(), _n = Mat4.zero();
|
|
|
type TransformStructureConformation = typeof TransformStructureConformation
|
|
|
const TransformStructureConformation = PluginStateTransform.BuiltIn({
|