tests/dicom/pages/synthetic-data.js

var dwv = dwv || {};
dwv.test = dwv.test || {};

/**
 * Create an object url from (JSON) tags.
 *
 * @param {object} config The data configuration.
 * @returns {string} The object URL.
 */
function getObjectUrlFromTags(config) {
  // add private tags to dict if present
  var useUnVrForPrivateSq = false;
  if (typeof config.privateDictionary !== 'undefined') {
    var keys = Object.keys(config.privateDictionary);
    for (var i = 0; i < keys.length; ++i) {
      var group = keys[i];
      var tags = config.privateDictionary[group];
      dwv.dicom.dictionary[group] = tags;
    }
    if (typeof config.useUnVrForPrivateSq !== 'undefined') {
      useUnVrForPrivateSq = config.useUnVrForPrivateSq;
    }
  }
  // convert JSON to DICOM element object
  var res = dwv.dicom.getElementsFromJSONTags(config.tags);
  var dicomElements = res.elements;
  // pixels: small gradient square
  dicomElements.x7FE00010 =
    dwv.dicom.generatePixelDataFromJSONTags(config.tags, res.offset);

  // create DICOM buffer
  var writer = new dwv.dicom.DicomWriter();
  writer.useUnVrForPrivateSq = useUnVrForPrivateSq;
  var dicomBuffer = writer.getBuffer(dicomElements);

  // blob and then url
  var blob = new Blob([dicomBuffer], {type: 'application/dicom'});
  return URL.createObjectURL(blob);
}

/**
 * Create list from configs
 *
 * @param {Array} configs An array of data cofiguration.
 * @returns {object} The html list element.
 */
function getConfigsHtmlList(configs) {
  var ul = document.createElement('ul');
  for (var i = 0; i < configs.length; ++i) {
    // download link
    var link = document.createElement('a');
    try {
      link.href = getObjectUrlFromTags(configs[i]);
    } catch (error) {
      console.log('data:', configs[i].name);
      console.error(error);
    }
    var fileName = 'dwv-generated-' + configs[i].name + '.dcm';
    link.download = fileName;
    link.appendChild(document.createTextNode(fileName));
    // list element
    var li = document.createElement('li');
    li.append(link);
    li.appendChild(document.createTextNode(': ' + configs[i].description));
    // append to list
    ul.append(li);
  }
  return ul;
}

/**
 * Get the list of configs and display them with a download link.
 *
 * @param {string} fileName The input file name.
 */
function getFileConfigsHtmlList(fileName) {
  var url = '/tests/dicom/' + fileName + '.json';
  var request = new XMLHttpRequest();
  request.open('GET', url, true);
  request.onerror = function (event) {
    console.error(event);
  };
  request.onload = function (/*event*/) {
    var content = document.getElementById('content');
    var title = document.createElement('h2');
    title.appendChild(document.createTextNode(fileName));
    content.append(title);
    var configs = JSON.parse(this.responseText);
    content.append(getConfigsHtmlList(configs));
  };
  request.send(null);
}

/**
 * Last minute.
 */
dwv.test.onDOMContentLoadedSynthData = function (/*event*/) {
  // create lists
  getFileConfigsHtmlList('synthetic-data_explicit');
  getFileConfigsHtmlList('synthetic-data_implicit');
  getFileConfigsHtmlList('synthetic-data_explicit_big-endian');
};