UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

1 lines • 26.1 kB
{"version":3,"file":"c8y-ngx-components-widgets-implementations-three-d-rotation.mjs","sources":["../../widgets/implementations/three-d-rotation/three-d-rotation/three-d-rotation.component.ts","../../widgets/implementations/three-d-rotation/three-d-rotation/three-d-rotation.component.html","../../widgets/implementations/three-d-rotation/three-d-rotation-widget-view/three-d-rotation-widget-view.component.ts","../../widgets/implementations/three-d-rotation/three-d-rotation-widget-view/three-d-rotation-widget-view.component.html","../../widgets/implementations/three-d-rotation/three-d-rotation-widget-config/three-d-rotation-widget-config.component.ts","../../widgets/implementations/three-d-rotation/three-d-rotation-widget-config/three-d-rotation-widget-config.component.html","../../widgets/implementations/three-d-rotation/c8y-ngx-components-widgets-implementations-three-d-rotation.ts"],"sourcesContent":["import {\n AfterViewInit,\n Component,\n ElementRef,\n Input,\n OnDestroy,\n OnInit,\n ViewChild\n} from '@angular/core';\nimport { combineLatest, from, Observable, of, Subject, Subscription } from 'rxjs';\nimport { distinctUntilChanged, filter, map, shareReplay, switchMap } from 'rxjs/operators';\nimport { loadThree } from '@c8y/ngx-components/lazy/three';\nimport { ThreeDRotationWidgetRotate } from '../three-d-rotation.model';\nimport { loadOrbitControls } from '@c8y/ngx-components/lazy/three-orbit-controls';\nimport type * as THREE from 'three';\nimport type { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';\n\n@Component({\n selector: 'c8y-three-d-rotation',\n templateUrl: './three-d-rotation.component.html',\n standalone: true,\n imports: []\n})\nexport class ThreeDRotationComponent implements AfterViewInit, OnInit, OnDestroy {\n @ViewChild('canvas')\n private canvasRef: ElementRef;\n\n @Input() angles$: Observable<ThreeDRotationWidgetRotate> = of({ x: 0, y: 0, z: 0 });\n @Input() modelObj$: Observable<any>;\n @Input() cameraType$: Observable<string> = of('PC');\n @Input() isWireframe$: Observable<boolean> = of(true);\n\n get canvas(): HTMLCanvasElement | null {\n return this.canvasRef?.nativeElement;\n }\n\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera | THREE.OrthographicCamera;\n model: THREE.Object3D;\n private renderer: THREE.WebGLRenderer;\n\n private afterViewInit$ = new Subject<void>();\n\n private renderSubscription: Subscription;\n private controls: OrbitControls;\n\n ngOnInit() {\n const three$ = from(loadThree()).pipe(shareReplay(1));\n const model$ = combineLatest([three$, this.modelObj$]).pipe(\n filter(([, modelObj]) => !!modelObj),\n switchMap(([three, modelObj]) => this.loadModel(modelObj, three))\n );\n const modelWithWireframe$ = combineLatest([model$, this.isWireframe$]).pipe(\n map(([model, isWireframe]) => this.setWireframe(model, isWireframe))\n );\n\n const rotatedModel$ = combineLatest([modelWithWireframe$, this.angles$]).pipe(\n filter(([, angles]) => !!angles),\n map(([model, angles]) => {\n Object.assign(model.rotation, angles);\n return model;\n })\n );\n\n const cameraType$ = this.cameraType$.pipe(\n filter(type => !!type),\n distinctUntilChanged()\n );\n\n let previousCameraType: string;\n this.renderSubscription = combineLatest([\n three$,\n rotatedModel$,\n cameraType$,\n this.afterViewInit$\n ])\n .pipe(filter(([, model]) => !!model))\n .subscribe(async ([three, model, cameraType]) => {\n if (model !== this.model || previousCameraType !== cameraType) {\n this.model = model;\n previousCameraType = cameraType;\n this.createScene(three, model, cameraType);\n }\n if (!this.renderer) {\n await this.setupRenderer(three);\n }\n this.render();\n });\n }\n\n ngOnDestroy(): void {\n this.renderSubscription?.unsubscribe();\n this.controls?.dispose();\n }\n\n ngAfterViewInit() {\n this.afterViewInit$.next();\n }\n\n async loadModel(\n modelObj: any,\n three: typeof THREE\n ): Promise<THREE.Object3D<THREE.Object3DEventMap>> {\n const loader = new three.ObjectLoader();\n const parsedModel = await loader.parse(modelObj);\n return parsedModel;\n }\n\n async setupRenderer(three: typeof THREE) {\n //* Renderer\n // Use canvas element in template\n this.renderer = new three.WebGLRenderer({ canvas: this.canvas });\n this.renderer.setPixelRatio(devicePixelRatio);\n this.renderer.setSize(this.canvas.clientWidth, this.canvas.clientHeight);\n\n const { OrbitControls } = await loadOrbitControls();\n this.controls = new OrbitControls(this.camera, this.renderer.domElement);\n this.controls.enableDamping = true;\n this.controls.dampingFactor = 0.25;\n this.controls.rotateSpeed = 0.35;\n this.controls.addEventListener('change', () => this.render());\n }\n\n setWireframe(parsedModel: THREE.Object3D, isWireframe: boolean) {\n parsedModel.children.forEach((child: any) => {\n if (child.material) {\n child.material.wireframe = isWireframe;\n }\n });\n return parsedModel;\n }\n\n private render(): void {\n this.renderer?.render(this.scene, this.camera);\n }\n\n private createScene(three: typeof THREE, model: THREE.Object3D, cameraType: string) {\n //* Scene\n this.scene = new three.Scene();\n this.scene.background = new three.Color(0xffffff);\n this.scene.add(model);\n\n const light = new three.AmbientLight(0xffffff, 0.5);\n const lightDirectional = new three.DirectionalLight(0xffffff);\n const lightDirectional2 = new three.DirectionalLight(0xffffff);\n\n lightDirectional.position.set(20, 25, 30);\n lightDirectional2.position.set(-20, -25, -30);\n this.scene.add(lightDirectional);\n this.scene.add(lightDirectional2);\n this.scene.add(light);\n\n this.camera = this.createCamera(three, cameraType);\n }\n\n private createCamera(three: typeof THREE, cameraType: string) {\n let camera: THREE.OrthographicCamera | THREE.PerspectiveCamera;\n switch (cameraType) {\n case 'OC':\n camera = new three.OrthographicCamera(30 / -2, 30 / 2, 30 / 2, 30 / -2, 1, 1000);\n break;\n case 'PC':\n default:\n camera = new three.PerspectiveCamera(30, this.getAspectRatio(), 0.1, 1000);\n break;\n }\n\n camera.rotateX(Math.PI / 2);\n camera.rotateY(Math.PI / 2);\n\n camera.position.z = 23;\n camera.position.x = 14;\n camera.position.y = 7;\n\n return camera;\n }\n\n private getAspectRatio() {\n return this.canvas.clientWidth / this.canvas.clientHeight;\n }\n}\n","<canvas #canvas class=\"fit-w fit-h\"></canvas>\n","import { Component, Input, OnChanges, Optional, SimpleChanges } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport {\n filter,\n map,\n shareReplay,\n switchMap,\n distinctUntilChanged,\n startWith\n} from 'rxjs/operators';\nimport { MeasurementRealtimeService } from '@c8y/ngx-components';\nimport { ThreeDRotationWidgetConfig, ThreeDRotationWidgetRotate } from '../three-d-rotation.model';\nimport { loadBoxModel } from '@c8y/ngx-components/widgets/implementations/three-d-rotation/lazy-box-model';\nimport { loadPhoneModel } from '@c8y/ngx-components/widgets/implementations/three-d-rotation/lazy-phone-model';\nimport { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';\nimport { ThreeDRotationComponent } from '../three-d-rotation/three-d-rotation.component';\n\n@Component({\n selector: 'c8y-three-d-rotation-widget-view',\n templateUrl: './three-d-rotation-widget-view.component.html',\n providers: [MeasurementRealtimeService],\n standalone: true,\n imports: [ThreeDRotationComponent]\n})\nexport class ThreeDRotationWidgetViewComponent implements OnChanges {\n @Input() config: ThreeDRotationWidgetConfig;\n angles$: Observable<ThreeDRotationWidgetRotate>;\n modelObj$: Observable<any>;\n deviceId$ = new BehaviorSubject<string>(null);\n modelName$ = new BehaviorSubject<string>(null);\n cameraType$ = new BehaviorSubject<string>('PC');\n isWireframe$ = new BehaviorSubject<boolean>(true);\n\n constructor(\n private measurementRealtime: MeasurementRealtimeService,\n @Optional() private dashboard: ContextDashboardComponent\n ) {\n this.modelObj$ = this.modelName$.pipe(\n filter(name => !!name),\n distinctUntilChanged(),\n switchMap(name => this.getModelUrl(name)),\n shareReplay(1)\n );\n this.angles$ = this.deviceId$.pipe(\n filter(id => !!id),\n distinctUntilChanged(),\n switchMap(id => this.getAnglesOfDevice$(id)),\n startWith({ x: 0, y: 0, z: 0 })\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.config && this.config) {\n this.onConfigChange();\n }\n }\n\n private onConfigChange() {\n if (this.config.device?.id) {\n this.deviceId$.next(`${this.config.device.id}`);\n } else if (this.dashboard?.context?.id) {\n this.deviceId$.next(`${this.dashboard.context?.id}`);\n }\n\n if (this.config.objectModel) {\n this.modelName$.next(this.config.objectModel);\n }\n\n if (this.config.cameraType) {\n this.cameraType$.next(this.config.cameraType);\n }\n\n if (this.config.isWireframe !== undefined) {\n this.isWireframe$.next(this.config.isWireframe);\n }\n }\n\n private async getModelUrl(model: string): Promise<any> {\n // The name *.min.json still exist for backwards compatibility\n // it might be stored in certain widget configs.\n if (model === 'box.min.json') {\n return await loadBoxModel();\n } else {\n return await loadPhoneModel();\n }\n }\n\n private getAnglesOfDevice$(deviceId: string): Observable<ThreeDRotationWidgetRotate> {\n const fragment = 'c8y_Acceleration';\n const series = ['accelerationX', 'accelerationY', 'accelerationZ'];\n return this.measurementRealtime\n .latestValueOfSpecificMeasurement$(fragment, series[0], deviceId, 1)\n .pipe(\n filter(m => !!m && m[fragment] && series.every(axisSeries => m[fragment][axisSeries])),\n map(measurement => {\n const [xAxisValue, yAxisValue, zAxisValue] = series.map(axisSeries =>\n Math.round(measurement[fragment][axisSeries].value)\n );\n return this.convertValues(xAxisValue, yAxisValue, zAxisValue);\n })\n );\n }\n\n private convertValues(x: number, y: number, z: number): ThreeDRotationWidgetRotate {\n let rotateX = Math.atan2(y, z);\n let rotateY = Math.atan2(x, Math.sqrt(y * y + z * z));\n rotateX = rotateX ? rotateX % (Math.PI * 2) : 0;\n rotateY = rotateY ? rotateY % (Math.PI * 2) : 0;\n\n return {\n x: rotateX,\n y: 0,\n z: rotateY\n };\n }\n}\n","<c8y-three-d-rotation\n [modelObj$]=\"modelObj$\"\n [angles$]=\"angles$\"\n [cameraType$]=\"cameraType$\"\n [isWireframe$]=\"isWireframe$\"\n></c8y-three-d-rotation>\n","import { Component, OnInit, Input } from '@angular/core';\nimport { ControlContainer, FormBuilder, NgForm, Validators } from '@angular/forms';\nimport { CoreModule, OnBeforeSave } from '@c8y/ngx-components';\nimport { Observable } from 'rxjs';\nimport { ThreeDRotationWidgetConfig } from '../three-d-rotation.model';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\n\n@Component({\n selector: 'c8y-three-d-rotation-widget-config',\n templateUrl: './three-d-rotation-widget-config.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n standalone: true,\n imports: [CoreModule, ButtonsModule]\n})\nexport class ThreeDRotationWidgetConfigComponent implements OnInit, OnBeforeSave {\n @Input() config: ThreeDRotationWidgetConfig;\n formGroup: ReturnType<ThreeDRotationWidgetConfigComponent['createForm']>;\n\n constructor(\n private formBuilder: FormBuilder,\n private form: NgForm\n ) {}\n\n onBeforeSave(\n config?: ThreeDRotationWidgetConfig\n ): boolean | Promise<boolean> | Observable<boolean> {\n if (this.formGroup.valid) {\n Object.assign(config, this.formGroup.value);\n return true;\n }\n return false;\n }\n\n ngOnInit() {\n this.initForm();\n }\n\n private initForm(): void {\n this.formGroup = this.createForm(this.formBuilder);\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n }\n\n private createForm(formBuilder: FormBuilder) {\n return formBuilder.group({\n objectModel: ['box.min.json', [Validators.minLength(1)]],\n isWireframe: [true, []],\n cameraType: ['PC', [Validators.minLength(2), Validators.maxLength(2)]]\n });\n }\n}\n","<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Rendering' | translate }}</legend>\n<form [formGroup]=\"formGroup\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Select object model for rendering</label>\n <div class=\"input-group input-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select class=\"form-control\" formControlName=\"objectModel\">\n <option value=\"box.min.json\" translate>Box model</option>\n <option value=\"phoneModel.min.json\" translate>Phone model</option>\n </select>\n </div>\n <span class=\"input-group-addon bg-level-0\">\n <label class=\"c8y-switch\">\n <input type=\"checkbox\" formControlName=\"isWireframe\" />\n <span></span>\n <span translate>Wireframe</span>\n </label>\n </span>\n </div>\n </c8y-form-group>\n\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Camera type</label>\n <div class=\"c8y-select-wrapper\">\n <select class=\"form-control\" formControlName=\"cameraType\">\n <option value=\"OC\" translate>Orthographic camera</option>\n <option value=\"PC\" translate>Perspective camera</option>\n </select>\n </div>\n </c8y-form-group>\n</form>\n</fieldset>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}