UNPKG

chartx3d

Version:

Data Visualization Chart Library

284 lines (249 loc) 9.54 kB
import { Component, _ } from "../Component"; import { Axis } from './axis'; import { FaceNames } from '../../constants'; import { Vector3, MeshBasicMaterial, MeshLambertMaterial, MeshPhongMaterial, CircleBufferGeometry, BoxGeometry, Mesh, Math as _Math } from 'mmgl/src/index'; class CubeUI extends Component { constructor(_coordSystem) { super(_coordSystem); this.name = 'CubeUI'; this.faceAxises = {}; for (let key in FaceNames) { this.faceAxises[FaceNames[key]] = []; } this.init(); } init() { this._initModules(); } _initModules() { let _coordSystem = this._coordSystem; let opt = null; let axises = this.faceAxises; //_dir === 'FRONT' { let origin = _coordSystem.getOriginPosition(FaceNames.FRONT); //初始化X轴 opt = _.clone(_coordSystem.coord.xAxis); let xAxis = new Axis(this, opt) xAxis.setOrigin(origin.clone()); xAxis.setAxisDir(new Vector3(1, 0, 0)); xAxis.setTickLineDir(new Vector3(0, -1, 0)) xAxis.initModules(); this.group.add(xAxis.group); axises[FaceNames.FRONT].push(xAxis); //初始化Y轴 opt = _.clone(_coordSystem.coord.yAxis); let yAxis = new Axis(this, opt); yAxis.setOrigin(origin.clone()); yAxis.setAxisDir(new Vector3(0, 1, 0)); yAxis.setTickLineDir(new Vector3(-1, 0, 0)) yAxis.initModules(); this.group.add(yAxis.group); axises[FaceNames.FRONT].push(yAxis); } //_dir === 'BACK' { let origin = _coordSystem.getOriginPosition(FaceNames.BACK); //初始化X轴 opt = _.clone(_coordSystem.coord.xAxis); let xAxis = new Axis(this, opt) xAxis.setOrigin(origin.clone()); xAxis.setAxisDir(new Vector3(-1, 0, 0)); xAxis.setTickLineDir(new Vector3(0, -1, 0)) xAxis.initModules(); this.group.add(xAxis.group); axises[FaceNames.BACK].push(xAxis); //初始化Y轴 opt = _.clone(_coordSystem.coord.yAxis); let yAxis = new Axis(this, opt) yAxis.setOrigin(origin.clone()); yAxis.setAxisDir(new Vector3(0, 1, 0)); yAxis.setTickLineDir(new Vector3(1, 0, 0)) yAxis.initModules(); this.group.add(yAxis.group); axises[FaceNames.BACK].push(yAxis); } //_dir === 'LEFT' { let origin = _coordSystem.getOriginPosition(FaceNames.LEFT); //初始化X轴 实际为Z轴 opt = _.clone(_coordSystem.coord.xAxis); opt.field = _coordSystem.coord.zAxis.field; let xAxis = new Axis(this, opt); xAxis.setOrigin(origin.clone()); xAxis.setAxisDir(new Vector3(0, 0, 1)); xAxis.setTickLineDir(new Vector3(0, -1, 0)) xAxis.initModules(); this.group.add(xAxis.group); axises[FaceNames.LEFT].push(xAxis); //初始化Y轴 opt = _.clone(_coordSystem.coord.yAxis); opt.label.textAlign = 'right'; let yAxis = new Axis(this, opt); yAxis.setOrigin(origin.clone()); yAxis.setAxisDir(new Vector3(0, 1, 0)); yAxis.setTickLineDir(new Vector3(0, 0, -1)) yAxis.initModules(); this.group.add(yAxis.group); axises[FaceNames.LEFT].push(yAxis); } //_dir === 'RIGHT' { let origin = _coordSystem.getOriginPosition(FaceNames.RIGHT); //测试原地 // let point = new Mesh(new CircleBufferGeometry(2), new MeshBasicMaterial({ color: 'red' })); // let pos = origin.clone(); // pos.z += 0; // point.position.copy(pos); // this.group.add(point); //初始化X轴 实际为Z轴 opt = _.clone(_coordSystem.coord.xAxis); opt.field = _coordSystem.coord.zAxis.field; let xAxis = new Axis(this, opt); xAxis.setOrigin(origin.clone()); xAxis.setAxisDir(new Vector3(0, 0, -1)); xAxis.setTickLineDir(new Vector3(0, -1, 0)) xAxis.initModules(); this.group.add(xAxis.group); axises[FaceNames.RIGHT].push(xAxis); //初始化Y轴 opt = _.clone(_coordSystem.coord.yAxis); //opt.label.offset = 40; //opt.label.textAlign = ""; let yAxis = new Axis(this, opt); yAxis.setOrigin(origin.clone()); yAxis.setAxisDir(new Vector3(0, 1, 0)); yAxis.setTickLineDir(new Vector3(0, 0, 1)) yAxis.initModules(); this.group.add(yAxis.group); axises[FaceNames.RIGHT].push(yAxis); } //_dir === 'TOP' { let origin = _coordSystem.getOriginPosition(FaceNames.TOP); //初始化X轴 opt = _.clone(_coordSystem.coord.xAxis); let xAxis = new Axis(this, opt) xAxis.setOrigin(origin.clone()); xAxis.setAxisDir(new Vector3(1, 0, 0)); xAxis.setTickLineDir(new Vector3(0, 0, 1)) xAxis.initModules(); this.group.add(xAxis.group); axises[FaceNames.TOP].push(xAxis); //修复top面 X轴label的位置 xAxis.group.traverse(label => { if (label.type == "Sprite") { label.position.add(new Vector3(0, 0, 1).multiplyScalar(label.userData.size[1] * 0.5)) } }) // //初始化Y轴 实际为Z轴 opt = _.clone(_coordSystem.coord.yAxis); opt.field = _coordSystem.coord.zAxis.field; //opt.label.textAlign = 'right'; let yAxis = new Axis(this, opt) yAxis.setOrigin(origin.clone()); yAxis.setAxisDir(new Vector3(0, 0, -1)); yAxis.setTickLineDir(new Vector3(-1, 0, 0)) yAxis.initModules(); this.group.add(yAxis.group); axises[FaceNames.TOP].push(yAxis); } //_dir === 'BOTTOM' { let origin = _coordSystem.getOriginPosition(FaceNames.BOTTOM); //初始化X轴 opt = _.clone(_coordSystem.coord.xAxis); let xAxis = new Axis(this, opt) xAxis.setOrigin(origin.clone()); xAxis.setAxisDir(new Vector3(1, 0, 0)); xAxis.setTickLineDir(new Vector3(0, 0, -1)) xAxis.initModules(); this.group.add(xAxis.group); axises[FaceNames.BOTTOM].push(xAxis); //初始化Y轴 实际为Z轴 opt = _.clone(_coordSystem.coord.yAxis); opt.field = _coordSystem.coord.zAxis.field let yAxis = new Axis(this, opt) yAxis.setOrigin(origin.clone()); yAxis.setAxisDir(new Vector3(0, 0, 1)); yAxis.setTickLineDir(new Vector3(-1, 0, 0)) yAxis.initModules(); this.group.add(yAxis.group); axises[FaceNames.BOTTOM].push(yAxis); } { let { width, height, depth } = this._coordSystem.getGraphAreaSize(); let getBasicMaterial = () => { return new MeshLambertMaterial({ polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.1, color: '#FFFFFF' }); } let geometry = new BoxGeometry(width, height, depth); this.box = new Mesh(geometry, getBasicMaterial()); } } hideAxis() { for (let key in FaceNames) { let name = FaceNames[key]; this.faceAxises[name].forEach(axis => { axis.setVisibel(false); }); } } showAxis() { let dir = this._coordSystem.getDirection(); for (let key in FaceNames) { let name = FaceNames[key]; this.faceAxises[name].forEach(axis => { axis.setVisibel(false); if (name == dir) { axis.setVisibel(true); } }); } } draw() { // let app = this._root.app; // app._framework.on('renderbefore', () => { // // box.rotation.x+=0.01; // }) this.group.add(this.box); let dir = this._coordSystem.getDirection(); for (let key in FaceNames) { let name = FaceNames[key]; this.faceAxises[name].forEach(axis => { axis.setVisibel(false); if (name == dir) { axis.setVisibel(true); } axis.draw(); }); } } dispose() { for (let key in FaceNames) { let name = FaceNames[key]; this.faceAxises[name].forEach(axis => { axis.dispose(); }); } this.faceAxises = null; super.dispose(this.box); } resetData() { for (let key in FaceNames) { let name = FaceNames[key]; this.faceAxises[name].forEach(axis => { axis.resetData(); }); } } } export { CubeUI }