Можно ли получить список шрифтов, доступных для текстовых аннотаций в сценариях DM?

Можно создавать текстовые аннотации на изображениях с помощью функции NewTextAnnotation, а затем изменять шрифт с помощью метода ComponentSetFontFaceName. Однако для того, чтобы сделать это успешно, необходимо указать полное имя желаемого шрифта в виде строки, и уже должно быть известно, что он доступен в текущей системе. Если указать недоступный шрифт, кажется, что выбран какой-то шрифт по умолчанию, и сообщение об исключении или ошибке не публикуется.

Есть ли способ получить список доступных шрифтов в сценарии DM или определить, действительно ли доступен определенный именованный шрифт?


person Mike Kundmann    schedule 12.12.2016    source источник
comment
Хороший вопрос! Я не знаю ни одной скриптовой команды, выполняющей то, что вам нужно, но, насколько мне известно, список доступных шрифтов такой же, как если бы вы щелкнули правой кнопкой мыши текстовую аннотацию и проверили раскрывающийся список шрифтов. Список заполняется ОС.   -  person BmyGuest    schedule 12.12.2016
comment
Если вам нужно систематически попасть в список, вы можете создать вспомогательный метод, используя команду LaunchExternal() вместе с f.e. силовая оболочка. Это может быть полезным чтением   -  person BmyGuest    schedule 12.12.2016
comment
Большое спасибо за отличный совет. Я посмотрю на это.   -  person Mike Kundmann    schedule 13.12.2016
comment
Еще одна очевидная вещь: вы можете легко комбинировать ComponentSetFontFaceName и ComponentGetFontFaceName, чтобы убедиться, что установка шрифта прошла успешно, и действовать соответствующим образом. Но я уверен, что вы сами об этом думали ;c)   -  person BmyGuest    schedule 13.12.2016
comment
Да, я пробовал это, но кажется, что можно изменить номинальный шрифт текстовой аннотации, даже если этот шрифт недоступен. DM просто отображает любую такую ​​текстовую аннотацию шрифтом по умолчанию, который может быть первым в системном списке или всегда Arial.   -  person Mike Kundmann    schedule 13.12.2016


Ответы (1)


Интересная задача!

Для этого нет реальной команды сценария, и список установленных имен шрифтов заполняется ОС.

Однако с помощью Powershell и команды сценария LaunchExternal() можно создать обходной путь.

После некоторых проб и ошибок я думаю, что у меня это работает по следующему сценарию:

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. Однако этот вопрос был полезен, и приведенный выше сценарий устанавливает вывод в ASCII. Одна проблема заключается в том, что при этом некоторые символы могут быть потеряны, и может потребоваться тщательная проверка выходного списка шрифтов.

person BmyGuest    schedule 12.12.2016
comment
Это отличное введение в использование сценариев PowerShell из DM. Спасибо за полный пример! - person Mike Kundmann; 13.12.2016