Skip to content

Commit b2ec01e

Browse files
authored
Merge pull request #1946 from HEXRD/cif-export
Cif export
2 parents 5396eca + 5f89f01 commit b2ec01e

File tree

7 files changed

+91
-21
lines changed

7 files changed

+91
-21
lines changed

hexrdgui/hexrd_config.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1289,9 +1289,16 @@ def load_materials(self, f):
12891289
beam_energy = valWUnit('beam', 'energy', self.beam_energy, 'keV')
12901290
self.materials = load_materials_hdf5(f, kev=beam_energy)
12911291

1292-
def save_materials(self, f, path=None):
1292+
def save_materials_hdf5(self, f, path=None):
12931293
save_materials_hdf5(f, self.materials, path)
12941294

1295+
def save_material_cif(self, material, directory=None, filename=None):
1296+
if directory is None:
1297+
directory = HexrdConfig().working_dir
1298+
if filename is None:
1299+
filename = f"{material.name}.cif"
1300+
material.write_cif(f"{directory}/{filename}")
1301+
12951302
def import_materials(self, file_paths: list[Path | str]):
12961303
"""Import materials from a list of files
12971304

hexrdgui/indexing/fit_grains_results_dialog.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,7 @@ def full_path(file_name):
714714
HexrdConfig().working_dir = selected_directory
715715

716716
HexrdConfig().save_indexing_config(full_path('workflow.yml'))
717-
HexrdConfig().save_materials(full_path('materials.h5'))
717+
HexrdConfig().save_materials_hdf5(full_path('materials.h5'))
718718
HexrdConfig().save_instrument_config(
719719
full_path('instrument.hexrd'),
720720
# Remove ROIs, since we are saving the imageseries without them

hexrdgui/main_window.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,10 @@ def setup_connections(self):
203203
self.on_action_open_materials_triggered)
204204
self.ui.action_save_imageseries.triggered.connect(
205205
self.on_action_save_imageseries_triggered)
206-
self.ui.action_save_materials.triggered.connect(
207-
self.on_action_save_materials_triggered)
206+
self.ui.action_save_materials_hdf5.triggered.connect(
207+
self.on_action_save_materials_hdf5_triggered)
208+
self.ui.action_save_materials_cif.triggered.connect(
209+
self.on_action_save_materials_cif_triggered)
208210
self.ui.action_save_state.triggered.connect(
209211
self.on_action_save_state_triggered)
210212
self.ui.action_open_state.triggered.connect(
@@ -604,10 +606,14 @@ def images_loaded(self, enabled=True):
604606
def on_action_open_materials_triggered(self):
605607
selected_file, selected_filter = QFileDialog.getOpenFileName(
606608
self.ui, 'Load Materials File', HexrdConfig().working_dir,
607-
'HDF5 files (*.h5 *.hdf5)')
609+
'HDF5 files (*.h5 *.hdf5), CIF (*.cif)')
610+
if not selected_file:
611+
return
608612

609-
if selected_file:
610-
HexrdConfig().working_dir = os.path.dirname(selected_file)
613+
HexrdConfig().working_dir = os.path.dirname(selected_file)
614+
if Path(selected_file).suffix == '.cif':
615+
HexrdConfig().import_material(selected_file)
616+
else:
611617
HexrdConfig().load_materials(selected_file)
612618

613619
def on_action_save_imageseries_triggered(self):
@@ -618,7 +624,7 @@ def on_action_save_imageseries_triggered(self):
618624

619625
SaveImagesDialog(self.ui).exec()
620626

621-
def on_action_save_materials_triggered(self):
627+
def on_action_save_materials_hdf5_triggered(self):
622628
selected_file, selected_filter = QFileDialog.getSaveFileName(
623629
self.ui, 'Save Materials', HexrdConfig().working_dir,
624630
'HDF5 files (*.h5 *.hdf5)')
@@ -631,7 +637,18 @@ def on_action_save_materials_triggered(self):
631637
if not any(selected_file.endswith(x) for x in acceptable_exts):
632638
selected_file += '.h5'
633639

634-
return HexrdConfig().save_materials(selected_file)
640+
return HexrdConfig().save_materials_hdf5(selected_file)
641+
642+
def on_action_save_materials_cif_triggered(self):
643+
caption = 'Select directory to save CIF files to'
644+
selected_dir = QFileDialog.getExistingDirectory(
645+
self.ui, caption, dir=HexrdConfig().working_dir)
646+
if not selected_dir:
647+
return
648+
649+
HexrdConfig().working_dir = selected_dir
650+
for material in HexrdConfig().materials.values():
651+
HexrdConfig().save_material_cif(material, selected_dir)
635652

636653
def on_action_export_current_plot_triggered(self):
637654
filters = 'HDF5 files (*.h5 *.hdf5);; NPZ files (*.npz)'

hexrdgui/material_list_editor.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def setup_connections(self):
3232

3333
self.ui.import_from_cif.clicked.connect(self.import_from_cif)
3434
self.ui.import_from_defaults.clicked.connect(self.import_from_defaults)
35+
self.ui.export_to_cif.clicked.connect(self.export_to_cif)
3536

3637
HexrdConfig().materials_dict_modified.connect(self.update_editor_items)
3738

@@ -67,6 +68,32 @@ def item_added(self, new_name):
6768
material.name = new_name
6869
HexrdConfig().add_material(new_name, material)
6970

71+
def export_to_cif(self):
72+
selections = self.editor.selected_items
73+
filename = None
74+
if len(selections) == 1:
75+
caption = 'Save CIF file as'
76+
selected_file, _ = QFileDialog.getSaveFileName(
77+
self.ui, caption, HexrdConfig().working_dir,
78+
'CIF files (*.cif)')
79+
filename = str(Path(selected_file).name)
80+
selected_dir = str(Path(selected_file).parent)
81+
else:
82+
caption = 'Select directory to export CIF files to'
83+
selected_dir = QFileDialog.getExistingDirectory(
84+
self.ui, caption, dir=HexrdConfig().working_dir)
85+
86+
if not selected_dir:
87+
return
88+
89+
HexrdConfig().working_dir = selected_dir
90+
# Export selected materials or all materials if none selected
91+
if not selections:
92+
selections = HexrdConfig().materials.values()
93+
for selected in selections:
94+
material = HexrdConfig().material(selected)
95+
HexrdConfig().save_material_cif(material, selected_dir, filename)
96+
7097
def import_from_cif(self):
7198
selected_file, selected_filter = QFileDialog.getOpenFileName(
7299
self.ui, 'Import Material', HexrdConfig().working_dir,

hexrdgui/resources/ui/main_window.ui

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,17 @@
9292
<addaction name="action_save_config_hexrd"/>
9393
<addaction name="action_save_config_yaml"/>
9494
</widget>
95+
<widget class="QMenu" name="menu_save_materials">
96+
<property name="title">
97+
<string>&amp;Materials</string>
98+
</property>
99+
<addaction name="action_save_materials_hdf5"/>
100+
<addaction name="action_save_materials_cif"/>
101+
</widget>
95102
<addaction name="action_save_imageseries"/>
96103
<addaction name="action_save_state"/>
97104
<addaction name="menu_save_config"/>
98-
<addaction name="action_save_materials"/>
105+
<addaction name="menu_save_materials"/>
99106
</widget>
100107
<widget class="QMenu" name="menu_export">
101108
<property name="title">
@@ -542,11 +549,6 @@
542549
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Show the saturation percentages of the images when in &amp;quot;Image View&amp;quot; mode. The saturation percentages will appear as white text in the bottom left corners of the images.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
543550
</property>
544551
</action>
545-
<action name="action_save_materials">
546-
<property name="text">
547-
<string>&amp;Materials</string>
548-
</property>
549-
</action>
550552
<action name="action_run_laue_and_powder_calibration">
551553
<property name="enabled">
552554
<bool>false</bool>
@@ -902,6 +904,16 @@
902904
<string>Apply Median Filter</string>
903905
</property>
904906
</action>
907+
<action name="action_save_materials_hdf5">
908+
<property name="text">
909+
<string>HDF5</string>
910+
</property>
911+
</action>
912+
<action name="action_save_materials_cif">
913+
<property name="text">
914+
<string>CIF</string>
915+
</property>
916+
</action>
905917
</widget>
906918
<customwidgets>
907919
<customwidget>

hexrdgui/resources/ui/material_list_editor.ui

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,29 @@
2727
<number>6</number>
2828
</property>
2929
<item row="2" column="0">
30-
<widget class="QPushButton" name="import_from_defaults">
30+
<widget class="QPushButton" name="import_from_cif">
3131
<property name="text">
32-
<string>Import from Defaults</string>
32+
<string>Import from CIF</string>
3333
</property>
3434
</widget>
3535
</item>
36-
<item row="1" column="0">
37-
<widget class="QPushButton" name="import_from_cif">
36+
<item row="3" column="0">
37+
<widget class="QPushButton" name="import_from_defaults">
3838
<property name="text">
39-
<string>Import from CIF</string>
39+
<string>Import from Defaults</string>
4040
</property>
4141
</widget>
4242
</item>
4343
<item row="0" column="0">
4444
<layout class="QVBoxLayout" name="list_editor_layout"/>
4545
</item>
46+
<item row="1" column="0">
47+
<widget class="QPushButton" name="export_to_cif">
48+
<property name="text">
49+
<string>Export to CIF</string>
50+
</property>
51+
</widget>
52+
</item>
4653
</layout>
4754
</widget>
4855
<tabstops>

hexrdgui/state.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ def save(h5_file):
156156
_save_config(h5_file, state)
157157

158158
# Write out the materials
159-
HexrdConfig().save_materials(h5_file, '/materials')
159+
HexrdConfig().save_materials_hdf5(h5_file, '/materials')
160160

161161
# Write out the instrument
162162
HexrdConfig().save_instrument_config(h5_file)

0 commit comments

Comments
 (0)