|  | @@ -0,0 +1,147 @@
 | 
	
		
			
				|  |  | +<template>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    <div id="vtkContainer"  />
 | 
	
		
			
				|  |  | +</template>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<script>
 | 
	
		
			
				|  |  | +import '@kitware/vtk.js/favicon';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Load the rendering pieces we want to use (for both WebGL and WebGPU)
 | 
	
		
			
				|  |  | +import '@kitware/vtk.js/Rendering/Profiles/Geometry';
 | 
	
		
			
				|  |  | +import { onMounted } from 'vue';
 | 
	
		
			
				|  |  | +import vtkRenderWindowWithControlBar from '@kitware/vtk.js/Rendering/Misc/RenderWindowWithControlBar';
 | 
	
		
			
				|  |  | +import vtkSlider from '@kitware/vtk.js/Interaction/UI/Slider';
 | 
	
		
			
				|  |  | +import vtkCornerAnnotation from '@kitware/vtk.js/Interaction/UI/CornerAnnotation';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor';
 | 
	
		
			
				|  |  | +import vtkConeSource from '@kitware/vtk.js/Filters/Sources/ConeSource';
 | 
	
		
			
				|  |  | +import vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper';
 | 
	
		
			
				|  |  | +export default {
 | 
	
		
			
				|  |  | +  name: 'HelloWorld',
 | 
	
		
			
				|  |  | + 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  //体制
 | 
	
		
			
				|  |  | +  setup() {
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    onMounted(() => {
 | 
	
		
			
				|  |  | +      // Define container size/position
 | 
	
		
			
				|  |  | +const body = document.querySelector('body');
 | 
	
		
			
				|  |  | +// const rootContainer = document.createElement('div');
 | 
	
		
			
				|  |  | +// rootContainer.style.position = 'relative';
 | 
	
		
			
				|  |  | +// rootContainer.style.width = '500px';
 | 
	
		
			
				|  |  | +// rootContainer.style.height = '500px';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// body.appendChild(rootContainer);
 | 
	
		
			
				|  |  | +body.style.margin = '0';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Create render window inside container
 | 
	
		
			
				|  |  | +const rootContainer =document.getElementById("vtkContainer");
 | 
	
		
			
				|  |  | +rootContainer.style.position = 'relative';
 | 
	
		
			
				|  |  | +rootContainer.style.width = '500px';
 | 
	
		
			
				|  |  | +rootContainer.style.height = '500px';
 | 
	
		
			
				|  |  | +console.log("rootContainer:",rootContainer);    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const renderWindow = vtkRenderWindowWithControlBar.newInstance({
 | 
	
		
			
				|  |  | +  controlSize: 25,
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +renderWindow.setContainer(rootContainer);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Add some content to the renderer
 | 
	
		
			
				|  |  | +const coneSource = vtkConeSource.newInstance();
 | 
	
		
			
				|  |  | +const mapper = vtkMapper.newInstance();
 | 
	
		
			
				|  |  | +const actor = vtkActor.newInstance();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +mapper.setInputConnection(coneSource.getOutputPort());
 | 
	
		
			
				|  |  | +actor.setMapper(mapper);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderWindow.getRenderer().addActor(actor);
 | 
	
		
			
				|  |  | +renderWindow.getRenderer().resetCamera();
 | 
	
		
			
				|  |  | +renderWindow.getRenderWindow().render();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Set control bar to be red so we can see it + layout setup...
 | 
	
		
			
				|  |  | +renderWindow.getControlContainer().style.background = '#eee';
 | 
	
		
			
				|  |  | +renderWindow.getControlContainer().style.display = 'flex';
 | 
	
		
			
				|  |  | +renderWindow.getControlContainer().style.alignItems = 'stretch';
 | 
	
		
			
				|  |  | +renderWindow.getControlContainer().style.justifyContent = 'stretch';
 | 
	
		
			
				|  |  | +renderWindow.getControlContainer().innerHTML = `
 | 
	
		
			
				|  |  | +  <button alt="Left"   title="Left"   value="left">L</button>
 | 
	
		
			
				|  |  | +  <button alt="Top"    title="Top"    value="top">T</button>
 | 
	
		
			
				|  |  | +  <button alt="Right"  title="Right"  value="right">R</button>
 | 
	
		
			
				|  |  | +  <button alt="Bottom" title="Bottom" value="bottom">B</button>
 | 
	
		
			
				|  |  | +  <div class="js-slider"></div>
 | 
	
		
			
				|  |  | +`;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Add corner annotation
 | 
	
		
			
				|  |  | +const cornerAnnotation = vtkCornerAnnotation.newInstance();
 | 
	
		
			
				|  |  | +cornerAnnotation.setContainer(renderWindow.getRenderWindowContainer());
 | 
	
		
			
				|  |  | +cornerAnnotation.getAnnotationContainer().style.color = 'white';
 | 
	
		
			
				|  |  | +cornerAnnotation.updateMetadata(coneSource.get('resolution', 'mtime'));
 | 
	
		
			
				|  |  | +cornerAnnotation.updateTemplates({
 | 
	
		
			
				|  |  | +  nw(meta) {
 | 
	
		
			
				|  |  | +    return `<b>Resolution: </b> ${meta.resolution}`;
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  se(meta) {
 | 
	
		
			
				|  |  | +    return `<span style="font-size: 50%"><i style="color: red;">mtime:</i>${meta.mtime}</span><br/>Annotation Corner`;
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Add slider to the control bar
 | 
	
		
			
				|  |  | +const sliderContainer = renderWindow
 | 
	
		
			
				|  |  | +  .getControlContainer()
 | 
	
		
			
				|  |  | +  .querySelector('.js-slider');
 | 
	
		
			
				|  |  | +sliderContainer.style.flex = '1';
 | 
	
		
			
				|  |  | +sliderContainer.style.position = 'relative';
 | 
	
		
			
				|  |  | +sliderContainer.style.minWidth = '25px';
 | 
	
		
			
				|  |  | +sliderContainer.style.minHeight = '25px';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const slider = vtkSlider.newInstance();
 | 
	
		
			
				|  |  | +slider.generateValues(6, 60, 55);
 | 
	
		
			
				|  |  | +slider.setValue(6);
 | 
	
		
			
				|  |  | +slider.setContainer(sliderContainer);
 | 
	
		
			
				|  |  | +slider.onValueChange((resolution) => {
 | 
	
		
			
				|  |  | +  coneSource.set({ resolution });
 | 
	
		
			
				|  |  | +  renderWindow.getRenderWindow().render();
 | 
	
		
			
				|  |  | +  cornerAnnotation.updateMetadata(coneSource.get('resolution', 'mtime'));
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function updateSizeAndOrientation() {
 | 
	
		
			
				|  |  | +  renderWindow.resize();
 | 
	
		
			
				|  |  | +  slider.resize();
 | 
	
		
			
				|  |  | +  renderWindow.getControlContainer().style.flexFlow = slider.getOrientation()
 | 
	
		
			
				|  |  | +    ? 'row'
 | 
	
		
			
				|  |  | +    : 'column';
 | 
	
		
			
				|  |  | +  setTimeout(slider.resize, 0);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +updateSizeAndOrientation();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Handle UI to change bar location
 | 
	
		
			
				|  |  | +function onClick(e) {
 | 
	
		
			
				|  |  | +  renderWindow.setControlPosition(e.target.value);
 | 
	
		
			
				|  |  | +  updateSizeAndOrientation();
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const list = document.querySelectorAll('button');
 | 
	
		
			
				|  |  | +let count = list.length;
 | 
	
		
			
				|  |  | +while (count--) {
 | 
	
		
			
				|  |  | +  list[count].style.width = '25px';
 | 
	
		
			
				|  |  | +  list[count].style.height = '25px';
 | 
	
		
			
				|  |  | +  list[count].style.flex = 'none';
 | 
	
		
			
				|  |  | +  list[count].addEventListener('click', onClick);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    return ;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +</script>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<style scoped>
 | 
	
		
			
				|  |  | +.controls {
 | 
	
		
			
				|  |  | +  position: absolute;
 | 
	
		
			
				|  |  | +  top: 25px;
 | 
	
		
			
				|  |  | +  left: 25px;
 | 
	
		
			
				|  |  | +  background: white;
 | 
	
		
			
				|  |  | +  padding: 12px;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +</style>
 |