| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 | import macro from '@kitware/vtk.js/macros';import vtkAbstractWidgetFactory from '@kitware/vtk.js/Widgets/Core/AbstractWidgetFactory';import vtkConvexFaceContextRepresentation from '@kitware/vtk.js/Widgets/Representations/ConvexFaceContextRepresentation';import vtkPlaneManipulator from '@kitware/vtk.js/Widgets/Manipulators/PlaneManipulator';import vtkSphereHandleRepresentation from '@kitware/vtk.js/Widgets/Representations/SphereHandleRepresentation';import vtkStateBuilder from '@kitware/vtk.js/Widgets/Core/StateBuilder';import { ViewTypes } from '@kitware/vtk.js/Widgets/Core/WidgetManager/Constants';// ----------------------------------------------------------------------------// Widget linked to a view// ----------------------------------------------------------------------------function widgetBehavior(publicAPI, model) {  let isDragging = null;  publicAPI.setDisplayCallback = (callback) =>    model.representations[0].setDisplayCallback(callback);  publicAPI.handleLeftButtonPress = () => {    if (      !model.activeState ||      !model.activeState.getActive() ||      !model.pickable    ) {      return macro.VOID;    }    isDragging = true;    model._interactor.requestAnimation(publicAPI);    return macro.EVENT_ABORT;  };  publicAPI.handleMouseMove = (callData) => {    if (isDragging && model.pickable) {      return publicAPI.handleEvent(callData);    }    return macro.VOID;  };  publicAPI.handleLeftButtonRelease = () => {    if (isDragging && model.pickable) {      model._interactor.cancelAnimation(publicAPI);    }    isDragging = false;    model.widgetState.deactivate();  };  publicAPI.handleEvent = (callData) => {    if (      model.pickable &&      model.manipulator &&      model.activeState &&      model.activeState.getActive()    ) {      // model.manipulator.setNormal(model.camera.getDirectionOfProjection());      const { worldCoords } = model.manipulator.handleEvent(        callData,        model._apiSpecificRenderWindow      );      if (worldCoords.length) {        model.activeState.setOrigin(...worldCoords);      }      return macro.EVENT_ABORT;    }    return macro.VOID;  };  // --------------------------------------------------------------------------  // initialization  // --------------------------------------------------------------------------  model.camera = model._renderer.getActiveCamera();  model.classHierarchy.push('vtkBoxWidgetProp');}// ----------------------------------------------------------------------------// Factory// ----------------------------------------------------------------------------function vtkBoxWidget(publicAPI, model) {  model.classHierarchy.push('vtkBoxWidget');  // --- Widget Requirement ---------------------------------------------------  model.behavior = widgetBehavior;  model.methodsToLink = ['scaleInPixels'];  publicAPI.getRepresentationsForViewType = (viewType) => {    switch (viewType) {      case ViewTypes.DEFAULT:      case ViewTypes.GEOMETRY:      case ViewTypes.SLICE:      case ViewTypes.VOLUME:      default:        return [          { builder: vtkSphereHandleRepresentation, labels: ['handles'] },          {            builder: vtkConvexFaceContextRepresentation,            labels: ['---', '--+', '-++', '-+-'],          },          {            builder: vtkConvexFaceContextRepresentation,            labels: ['---', '+--', '+-+', '--+'],          },          {            builder: vtkConvexFaceContextRepresentation,            labels: ['+--', '++-', '+++', '+-+'],          },          {            builder: vtkConvexFaceContextRepresentation,            labels: ['++-', '-+-', '-++', '+++'],          },          {            builder: vtkConvexFaceContextRepresentation,            labels: ['--+', '+-+', '+++', '-++'],          },          {            builder: vtkConvexFaceContextRepresentation,            labels: ['---', '+--', '++-', '-+-'],          },        ];    }  };  // --- Widget Requirement ---------------------------------------------------  // Default state  model.widgetState = vtkStateBuilder    .createBuilder()    .addStateFromMixin({      labels: ['handles', '---'],      mixins: ['origin', 'color', 'scale1', 'manipulator'],      name: 'handle',      initialValues: {        scale1: 0.1,        origin: [-1, -1, -1],      },    })    .addStateFromMixin({      labels: ['handles', '-+-'],      mixins: ['origin', 'color', 'scale1', 'manipulator'],      name: 'handle',      initialValues: {        scale1: 0.1,        origin: [-1, 1, -1],      },    })    .addStateFromMixin({      labels: ['handles', '+--'],      mixins: ['origin', 'color', 'scale1', 'manipulator'],      name: 'handle',      initialValues: {        scale1: 0.1,        origin: [1, -1, -1],      },    })    .addStateFromMixin({      labels: ['handles', '++-'],      mixins: ['origin', 'color', 'scale1', 'manipulator'],      name: 'handle',      initialValues: {        scale1: 0.1,        origin: [1, 1, -1],      },    })    .addStateFromMixin({      labels: ['handles', '--+'],      mixins: ['origin', 'color', 'scale1', 'manipulator'],      name: 'handle',      initialValues: {        scale1: 0.1,        origin: [-1, -1, 1],      },    })    .addStateFromMixin({      labels: ['handles', '-++'],      mixins: ['origin', 'color', 'scale1', 'manipulator'],      name: 'handle',      initialValues: {        scale1: 0.1,        origin: [-1, 1, 1],      },    })    .addStateFromMixin({      labels: ['handles', '+-+'],      mixins: ['origin', 'color', 'scale1', 'manipulator'],      name: 'handle',      initialValues: {        scale1: 0.1,        origin: [1, -1, 1],      },    })    .addStateFromMixin({      labels: ['handles', '+++'],      mixins: ['origin', 'color', 'scale1', 'manipulator'],      name: 'handle',      initialValues: {        scale1: 0.1,        origin: [1, 1, 1],      },    })    .build();  const handles = model.widgetState.getStatesWithLabel('handles');  // Default manipulator  model.manipulator = vtkPlaneManipulator.newInstance({    useCameraNormal: true,  });  handles.forEach((handle) => handle.setManipulator(model.manipulator));}// ----------------------------------------------------------------------------const DEFAULT_VALUES = {  manipulator: null,};// ----------------------------------------------------------------------------export function extend(publicAPI, model, initialValues = {}) {  Object.assign(model, DEFAULT_VALUES, initialValues);  vtkAbstractWidgetFactory.extend(publicAPI, model, initialValues);  macro.setGet(publicAPI, model, ['manipulator']);  vtkBoxWidget(publicAPI, model);}// ----------------------------------------------------------------------------export const newInstance = macro.newInstance(extend, 'vtkBoxWidget');// ----------------------------------------------------------------------------export default { newInstance, extend };
 |