如何在数码显微照片脚本中使用一个对话框打开多个图像?

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

我正在用 DigialMicrograph 脚本编写。我想要一个脚本在一个对话框中打开多个图像,一个多select图像对话框,类似于你去任何Windows打开对话框,select几个图像并按下好的。

我认为这是可能的,但我还没有找到实现它的方法。我想在我的脚本中引入这个特定的代码,以避免在运行脚本之前打开图像。

我知道 OpenDialog 函数,但这只允许打开单个图像。谁能告诉我一些可以进一步帮助我的脚本或函数?

谢谢。

您要求的内容可能涉及更多。脚本语言中没有多开功能,只能自己创建,涉及多个步骤:

  • 基本文件夹的输入(您可以使用 GetDirectoryDialog 对话框提示用户输入)
  • 使用命令 GetFilesInDirectory 检索该文件夹中文件的列表 (TagList)
  • 处理该列表以过滤出您感兴趣的内容
  • 构建自定义对话框(派生自 UIFrame),其中列出带有复选框、多个下拉菜单或列表框的文件 select从。
  • 对自定义对话框中的 selection 进行操作,即打开所有这些文件

以下脚本是执行此操作的示例。

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