Search code examples
dm-script

How could I open more than one image with a single dialog in Digital Micrograph script?


I am writing in DigialMicrograph scripting. I want a script to open more than one image in a single dialog, a multi-select image dialog, similar to when you go to any Windows open dialog, select several images and press Ok.

I think that this is possible but I haven't found a way to do it. I want to introduce this specific code in my script, to avoid image-opening prior to running the script.

I know the function OpenDialog but this only allows opening of a single image. Could anybody show me some script or a function which can help me further?

Thanks.


Solution

  • What you are asking for might be a bit more involved. There is no multiple open function in the scripting language, so you can only create it yourself, involving multiple steps:

    • An input for a base-folder (This you could prompt the user for with a GetDirectoryDialog dialog)
    • Using the command GetFilesInDirectory to retrieve a list (TagList) of files in that folder
    • Process that list to filter out what you are interested in
    • Build a custom-dialog (derived from UIFrame) which lists the files with either checkboxes, multiple drop-down menus, or a list-box to select from.
    • Act on the selection made in your custom dialog, i.e. open all those files

    The following script is an example doing that.

    class MyMultiSelect : UIframe
    {
        string root
        TagGroup FileList
        TagGroup DLGlist
    
        TagGroup CreateDLG( object self )
        {
            TagGroup dlg,dlgitems
            dlg = DLGCreateDialog( "MultiOpen", dlgItems )
    
            number nMax = fileList.TagGroupCountTags();
            TagGroup listitems
            DLGlist = DLGCreateList( listitems, 90, nMax+1 )
            DLGlist.DLGMultipleSelect(1)
            for (number i=0; i<nMax; i++)
            {
                string name
                if ( FileList.TagGroupGetIndexedTagAsString(i,name) )
                        listitems.DLGAddListItem( name, 0 )
            }
    
            dlgitems.DLGAddElement(DLGlist)
            return dlg
        }
    
        TagGroup CreateFilteredFileList( object self )
        {
            // Get all files
            TagGroup list = GetFilesInDirectory( root, 1 )
            // Filter all DM3 files
            TagGroup filtered = NewTagList() 
            for( number i = 0; i<list.TagGroupCountTags(); i++)
            {
                TagGroup entry
                string file = ""
                list.TagGroupGetIndexedTagAsTagGroup(i,entry)
                entry.TagGroupGetTagAsString( "Name", file )
                if ( -1 != find(file,".dm3") )
                    filtered.TagGroupInsertTagAsString(Infinity(),file)
            }
            return filtered
        }
    
        TagGroup GetSelectedList( object self )
        {
            TagGroup selList = NewTagList()
            TagGroup itemList
            DLGlist.TagGroupGetTagAsTagGroup( "Items", itemList )
            for ( number i=0; i<itemList.TagGroupCountTags(); i++ )
            {
                number isSelected = 0
                TagGroup entry
                itemList.TagGroupGetIndexedTagAsTagGroup(i,entry)
                entry.TagGroupGetTagAsBoolean( "Selected", isSelected )
                if ( isSelected )
                {
                    string filename
                    entry.TagGroupGetTagAsString( "Label", fileName )
                    selList.TagGroupInsertTagAsString( Infinity(),fileName)
                }
            }
            return selList
        }
    
        void OpenSelectedFiles( object self )
        {
            TagGroup files = self.GetSelectedList()
            number nFiles = files.TagGroupCountTags()
            if ( 0 == nFiles )
                Throw( "No files selected" )
    
            Result( "\n Opening "+nFiles+" files now..")
            for ( number i=0; i<nFiles; i++ )
            {
                string filename
                files.TagGroupGetIndexedTagAsString(i,fileName)
                string path = root + "\\" + filename
                Result( "\n Opening: "+path)
                OpenImage(path).ShowImage()
            }
        }
    
        Object Init( object self, string rootInput )
        {
            root = rootInput
            FileList = self.CreateFilteredFileList( )
            return self.super.Init( self.CreateDLG() )
        }
    }
    
    // Main
    {
        string rootDir
        GetDirectoryDialog( NULL, "Select Folder from which to multi-open", GetApplicationDirectory("current",0), rootDir )
        object dlg = Alloc(MyMultiSelect).Init(rootDir)
        dlg.pose()
        dlg.OpenSelectedFiles()
    }