2016-12-12 10 views
1

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

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

+0

Хороший вопрос! Я не знаю, какая команда скриптов выполняет то, что вам нужно, но, насколько мне известно, список «доступных» шрифтов такой же, как если бы вы щелкнете правой кнопкой мыши текстовую аннотацию и посмотрите, что вы видите шрифты. Список заполняется ОС. – BmyGuest

+1

Если вам нужно систематически получить доступ к списку, вы можете создать себе вспомогательный метод, используя команду LaunchExternal() вместе с f.e. Powershell. Это может быть [полезное чтение] (http://superuser.com/a/760632/544823) – BmyGuest

+0

Большое спасибо за отличный совет. Я рассмотрю это. –

ответ

1

Интересное задание!

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

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

+0

Это отличное введение в использование скриптов PowerShell из DM. Спасибо, что предоставили полный пример! –