1/**
2 * Upload formats the app accepts. All go through meshio (in Pyodide); the
3 * mesh must contain triangle or quadrilateral cells — surfacefun computes
4 * on either patch type (but not both at once, so mixed meshes are split
5 * into all-triangle in bridge.py).
6 */
7export interface MeshFormat {
8 id: string // meshio file_format id
9 label: string
10 extension: string
11}
13export const FORMATS: MeshFormat[] = [
14 { id: 'gmsh', label: 'Gmsh MSH', extension: '.msh' },
15 { id: 'vtk', label: 'VTK legacy', extension: '.vtk' },
16 { id: 'vtu', label: 'VTU (VTK XML)', extension: '.vtu' },
17 { id: 'obj', label: 'Wavefront OBJ', extension: '.obj' },
18 { id: 'off', label: 'OFF', extension: '.off' },
19 { id: 'ply', label: 'PLY', extension: '.ply' },
20 { id: 'abaqus', label: 'Abaqus', extension: '.inp' },
21 { id: 'medit', label: 'Medit', extension: '.mesh' },
22 { id: 'nastran', label: 'Nastran', extension: '.bdf' },
23 { id: 'avsucd', label: 'AVS-UCD', extension: '.avs' },
24]
26export const ACCEPT = FORMATS.map((f) => f.extension).join(',')
28export function formatForFilename(name: string): MeshFormat | null {
29 const dot = name.lastIndexOf('.')
30 if (dot < 0) return null
31 const ext = name.slice(dot).toLowerCase()
32 return FORMATS.find((f) => f.extension === ext) ?? null
33}