能否获得一份可用于 DM 脚本中的文本注释的字体列表?

Can one get a list of fonts available for text annotations in DM scripting?

可以通过 NewTextAnnotation 函数在图像显示上创建文本注释,然后通过 ComponentSetFontFaceName 方法更改字体。然而,要成功做到这一点,必须以字符串形式提供所需字体的全名,并且必须已经知道它在当前系统上可用。如果指定了一种不可用的字体,似乎会选择某些默认字体,并且不会发布异常或错误消息。

是否有任何方法可以在 DM 脚本中获取可用字体列表或确定特定命名字体是否实际可用?

有趣的任务!

没有实际的脚本命令来执行此操作,已安装的字体名称列表由 OS 填充。

但是,使用 Powershell and the script command LaunchExternal() one can construct a workaround

经过反复试验,我想我可以通过以下脚本让它工作:

void WriteFontListToDisk( string fileName )
{
    String PSscript
    PSscript += "[System.Reflection.Assembly]::LoadWithPartialName('System.Drawing');"
    PSscript += "(New-Object System.Drawing.Text.InstalledFontCollection).Families "
    PSscript += " | out-file -encoding ASCII " + fileName           // Need to specify ASCII here!

    String callString
    callString += "powershell"
    //callString += " -NoExit"          // Keep Powershell open
    callString += " -Command &{ "
    callString += PSscript
    callString += " }"
    LaunchExternalProcess( callString, 5 )
}

TagGroup ReadFontListFromFile( string fileName )
{
    TagGroup tg = NewTagList()
    if ( !DoesFileExist( fileName ) ) Throw( "Font list file not found:\n" + fileName )
    number fileID = OpenFileForReading( fileName )
    object fileStream = NewStreamFromFileReference( fileID, 1 )
    result("\n SIZE:" + fileStream.StreamGetSize()  )
    // Output format is
    //  #1:(empty)
    //  #2: Name                                                                           
    //  #3: ----
    //  #4+: FontNames
    string line
    for( number i=0;i<3;i++) fileStream.StreamReadTextLine( 0, line )

    number inc = 0
    while( fileStream.StreamGetPos() != fileStream.StreamGetSize() )
    {
        if ( !fileStream.StreamReadTextLine( 0, line ) ) break;
        tg.TagGroupInsertTagAsString( Infinity(), line )
        if ( ShiftDown() ) exit(0)
    }

    return tg
}

TagGroup GetFontList()
{
    TagGroup tg = NewTagGroup()
    string fileName = "C:\FontNamesList.txt"
    if ( DoesFileExist( fileName ) ) DeleteFile( fileName )
    WriteFontListToDisk( fileName )
    tg = ReadFontListFromFile( fileName )
    if ( DoesFileExist( fileName ) ) DeleteFile( fileName )
    return tg
}

GetFontList().TagGroupOpenBrowserWindow( "Fonts" , 0 )

值得注意的是,默认情况下,PowerShell 将文本输出流式传输为 UNICODE,这不适用于 DM 中的文本导入。但是,this question 很有用,上面的脚本将输出设置为 ASCII。但有一个问题是,这样做可能会丢失一些字符,可能需要仔细检查输出字体列表。