LegacyAsciiParser.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray.js';
  2. import vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData.js';
  3. import vtkPoints from '@kitware/vtk.js/Common/Core/Points.js';
  4. import vtkPointSet from '@kitware/vtk.js/Common/DataModel/PointSet.js';
  5. import vtkCellArray from '@kitware/vtk.js/Common/Core/CellArray.js';
  6. const METHOD_MAPPING = {
  7. POINTS: 'getPoints',
  8. POINT_DATA: 'getPointData',
  9. CELLS:'getCellData',
  10. CELL_TYPES: 'getCellTypes'
  11. };
  12. const DATATYPES = {
  13. bit: Uint8Array,
  14. unsigned_char: Uint8Array,
  15. char: Int8Array,
  16. unsigned_short: Uint16Array,
  17. short: Int16Array,
  18. unsigned_int: Uint32Array,
  19. int: Int32Array,
  20. unsigned_long: Uint32Array,
  21. long: Int32Array,
  22. float: Float32Array,
  23. double: Float64Array
  24. };
  25. const REGISTER_MAPPING = {
  26. SCALARS: 'addArray'
  27. };
  28. function createArrayHandler(array, setData, nbComponents) {
  29. let offset = 0;
  30. function fillWith(line) {
  31. line.split(' ').forEach(token => {
  32. if (token.length) {
  33. array[offset++] = Number(token);
  34. }
  35. });
  36. if (offset < array.length) {
  37. return true;
  38. }
  39. setData(array, nbComponents);
  40. return false;
  41. }
  42. return fillWith;
  43. }
  44. const TYPE_PARSER = {
  45. DATASET: {
  46. init(line, datamodel) {
  47. const type = line.split(' ')[1];
  48. switch (type) {
  49. case 'UNSTRUCTURED_GRID':
  50. datamodel.dataset = vtkPolyData.newInstance();
  51. // datamodel.scalars=new Map();
  52. break;
  53. default:
  54. console.error(`Dataset of type ${type} not supported`);
  55. }
  56. return false;
  57. },
  58. parse(line, datamodel) {
  59. return false;
  60. }
  61. },
  62. POINTS: {
  63. init(line, dataModel) {
  64. const [name, size, type] = line.split(' ');
  65. const array = type === 'float' ? new Float32Array(3 * Number(size)) : new Float64Array(3 * Number(size));
  66. const dataArray = dataModel.dataset.getPoints();
  67. dataArray.setName(name);
  68. dataModel.arrayHandler = createArrayHandler(array, dataArray.setData, 3);
  69. return true;
  70. },
  71. parse(line, dataModel) {
  72. return dataModel.arrayHandler(line);
  73. }
  74. },
  75. CELLS: {
  76. init(line, dataModel) {
  77. const [name, nbCells, nbValues] = line.split(' ');
  78. const cellArray = dataModel.dataset.getPolys();
  79. // const cellArray = dataModel.dataset.getLines();
  80. cellArray.set({
  81. numberOfCells: Number(nbCells)
  82. }, true); // Force numberOfCells update
  83. dataModel.arrayHandler = createArrayHandler(new Uint32Array(Number(nbValues)), cellArray.setData, 1);
  84. return true;
  85. },
  86. parse(line, dataModel) {
  87. return dataModel.arrayHandler(line);
  88. }
  89. },
  90. POINT_DATA: {
  91. init(line, dataModel) {
  92. dataModel.POINT_DATA = Number(line.split(' ')[1]);
  93. dataModel.activeFieldLocation = 'POINT_DATA';
  94. return false;
  95. },
  96. parse(line, dataModel) {
  97. return false;
  98. }
  99. },
  100. SCALARS: {
  101. init(line, dataModel) {
  102. // SCALARS Temperature float
  103. // LOOKUP_TABLE default
  104. // 300.00
  105. // 300.00
  106. // 300.00
  107. // 300.00
  108. // 300.00
  109. if(!dataModel.scalars){
  110. dataModel.scalars=new Map();
  111. }
  112. const [type, name, dataType] = line.split(' ');
  113. const numOfComp = 1;
  114. const array = new DATATYPES[dataType](dataModel.POINT_DATA);
  115. const dataArray = vtkDataArray.newInstance({
  116. name:name,
  117. size:dataModel.POINT_DATA
  118. });
  119. dataModel.scalars.set(name,array);
  120. // dataModel.dataset.getPointData().setScalars(dataArray);
  121. dataModel.arrayHandler = createArrayHandler(array, dataArray.setData, numOfComp);
  122. return true;
  123. },
  124. parse(line, dataModel) {
  125. if (line.split(' ')[0] === 'LOOKUP_TABLE') {
  126. return true;
  127. }
  128. return dataModel.arrayHandler(line);
  129. }
  130. }
  131. };
  132. function getParser(line, dataModel) {
  133. const tokens = line.split(' ');
  134. return TYPE_PARSER[tokens[0]];
  135. }
  136. function parseLegacyASCII(content) {
  137. let dataModel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  138. let parser = null;
  139. const separatorRegExp = /\r?\n/;
  140. const separatorRes = separatorRegExp.exec(content);
  141. const separator = separatorRes !== null ? separatorRes[0] : null;
  142. content.split(separator).forEach((line, index) => {
  143. if (index < 2) {
  144. return;
  145. }
  146. if (!parser) {
  147. parser = getParser(line);
  148. if (!parser) {
  149. return;
  150. }
  151. parser = parser.init(line, dataModel) ? parser : null;
  152. return;
  153. }
  154. if (parser && !parser.parse(line, dataModel)) {
  155. parser = null;
  156. }
  157. });
  158. return dataModel;
  159. }
  160. var vtkLegacyAsciiParser = {
  161. parseLegacyASCII
  162. };
  163. export { vtkLegacyAsciiParser as default };