Skip to content

feat: add fault-domain-boundary - #112

Merged
lachlangrose merged 8 commits into
mainfrom
feature/fault-domain-boundary
Aug 24, 2026
Merged

feat: add fault-domain-boundary #112
lachlangrose merged 8 commits into
mainfrom
feature/fault-domain-boundary

Conversation

@lachlangrose

Copy link
Copy Markdown
Member

Adds a fault surface as an unconformity between two groups.

lachlangrose and others added 8 commits August 20, 2026 14:30
…ic columns

Guards against the swap fixed in 814be12: model_manager.py's per-unit
training value and LoopStructural's get_isovalues() must agree on
which direction values increase, or extracted isosurfaces get labelled
with the wrong unit while keeping correct geometry.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Lets a stratigraphic-column unconformity be linked to an existing fault
instead of a flat isovalue surface, so the fault's own (non-displacing)
geometry splits the model into two domains -- built via LoopStructural's
create_and_add_domain_fault, reusing the same trace data already ingested
for the fault.

- Stratigraphic column UI gains a "fault" boundary type with a fault
  picker; faults used this way are excluded from the fault topology's
  FAULTED/ABUTTING and fault-stratigraphy tables, since those assume a
  displacement-modelled fault.
- The fault's trace is automatically extended to the model's bounding box
  edges along its own trend, and given synthetic strike/dip orientation
  constraints, so the interpolated surface spans and properly varies
  across the whole domain rather than only being reliable near the
  digitised trace.
- A domain-boundary fault is skipped by the ordinary displacement-fault
  build loop, and any region a later unconformity incorrectly attaches to
  it is stripped after each build (defensive; the root cause is fixed
  upstream in LoopStructural core separately).
- Fixes a project-load ordering bug where the model CRS was restored
  after the layers that get reprojected against it, silently skipping
  reprojection for any layer already in the project's own CRS.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… follow-ups

Several fixes to make domain-fault-bounded stratigraphic columns build and
display correctly:

- update_foliation_features now trains each unit's basal-contact data at
  its own max() (the boundary with the next-older unit, i.e. its true
  base) instead of min() (the boundary with the next-younger unit, i.e.
  its top). Basal contacts represent a unit's base, so training at min()
  anchored every unit's own data to the wrong boundary -- confirmed on a
  live project where units evaluated into their next-younger neighbour's
  bracket instead of their own, and a basement unit with no contact data
  of its own never appeared in the model at all.
- Unit thickness now accumulates unconditionally while building that
  training data, so an undigitised placeholder unit no longer shifts
  every later unit's value by its own thickness.
- Use each fault trace point's own local tangent (rather than one global
  best-fit line) when extending a domain-boundary fault to the model's
  bounding box and deriving its orientation constraints, so a curved
  trace doesn't get flattened into the wrong extrapolation.
- Recompute stratigraphic unit value ranges after restoring a column from
  a saved project (both initial load and reload), matching what a fresh
  column already gets -- otherwise every restored unit kept the default
  (0, inf) range and couldn't be told apart from its neighbours.
- Show the generic details panel for a domain-fault feature instead of an
  empty widget.
- Skip an isosurface with no geometry when adding stratigraphic surfaces
  to the 3D viewer instead of crashing, since an undigitised unit can
  legitimately have no constrained geometry anywhere in the model.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
update_foliation_features re-reversed group.units, which get_groups()
already returns in the order get_isovalues() walks, so every basal
contact was trained with the wrong scalar value.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@lachlangrose
lachlangrose merged commit c7d8c42 into main Aug 24, 2026
4 checks passed
@lachlangrose
lachlangrose deleted the feature/fault-domain-boundary branch August 24, 2026 06:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant