能否获得一份可用于 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。但有一个问题是,这样做可能会丢失一些字符,可能需要仔细检查输出字体列表。
可以通过 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。但有一个问题是,这样做可能会丢失一些字符,可能需要仔细检查输出字体列表。