A stacked track serves as a container for all kinds of geotoolkit tracks and visuals. It can be added to the geotoolkit/welllog/widgets/WellLogWidget like any other track using addTrack().
This example shows how to create a geotoolkit/welllog/StackedTrack. An instance of geotoolkit/welllog/TrackFactory is used to create tracks. Curves are added to these tracks and then inserted into the Stacked Track. The header is automatically generated for all the curves in the track. The orientation can also be changed as shown in the example below.
import { Plot } from "@int/geotoolkit/plot/Plot.ts";
import { Node } from "@int/geotoolkit/scene/Node.ts";
import { LogTrack } from "@int/geotoolkit/welllog/LogTrack.ts";
import { LogAbstractVisual } from "@int/geotoolkit/welllog/LogAbstractVisual.ts";
import { Orientation } from "@int/geotoolkit/util/Orientation.ts";
import { LogAxis } from "@int/geotoolkit/welllog/LogAxis.ts";
import { TrackFactory } from "@int/geotoolkit/welllog/TrackFactory.ts";
import { StackedTrack } from "@int/geotoolkit/welllog/StackedTrack.ts";
import { TrackType } from "@int/geotoolkit/welllog/TrackType.ts";
import { HeaderType } from "@int/geotoolkit/welllog/header/LogAxisVisualHeader.ts";
import { createCurve } from "/src/code/WellLog/utils/curveData.ts";
import { createWellLogWidget } from "/src/code/WellLog/utils/common.ts";
function createScene(canvas) {
const widget = createWellLogWidget().setAxisHeaderType(HeaderType.Simple);
const headerProvider = widget.getHeaderContainer().getHeaderProvider();
const axisHeader = headerProvider.getHeaderProvider(LogAxis.getClassName()).clone();
axisHeader.setFormatHeaderHandler((sender, axis) => {
const track = axis.getTrack();
const visibleHeight = Math.round(track.getVisibleModelLimits().getHeight() * 100) / 100;
const unitInfo = track.getUnitInfo();
return "Depth<br><br>Visible<br>" + visibleHeight + (unitInfo ? "<br>(" + unitInfo.getIndexUnit().getSymbol() + ")" : "");
});
headerProvider.registerHeaderProvider(LogAxis.getClassName(), axisHeader);
widget.addTrack(TrackType.IndexTrack);
const factory = TrackFactory.getInstance();
const stackedTrack = factory.createTrack(TrackType.StackedTrack, {
"width": 450
}).addChild([
createCurve(4500, 4, "CALI", "#2196f3"),
createCurve(4500, 4, "RILM", "#fdd835")
]);
stackedTrack.addTrack([
factory.createTrack(TrackType.LinearTrack, {
"width": 30,
"border": {
"visible": true
}
}).addChild([
createCurve(4500, 10, "GR", "#7cb342"),
createCurve(4500, 10, "DLT", "#212121")
]),
factory.createTrack(TrackType.LinearTrack, {
"width": 50,
"border": {
"visible": true
}
}).addChild([
createCurve(4500, 10, "CALI", "#ef6c00")
])
]);
const nestedStackedTrack = factory.createTrack(TrackType.StackedTrack, {
"width": 100
}).addChild([
createCurve(4500, 4, "CALI", "#2196f3")
]);
nestedStackedTrack.addTrack([
factory.createTrack(TrackType.LinearTrack, {
"width": 30,
"border": {
"visible": true
}
}).addChild([
createCurve(4500, 10, "GR", "#7cb342")
]),
factory.createTrack(TrackType.LinearTrack, {
"width": 50,
"border": {
"visible": true
}
}).addChild([
createCurve(4500, 10, "DLT", "#212121")
])
]);
widget.addTrack(stackedTrack);
widget.addTrack(TrackType.IndexTrack);
stackedTrack.addTrack(nestedStackedTrack);
widget.setHeaderHeight("auto");
return {
plot: new Plot({
"canvaselement": canvas,
"root": widget
}),
widget
};
}
function changeOrientation(widget) {
if (widget.getOrientation() === Orientation.Vertical) {
widget.setOrientation(Orientation.Horizontal);
} else {
widget.setOrientation(Orientation.Vertical);
}
}
function addCurve(widget) {
const tracks = widget.getSelectedTracks();
const track = tracks.length === 2 ? tracks[1] : widget.getTrackContainer().getChildren().toArray().find((track2) => track2 instanceof StackedTrack);
if (track == null) {
return;
}
const mnemonics = ["CALI", "DLT", "GR", "RILD", "RHOB", "RILM", "RLL8", "SP"];
const curve = mnemonics[Math.floor(Math.random() * mnemonics.length)];
const r = Math.random() * 255 >> 0;
const g = Math.random() * 255 >> 0;
const b = Math.random() * 255 >> 0;
track.addChild([
createCurve(4500, 10, curve, "rgb(" + r + "," + g + "," + b + ")")
]);
}
function addTrack(widget) {
const stackedTrack = widget.getTrackContainer().getChildren().toArray().find((track) => track instanceof StackedTrack);
if (stackedTrack == null)
return;
stackedTrack.addTrack(
TrackFactory.getInstance().createTrack(TrackType.LinearTrack, {
"width": 50,
"border": {
"visible": true
}
})
);
}
function deleteSelection(widget) {
const selection = widget.getToolByName("pick").getSelection();
let logVisualDeleted = false;
for (let i = selection.length - 1; i >= 0; i--) {
const node = selection[i];
if (node instanceof LogAbstractVisual && node.getParent() != null) {
node.getParent().removeChild(node);
logVisualDeleted = true;
}
if (logVisualDeleted === false && node instanceof LogTrack) {
const stackedTrack = Node.findParent(node, StackedTrack);
if (stackedTrack != null) {
stackedTrack.removeTrack(node);
}
return;
}
}
}
export { addCurve, addTrack, changeOrientation, createScene, deleteSelection };
createScene(document.querySelector('[ref="plot"]'));