actions.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { ActionTree } from 'vuex'
  2. import { StateInterface } from '../index'
  3. import { guiRuntimeStateInterface } from './state'
  4. import { composeLabelFromPageData } from 'components/utils'
  5. import { load } from 'js-yaml'
  6. import Spline from 'cubic-spline-ts'
  7. async function loadMaterialData(filename:string):Promise<number[][] | undefined>{ /* eslint-disable */
  8. // TODO enable eslint, which is disabled now due to unknown result type of load() from js-yaml
  9. // TODO implement formulas
  10. // TODO implement multiple '- type:' in one file (e.g. it can be 'tabulated n' and 'tabulated k'
  11. let Ag_data
  12. try {
  13. const response = await fetch(process.env.publicPath+'refractiveindex.info-database/database/data/'+filename)
  14. const Ag_data = await response.text()
  15. const doc = await load(Ag_data) as any
  16. if (doc.DATA[0].type == 'tabulated nk' || doc.DATA[0].type == 'tabulated n') {
  17. const csv = doc.DATA[0].data
  18. const rows:string[] = csv.split("\n")
  19. let data = rows.map(row =>row.split(" "))
  20. data.pop()
  21. let data_num = data.map(elem => elem.map(elem2 => parseFloat(elem2)))
  22. function transpose(array:number[][]) {
  23. return array[0].map((col, i) => array.map(row => row[i]));
  24. }
  25. let data_columns = transpose(data_num)
  26. // Convert from default refractiveindex.info mkm to nm
  27. for (let i=0; i<data_columns[0].length; i++)
  28. data_columns[0][i] *= 1000
  29. return data_columns
  30. }
  31. } catch (e) {
  32. console.log(e)
  33. }
  34. return undefined
  35. }
  36. const actions: ActionTree<guiRuntimeStateInterface, StateInterface> = {
  37. async activateMaterial({commit,state}/* context */, filepath:string) {
  38. const data_columns:number[][]|undefined = await loadMaterialData(filepath)
  39. if (!data_columns) return
  40. let xs:number[] = data_columns[0]
  41. let ys1:number[] = data_columns[1]
  42. let ys2:number[] = data_columns[1].map(()=>0)
  43. if (data_columns[2]) ys2 = data_columns[2]
  44. const maxVal = 350 // TODO move it to config.ts
  45. if (xs.length > maxVal) {
  46. const delta = Math.floor(xs.length / maxVal);
  47. let tmp_xs:number[] = []
  48. let tmp_ys1:number[] = []
  49. let tmp_ys2:number[] = []
  50. for (let i = 0; i < xs.length; i = i + delta) {
  51. tmp_xs.push(xs[i])
  52. tmp_ys1.push(ys1[i])
  53. tmp_ys2.push(ys2[i])
  54. }
  55. xs = tmp_xs
  56. ys1 = tmp_ys1
  57. ys2 = tmp_ys2
  58. }
  59. // TODO use 10.1016/j.cagd.2010.10.002 or https://en.wikipedia.org/wiki/Monotone_cubic_interpolation
  60. const spline_n = new Spline(xs, ys1);
  61. const spline_k = new Spline(xs, ys2);
  62. const name = composeLabelFromPageData(filepath)
  63. const spectrumRangeStart = xs[0]
  64. const spectrumRangeEnd = xs[xs.length-1]
  65. commit('addMaterial', {name:name,
  66. spectrumRangeStart:spectrumRangeStart, spectrumRangeEnd:spectrumRangeEnd,
  67. nSpline:spline_n, kSpline:spline_k, isPlot:false})
  68. },
  69. }
  70. export default actions