molstar
Version:
A comprehensive macromolecular library.
113 lines • 5.46 kB
JavaScript
/**
* Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { __assign } from "tslib";
import { Loci } from '../../../mol-model/loci';
import { ParamDefinition as PD } from '../../../mol-util/param-definition';
import { ColorNames } from '../../../mol-util/color/names';
import { ShapeRepresentation } from '../representation';
import { Representation } from '../../representation';
import { Shape } from '../../../mol-model/shape';
import { Mesh } from '../../../mol-geo/geometry/mesh/mesh';
import { MeshBuilder } from '../../../mol-geo/geometry/mesh/mesh-builder';
import { lociLabel } from '../../../mol-theme/label';
import { addAxes } from '../../../mol-geo/geometry/mesh/builder/axes';
import { addOrientedBox } from '../../../mol-geo/geometry/mesh/builder/box';
import { addEllipsoid } from '../../../mol-geo/geometry/mesh/builder/ellipsoid';
import { Axes3D } from '../../../mol-math/geometry';
import { Vec3 } from '../../../mol-math/linear-algebra';
import { MarkerActions } from '../../../mol-util/marker-action';
var SharedParams = {
color: PD.Color(ColorNames.orange),
scale: PD.Numeric(2, { min: 0.1, max: 10, step: 0.1 })
};
var AxesParams = __assign(__assign({}, Mesh.Params), SharedParams);
var BoxParams = __assign(__assign({}, Mesh.Params), SharedParams);
var EllipsoidParams = __assign(__assign({}, Mesh.Params), SharedParams);
var OrientationVisuals = {
'axes': function (ctx, getParams) { return ShapeRepresentation(getAxesShape, Mesh.Utils); },
'box': function (ctx, getParams) { return ShapeRepresentation(getBoxShape, Mesh.Utils); },
'ellipsoid': function (ctx, getParams) { return ShapeRepresentation(getEllipsoidShape, Mesh.Utils); },
};
export var OrientationParams = __assign(__assign(__assign({}, AxesParams), BoxParams), { visuals: PD.MultiSelect(['box'], PD.objectToOptions(OrientationVisuals)), color: PD.Color(ColorNames.orange), scale: PD.Numeric(2, { min: 0.1, max: 5, step: 0.1 }) });
//
function orientationLabel(loci) {
var label = lociLabel(loci, { countsOnly: true });
return "Principal Axes of " + label;
}
function getOrientationName(data) {
return data.locis.length === 1 ? orientationLabel(data.locis[0]) : data.locis.length + " Orientations";
}
//
function buildAxesMesh(data, props, mesh) {
var state = MeshBuilder.createState(256, 128, mesh);
for (var i = 0, il = data.locis.length; i < il; ++i) {
var principalAxes = Loci.getPrincipalAxes(data.locis[i]);
if (principalAxes) {
state.currentGroup = i;
addAxes(state, principalAxes.momentsAxes, props.scale, 2, 20);
}
}
return MeshBuilder.getMesh(state);
}
function getAxesShape(ctx, data, props, shape) {
var mesh = buildAxesMesh(data, props, shape && shape.geometry);
var name = getOrientationName(data);
var getLabel = function (groupId) {
return orientationLabel(data.locis[groupId]);
};
return Shape.create(name, data, mesh, function () { return props.color; }, function () { return 1; }, getLabel);
}
//
function buildBoxMesh(data, props, mesh) {
var state = MeshBuilder.createState(256, 128, mesh);
for (var i = 0, il = data.locis.length; i < il; ++i) {
var principalAxes = Loci.getPrincipalAxes(data.locis[i]);
if (principalAxes) {
state.currentGroup = i;
addOrientedBox(state, principalAxes.boxAxes, props.scale, 2, 20);
}
}
return MeshBuilder.getMesh(state);
}
function getBoxShape(ctx, data, props, shape) {
var mesh = buildBoxMesh(data, props, shape && shape.geometry);
var name = getOrientationName(data);
var getLabel = function (groupId) {
return orientationLabel(data.locis[groupId]);
};
return Shape.create(name, data, mesh, function () { return props.color; }, function () { return 1; }, getLabel);
}
//
function buildEllipsoidMesh(data, props, mesh) {
var state = MeshBuilder.createState(256, 128, mesh);
for (var i = 0, il = data.locis.length; i < il; ++i) {
var principalAxes = Loci.getPrincipalAxes(data.locis[i]);
if (principalAxes) {
var axes = principalAxes.boxAxes;
var origin_1 = axes.origin, dirA = axes.dirA, dirB = axes.dirB;
var size = Axes3D.size(Vec3(), axes);
Vec3.scale(size, size, 0.5);
var radiusScale = Vec3.create(size[2], size[1], size[0]);
state.currentGroup = i;
addEllipsoid(state, origin_1, dirA, dirB, radiusScale, 2);
}
}
return MeshBuilder.getMesh(state);
}
function getEllipsoidShape(ctx, data, props, shape) {
var mesh = buildEllipsoidMesh(data, props, shape && shape.geometry);
var name = getOrientationName(data);
var getLabel = function (groupId) {
return orientationLabel(data.locis[groupId]);
};
return Shape.create(name, data, mesh, function () { return props.color; }, function () { return 1; }, getLabel);
}
export function OrientationRepresentation(ctx, getParams) {
var repr = Representation.createMulti('Orientation', ctx, getParams, Representation.StateBuilder, OrientationVisuals);
repr.setState({ markerActions: MarkerActions.Highlighting });
return repr;
}
//# sourceMappingURL=orientation.js.map