Explorar el Código

added link cylinder to ellopsoids repr

Alexander Rose hace 5 años
padre
commit
f6ef22b917

+ 18 - 6
src/mol-repr/structure/representation/ellipsoid.ts

@@ -8,22 +8,34 @@ import { ParamDefinition as PD } from '../../../mol-util/param-definition';
 import { RepresentationParamsGetter, RepresentationContext, Representation } from '../../../mol-repr/representation';
 import { ThemeRegistryContext } from '../../../mol-theme/theme';
 import { Structure } from '../../../mol-model/structure';
-import { UnitsRepresentation, StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationProvider } from '../../../mol-repr/structure/representation';
+import { UnitsRepresentation, StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationProvider, ComplexRepresentation } from '../../../mol-repr/structure/representation';
 import { EllipsoidMeshParams, EllipsoidMeshVisual } from '../visual/ellipsoid-mesh';
 import { UnitKind, UnitKindOptions } from '../../../mol-repr/structure/visual/util/common';
 import { AtomSiteAnisotrop } from '../../../mol-model-formats/structure/mmcif/anisotropic';
+import { IntraUnitLinkParams, IntraUnitLinkVisual } from '../visual/intra-unit-link-cylinder';
+import { InterUnitLinkParams, InterUnitLinkVisual } from '../visual/inter-unit-link-cylinder';
 
 const EllipsoidVisuals = {
-    'ellipsoid-mesh': (ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, EllipsoidParams>) => UnitsRepresentation('Ellipsoid Mesh', ctx, getParams, EllipsoidMeshVisual),
+    'ellipsoid-mesh': (ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, EllipsoidMeshParams>) => UnitsRepresentation('Ellipsoid Mesh', ctx, getParams, EllipsoidMeshVisual),
+    'intra-link': (ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, IntraUnitLinkParams>) => UnitsRepresentation('Intra-unit link cylinder', ctx, getParams, IntraUnitLinkVisual),
+    'inter-link': (ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, InterUnitLinkParams>) => ComplexRepresentation('Inter-unit link cylinder', ctx, getParams, InterUnitLinkVisual),
 }
+type EllipsoidVisualName = keyof typeof EllipsoidVisuals
+const EllipsoidVisualOptions = Object.keys(EllipsoidVisuals).map(name => [name, name] as [EllipsoidVisualName, string])
 
 export const EllipsoidParams = {
     ...EllipsoidMeshParams,
+    ...IntraUnitLinkParams,
+    ...InterUnitLinkParams,
     unitKinds: PD.MultiSelect<UnitKind>(['atomic'], UnitKindOptions),
+    sizeFactor: PD.Numeric(1, { min: 0.01, max: 10, step: 0.01 }),
+    sizeAspectRatio: PD.Numeric(0.1, { min: 0.01, max: 3, step: 0.01 }),
+    linkCap: PD.Boolean(true),
+    visuals: PD.MultiSelect<EllipsoidVisualName>(['ellipsoid-mesh', 'intra-link', 'inter-link'], EllipsoidVisualOptions),
 }
-export type EllipsoidParams = typeof EllipsoidMeshParams
+export type EllipsoidParams = typeof EllipsoidParams
 export function getEllipsoidParams(ctx: ThemeRegistryContext, structure: Structure) {
-    return PD.clone(EllipsoidMeshParams)
+    return PD.clone(EllipsoidParams)
 }
 
 export type EllipsoidRepresentation = StructureRepresentation<EllipsoidParams>
@@ -33,10 +45,10 @@ export function EllipsoidRepresentation(ctx: RepresentationContext, getParams: R
 
 export const EllipsoidRepresentationProvider: StructureRepresentationProvider<EllipsoidParams> = {
     label: 'Ellipsoid',
-    description: 'Displays anisotropic displacement ellipsoids of atomic elements.',
+    description: 'Displays anisotropic displacement ellipsoids of atomic elements plus bonds as cylinders.',
     factory: EllipsoidRepresentation,
     getParams: getEllipsoidParams,
-    defaultValues: PD.getDefaultValues(EllipsoidMeshParams),
+    defaultValues: PD.getDefaultValues(EllipsoidParams),
     defaultColorTheme: 'element-symbol',
     defaultSizeTheme: 'uniform',
     isApplicable: (structure: Structure) => structure.elementCount > 0 && structure.models.some(m => m.customProperties.has(AtomSiteAnisotrop.Descriptor))

+ 2 - 1
src/mol-repr/structure/visual/carbohydrate-link-cylinder.ts

@@ -66,7 +66,8 @@ export function CarbohydrateLinkVisual(materialId: number): ComplexVisual<Carboh
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<CarbohydrateLinkParams>, currentProps: PD.Values<CarbohydrateLinkParams>) => {
             state.createGeometry = (
                 newProps.linkSizeFactor !== currentProps.linkSizeFactor ||
-                newProps.radialSegments !== currentProps.radialSegments
+                newProps.radialSegments !== currentProps.radialSegments ||
+                newProps.linkCap !== currentProps.linkCap
             )
         }
     }, materialId)

+ 2 - 1
src/mol-repr/structure/visual/carbohydrate-terminal-link-cylinder.ts

@@ -82,7 +82,8 @@ export function CarbohydrateTerminalLinkVisual(materialId: number): ComplexVisua
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<CarbohydrateTerminalLinkParams>, currentProps: PD.Values<CarbohydrateTerminalLinkParams>) => {
             state.createGeometry = (
                 newProps.terminalLinkSizeFactor !== currentProps.terminalLinkSizeFactor ||
-                newProps.radialSegments !== currentProps.radialSegments
+                newProps.radialSegments !== currentProps.radialSegments ||
+                newProps.linkCap !== currentProps.linkCap
             )
         }
     }, materialId)

+ 2 - 1
src/mol-repr/structure/visual/cross-link-restraint-cylinder.ts

@@ -68,7 +68,8 @@ export function CrossLinkRestraintVisual(materialId: number): ComplexVisual<Cros
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<CrossLinkRestraintParams>, currentProps: PD.Values<CrossLinkRestraintParams>) => {
             state.createGeometry = (
                 newProps.sizeFactor !== currentProps.sizeFactor ||
-                newProps.radialSegments !== currentProps.radialSegments
+                newProps.radialSegments !== currentProps.radialSegments ||
+                newProps.linkCap !== currentProps.linkCap
             )
         }
     }, materialId)

+ 2 - 1
src/mol-repr/structure/visual/inter-unit-link-cylinder.ts

@@ -78,7 +78,8 @@ export function InterUnitLinkVisual(materialId: number): ComplexVisual<InterUnit
                 newProps.radialSegments !== currentProps.radialSegments ||
                 newProps.linkScale !== currentProps.linkScale ||
                 newProps.linkSpacing !== currentProps.linkSpacing ||
-                newProps.ignoreHydrogens !== currentProps.ignoreHydrogens
+                newProps.ignoreHydrogens !== currentProps.ignoreHydrogens ||
+                newProps.linkCap !== currentProps.linkCap
             )
         }
     }, materialId)

+ 2 - 1
src/mol-repr/structure/visual/intra-unit-link-cylinder.ts

@@ -96,7 +96,8 @@ export function IntraUnitLinkVisual(materialId: number): UnitsVisual<IntraUnitLi
                 newProps.radialSegments !== currentProps.radialSegments ||
                 newProps.linkScale !== currentProps.linkScale ||
                 newProps.linkSpacing !== currentProps.linkSpacing ||
-                newProps.ignoreHydrogens !== currentProps.ignoreHydrogens
+                newProps.ignoreHydrogens !== currentProps.ignoreHydrogens ||
+                newProps.linkCap !== currentProps.linkCap
             )
         }
     }, materialId)

+ 6 - 5
src/mol-repr/structure/visual/util/link.ts

@@ -18,6 +18,7 @@ import { VisualContext } from '../../../../mol-repr/visual';
 export const LinkCylinderParams = {
     linkScale: PD.Numeric(0.4, { min: 0, max: 1, step: 0.1 }),
     linkSpacing: PD.Numeric(1, { min: 0, max: 2, step: 0.01 }),
+    linkCap: PD.Boolean(false),
     radialSegments: PD.Numeric(16, { min: 2, max: 56, step: 2 }),
 }
 export const DefaultLinkCylinderProps = PD.getDefaultValues(LinkCylinderParams)
@@ -71,7 +72,7 @@ export function createLinkCylinderMesh(ctx: VisualContext, linkBuilder: LinkCyli
 
     if (!linkCount) return Mesh.createEmpty(mesh)
 
-    const { linkScale, linkSpacing, radialSegments } = props
+    const { linkScale, linkSpacing, radialSegments, linkCap: cap } = props
 
     const vertexCountEstimate = radialSegments * 2 * linkCount * 2
     const builderState = MeshBuilder.createState(vertexCountEstimate, vertexCountEstimate / 4, mesh)
@@ -83,8 +84,8 @@ export function createLinkCylinderMesh(ctx: VisualContext, linkBuilder: LinkCyli
         radiusTop: 1,
         radiusBottom: 1,
         radialSegments,
-        topCap: false,
-        bottomCap: false
+        topCap: cap,
+        bottomCap: cap
     }
 
     for (let edgeIndex = 0, _eI = linkCount; edgeIndex < _eI; ++edgeIndex) {
@@ -111,13 +112,13 @@ export function createLinkCylinderMesh(ctx: VisualContext, linkBuilder: LinkCyli
             Vec3.setMagnitude(vShift, vShift, absOffset)
 
             cylinderProps.radiusTop = cylinderProps.radiusBottom = multiRadius
-            cylinderProps.topCap = cylinderProps.bottomCap = false
+            cylinderProps.topCap = cylinderProps.bottomCap = cap
 
             if (o === 3) addCylinder(builderState, va, vb, 0.5, cylinderProps)
             addDoubleCylinder(builderState, va, vb, 0.5, vShift, cylinderProps)
         } else {
             cylinderProps.radiusTop = cylinderProps.radiusBottom = linkRadius
-            cylinderProps.topCap = cylinderProps.bottomCap = false
+            cylinderProps.topCap = cylinderProps.bottomCap = cap
             addCylinder(builderState, va, vb, 0.5, cylinderProps)
         }
     }