Export selection to file
/*
*
* Export selected rows button
*
* Usage:
* 1. edit the settings
* 2. perform a selection of rows
* 3. execute button script
*
* Script will open a "save dialog" for you, where you will need to specify
* the filename, including the file extension.
*
* Please use file extensions supported by MolExporter https://docs.chemaxon.com/display/docs/Molecule+Formats
*
* @author David Pech <[email protected]>
* improvements of "Export data to SD file" example written by Tim Dudgeon
* https://docs.chemaxon.com/display/docs/Simple+SDF+Exporter
*/
import
com.im.df.api.*
import
com.im.commons.progress.*
import
chemaxon.struc.Molecule
import
chemaxon.formats.MolExporter;
import
javax.swing.filechooser.FileFilter
import
javax.swing.JFileChooser
// -------------------------------- settings -------------------------------------
// define what fields to export
def FIELDS_FROM_PARENT = [
'Formula'
,
'Donors'
,
'Acceptors'
]
// define how the fields are going to be renamed (optional)
def FIELD_NAMES = [
'Donors'
:
'My Lovely Donors'
,
'Acceptors'
:
'My Ugly Acceptors'
]
// define the name of filed containing structure
def STRUCTURE_FIELD =
'Structure'
// ------------------- probably not needed to edit anything below ----------------
init = { widget ->
}
destroy = { widget ->
}
evaluate = { widget ->
// get to root entity
def ety = dataTree.rootVertex.entity
// assumes you have reference to the data tree
// get the ID field
def fldId = ety.idField
println
"Found ID field ${fldId.id}"
// get the Structure field
def molFld = ety.fields.items.find { it.name == STRUCTURE_FIELD }
println
"Found MOL field ${molFld.id}"
// Get resultsets
def rs = ety.schema.dataProvider.getDefaultResultSet(dataTree,
false
, DFEnvironmentRO.DEV_NULL)
// find the ResultSet
def rootVS = rs.getVertexState(dataTree.rootVertex)
// obtain the VertexState
List ids = rootVS.getSelectedRowsIds()
// get the IDs of the selection
// if you want to export all rows always, change the previous line to
// Lists ids = rootVS.ids
println
"Found ${ids.size} lines to export"
// data fields from parent
def fieldsFromParent = [ ]
FIELDS_FROM_PARENT.each { name ->
def fld = ety.fields.items.find { it.name == name }
if
(fld) {
fieldsFromParent << fld
println
"Found parent field ${fld.id} for $name"
}
else
{
println
"WARNING: field $name not found"
}
}
// lets choose location where to save the file (file format should be supported by https://docs.chemaxon.com/display/docs/Molecule+Formats)
def saveFileDialog =
new
JFileChooser(
dialogTitle:
"Choose save location"
,
fileSelectionMode: JFileChooser.FILES_ONLY)
saveFileDialog.showSaveDialog()
// get the full path where to save the file to
def FILE_NAME = saveFileDialog.getSelectedFile().getAbsolutePath()
// get the extension of the filename
def EXTENSION = FILE_NAME.lastIndexOf(
'.'
).with {it != -
1
? FILE_NAME.substring(it+
1
):
''
}
// lets read the data
def good =
0
def bad =
0
// and initialize exporter
// if you need simpler solution, then FILE_NAME and EXTENSION can be hardcoded
// and saveFileDialog above can be removed
// coud be used like this instead:
// def exporter = new MolExporter('C:\path\to\filename.sdf','sdf')
def exporter =
new
MolExporter(FILE_NAME, EXTENSION)
try
{
ids.each { id ->
try
{
def data = rootVS.getData([id], DFEnvironmentRO.DEV_NULL)
// get the mol
def mol = data[id][molFld.id]
// get the other fields
def values = [ : ]
fieldsFromParent.each {
values.put(it, data[id][it.id])
}
println
"Exporting ID $id"
def expMol
// work with a clone so we don't alter the original
if
(!mol || !mol.
native
) {
expMol =
new
Molecule()
}
else
{
expMol = mol.
native
.cloneMolecule()
}
values.each { k,v ->
if
(v !=
null
) {
def pName = (FIELD_NAMES[k.name] ==
null
? k.name : FIELD_NAMES[k.name])
expMol.setProperty(pName, v.toString())
}
}
exporter.write(expMol)
good++
}
catch
(Exception exc) {
println
"EROROR Failed to load ID $id ${exc.toString()}"
bad++
}
}
}
finally
{
exporter.flush()
exporter.close()
}
println
"Finished exporting data to file $FILE_NAME"
println
"good: $good bad: $bad"
}
on_change = { widget, button ->
}