| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP получить список установленных в системе (векторных) шрифтов или хотя бы узнать, установлен ли указанный

LISP получить список установленных в системе (векторных) шрифтов или хотя бы узнать, установлен ли указанный

Ответ
Поиск в этой теме
Непрочитано 08.02.2011, 10:35 #1
LISP получить список установленных в системе (векторных) шрифтов или хотя бы узнать, установлен ли указанный
Ax3
 
Programming, automation, CADs, GISs. "Теплоком"
 
Россия, Санкт-Петербург
Регистрация: 02.02.2007
Сообщений: 306

Уточнение: речть только про шрифты .ttf.

Привет, братья по каду.
Предыстория вопроса.
Задался целью сделать пользователям автоматическую установку векторных шрифтов, нехватка которых определяется при открытии чертежа.
Программа работает следующим образом.
В открытом чертеже просматриваются текстовые стили, имеющиеся в чертеже. Выделяются те из них, в которых прописан векторный (.ttf) шрифт.
Далее требуется определить, установлен ли данный .ttf-шрифт в системе.
Вариантов вижу два.
1. Получить список установленных в системе .ttf-шрифтов и на его основе определить, установлен ли интересующий.
2. Просто "спросить" кад или систему: "Дорогой/Дорогая, а не установлен ли у нас в системе шрифт Times New Roman из файлика times.ttf, а?"

Пока пошёл по 1-му варианту, причём выкрутился следующим образом. Запускаю "перечислитель" шрифтов, который просматривает все .ttf-файлы в папке Windows\Fonts, извлекает из них имена шрифтов и складывает всё в текстовый файлик. Затем просматриваю этот файлик, и если интересующий меня шрифт там не обнаружен - ситаю, что он не установлен.
Ну и далее требуемый шрифт берётся из определённой папки и устанавливатся (копированием в папку Fonts, впрочем, детали установки уже не важны).

Минусы моего решения очевидны:
1. Очень долго работает "перечислитель" шрифтов.
2. Нахождение .ttf-файла с нужным шрифтом в папке Windows\Fonts, строго говоря, не гарантирует, что он установлен.
3. .ttf-шрифт может быть установлен в системе, однако файл этого шрифта может лежать не в %windir%\Fonts, а где-нибудь на D:\разные_дурацкие_шрифты_для_винды.

Отсюда вопрос, озвученный в названии темы. То есть можно ли по-нормальному, программно (из LISP), запросить у системы (или када?) либо список установленных в системе .ttf-шрифтов, либо хотя бы узнать, установлен ли, например, шрифт Times New Roman? Либо как-то узнать уже у када, что интересующий шрифт не найден и вместо него использовано что-то другое/не использовано ничего.

П.С.
Гуглил вопрос, нашёл решения на C++, полагаю, на ARX должно получиться. Но хотелось бы в LISP.
П.С.2
Устанавливать ВСЕ шрифты прошу не предлагать, так как понятие ВСЕ слишком растяжимое и варьируется постоянно. А ВСЕ шрифты мира ставить утомительно.

Буду благодарен за любые (кроме П.С.2) предложения.
Всем успехов в работе.

П.С.3
Да, забыл объяснить, зачем "перечислитель".
Дело в том, что свойство 'fontfile текстового стиля иногда бывает пустым, то есть рассчитывать на то, что в описании стиля будет указан файл шрифта, бессмысленно.

П.С.4
Тему http://forum.dwg.ru/showthread.php?t...E8%F4%F2%EE%E2 смотрел, но там обсуждение остановилось как раз на самом интересном месте.
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 08.02.2011 в 12:33.
Просмотров: 7515
 
Непрочитано 08.02.2011, 11:00
#2
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Лично мой алгоритм (если забыть про штатные средства):
1. Пройтись по всем текстовым стилям файла, включая стили внешних ссылок.
2. Пройтись по всем объектам MTEXT и ACAD_TABLE, проверяя принудительное назначение шрифтов в них.
3. Пройтись по всем описаниям типов линий, проверяя для них используемые стили.
4. Объединить полученные списки, исключая дубликаты. По ходу дела использовать (findfile).
P.S. А почему б не использовать _.checkstandards? Это ж самое простое решение!
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 08.02.2011, 11:39
#3
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


>> Лиспер
1. Что искать функцией (findfile), если в свойстве 'fontfile текстового стиля пусто?
2. Ещё раз. Нахождение файла вовсе не гарантирует, что соотв. шрифт установлен.
3. Если файл шрифта лежит не в %windir\Fonts% - что тогда? Где искать?

Насчёт checkstandards. А не мог ли бы ты вкратце подсказать, как её применить к данному вопросу? Я с ней вообще не сталкивался.

Благодарю за отклик.
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 08.02.2011, 11:45
#4
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Цитата:
Сообщение от Ax3 Посмотреть сообщение
в свойстве 'fontfile текстового стиля пусто
Это как это? Можно образец? Мне просто интересно...
Цитата:
Сообщение от Ax3 Посмотреть сообщение
Нахождение файла
Уточню: если файл shx находится через (findfile), то его устанавливать не надо. Эти файлы не требуют установки.
Цитата:
Сообщение от Ax3 Посмотреть сообщение
Если файл шрифта лежит не в %windir\Fonts% - что тогда? Где искать
Выполни (findfile "simplex.shx") - найдется?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 08.02.2011, 11:51
#5
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Не-не! Я не про .shx вообще говорю, а про .ttf-ы!
Образец щас найду.
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 08.02.2011, 11:55
#6
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Упс, переклинило... Звиняй, кореш, фигня получилася. (с)
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 08.02.2011, 12:17
#7
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Да все нормуль. В заголовке уточнил, дабы не смущать народ. Спасибо, что обратил внимание на неточность формулировки :-)

Вот файл:
Иллюстрация пустого 'fontfile (Line_GUGK)_v1.00_исп.Данилов А.С._2011.02.08.dwg
Вот программка, пролистывающая свойства текстовых стилей чертежа:
textstyles_list.lsp

Вот что получаем для стиля Line_GUGK:
font: "BM431"
fontfile: ""

В отличие от другого стиля:
"Schemes_style"
"font name:"
"Courier New"
"font file:"
"COUR.TTF"
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 08.02.2011 в 12:34.
Ax3 вне форума  
 
Непрочитано 08.02.2011, 12:39
1 | #8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Обрати внимание на ветки реестра:
Код:
[Выделить все]
1) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts 
2) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes
3) HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\RXX.X\ACAD-YYYY:YYY\AltFontNames
В первой из веток список установленных в системе ttf-шрифтов (в XP, в Vista и Win7 возможно несколько иначе)
Александр Ривилис вне форума  
 
Непрочитано 08.02.2011, 12:41
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Ax3 Посмотреть сообщение
Тему http://forum.dwg.ru/showthread.php?t...E8%F4%F2%EE%E2 смотрел, но там обсуждение остановилось как раз на самом интересном месте.
Посмотри эту тему
Список всех шрифтов:
Код:
[Выделить все]
(vlax-for item
               (vla-get-textstyles
                 (vla-get-activedocument (vlax-get-acad-object))
               ) ;_ end of vla-get-textstyles
  (setq fname (vl-string-trim "\" \t\n" (vla-get-fontfile item)))
  (if (not
        (vl-filename-extension fname) ;_ end of vl-filename-extension
      ) ;_ end of not
    (setq fname (strcat fname ".shx"))
  ) ;_ end of if
  (terpri)
  (princ fname)
) ;_ end of vlax-for
Цитата:
Сообщение от Ax3 Посмотреть сообщение
Не-не! Я не про .shx вообще говорю, а про .ttf-ы!
ttf так же можно поискать в системной папке
Код:
[Выделить все]
(defun mip-get-special-folder (folder / WS ret)
;;; Функция для определения одной из "специальных папок" Windows
;;; folder может быть:
;;; "AllUsersDesktop" - Windows 2000, Windows XP
;;; "AllUsersStartMenu" - Windows 2000, Windows XP
;;; "AllUsersPrograms" - Windows 2000, Windows XP
;;; "AllUsersStartup" - Windows 2000, Windows XP
;;; "Desktop" - Windows 98/ME, Windows 2000, Windows XP
;;; "Favorites" - Windows 98/ME, Windows 2000, Windows XP
;;; "Fonts" - Windows 98/ME, Windows 2000, Windows XP
;;; "MyDocuments" - Windows 98/ME, Windows 2000, Windows XP
;;; "NetHood" - Windows 98/ME, Windows 2000, Windows XP
;;; "PrintHood" - Windows 98/ME, Windows 2000, Windows XP
;;; "Programs" - Windows 98/ME, Windows 2000, Windows XP
;;; "Recent" - Windows 98/ME, Windows 2000, Windows XP
;;; "SendTo" - Windows 98/ME, Windows 2000, Windows XP
;;; "StartMenu" - Windows 98/ME, Windows 2000, Windows XP
;;; "Startup" - Windows 2000, Windows XP
;;; "Templates" - Windows 2000, Windows XP
;;; Возвращает или путь, или ""
;;; Пример:
;;;  (mip-get-special-folder "Startup")
(vl-load-com)
  (and
    (setq WS (vlax-get-or-create-object "WScript.Shell"))
    (setq ret (vlax-invoke-method (vlax-get-property WS "SpecialFolders") "Item" folder))
    (vlax-release-object ws)
    )
  ret
);defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 08.02.2011, 14:11
#10
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


>> Александр Ривилис.
Спасибо!!!!!!!!!!!!!!!!!!!

П.С. Даже в голову не приходило, что может быть так просто.
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 08.02.2011 в 14:16.
Ax3 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP получить список установленных в системе (векторных) шрифтов или хотя бы узнать, установлен ли указанный

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47