UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

87 lines 16.6 kB
import { Component, Input, Optional } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { filter, map, shareReplay, switchMap, distinctUntilChanged, startWith } from 'rxjs/operators'; import { MeasurementRealtimeService } from '@c8y/ngx-components'; import { loadBoxModel } from '@c8y/ngx-components/widgets/implementations/three-d-rotation/lazy-box-model'; import { loadPhoneModel } from '@c8y/ngx-components/widgets/implementations/three-d-rotation/lazy-phone-model'; import { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard'; import { ThreeDRotationComponent } from '../three-d-rotation/three-d-rotation.component'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/ngx-components"; import * as i2 from "@c8y/ngx-components/context-dashboard"; export class ThreeDRotationWidgetViewComponent { constructor(measurementRealtime, dashboard) { this.measurementRealtime = measurementRealtime; this.dashboard = dashboard; this.deviceId$ = new BehaviorSubject(null); this.modelName$ = new BehaviorSubject(null); this.cameraType$ = new BehaviorSubject('PC'); this.isWireframe$ = new BehaviorSubject(true); this.modelObj$ = this.modelName$.pipe(filter(name => !!name), distinctUntilChanged(), switchMap(name => this.getModelUrl(name)), shareReplay(1)); this.angles$ = this.deviceId$.pipe(filter(id => !!id), distinctUntilChanged(), switchMap(id => this.getAnglesOfDevice$(id)), startWith({ x: 0, y: 0, z: 0 })); } ngOnChanges(changes) { if (changes.config && this.config) { this.onConfigChange(); } } onConfigChange() { if (this.config.device?.id) { this.deviceId$.next(`${this.config.device.id}`); } else if (this.dashboard?.context?.id) { this.deviceId$.next(`${this.dashboard.context?.id}`); } if (this.config.objectModel) { this.modelName$.next(this.config.objectModel); } if (this.config.cameraType) { this.cameraType$.next(this.config.cameraType); } if (this.config.isWireframe !== undefined) { this.isWireframe$.next(this.config.isWireframe); } } async getModelUrl(model) { // The name *.min.json still exist for backwards compatibility // it might be stored in certain widget configs. if (model === 'box.min.json') { return await loadBoxModel(); } else { return await loadPhoneModel(); } } getAnglesOfDevice$(deviceId) { const fragment = 'c8y_Acceleration'; const series = ['accelerationX', 'accelerationY', 'accelerationZ']; return this.measurementRealtime .latestValueOfSpecificMeasurement$(fragment, series[0], deviceId, 1) .pipe(filter(m => !!m && m[fragment] && series.every(axisSeries => m[fragment][axisSeries])), map(measurement => { const [xAxisValue, yAxisValue, zAxisValue] = series.map(axisSeries => Math.round(measurement[fragment][axisSeries].value)); return this.convertValues(xAxisValue, yAxisValue, zAxisValue); })); } convertValues(x, y, z) { let rotateX = Math.atan2(y, z); let rotateY = Math.atan2(x, Math.sqrt(y * y + z * z)); rotateX = rotateX ? rotateX % (Math.PI * 2) : 0; rotateY = rotateY ? rotateY % (Math.PI * 2) : 0; return { x: rotateX, y: 0, z: rotateY }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ThreeDRotationWidgetViewComponent, deps: [{ token: i1.MeasurementRealtimeService }, { token: i2.ContextDashboardComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ThreeDRotationWidgetViewComponent, isStandalone: true, selector: "c8y-three-d-rotation-widget-view", inputs: { config: "config" }, providers: [MeasurementRealtimeService], usesOnChanges: true, ngImport: i0, template: "<c8y-three-d-rotation\n [modelObj$]=\"modelObj$\"\n [angles$]=\"angles$\"\n [cameraType$]=\"cameraType$\"\n [isWireframe$]=\"isWireframe$\"\n></c8y-three-d-rotation>\n", dependencies: [{ kind: "component", type: ThreeDRotationComponent, selector: "c8y-three-d-rotation", inputs: ["angles$", "modelObj$", "cameraType$", "isWireframe$"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ThreeDRotationWidgetViewComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-three-d-rotation-widget-view', providers: [MeasurementRealtimeService], standalone: true, imports: [ThreeDRotationComponent], template: "<c8y-three-d-rotation\n [modelObj$]=\"modelObj$\"\n [angles$]=\"angles$\"\n [cameraType$]=\"cameraType$\"\n [isWireframe$]=\"isWireframe$\"\n></c8y-three-d-rotation>\n" }] }], ctorParameters: () => [{ type: i1.MeasurementRealtimeService }, { type: i2.ContextDashboardComponent, decorators: [{ type: Optional }] }], propDecorators: { config: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWUtZC1yb3RhdGlvbi13aWRnZXQtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy90aHJlZS1kLXJvdGF0aW9uL3RocmVlLWQtcm90YXRpb24td2lkZ2V0LXZpZXcvdGhyZWUtZC1yb3RhdGlvbi13aWRnZXQtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy90aHJlZS1kLXJvdGF0aW9uL3RocmVlLWQtcm90YXRpb24td2lkZ2V0LXZpZXcvdGhyZWUtZC1yb3RhdGlvbi13aWRnZXQtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYSxRQUFRLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUNMLE1BQU0sRUFDTixHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxvQkFBb0IsRUFDcEIsU0FBUyxFQUNWLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZFQUE2RSxDQUFDO0FBQzNHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrRUFBK0UsQ0FBQztBQUMvRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNsRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7OztBQVN6RixNQUFNLE9BQU8saUNBQWlDO0lBUzVDLFlBQ1UsbUJBQStDLEVBQ25DLFNBQW9DO1FBRGhELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBNEI7UUFDbkMsY0FBUyxH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QUMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEQsT0FBTztZQUNMLENBQUMsRUFBRSxPQUFPO1lBQ1YsQ0FBQyxFQUFFLENBQUM7WUFDSixDQUFDLEVBQUUsT0FBTztTQUNYLENBQUM7SUFDSixDQUFDOytHQTFGVSxpQ0FBaUM7bUdBQWpDLGlDQUFpQyw2R0FKakMsQ0FBQywwQkFBMEIsQ0FBQywrQ0NwQnpDLDZLQU1BLDRDRGdCWSx1QkFBdUI7OzRGQUV0QixpQ0FBaUM7a0JBUDdDLFNBQVM7K0JBQ0Usa0NBQWtDLGFBRWpDLENBQUMsMEJBQTBCLENBQUMsY0FDM0IsSUFBSSxXQUNQLENBQUMsdUJBQXVCLENBQUM7OzBCQWEvQixRQUFRO3lDQVZGLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT3B0aW9uYWwsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgZmlsdGVyLFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxuICBzd2l0Y2hNYXAsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBzdGFydFdpdGhcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWVhc3VyZW1lbnRSZWFsdGltZVNlcnZpY2UgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRocmVlRFJvdGF0aW9uV2lkZ2V0Q29uZmlnLCBUaHJlZURSb3RhdGlvbldpZGdldFJvdGF0ZSB9IGZyb20gJy4uL3RocmVlLWQtcm90YXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgbG9hZEJveE1vZGVsIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy90aHJlZS1kLXJvdGF0aW9uL2xhenktYm94LW1vZGVsJztcbmltcG9ydCB7IGxvYWRQaG9uZU1vZGVsIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy90aHJlZS1kLXJvdGF0aW9uL2xhenktcGhvbmUtbW9kZWwnO1xuaW1wb3J0IHsgQ29udGV4dERhc2hib2FyZENvbXBvbmVudCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvY29udGV4dC1kYXNoYm9hcmQnO1xuaW1wb3J0IHsgVGhyZWVEUm90YXRpb25Db21wb25lbnQgfSBmcm9tICcuLi90aHJlZS1kLXJvdGF0aW9uL3RocmVlLWQtcm90YXRpb24uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXRocmVlLWQtcm90YXRpb24td2lkZ2V0LXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGhyZWUtZC1yb3RhdGlvbi13aWRnZXQtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW01lYXN1cmVtZW50UmVhbHRpbWVTZXJ2aWNlXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1RocmVlRFJvdGF0aW9uQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBUaHJlZURSb3RhdGlvbldpZGdldFZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWc6IFRocmVlRFJvdGF0aW9uV2lkZ2V0Q29uZmlnO1xuICBhbmdsZXMkOiBPYnNlcnZhYmxlPFRocmVlRFJvdGF0aW9uV2lkZ2V0Um90YXRlPjtcbiAgbW9kZWxPYmokOiBPYnNlcnZhYmxlPGFueT47XG4gIGRldmljZUlkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihudWxsKTtcbiAgbW9kZWxOYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihudWxsKTtcbiAgY2FtZXJhVHlwZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJ1BDJyk7XG4gIGlzV2lyZWZyYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtZWFzdXJlbWVudFJlYWx0aW1lOiBNZWFzdXJlbWVudFJlYWx0aW1lU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhc2hib2FyZDogQ29udGV4dERhc2hib2FyZENvbXBvbmVudFxuICApIHtcbiAgICB0aGlzLm1vZGVsT2JqJCA9IHRoaXMubW9kZWxOYW1lJC5waXBlKFxuICAgICAgZmlsdGVyKG5hbWUgPT4gISFuYW1lKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBzd2l0Y2hNYXAobmFtZSA9PiB0aGlzLmdldE1vZGVsVXJsKG5hbWUpKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgICB0aGlzLmFuZ2xlcyQgPSB0aGlzLmRldmljZUlkJC5waXBlKFxuICAgICAgZmlsdGVyKGlkID0+ICEhaWQpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHN3aXRjaE1hcChpZCA9PiB0aGlzLmdldEFuZ2xlc09mRGV2aWNlJChpZCkpLFxuICAgICAgc3RhcnRXaXRoKHsgeDogMCwgeTogMCwgejogMCB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuY29uZmlnICYmIHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLm9uQ29uZmlnQ2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkNvbmZpZ0NoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5jb25maWcuZGV2aWNlPy5pZCkge1xuICAgICAgdGhpcy5kZXZpY2VJZCQubmV4dChgJHt0aGlzLmNvbmZpZy5kZXZpY2UuaWR9YCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhc2hib2FyZD8uY29udGV4dD8uaWQpIHtcbiAgICAgIHRoaXMuZGV2aWNlSWQkLm5leHQoYCR7dGhpcy5kYXNoYm9hcmQuY29udGV4dD8uaWR9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9iamVjdE1vZGVsKSB7XG4gICAgICB0aGlzLm1vZGVsTmFtZSQubmV4dCh0aGlzLmNvbmZpZy5vYmplY3RNb2RlbCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLmNhbWVyYVR5cGUpIHtcbiAgICAgIHRoaXMuY2FtZXJhVHlwZSQubmV4dCh0aGlzLmNvbmZpZy5jYW1lcmFUeXBlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcuaXNXaXJlZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc1dpcmVmcmFtZSQubmV4dCh0aGlzLmNvbmZpZy5pc1dpcmVmcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRNb2RlbFVybChtb2RlbDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBUaGUgbmFtZSAqLm1pbi5qc29uIHN0aWxsIGV4aXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIC8vIGl0IG1pZ2h0IGJlIHN0b3JlZCBpbiBjZXJ0YWluIHdpZGdldCBjb25maWdzLlxuICAgIGlmIChtb2RlbCA9PT0gJ2JveC5taW4uanNvbicpIHtcbiAgICAgIHJldHVybiBhd2FpdCBsb2FkQm94TW9kZWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGF3YWl0IGxvYWRQaG9uZU1vZGVsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbmdsZXNPZkRldmljZSQoZGV2aWNlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8VGhyZWVEUm90YXRpb25XaWRnZXRSb3RhdGU+IHtcbiAgICBjb25zdCBmcmFnbWVudCA9ICdjOHlfQWNjZWxlcmF0aW9uJztcbiAgICBjb25zdCBzZXJpZXMgPSBbJ2FjY2VsZXJhdGlvblgnLCAnYWNjZWxlcmF0aW9uWScsICdhY2NlbGVyYXRpb25aJ107XG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRSZWFsdGltZVxuICAgICAgLmxhdGVzdFZhbHVlT2ZTcGVjaWZpY01lYXN1cmVtZW50JChmcmFnbWVudCwgc2VyaWVzWzBdLCBkZXZpY2VJZCwgMSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIobSA9PiAhIW0gJiYgbVtmcmFnbWVudF0gJiYgc2VyaWVzLmV2ZXJ5KGF4aXNTZXJpZXMgPT4gbVtmcmFnbWVudF1bYXhpc1Nlcmllc10pKSxcbiAgICAgICAgbWFwKG1lYXN1cmVtZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBbeEF4aXNWYWx1ZSwgeUF4aXNWYWx1ZSwgekF4aXNWYWx1ZV0gPSBzZXJpZXMubWFwKGF4aXNTZXJpZXMgPT5cbiAgICAgICAgICAgIE1hdGgucm91bmQobWVhc3VyZW1lbnRbZnJhZ21lbnRdW2F4aXNTZXJpZXNdLnZhbHVlKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlcyh4QXhpc1ZhbHVlLCB5QXhpc1ZhbHVlLCB6QXhpc1ZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRWYWx1ZXMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcik6IFRocmVlRFJvdGF0aW9uV2lkZ2V0Um90YXRlIHtcbiAgICBsZXQgcm90YXRlWCA9IE1hdGguYXRhbjIoeSwgeik7XG4gICAgbGV0IHJvdGF0ZVkgPSBNYXRoLmF0YW4yKHgsIE1hdGguc3FydCh5ICogeSArIHogKiB6KSk7XG4gICAgcm90YXRlWCA9IHJvdGF0ZVggPyByb3RhdGVYICUgKE1hdGguUEkgKiAyKSA6IDA7XG4gICAgcm90YXRlWSA9IHJvdGF0ZVkgPyByb3RhdGVZICUgKE1hdGguUEkgKiAyKSA6IDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogcm90YXRlWCxcbiAgICAgIHk6IDAsXG4gICAgICB6OiByb3RhdGVZXG4gICAgfTtcbiAgfVxufVxuIiwiPGM4eS10aHJlZS1kLXJvdGF0aW9uXG4gIFttb2RlbE9iaiRdPVwibW9kZWxPYmokXCJcbiAgW2FuZ2xlcyRdPVwiYW5nbGVzJFwiXG4gIFtjYW1lcmFUeXBlJF09XCJjYW1lcmFUeXBlJFwiXG4gIFtpc1dpcmVmcmFtZSRdPVwiaXNXaXJlZnJhbWUkXCJcbj48L2M4eS10aHJlZS1kLXJvdGF0aW9uPlxuIl19