Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 08-01-2017, 14:04:48

Название: Проверить шрифт и установить его
Отправлено: Алексей (IdeaSoft) от 08-01-2017, 14:04:48
К примеру у меня есть файл в котором стиль текста ссылается на шрифт,
который не установлен в папке ..\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



Название: Re: Проверить шрифт и установить его
Отправлено: Андрей Бушман от 08-01-2017, 14:08:18
Цитировать
Но для того чтобы уведомить пользователя, что со шрифта нет, мне же нужно это проверить.
    Как с помощью AutoCAD API проверить что шрифт не установлен?
Ну так проверь наличие файла в подкаталогах, указанных в Support File Search Path. "AutoCAD API" там и ищет. Можно и через реестр проверить: запись хранится в реестре, в ветке General твоего акадовского профиля, в параметре ACAD. Делаешь split по ';' и смотришь в порядке следования записей. Первая же найденная используется.
Название: Re: Проверить шрифт и установить его
Отправлено: Андрей Бушман от 08-01-2017, 14:22:42
На всякий случай акцентирую внимание на регистре букв (http://adn-cis.org/forum/index.php?topic=7113.msg20678#msg20678) в имени переменной, если будешь получать её значение при помощи acedGetEnv (http://adn-cis.org/forum/index.php?topic=7267.msg21812#msg21812).
Название: Re: Проверить шрифт и установить его
Отправлено: Александр Ривилис от 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
Название: Re: Проверить шрифт и установить его
Отправлено: Алексей (IdeaSoft) от 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.

Название: Re: Проверить шрифт и установить его
Отправлено: Александр Ривилис от 08-01-2017, 15:54:50
У меня как получается. Если я делаю через без DwgHost, то шрифт вообще не находится.
Может система пытается найти shx-шрифт в папке ..\Windows\font, а shx-шрифта в ней нет.
А как он может найтись если он не знает пути к нему?
Название: Re: Проверить шрифт и установить его
Отправлено: Алексей (IdeaSoft) от 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.
Пока все хорошо работает!
Название: Re: Проверить шрифт и установить его
Отправлено: Алексей (IdeaSoft) от 08-01-2017, 16:37:46
Мне пока не до конца понятно как это все устроено.
Но я пока понят так.
Если функция GeometricExtents нуждается в файле шрифта,
то она просит вернуть полное имя файла его через функцию FindFile(...)
Название: Re: Проверить шрифт и установить его
Отправлено: Александр Ривилис от 08-01-2017, 17:45:40
Если функция GeometricExtents нуждается в файле шрифта,
то она просит вернуть полное имя файла его через функцию FindFile(...)
Не только для GeometricExtents. В любом случае если AutoCAD нужен файл (в том числе и шрифта или формы), путь к которому он не знает, то вызывается функция обратного вызова (callback) FindFile. Тоже самое будет и со сложными типами линий, у которых используется файл шрифта/формы.
Название: Re: Проверить шрифт и установить его
Отправлено: Алексей (IdeaSoft) от 08-01-2017, 18:58:55
Я проверил в отладчике.

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

Это также работает и для файлов ссылок и для
прикрепленных растровых изображений по ссылкам и прочих случаев.
Ну в принципе в предложенном тобой примере это видно,
как анализируются расширения файлов.
Название: Re: Проверить шрифт и установить его
Отправлено: Алексей (IdeaSoft) от 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
Название: Re: Проверить шрифт и установить его
Отправлено: Александр Ривилис от 08-01-2017, 23:09:38
Что может быть случай, когда аргумент FileName
функции FindFile вернет имя без расширения файла?
Может.