1/**
2 * Upload formats the app accepts. All go through meshio (in Pyodide); the
3 * mesh must contain quadrilateral cells — surfacefun's patches are quads,
4 * and pure-triangle meshes are rejected with a pointer to why.
5 */
6export interface MeshFormat {
7 id: string // meshio file_format id
8 label: string
9 extension: string
10}
12export const FORMATS: MeshFormat[] = [
13 { id: 'gmsh', label: 'Gmsh MSH', extension: '.msh' },
14 { id: 'vtk', label: 'VTK legacy', extension: '.vtk' },
15 { id: 'vtu', label: 'VTU (VTK XML)', extension: '.vtu' },
16 { id: 'obj', label: 'Wavefront OBJ', extension: '.obj' },
17 { id: 'off', label: 'OFF', extension: '.off' },
18 { id: 'ply', label: 'PLY', extension: '.ply' },
19 { id: 'abaqus', label: 'Abaqus', extension: '.inp' },
20 { id: 'medit', label: 'Medit', extension: '.mesh' },
21 { id: 'nastran', label: 'Nastran', extension: '.bdf' },
22 { id: 'avsucd', label: 'AVS-UCD', extension: '.avs' },
23]
25export const ACCEPT = FORMATS.map((f) => f.extension).join(',')
27export function formatForFilename(name: string): MeshFormat | null {
28 const dot = name.lastIndexOf('.')
29 if (dot < 0) return null
30 const ext = name.slice(dot).toLowerCase()
31 return FORMATS.find((f) => f.extension === ext) ?? null
32}