@file-viewer/renderer-3d 2.1.1 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/model.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import type { FileRenderContext, FileViewerRenderedInstance } from '@file-viewer/core';
1
+ import { type FileRenderContext, type FileViewerRenderedInstance } from '@file-viewer/core';
2
2
  export default function renderModel(buffer: ArrayBuffer, target: HTMLDivElement, type?: string, context?: FileRenderContext): Promise<FileViewerRenderedInstance>;
package/dist/model.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as THREE from 'three';
2
2
  import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
3
+ import { createFileViewerTranslator, } from '@file-viewer/core';
3
4
  import { formatGeometryKernelNotice, inspectGeometryKernelFile, isGeometryKernelFormat, } from '@file-viewer/geometry-engine';
4
5
  const modelStyle = `
5
6
  .model-viewer{display:flex;height:100%;min-height:100%;flex-direction:column;background:#f8fafc;color:#162333}
@@ -85,9 +86,10 @@ const disposeObject = (object) => {
85
86
  export default async function renderModel(buffer, target, type = 'glb', context) {
86
87
  const normalizedType = type.toLowerCase();
87
88
  const sourceUrl = context?.url;
89
+ const t = createFileViewerTranslator(context?.options);
88
90
  let status = 'loading';
89
91
  let errorMessage = '';
90
- let objectSummary = '正在加载模型';
92
+ let objectSummary = t('model.state.loadingSummary');
91
93
  let autoRotate = false;
92
94
  let wireframe = false;
93
95
  let showGrid = true;
@@ -107,17 +109,17 @@ export default async function renderModel(buffer, target, type = 'glb', context)
107
109
  const root = createElement('div', 'model-viewer');
108
110
  const toolbar = createElement('div', 'model-toolbar');
109
111
  const actions = createElement('div', 'model-actions');
110
- const fitButton = createElement('button', undefined, '适配');
111
- const rotateButton = createElement('button', undefined, '旋转');
112
- const wireframeButton = createElement('button', undefined, '线框');
113
- const gridButton = createElement('button', undefined, '网格');
114
- const axesButton = createElement('button', undefined, '坐标');
112
+ const fitButton = createElement('button', undefined, t('model.toolbar.fit'));
113
+ const rotateButton = createElement('button', undefined, t('model.toolbar.rotate'));
114
+ const wireframeButton = createElement('button', undefined, t('model.toolbar.wireframe'));
115
+ const gridButton = createElement('button', undefined, t('model.toolbar.grid'));
116
+ const axesButton = createElement('button', undefined, t('model.toolbar.axes'));
115
117
  const meta = createElement('div', 'model-meta');
116
118
  const typeText = createElement('strong', undefined, normalizedType.toUpperCase());
117
119
  const summaryText = createElement('span', undefined, objectSummary);
118
120
  const stage = createElement('div', 'model-stage');
119
121
  const canvas = document.createElement('canvas');
120
- const state = createElement('div', 'model-state', '正在解析 3D 模型...');
122
+ const state = createElement('div', 'model-state', t('model.state.loading'));
121
123
  const buttons = [fitButton, rotateButton, wireframeButton, gridButton, axesButton];
122
124
  buttons.forEach(button => {
123
125
  button.type = 'button';
@@ -148,10 +150,10 @@ export default async function renderModel(buffer, target, type = 'glb', context)
148
150
  state.hidden = status === 'ready';
149
151
  state.classList.toggle('error', status === 'error');
150
152
  if (status === 'loading') {
151
- state.textContent = '正在解析 3D 模型...';
153
+ state.textContent = t('model.state.loading');
152
154
  }
153
155
  else if (status === 'error') {
154
- state.replaceChildren(createElement('strong', undefined, '模型解析失败'), createElement('span', undefined, errorMessage));
156
+ state.replaceChildren(createElement('strong', undefined, t('model.state.parseFailed')), createElement('span', undefined, errorMessage));
155
157
  }
156
158
  };
157
159
  const updateHelperVisibility = () => {
@@ -270,12 +272,12 @@ export default async function renderModel(buffer, target, type = 'glb', context)
270
272
  const { meshes, points } = countMeshes(object);
271
273
  const parts = [];
272
274
  if (meshes) {
273
- parts.push(`${meshes} 个网格`);
275
+ parts.push(t('model.summary.meshes', { count: meshes }));
274
276
  }
275
277
  if (points) {
276
- parts.push(`${points} 个点云`);
278
+ parts.push(t('model.summary.points', { count: points }));
277
279
  }
278
- objectSummary = parts.length ? parts.join('') : '模型已加载';
280
+ objectSummary = parts.length ? parts.join(' · ') : t('model.state.loaded');
279
281
  updateUi();
280
282
  };
281
283
  const normalizeObject = (object) => {
@@ -370,7 +372,7 @@ export default async function renderModel(buffer, target, type = 'glb', context)
370
372
  const { ColladaLoader } = await import('three/addons/loaders/ColladaLoader.js');
371
373
  const result = new ColladaLoader().parse(readText(), getResourcePath(sourceUrl));
372
374
  if (!result?.scene) {
373
- throw new Error('DAE 模型未解析出有效场景');
375
+ throw new Error(t('model.error.daeEmpty'));
374
376
  }
375
377
  return result.scene;
376
378
  };
@@ -397,7 +399,7 @@ export default async function renderModel(buffer, target, type = 'glb', context)
397
399
  const explainEngineeringModel = (modelType) => {
398
400
  const inspection = inspectGeometryKernelFile(buffer, modelType);
399
401
  const notice = formatGeometryKernelNotice(inspection.format || modelType);
400
- const signature = inspection.signature ? `检测到文件签名: ${inspection.signature}。` : '';
402
+ const signature = inspection.signature ? t('model.notice.signature', { signature: inspection.signature }) : '';
401
403
  const warnings = inspection.warnings.length ? ` ${inspection.warnings.join(' ')}` : '';
402
404
  throw new ModelPreviewNotice(`${signature}${notice}${warnings}`);
403
405
  };
@@ -471,14 +473,14 @@ export default async function renderModel(buffer, target, type = 'glb', context)
471
473
  if (isGeometryKernelFormat(modelType)) {
472
474
  return explainEngineeringModel(modelType);
473
475
  }
474
- throw new Error(`暂不支持 .${modelType} 模型格式`);
476
+ throw new Error(t('model.error.unsupported', { type: modelType }));
475
477
  }
476
478
  };
477
479
  const loadModel = async () => {
478
480
  const version = ++activeVersion;
479
481
  status = 'loading';
480
482
  errorMessage = '';
481
- objectSummary = '正在加载模型';
483
+ objectSummary = t('model.state.loadingSummary');
482
484
  updateUi();
483
485
  ensureScene();
484
486
  try {
@@ -499,7 +501,7 @@ export default async function renderModel(buffer, target, type = 'glb', context)
499
501
  console.error(reason);
500
502
  }
501
503
  status = 'error';
502
- errorMessage = normalizeError(reason) || `${normalizedType.toUpperCase()} 模型解析失败`;
504
+ errorMessage = normalizeError(reason) || t('model.error.parseFailed', { type: normalizedType.toUpperCase() });
503
505
  updateUi();
504
506
  }
505
507
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/renderer-3d",
3
- "version": "2.1.1",
3
+ "version": "2.1.3",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Standalone 3D model renderer plugin for Flyfish File Viewer powered by Three.js loaders and OrbitControls.",
@@ -57,8 +57,8 @@
57
57
  "LICENSE"
58
58
  ],
59
59
  "dependencies": {
60
- "@file-viewer/core": "^2.1.1",
61
- "@file-viewer/geometry-engine": "^2.1.1",
60
+ "@file-viewer/core": "^2.1.3",
61
+ "@file-viewer/geometry-engine": "^2.1.3",
62
62
  "three": "^0.184.0"
63
63
  },
64
64
  "devDependencies": {