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

  1. Open the importer.

    Data panel → Add data → Import drillhole CSVs (it opens by itself on an empty workspace).

  2. Pick your files.

    Collar and Survey are required; Assay and Lithology are optional and can be added later.

  3. 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.

  4. 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.

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:

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.

  1. 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.

  2. Hole names match regardless of capitalisation.

    ddh-40 finds DDH-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.

  3. 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.

  4. Applying rebuilds the models.

    The merged data recolours immediately. Your styling, bins, filters, saved views and story beats are untouched.

Undo A snapshot is taken immediately before the merge, and an Undo appears in the Data panel afterwards. It lasts for the session. If the snapshot could not be written the Undo is not offered at all — it never promises a restore it cannot perform.
Add or update never deletes If a hole is no longer in your collar file it stays in the project. To remove it, use Replace.

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Opening a highlights project on an older build A project containing highlight intervals is saved in a newer file format and older versions of ES3D will refuse to open it, with a message saying so. Projects without them are unaffected and open anywhere, as before.
Round-tripping our own export Collars (CSV) on the Drillholes layer writes a file you can edit in Excel and feed straight back through Replace the collar table. Its # 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.

KindFormats
Vector GISGeoJSON (.geojson/.json), KML/KMZ, shapefile (.shp + sidecars, or zipped), MapInfo TAB, DXF linework, CSV point samples
Rasters & gridsGeoTIFF (DEM, geophysics grid or orthophoto), Geosoft GRD (+ .gi), BIL/BIP/BSQ (+ .hdr), PNG/JPEG imagery
Meshes & modelsDXF (TIN terrain / 3D mesh / contours), OBJ, PLY, GLB/glTF, OMF (Open Mining Format), GOCAD TSurf (.ts), legacy ASCII VTK, Leapfrog mesh (.msh)
Block models & geophysicsBlock-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

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:

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

Four different cuts — don't mix them up Clip box (Data rail) is a permanent prune. Slice (Viewer card) is a reversible viewing band. The Slice envelope on the Viewer card cuts a slab through everything. Area of interest (Data rail) crops imports in 2D. The app repeats this distinction where each lives.
ES3D Manual · updated 13 August 2026 Open ES3D What’s new Terms