UNPKG

bytev-charts

Version:

基于echarts和JavaScript及ES6封装的一个可以直接调用的图表组件库,内置主题设计,简单快捷,且支持用户自定义配置; npm 安装方式: npm install bytev-charts 若启动提示还需额外install插件,则运行 npm install @babel/runtime-corejs2 即可;

392 lines (333 loc) 12.1 kB
import "core-js/modules/es.array-buffer.slice.js"; import "core-js/modules/es.data-view.js"; import "core-js/modules/es.object.to-string.js"; import "core-js/modules/es.array.concat.js"; import "core-js/modules/es.function.name.js"; import _Object$assign from "@babel/runtime-corejs2/core-js/object/assign"; import _Object$create from "@babel/runtime-corejs2/core-js/object/create"; console.warn("THREE.AMFLoader: As part of the transition to ES6 Modules, the files in 'examples/js' were deprecated in May 2020 (r117) and will be deleted in December 2020 (r124). You can find more information about developing using ES6 Modules in https://threejs.org/docs/#manual/en/introduction/Installation."); /** * Description: Early release of an AMF Loader following the pattern of the * example loaders in the three.js project. * * More information about the AMF format: http://amf.wikispaces.com * * Usage: * var loader = new AMFLoader(); * loader.load('/path/to/project.amf', function(objecttree) { * scene.add(objecttree); * }); * * Materials now supported, material colors supported * Zip support, requires jszip * No constellation support (yet)! * */ THREE.AMFLoader = function (manager) { THREE.Loader.call(this, manager); }; THREE.AMFLoader.prototype = _Object$assign(_Object$create(THREE.Loader.prototype), { constructor: THREE.AMFLoader, load: function load(url, onLoad, onProgress, onError) { var scope = this; var loader = new THREE.FileLoader(scope.manager); loader.setPath(scope.path); loader.setResponseType('arraybuffer'); loader.setRequestHeader(scope.requestHeader); loader.load(url, function (text) { try { onLoad(scope.parse(text)); } catch (e) { if (onError) { onError(e); } else { console.error(e); } scope.manager.itemError(url); } }, onProgress, onError); }, parse: function parse(data) { function loadDocument(data) { var view = new DataView(data); var magic = String.fromCharCode(view.getUint8(0), view.getUint8(1)); if (magic === 'PK') { var zip = null; var file = null; console.log('THREE.AMFLoader: Loading Zip'); try { zip = new JSZip(data); } catch (e) { if (e instanceof ReferenceError) { console.log('THREE.AMFLoader: jszip missing and file is compressed.'); return null; } } for (file in zip.files) { if (file.toLowerCase().substr(-4) === '.amf') { break; } } console.log('THREE.AMFLoader: Trying to load file asset: ' + file); view = new DataView(zip.file(file).asArrayBuffer()); } var fileText = THREE.LoaderUtils.decodeText(view); var xmlData = new DOMParser().parseFromString(fileText, 'application/xml'); if (xmlData.documentElement.nodeName.toLowerCase() !== 'amf') { console.log('THREE.AMFLoader: Error loading AMF - no AMF document found.'); return null; } return xmlData; } function loadDocumentScale(node) { var scale = 1.0; var unit = 'millimeter'; if (node.documentElement.attributes.unit !== undefined) { unit = node.documentElement.attributes.unit.value.toLowerCase(); } var scaleUnits = { millimeter: 1.0, inch: 25.4, feet: 304.8, meter: 1000.0, micron: 0.001 }; if (scaleUnits[unit] !== undefined) { scale = scaleUnits[unit]; } console.log('THREE.AMFLoader: Unit scale: ' + scale); return scale; } function loadMaterials(node) { var matName = 'AMF Material'; var matId = node.attributes.id.textContent; var color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 }; var loadedMaterial = null; for (var i = 0; i < node.childNodes.length; i++) { var matChildEl = node.childNodes[i]; if (matChildEl.nodeName === 'metadata' && matChildEl.attributes.type !== undefined) { if (matChildEl.attributes.type.value === 'name') { matName = matChildEl.textContent; } } else if (matChildEl.nodeName === 'color') { color = loadColor(matChildEl); } } loadedMaterial = new THREE.MeshPhongMaterial({ flatShading: true, color: new THREE.Color(color.r, color.g, color.b), name: matName }); if (color.a !== 1.0) { loadedMaterial.transparent = true; loadedMaterial.opacity = color.a; } return { id: matId, material: loadedMaterial }; } function loadColor(node) { var color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 }; for (var i = 0; i < node.childNodes.length; i++) { var matColor = node.childNodes[i]; if (matColor.nodeName === 'r') { color.r = matColor.textContent; } else if (matColor.nodeName === 'g') { color.g = matColor.textContent; } else if (matColor.nodeName === 'b') { color.b = matColor.textContent; } else if (matColor.nodeName === 'a') { color.a = matColor.textContent; } } return color; } function loadMeshVolume(node) { var volume = { name: '', triangles: [], materialid: null }; var currVolumeNode = node.firstElementChild; if (node.attributes.materialid !== undefined) { volume.materialId = node.attributes.materialid.nodeValue; } while (currVolumeNode) { if (currVolumeNode.nodeName === 'metadata') { if (currVolumeNode.attributes.type !== undefined) { if (currVolumeNode.attributes.type.value === 'name') { volume.name = currVolumeNode.textContent; } } } else if (currVolumeNode.nodeName === 'triangle') { var v1 = currVolumeNode.getElementsByTagName('v1')[0].textContent; var v2 = currVolumeNode.getElementsByTagName('v2')[0].textContent; var v3 = currVolumeNode.getElementsByTagName('v3')[0].textContent; volume.triangles.push(v1, v2, v3); } currVolumeNode = currVolumeNode.nextElementSibling; } return volume; } function loadMeshVertices(node) { var vertArray = []; var normalArray = []; var currVerticesNode = node.firstElementChild; while (currVerticesNode) { if (currVerticesNode.nodeName === 'vertex') { var vNode = currVerticesNode.firstElementChild; while (vNode) { if (vNode.nodeName === 'coordinates') { var x = vNode.getElementsByTagName('x')[0].textContent; var y = vNode.getElementsByTagName('y')[0].textContent; var z = vNode.getElementsByTagName('z')[0].textContent; vertArray.push(x, y, z); } else if (vNode.nodeName === 'normal') { var nx = vNode.getElementsByTagName('nx')[0].textContent; var ny = vNode.getElementsByTagName('ny')[0].textContent; var nz = vNode.getElementsByTagName('nz')[0].textContent; normalArray.push(nx, ny, nz); } vNode = vNode.nextElementSibling; } } currVerticesNode = currVerticesNode.nextElementSibling; } return { 'vertices': vertArray, 'normals': normalArray }; } function loadObject(node) { var objId = node.attributes.id.textContent; var loadedObject = { name: 'amfobject', meshes: [] }; var currColor = null; var currObjNode = node.firstElementChild; while (currObjNode) { if (currObjNode.nodeName === 'metadata') { if (currObjNode.attributes.type !== undefined) { if (currObjNode.attributes.type.value === 'name') { loadedObject.name = currObjNode.textContent; } } } else if (currObjNode.nodeName === 'color') { currColor = loadColor(currObjNode); } else if (currObjNode.nodeName === 'mesh') { var currMeshNode = currObjNode.firstElementChild; var mesh = { vertices: [], normals: [], volumes: [], color: currColor }; while (currMeshNode) { if (currMeshNode.nodeName === 'vertices') { var loadedVertices = loadMeshVertices(currMeshNode); mesh.normals = mesh.normals.concat(loadedVertices.normals); mesh.vertices = mesh.vertices.concat(loadedVertices.vertices); } else if (currMeshNode.nodeName === 'volume') { mesh.volumes.push(loadMeshVolume(currMeshNode)); } currMeshNode = currMeshNode.nextElementSibling; } loadedObject.meshes.push(mesh); } currObjNode = currObjNode.nextElementSibling; } return { 'id': objId, 'obj': loadedObject }; } var xmlData = loadDocument(data); var amfName = ''; var amfAuthor = ''; var amfScale = loadDocumentScale(xmlData); var amfMaterials = {}; var amfObjects = {}; var childNodes = xmlData.documentElement.childNodes; var i, j; for (i = 0; i < childNodes.length; i++) { var child = childNodes[i]; if (child.nodeName === 'metadata') { if (child.attributes.type !== undefined) { if (child.attributes.type.value === 'name') { amfName = child.textContent; } else if (child.attributes.type.value === 'author') { amfAuthor = child.textContent; } } } else if (child.nodeName === 'material') { var loadedMaterial = loadMaterials(child); amfMaterials[loadedMaterial.id] = loadedMaterial.material; } else if (child.nodeName === 'object') { var loadedObject = loadObject(child); amfObjects[loadedObject.id] = loadedObject.obj; } } var sceneObject = new THREE.Group(); var defaultMaterial = new THREE.MeshPhongMaterial({ color: 0xaaaaff, flatShading: true }); sceneObject.name = amfName; sceneObject.userData.author = amfAuthor; sceneObject.userData.loader = 'AMF'; for (var id in amfObjects) { var part = amfObjects[id]; var meshes = part.meshes; var newObject = new THREE.Group(); newObject.name = part.name || ''; for (i = 0; i < meshes.length; i++) { var objDefaultMaterial = defaultMaterial; var mesh = meshes[i]; var vertices = new THREE.Float32BufferAttribute(mesh.vertices, 3); var normals = null; if (mesh.normals.length) { normals = new THREE.Float32BufferAttribute(mesh.normals, 3); } if (mesh.color) { var color = mesh.color; objDefaultMaterial = defaultMaterial.clone(); objDefaultMaterial.color = new THREE.Color(color.r, color.g, color.b); if (color.a !== 1.0) { objDefaultMaterial.transparent = true; objDefaultMaterial.opacity = color.a; } } var volumes = mesh.volumes; for (j = 0; j < volumes.length; j++) { var volume = volumes[j]; var newGeometry = new THREE.BufferGeometry(); var material = objDefaultMaterial; newGeometry.setIndex(volume.triangles); newGeometry.setAttribute('position', vertices.clone()); if (normals) { newGeometry.setAttribute('normal', normals.clone()); } if (amfMaterials[volume.materialId] !== undefined) { material = amfMaterials[volume.materialId]; } newGeometry.scale(amfScale, amfScale, amfScale); newObject.add(new THREE.Mesh(newGeometry, material.clone())); } } sceneObject.add(newObject); } return sceneObject; } });