@thewtex/vtk.js-esm
Version:
Visualization Toolkit for the Web
370 lines (305 loc) • 13 kB
JavaScript
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import macro from '../../macro.js';
import vtkActor from '../../Rendering/Core/Actor.js';
import vtkCellPicker from '../../Rendering/Core/CellPicker.js';
import vtkHandleRepresentation from './HandleRepresentation.js';
import vtkInteractorObserver from '../../Rendering/Core/InteractorObserver.js';
import vtkMapper from '../../Rendering/Core/Mapper.js';
import { f as distance2BetweenPoints, n as norm } from '../../Common/Core/Math/index.js';
import vtkProperty from '../../Rendering/Core/Property.js';
import vtkSphereSource from '../../Filters/Sources/SphereSource.js';
import { InteractionState } from './HandleRepresentation/Constants.js';
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
// vtkSphereHandleRepresentation methods
// ----------------------------------------------------------------------------
function vtkSphereHandleRepresentation(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkSphereHandleRepresentation');
var superClass = _objectSpread({}, publicAPI);
publicAPI.getActors = function () {
return [model.actor];
};
publicAPI.getNestedProps = function () {
return publicAPI.getActors();
};
publicAPI.placeWidget = function () {
var boundsArray = [];
if (Array.isArray(arguments.length <= 0 ? undefined : arguments[0])) {
boundsArray = arguments.length <= 0 ? undefined : arguments[0];
} else {
for (var i = 0; i < arguments.length; i++) {
boundsArray.push(i < 0 || arguments.length <= i ? undefined : arguments[i]);
}
}
if (boundsArray.length !== 6) {
return;
}
var newBounds = [];
var center = [];
publicAPI.adjustBounds(boundsArray, newBounds, center);
publicAPI.setWorldPosition(center);
for (var _i = 0; _i < 6; _i++) {
model.initialBounds[_i] = newBounds[_i];
}
model.initialLength = Math.sqrt((newBounds[1] - newBounds[0]) * (newBounds[1] - newBounds[0]) + (newBounds[3] - newBounds[2]) * (newBounds[3] - newBounds[2]) + (newBounds[5] - newBounds[4]) * (newBounds[5] - newBounds[4]));
};
publicAPI.setSphereRadius = function (radius) {
model.sphere.setRadius(radius);
publicAPI.modified();
};
publicAPI.getSphereRadius = function () {
return model.sphere.getRadius();
};
publicAPI.getBounds = function () {
var radius = model.sphere.getRadius();
var center = model.sphere.getCenter();
var bounds = [];
bounds[0] = model.placeFactor * (center[0] - radius);
bounds[1] = model.placeFactor * (center[0] + radius);
bounds[2] = model.placeFactor * (center[1] - radius);
bounds[3] = model.placeFactor * (center[1] + radius);
bounds[4] = model.placeFactor * (center[2] - radius);
bounds[5] = model.placeFactor * (center[2] + radius);
return bounds;
};
publicAPI.setWorldPosition = function (position) {
model.sphere.setCenter(position);
superClass.setWorldPosition(model.sphere.getCenter());
};
publicAPI.setDisplayPosition = function (position) {
superClass.setDisplayPosition(position);
publicAPI.setWorldPosition(model.worldPosition.getValue());
};
publicAPI.setHandleSize = function (size) {
superClass.setHandleSize(size);
model.currentHandleSize = model.handleSize;
};
publicAPI.computeInteractionState = function (pos) {
model.visibility = 1;
var pos3d = [pos[0], pos[1], 0.0];
model.cursorPicker.pick(pos3d, model.renderer);
var pickedActor = model.cursorPicker.getDataSet();
if (pickedActor) {
model.interactionState = InteractionState.SELECTING;
} else {
model.interactionState = InteractionState.OUTSIDE;
if (model.activeRepresentation) {
model.visibility = 0;
}
}
return model.interactionState;
};
publicAPI.determineConstraintAxis = function (constraint, x) {
// Look for trivial cases
if (!model.constrained) {
return -1;
}
if (constraint >= 0 && constraint < 3) {
return constraint;
} // Okay, figure out constraint. First see if the choice is
// outside the hot spot
if (!model.waitingForMotion) {
var pickedPosition = model.cursorPicker.getPickPosition();
var d2 = distance2BetweenPoints(pickedPosition, model.startEventPosition);
var tol = model.hotSpotSize * model.initialLength;
if (d2 > tol * tol) {
model.waitingForMotion = 0;
return model.cursorPicker.getCellId();
}
model.waitingForMotion = 1;
model.waitCount = 0;
return -1;
}
if (model.waitingForMotion && x) {
model.waitingForMotion = 0;
var v = [];
v[0] = Math.abs(x[0] - model.startEventPosition[0]);
v[1] = Math.abs(x[1] - model.startEventPosition[1]);
v[2] = Math.abs(x[2] - model.startEventPosition[2]);
if (v[0] > v[1]) {
return v[0] > v[2] ? 0 : 2;
}
return v[1] > v[2] ? 1 : 2;
}
return -1;
};
publicAPI.startComplexWidgetInteraction = function (startEventPos) {
// Record the current event position, and the rectilinear wipe position.
model.startEventPosition[0] = startEventPos[0];
model.startEventPosition[1] = startEventPos[1];
model.startEventPosition[2] = 0.0;
model.lastEventPosition[0] = startEventPos[0];
model.lastEventPosition[1] = startEventPos[1];
var pos = [startEventPos[0], startEventPos[1], 0];
model.cursorPicker.pick(pos, model.renderer);
var pickedActor = model.cursorPicker.getDataSet();
if (pickedActor) {
model.interactionState = InteractionState.SELECTING;
model.constraintAxis = publicAPI.determineConstraintAxis(-1, null);
model.lastPickPosition = model.cursorPicker.getPickPosition();
} else {
model.interactionState = InteractionState.OUTSIDE;
model.constraintAxis = -1;
}
};
publicAPI.displayToWorld = function (eventPos, z) {
return vtkInteractorObserver.computeDisplayToWorld(model.renderer, eventPos[0], eventPos[1], z);
};
publicAPI.complexWidgetInteraction = function (eventPos) {
var focalPoint = vtkInteractorObserver.computeWorldToDisplay(model.renderer, model.lastPickPosition[0], model.lastPickPosition[1], model.lastPickPosition[2]);
var z = focalPoint[2];
var prevPickPoint = publicAPI.displayToWorld(model.lastEventPosition, z);
var pickPoint = publicAPI.displayToWorld(eventPos, z);
if (model.interactionState === InteractionState.SELECTING || model.interactionState === InteractionState.TRANSLATING) {
if (!model.waitingForMotion || model.waitCount++ > 3) {
model.constraintAxis = publicAPI.determineConstraintAxis(model.constraintAxis, pickPoint);
if (model.interactionState === InteractionState.SELECTING && !model.translationMode) {
publicAPI.moveFocus(prevPickPoint, pickPoint);
} else {
publicAPI.translate(prevPickPoint, pickPoint);
}
}
} else if (model.interactionState === InteractionState.SCALING) {
publicAPI.scale(prevPickPoint, pickPoint, eventPos);
}
model.lastEventPosition[0] = eventPos[0];
model.lastEventPosition[1] = eventPos[1];
publicAPI.modified();
};
publicAPI.moveFocus = function (p1, p2) {
// get the motion vector
var v = [];
v[0] = p2[0] - p1[0];
v[1] = p2[1] - p1[1];
v[2] = p2[2] - p1[2];
var focus = model.sphere.getCenter();
if (model.constraintAxis >= 0) {
focus[model.constraintAxis] += v[model.constraintAxis];
} else {
focus[0] += v[0];
focus[1] += v[1];
focus[2] += v[2];
}
publicAPI.setWorldPosition(focus);
};
publicAPI.translate = function (p1, p2) {
// get the motion vector
var v = [];
v[0] = p2[0] - p1[0];
v[1] = p2[1] - p1[1];
v[2] = p2[2] - p1[2];
var pos = model.sphere.getCenter();
if (model.constraintAxis >= 0) {
// move along axis
for (var i = 0; i < 3; i++) {
if (i !== model.constraintAxis) {
v[i] = 0.0;
}
}
}
var newFocus = [];
for (var _i2 = 0; _i2 < 3; _i2++) {
newFocus[_i2] = pos[_i2] + v[_i2];
}
publicAPI.setWorldPosition(newFocus);
var radius = publicAPI.sizeHandlesInPixels(1.0, newFocus);
radius *= model.currentHandleSize / model.handleSize;
model.sphere.setRadius(radius);
};
publicAPI.sizeBounds = function () {
var center = model.sphere.getCenter();
var radius = publicAPI.sizeHandlesInPixels(1.0, center);
radius *= model.currentHandleSize / model.handleSize;
model.sphere.setRadius(radius);
};
publicAPI.scale = function (p1, p2, eventPos) {
// get the motion vector
var v = [];
v[0] = p2[0] - p1[0];
v[1] = p2[1] - p1[1];
v[2] = p2[2] - p1[2];
var bounds = publicAPI.getBounds(); // Compute the scale factor
var sf = norm(v) / Math.sqrt((bounds[1] - bounds[0]) * (bounds[1] - bounds[0]) + (bounds[3] - bounds[2]) * (bounds[3] - bounds[2]) + (bounds[5] - bounds[4]) * (bounds[5] - bounds[4]));
if (eventPos[1] > model.lastEventPosition[1]) {
sf += 1.0;
} else {
sf = 1.0 - sf;
}
model.currentHandleSize *= sf;
model.currentHandleSize = model.currentHandleSize < 0.001 ? 0.001 : model.currentHandleSize;
publicAPI.sizeBounds();
};
publicAPI.highlight = function (highlight) {
if (highlight) {
publicAPI.applyProperty(model.selectProperty);
} else {
publicAPI.applyProperty(model.property);
}
};
publicAPI.buildRepresentation = function () {
if (model.renderer) {
if (!model.placed) {
model.validPick = 1;
model.placed = 1;
}
publicAPI.sizeBounds();
model.sphere.update();
publicAPI.modified();
}
};
publicAPI.applyProperty = function (property) {
model.actor.setProperty(property);
};
} // ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
var DEFAULT_VALUES = {
actor: null,
mapper: null,
sphere: null,
cursorPicker: null,
lastPickPosition: [0, 0, 0],
lastEventPosition: [0, 0],
constraintAxis: -1,
translationMode: 1,
property: null,
selectProperty: null,
placeFactor: 1,
waitingForMotion: 0,
hotSpotSize: 0.05
}; // ----------------------------------------------------------------------------
function extend(publicAPI, model) {
var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance
vtkHandleRepresentation.extend(publicAPI, model, initialValues);
macro.setGet(publicAPI, model, ['glyphResolution', 'defaultScale']);
macro.setGet(publicAPI, model, ['translationMode', 'property', 'selectProperty']);
macro.get(publicAPI, model, ['actor']);
model.sphere = vtkSphereSource.newInstance();
model.sphere.setThetaResolution(16);
model.sphere.setPhiResolution(8);
model.mapper = vtkMapper.newInstance();
model.mapper.setInputConnection(model.sphere.getOutputPort());
model.actor = vtkActor.newInstance();
model.actor.setMapper(model.mapper);
publicAPI.setHandleSize(15);
model.currentHandleSize = model.handleSize;
model.cursorPicker = vtkCellPicker.newInstance();
model.cursorPicker.setPickFromList(1);
model.cursorPicker.initializePickList();
model.cursorPicker.addPickList(model.actor);
model.property = vtkProperty.newInstance();
model.property.setColor(1, 1, 1);
model.selectProperty = vtkProperty.newInstance();
model.selectProperty.setColor(0, 1, 0);
model.actor.setProperty(model.property); // Object methods
vtkSphereHandleRepresentation(publicAPI, model);
} // ----------------------------------------------------------------------------
var newInstance = macro.newInstance(extend, 'vtkSphereHandleRepresentation'); // ----------------------------------------------------------------------------
var vtkSphereHandleRepresentation$1 = {
newInstance: newInstance,
extend: extend
};
export default vtkSphereHandleRepresentation$1;
export { extend, newInstance };