Describe your issue
Working with LoopStructural v1.6.16, I get the AttributeError: 'StratigraphicColumn' object has no attribute 'keys' when running the provided example notebooks (1b. Implicit surface modelling, 1c. Visualising models, 1d. Using Stratigraphic Columns, 1j. Exporting models)
Minimal reproducing code example
https://loop3d.org/LoopStructural/_auto_examples/1_basic/plot_2_surface_modelling.html
https://loop3d.org/LoopStructural/_auto_examples/1_basic/plot_3_model_visualisation.html
https://loop3d.org/LoopStructural/_auto_examples/1_basic/plot_4_using_stratigraphic_column.html
https://loop3d.org/LoopStructural/_auto_examples/1_basic/plot_7_exporting.html
Error message
ERROR FOR 1b.
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[8], line 2
1 viewer = Loop3DView(model)
----> 2 viewer.plot_block_model(cmap="tab20")
3 viewer.display()
File ~\Anaconda3\envs\loop2025\lib\site-packages\loopstructuralvisualisation\_3d_viewer.py:293, in Loop3DView.plot_block_model(self, cmap, model, pyvista_kwargs, scalar_bar, slicer, threshold, name)
291 name = 'block_model'
292 name = self.increment_name(name) # , 'block_model')
--> 293 block, codes = model.get_block_model()
294 block = block.vtk()
295 block.set_active_scalars('stratigraphy')
File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1755, in GeologicalModel.get_block_model(self, name)
1752 def get_block_model(self, name='block model'):
1753 grid = self.bounding_box.structured_grid(name=name)
-> 1755 grid.cell_properties['stratigraphy'] = self.evaluate_model(
1756 self.rescale(self.bounding_box.cell_centres())
1757 )
1758 return grid, self.stratigraphic_ids()
File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1497, in GeologicalModel.evaluate_model(self, xyz, scale)
1495 logger.warning("No stratigraphic column defined")
1496 return strat_id
-> 1497 for group in reversed(self.stratigraphic_column.keys()):
1498 if group == "faults":
1499 continue
AttributeError: 'StratigraphicColumn' object has no attribute 'keys'
ERROR FOR 1c.
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[3], line 10
6 viewer.plot_surface(strati, value=vals, cmap="prism", paint_with=strati)
9 viewer.plot_scalar_field(strati, cmap="prism")
---> 10 print(viewer._build_stratigraphic_cmap(model))
11 viewer.plot_block_model()
12 # Add the data addgrad/addvalue arguments are optional
File ~\Anaconda3\envs\loop2025\lib\site-packages\loopstructuralvisualisation\_3d_viewer.py:371, in Loop3DView._build_stratigraphic_cmap(self, model)
369 boundaries = []
370 data = []
--> 371 for g in model.stratigraphic_column.keys():
372 if g == "faults":
373 continue
AttributeError: 'StratigraphicColumn' object has no attribute 'keys'
ERROR FOR 1d.
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[3], line 4
1 model.set_stratigraphic_column(stratigraphic_column)
3 viewer = Loop3DView(model)
----> 4 viewer.plot_block_model()
5 viewer.display()
File ~\Anaconda3\envs\loop2025\lib\site-packages\loopstructuralvisualisation\_3d_viewer.py:293, in Loop3DView.plot_block_model(self, cmap, model, pyvista_kwargs, scalar_bar, slicer, threshold, name)
291 name = 'block_model'
292 name = self.increment_name(name) # , 'block_model')
--> 293 block, codes = model.get_block_model()
294 block = block.vtk()
295 block.set_active_scalars('stratigraphy')
File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1755, in GeologicalModel.get_block_model(self, name)
1752 def get_block_model(self, name='block model'):
1753 grid = self.bounding_box.structured_grid(name=name)
-> 1755 grid.cell_properties['stratigraphy'] = self.evaluate_model(
1756 self.rescale(self.bounding_box.cell_centres())
1757 )
1758 return grid, self.stratigraphic_ids()
File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1497, in GeologicalModel.evaluate_model(self, xyz, scale)
1495 logger.warning("No stratigraphic column defined")
1496 return strat_id
-> 1497 for group in reversed(self.stratigraphic_column.keys()):
1498 if group == "faults":
1499 continue
AttributeError: 'StratigraphicColumn' object has no attribute 'keys'
ERROR FOR 1j.
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[7], line 1
----> 1 model.save('model.geoh5')
File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1788, in GeologicalModel.save(self, filename, block_model, stratigraphic_surfaces, fault_surfaces, stratigraphic_data, fault_data)
1786 s.save(f'{parent}/{name}_{s.name}{extension}')
1787 if block_model:
-> 1788 grid, ids = self.get_block_model()
1789 if extension == ".geoh5" or extension == '.omf':
1790 grid.save(filename)
File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1755, in GeologicalModel.get_block_model(self, name)
1752 def get_block_model(self, name='block model'):
1753 grid = self.bounding_box.structured_grid(name=name)
-> 1755 grid.cell_properties['stratigraphy'] = self.evaluate_model(
1756 self.rescale(self.bounding_box.cell_centres())
1757 )
1758 return grid, self.stratigraphic_ids()
File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1497, in GeologicalModel.evaluate_model(self, xyz, scale)
1495 logger.warning("No stratigraphic column defined")
1496 return strat_id
-> 1497 for group in reversed(self.stratigraphic_column.keys()):
1498 if group == "faults":
1499 continue
AttributeError: 'StratigraphicColumn' object has no attribute 'keys'
Describe your issue
Working with LoopStructural v1.6.16, I get the AttributeError: 'StratigraphicColumn' object has no attribute 'keys' when running the provided example notebooks (1b. Implicit surface modelling, 1c. Visualising models, 1d. Using Stratigraphic Columns, 1j. Exporting models)
Minimal reproducing code example
Error message
ERROR FOR 1b. --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In[8], line 2 1 viewer = Loop3DView(model) ----> 2 viewer.plot_block_model(cmap="tab20") 3 viewer.display() File ~\Anaconda3\envs\loop2025\lib\site-packages\loopstructuralvisualisation\_3d_viewer.py:293, in Loop3DView.plot_block_model(self, cmap, model, pyvista_kwargs, scalar_bar, slicer, threshold, name) 291 name = 'block_model' 292 name = self.increment_name(name) # , 'block_model') --> 293 block, codes = model.get_block_model() 294 block = block.vtk() 295 block.set_active_scalars('stratigraphy') File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1755, in GeologicalModel.get_block_model(self, name) 1752 def get_block_model(self, name='block model'): 1753 grid = self.bounding_box.structured_grid(name=name) -> 1755 grid.cell_properties['stratigraphy'] = self.evaluate_model( 1756 self.rescale(self.bounding_box.cell_centres()) 1757 ) 1758 return grid, self.stratigraphic_ids() File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1497, in GeologicalModel.evaluate_model(self, xyz, scale) 1495 logger.warning("No stratigraphic column defined") 1496 return strat_id -> 1497 for group in reversed(self.stratigraphic_column.keys()): 1498 if group == "faults": 1499 continue AttributeError: 'StratigraphicColumn' object has no attribute 'keys' ERROR FOR 1c. --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In[3], line 10 6 viewer.plot_surface(strati, value=vals, cmap="prism", paint_with=strati) 9 viewer.plot_scalar_field(strati, cmap="prism") ---> 10 print(viewer._build_stratigraphic_cmap(model)) 11 viewer.plot_block_model() 12 # Add the data addgrad/addvalue arguments are optional File ~\Anaconda3\envs\loop2025\lib\site-packages\loopstructuralvisualisation\_3d_viewer.py:371, in Loop3DView._build_stratigraphic_cmap(self, model) 369 boundaries = [] 370 data = [] --> 371 for g in model.stratigraphic_column.keys(): 372 if g == "faults": 373 continue AttributeError: 'StratigraphicColumn' object has no attribute 'keys' ERROR FOR 1d. --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In[3], line 4 1 model.set_stratigraphic_column(stratigraphic_column) 3 viewer = Loop3DView(model) ----> 4 viewer.plot_block_model() 5 viewer.display() File ~\Anaconda3\envs\loop2025\lib\site-packages\loopstructuralvisualisation\_3d_viewer.py:293, in Loop3DView.plot_block_model(self, cmap, model, pyvista_kwargs, scalar_bar, slicer, threshold, name) 291 name = 'block_model' 292 name = self.increment_name(name) # , 'block_model') --> 293 block, codes = model.get_block_model() 294 block = block.vtk() 295 block.set_active_scalars('stratigraphy') File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1755, in GeologicalModel.get_block_model(self, name) 1752 def get_block_model(self, name='block model'): 1753 grid = self.bounding_box.structured_grid(name=name) -> 1755 grid.cell_properties['stratigraphy'] = self.evaluate_model( 1756 self.rescale(self.bounding_box.cell_centres()) 1757 ) 1758 return grid, self.stratigraphic_ids() File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1497, in GeologicalModel.evaluate_model(self, xyz, scale) 1495 logger.warning("No stratigraphic column defined") 1496 return strat_id -> 1497 for group in reversed(self.stratigraphic_column.keys()): 1498 if group == "faults": 1499 continue AttributeError: 'StratigraphicColumn' object has no attribute 'keys' ERROR FOR 1j. --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In[7], line 1 ----> 1 model.save('model.geoh5') File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1788, in GeologicalModel.save(self, filename, block_model, stratigraphic_surfaces, fault_surfaces, stratigraphic_data, fault_data) 1786 s.save(f'{parent}/{name}_{s.name}{extension}') 1787 if block_model: -> 1788 grid, ids = self.get_block_model() 1789 if extension == ".geoh5" or extension == '.omf': 1790 grid.save(filename) File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1755, in GeologicalModel.get_block_model(self, name) 1752 def get_block_model(self, name='block model'): 1753 grid = self.bounding_box.structured_grid(name=name) -> 1755 grid.cell_properties['stratigraphy'] = self.evaluate_model( 1756 self.rescale(self.bounding_box.cell_centres()) 1757 ) 1758 return grid, self.stratigraphic_ids() File ~\Anaconda3\envs\loop2025\lib\site-packages\LoopStructural\modelling\core\geological_model.py:1497, in GeologicalModel.evaluate_model(self, xyz, scale) 1495 logger.warning("No stratigraphic column defined") 1496 return strat_id -> 1497 for group in reversed(self.stratigraphic_column.keys()): 1498 if group == "faults": 1499 continue AttributeError: 'StratigraphicColumn' object has no attribute 'keys'