{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["tabs","tab"]},"type":"markdown"},"seo":{"title":"Log Grad Function","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":"log-grad-function","__idx":0},"children":["Log Grad Function"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following canvas demonstrates the tool for creating, and editing Log Grad Visual."]},{"$$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 { mergeObjects } from \"@int/geotoolkit/base.js\";\nimport { LogCurve } from \"@int/geotoolkit/welllog/LogCurve.ts\";\nimport { LogData } from \"@int/geotoolkit/welllog/data/LogData.ts\";\nimport { Plot } from \"@int/geotoolkit/plot/Plot.ts\";\nimport { TrackType } from \"@int/geotoolkit/welllog/TrackType.ts\";\nimport { Orientation } from \"@int/geotoolkit/util/Orientation.ts\";\nimport { AnchorType } from \"@int/geotoolkit/util/AnchorType.ts\";\nimport { Patterns } from \"@int/geotoolkit/attributes/LineStyle.ts\";\nimport { LogVisualHeaderProvider } from \"@int/geotoolkit/welllog/header/LogVisualHeaderProvider.ts\";\nimport { AdaptiveBasicLogVisualHeader } from \"@int/geotoolkit/welllog/header/AdaptiveBasicLogVisualHeader.ts\";\nimport { Sections } from \"@int/geotoolkit/welllog/header/AdaptiveLogVisualHeader.ts\";\nimport { Util as HeaderUtil } from \"@int/geotoolkit/welllog/header/Util.ts\";\nimport { Events as SelectionEvents } from \"@int/geotoolkit/controls/tools/Selection.ts\";\nimport { createWellLogWidget } from \"/src/code/WellLog/utils/common.ts\";\nimport { LogGradVisual } from \"/src/code/WellLog/AdditionalFunctionality/LogGradFunction/LogGradVisual.ts\";\nimport { LogGradEditor } from \"/src/code/WellLog/AdditionalFunctionality/LogGradFunction/LogGradEditor.ts\";\nconst CROSSHAIR_LABEL = {\n  \"visible\": true,\n  \"linestyle\": {\n    \"color\": \"rgba(175, 175, 175, 0.9)\",\n    \"pixelsnapmode\": true,\n    \"width\": 1\n  },\n  \"fillstyle\": {\n    \"color\": \"rgba(255, 255, 255, 0.85)\",\n    \"shadow\": {\n      \"enable\": true,\n      \"color\": \"rgba(60, 60, 60, 0.5)\",\n      \"blur\": 6,\n      \"offsetx\": 0,\n      \"offsety\": 4\n    }\n  },\n  \"textstyle\": {\n    \"font\": \"12px sans-serif\",\n    \"color\": \"#252525\"\n  },\n  \"paddingstyle\": 4\n};\nconst header = new AdaptiveBasicLogVisualHeader().setElement({\n  \"Line\": {\n    \"section\": Sections.Middle,\n    \"drawmethod\": (header2, rect, context) => {\n      const visual = header2.getVisual();\n      const lineStyle = visual.getLineStyle();\n      if (lineStyle != null) {\n        HeaderUtil.drawLine(lineStyle, null, rect, context);\n      }\n    }\n  }\n});\nLogVisualHeaderProvider.getDefaultInstance().registerHeaderProvider(LogGradVisual.getClassName(), header);\nfunction createCurve(color, withNaN) {\n  const data = new LogData({\n    \"name\": \"CALI\",\n    \"depths\": [10, 12, 20, 27, 30, 35, 40, 42, 50, 55, 60, 67, 70, 75],\n    \"values\": withNaN ? [75, 100, 90, NaN, NaN, NaN, 60, 75, 80, 100, 40, 67, 40, 80] : [75, 100, 90, 50, 60, 95, 60, 75, 80, 100, 40, 67, 40, 80],\n    \"indexunit\": \"ft\",\n    \"valuesunit\": \"ft\"\n  });\n  return new LogCurve(data).setLineStyle({\n    \"color\": color,\n    \"width\": 2\n  });\n}\nfunction createScene(canvas) {\n  const widget = createWellLogWidget({\n    \"orientation\": Orientation.Horizontal\n  });\n  widget.addTrack(TrackType.IndexTrack);\n  const linearTrack = widget.addTrack(TrackType.LinearTrack);\n  let logCurve;\n  linearTrack.addChild([\n    logCurve = createCurve(\"#ef6c00\").setMicroPosition(0.1, 0.8),\n    new LogGradVisual({\n      \"curve\": logCurve,\n      \"intervals\": [15, 31, 52, 65],\n      \"linestyle\": {\n        \"width\": 2,\n        \"color\": \"blue\",\n        \"pattern\": Patterns.Dash\n      }\n    }).setName(\"Log GRAD [Cali]\")\n  ]);\n  widget.addTrack(TrackType.IndexTrack);\n  widget.setDepthLimits(0, 75);\n  const plot = new Plot({\n    \"canvaselement\": canvas,\n    \"root\": widget\n  });\n  const gradEditor = new LogGradEditor({\n    \"layer\": widget.getTrackManipulatorLayer(),\n    \"handlestyles\": {\n      \"inactivelinestyle\": \"blue\"\n    }\n  }).setEnabled(true);\n  widget.setCss(`\n        .Handle:hover {\n            size: 12;\n        }\n    `);\n  widget.getToolByName(\"pick\").on(SelectionEvents.onSelectionEnd, (evt, selector, args) => {\n    const selection = args.getSelection().filter((n) => n instanceof LogGradVisual);\n    gradEditor.setShape(selection[0]);\n  });\n  const crossHair = widget.getToolByName(\"cross-hair\");\n  crossHair.setProperties({\n    \"west\": mergeObjects(CROSSHAIR_LABEL, {\n      \"alignment\": AnchorType.LeftBottom,\n      \"offset\": {\n        \"left\": 6,\n        \"bottom\": 8\n      }\n    })\n  });\n  const crossHairIndex = crossHair.getParentTool().getToolIndex(crossHair);\n  crossHair.getParentTool().insert(crossHairIndex, gradEditor);\n  widget.setHeaderHeight(\"auto\").fitToHeight().fitToWidth();\n  return plot;\n}\nexport { createScene };\n\ncreateScene(document.querySelector('[ref=\"plot\"]'));\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/AdditionalFunctionality/LogGradFunction/logGradFunction?section=LogGradVisual&extract=true","width":"100%","height":"443.5px","style":{"border":"none"}},"children":[]}]},"headings":[{"value":"Log Grad Function","id":"log-grad-function","depth":1}],"frontmatter":{"title":"Log Grad Function","seo":{"title":"Log Grad Function"}},"lastModified":"2026-02-11T19:54:32.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/solutions/geotoolkit/tutorials/well-log/additional-functionality/log-grad-function","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}