All files / Sources/Widgets/Representations/OutlineContextRepresentation index.js

58.82% Statements 20/34
0% Branches 0/5
50% Functions 2/4
62.5% Lines 20/32

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108                                          1x     1x           1x 1x 1x 1x           1x     1x 1x 1x 1x   1x       1x                                                         1x             1x   1x 1x 1x     1x         1x                
import macro from 'vtk.js/Sources/macros';
import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor';
import vtkContextRepresentation from 'vtk.js/Sources/Widgets/Representations/ContextRepresentation';
import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
import vtkPolyData from 'vtk.js/Sources/Common/DataModel/PolyData';
import vtkBoundingBox from 'vtk.js/Sources/Common/DataModel/BoundingBox';
 
import {
  BOUNDS_MAP,
  LINE_ARRAY,
} from 'vtk.js/Sources/Filters/General/OutlineFilter';
 
// ----------------------------------------------------------------------------
// vtkOutlineContextRepresentation methods
// ----------------------------------------------------------------------------
 
// Represents a box outline given 8 points as corners.
// Does not work with an arbitrary set of points. An oriented bounding box
// algorithm may be implemented in the future.
function vtkOutlineContextRepresentation(publicAPI, model) {
  // Set our className
  model.classHierarchy.push('vtkOutlineContextRepresentation');
 
  // internal bounding box
  model.bbox = [...vtkBoundingBox.INIT_BOUNDS];
 
  // --------------------------------------------------------------------------
  // Internal polydata dataset
  // --------------------------------------------------------------------------
 
  model.internalPolyData = vtkPolyData.newInstance({ mtime: 0 });
  model.points = new Float32Array(8 * 3);
  model.internalPolyData.getPoints().setData(model.points, 3);
  model.internalPolyData.getLines().setData(Uint16Array.from(LINE_ARRAY));
 
  // --------------------------------------------------------------------------
  // Generic rendering pipeline
  // --------------------------------------------------------------------------
 
  model.mapper = vtkMapper.newInstance({
    scalarVisibility: false,
  });
  model.actor = vtkActor.newInstance({ parentProp: publicAPI });
  model.actor.getProperty().setEdgeColor(...model.edgeColor);
  model.mapper.setInputConnection(publicAPI.getOutputPort());
  model.actor.setMapper(model.mapper);
 
  publicAPI.addActor(model.actor);
 
  // --------------------------------------------------------------------------
 
  publicAPI.requestData = (inData, outData) => {
    const list = publicAPI
      .getRepresentationStates(inData[0])
      .filter((state) => state.getOrigin && state.getOrigin());
    vtkBoundingBox.reset(model.bbox);
 
    for (let i = 0; i < list.length; i++) {
      const pt = list[i].getOrigin();
      if (pt) {
        vtkBoundingBox.addPoint(model.bbox, ...pt);
      }
    }
 
    // BOUNDS_MAP.length should equal model.points.length
    for (let i = 0; i < BOUNDS_MAP.length; i++) {
      model.points[i] = model.bbox[BOUNDS_MAP[i]];
    }
 
    model.internalPolyData.getPoints().modified();
    model.internalPolyData.modified();
 
    outData[0] = model.internalPolyData;
  };
}
 
// ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
 
const DEFAULT_VALUES = {
  edgeColor: [1, 1, 1],
};
 
// ----------------------------------------------------------------------------
 
export function extend(publicAPI, model, initialValues = {}) {
  Object.assign(model, DEFAULT_VALUES, initialValues);
 
  vtkContextRepresentation.extend(publicAPI, model, initialValues);
  macro.setGetArray(publicAPI, model, ['edgeColor'], 3);
  macro.get(publicAPI, model, ['mapper', 'actor']);
 
  // Object specific methods
  vtkOutlineContextRepresentation(publicAPI, model);
}
 
// ----------------------------------------------------------------------------
 
export const newInstance = macro.newInstance(
  extend,
  'vtkOutlineContextRepresentation'
);
 
// ----------------------------------------------------------------------------
 
export default { newInstance, extend };