|
@@ -14,8 +14,12 @@ import {
|
|
FieldDataTypes,
|
|
FieldDataTypes,
|
|
FieldAssociations,
|
|
FieldAssociations,
|
|
} from '@kitware/vtk.js/Common/DataModel/DataSet/Constants';
|
|
} from '@kitware/vtk.js/Common/DataModel/DataSet/Constants';
|
|
|
|
+
|
|
|
|
+
|
|
import vtkSphereSource from '@kitware/vtk.js/Filters/Sources/SphereSource';
|
|
import vtkSphereSource from '@kitware/vtk.js/Filters/Sources/SphereSource';
|
|
|
|
+import vtkConeSource from '@kitware/vtk.js/Filters/Sources/ConeSource';
|
|
|
|
|
|
|
|
+import vtkSphereMapper from '@kitware/vtk.js/Rendering/Core/SphereMapper';
|
|
|
|
|
|
export class VtkModel {
|
|
export class VtkModel {
|
|
constructor() {
|
|
constructor() {
|
|
@@ -25,37 +29,35 @@ export class VtkModel {
|
|
|
|
|
|
//模板数据
|
|
//模板数据
|
|
this.polyData = vtkPolyData.newInstance();
|
|
this.polyData = vtkPolyData.newInstance();
|
|
-
|
|
|
|
this.mapper = vtkMapper.newInstance();
|
|
this.mapper = vtkMapper.newInstance();
|
|
this.actor = vtkActor.newInstance();
|
|
this.actor = vtkActor.newInstance();
|
|
this.actor.getProperty().setRepresentation(Representation.SURFACE); //线
|
|
this.actor.getProperty().setRepresentation(Representation.SURFACE); //线
|
|
this.actor.getProperty().setColor([0,0.0,1]);
|
|
this.actor.getProperty().setColor([0,0.0,1]);
|
|
-
|
|
|
|
this.mapper.setInputData(this.polyData);
|
|
this.mapper.setInputData(this.polyData);
|
|
this.actor.setMapper(this.mapper);
|
|
this.actor.setMapper(this.mapper);
|
|
- this.renderer.addActor(this.actor);
|
|
|
|
|
|
+ // this.renderer.addActor(this.actor);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
//点数据
|
|
//点数据
|
|
- this.actor2 = vtkActor.newInstance();
|
|
|
|
- this.actor2.getProperty().setRepresentation(Representation.POINTS); //点
|
|
|
|
- this.actor2.getProperty().setColor([2,0,0]);
|
|
|
|
- this.actor2.getProperty().setPointSize(2);
|
|
|
|
- this.actor2.setMapper(this.mapper);
|
|
|
|
- this.renderer.addActor(this.actor2);
|
|
|
|
|
|
+ // this.actor2 = vtkActor.newInstance();
|
|
|
|
+ // this.actor2.getProperty().setRepresentation(Representation.POINTS); //点
|
|
|
|
+ // this.actor2.getProperty().setColor([2,0,0]);
|
|
|
|
+ // this.actor2.getProperty().setPointSize(2);
|
|
|
|
+ // this.actor2.setMapper(this.mapper);
|
|
|
|
+ // this.renderer.addActor(this.actor2);
|
|
|
|
|
|
- //选取
|
|
|
|
- this.interactor = this.renderer.getRenderWindow().getInteractor();
|
|
|
|
- this.apiSpecificRenderWindow = this.interactor.getView();
|
|
|
|
- this.hardwareSelector = this.apiSpecificRenderWindow.getSelector();
|
|
|
|
|
|
+ // const sphereSource = vtkSphereSource.newInstance({
|
|
|
|
+ // center: [0, 0, 0],
|
|
|
|
+ // height: 1.0,
|
|
|
|
+ // });
|
|
|
|
+ // sphereSource.setThetaResolution(64);
|
|
|
|
+ // sphereSource.setPhiResolution(32);
|
|
|
|
|
|
- this.hardwareSelector.setCaptureZValues(true);
|
|
|
|
- // TODO: bug in FIELD_ASSOCIATION_POINTS mode
|
|
|
|
- // hardwareSelector.setFieldAssociation(
|
|
|
|
- // FieldAssociations.FIELD_ASSOCIATION_POINTS
|
|
|
|
- // );
|
|
|
|
- this.hardwareSelector.setFieldAssociation(FieldAssociations.FIELD_ASSOCIATION_POINTS);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
// this.pointerSource = vtkSphereSource.newInstance({
|
|
// this.pointerSource = vtkSphereSource.newInstance({
|
|
// phiResolution: 15,
|
|
// phiResolution: 15,
|
|
// thetaResolution: 15,
|
|
// thetaResolution: 15,
|
|
@@ -86,6 +88,18 @@ export class VtkModel {
|
|
this.jgMapper.setLookupTable(ctf);
|
|
this.jgMapper.setLookupTable(ctf);
|
|
const lut = this.jgMapper.getLookupTable();
|
|
const lut = this.jgMapper.getLookupTable();
|
|
this.scalarBarActor.setScalarsToColors(lut);
|
|
this.scalarBarActor.setScalarsToColors(lut);
|
|
|
|
+
|
|
|
|
+ //选取
|
|
|
|
+ this.lastActor=null;
|
|
|
|
+ this.nodeActors =[]; //节点actor 数据
|
|
|
|
+ this.pipeActors =[]; //管道actor 数据
|
|
|
|
+ this.interactor = this.renderer.getRenderWindow().getInteractor();
|
|
|
|
+ this.apiSpecificRenderWindow = this.interactor.getView();
|
|
|
|
+ this.hardwareSelector = this.apiSpecificRenderWindow.getSelector();
|
|
|
|
+ this.hardwareSelector.setCaptureZValues(true);
|
|
|
|
+ this.hardwareSelector.setFieldAssociation(FieldAssociations.FIELD_ASSOCIATION_POINTS);
|
|
|
|
+ // document.removeEventListener("mousemove", throttleMouseHandler);
|
|
|
|
+
|
|
}
|
|
}
|
|
generateTicks(numberOfTicks) {
|
|
generateTicks(numberOfTicks) {
|
|
return (helper) => {
|
|
return (helper) => {
|
|
@@ -110,18 +124,98 @@ export class VtkModel {
|
|
clearModeAddJg(){
|
|
clearModeAddJg(){
|
|
this.renderer.addActor(this.jgActor);
|
|
this.renderer.addActor(this.jgActor);
|
|
this.renderer.addActor(this.scalarBarActor);
|
|
this.renderer.addActor(this.scalarBarActor);
|
|
|
|
+
|
|
|
|
+ this.nodeActors.forEach((nodeActor) => {
|
|
|
|
+ this.renderer.removeActor(nodeActor.actor);
|
|
|
|
+ });
|
|
|
|
+ this.pipeActors.forEach((pipeActor) => {
|
|
|
|
+ this.renderer.removeActor(pipeActor.actor);
|
|
|
|
+ });
|
|
this.renderer.removeActor(this.actor);
|
|
this.renderer.removeActor(this.actor);
|
|
- this.renderer.removeActor(this.actor2);
|
|
|
|
}
|
|
}
|
|
clearJgAddMode(){
|
|
clearJgAddMode(){
|
|
this.renderer.addActor(this.actor);
|
|
this.renderer.addActor(this.actor);
|
|
- this.renderer.addActor(this.actor2);
|
|
|
|
|
|
+ this.nodeActors.forEach((nodeActor) => {
|
|
|
|
+ this.renderer.addActor(nodeActor.actor);
|
|
|
|
+ });
|
|
|
|
+ this.pipeActors.forEach((pipeActor) => {
|
|
|
|
+ this.renderer.addActor(pipeActor.actor);
|
|
|
|
+ });
|
|
this.renderer.removeActor(this.scalarBarActor);
|
|
this.renderer.removeActor(this.scalarBarActor);
|
|
this.renderer.removeActor(this.jgActor);
|
|
this.renderer.removeActor(this.jgActor);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+function pickOnMouseEvent(event) {
|
|
|
|
+ if (vtkmodel.interactor.isAnimating()) {
|
|
|
|
+ // We should not do picking when interacting with the scene
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ const [x, y] = eventToWindowXY(event);
|
|
|
|
+ // console.log([x,y]);
|
|
|
|
+ // vtkmodel.pointerActor.setVisibility(false);
|
|
|
|
+ vtkmodel.hardwareSelector
|
|
|
|
+ .getSourceDataAsync(vtkmodel.renderer, x, y, x, y)
|
|
|
|
+ .then((result) => {
|
|
|
|
+ if (result) {
|
|
|
|
+ processSelections(result.generateSelection(x, y, x, y));
|
|
|
|
+ // processSelections(result.generateSelection(x, y, x, y));
|
|
|
|
+ } else {
|
|
|
|
+ // processSelections(null);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+}
|
|
|
|
+function eventToWindowXY(event) {
|
|
|
|
+ // We know we are full screen => window.innerXXX
|
|
|
|
+ // Otherwise we can use pixel device ratio or else...
|
|
|
|
+ const { clientX, clientY } = event;
|
|
|
|
+ const [width, height] = vtkmodel.apiSpecificRenderWindow.getSize();
|
|
|
|
+ const x = Math.round((width * clientX) / window.innerWidth);
|
|
|
|
+ const y = Math.round(height * (1 - clientY / window.innerHeight)); // Need to flip Y
|
|
|
|
+ return [x, y];
|
|
|
|
+}
|
|
|
|
+function processSelections(selections) {
|
|
|
|
+ if (!selections || selections.length === 0) {//没有选择
|
|
|
|
+ if(vtkmodel.lastActor==null){
|
|
|
|
|
|
|
|
+ }else{
|
|
|
|
+ vtkmodel.lastActor.getProperty().setColor(WHITE);
|
|
|
|
+ vtkmodel.renderWindow.render();
|
|
|
|
+ }
|
|
|
|
+ vtkmodel.lastActor=null;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const {
|
|
|
|
+ worldPosition: rayHitWorldPosition,
|
|
|
|
+ compositeID,
|
|
|
|
+ prop,
|
|
|
|
+ propID,
|
|
|
|
+ attributeID,
|
|
|
|
+ } = selections[0].getProperties();
|
|
|
|
+ const input = prop.getMapper().getInputData();
|
|
|
|
+ if(vtkmodel.lastActor!=null){
|
|
|
|
+ vtkmodel.lastActor.getProperty().setColor(WHITE);
|
|
|
|
+ vtkmodel.renderWindow.render();
|
|
|
|
+ }
|
|
|
|
+ vtkmodel.lastActor=prop;
|
|
|
|
+ prop.getProperty().setColor(GREEN);
|
|
|
|
+ vtkmodel.nodeActors.forEach((nodeActor) => {
|
|
|
|
+ if(prop==nodeActor.actor){
|
|
|
|
+ // console.log(nodeActor.node);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ vtkmodel.pipeActors.forEach((pipeActor) => {
|
|
|
|
+ if(prop==pipeActor.actor){
|
|
|
|
+ console.log(pipeActor.pipe);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ vtkmodel.renderWindow.render();
|
|
|
|
+}
|
|
|
|
+const throttleMouseHandler = throttle(pickOnMouseEvent, 20);
|
|
|
|
+const WHITE = [1, 1, 1];
|
|
|
|
+const GREEN = [0.1, 0.8, 0.1];
|
|
const vtkmodel = new VtkModel();
|
|
const vtkmodel = new VtkModel();
|
|
export { vtkmodel };
|
|
export { vtkmodel };
|