Commit Graph
19291 Commits
Author SHA1 Message Date
Kristian Bendiksen 5ee62c61e1 #14128 Use KD-tree (nanoflann) for fault distance nearest-face search
computeFaultDistances faked a nearest-point query with cvf::BoundingBoxTree,
which only supports box overlap: it grew a cell-sized box until it overlapped a
fault face. For cells far from any fault this did many full tree traversals and
then brute-forced the distance to a large, over-collected candidate set, and the
answer was only approximate. This was slow on grids with ~10 million cells.

The metric is the distance from each cell center to the nearest fault face
center, which is exactly a nearest-point search. Replace the bounding-box tree
and the grow-the-box loop with a nanoflann KD-tree built over the fault face
centers and a single nearest-neighbor query per active cell. A zero-copy adaptor
reads the existing std::vector<cvf::Vec3d> directly. The OpenMP loop is retained
since nanoflann queries are read-only. The result is O(F log F) build plus
O(N log F) queries, the full grid-node array copy is gone, and distances are now
exact rather than approximate.

Add nanoflann as a vcpkg dependency, wired in like Clipper2 as an imported
target.

Refs: https://github.com/OPM/ResInsight/issues/14128
2026-06-08 21:39:08 +02:00
Magne Sjaastad 5dae9a0a19 #14104 Fix property dialogs opening collapsed on multi-monitor setups
The export property dialogs that rely solely on sizeHint() could open collapsed when shown on a screen whose DPI differs from the screen they were built on. Recompute the layout on first show, after the dialog is associated with its destination screen, by calling adjustSize() in showEvent when no stored size is restored. Also give RiuPropertyViewTabWidget a minimum size floor so the inner scroll area's artificially small minimum width cannot collapse the dialog.
2026-06-08 16:32:36 +02:00
Magne Sjaastad 1989f93440 #14104 Store dialog size as plain width/height instead of binary geometry
Replace the binary QWidget::saveGeometry()/restoreGeometry() encoding used by PdmUiPropertyViewDialog and RiuPropertyViewTabWidget with plain integer width and height values in QSettings, restored with resize(). The stored values are human-readable and not tied to Qt internal geometry-stream version. Only the size is persisted; the window position is left to the window manager to avoid restoring dialogs off-screen or on a disconnected monitor.
2026-06-08 16:32:36 +02:00
Magne Sjaastad 59af9f51e9 #14153 Guard against empty well path geometry in MSW cell segment generation 2026-06-08 16:16:40 +02:00
Magne Sjaastad a1c4b06237 #14150 Fix crash in replaceTemplateTextWithValues with data-derived values
The template name resolution built a regular expression per key and used
QString::replace(QRegularExpression, value) to insert the value. When a value
inserted by one key contained an invalid UTF-16 sequence (e.g. a lone
surrogate from a data-derived case or well name), a subsequent key's global
match ran the regex engine over the malformed subject, causing an
out-of-bounds read and a segmentation fault inside PCRE2.

Replace the regex based substitution with a literal indexOf/replace loop that
preserves the existing word-boundary behavior, so values are never fed through
the regex engine. Empty keys are skipped.
2026-06-08 16:02:02 +02:00
Magne Sjaastad 25c96f4f31 #14140 Eclipse: guard against out-of-range keyword occurrence crash
ecl_file_iget_named_kw() performs an unchecked vector access and crashes with SIGSEGV when the requested keyword occurrence does not exist in the active file view. Bounds-check the occurrence against ecl_file_get_num_named_kw() in both keywordData() overloads before calling it, and check the previously ignored return value of ecl_file_select_block() in results() so a stale active view is not queried.
2026-06-08 15:55:55 +02:00
Magne Sjaastad 668b844051 #14144 Guard against buffer overflow when reading corrupt well data records
A truncated or corrupt restart file could provide a Fortran record-length header larger than the destination buffer, causing fortio_fread_record to fread past the heap allocation and crash. Bound each record read to the remaining buffer capacity and treat an oversized record as a read failure, which propagates up as a normal failed read instead of a segfault.
2026-06-08 15:54:52 +02:00
Magne Sjaastad 96eaa2cff3 #14146 Guard against degenerate viewport in scale legend tick generation. A tiny viewport yields a zero tick count, and a zero domain range along the active axis combined with the division produced a non-finite step size that triggered an assert/abort in TickMarkGenerator. Skip the legend update for these degenerate cases. 2026-06-08 15:54:05 +02:00
Magne Sjaastad 9a901d1cac #14155 Fix crash in well allocation plot from mismatched iterators
RimCase::timeStepDates() returns std::vector<QDateTime> by value, so
calling cbegin() and cend() in separate invocations produced iterators
into two different temporary vectors. Passing these mismatched iterators
to std::find is undefined behavior and walked off freed memory, crashing
in setValidTimeStepRangeForCase().

Snapshot timeStepDates() into a single local vector and use its
iterators. The same pattern was fixed in RimWellConnectivityTable.
2026-06-08 15:53:36 +02:00
Magne Sjaastad 8858d185bd #14007 Contour Map: reset projection for all result types on case reload
Reloading an Eclipse grid file destroys and recreates RigEclipseCaseData and its RigCaseCellResultsData. The contour map projection caches raw pointers to this case data in updateGridInformation() and only refreshes them when the projection is rebuilt. Previously the projection was reset on reload only when a GENERATED result was selected, so for any other result type the next scheduled redraw dereferenced the freed RigCaseCellResultsData in generateResults, crashing in hasResultEntry. Reset the grid mapping for all contour map views on reload so fresh case data pointers are captured.
2026-06-08 15:52:49 +02:00
Kristian Bendiksen 0eb1c74a90 #14148 Combined Filter: add delete context menu item
The combined filter node had no Delete entry in its right-click menu. The generic RicDeleteItemFeature only enables when isDeletable() is true, which defaults to false; every other cell filter opts in via setDeletable(true) in its constructor, but RimCombinedFilter omitted it. Add the call so the Delete item is offered, and assert it in the unit test.
2026-06-08 15:52:33 +02:00
Kristian Bendiksen 1376407486 Fix crash when creating a view for a case whose grid file fails to load
RimEclipseView::onLoadDataAndUpdate() can be called again after a failed grid
load has cleared the view's eclipse case (RicNewViewFeature calls
loadDataAndUpdate once more after the view is added). On that second call the
open guard is skipped because eclipseCase() is already null, and the method then
dereferences eclipseCase() directly via dataFilterCollection(), crashing with a
null this pointer.

Return early when eclipseCase() is null after the open block, since there is
nothing to load without a case.
2026-06-08 15:35:31 +02:00
Kristian Bendiksen 5e2156fca1 #14127 Add static Completion Type result for grid-only cases
The Completion Type result was registered only as a dynamic result, which
requires simulation time steps. Loading only grid geometry (e.g. a ROFF grid)
therefore made the result unavailable, since there are no time steps to compute
it for.

Register and compute a STATIC_NATIVE variant of Completion Type in addition to
the existing DYNAMIC_NATIVE one, computed as a single time-step-independent
frame. The shared per-frame computation is factored out of
computeCompletionTypeForTimeStep so both variants reuse it. The virtual
perforation transmissibilities already handle the no-restart case by clamping to
a single frame, so the static result can be computed at calc time step 0.

The legend/category predicates and the completion-type result clearing are
broadened to recognise the static variant so it renders with the same discrete
named-category legend as the dynamic one.
2026-06-08 15:35:31 +02:00
dependabot[bot] 48de332bfb Bump astral-sh/setup-uv from 8.1.0 to 8.2.0
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 8.1.0 to 8.2.0.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/08807647e7069bb48b6ef5acd8ec9567f424441b...fac544c07dec837d0ccb6301d7b5580bf5edae39)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 8.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-08 13:03:24 +02:00
Magne Sjaastad 091ae0d810 Plot Window: remove Import Grid Model action from the Standard toolbar 2026-06-08 10:44:16 +02:00
Magne Sjaastad cd59e2a181 #14138 Fix crash when picking a cell with a combined MULT result
RigCombMultResultAccessor::cellFaceScalar called oppositeFace() with the
face passed from the picked selection. A plain cell pick leaves the face
as NO_FACE, which has no opposite and tripped CVF_ASSERT(false) in
oppositeFace, crashing the application.

Guard against a non-directional face and return 1.0, consistent with the
no-change-in-MULT-factor convention already used in nativeMultScalar.
2026-06-08 10:18:41 +02:00
Kristian Bendiksen 2a158dce58 #14121 Well Path: guard remaining null wellPathGeometry() dereferences
A file-based well path whose source file is missing has a null wellPathGeometry(). Add null checks at the remaining call sites that dereferenced it without one, so operations on such a well path no longer crash:

- RimWellPathGroup: skip geometry merging for a child with no geometry (grouping runs on import and project load).
- RimWellPathFracture::computeFractureDirectionNormal: return undefined when geometry is missing.
- RivWellPathPartMgr: extend the existing well path null checks to also require geometry in the attribute, well measurement, and valve append paths.
- RimCompletionCellIntersectionCalc, RicExportLgrFeature, RicCreateMultipleWellPathLaterals, RigLasFileExporter, RiuWellPathComponentPlotItem: guard the geometry before use.

Sites that were already guarded or only reachable through guarded paths were left unchanged.
2026-06-08 08:46:40 +02:00
Kristian Bendiksen 253d57f1a5 #14121 Well Path: prevent crash when exporting completions for a non-existing well path
When a project references an RMS well path file that no longer exists, the well path geometry is null. The MSW completion export validated the eclipse case, well path, and MSW parameters but not the geometry, so generateCellSegments asserted and crashed when triggering Export Completion Data for Visible Well Paths.

Guard the single MSW export dispatcher extractSingleWellMswData with a well path geometry null check that returns an error, protecting all export callers. Harden generateCellSegments to return empty instead of asserting on null geometry.

Also log a warning on the interactive well path import path when a file cannot be read, matching the existing project-load behavior.

Fixes #14121.
2026-06-08 08:46:40 +02:00
Magne Sjaastad b20fcd5138 #11802 Suppress harmless Qt6 invalid-primaries QColorSpace warning
Install a Qt message handler at startup that filters out the cosmetic Qt6
warning "QColorSpace attempted constructed from invalid primaries" seen on
some Linux platforms (e.g. RHEL8). The warning originates in Qt6 when it
validates an empty, all-zero QColorSpacePrimaries and has no functional
impact. All other messages are forwarded to the previous handler unchanged.
2026-06-07 16:29:19 +02:00
Magne Sjaastad 133bb4fa2b Update version to 2026.06.0-RC_1 2026-06-05 17:21:44 +02:00
Magne Sjaastad 98ea83146a #14122 Allow tree selection editor to grow only when it is the last row
The tree selection editor can grow to a large height, which is useful when it is the last field editor in the property dialog. When other field editors are located below, the heightHint is now used as the maximum height instead. The form layout tracks whether an editor occupies the bottom-most row of the form and passes this to the editor. In the Analysis Plot, the time step selection is constrained to its height hint because other input fields are located below it.
2026-06-05 16:28:22 +02:00
Kristian Bendiksen cbae501a13 #14111 Preserve time-of-day in exported DATES keyword
The Event Timeline stores event timestamps with full time-of-day precision, but the exported SCHEDULE deck only emitted DAY/MONTH/YEAR in the DATES keyword, dropping any sub-day precision the user had set.

Emit the optional TIME field (HH:MM:SS[.SSS]) in datesKeyword() whenever the timestamp is non-midnight, formatting with millisecond precision when present. Date-only events keep their previous DAY/MONTH/YEAR-only output. The first-date comment in the schedule generator mirrors the same time so it stays consistent with the keyword.
2026-06-05 16:21:01 +02:00
Kristian Bendiksen 8b65c313f8 #14109 python: Add ACTNUM property to grid created with create_corner_point_grid
A grid created via the create_corner_point_grid API populated the internal
active cell info but never created an ACTNUM result property, so the grid did
not expose ACTNUM the way a grid loaded from an Eclipse file does. Since the
corner point case has no reader interface, the data cannot be loaded lazily and
is now materialized as a STATIC_NATIVE result sized per active cell, mirroring
native Eclipse ACTNUM.
2026-06-05 16:20:45 +02:00
Magne Sjaastad c6591eac95 Summary plot: select plot before building the right-click context menu
Select the summary plot as the current item before any menu commands are
created, so every command in the context menu operates on that plot. This is
the root fix for plot-level commands (New Analysis Plot, correlation plots,
etc.) that derive their enablement from the selected plot: previously the
selection could be left on an ensemble realization's summary case, disabling
them.

Because the plot is now selected, the Show Plot Data / Edit Plot / Split / Delete
commands resolve the plot from the selection, so passing it as user data is no
longer needed. The RicShowPlotDataCtxFeature and RicEditSummaryPlotCtxFeature
subclasses existed only to force isCommandEnabled to true for the context menu;
they are now obsolete and removed, and the menu uses the base RicShowPlotData
and RicEditSummaryPlot features directly.

Also highlight the curve under the cursor before showing the menu, giving the
same visual feedback as a left-click. Separate highlighting from selection:
extract the visual-only part of selectClosestPlotItem into
applyHighlightForClosestItem, shared by selectClosestPlotItem (left-click:
highlight + select) and the new highlightClosestPlotItem (highlight only). The
context menu uses the highlight-only path, so it does not change the selection.
Add highlightClosestPlotItemAtPosition that takes widget coordinates and
converts them to canvas coordinates internally, so the caller does not depend
on qwt headers.
2026-06-05 16:10:49 +02:00
Magne Sjaastad 8606fa002e #14104 Remember user-defined size of property and preferences dialogs
Persist the geometry of PdmUiPropertyViewDialog and RiuPropertyViewTabWidget to the application settings on close and restore it on the next show. Restoring is done in showEvent rather than the constructor so it is applied reliably for a modal dialog. The settings key includes the bound object class keyword so distinct dialogs that share a window title do not collide.

This behaviour is gated behind a new "Remember Dialog Size" experimental feature, disabled by default. PdmUiPropertyViewDialog cannot access RiaPreferencesSystem, so the application pushes the current setting via the static enableGeometryPersistence(), following the existing pattern used for class-name display. RiuPropertyViewTabWidget queries the feature directly.
2026-06-04 21:06:38 +02:00
Magne Sjaastad 9c857288da #14104 Add minimum size floor to property view dialog
Override sizeHint() and minimumSizeHint() in PdmUiPropertyViewDialog so the dialog cannot open collapsed. The inner scroll area reports an artificially small minimum size hint that some window managers honor literally, shrinking the dialog to an unusable size (issue #14104). The floor is capped by the content's preferred size so intentionally small dialogs are not enlarged.
2026-06-04 21:06:38 +02:00
Magne Sjaastad af1cdbd546 #14118 Fix crash in loadAllGrids when grid file fails to load
ecl_grid_alloc can return null for a corrupt or truncated grid file.
When a valid INIT file was present, loadAllGrids dereferenced the null
grid pointer via ecl_grid_dual_grid/ecl_grid_get_global_size before
returning, causing a segfault.

Guard the init-file active cell logic on a non-null grid so the function
returns null cleanly, letting the existing null check in open() report
the error gracefully.
2026-06-04 16:07:44 +02:00
Magne Sjaastad 7d977ac522 #14116 GeoMech: fix out-of-bounds crash mapping step index to time step
stepListIndexToTimeStepAndDataFrameIndex only guarded against negative indices, relying on a CVF_ASSERT for the upper bound. That assert is compiled out in release builds, so when a GeoMech case has no steps loaded (empty m_stepList) the clamped current time step of 0 caused an out-of-bounds read of m_stepList[0]. Extend the early-return guard to also cover indices past the end, returning the existing (stepIndex, -1) sentinel.
2026-06-04 16:07:27 +02:00
Magne Sjaastad 99fdcc9a9a AppFwk: make PdmUiTreeOrdering::add null-tolerant and clean up containsField
The add() overloads aborted via CAF_ASSERT when passed a null field or
object, forcing every call site that adds an optional child to pre-guard.
Adding an optional node is inherently an "add it if it exists" operation,
so make both overloads a no-op on null instead: the field overload returns,
and the object overload returns nullptr. This removes a class of latent
release crashes and the need for repetitive null checks at call sites.

Also remove a redundant dynamic_cast (and its "// What ???" comment) in
containsField, since child() already returns PdmUiTreeOrdering*.
2026-06-04 16:07:12 +02:00
Magne Sjaastad 85f5848bde #14112 Contour map: guard remaining legend config dereferences
Guard the remaining unguarded legendConfig() uses so a null legend config
cannot crash: both updateLegend() implementations (eclipse and statistics
projections) now capture the pointer and return early when null, and the
statistics view tree ordering skips a null legend config.
2026-06-04 16:06:50 +02:00
Magne Sjaastad ea719c41b3 #14112 Contour map: guard null legend config in defineUiOrdering
Selecting a contour map projection in the tree could crash when the
associated legend config was null. RimContourMapProjection::defineUiOrdering
called legendConfig()->uiOrdering() unguarded. Because PdmUiObjectHandle::uiOrdering
is non-virtual, the call entered with a null this and then crashed on the
virtual defineUiOrdering dispatch.

Guard the legendConfig() dereference, matching the existing null checks
elsewhere in the file. Apply the same guard to RimEclipseCellColors::defineUiOrdering.
2026-06-04 16:06:50 +02:00
Magne Sjaastad 0275191b36 CI: remove redundant Get CMake and Ninja step from AppFwkUnitTest 2026-06-04 14:35:16 +02:00
Kristian Bendiksen 421b35121a #14105 Tornado plots: sort realizations numerically (natural order)
Use a numeric-aware QCollator in RiuGroupedBarChartBuilder::BarEntry::operator< so that tick and legend texts containing numbers (e.g. realization-2 vs realization-10) sort in natural numerical order instead of lexicographically.

Fixes #14105
2026-06-04 10:40:43 +02:00
Kristian Bendiksen 80e7d64332 #14099 Move export dock layout action back to developer features
Revert 380b471. The 'Export Layout to Clipboard' window menu action is a developer-only utility, not an experimental feature. Gate it behind RiaApplication::enableDevelopmentFeatures() again and drop the 'export-dock-layout' experimental feature registration.
2026-06-03 14:04:27 +02:00
Magne Sjaastad b81929e045 CI: modernize runners and bump setup-uv to Node.js 24 2026-06-02 22:59:50 +02:00
Magne Sjaastad 94feef8c46 CI: install Python packages no newer than one week via uv
Plain pip has no time-based cutoff, so route the workflow's package
installs through uv and set UV_EXCLUDE_NEWER to refuse releases
published within the last week as supply-chain hardening. Mirror the
policy in the rips pyproject for local uv installs.
2026-06-02 12:53:38 +02:00
kriben afb0e8726a Fixes by clang-format 2026-06-01 17:40:21 +02:00
Kristian Bendiksen dae3fc7cfd Data Filters: add "go to" button. 2026-06-01 16:41:21 +02:00
Kristian Bendiksen e37b20afb1 #14074 CellFilters: Hide empty case Data Filters node, add Filters submenu
The case-level Data Filters node (RimDataFilterCollection) was always shown under
RimEclipseCase, cluttering the tree when empty. Gate it in
RimEclipseCase::defineUiTreeOrdering on a new shouldBeVisibleInTree() check, and
refresh the owner case from onItemsChanged/onChildDeleted so the node appears and
disappears as the collection crosses the empty boundary.

Because a hidden node cannot be right-clicked to create the first filter, add a
RimEclipseCase::appendMenuItems override that exposes the filter-creation
commands as a Filters submenu on the case node. A shared
RicCellFilterFeatureTools::selectedDataFilterCollection() resolves a selected
RimEclipseCase to its data filter collection, so the cell, property and combined
filter create features target the case-level collection.
2026-06-01 16:41:21 +02:00
Kristian Bendiksen 78a6d0a8e5 #14074 CellFilters: Notify filter facade from all property-filter mutations
The view filter nodes were unified under a read-only RimFilterInViewCollection
facade, and the source collections are now tree-hidden. As a result, the
existing collection->updateConnectedEditors() calls no longer refresh the tree:
the filters are shown under the facade, which only refreshes when a source emits
filtersChanged/wrappersChanged.

Several property-filter mutations changed the child array without emitting that
signal (insertAt/push_back/erase do not auto-fire onChildAdded/onChildDeleted),
so newly created or removed filters did not appear under the Filters node:
property filter insert, new combined filter, add linked filter, undo of a
property-filter creation, and Show Contributing Wells.

Emit the change signal from these paths (via the existing onChildAdded hook, or
filtersChanged on removal) so the single facade handler refreshes the tree. The
cell-filter, paste, property-add and data-filter paths already emit the signal
and are unchanged.
2026-06-01 16:41:21 +02:00
Kristian Bendiksen c1ea8261aa #14081 Move experimental feature selection to its own Preferences tab
Promote the experimental feature checkboxes out of the development-only System tab into a dedicated, always-visible Experimental tab so end users can opt into experimental features without enabling development features.

The m_enabledFeatures field stays owned by RiaPreferencesSystem, so its keyword, value options and legacy-keyword migration are unchanged.
2026-06-01 16:41:00 +02:00
Kristian Bendiksen 054dbdb255 Move oil volume result to experimental features and demote ROFF logs to debug
Gate the derived oil volume cell result behind the new 'oil-volume-result'
experimental feature instead of RiaApplication::enableDevelopmentFeatures().

In the ROFF file reader, drop the enableDevelopmentFeatures() gates around the
grid dimension, timing and array diagnostics and log them at debug level instead,
so the output is available without RESINSIGHT_DEVEL but stays quiet in normal
runs.
2026-06-01 16:41:00 +02:00
Kristian Bendiksen 380b471bb5 Move export dock layout action to experimental features
Gate the 'Export Layout to Clipboard' window menu action behind the experimental
features registry instead of RiaApplication::enableDevelopmentFeatures(). Register
the 'export-dock-layout' feature and drop the now-unused RiaApplication include.
2026-06-01 16:41:00 +02:00
Kristian Bendiksen a0e502f75e Move OSDU well logs and undo/redo view to experimental features
Gate the OSDU well log import menu item and the command undo/redo history view
behind the discoverable experimental features registry instead of
RiaApplication::enableDevelopmentFeatures(), so they can be toggled from
Preferences -> System without setting the RESINSIGHT_DEVEL environment variable.

Register the 'osdu-well-logs' and 'undo-redo-view' features in
RiaExperimentalFeatures and gate the code paths via
RiaPreferencesSystem::isFeatureEnabled().
2026-06-01 16:41:00 +02:00
Kristian Bendiksen 5434873984 #14081 Register experimental features and show them as checkboxes
Replace the free-text experimental-feature keyword box with a discoverable
registry and a checkbox list in Preferences -> System.

Add RiaExperimentalFeatures as a single, discoverable list of available
experimental features (keyword, display name, description). RiaPreferencesSystem
now stores the enabled features in a tree-selection (checkbox) field populated
from this registry, and isFeatureEnabled() checks that selection. The legacy
semicolon-separated keyword string is migrated in initAfterRead(), preserving
existing preference files and the 'enable-all' keyword.
2026-06-01 16:41:00 +02:00
Kristian Bendiksen 19c547cc2e Well Event: Add opt-in column-aligned schedule output
Add an align_columns option to schedule generation. When enabled, each
keyword is serialized with a '--'-prefixed column-header comment and data
rows right-aligned into fixed-width columns, instead of the compact default
form. The default output is unchanged.

A new RimKeywordFactory::deckKeywordToAlignedString introspects the OPM deck
model and renders each item in its own column (consecutive defaults are not
collapsed into 'N*'). The flag is threaded through RicScheduleDataGenerator
and exposed on the GenerateSchedule scriptable method as align_columns in the
Python generate_schedule_text wrapper.
2026-06-01 15:45:03 +02:00
jonjenssen bce29354ea Add nullptr guard when setting well parent. 2026-06-01 14:37:46 +02:00
Magne Sjaastad 8ad0fb7b7e #14045 CI: Limit macOS workflow to workflow_dispatch and schedule triggers 2026-06-01 12:55:22 +02:00
Magne Sjaastad 022d77bef8 macOS: Initial Apple Silicon and x86_64 build support
* Refactor: add MACOSX_BUNDLE option to qt_add_executable in multiple CMakeLists.txt files
* #14045 macOS: Guard std::stacktrace usage and skip ucontext on Apple platforms
* #14045 macOS: Guard std::ispanstream with std::istringstream fallback
* #14045 macOS: Add vcpkg overlay triplets for osx and exclude grpc on osx
* #14045 macOS: CMake macOS build support and openzgy OpenMP-disable patch
* #14045 CI: Add macOS build workflow
* #14045 macOS: Use feature-test macros to detect <stacktrace> and <spanstream>
* #14045 macOS: Make MAX_STIMPLAN_LAYERS constexpr to fix arm64 link error
* #14045 CI: Ship README-macOS.txt with artifact to document Gatekeeper workaround
* #14045 CI: Pin macOS runner to macos-14 and set deployment target to 14.0
* #14045 CI: Move macOS runner to macos-15 and fix README step on configure failure
2026-06-01 12:38:55 +02:00
Kristian Bendiksen 187addb1d0 #13890 Faults: Provide FAULTDIST menu via appendMenuItems() 2026-06-01 11:28:46 +02:00