Select Git revision
graph3D.component.ts
Forked from
matefun / Frontend
141 commits behind the upstream repository.
graph3D.component.ts 5.11 KiB
import { Component, OnInit, ViewChild, ElementRef, NgZone, AfterViewInit } from '@angular/core';
import * as graph3DLib from 'graph3D';
import { GHCIService } from '../../../shared/services/ghci.service';
import { formatJSON, AnimationProps, Zoom3DType, GraphProps, Default_GraphProps, debounce } from './graph3D.helper';
import { TranslateService } from '@ngx-translate/core';
import { TitleCasePipe } from '../../../shared/pipes/titlecase.pipe';
@Component({
selector: 'graph3d-component',
templateUrl: './graph3D.component.html',
styleUrls: ['./graph3D.component.scss'],
host: {
'(window:resize)': 'onResize($event)'
}
})
export class Graph3DComponent implements AfterViewInit {
private ghciServiceSub: any;
private translateService: any;
private titlecasePipe: any;
@ViewChild('graph3DElement')
private graph3DRef: ElementRef;
graphProps : GraphProps = Default_GraphProps;
animationProps : AnimationProps = {
visible: false,
playing: false,
value: 0,
speed: 1000
};
constructor(ghciService: GHCIService, private zone: NgZone, public translate: TranslateService) {
const self = this;
// i18n
this.translateService = translate;
this.titlecasePipe = new TitleCasePipe();
this.ghciServiceSub = ghciService.messages.subscribe(
message => {
if (message.tipo == "canvas3D") {
const figures = JSON.parse(formatJSON(message.resultado));
self.clear();
graph3DLib.drawFigures(figures);
}
else if (message.tipo == "animacion3D") {
const frames = message.resultado.map((frame) => JSON.parse(formatJSON(frame)));
self.clear();
this.animationProps.visible = true;
this.animationProps.playing = true;
this.animationProps.value = 0;
graph3DLib.initializeAnimation(frames,
(value) => this.animationProps.value = value
);
graph3DLib.playAnimation();
}
}
)
}
ngAfterViewInit() {
//this.zone.runOutsideAngular(() => {
graph3DLib.initialize(this.graph3DRef.nativeElement);
//})
}
ngOnDestroy() {
if (this.ghciServiceSub) {
this.ghciServiceSub.unsubscribe();
}
}
onActivate() {
setTimeout(() => {
this.onResize(null);
})
}
onResize(event){
const {width, height} = this.graph3DRef.nativeElement.getBoundingClientRect();
if (width > 0 && height > 0)
graph3DLib.changeSize({width, height});
}
onAnimationChangeSpeed = (value) => {
this.animationProps.speed = parseInt(value);
graph3DLib.changeSpeedAnimation(parseInt(value));
}
onAnimationTogglePlay = () => {
if (this.animationProps.playing) {
graph3DLib.pauseAnimation();
}
else {
graph3DLib.playAnimation();
}
this.animationProps.playing = !this.animationProps.playing;
}
public changeZoomType = (type: Zoom3DType = null) => {
if (type != null) {
this.graphProps.zoomType = type;
}
else {
this.graphProps.zoomType = (this.graphProps.zoomType % 4) + 1;
}
graph3DLib.changeZoomType(this.graphProps.zoomType);
}
public changeAxesVisibility = () => {
this.graphProps.showAxes = !this.graphProps.showAxes;
graph3DLib.showAxes(this.graphProps.showAxes);
}
handleAxesRangeDebounced = debounce(function () {
setTimeout(() =>
graph3DLib.changeAxesSize(this.graphProps.range)
);
}, 500);
public onChangeAxesSize = (v, event) => {
let value = this.graphProps.range[v];
const min = parseInt(event.target.min);
const max = parseInt(event.target.max);
if (value == null) {
value = v.search('Min') ? min : max;
this.graphProps.range[v] = value;
}
if (value < min) {
this.graphProps.range[v] = min;
}
if (value > max) {
this.graphProps.range[v] = max;
}
this.handleAxesRangeDebounced();
//graph3DLib.changeAxesSize(this.graphProps.range)
}
public onChangeQuality = () => {
const value = this.graphProps.quality;
if (value == null || value <= 1) {
this.graphProps.quality = 30;
}
else {
this.graphProps.quality = value;
}
graph3DLib.changeOptions({quality: value});
}
public zoomIn = () => {
graph3DLib.changeZoom(true);
}
public zoomOut = () => {
graph3DLib.changeZoom(false);
}
public clear = () => {
this.animationProps.visible = false;
graph3DLib.clear();
}
public center = () => {
this.graphProps = Default_GraphProps;
graph3DLib.reset();
}
public getZoom3DTypeName = (type: Zoom3DType) => {
switch (type) {
case Zoom3DType.Normal:
return this.titlecasePipe.transform(this.translateService.get('i18n.object.normal').value);
case Zoom3DType.XAxis:
return this.titlecasePipe.transform(this.translateService.get('i18n.object.axis').value) + ' x';
case Zoom3DType.YAxis:
return this.titlecasePipe.transform(this.translateService.get('i18n.object.axis').value) + ' y';
case Zoom3DType.ZAxis:
return this.titlecasePipe.transform(this.translateService.get('i18n.object.axis').value) + ' z';
}
}
}