Проверить шрифт и установить его

Автор Тема: Проверить шрифт и установить его  (Прочитано 9389 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
К примеру у меня есть файл в котором стиль текста ссылается на шрифт,
который не установлен в папке ..\Autocad\Fonst\
(использую API  acad 2012)

Хочу сделать так:

1) уведомить пользователя о том, что данный шрифт не установлен
    Выдать сообщение что шрифт с таким именем не установлен..
    Но для того чтобы уведомить пользователя, что со шрифта нет, мне же нужно это проверить.
    Как с помощью AutoCAD API проверить что шрифт не установлен?

2) Хорошим решением было бы по ходу работы AutoCAD загрузить 
    недостающий файл шрифта взяв его из заранее известного программе источника.

Прикрепляю картинку

У меня пока только одна идея - проверить существует ли файл шрифта на диске.
Код - vb.net [Выбрать]
  1. ...
  2. Dim txtSt As CAD_DBS.TextStyleTableRecord
  3. ...
  4. If File.Exists(txtSt.FileName) Then ' Если же FileName это полное имя файла нужно проверить
  5.    MsgBox("Файл шрифта " & txtSt.FileName & "не установлен.")
  6. End If




Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Проверить шрифт и установить его
« Ответ #1 : 08-01-2017, 14:08:18 »
Цитировать
Но для того чтобы уведомить пользователя, что со шрифта нет, мне же нужно это проверить.
    Как с помощью AutoCAD API проверить что шрифт не установлен?
Ну так проверь наличие файла в подкаталогах, указанных в Support File Search Path. "AutoCAD API" там и ищет. Можно и через реестр проверить: запись хранится в реестре, в ветке General твоего акадовского профиля, в параметре ACAD. Делаешь split по ';' и смотришь в порядке следования записей. Первая же найденная используется.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Проверить шрифт и установить его
« Ответ #2 : 08-01-2017, 14:22:42 »
На всякий случай акцентирую внимание на регистре букв в имени переменной, если будешь получать её значение при помощи acedGetEnv.

Отмечено как Решение Алексей (IdeaSoft) 08-01-2017, 16:20:30

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Проверить шрифт и установить его
« Ответ #3 : 08-01-2017, 15:14:47 »
2) Хорошим решением было бы по ходу работы AutoCAD загрузить
    недостающий файл шрифта взяв его из заранее известного программе источника.
Повторюсь:
Возможно если ты переопределишь для DwgHost метод FindFile так, чтобы он мог возвращать путь к файлу шрифта, а не пустую строку, то это может помочь.
Пример DwgHost: http://adndevblog.typepad.com/autocad/2012/05/fentons-recommended-hostapplicationservices-implementation-for-realdwg-net.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Проверить шрифт и установить его
« Ответ #4 : 08-01-2017, 15:52:53 »
Спасибо.
Сейчас попробую на основе этого примера (http://adndevblog.typepad.com/autocad/2012/05/fentons-recommended-hostapplicationservices-implementation-for-realdwg-net.html)
сделать.
У меня как получается. Если я делаю через без DwgHost, то шрифт вообще не находится.
Может система пытается найти shx-шрифт в папке ..\Windows\font, а shx-шрифта в ней нет.

У меня же цель задачи какая - мне стартовать интерфейс Autocad не нужно.
Нужно просто запустить exe-приложение, которое пробежится по базам перечня dwg-файлов
вот и для этого я и использую DwgHost.

« Последнее редактирование: 08-01-2017, 19:22:34 от Алексей (IdeaSoft) »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Проверить шрифт и установить его
« Ответ #5 : 08-01-2017, 15:54:50 »
У меня как получается. Если я делаю через без DwgHost, то шрифт вообще не находится.
Может система пытается найти shx-шрифт в папке ..\Windows\font, а shx-шрифта в ней нет.
А как он может найтись если он не знает пути к нему?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Проверить шрифт и установить его
« Ответ #6 : 08-01-2017, 16:27:02 »
А как он может найтись если он не знает пути к нему?

У меня получилось так.
1) при обращении к GeometricExtets() курсор отладчика переходит в функцию FindFile.
Вот фрагмент функции из предыдущей темы.
Код - C# [Выбрать]
  1. while (enu.MoveNext()) {
  2. DBObject obj = tr.GetObject(enu.Current, OpenMode.ForRead);
  3. if (obj is DBText)  {
  4. try {
  5. Extents3d Ext3d = (obj as DBText).GeometricExtents;
  6. }
  7. catch { }
  8. }
  9. }
где я должен вернуть полный путь шрифта
а параметр fileName передает мне не полное имя шрифта
и и мне остается подставить только путь к папке с фортами <PATH_FONT>
Код - C# [Выбрать]
  1.         public override string FindFile(string fileName, Database database, FindFileHint hint) {
  2.                 return <PATH_FONT> + fileName;
  3.         }
И мне остается только узнать и вернуть папку фонтов <PATH_FONT>.
Я сейчас пока жестко забил путь где установлен acad.
Пока все хорошо работает!

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Проверить шрифт и установить его
« Ответ #7 : 08-01-2017, 16:37:46 »
Мне пока не до конца понятно как это все устроено.
Но я пока понят так.
Если функция GeometricExtents нуждается в файле шрифта,
то она просит вернуть полное имя файла его через функцию FindFile(...)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Проверить шрифт и установить его
« Ответ #8 : 08-01-2017, 17:45:40 »
Если функция GeometricExtents нуждается в файле шрифта,
то она просит вернуть полное имя файла его через функцию FindFile(...)
Не только для GeometricExtents. В любом случае если AutoCAD нужен файл (в том числе и шрифта или формы), путь к которому он не знает, то вызывается функция обратного вызова (callback) FindFile. Тоже самое будет и со сложными типами линий, у которых используется файл шрифта/формы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Проверить шрифт и установить его
« Ответ #9 : 08-01-2017, 18:58:55 »
Я проверил в отладчике.

Попадаю в FindFile только один раз, когда файл не найден.
Т.е. получается, что FindFile вызывается когда нужно найти файл.
После того как файл будет найден функция более не вызывается.

Это также работает и для файлов ссылок и для
прикрепленных растровых изображений по ссылкам и прочих случаев.
Ну в принципе в предложенном тобой примере это видно,
как анализируются расширения файлов.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Проверить шрифт и установить его
« Ответ #10 : 08-01-2017, 19:22:16 »
Только вот в приведенном примере
 (http://adndevblog.typepad.com/autocad/2012/05/fentons-recommended-hostapplicationservices-implementation-for-realdwg-net.html)
Не совсем понятно зачем делать проверку 

if (fileName.Contains(".") == false)

Что может быть случай, когда аргумент FileName
функции FindFile вернет имя без расширения файла?

В моем случае сразу аргумент FileName передался c расширением ****.shx

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Проверить шрифт и установить его
« Ответ #11 : 08-01-2017, 23:09:38 »
Что может быть случай, когда аргумент FileName
функции FindFile вернет имя без расширения файла?
Может.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение