Add model CRS with automatic spatial transformation - #75

Merged
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion
Jan 26, 2026
Merged

Add model CRS with automatic spatial transformation#75
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion

Conversation

CopilotAI commented Jan 26, 2026

Copy link
Copy Markdown
Contributor

Geological models require projected coordinate systems (meters), but input layers may use different CRS. This adds model-level CRS management with automatic transformation of all input layers.

Changes

CRS Storage & Validation (data_manager.py)

  • Added _model_crs and _use_project_crs fields with validation ensuring projected (not geographic) CRS
  • Persists CRS settings via to_dict()/from_dict()
  • Callback system for UI synchronization

Spatial Transformation (vectorLayerWrapper.py)

  • Enhanced qgsLayerToGeoDataFrame(layer, target_crs=None) to transform geometries when target_crs differs from layer CRS
  • Applied to all data workflows: basal contacts, structural orientations, fault traces, foliation data
  • Null-safe error handling with descriptive warnings

UI Controls (bounding_box.ui, bounding_box.py)

  • Added CRS selector with "Use Project CRS" (default) / "Use Custom CRS" radio buttons
  • Real-time validation preventing geographic CRS selection
  • Visual feedback for invalid selections

Model Initialization (geological_model_tab.py)

  • Blocks initialization if CRS is invalid or geographic
  • Clear error messages directing users to fix CRS in Model Definition tab

Example

# Before: layers used in their native CRS (could be geographic)gdf=qgsLayerToGeoDataFrame(layer)
# After: automatically transforms to model CRSmodel_crs=data_manager.get_model_crs() # Validated projected CRSgdf=qgsLayerToGeoDataFrame(layer, target_crs=model_crs)

Default behavior uses project CRS. Backward compatible - target_crs parameter is optional.

Original prompt

This section details on the original issue you should resolve

<issue_title>[Feature Request] - convert layer crs to model crs</issue_title>
<issue_description>### Feature description

Allow for model to have a defined crs and convert all layers into this crs

Additional context

No response</issue_description>

<agent_instructions>Add the option for a model CRS, or use the project crs. Ensure the CRS is projected and not geographic (needs to be in meters). Then add appropriate functions to perform spatial transformation before the layers are used in the loopstructural code. This would be in the qgslayertogeopandasdataframe and assocaited functions. Add the CRS definition into the bounding box widget with a check box to use project CRS or another to use a specific CRS. If the chosen mode is invalid don't allow for the model to be initialised.</agent_instructions>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 5 commits January 26, 2026 08:00
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
CopilotAI changed the title [WIP] Add option to convert layer CRS to model CRSAdd model CRS with automatic spatial transformationJan 26, 2026
@lachlangrose
lachlangrose marked this pull request as ready for review January 26, 2026 23:26
@lachlangrose
lachlangrose merged commit 1bef056 into dev-0.1.12Jan 26, 2026
1 check passed
@lachlangrose
lachlangrose deleted the copilot/add-model-crs-conversion branch January 26, 2026 23:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lachlangrose
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add model CRS with automatic spatial transformation - #75

Merged
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion
Jan 26, 2026
Merged

Add model CRS with automatic spatial transformation#75
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion

Conversation

CopilotAI commented Jan 26, 2026

Copy link
Copy Markdown
Contributor

Geological models require projected coordinate systems (meters), but input layers may use different CRS. This adds model-level CRS management with automatic transformation of all input layers.

Changes

CRS Storage & Validation (data_manager.py)

  • Added _model_crs and _use_project_crs fields with validation ensuring projected (not geographic) CRS
  • Persists CRS settings via to_dict()/from_dict()
  • Callback system for UI synchronization

Spatial Transformation (vectorLayerWrapper.py)

  • Enhanced qgsLayerToGeoDataFrame(layer, target_crs=None) to transform geometries when target_crs differs from layer CRS
  • Applied to all data workflows: basal contacts, structural orientations, fault traces, foliation data
  • Null-safe error handling with descriptive warnings

UI Controls (bounding_box.ui, bounding_box.py)

  • Added CRS selector with "Use Project CRS" (default) / "Use Custom CRS" radio buttons
  • Real-time validation preventing geographic CRS selection
  • Visual feedback for invalid selections

Model Initialization (geological_model_tab.py)

  • Blocks initialization if CRS is invalid or geographic
  • Clear error messages directing users to fix CRS in Model Definition tab

Example

# Before: layers used in their native CRS (could be geographic)gdf=qgsLayerToGeoDataFrame(layer)
# After: automatically transforms to model CRSmodel_crs=data_manager.get_model_crs() # Validated projected CRSgdf=qgsLayerToGeoDataFrame(layer, target_crs=model_crs)

Default behavior uses project CRS. Backward compatible - target_crs parameter is optional.

Original prompt

This section details on the original issue you should resolve

<issue_title>[Feature Request] - convert layer crs to model crs</issue_title>
<issue_description>### Feature description

Allow for model to have a defined crs and convert all layers into this crs

Additional context

No response</issue_description>

<agent_instructions>Add the option for a model CRS, or use the project crs. Ensure the CRS is projected and not geographic (needs to be in meters). Then add appropriate functions to perform spatial transformation before the layers are used in the loopstructural code. This would be in the qgslayertogeopandasdataframe and assocaited functions. Add the CRS definition into the bounding box widget with a check box to use project CRS or another to use a specific CRS. If the chosen mode is invalid don't allow for the model to be initialised.</agent_instructions>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 5 commits January 26, 2026 08:00
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
CopilotAI changed the title [WIP] Add option to convert layer CRS to model CRSAdd model CRS with automatic spatial transformationJan 26, 2026
@lachlangrose
lachlangrose marked this pull request as ready for review January 26, 2026 23:26
@lachlangrose
lachlangrose merged commit 1bef056 into dev-0.1.12Jan 26, 2026
1 check passed
@lachlangrose
lachlangrose deleted the copilot/add-model-crs-conversion branch January 26, 2026 23:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lachlangrose
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add model CRS with automatic spatial transformation - #75

Merged
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion
Jan 26, 2026
Merged

Add model CRS with automatic spatial transformation#75
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion

Conversation

CopilotAI commented Jan 26, 2026

Copy link
Copy Markdown
Contributor

Geological models require projected coordinate systems (meters), but input layers may use different CRS. This adds model-level CRS management with automatic transformation of all input layers.

Changes

CRS Storage & Validation (data_manager.py)

  • Added _model_crs and _use_project_crs fields with validation ensuring projected (not geographic) CRS
  • Persists CRS settings via to_dict()/from_dict()
  • Callback system for UI synchronization

Spatial Transformation (vectorLayerWrapper.py)

  • Enhanced qgsLayerToGeoDataFrame(layer, target_crs=None) to transform geometries when target_crs differs from layer CRS
  • Applied to all data workflows: basal contacts, structural orientations, fault traces, foliation data
  • Null-safe error handling with descriptive warnings

UI Controls (bounding_box.ui, bounding_box.py)

  • Added CRS selector with "Use Project CRS" (default) / "Use Custom CRS" radio buttons
  • Real-time validation preventing geographic CRS selection
  • Visual feedback for invalid selections

Model Initialization (geological_model_tab.py)

  • Blocks initialization if CRS is invalid or geographic
  • Clear error messages directing users to fix CRS in Model Definition tab

Example

# Before: layers used in their native CRS (could be geographic)gdf=qgsLayerToGeoDataFrame(layer)
# After: automatically transforms to model CRSmodel_crs=data_manager.get_model_crs() # Validated projected CRSgdf=qgsLayerToGeoDataFrame(layer, target_crs=model_crs)

Default behavior uses project CRS. Backward compatible - target_crs parameter is optional.

Original prompt

This section details on the original issue you should resolve

<issue_title>[Feature Request] - convert layer crs to model crs</issue_title>
<issue_description>### Feature description

Allow for model to have a defined crs and convert all layers into this crs

Additional context

No response</issue_description>

<agent_instructions>Add the option for a model CRS, or use the project crs. Ensure the CRS is projected and not geographic (needs to be in meters). Then add appropriate functions to perform spatial transformation before the layers are used in the loopstructural code. This would be in the qgslayertogeopandasdataframe and assocaited functions. Add the CRS definition into the bounding box widget with a check box to use project CRS or another to use a specific CRS. If the chosen mode is invalid don't allow for the model to be initialised.</agent_instructions>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 5 commits January 26, 2026 08:00
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
CopilotAI changed the title [WIP] Add option to convert layer CRS to model CRSAdd model CRS with automatic spatial transformationJan 26, 2026
@lachlangrose
lachlangrose marked this pull request as ready for review January 26, 2026 23:26
@lachlangrose
lachlangrose merged commit 1bef056 into dev-0.1.12Jan 26, 2026
1 check passed
@lachlangrose
lachlangrose deleted the copilot/add-model-crs-conversion branch January 26, 2026 23:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lachlangrose
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add model CRS with automatic spatial transformation - #75

Merged
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion
Jan 26, 2026
Merged

Add model CRS with automatic spatial transformation#75
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion

Conversation

CopilotAI commented Jan 26, 2026

Copy link
Copy Markdown
Contributor

Geological models require projected coordinate systems (meters), but input layers may use different CRS. This adds model-level CRS management with automatic transformation of all input layers.

Changes

CRS Storage & Validation (data_manager.py)

  • Added _model_crs and _use_project_crs fields with validation ensuring projected (not geographic) CRS
  • Persists CRS settings via to_dict()/from_dict()
  • Callback system for UI synchronization

Spatial Transformation (vectorLayerWrapper.py)

  • Enhanced qgsLayerToGeoDataFrame(layer, target_crs=None) to transform geometries when target_crs differs from layer CRS
  • Applied to all data workflows: basal contacts, structural orientations, fault traces, foliation data
  • Null-safe error handling with descriptive warnings

UI Controls (bounding_box.ui, bounding_box.py)

  • Added CRS selector with "Use Project CRS" (default) / "Use Custom CRS" radio buttons
  • Real-time validation preventing geographic CRS selection
  • Visual feedback for invalid selections

Model Initialization (geological_model_tab.py)

  • Blocks initialization if CRS is invalid or geographic
  • Clear error messages directing users to fix CRS in Model Definition tab

Example

# Before: layers used in their native CRS (could be geographic)gdf=qgsLayerToGeoDataFrame(layer)
# After: automatically transforms to model CRSmodel_crs=data_manager.get_model_crs() # Validated projected CRSgdf=qgsLayerToGeoDataFrame(layer, target_crs=model_crs)

Default behavior uses project CRS. Backward compatible - target_crs parameter is optional.

Original prompt

This section details on the original issue you should resolve

<issue_title>[Feature Request] - convert layer crs to model crs</issue_title>
<issue_description>### Feature description

Allow for model to have a defined crs and convert all layers into this crs

Additional context

No response</issue_description>

<agent_instructions>Add the option for a model CRS, or use the project crs. Ensure the CRS is projected and not geographic (needs to be in meters). Then add appropriate functions to perform spatial transformation before the layers are used in the loopstructural code. This would be in the qgslayertogeopandasdataframe and assocaited functions. Add the CRS definition into the bounding box widget with a check box to use project CRS or another to use a specific CRS. If the chosen mode is invalid don't allow for the model to be initialised.</agent_instructions>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 5 commits January 26, 2026 08:00
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
CopilotAI changed the title [WIP] Add option to convert layer CRS to model CRSAdd model CRS with automatic spatial transformationJan 26, 2026
@lachlangrose
lachlangrose marked this pull request as ready for review January 26, 2026 23:26
@lachlangrose
lachlangrose merged commit 1bef056 into dev-0.1.12Jan 26, 2026
1 check passed
@lachlangrose
lachlangrose deleted the copilot/add-model-crs-conversion branch January 26, 2026 23:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lachlangrose
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add model CRS with automatic spatial transformation - #75

Merged
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion
Jan 26, 2026
Merged

Add model CRS with automatic spatial transformation#75
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion

Conversation

CopilotAI commented Jan 26, 2026

Copy link
Copy Markdown
Contributor

Geological models require projected coordinate systems (meters), but input layers may use different CRS. This adds model-level CRS management with automatic transformation of all input layers.

Changes

CRS Storage & Validation (data_manager.py)

  • Added _model_crs and _use_project_crs fields with validation ensuring projected (not geographic) CRS
  • Persists CRS settings via to_dict()/from_dict()
  • Callback system for UI synchronization

Spatial Transformation (vectorLayerWrapper.py)

  • Enhanced qgsLayerToGeoDataFrame(layer, target_crs=None) to transform geometries when target_crs differs from layer CRS
  • Applied to all data workflows: basal contacts, structural orientations, fault traces, foliation data
  • Null-safe error handling with descriptive warnings

UI Controls (bounding_box.ui, bounding_box.py)

  • Added CRS selector with "Use Project CRS" (default) / "Use Custom CRS" radio buttons
  • Real-time validation preventing geographic CRS selection
  • Visual feedback for invalid selections

Model Initialization (geological_model_tab.py)

  • Blocks initialization if CRS is invalid or geographic
  • Clear error messages directing users to fix CRS in Model Definition tab

Example

# Before: layers used in their native CRS (could be geographic)gdf=qgsLayerToGeoDataFrame(layer)
# After: automatically transforms to model CRSmodel_crs=data_manager.get_model_crs() # Validated projected CRSgdf=qgsLayerToGeoDataFrame(layer, target_crs=model_crs)

Default behavior uses project CRS. Backward compatible - target_crs parameter is optional.

Original prompt

This section details on the original issue you should resolve

<issue_title>[Feature Request] - convert layer crs to model crs</issue_title>
<issue_description>### Feature description

Allow for model to have a defined crs and convert all layers into this crs

Additional context

No response</issue_description>

<agent_instructions>Add the option for a model CRS, or use the project crs. Ensure the CRS is projected and not geographic (needs to be in meters). Then add appropriate functions to perform spatial transformation before the layers are used in the loopstructural code. This would be in the qgslayertogeopandasdataframe and assocaited functions. Add the CRS definition into the bounding box widget with a check box to use project CRS or another to use a specific CRS. If the chosen mode is invalid don't allow for the model to be initialised.</agent_instructions>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 5 commits January 26, 2026 08:00
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
CopilotAI changed the title [WIP] Add option to convert layer CRS to model CRSAdd model CRS with automatic spatial transformationJan 26, 2026
@lachlangrose
lachlangrose marked this pull request as ready for review January 26, 2026 23:26
@lachlangrose
lachlangrose merged commit 1bef056 into dev-0.1.12Jan 26, 2026
1 check passed
@lachlangrose
lachlangrose deleted the copilot/add-model-crs-conversion branch January 26, 2026 23:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lachlangrose
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add model CRS with automatic spatial transformation - #75

Merged
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion
Jan 26, 2026
Merged

Add model CRS with automatic spatial transformation#75
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion

Conversation

CopilotAI commented Jan 26, 2026

Copy link
Copy Markdown
Contributor

Geological models require projected coordinate systems (meters), but input layers may use different CRS. This adds model-level CRS management with automatic transformation of all input layers.

Changes

CRS Storage & Validation (data_manager.py)

  • Added _model_crs and _use_project_crs fields with validation ensuring projected (not geographic) CRS
  • Persists CRS settings via to_dict()/from_dict()
  • Callback system for UI synchronization

Spatial Transformation (vectorLayerWrapper.py)

  • Enhanced qgsLayerToGeoDataFrame(layer, target_crs=None) to transform geometries when target_crs differs from layer CRS
  • Applied to all data workflows: basal contacts, structural orientations, fault traces, foliation data
  • Null-safe error handling with descriptive warnings

UI Controls (bounding_box.ui, bounding_box.py)

  • Added CRS selector with "Use Project CRS" (default) / "Use Custom CRS" radio buttons
  • Real-time validation preventing geographic CRS selection
  • Visual feedback for invalid selections

Model Initialization (geological_model_tab.py)

  • Blocks initialization if CRS is invalid or geographic
  • Clear error messages directing users to fix CRS in Model Definition tab

Example

# Before: layers used in their native CRS (could be geographic)gdf=qgsLayerToGeoDataFrame(layer)
# After: automatically transforms to model CRSmodel_crs=data_manager.get_model_crs() # Validated projected CRSgdf=qgsLayerToGeoDataFrame(layer, target_crs=model_crs)

Default behavior uses project CRS. Backward compatible - target_crs parameter is optional.

Original prompt

This section details on the original issue you should resolve

<issue_title>[Feature Request] - convert layer crs to model crs</issue_title>
<issue_description>### Feature description

Allow for model to have a defined crs and convert all layers into this crs

Additional context

No response</issue_description>

<agent_instructions>Add the option for a model CRS, or use the project crs. Ensure the CRS is projected and not geographic (needs to be in meters). Then add appropriate functions to perform spatial transformation before the layers are used in the loopstructural code. This would be in the qgslayertogeopandasdataframe and assocaited functions. Add the CRS definition into the bounding box widget with a check box to use project CRS or another to use a specific CRS. If the chosen mode is invalid don't allow for the model to be initialised.</agent_instructions>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 5 commits January 26, 2026 08:00
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
CopilotAI changed the title [WIP] Add option to convert layer CRS to model CRSAdd model CRS with automatic spatial transformationJan 26, 2026
@lachlangrose
lachlangrose marked this pull request as ready for review January 26, 2026 23:26
@lachlangrose
lachlangrose merged commit 1bef056 into dev-0.1.12Jan 26, 2026
1 check passed
@lachlangrose
lachlangrose deleted the copilot/add-model-crs-conversion branch January 26, 2026 23:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lachlangrose
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add model CRS with automatic spatial transformation - #75

Merged
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion
Jan 26, 2026
Merged

Add model CRS with automatic spatial transformation#75
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion

Conversation

CopilotAI commented Jan 26, 2026

Copy link
Copy Markdown
Contributor

Geological models require projected coordinate systems (meters), but input layers may use different CRS. This adds model-level CRS management with automatic transformation of all input layers.

Changes

CRS Storage & Validation (data_manager.py)

  • Added _model_crs and _use_project_crs fields with validation ensuring projected (not geographic) CRS
  • Persists CRS settings via to_dict()/from_dict()
  • Callback system for UI synchronization

Spatial Transformation (vectorLayerWrapper.py)

  • Enhanced qgsLayerToGeoDataFrame(layer, target_crs=None) to transform geometries when target_crs differs from layer CRS
  • Applied to all data workflows: basal contacts, structural orientations, fault traces, foliation data
  • Null-safe error handling with descriptive warnings

UI Controls (bounding_box.ui, bounding_box.py)

  • Added CRS selector with "Use Project CRS" (default) / "Use Custom CRS" radio buttons
  • Real-time validation preventing geographic CRS selection
  • Visual feedback for invalid selections

Model Initialization (geological_model_tab.py)

  • Blocks initialization if CRS is invalid or geographic
  • Clear error messages directing users to fix CRS in Model Definition tab

Example

# Before: layers used in their native CRS (could be geographic)gdf=qgsLayerToGeoDataFrame(layer)
# After: automatically transforms to model CRSmodel_crs=data_manager.get_model_crs() # Validated projected CRSgdf=qgsLayerToGeoDataFrame(layer, target_crs=model_crs)

Default behavior uses project CRS. Backward compatible - target_crs parameter is optional.

Original prompt

This section details on the original issue you should resolve

<issue_title>[Feature Request] - convert layer crs to model crs</issue_title>
<issue_description>### Feature description

Allow for model to have a defined crs and convert all layers into this crs

Additional context

No response</issue_description>

<agent_instructions>Add the option for a model CRS, or use the project crs. Ensure the CRS is projected and not geographic (needs to be in meters). Then add appropriate functions to perform spatial transformation before the layers are used in the loopstructural code. This would be in the qgslayertogeopandasdataframe and assocaited functions. Add the CRS definition into the bounding box widget with a check box to use project CRS or another to use a specific CRS. If the chosen mode is invalid don't allow for the model to be initialised.</agent_instructions>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 5 commits January 26, 2026 08:00
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
CopilotAI changed the title [WIP] Add option to convert layer CRS to model CRSAdd model CRS with automatic spatial transformationJan 26, 2026
@lachlangrose
lachlangrose marked this pull request as ready for review January 26, 2026 23:26
@lachlangrose
lachlangrose merged commit 1bef056 into dev-0.1.12Jan 26, 2026
1 check passed
@lachlangrose
lachlangrose deleted the copilot/add-model-crs-conversion branch January 26, 2026 23:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lachlangrose
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add model CRS with automatic spatial transformation - #75

Merged
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion
Jan 26, 2026
Merged

Add model CRS with automatic spatial transformation#75
lachlangrose merged 8 commits into
dev-0.1.12from
copilot/add-model-crs-conversion

Conversation

CopilotAI commented Jan 26, 2026

Copy link
Copy Markdown
Contributor

Geological models require projected coordinate systems (meters), but input layers may use different CRS. This adds model-level CRS management with automatic transformation of all input layers.

Changes

CRS Storage & Validation (data_manager.py)

  • Added _model_crs and _use_project_crs fields with validation ensuring projected (not geographic) CRS
  • Persists CRS settings via to_dict()/from_dict()
  • Callback system for UI synchronization

Spatial Transformation (vectorLayerWrapper.py)

  • Enhanced qgsLayerToGeoDataFrame(layer, target_crs=None) to transform geometries when target_crs differs from layer CRS
  • Applied to all data workflows: basal contacts, structural orientations, fault traces, foliation data
  • Null-safe error handling with descriptive warnings

UI Controls (bounding_box.ui, bounding_box.py)

  • Added CRS selector with "Use Project CRS" (default) / "Use Custom CRS" radio buttons
  • Real-time validation preventing geographic CRS selection
  • Visual feedback for invalid selections

Model Initialization (geological_model_tab.py)

  • Blocks initialization if CRS is invalid or geographic
  • Clear error messages directing users to fix CRS in Model Definition tab

Example

# Before: layers used in their native CRS (could be geographic)gdf=qgsLayerToGeoDataFrame(layer)
# After: automatically transforms to model CRSmodel_crs=data_manager.get_model_crs() # Validated projected CRSgdf=qgsLayerToGeoDataFrame(layer, target_crs=model_crs)

Default behavior uses project CRS. Backward compatible - target_crs parameter is optional.

Original prompt

This section details on the original issue you should resolve

<issue_title>[Feature Request] - convert layer crs to model crs</issue_title>
<issue_description>### Feature description

Allow for model to have a defined crs and convert all layers into this crs

Additional context

No response</issue_description>

<agent_instructions>Add the option for a model CRS, or use the project crs. Ensure the CRS is projected and not geographic (needs to be in meters). Then add appropriate functions to perform spatial transformation before the layers are used in the loopstructural code. This would be in the qgslayertogeopandasdataframe and assocaited functions. Add the CRS definition into the bounding box widget with a check box to use project CRS or another to use a specific CRS. If the chosen mode is invalid don't allow for the model to be initialised.</agent_instructions>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 5 commits January 26, 2026 08:00
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
Co-authored-by: lachlangrose <7371904+lachlangrose@users.noreply.github.com>
CopilotAI changed the title [WIP] Add option to convert layer CRS to model CRSAdd model CRS with automatic spatial transformationJan 26, 2026
@lachlangrose
lachlangrose marked this pull request as ready for review January 26, 2026 23:26
@lachlangrose
lachlangrose merged commit 1bef056 into dev-0.1.12Jan 26, 2026
1 check passed
@lachlangrose
lachlangrose deleted the copilot/add-model-crs-conversion branch January 26, 2026 23:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lachlangrose