1

我正在用 DigialMicrograph 脚本编写。我想要一个脚本在一个对话框中打开多个图像,一个多选图像对话框,类似于当您转到任何 Windows 打开对话框时,选择多个图像并按确定。

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

我知道该功能OpenDialog,但这仅允许打开单个图像。有人可以给我看一些可以进一步帮助我的脚本或功能吗?

谢谢。

4

1 回答 1

1

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

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

下面的脚本就是一个例子。

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()
}
于 2015-01-04T17:28:15.717 回答