{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["tabs","tab"]},"type":"markdown"},"seo":{"title":"LAS Support","description":"Accelerate E&P application development and protect your innovation by consuming our Data and Domain APIs / Platform APIs.","lang":"en-US","meta":[{"name":"robots","content":"noindex"}],"llmstxt":{"hide":true,"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"las-support","__idx":0},"children":["LAS Support"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This tutorial demonstrates how to:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Parse a local LAS3.0 (or LAS2.0) file, then put its sections data to DataTable-s;"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Display the sections data read as DataTableView-s;"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Write the tables' data back to LAS3.0 (or LAS2.0) file. Note that when a LAS3.0 file previously opened is written back as LAS2.0 file then ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["some data sections"]}," are going to be lost due to LAS2.0-format limitations."]}]}]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"main","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ts","header":{"controls":{"copy":{}}},"source":"import { Plot } from \"@int/geotoolkit/plot/Plot.ts\";\nimport { HttpClient } from \"@int/geotoolkit/http/HttpClient.ts\";\nimport { LineReader } from \"@int/geotoolkit/util/stream/LineReader.ts\";\nimport { BrowserFileStream } from \"@int/geotoolkit/util/stream/BrowserFileStream.ts\";\nimport { Las20Stream } from \"@int/geotoolkit/las/Las20Stream.ts\";\nimport { DataTable } from \"@int/geotoolkit/data/DataTable.ts\";\nimport { DataSeries } from \"@int/geotoolkit/data/DataSeries.ts\";\nimport { NumericalDataSeries } from \"@int/geotoolkit/data/NumericalDataSeries.ts\";\nimport { LasSectionGroup } from \"@int/geotoolkit/las/LasSectionGroup.ts\";\nimport { Las30Writer } from \"@int/geotoolkit/las/Las30Writer.ts\";\nimport { Las20Writer } from \"@int/geotoolkit/las/Las20Writer.ts\";\nimport { StringStream } from \"@int/geotoolkit/util/stream/StringStream.ts\";\nimport { LasWellSection } from \"@int/geotoolkit/las/LasWellSection.ts\";\nimport { LasVersionSection } from \"@int/geotoolkit/las/LasVersionSection.ts\";\nimport { log } from \"@int/geotoolkit/base.js\";\nimport { LasParser } from \"@int/geotoolkit/las/LasParser.ts\";\nimport { TableView } from \"@int/geotoolkit/widgets/TableView.ts\";\nimport { DataTableAdapter } from \"@int/geotoolkit/widgets/data/DataTableAdapter.ts\";\nimport { LasParameterSection } from \"@int/geotoolkit/las/LasParameterSection.ts\";\nimport { LasDataSection } from \"@int/geotoolkit/las/LasDataSection.ts\";\nimport { Las30Consts } from \"@int/geotoolkit/las/Las30Consts.ts\";\nimport { ParserFactory } from \"@int/geotoolkit/welllog/data/las/ParserFactory.ts\";\nconst http = HttpClient.getInstance().getHttp();\nlet delimiterName, delimiterDescription;\nlet dataTables = [];\nlet plots = [];\nlet tableParentDivs = [];\nlet asciiSectionGroupName = null;\nfunction emptyParameterSection(parameterSection) {\n  return !parameterSection || !parameterSection.getData() || parameterSection.getData().length < 1;\n}\nfunction tableToParameterSection(table, parameterSection, uniqueMnemonics) {\n  const nRows = table.getNumberOfRows();\n  if (nRows < 1) {\n    log(\"Table \" + table.getName() + \": NO rows found\");\n    return;\n  }\n  if (table.getRow(0).length !== 4) {\n    log(\"Table \" + table.getName() + \": row length == \" + table.getRow(0).length + \" vs. expected 4\");\n    return;\n  }\n  const meta = table.getMetaData();\n  const comments = meta && meta[\"comments\"] ? meta[\"comments\"] : null;\n  if (comments && !comments.empty()) {\n    for (let i = comments.getMinPosition(); i <= comments.getMaxPosition(); ++i) {\n      const strComment = comments.getComment(i);\n      if (strComment != null) {\n        parameterSection.addComment(i, strComment);\n      }\n    }\n  }\n  for (let i = 0; i < nRows; ++i) {\n    const row = table.getRow(i);\n    if (row.length === 4) {\n      const mnemonic = row[0];\n      parameterSection.setParameter(\n        mnemonic,\n        row[1],\n        row[2],\n        row[3],\n        uniqueMnemonics != null && uniqueMnemonics.indexOf(mnemonic) > -1 ? false : true\n      );\n    }\n  }\n}\nfunction tableToDataSection(dataTable, dataSection) {\n  const sectionData = [];\n  for (let i = 0; i < dataTable.getNumberOfColumns(); i++) {\n    const column = dataTable.getColumn(i);\n    const columnData = column.toArray(true);\n    sectionData.push(columnData);\n  }\n  dataSection.setData(sectionData);\n}\nfunction onFileOpen(evt, canvasesParent, fileInfo) {\n  evt.stopPropagation();\n  evt.preventDefault();\n  const files = evt.target.files;\n  return handleFileSelect(files, canvasesParent, fileInfo);\n}\nfunction isAsciiSectionName(name) {\n  name = name.toLowerCase();\n  if (LasParser.isDataMainSectionName(name) || name === \"las2\" || name === \"main section\" || name === \"log\" || name.startsWith(\"curve_data\") || name.startsWith(\"log_data\")) {\n    return true;\n  }\n  return false;\n}\nfunction getAsciiSectionGroup(sections) {\n  for (let i = 0; i < sections.length; ++i) {\n    if (isAsciiSectionName(sections[i].getName())) {\n      return sections[i];\n    }\n  }\n  return null;\n}\nfunction createLAS20Writer() {\n  const res = dataTables.filter((t) => isAsciiSectionName(t.getName()));\n  if (!res || res.length < 1) {\n    return null;\n  }\n  const table = res[0];\n  const metaData = table.getMetaData();\n  const indexDataSeries = metaData[\"index\"] ? table.getColumnByName(metaData[\"index\"]) : table.getColumn(0);\n  const lasWriter = new Las20Writer(indexDataSeries);\n  return lasWriter;\n}\nfunction createLAS30Writer() {\n  const lasWriter = new Las30Writer();\n  lasWriter.setDataValuesDelimiter(\n    delimiterName,\n    delimiterDescription\n  );\n  return lasWriter;\n}\nfunction dataToLASWriter(lasWriterVersion) {\n  const lasWriter = lasWriterVersion === \"2.0\" ? createLAS20Writer() : createLAS30Writer();\n  if (!lasWriter) {\n    return null;\n  }\n  let lasDataVersion;\n  let write30dataTo20file;\n  const sectionGroupsInfos = {};\n  for (let i = 0; i < dataTables.length; ++i) {\n    const dataTable = dataTables[i];\n    const name = dataTable.getName().trim().toUpperCase();\n    if (LasParser.isVersionSectionName(name)) {\n      const versionSection = new LasVersionSection();\n      tableToParameterSection(dataTable, versionSection);\n      lasDataVersion = versionSection.getParameter(Las30Consts.MNEMONIC_VERSION).getValue();\n      write30dataTo20file = lasWriterVersion === \"2.0\" && lasDataVersion === \"3.0\";\n      if (lasDataVersion !== lasWriterVersion) {\n        continue;\n      }\n      lasWriter.setVersionSection(versionSection);\n    } else if (LasParser.isWellSectionName(name)) {\n      const wellSection = new LasWellSection();\n      tableToParameterSection(dataTable, wellSection, [\n        Las30Consts.MNEMONIC_START,\n        Las30Consts.MNEMONIC_STOP,\n        Las30Consts.MNEMONIC_STEP,\n        Las30Consts.MNEMONIC_NULL\n      ]);\n      lasWriter.setWellSection(wellSection);\n    } else {\n      const sectionGroupName = dataTable.getMetaData()[\"sectionGroupName\"];\n      if (write30dataTo20file && sectionGroupName !== asciiSectionGroupName) {\n        continue;\n      }\n      if (name.indexOf(\"ASCII\") === 0 || name.split(\"_\").length > 1 && name.split(\"_\")[1].indexOf(\"DATA\") !== -1 || name.split(\"|\").length > 1 && name.split(\"|\")[1].indexOf(\"DEFINITION\") !== -1) {\n        const dataSection = new LasDataSection({\n          \"name\": write30dataTo20file ? \"ASCII\" : dataTable.getName()\n        });\n        tableToDataSection(dataTable, dataSection);\n        if (sectionGroupsInfos[sectionGroupName] === void 0) {\n          sectionGroupsInfos[sectionGroupName] = {};\n        }\n        sectionGroupsInfos[sectionGroupName][\"data\"] = dataSection;\n        if (lasWriterVersion === \"2.0\") {\n          break;\n        }\n      } else if (name.indexOf(\"PARAMETER\") === 0 || name.split(\"_\").length > 1 && name.split(\"_\")[1].indexOf(\"PARAMETER\") !== -1) {\n        const parameterSection = new LasParameterSection({\n          \"name\": write30dataTo20file ? \"PARAMETER\" : dataTable.getName()\n        });\n        tableToParameterSection(dataTable, parameterSection);\n        if (sectionGroupsInfos[sectionGroupName] === void 0) {\n          sectionGroupsInfos[sectionGroupName] = {};\n        }\n        sectionGroupsInfos[sectionGroupName][\"parameter\"] = parameterSection;\n      } else if (name.indexOf(\"CURVE\") === 0 || name.split(\"_\").length > 1 && name.split(\"_\")[1].indexOf(\"DEFINITION\") !== -1) {\n        const parameterSection = new LasParameterSection({\n          \"name\": write30dataTo20file ? \"CURVE\" : dataTable.getName()\n        });\n        tableToParameterSection(dataTable, parameterSection);\n        if (sectionGroupsInfos[sectionGroupName] === void 0) {\n          sectionGroupsInfos[sectionGroupName] = {};\n        }\n        sectionGroupsInfos[sectionGroupName][\"definition\"] = parameterSection;\n      } else {\n        log(\"Unrecognized Section Type: \" + dataTable.getName());\n      }\n    }\n  }\n  for (const name in sectionGroupsInfos) {\n    if (sectionGroupsInfos.hasOwnProperty(name)) {\n      const info = sectionGroupsInfos[name];\n      const sectionGroup = new LasSectionGroup(\n        name,\n        info[\"parameter\"],\n        info[\"definition\"],\n        info[\"data\"]\n      );\n      if (lasWriter instanceof Las30Writer) {\n        lasWriter.setDataSectionGroup(sectionGroup);\n      } else if (lasWriter instanceof Las20Writer) {\n        lasWriter.setDataSectionGroup(sectionGroup);\n      }\n    }\n  }\n  return lasWriter;\n}\nfunction onFileSave(lasWriterVersion) {\n  if (!dataTables || dataTables.length === 0) {\n    log(\"No data loaded to save\");\n    return;\n  }\n  if (lasWriterVersion !== \"2.0\" && lasWriterVersion !== \"3.0\") {\n    log(\"Unsupported LAS-version: \" + lasWriterVersion);\n    return;\n  }\n  const lasWriter = dataToLASWriter(lasWriterVersion);\n  if (!lasWriter) {\n    log(\"Writer NOT created for LAS-version: \" + lasWriterVersion);\n    return;\n  }\n  const stream = new StringStream().setSaveOptions({\n    \"type\": \"text/plain\",\n    \"popupblockedmessage\": \"Popup-blocker blocked export window.\"\n  });\n  lasWriter.save(stream);\n  stream.close().save(\"saved_as_\" + lasWriterVersion + \".las\", true);\n}\nfunction onFileDrop(evt, canvasesParent, fileInfo) {\n  evt.stopPropagation();\n  evt.preventDefault();\n  const files = evt.dataTransfer.files;\n  evt.dataTransfer.dropEffect = \"copy\";\n  return handleFileSelect(files, canvasesParent, fileInfo);\n}\nfunction loadFile(fileName, canvasesParent, fileInfo) {\n  http.get(fileName, {\n    \"responsetype\": \"blob\"\n  }).then((response) => {\n    handleFileSelect([new File([response.data], fileName)], canvasesParent, fileInfo);\n  });\n}\nfunction getParameterSectionByName(sections, name) {\n  for (let i = 0; i < sections.length; ++i) {\n    if (sections[i].getName().toLowerCase().indexOf(name.toLowerCase()) >= 0) {\n      return sections[i];\n    }\n  }\n  return null;\n}\nfunction loadWellOrVersionSectionTable(section) {\n  const name = section.getName().trim().toUpperCase();\n  const table = new DataTable({\n    \"name\": name\n  });\n  const parameters = section.getData();\n  const mnemonics = [];\n  const units = [];\n  const values = [];\n  const descriptions = [];\n  for (let i = 0; i < parameters.length; ++i) {\n    const parameter = parameters[i];\n    mnemonics.push(parameter.getMnemonic());\n    units.push(parameter.getUnit());\n    values.push(parameter.getValue());\n    descriptions.push(parameter.getDescription());\n  }\n  table.addColumn(new DataSeries({\n    \"id\": \"mnemonic\",\n    \"name\": \"mnemonic\",\n    \"data\": mnemonics\n  }));\n  table.addColumn(new DataSeries({\n    \"id\": \"unit\",\n    \"name\": \"unit\",\n    \"data\": units\n  }));\n  table.addColumn(new DataSeries({\n    \"id\": \"value\",\n    \"name\": \"value\",\n    \"data\": values\n  }));\n  table.addColumn(new DataSeries({\n    \"id\": \"description\",\n    \"name\": \"description\",\n    \"data\": descriptions\n  }));\n  return table;\n}\nfunction loadParameterSectionTable(parameterSection) {\n  const table = new DataTable({ \"name\": parameterSection.getName() });\n  const parameters = parameterSection.getData();\n  const mnemonics = [];\n  const units = [];\n  const values = [];\n  const descriptions = [];\n  for (let i = 0; i < parameters.length; ++i) {\n    const parameter = parameters[i];\n    mnemonics.push(parameter.getMnemonic());\n    units.push(parameter.getUnit());\n    values.push(parameter.getValue());\n    descriptions.push(parameter.getDescription());\n  }\n  table.addColumn(new DataSeries({\n    \"id\": \"mnemonic\",\n    \"name\": \"mnemonic\",\n    \"data\": mnemonics\n  }));\n  table.addColumn(new DataSeries({\n    \"id\": \"unit\",\n    \"name\": \"unit\",\n    \"data\": units\n  }));\n  table.addColumn(new DataSeries({\n    \"id\": \"value\",\n    \"name\": \"value\",\n    \"data\": values\n  }));\n  table.addColumn(new DataSeries({\n    \"id\": \"description\",\n    \"name\": \"description\",\n    \"data\": descriptions\n  }));\n  return table;\n}\nfunction loadDataSectionTable(sectionGroup) {\n  const dataSection = sectionGroup.getSections()[\"data\"];\n  const table = new DataTable({ \"name\": dataSection.getName() });\n  const curveNames = sectionGroup.getCurveMnemonics();\n  for (let i = 0; i < curveNames.length; ++i) {\n    const data = sectionGroup.getCurveData(i);\n    const info = sectionGroup.getCurveInfo(i);\n    let curve;\n    if (sectionGroup.isCurveNumeric(i)) {\n      curve = new NumericalDataSeries({\n        \"name\": info.getMnemonic(),\n        \"data\": data,\n        \"id\": info.getMnemonic(),\n        \"unit\": info.getUnit()\n      });\n    } else {\n      const strData = [];\n      data.forEach((e) => {\n        strData.push(e.toString());\n      });\n      curve = new DataSeries({\n        \"name\": info.getMnemonic(),\n        \"data\": strData,\n        \"id\": info.getMnemonic(),\n        \"unit\": info.getUnit()\n      });\n    }\n    table.addColumn(curve);\n  }\n  return table;\n}\nfunction legacyParse(file, resolve, reject) {\n  const reader = new FileReader();\n  reader.onload = function(e) {\n    const parser = ParserFactory.getParser(e.target.result, false);\n    if (parser == null) {\n      reject(\"unknown file format\");\n      return;\n    }\n    parser.parse(e.target.result);\n    const sections = parser.getSections();\n    const versionSection = getParameterSectionByName(sections, \"VERSION\");\n    if (versionSection == null) {\n      reject(\"VERSION data NOT found\");\n      return;\n    }\n    const wellSection = getParameterSectionByName(sections, \"WELL\");\n    if (wellSection == null) {\n      reject(\"WELL data not found\");\n      return;\n    }\n    const sectionGroups = parser.getSectionGroups();\n    const asciiSectionGroup = getAsciiSectionGroup(sectionGroups);\n    if (asciiSectionGroup == null) {\n      asciiSectionGroupName = null;\n      reject(\"No ASCII-section data is found\");\n      return;\n    }\n    asciiSectionGroupName = asciiSectionGroup.getName();\n    for (let is = 0; is < sections.length; ++is) {\n      const tableS = loadWellOrVersionSectionTable(sections[is]);\n      tableS.setMetaData({ \"comments\": sections[is].getComments() });\n      resolve(tableS);\n      dataTables.push(tableS);\n    }\n    for (let isg = 0; isg < sectionGroups.length; ++isg) {\n      const sectionGroup = sectionGroups[isg];\n      const parameters = sectionGroup.getSections()[\"parameters\"];\n      if (!emptyParameterSection(parameters)) {\n        const tablePars = loadParameterSectionTable(parameters);\n        tablePars.setMetaData({\n          \"sectionGroupName\": sectionGroup.getName(),\n          \"comments\": parameters.getComments()\n        });\n        resolve(tablePars);\n        dataTables.push(tablePars);\n      }\n      const definition = sectionGroup.getSections()[\"curves\"];\n      if (!emptyParameterSection(definition)) {\n        const tableDefs = loadParameterSectionTable(definition);\n        tableDefs.setMetaData({\n          \"sectionGroupName\": sectionGroup.getName(),\n          \"comments\": definition.getComments()\n        });\n        resolve(tableDefs);\n        dataTables.push(tableDefs);\n      }\n      const tableData = loadDataSectionTable(sectionGroup);\n      tableData.setMetaData({\n        \"sectionGroupName\": sectionGroup.getName()\n      });\n      resolve(tableData);\n      dataTables.push(tableData);\n    }\n    const parameterDLM = versionSection.getParameter(Las30Consts.MNEMONIC_DATA_VALUES_DELIMITER);\n    if (parameterDLM != null) {\n      const v = parameterDLM.getValue();\n      delimiterName = v != null && v.length > 0 ? v : Las30Consts.DATA_VALUES_DELIMITER_NAME_SPACE;\n      delimiterDescription = parameterDLM.getDescription();\n    } else {\n      delimiterName = Las30Consts.DATA_VALUES_DELIMITER_NAME_SPACE;\n    }\n  };\n  reader.readAsText(file);\n}\nfunction visualizeTables(dataTables2, canvasesParent) {\n  for (let i = 0; i < dataTables2.length; ++i) {\n    const dataTable = dataTables2[i];\n    const tableParentDiv = document.createElement(\"div\");\n    tableParentDiv.style.height = \"200px\";\n    tableParentDiv.style.color = \"red\";\n    const tableName = document.createElement(\"textarea\");\n    tableName.value = dataTable.getName();\n    tableName.style.backgroundColor = \"lightgray\";\n    tableName.style.borderRadius = \"6px\";\n    tableName.style.borderWidth = \"1px\";\n    tableName.style.position = \"absolute\";\n    tableName.style.height = \"20px\";\n    tableName.style.width = \"100%\";\n    tableParentDiv.appendChild(tableName);\n    const tableCanvas = document.createElement(\"canvas\");\n    tableCanvas.style.height = \"180px\";\n    tableCanvas.style.width = \"100%\";\n    tableCanvas.style.backgroundColor = \"yellow\";\n    tableParentDiv.appendChild(tableCanvas);\n    canvasesParent.appendChild(tableParentDiv);\n    const tableAdapter = new DataTableAdapter({\n      \"datatable\": dataTable\n    });\n    const tableViewWidget = new TableView({\n      \"border\": {\n        \"color\": \"lightgray\",\n        \"pixelsnapmode\": true\n      },\n      \"fitborder\": true,\n      \"horizontalscroll\": \"floating\",\n      \"verticalscroll\": \"floating\"\n    }).setData(tableAdapter);\n    plots.push(new Plot({\n      \"canvaselement\": tableCanvas,\n      \"root\": tableViewWidget\n    }));\n    tableParentDivs.push(tableParentDiv);\n    tableViewWidget.fitToWidth(false);\n  }\n}\nfunction clear(canvasesParent) {\n  dataTables.forEach((dataTables2) => {\n    dataTables2.dispose();\n  });\n  dataTables = [];\n  plots.forEach((plot) => {\n    plot.dispose(true);\n  });\n  plots = [];\n  if (canvasesParent != null) {\n    for (let i = 0; i < tableParentDivs.length; ++i) {\n      canvasesParent.removeChild(tableParentDivs[i]);\n    }\n  }\n  tableParentDivs = [];\n}\nfunction handleFileSelect(files, canvasesParent, fileInfo) {\n  let output = \"\";\n  if (files.length > 0) {\n    clear(canvasesParent);\n    fileInfo.text = \"\";\n    const file = files[0];\n    const lineReader = new LineReader({\n      \"stream\": new BrowserFileStream({\n        \"file\": file\n      })\n    });\n    new Promise((resolve, reject) => {\n      Las20Stream.isLAS20(lineReader).then((result) => {\n        legacyParse(file, resolve, reject);\n        output = file.name;\n        output += result[\"isLAS20\"] ? \" [LAS20]\" : \" [LAS30]\";\n        fileInfo.text = output;\n      }).catch((result) => reject(result));\n    }).then(() => {\n      visualizeTables(dataTables, canvasesParent);\n    });\n  }\n}\nexport { clear, loadFile, onFileDrop, onFileOpen, onFileSave };\n\ncreateScene();\n\n","lang":"ts"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"css","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"css","header":{"controls":{"copy":{}}},"source":"\n.cg-tooltip-holder {\n  position: relative;\n}\n\n.cg-tooltip {\n  position: absolute;\n  display: block;\n  padding: 2px 12px 3px 7px;\n  overflow: visible !important;\n  font-family: Roboto, Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  background: white !important;\n  opacity: 0.9;\n  color: #333333;\n  border: solid 1px gray;\n  border-radius: 5px;\n  text-align: left;\n  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);\n  border-radius: 5px;\n  margin: 0 !important;\n  z-index: 10000;\n  max-width: 400px;\n  text-wrap: normal !important;\n  white-space: normal !important;\n}\n/* Default setting for tooltip */\n.cg-tooltip-container {\n  position: absolute;\n  display: block;\n  overflow: visible !important;\n  font-family: Roboto, Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  padding: 3px 7px;\n  background: #f7f7f7;\n  color: #333333;\n  border: 1px solid #938e8e;\n  opacity: 0.8;\n  text-align: left;\n  box-shadow: 3px 3px 10px #888;\n  margin: 0 !important;\n  z-index: 10000;\n  max-width: 400px;\n  text-wrap: normal !important;\n  white-space: normal !important;\n  user-select: none;\n}\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n  .cg-tooltip-container {\n    border-radius: 0;\n  }\n}\n/* Default left arrow for tooltip */\n.cg-tooltip-arrow-left::before {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 0;\n  top: 50%;\n  border: 5px solid transparent;\n  border-left: 0;\n  border-right: 5px solid  #938e8e;\n  transform: translate(calc(-100%), -50%);\n}\n.cg-tooltip-arrow-left::after {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 0;\n  top: 50%;\n  border: 4px solid transparent;\n  border-left: 0;\n  border-right: 4px solid #f7f7f7;\n  transform: translate(calc(-100%), -50%);\n}\n/* Default top arrow for tooltip */\n.cg-tooltip-arrow-top::before {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 50%;\n  top: 0;\n  border: 5px solid transparent;\n  border-top: 0;\n  border-bottom: 5px solid #938e8e;\n  transform: translate(-50%, -100%);\n}\n.cg-tooltip-arrow-top::after {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 50%;\n  top: 0;\n  border: 4px solid transparent;\n  border-top: 0;\n  border-bottom: 4px solid #f7f7f7;\n  transform: translate(-50%, -100%);\n}\n/* Default right arrow for tooltip */\n.cg-tooltip-arrow-right::before {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  right: 0;\n  top: 50%;\n  border: 5px solid transparent;\n  border-right: 0;\n  border-left: 5px solid #938e8e;\n  transform: translate(100%, -50%);\n}\n.cg-tooltip-arrow-right::after {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  right: 0;\n  top: 50%;\n  border: 4px solid transparent;\n  border-right: 0;\n  border-left: 4px solid #f7f7f7;\n  transform: translate(100%, -50%);\n}\n/* Default bottom arrow for tooltip */\n.cg-tooltip-arrow-bottom::before {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 50%;\n  bottom: 0px;\n  border: 5px solid transparent;\n  border-bottom: 0;\n  border-top: 5px solid #938e8e;\n  transform: translate(-50%, 100%);\n  z-index: 10000;\n}\n.cg-tooltip-arrow-bottom::after {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 50%;\n  bottom: 0;\n  border: 4px solid transparent;\n  border-bottom: 0;\n  border-top: 4px solid #f7f7f7;\n  transform: translate(-50%, 100%);\n  z-index: 10000;\n}\n/* Tooltip item name */\n/* Tooltip item value */\n/* .cg-tooltip-item-value */\n/* Tooltip item value */\n.cg-tooltip-item-unit {\n  text-transform: none;\n}\n\n.cg-tooltip-item-name {\n    text-transform: capitalize;\n    white-space: nowrap;\n    vertical-align: middle;\n    font-size: 13px;\n}\n.cg-tooltip-row {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  white-space: pre-wrap;\n  font-size: 12px;\n  line-height: 100%;\n  margin: 1px 0;\n}\n.cg-tooltip-title {\n  font-size: 13px;\n  height: 14px;\n  text-transform: capitalize;\n}\n.cg-tooltip-title .cg-tooltip-symbol {\n  margin-right: 0 !important;\n}\n.cg-tooltip-title-name {\n  vertical-align: middle;\n}\n.cg-tooltip-row + .cg-tooltip-row {\n  margin-top: 4px;\n}\n.cg-tooltip-row.cg-tooltip-title + .cg-tooltip-row {\n  margin-top: 5px;\n}\n.cg-tooltip-item-value + .cg-tooltip-item-unit {\n    margin-left: 1px;\n}\n/* Tooltip symbol */\n.cg-tooltip-symbol-cell {\n  display: inline-flex;\n  min-width: 13px; /* 10px size + 3px margin */\n}\n.cg-tooltip-symbol {\n  margin-right: 3px;\n  background-color: transparent;\n  display: block;\n}\n.cg-tooltip-symbol > img {\n  display: block;\n}\n.cg-tooltip-list-cell {\n  display: inline-flex;\n}\n.cg-tooltip-list-symbol {\n  display: block;\n  margin-right: 3px;\n  width: 6px;\n  height: 6px;\n  vertical-align: middle;\n  border-radius: 50%;\n  border: 1px solid rgba(0,0,0,.4);\n}\n.cg-tooltip-symbol-legacy {\n  border-radius: 4px;\n  margin-right: 5px;\n  height: 8px;\n  width: 8px;\n  display: inline-block;\n}\n.cg-tooltip-title-legacy {\n  font-weight: 900;\n}\n\n/* Tooltip symbol circle */\n.cg-tooltip-symbol.circle {\n  height: 10px;\n  width: 10px;\n  display: inline-block;\n  border-radius: 50%;\n  border: 1px solid rgba(0,0,0,.4);\n}\n/* Tooltip symbol line */\n.cg-tooltip-symbol.line {\n    height: 10px;\n    width: 10px;\n    display: inline-block;\n    transform: scale(1.2, 0.2);\n}\n/* Tooltip symbol diamond */\n.cg-tooltip-symbol.diamond {\n    height: 10px;\n    width: 10px;\n    display: inline-block;\n    transform: rotate(45deg);\n    border-radius: 0px;\n}\n/* Tooltip symbol square */\n.cg-tooltip-symbol.square {\n    height: 10px;\n    width: 10px;\n    display: inline-block;\n    border-radius: 0px;\n    border: 1px solid rgba(0,0,0,.4);\n}\n\n","lang":"css"},"children":[]}]}]},{"$$mdtype":"Tag","name":"iframe","attributes":{"src":"https://dc2-documentation.s3.amazonaws.com/documentation/slb-docs-test/5.0/examples/vue/tutorials/index.html#/WellLog/DataAndTemplates/LAS3Support/las3Support?section=introduction&extract=true","width":"100%","height":"178px","style":{"border":"none"}},"children":[]}]},"headings":[{"value":"LAS Support","id":"las-support","depth":1}],"frontmatter":{"title":"LAS Support","seo":{"title":"LAS Support"}},"lastModified":"2026-02-11T19:54:32.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/solutions/geotoolkit/tutorials/well-log/data-and-templates/las-3-support","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}