loadModel(加载模型)

2022-2-18
import axios from 'axios';
import { debounce } from 'lodash';
// import { message } from 'antd';
// import { handleRemoveCameraSubmenuToolBtn } from '@/pages/ModelShow/handleModelLoadTasks';

const setModelJsonUrn = (data, modelFileUrl) => {
	for (let i = 0; i < data.length; i++) {
		let isModify = false;
		if (
			data[i].mime &&
			(data[i].mime.indexOf('autodesk-db') >= 0 ||
				data[i].mime.indexOf('json') >= 0 ||
				data[i].mime.indexOf('autodesk-svf') >= 0)
		) {
			isModify = true;
		}
		if (data[i].urn && isModify) {
			let splitUrn = data[i].urn.split('/');
			if (splitUrn[2]) {
				data[i].urn = modelFileUrl + splitUrn[1] + '/' + splitUrn[2];
			} else {
				data[i].urn = modelFileUrl + splitUrn[1];
			}
		} else if (data[i].children) {
			setModelJsonUrn(data[i].children, modelFileUrl);
		}
	}
	return data;
};

const resolveJson = modelJsonUrl => {
	return new Promise((resolve, reject) => {
		axios
			.get(`${modelJsonUrl}`)
			.then(({ data }) => {
				resolve(data);
			})
			.catch(() => reject());
	});
};

const initModel = debounce(
	({
		oViewer,
		modelWrap,
		config,
		modelPath,
		options,
		is3dModel,
		viewLink,
		manifestJsonObject,
		uploadFrom,
		reject,
		resolve,
		eventList,
	}) => {
		oViewer = new window.Autodesk.Viewing.Private.GuiViewer3D(modelWrap, config); // With toolbar

		let sharedPropertyDbPath = null;
		let optionObj = null;
		if (modelPath.indexOf('.f2d') >= 0) {
			sharedPropertyDbPath = modelPath.split('f2d_')[0];
			optionObj = { sharedPropertyDbPath: sharedPropertyDbPath.split('?')[0] };
		}

		window.Autodesk.Viewing.Initializer(options, function () {
			if (is3dModel && viewLink && uploadFrom !== 4) {
				const viewerDocument = new window.Autodesk.Viewing.Document(manifestJsonObject);
				viewerDocument.downloadAecModelData();
				oViewer.start();
				oViewer.loadDocumentNode(viewerDocument, viewerDocument.getRoot().getDefaultGeometry());
			} else {
				oViewer.initialize();
				if (modelPath.endsWith('.pdf')) {
					oViewer.loadExtension('Autodesk.PDF').then(() => {
						// pdf加载默认设置为第一页
						oViewer.loadModel(options.docid, { page: 1 });
						oViewer.setSwapBlackAndWhite(false); //false使图纸背景变为白色,true使图纸背景变为黑色
					}); // eslint-disable-line
				} else {
					oViewer.loadModel(options.docid, optionObj, null, function (err) {
						console.log('err===>');
						console.log(err);
						reject(err);
					}); // eslint-disable-line
					oViewer.setSwapBlackAndWhite(true); //false使图纸背景变为白色,true使图纸背景变为黑色
				}
			}

			oViewer.setTheme('light-theme');
			oViewer.addEventListener(window.Autodesk.Viewing.GEOMETRY_LOADED_EVENT, function () {
				resolve(oViewer);
			});

			Object.entries(eventList).forEach(([eventType, handler]) => {
				oViewer.addEventListener(eventType, function (...args) {
					handler.call(this, oViewer, ...args);
				});
			});
		});
	},
	500
);

/**
 * 模型加载
 * @param {String} modelPath
 * @param {Element} modelWrap
 * @param {Number} uploadFrom
 * @param {Object} eventList
 */
const handleModelLoad = ({ modelPath, modelWrap, uploadFrom }, eventList = {}) => {
	return new Promise((resolve, reject) => {
		let oViewer = null;
		let docs = [
			{
				path: modelPath,
				name: 'Scene',
			},
		];

		let options = {
			docid: docs[0].path,
			env: 'Local',
			language: 'zh-HANS',
		};
		let is3dModel = false;
		let manifestJsonObject = null;
		let config = {
			memory: {
				limit: 32 * 1024, //1 GB
			},
		};
		let viewLink = false;
		if (modelPath.indexOf('.svf') >= 0 && uploadFrom !== 4) {
			is3dModel = true;
			//添加2/3D联动需要的功能拓展
			config.extensions = ['Autodesk.AEC.LevelsExtension', 'Autodesk.AEC.Minimap3DExtension'];
			let modelJsonUrl = modelPath.replace('3d.svf', 'manifest-model.json');
			let modelFileUrl = modelPath.replace('3d.svf', '');

			resolveJson(modelJsonUrl)
				.then(data => {
					viewLink = true;
					manifestJsonObject = data;
					manifestJsonObject.derivatives = setModelJsonUrn(
						manifestJsonObject.derivatives,
						modelFileUrl
					);

					// console.log('manifestJsonObject====================>', manifestJsonObject);
					initModel({
						oViewer,
						modelWrap,
						config,
						modelPath,
						options,
						is3dModel,
						viewLink,
						manifestJsonObject,
						uploadFrom,
						reject,
						resolve,
						eventList,
					});
				})
				.catch(() => {
					// message.warning('部分文件加载失败,第一视角功能受限');
					initModel({
						oViewer,
						modelWrap,
						config,
						modelPath,
						options,
						is3dModel,
						viewLink,
						manifestJsonObject,
						uploadFrom,
						reject,
						resolve,
						eventList,
					});
				});
		} else {
			initModel({
				oViewer,
				modelWrap,
				config,
				modelPath,
				options,
				is3dModel,
				viewLink,
				manifestJsonObject,
				uploadFrom,
				reject,
				resolve,
				eventList,
			});
		}
	});
};

export default handleModelLoad;