Manual / Importing data
Importing data
Everything comes in through the left Data panel — or by dropping files anywhere on the canvas. Ambiguous files get one clear question about how to read them; nothing is silently guessed.
Drillhole CSVs
- Open the importer.
Data panel → Add data → Import drillhole CSVs (it opens by itself on an empty workspace).
- Pick your files.
Collar and Survey are required; Assay and Lithology are optional and can be added later.
- Confirm the mapping.
The wizard auto-detects columns offline, with an AI assist for shaky headers (“AI-suggested grouping — you decide” — only header names and redacted per-column statistics leave the browser, never raw cells, and import works fully offline). Override anything, and tick which assay elements to load.
- Read the validation.
The footer reports holes · surveys · intervals and either Valid ✓ or an issue list grouped by code (e.g.
message × 96). Rows that could not be used are counted, never hidden.
Blank and missing assay values
Assay files are full of cells that are not measurements: intervals never sampled, samples
still at the lab, insufficient sample, lost core. The wizard’s
Missing values section lists every blank and every marker word it found
(pending, NS, -, IS, LNR and so
on) with a count, and asks what each one means.
- Not assayed — never sampled, and no result is coming. Blanks and the usual no-sample codes start here. These intervals are hidden, so they do not read as a second attribute painted over your grades.
- Pending — sampled, results not back yet.
pending,awaitingandat labstart here. They are drawn in a neutral grey and counted in the legend (pending · 38 intervals), because “assays pending” is something a reader should see. - Unassigned — the word is left as unreadable text, as before.
Change any meaning before you load. A marker with a meaning no longer counts against its
column, so an element that is mostly pending still imports. When a column is held
back because too many of its cells are an unfamiliar word, the section names it; give that word a
meaning and the column comes back.
After loading, the drillhole layer’s editor has Pending and Not assayed switches, each with its count. Hovering an interval reads pending or not assayed instead of a number. When the results arrive, import the new assay file with Add or update this dataset; the pending intervals of every hole it names are replaced with the measured values.
Adding or updating an existing dataset
Once a project is open, the importer offers Import as. Its options are grouped, because they fall into two families that do quite different things. Everything under Add to the project loads new data alongside what you already have and cannot alter it. Everything under Change … edits the project you loaded first — and only that one, never the separate databases. The group heading names the dataset it is about to change, so you can always see the target before you commit.
The two readings of the same files:
- A separate database — the files become an independent programme with its own styling, for comparing an old campaign against a new one. This is the default, and it leaves everything already loaded untouched. See Drill data.
- Add or update this dataset — new holes join the project, and holes it already has are brought up to date. Choose this for a new batch of assays, a corrected collar file, or the next phase of a programme. It edits data you already have, so it is a deliberate choice rather than the default, and it always shows you what will change before it changes it.
Working with several drillhole databases
There is no limit on how many programmes you can load. Import a second, third or fourth set of files with A separate database each time and each becomes its own entry under Drillhole databases in the Layers panel, with its own trace colour assigned automatically, its own element and colour scale, and its own filters.
One thing about them is worth knowing, because it is not visible on screen: only the first project can be edited in place. The Change … options always target the project you loaded first. To revise a secondary programme, remove it and re-import the corrected files.
When you add or update, supply only the files that changed. Collar and survey stop being required: an assay file on its own is a perfectly good import. Anything you leave empty is left exactly as it was.
- A hole in the file replaces that hole’s rows.
For the files you supplied, a hole named in them has its existing rows for those files replaced outright — so a re-logged hole does not end up with old intervals underneath the new ones. Holes the file does not name are left alone.
- Hole names match regardless of capitalisation.
ddh-40findsDDH-40. Your project keeps its own spelling, and the preview lists any name it matched this way so you can confirm they really are the same hole. If one name in the file could mean two different holes in your project, the import stops and says so rather than guessing. - Read the preview before you apply.
It leads with what is being removed — intervals, collars and element columns — because that is the part worth checking. A file containing only the mineralised runs of 40 holes reads as “40 holes updated” while quietly dropping thousands of barren intervals, and losing those raises your average grade.
- Applying rebuilds the models.
The merged data recolours immediately. Your styling, bins, filters, saved views and story beats are untouched.
Replacing a table
The other three modes — Replace the collar table, Replace the survey table, Replace the assay or lithology table — treat the file you supply as the whole table. Anything it does not contain is removed. This is how you drop holes you have voided, or re-import a shorter assay suite and have the old element columns actually go away.
- Removing a collar does not delete its other rows.
That hole’s survey and assay rows stay in the project and are reported as having no collar. They are not drawn. This is deliberate: a collar file that disagrees with the rest of your database is a discrepancy worth seeing, not something to tidy away silently.
- Replacing intervals is scoped to the kind of file you give it.
An assay file replaces the assay columns and leaves lithology alone; a lithology file the reverse. Supplying both at once is ambiguous, so it is refused rather than guessed.
- Removals need their own confirmation.
When a merge would delete anything, the preview lists it first and the button reads Remove and apply instead of Apply. A file that only adds never shows that button, so it cannot become a habit.
- A file that leaves no collars at all is refused.
Every hole’s geometry hangs off its collar, so that would leave a project that draws nothing while still holding all its data — almost always a mis-mapped hole-id column.
Highlight intervals
Choose Highlight intervals (press-release composites) to import the intercepts you have already published — the “12.5 m @ 3.2 g/t Au” numbers from a news release. Supply them in the Assay row, with hole, from, to and a grade column, exactly like an assay file.
- They are never modelled.
Highlights are drawn as their own layer and are kept out of every statistic. They were composited from your assays, so counting both would count the same metal twice. They also never enter the element picker or the below-detection disclosure.
- You must say how they were selected.
ES3D prints the compositing rule beside the intercepts it calculates itself. An imported interval has no rule of its own, so you enter one — cut-off, minimum length, maximum internal dilution — and it travels with the layer. Without it, a published number would appear in the same visual language as a disclosed intercept while saying nothing about how it was chosen.
- True widths are listed, not drawn.
If you tell us the lengths are true widths, the intervals import but no bars are drawn. Depth along a hole and width across a body are different measurements; drawing one as the other would put a geometry on screen that your numbers do not support.
- They are visibly different, everywhere.
The layer draws in one flat colour outside the assay tube — never on the grade ramp, so it can never be mistaken for modelled data — and its row reads Issuer-supplied. Any still or movie exported while the layer is visible carries a line in the burned-in compliance strip saying how many highlight intervals are shown and that they are issuer-supplied, because a viewer of an exported frame has no other way to know.
- Hole names must match your database.
Releases often name holes differently from the drill database. A composite whose hole id matches nothing is reported as an error rather than importing into an empty layer, and one that falls past the end of hole is an error too — never a warning.
# header lines are skipped on import.Surfaces & GIS files
Use Choose files, the dashed drop strip, or drop straight onto the 3D
canvas. Per-file results appear as ✓ name — message lines. Tick
Drape lines & polygons onto terrain to have 2D linework follow the
ground.
| Kind | Formats |
|---|---|
| Vector GIS | GeoJSON (.geojson/.json), KML/KMZ, shapefile
(.shp + sidecars, or zipped), MapInfo TAB, DXF linework, CSV point samples |
| Rasters & grids | GeoTIFF (DEM, geophysics grid or orthophoto), Geosoft GRD
(+ .gi), BIL/BIP/BSQ (+ .hdr), PNG/JPEG imagery |
| Meshes & models | DXF (TIN terrain / 3D mesh / contours), OBJ, PLY, GLB/glTF,
OMF (Open Mining Format), GOCAD TSurf (.ts), legacy ASCII VTK, Leapfrog mesh
(.msh) |
| Block models & geophysics | Block-model CSV (Leapfrog / Seequent exports), UBC-GIF mesh + model files |
| Other | .es3d project bundles; PDF as a reference image plane
(one page at a time, not a georeferenced layer) |
GeoTIFFs up to 2 GB import directly: files over 250 MB are read in streamed chunks and resampled to the chosen detail level at read time, and the import message says exactly what was read (e.g. read at reduced resolution (30000×20000 source → 2500×1667) — the file on disk is never altered). A file carrying built-in overviews (a Cloud-Optimized GeoTIFF, or anything exported with pyramids) imports far faster still — the appropriate overview level is read instead of the full-resolution pixels, and the message names it (read from the file's ~8× overview). Clipping to an area of interest before importing still gives the best resolution over the ground you care about.
The intent dialog
When a file could mean more than one thing, one dialog asks the reading — a GeoTIFF as elevation DEM / geophysics grid / orthophoto; a DXF as terrain / contour lines / 3D mesh / linework; a CSV as point samples / block model — along with the coordinate system (EPSG), detail level, and what to drape onto (Auto — best spatial match). A confident classification arrives badged recommended, and an auto-routed CSV always offers the escape hatch Read as a block model instead / Read as point samples instead.
Specialised importers
- Block model — centroid + size columns, attribute pick, colour-by, what to keep, and a preview. Any file size; see below.
- Geophysics (UBC-GIF) — mesh (
.msh/.mesh) + model (.mod/.den/.sus/.con/.dat); display name, no-data value, colour-by. A Leapfrog.mshdropped here is detected and pointed back to the main importer. - Soil geochemistry — easting/northing + element CSV with colormap, band count, break mode and contour lines.
- Planned holes — a CSV with azimuth, dip and planned depth; tolerant auto-detect, no mapper. Planned holes always render visibly distinct from drilled ones.
Large and sub-blocked block models
Sub-blocked models (octree or fully sub-blocked, as Leapfrog exports them) load as they are. Every row carries its own block size, and every block is drawn at that size, so the fine sub-blocks along a domain boundary stay where the model put them. Nothing is merged or averaged.
A block-model CSV can be many gigabytes. The importer never opens it whole. The wizard previews a sample drawn from the whole length of the file, and the load reads every row in the background while the view stays usable. The busy card shows how far it has read.
A browser tab holds about four million blocks, so the wizard’s Keep section decides what comes in:
- Leave out blocks with no value. The wizard proposes the file’s
no-data value (Leapfrog writes
-99). You can change or clear it. Air and unestimated blocks usually account for most of a file. - Only blocks at or above a cut-off. Optional. The line beneath gives an estimate of how many blocks will load and how many are left out, and why.
Above about three million blocks the wizard warns that the view may turn slowly. The limit is four million. An estimate from a sample can be out by a tenth or so, so the wizard only refuses well over the limit. Near it, the load counts exactly and stops as soon as the limit is passed, saying how far through the file it got, with nothing loaded. After loading, the layer’s description records exactly what was kept and what was left out (2,859,755 blocks · au_ppm ≥ 0.5 only · left out of 91,101,948 rows: …). A deck built on part of a model always says so.
Choose Leapfrog’s header file (name.csv.txt) together with the CSV. ES3D
reads the model’s orientation from it. A rotated model is refused, because blocks are drawn
square to the grid and a rotated one would appear in the wrong place. Without the header, the
model is taken as not rotated, and the wizard says so.
Coordinate systems
The project grid (Data panel → Scope & frame →
Project grid) shows the origin and holds the
Project CRS (EPSG). Imports with sidecar CRS info
(.prj, .gi) or lat/lon columns are read automatically; anything else can
be assigned in the CRS picker (EPSG code or PROJ string). A layer that disagrees with the project
grid carries a ⚠ CRS badge in the scene tree, and the honesty badge's
coordinate-system check offers a one-click Declare CRS… route.
Scope & frame
- Area of interest — Enable cropping with easting/northing bounds. Crops incoming imports only (3D art formats exempt); a pill reminds you while it is active.
- Clip box — Define clip box drags gold face handles around the volume to keep, then Apply & remove permanently deletes everything outside and rebuilds the block model smaller.
- Reference planes — + Image plane places a textured quad (image or a PDF page) in the scene with size and opacity controls — for historic sections, maps and diagrams.