UNPKG

@thewtex/vtk.js-esm

Version:

Visualization Toolkit for the Web

298 lines (240 loc) 11 kB
import _defineProperty from '@babel/runtime/helpers/defineProperty'; import HandleRepConstants from './HandleRepresentation/Constants.js'; import macro from '../../macro.js'; import vtkAbstractWidget from './AbstractWidget.js'; import vtkHandleWidget from './HandleWidget.js'; import vtkLineRepresentation from './LineRepresentation.js'; import { State } from './LineRepresentation/Constants.js'; import Constants from './LineWidget/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; } var WidgetState = Constants.WidgetState; var InteractionState = HandleRepConstants.InteractionState; // ---------------------------------------------------------------------------- // vtkHandleWidget methods // ---------------------------------------------------------------------------- function vtkLineWidget(publicAPI, model) { // Set our className model.classHierarchy.push('vtkLineWidget'); var superClass = _objectSpread({}, publicAPI); publicAPI.setCursor = function (state) { switch (state) { case State.OUTSIDE: { model.interactor.getView().setCursor('default'); break; } default: { model.interactor.getView().setCursor('pointer'); } } }; publicAPI.setCurrentHandle = function (value) { model.currentHandle = value; }; publicAPI.setInteractor = function (i) { superClass.setInteractor(i); model.point1Widget.setInteractor(model.interactor); model.point2Widget.setInteractor(model.interactor); publicAPI.modified(); }; publicAPI.setEnabled = function (enabling) { superClass.setEnabled(enabling); if (!model.widgetRep) { return; } // Use the representations from the line widget // for the point widgets to avoid creating // default representations when setting the // interactor below model.point1Widget.setWidgetRep(model.widgetRep.getPoint1Representation()); model.point2Widget.setWidgetRep(model.widgetRep.getPoint2Representation()); if (model.widgetState === WidgetState.START) { model.point1Widget.setEnabled(0); model.point2Widget.setEnabled(0); model.widgetRep.setLineVisibility(0); model.widgetRep.setPoint1Visibility(1); model.widgetRep.setPoint2Visibility(0); } else { model.point1Widget.setEnabled(enabling); model.point2Widget.setEnabled(enabling); model.widgetRep.setLineVisibility(1); model.widgetRep.setPoint1Visibility(1); model.widgetRep.setPoint2Visibility(1); } }; publicAPI.setProcessEvents = function (processEvents) { superClass.setProcessEvents(processEvents); model.point1Widget.setProcessEvents(processEvents); model.point2Widget.setProcessEvents(processEvents); }; publicAPI.setWidgetStateToStart = function () { model.widgetState = WidgetState.START; publicAPI.setCurrentHandle(0); publicAPI.setEnabled(model.enabled); }; publicAPI.setWidgetStateToManipulate = function () { model.widgetState = WidgetState.MANIPULATE; publicAPI.setCurrentHandle(-1); publicAPI.setEnabled(model.enabled); }; publicAPI.handleMouseMove = function (callData) { return publicAPI.moveAction(callData); }; publicAPI.handleLeftButtonPress = function (callData) { return publicAPI.selectAction(callData); }; publicAPI.handleLeftButtonRelease = function (callData) { return publicAPI.endSelectAction(callData); }; publicAPI.handleMiddleButtonPress = function (callData) { return publicAPI.translateAction(callData); }; publicAPI.handleMiddleButtonRelease = function (callData) { return publicAPI.endSelectAction(callData); }; publicAPI.handleRightButtonPress = function (callData) { return publicAPI.scaleAction(callData); }; publicAPI.handleRightButtonRelease = function (callData) { return publicAPI.endSelectAction(callData); }; publicAPI.selectAction = function (callData) { var position = [callData.position.x, callData.position.y]; if (model.widgetState === WidgetState.START) { var pos3D = model.point1Widget.getWidgetRep().displayToWorld(position, 0); // The first time we click, the method is called twice if (model.currentHandle < 1) { model.widgetRep.setLineVisibility(1); model.widgetRep.setPoint1WorldPosition(pos3D); // Trick to avoid a line with a zero length // If the line has a zero length, it appears with bad extremities pos3D[0] += 0.000000001; model.widgetRep.setPoint2WorldPosition(pos3D); publicAPI.setCurrentHandle(model.currentHandle + 1); } else { model.widgetRep.setPoint2Visibility(1); model.widgetRep.setPoint2WorldPosition(pos3D); // When two points are placed, we go back to the native model.widgetState = WidgetState.MANIPULATE; publicAPI.setCurrentHandle(-1); } } else { var state = model.widgetRep.computeInteractionState(position); if (state === InteractionState.OUTSIDE) { return; } model.widgetState = WidgetState.ACTIVE; publicAPI.updateHandleWidgets(state); publicAPI.invokeStartInteractionEvent(); } model.widgetRep.startComplexWidgetInteraction(position); publicAPI.render(); }; publicAPI.translateAction = function (callData) { var position = [callData.position.x, callData.position.y]; var state = model.widgetRep.computeInteractionState(position); if (state === InteractionState.OUTSIDE) { return; } model.widgetState = WidgetState.ACTIVE; model.widgetRep.startComplexWidgetInteraction(position); publicAPI.invokeStartInteractionEvent(); }; publicAPI.scaleAction = function (callData) { var position = [callData.position.x, callData.position.y]; var state = model.widgetRep.computeInteractionState(position); if (state === InteractionState.OUTSIDE) { return; } model.widgetState = WidgetState.ACTIVE; model.widgetRep.startComplexWidgetInteraction(position); publicAPI.invokeStartInteractionEvent(); }; publicAPI.moveAction = function (callData) { var position = [callData.position.x, callData.position.y]; var modified = false; if (model.widgetState === WidgetState.MANIPULATE) { // In MANIPULATE, we are hovering above the widget // Check if above a sphere and enable/disable if needed var state = model.widgetRep.computeInteractionState(position); modified = publicAPI.updateHandleWidgets(state); } else if (model.widgetState === WidgetState.START) { // In START, we are placing the sphere widgets. // Move current handle along the mouse position. model.widgetRep.complexWidgetInteraction(position); var pos3D = model.point1Widget.getWidgetRep().displayToWorld(position, 0); if (model.currentHandle === 0) { model.widgetRep.setPoint1WorldPosition(pos3D); } else { model.widgetRep.setPoint2WorldPosition(pos3D); } modified = true; } else if (model.widgetState === WidgetState.ACTIVE) { // In ACTIVE, we are moving a sphere widget. // Update the line extremities to follow the spheres. model.widgetRep.setPoint1WorldPosition(model.point1Widget.getWidgetRep().getWorldPosition()); model.widgetRep.setPoint2WorldPosition(model.point2Widget.getWidgetRep().getWorldPosition()); modified = true; } if (modified) { publicAPI.invokeInteractionEvent(); publicAPI.render(); } }; publicAPI.endSelectAction = function (callData) { if (model.widgetState === WidgetState.START) { return; } var position = [callData.position.x, callData.position.y]; model.widgetRep.complexWidgetInteraction(position); model.widgetRep.setPoint1WorldPosition(model.point1Widget.getWidgetRep().getWorldPosition()); model.widgetRep.setPoint2WorldPosition(model.point2Widget.getWidgetRep().getWorldPosition()); model.widgetState = WidgetState.MANIPULATE; publicAPI.invokeEndInteractionEvent(); publicAPI.render(); }; publicAPI.createDefaultRepresentation = function () { if (!model.widgetRep) { model.widgetRep = vtkLineRepresentation.newInstance(); } }; publicAPI.updateHandleWidgets = function (state) { var modified = false; publicAPI.setCursor(state); var enablePoint1Widget = state === State.ONP1; var enablePoint2Widget = state === State.ONP2; if (enablePoint1Widget !== model.point1Widget.getEnabled()) { model.point1Widget.setEnabled(enablePoint1Widget); modified = true; } if (enablePoint2Widget !== model.point2Widget.getEnabled()) { model.point2Widget.setEnabled(enablePoint2Widget); modified = true; } return modified; }; } // ---------------------------------------------------------------------------- // Object factory // ---------------------------------------------------------------------------- var DEFAULT_VALUES = { widgetState: WidgetState.START, currentHandle: 0, point1Widget: null, point2Widget: null }; // ---------------------------------------------------------------------------- function extend(publicAPI, model) { var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance vtkAbstractWidget.extend(publicAPI, model, initialValues); model.point1Widget = vtkHandleWidget.newInstance(); model.point1Widget.setParent(publicAPI); model.point1Widget.createDefaultRepresentation(); model.point2Widget = vtkHandleWidget.newInstance(); model.point2Widget.setParent(publicAPI); model.point2Widget.createDefaultRepresentation(); // Object methods vtkLineWidget(publicAPI, model); } // ---------------------------------------------------------------------------- var newInstance = macro.newInstance(extend, 'vtkLineWidget'); // ---------------------------------------------------------------------------- var vtkLineWidget$1 = { newInstance: newInstance, extend: extend }; export default vtkLineWidget$1; export { extend, newInstance };