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 <dpech@chemaxon.com>
    * 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 o\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 ->
    
    }