Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
256 commits
Select commit Hold shift + click to select a range
0122b59
ci: fix formatting of release-please
lachlangrose Jun 17, 2025
1a5e7b7
Merge pull request #2 from Loop3D/main
lachlangrose Jun 17, 2025
90ebef3
Update linter.yml
lachlangrose Jun 17, 2025
ec42a79
Update release-please.yml
lachlangrose Jun 17, 2025
d85b581
fixing syntax
lachlangrose Jun 17, 2025
8ad1c4e
adding release please files
lachlangrose Jun 17, 2025
387086f
Merge pull request #1 from Loop3D/dependabot/github_actions/dawidd6/a…
lachlangrose Jun 17, 2025
6ae8d3f
fix: import typo
lachlangrose Jun 17, 2025
7bf312d
Merge branch 'main' of github.com:Loop3D/plugin_map2loop
lachlangrose Jun 17, 2025
c0bb5f2
template for basal contacts processing tool
lachlangrose Jun 17, 2025
f9878b0
Update linter.yml
lachlangrose Jun 17, 2025
b51f758
disable qgis testing for now
lachlangrose Jun 17, 2025
b3fc47d
Update release-please.yml
lachlangrose Jun 17, 2025
56a20ae
Update release-please.yml
lachlangrose Jun 17, 2025
043ea5c
Merge remote-tracking branch 'origin/processing/basal_contacts' into …
rabii-chaarani Jun 20, 2025
773ef48
feature: Implement StratigraphySorterAlgorithm
rabii-chaarani Jun 23, 2025
e7bb9f6
feature: functions to convert layers to GeoDataFrame and DataFrame
rabii-chaarani Aug 18, 2025
95ba89b
feature: add geodataframe to qgsLayer conversion
rabii-chaarani Aug 18, 2025
f744d83
refactor: update GeoDataFrameToQgsLayer
rabii-chaarani Aug 18, 2025
ea67c2e
fix: GeoDataFrameToQgsLayer to FeatureSink
rabii-chaarani Aug 18, 2025
f11d713
refactor: clean up imports in vectorLayerWrapper.py
rabii-chaarani Aug 18, 2025
d718b96
feature: add basal contacts extraction algorithm
rabii-chaarani Aug 18, 2025
0c7e768
refactor: add imports in sorter.py
rabii-chaarani Aug 18, 2025
aeed68b
feature: implement sampler algorithm
rabii-chaarani Aug 25, 2025
78f1511
feature: add thickness calculator algorithms
rabii-chaarani Aug 25, 2025
4069406
fix: correct return value
rabii-chaarani Aug 25, 2025
f67be33
feature: add support SamplerSpacing
rabii-chaarani Aug 25, 2025
3c46553
fix: update sampler type strings for consistency
rabii-chaarani Aug 25, 2025
7e76267
fix: convert dataframe to qgis layer
rabii-chaarani Aug 26, 2025
c42a4dd
feature: add dataframe to point sink conversion
rabii-chaarani Aug 27, 2025
54a0bc9
fix: add input parameters
rabii-chaarani Aug 27, 2025
df54c1b
refactor: rename to dataframeToQgsLayer
rabii-chaarani Aug 27, 2025
703a89c
refactor: update thickness calculator parameters and processing logic
rabii-chaarani Aug 27, 2025
8bb0c99
update BasalContactsAlgorithm
noellehmcheng Aug 27, 2025
359e45a
Merge branch 'processing/processing_tools' of https://github.com/Loop…
noellehmcheng Aug 27, 2025
fcdf4a2
fix import in vectorLayerWrapper.py
noellehmcheng Aug 28, 2025
7aaa076
rename unused loop idx in vectorLayerWrapper
noellehmcheng Aug 28, 2025
d0d9e77
rename directory to m2l to avoid import conflicts
noellehmcheng Aug 29, 2025
34f3d25
fix linter.yml
noellehmcheng Aug 29, 2025
76df4b2
Merge pull request #12 from Loop3D/processing/processing_tools_basal-…
rabii-chaarani Sep 1, 2025
52ee4ad
Merge branch 'processing/processing_tools' into processing-tools-rename
rabii-chaarani Sep 1, 2025
b72fbf4
fix: add QgsPoint import
rabii-chaarani Sep 1, 2025
04d3937
fix: add QgsPointXY import
rabii-chaarani Sep 1, 2025
ffe7f98
Merge branch 'processing/processing_tools' into processing-tools-rename
rabii-chaarani Sep 1, 2025
bf0ab2d
Merge pull request #14 from Loop3D/processing-tools-rename
rabii-chaarani Sep 1, 2025
d4a1d7d
fix: enforce str type
rabii-chaarani Sep 1, 2025
cf8321e
refactor: handling of string fields
rabii-chaarani Sep 1, 2025
60bd84e
fix: add missing import for wkb_loads
rabii-chaarani Sep 1, 2025
1c72667
refactor: implementation and enforce string dtype
rabii-chaarani Sep 1, 2025
3dd9aea
fix: QGIS string fields are converted to str
rabii-chaarani Sep 1, 2025
86e3f7b
fix: remove type conversion issues
rabii-chaarani Sep 1, 2025
2c37667
fix: simplify string field handling
rabii-chaarani Sep 1, 2025
510d82f
fix: ensure string fields are explicitly converted
rabii-chaarani Sep 1, 2025
c028237
sampler
noellehmcheng Sep 1, 2025
cb1ac9d
Merge branch 'processing-tools-rename' into processing/processing_too…
noellehmcheng Sep 1, 2025
bc99ec9
fix: enhance contact rextraction tool
rabii-chaarani Sep 1, 2025
af2056d
fix: update algorithm imports and registration in provider
rabii-chaarani Sep 1, 2025
546724b
fix: correct parameter types
rabii-chaarani Sep 1, 2025
671fed2
fix: standardize algorithm group ID
rabii-chaarani Sep 1, 2025
8cc49af
fix: add user-defined sorting option
rabii-chaarani Sep 3, 2025
ffeb1bc
input files
noellehmcheng Sep 3, 2025
2f070c9
Merge branch 'processing/processing_tools' into processing/processing…
noellehmcheng Sep 3, 2025
7b11408
fix: change stratigraphic column QgsProcessingParameterFeatureSink de…
noellehmcheng Sep 3, 2025
27d2ee5
feat add formation column mapping and validation for strat column
noellehmcheng Sep 4, 2025
03a6ffc
delete input files
noellehmcheng Sep 4, 2025
e23f023
fix sorter
noellehmcheng Sep 4, 2025
ccd1c93
fix data type of spacing and decimator in sampler
noellehmcheng Sep 4, 2025
26233f0
rename unused loop idx in sampler
noellehmcheng Sep 4, 2025
1709581
add dtm to input
noellehmcheng Sep 6, 2025
2488fab
add validation in sampler
noellehmcheng Sep 6, 2025
38a552a
spacing decimator test
noellehmcheng Sep 8, 2025
9341a8e
refactor sampler tests for cicd compatibility
noellehmcheng Sep 8, 2025
096a13e
update tester.yml workflow for all branches
noellehmcheng Sep 8, 2025
5fa83ad
change image
noellehmcheng Sep 8, 2025
a6c14b2
update testing.txt
noellehmcheng Sep 8, 2025
378f9ae
install map2loop in tester.yml
noellehmcheng Sep 8, 2025
cf91e1f
Merge branch 'processing/processing_tools_sampler_test' into processi…
noellehmcheng Sep 8, 2025
06fc7ec
tester.yml
noellehmcheng Sep 8, 2025
a2b96f6
input file
noellehmcheng Sep 8, 2025
79b28ad
test_basal_contacts
noellehmcheng Sep 8, 2025
82532dc
fix import in test_basal_contacts.py
noellehmcheng Sep 8, 2025
02f9cb9
fix strati_column in test_basal_contacts
noellehmcheng Sep 8, 2025
5cab785
Merge branch 'processing/processing_tools' into processing/processing…
noellehmcheng Sep 10, 2025
91bcc09
add structure and dtm parameters for SorterObservationProjections and…
noellehmcheng Sep 10, 2025
f527e91
Merge branch 'processing/processing_tools' into processing/processing…
noellehmcheng Sep 12, 2025
9273c17
add contact as output layer
noellehmcheng Sep 12, 2025
3576bd7
change contacts_df and relationships_df
noellehmcheng Sep 12, 2025
70fbefc
merge processing/processing_tools_sampler
noellehmcheng Sep 12, 2025
06d4ebc
merge with processing_tools_sampler_test
noellehmcheng Sep 12, 2025
ebb88f0
merge with processing_tools_basal-contacts-v2
noellehmcheng Sep 12, 2025
a471265
Merge branch 'processing/processing_tools_basal-contacts_test' into n…
noellehmcheng Sep 12, 2025
fb873f3
add contact layer in sorter
noellehmcheng Sep 12, 2025
a9092f4
handle dip, dipdir, orientation type for structure in sorter.py
noellehmcheng Sep 15, 2025
cfd09ec
fix syntax in sampler
noellehmcheng Sep 16, 2025
1e28eb7
update basal contact test
noellehmcheng Sep 16, 2025
856cb42
update basal contact test to include contacts layer
noellehmcheng Sep 16, 2025
73b6e22
feat: thickness calculator tool
rabii-chaarani Sep 17, 2025
b483f00
feat: raster and dataframe handling
rabii-chaarani Sep 17, 2025
9ee2ac7
fix clean up process for tests
noellehmcheng Sep 17, 2025
beef36d
fix remove duplicated units_df in sorter
noellehmcheng Sep 18, 2025
81f2670
fix build_input_frames in sorter
noellehmcheng Sep 18, 2025
a3a7082
add contacts and basal contacts data for testing
noellehmcheng Sep 19, 2025
a3fe1de
add validation in sorter
noellehmcheng Sep 19, 2025
170c1b8
handle user defined strati column and add validation
noellehmcheng Sep 19, 2025
569f39b
add json file output for sorter
noellehmcheng Sep 19, 2025
9435579
refactor: remove user defined column
rabii-chaarani Sep 22, 2025
a660002
feat: add qvariantToFloat function
rabii-chaarani Sep 22, 2025
b74bc79
feat: Processing/processing tools sampler (#19)
noellehmcheng Sep 22, 2025
26399b2
Processing/processing tools basal contacts test (#21)
noellehmcheng Sep 22, 2025
1235856
Merge branch 'noelle/sorter' into processing/processing_tools
rabii-chaarani Sep 22, 2025
72f5949
fix: fix syntac error
rabii-chaarani Sep 22, 2025
30c7e20
fix: remove redundant parameters in SamplerAlgorithm
rabii-chaarani Sep 22, 2025
5dbcfca
fix: remove redundant imports
rabii-chaarani Sep 22, 2025
09091a4
Merge branch 'processing/processing_tools' into processing/thickness_…
rabii-chaarani Sep 22, 2025
90663cf
fix: remove unused QgsSettings
rabii-chaarani Sep 22, 2025
4ff7546
fix: updated tearDownClass
rabii-chaarani Sep 22, 2025
14db8d0
fix: add pass statement
rabii-chaarani Sep 22, 2025
ec993bb
update sampler tests
noellehmcheng Sep 22, 2025
83c1703
update sampler
noellehmcheng Sep 22, 2025
747abef
Merge branch 'processing/thickness_calculator' of https://github.com/…
noellehmcheng Sep 22, 2025
5205cf5
update strati column and bounding box
noellehmcheng Sep 23, 2025
a259cae
fix sample contacts data type
noellehmcheng Sep 23, 2025
00d4bb8
add orientation type for structure data
noellehmcheng Sep 23, 2025
d2d2925
Processing/thickness calculator (#23)
rabii-chaarani Sep 24, 2025
17cd45b
feat: add UserDefinedStratigraphyAlgorithm to provider
rabii-chaarani Sep 24, 2025
4395880
feat: import UserDefinedStratigraphyAlgorithm
rabii-chaarani Sep 24, 2025
2d4eff6
refactor: update BasalContactsAlgorithm
rabii-chaarani Sep 24, 2025
09034f1
refactor: update SamplerAlgorithm
rabii-chaarani Sep 24, 2025
932b95c
refactor: update sorter
rabii-chaarani Sep 24, 2025
476eadb
refactor: update ThicknessCalculatorAlgorithm
rabii-chaarani Sep 24, 2025
9e890d5
feat: implement UserDefinedStratigraphyAlgorithm
rabii-chaarani Sep 24, 2025
3b61ed6
refactor: remove redundant algo
rabii-chaarani Sep 24, 2025
248040d
fix: use correct strati table
rabii-chaarani Sep 24, 2025
9cacb9b
fix: correct variable assignment
rabii-chaarani Sep 24, 2025
f59f4f8
fix units in ThicknessCalculatorAlgorithm
noellehmcheng Sep 24, 2025
b1bb23f
update extract_basal_contacts and test_basal_contacts
noellehmcheng Sep 24, 2025
ec389b3
Revert "update extract_basal_contacts and test_basal_contacts"
noellehmcheng Sep 24, 2025
e6fa63c
fix test_basal_contacts
noellehmcheng Sep 24, 2025
d4d6d83
fix input file name in test_basal_contacts
noellehmcheng Sep 24, 2025
2cd4c53
feat dynamic field handling in Sampler
noellehmcheng Oct 6, 2025
97c5274
fix strat column data in ThicknessCalculator
noellehmcheng Oct 6, 2025
fe429df
merge with processing/processing_tools
noellehmcheng Oct 7, 2025
53917e3
add user defined boundingbox in ThicknessCalculatorAlgorithm
noellehmcheng Oct 15, 2025
c94b40c
replace QMetaType with QVariant in sampler
noellehmcheng Oct 15, 2025
b32baec
change orientation type variable name in ThicknessCalculatorAlgorithm
noellehmcheng Oct 15, 2025
291de7a
Merge branch 'processing/processing_tools' into noelle/thickness_calc…
noellehmcheng Oct 16, 2025
d5e5862
Merge pull request #25 from Loop3D/noelle/thickness_calculator
noellehmcheng Oct 16, 2025
b34340c
Initial commit
lachlangrose Oct 16, 2025
57dec36
Merge remote-tracking branch 'plugin_loopstructural/main'
lachlangrose Oct 16, 2025
d866175
rename for folder for merge with loopstructural plugin
lachlangrose Oct 16, 2025
4ada6b3
Merge remote-tracking branch 'plugin_map2loop/ls_merge'
lachlangrose Oct 16, 2025
83c4dfa
add agent.md file with initial content. (#53)
lachlangrose Oct 22, 2025
96fa040
Initial plan
Copilot Oct 22, 2025
9fce47c
Add separate GUI widgets for map2loop processing tools
Copilot Oct 22, 2025
4cb593b
Add documentation for map2loop tools widgets
Copilot Oct 22, 2025
bd81685
fix: remove QgsProxyModel from .ui file and move to .py file
lachlangrose Oct 22, 2025
8a3dbeb
refactor: Convert widgets to dialogs and call map2loop classes directly
Copilot Oct 22, 2025
909610d
fix: loopstructural/map2loop share the same stratigraphic column widg…
lachlangrose Nov 26, 2025
2d13552
fix: change basal contacts from processing call to a shared api
lachlangrose Nov 26, 2025
2f695b0
fix: pass data manager to all widgets
lachlangrose Nov 26, 2025
b5a3532
fix: use api for samplers, sorters and calculators
lachlangrose Nov 26, 2025
558e6fa
fix: add automatic column guessing framework
lachlangrose Nov 27, 2025
7b585b4
fix: pass data manager to widgets
lachlangrose Nov 27, 2025
64be0b8
fix: guess sorter columns/layers
lachlangrose Nov 27, 2025
dc6730a
fix: find layer can work with other layer types
lachlangrose Nov 27, 2025
18c46ca
fix: add geodataframetoproject for calculating contacts and guess col…
lachlangrose Nov 27, 2025
00a4f89
fix: guess layers/colum names
lachlangrose Nov 27, 2025
64952ea
fix: get list of units from datamanager for extracting contacts out
lachlangrose Dec 1, 2025
366e37f
fix: adding helpers for stratigraphic column to data manager
lachlangrose Dec 1, 2025
b443e29
fix: mapping stratigraphic column sorters to qgis fields/layers
lachlangrose Dec 1, 2025
f21e4c8
fix: use options manager for getting debug mode
lachlangrose Dec 2, 2025
45f97d2
fix: add debug mode to sampler
lachlangrose Dec 2, 2025
a9ef752
fix: debug mode to thickness calc
lachlangrose Dec 2, 2025
6e05ec7
fix: remove stratigraphic column layers
lachlangrose Dec 2, 2025
1d0d0b2
merge
lachlangrose Dec 3, 2025
ffa4dd4
fix: add get debug mode
lachlangrose Dec 15, 2025
3503c7e
fix: set default sorter to age based
lachlangrose Dec 15, 2025
7abe2bf
docs: remove copilot doc
lachlangrose Dec 15, 2025
e153ec6
fix: add all m2l tools as toolbar buttons
lachlangrose Dec 15, 2025
db4342f
fix: add image for basal contacts
lachlangrose Dec 15, 2025
cae7e21
fix: get logging from m2l
lachlangrose Dec 15, 2025
9e1b915
chore: adding precommit to avoid print statements
lachlangrose Dec 16, 2025
e5125bb
fix: use layer crs for sampler
lachlangrose Dec 16, 2025
9c6d4a9
fix: update strat column thickness after thickness calc
lachlangrose Dec 16, 2025
01dfbd4
fix: connect up thickness calc
lachlangrose Dec 16, 2025
06e586f
fix: store location tracking and lines for thickness calculators
lachlangrose Dec 16, 2025
3a37ae0
style: ruff check --fix
lachlangrose Dec 16, 2025
dc726d8
style: ruff check
lachlangrose Dec 16, 2025
19d5070
Merge branch 'main' into copilot/create-separate-gui-components
lachlangrose Dec 16, 2025
70fdbbb
fix: incorrect field name
lachlangrose Dec 16, 2025
351a96a
fix: convert unit_name_field to 'UNITNAME'
lachlangrose Dec 17, 2025
2ec3fcd
fix: updating unload to prevent error when missing dock widgets
lachlangrose Dec 17, 2025
24cc539
fix: rename unit_name_column to unit_name_field
lachlangrose Dec 17, 2025
56ceb77
fix: update stratigraphic column with calculated thicknesses
lachlangrose Dec 17, 2025
5fba7c8
fix: update stratigraphic unit to prevent missing widget error
lachlangrose Dec 17, 2025
4a0ba19
style: formatting
lachlangrose Dec 17, 2025
400434c
Add debug directory preference and DebugManager for structured loggin…
Copilot Jan 14, 2026
1fb1539
Fault feature panel upgrade (#63)
lachlangrose Jan 14, 2026
f995ffc
Merge branch 'dev-0.1.12' of github.com:Loop3D/plugin_loopstructural …
lachlangrose Jan 15, 2026
bb9cbf0
ci: updating pre-commit yaml
lachlangrose Jan 15, 2026
ddd955c
style: pre-commit/ruff
lachlangrose Jan 15, 2026
d197176
style: ruff
lachlangrose Jan 15, 2026
c7d9b8e
fix: add topology calculator widget
lachlangrose Jan 15, 2026
dea0075
fix: bump loopstructural version
lachlangrose Jan 18, 2026
39437bd
fix: applying some copilot suggestions
lachlangrose Jan 19, 2026
2abf4b3
fix: add m2l icons for strat column
lachlangrose Jan 21, 2026
08320af
fix: avoid adding null units to stratigraphic column
lachlangrose Jan 21, 2026
4c1bf73
Merge branch 'dev-0.1.12' of github.com:Loop3D/plugin_loopstructural …
lachlangrose Jan 21, 2026
3067cc3
Initial plan
Copilot Jan 24, 2026
43ff8cc
Add paint stratigraphic order processing algorithm
Copilot Jan 24, 2026
205d1bd
Add tests for paint stratigraphic order algorithm
Copilot Jan 24, 2026
d280c25
Fix test robustness by using safer feature lookup
Copilot Jan 24, 2026
ef277ac
Add documentation for Paint Stratigraphic Order tool
Copilot Jan 24, 2026
3537cd3
fix: add x/y to structure gdf
lachlangrose Jan 24, 2026
2446b7a
Merge branch 'dev-0.1.12' into copilot/add-stratigraphic-order-widget
lachlangrose Jan 24, 2026
fdebe4f
Add paint stratigraphic order widget and dialog
Copilot Jan 24, 2026
6e2e202
fix: adding widget to paint stratigraphic order onto geology shapefil…
lachlangrose Jan 26, 2026
0704eb8
fix: add message if no contacts found
lachlangrose Jan 26, 2026
ad69700
fix: add widget for painting stratigraphic order from column onto sha…
lachlangrose Jan 26, 2026
038a009
fix: close ml2 widgets when tool has been run successfully
Copilot Jan 26, 2026
32d5dc4
fix: updating test runner and test docker
lachlangrose Jan 26, 2026
32b513e
linting
lachlangrose Jan 26, 2026
3bbaa45
updating m2l in reqs and adding reqs to the tester
lachlangrose Jan 26, 2026
558fd8e
remove map2loop from source install in test
lachlangrose Jan 26, 2026
3919eb1
remove paint stratigraphic order test
lachlangrose Jan 26, 2026
ab30937
return all contacts
lachlangrose Jan 26, 2026
8915f33
tests: adding test for stratigraphic order painter
lachlangrose Jan 26, 2026
8858693
style: move show fault calc dialog to underneath init
lachlangrose Jan 26, 2026
76aef57
fix: sync fault topo calculator with the data manager. Use the same l…
lachlangrose Jan 26, 2026
42f175d
fix: block model from being built with default bounding box.
Copilot Jan 26, 2026
6dec6e2
fix: Persist and auto-guess layer/field selections across map2loop an…
Copilot Jan 26, 2026
1bef056
fix: allow different crs for input data and model. Force model crs to…
Copilot Jan 26, 2026
7f15d91
fix: remove search radius
lachlangrose Jan 27, 2026
8266dca
fix: set calculator params to correct argument names
lachlangrose Jan 27, 2026
a535f4f
style: linting
lachlangrose Jan 27, 2026
d53fa46
fix: update thicknesses in stratigraphic colum after thickness calcul…
lachlangrose Jan 27, 2026
29caccf
fix: update thickness widget
lachlangrose Jan 27, 2026
4221630
fix: add helper to check if an attribute is none
lachlangrose Jan 27, 2026
fa84e27
fix: update logger to make threadsafe in qgis
lachlangrose Jan 27, 2026
48a0ad5
fix: abstract logging to debug manager, this could allow for file log…
lachlangrose Jan 27, 2026
2d2f848
fix: use logger instead of print
lachlangrose Jan 27, 2026
9955147
fix: use debug manager logger and avoid adding color twice for strat …
lachlangrose Jan 27, 2026
e831747
fix: auto select sampler or decimator for line/point data
lachlangrose Jan 28, 2026
2e78c33
fix: close topo calc when finished
lachlangrose Jan 28, 2026
7d6cbb3
fix: dont run user define sorter, there is nothing to run!
lachlangrose Jan 29, 2026
ea99e14
fix: add data converter widget and section thickness calculator
rabii-chaarani Jan 30, 2026
ed015c3
fix: decouple surfaces from model if model has been reset.
lachlangrose Jan 30, 2026
64d5c00
fix: remove bb steps from bb widget
lachlangrose Jan 31, 2026
bdeccb8
fix: linting
lachlangrose Jan 31, 2026
e48dc96
chore: bump m2l and ls versions
lachlangrose Jan 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
__pycache__/
*.pyc
*.pyo
*.dist-info
*.egg-info
.env
.vscode/
.idea/
.tests/
build/
.dist/
.cache/
1 change: 0 additions & 1 deletion .github/workflows/linter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,3 @@ jobs:
# - uses: stefanzweifel/git-auto-commit-action@v6
# with:
# commit_message: "style: style fixes by ruff and autoformatting by black"

2 changes: 1 addition & 1 deletion .github/workflows/package_and_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -165,4 +165,4 @@ jobs:
--create-plugin-repo
--github-token ${{ secrets.GITHUB_TOKEN }}
--osgeo-username ${{ secrets.OSGEO_USER }}
--osgeo-password ${{ secrets.OSGEO_PASSWORD }}
--osgeo-password ${{ secrets.OSGEO_PASSWORD }}
80 changes: 45 additions & 35 deletions .github/workflows/tester.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
push:
branches:
- main
- dev*
paths:
- '**.py'
- .github/workflows/tester.yml
Expand Down Expand Up @@ -45,38 +46,47 @@ jobs:
- name: Run Unit tests
run: pytest -p no:qgis tests/unit/

# test-qgis:
# runs-on: ubuntu-latest

# container:
# image: qgis/qgis:release-3_28
# env:
# CI: true
# DISPLAY: ":1"
# MUTE_LOGS: true
# NO_MODALS: 1
# PYTHONPATH: "/usr/share/qgis/python/plugins:/usr/share/qgis/python:."
# QT_QPA_PLATFORM: "offscreen"
# WITH_PYTHON_PEP: false
# options: -v /tmp/.X11-unix:/tmp/.X11-unix -v ${{ github.workspace }}:/tests_directory

# steps:
# - name: Get source code
# uses: actions/checkout@v6

# - name: Print QGIS version
# run: qgis --version

# - name: Setup plugin
# run: qgis_setup.sh loopstructural


# - name: Install Python requirements
# run: |
# python3 -m pip install -U pip setuptools wheel
# python3 -m pip install -U -r requirements/testing.txt

# - name: Run Unit tests
# run: |
# Xvfb :1 &
# python3 -m pytest tests/qgis/
test-qgis:
runs-on: ubuntu-latest

container:
image: qgis/qgis:release-3_28
env:
CI: true
DISPLAY: ":1"
MUTE_LOGS: true
NO_MODALS: "1"
PYTHONPATH: "/usr/share/qgis/python/plugins:/usr/share/qgis/python:."
QT_QPA_PLATFORM: "offscreen"
WITH_PYTHON_PEP: "false"
options: -v /tmp/.X11-unix:/tmp/.X11-unix -v ${{ github.workspace }}:/tests_directory

steps:
- name: Get source code
uses: actions/checkout@v6

- name: Print QGIS version
run: qgis --version

- name: Install system packages (GDAL/PROJ/GEOS build deps)
run: |
set -e
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
build-essential gdal-bin libgdal-dev proj-bin libproj-dev libgeos-dev python3-dev xvfb
rm -rf /var/lib/apt/lists/*

- name: Setup plugin
run: bash /tests_directory/scripts/qgis_setup.sh loopstructural


- name: Install Python requirements
run: |
python3 -m pip install -U pip setuptools wheel
python3 -m pip install -U -r requirements/testing.txt
python3 -m pip install -U -r /tests_directory/loopstructural/requirements.txt

- name: Run Unit tests
run: |
Xvfb :1 &
python3 -m pytest tests/qgis/
13 changes: 13 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,19 @@ repos:
- --target-version=py39


# Local hook to forbid print statements in Python files (excluding tests)
- repo: local
hooks:
- id: forbid-print-statements
name: Forbid print statements
entry: grep -nH -E '\bprint\s*\('
language: system
types: [python]
exclude: 'tests/'
pass_filenames: true
description: 'Fail if print statements are found in Python files.'



ci:
autoupdate_schedule: quarterly
Expand Down
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
".": "0.0.1",
"loopstructural": "0.1.11"
}
}
18 changes: 18 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
version: '3.8'

services:
qgis_test:
image: qgis/qgis:release-3_28
environment:
- CI=true
- DISPLAY=:99
- MUTE_LOGS=true
- NO_MODALS=1
- PYTHONPATH=/usr/share/qgis/python/plugins:/usr/share/qgis/python:.
- QT_QPA_PLATFORM=offscreen
- WITH_PYTHON_PEP=false
volumes:
- ./:/tests_directory
- /tmp/.X11-unix:/tmp/.X11-unix
tty: true
entrypoint: ["tail", "-f", "/dev/null"]
3 changes: 0 additions & 3 deletions docs/usage/3d-modeling.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,3 @@ In LoopStructural stratigraphic surfaces can be modelled using implicit function

### Fault modelling
Faults are modelled in LoopStructural by building three implicit functions defining the fault surface, fault slip vector and the fault extent. Combined with a parametric representation of the fault displacement within these coordinates a kinematic model.



2 changes: 1 addition & 1 deletion docs/usage/install/linux.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,4 @@
1. Restart QGIS if necessary.
2. Confirm that the plugin is available under the **Plugins** menu.

You are now ready to use the plugin on your Linux system!
You are now ready to use the plugin on your Linux system!
4 changes: 2 additions & 2 deletions docs/usage/install/macosx.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
```bash
brew install qgis
```

### Step 2: Install Dependencies Using pip
1. Ensure you have `pip` installed. If not, install it using:
```bash
Expand All @@ -33,4 +33,4 @@
1. Restart QGIS if necessary.
2. Confirm that the plugin is available under the **Plugins** menu.

You are now ready to use the plugin on your MacOS system!
You are now ready to use the plugin on your MacOS system!
6 changes: 2 additions & 4 deletions docs/usage/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@

This plugin is published on the official QGIS plugins repository: <https://plugins.qgis.org/plugins/loopstructural/>.

LoopStructural plugin requires the installation of `LoopStructural, loopsolver, pyvista, pyvistaqt and pyqtgraph`. Optionally meshio and geoh5py can also be installed for exporting surfaces/models into different formats.
LoopStructural plugin requires the installation of `LoopStructural, loopsolver, pyvista, pyvistaqt and pyqtgraph`. Optionally meshio and geoh5py can also be installed for exporting surfaces/models into different formats.

To install these dependencies you can follow the instructions below for your operating system.

### Using QPIP
You can also use the experimental QGIS plugin QPIP which is developed by OPENGIS.ch <https://plugins.qgis.org/plugins/qpip/> that manages the Python dependencies for your QGIS environment and keeps the dependencies up to date.
You can also use the experimental QGIS plugin QPIP which is developed by OPENGIS.ch <https://plugins.qgis.org/plugins/qpip/> that manages the Python dependencies for your QGIS environment and keeps the dependencies up to date.


----
Expand All @@ -23,5 +23,3 @@ install/linux
install/macosx

```


37 changes: 31 additions & 6 deletions docs/usage/interface.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
The LoopStructural plugin interfaces with QGIS to define the model input data and parameters.

### Bounding box
The bounding box defines the spatial extent of the model and can be either specified manually or automatically by calculating the extent from a selected layer or the current view. Not that the bounding box currently has to be axis aligned, meaning that the bounding box is defined by the minimum and maximum x, y and z coordinates.
The bounding box defines the spatial extent of the model and can be either specified manually or automatically by calculating the extent from a selected layer or the current view. Not that the bounding box currently has to be axis aligned, meaning that the bounding box is defined by the minimum and maximum x, y and z coordinates.


![Bounding Box](../static/bounding_box_widget.png)
Expand All @@ -17,22 +17,22 @@ If the points being modelled contain a Z coordinate, this can be used instead of
### Fault layers
The faults trace layer is usually a line layer that contains the trace of the fault. The fault trace is used to define the location of the fault in the model. Optional attributes can be used to further constrain the model:
- **fault name** the name of the fault to be used in the model, if this is left blank the feature ID will be used instead.
- **Dip** the dip of the fault, if this is left blank the fault will be assumed to be vertical.
- **Dip** the dip of the fault, if this is left blank the fault will be assumed to be vertical.
- **Displacement** - The maximum displacement magnitude of the fault. If this is not specified, a default value will be used.
- **Pitch** - defines the pitch of the fault slip vector in the fault surface. If this is left blank a vertical slip vector is assumed and projected onto the fault surface.
- **Pitch** - defines the pitch of the fault slip vector in the fault surface. If this is left blank a vertical slip vector is assumed and projected onto the fault surface.

![Fault Layer](../static/fault_layers.png)
### Stratigraphy
Two layers can be used to constrain the stratigraphy of the model:
1. Basal contacts - this layer defines the basal contacts of the stratigraphy. The layer should contain a line layer with the contact traces. The attributes can be used to define the name of the contact.
2. Structural data - this layer defines the structural data that is used to constrain the model. The layer should contain a point layer with the structural data. The attributes can be used to define the orientation of the data, such as dip and dip direction.
2. Structural data - this layer defines the structural data that is used to constrain the model. The layer should contain a point layer with the structural data. The attributes can be used to define the orientation of the data, such as dip and dip direction.

![Stratigraphic Layer](../static/stratigraphic_layer.png)

## Stratigraphic Column
The stratigraphic column defines the order of the contacts and any unconformable relationships between them. The column is defined by a list of units - these units are ordered from oldest at the bottom to youngest at the top. Unconformities can be inserted between units to define an unconformable relationship. The thicknesses define the true thickness of each unit and are used to parameterise the interpolation. The unit names should match the names of the contacts in the basal contacts layer. Units without basal contacts can be included in the stratigraphic column but will not be constrained by any data.

The stratigraphic column can be initialised from the basal contacts layer by clicking the "Initialise from Layer" button. This will create a column with the contacts in the order they are found in the layer. The column can then be edited to add unconformities or change the order of the units. To change the order of units simply drag the units in the list. To add an unconformity, click the "Add Unconformity" button and drag the unconformity the location in the column.
The stratigraphic column can be initialised from the basal contacts layer by clicking the "Initialise from Layer" button. This will create a column with the contacts in the order they are found in the layer. The column can then be edited to add unconformities or change the order of the units. To change the order of units simply drag the units in the list. To add an unconformity, click the "Add Unconformity" button and drag the unconformity the location in the column.


![Stratigraphic Column](../static/stratigraphic_column_04.png)
Expand All @@ -44,8 +44,33 @@ The fault-fault relationship table defines the interaction between faults in the

![Fault Topology](../static/fault_topology_hamersley.png)

## Processing Tools

The plugin provides several QGIS Processing algorithms for working with geological data. These can be accessed through the QGIS Processing Toolbox.

### Paint Stratigraphic Order

The **Paint Stratigraphic Order** algorithm allows you to visualize the stratigraphic order on geology polygons. This tool is useful for:
- Visually debugging the stratigraphic column
- Quality checking unit order
- Creating visualizations of stratigraphic relationships

The algorithm takes:
- **Input Polygons**: A polygon layer containing geological units (e.g., your geology map)
- **Unit Name Field**: The field in your polygon layer that contains unit names
- **Stratigraphic Column**: A table or layer with the stratigraphic column (ordered from youngest to oldest)
- **Paint Mode**: Choose between:
- **Stratigraphic Order** (0 = youngest, N = oldest): Paints a numeric order onto each polygon
- **Cumulative Thickness**: Paints the cumulative thickness from the bottom (oldest) unit

The algorithm adds a new field to your polygon layer:
- `strat_order`: The stratigraphic order (when using Stratigraphic Order mode)
- `cum_thickness`: The cumulative thickness in the stratigraphic column (when using Cumulative Thickness mode)

Units that don't match the stratigraphic column will have null values, helping you identify data quality issues.

## Model parameters
Once the layers have been selected, stratigraphic column defined and the fault topology relationships set, the LoopStructural model can be initialised.
Once the layers have been selected, stratigraphic column defined and the fault topology relationships set, the LoopStructural model can be initialised.

Initialise model will create a LoopStructural model with all of the geological features in the model. For each feature in the model the number of interpolation elements (degrees of freedom), the weighting of the regularisation, contact points and orientation weight can be changed.
![Model Parameters](../static/model-setup.png)
Loading
Loading