How could I open more than one image with a single

2019-03-03 09:30发布

问题:

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.

回答1:

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()
}


标签: dm-script