UNPKG

iv-3d-lib

Version:

A reusable ThreeJS library providing features for Ivee 3D Editor.

112 lines (99 loc) 4.25 kB
import * as THREE from 'three'; import * as parser from 'expr-eval'; import { WglUtil } from './wgl-util'; import { SimpleDictionary } from './models/simple-dictionary'; import { Timeline } from './models/timeline'; import { DataModel } from './models/data-model'; import { ITimelinePlugin } from './i-timeline-plugin'; import { Expr, ExprXYZ } from './wgl-util-cfgs'; import { Iv3dScript } from './models/iv-3d-script'; export class GoogleMapsPlugin implements ITimelinePlugin { config: SimpleDictionary<any>; timeline: Timeline; data: DataModel; w: WglUtil; mainGroup: THREE.Group; private oParser: parser.Parser = new parser.Parser(); private frameId: string = 'iv3d_googlemaps_iframe1'; init() { this.w.cfg.useCssRender = true; this.w.cfg.useOrbit = true; } load() { this.cfgScripts(); this.cfgGooleMaps(); } update(time?: number) { } private cfgScripts() { if(!this.data.script) { this.data.script = new Iv3dScript(); } this.data.script.init += ` function googleMapsPlugin_initCustomData() { viewer.customData['place'] = \'${this.config['place']}\'; var txtPlace = document.getElementById('txtPlace'); if(txtPlace) { txtPlace.value = viewer.customData['place']; } } function updateGoogleMapsPluginConfig() { var txtPlace = document.getElementById('txtPlace'); if(txtPlace) { viewer.googleMapsPlugin.config['place'] = txtPlace.value; } viewer.googleMapsPlugin.reloadGoogleMaps(); } `; this.data.script.execInit += ` googleMapsPlugin_initCustomData(); `; } private cfgGooleMaps() { let wExpr = new Expr(this.config['width']); wExpr.fn = this.oParser.parse(wExpr.expression); let hExpr = new Expr(this.config['height']); hExpr.fn = this.oParser.parse(hExpr.expression); let posXYZ: ExprXYZ = new ExprXYZ(this.config['position_x'], this.config['position_y'], this.config['position_z']); posXYZ.fnx = this.oParser.parse(posXYZ.x); posXYZ.fny = this.oParser.parse(posXYZ.y); posXYZ.fnz = this.oParser.parse(posXYZ.z); let rotXYZ: ExprXYZ = new ExprXYZ(this.config['rotation_x'], this.config['rotation_y'], this.config['rotation_z']); rotXYZ.fnx = this.oParser.parse(rotXYZ.x); rotXYZ.fny = this.oParser.parse(rotXYZ.y); rotXYZ.fnz = this.oParser.parse(rotXYZ.z); let cfg = { url: this.getUrl(), width: wExpr.fn.evaluate({ window: window, PI: Math.PI } ), height: hExpr.fn.evaluate({ window: window, PI: Math.PI }), position: { x: posXYZ.fnx.evaluate({ window: window, PI: Math.PI }), y: posXYZ.fny.evaluate({ window: window, PI: Math.PI }), z: posXYZ.fnz.evaluate({ window: window, PI: Math.PI }) }, rotation: { x: rotXYZ.fnx.evaluate({ window: window, PI: Math.PI }), y: rotXYZ.fny.evaluate({ window: window, PI: Math.PI }), z: rotXYZ.fnz.evaluate({ window: window, PI: Math.PI }) } }; this.w.create3dPage( cfg.width, cfg.height, new THREE.Vector3(cfg.position.x, cfg.position.y, cfg.position.z), new THREE.Vector3(cfg.rotation.x, cfg.rotation.y, cfg.rotation.z), cfg.url, this.frameId); } private getUrl() { let place = this.config['place']; let origin = this.config['origin']; let destination = this.config['destination']; let url: string = ''; if(origin && destination) { url = `https://www.google.com/maps/embed/v1/directions?origin=${origin}&destination=${destination}&zoom=${this.config['zoom']}&key=${this.config['key']}`; } else { url = `https://www.google.com/maps/embed/v1/place?q=${place}&zoom=${this.config['zoom']}&key=${this.config['key']}`; } return url; } public reloadGoogleMaps() { let url:string = this.getUrl(); this.w.refresh3dPage(this.frameId, url); } }