Создание и настройка текстового стиля с ttf-шрифтом (ACAD2013)

Автор Тема: Создание и настройка текстового стиля с ttf-шрифтом (ACAD2013)  (Прочитано 2622 раз)

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

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

Онлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 811
  • Карма: 132
Увы и ах, понадобилось работать в ACAD2013 SP2 Eng / Rus, другой для этой задачи нет и не предвидится. Надо создать текстовый стиль, использующий ttf-шрифт. Шрифт гарантированно установлен в системе. Использую код из официальной документации:
Код - C# [Выбрать]
  1.     [CommandMethod("UpdateTextFont")]
  2.     public static void UpdateTextFont()
  3.     {
  4.       // Get the current document and database
  5.       Document acDoc = Application.DocumentManager.MdiActiveDocument;
  6.       Database acCurDb = acDoc.Database;
  7.       // Start a transaction
  8.       using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  9.       {
  10.         // Open the current text style for write
  11.         TextStyleTableRecord acTextStyleTblRec;
  12.         acTextStyleTblRec = acTrans.GetObject(acCurDb.Textstyle, OpenMode.ForWrite) as TextStyleTableRecord;
  13.         // Get the current font settings
  14.         Autodesk.AutoCAD.GraphicsInterface.FontDescriptor acFont;
  15.         acFont = acTextStyleTblRec.Font;
  16.         // Update the text style's typeface with "PlayBill"
  17.         Autodesk.AutoCAD.GraphicsInterface.FontDescriptor acNewFont;
  18.         acNewFont = new Autodesk.AutoCAD.GraphicsInterface.FontDescriptor("Arial", acFont.Bold, acFont.Italic, acFont.CharacterSet, acFont.PitchAndFamily);
  19.         acTextStyleTblRec.Font = acNewFont;
  20.         acDoc.Editor.Regen();
  21.         // Save the changes and dispose of the transaction
  22.         acTrans.Commit();
  23.       }
  24.     }
Со страницы https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-ActiveX/files/GUID-DB668114-2395-43C6-858C-2F2514C4BF46-htm.html нашел примерные описания CharacterSet и PitchAndFamily (в ObjectARX SDK 2013 смотрел, но не обнаружил - может, плохо искал):
Код - Visual Basic [Выбрать]
  1. ' CharSet parameter
  2. Public Const ANSI_CHARSET = 0
  3. Public Const DEFAULT_CHARSET = 1
  4. Public Const SYMBOL_CHARSET = 2
  5. Public Const SHIFTJIS_CHARSET = 128
  6. Public Const OEM_CHARSET = 255
  7.  
  8. ' Pitch Values
  9. Public Const DEFAULT_PITCH = 0
  10. Public Const FIXED_PITCH = 1
  11. Public Const VARIABLE_PITCH = 2
  12. ' Family Values
  13. Public Const FF_DONTCARE = 0    '  Don't care or don't know.
  14. Public Const FF_ROMAN = 16      '  Variable stroke width, serifed.
  15. Public Const FF_SWISS = 32      '  Variable stroke width, sans-serifed.
  16. Public Const FF_MODERN = 48     '  Constant stroke width, serifed or sans-serifed.
  17. Public Const FF_SCRIPT = 64     '  Cursive, etc.
  18. Public Const FF_DECORATIVE = 80 '  Old English, etc.
  19. ' TrueType Flag
  20. Public Const TMPF_TRUETYPE = &H4 ' c# -> 0x4
Во-первых, я не очень понимаю, как высчитывается значение PitchAndFamily: в момент отладки значение от "исходного шрифта" равно 34. Это как? 32+2? А как же флаг TrueType?
И, во-вторых - и это самое главное! - если после UpdateTextFont вызывать окно настроек текстовых стилей, то ACAD тупо валится:
Сигнатура проблемы:
  Имя события проблемы: APPCRASH
  Имя приложения: acad.exe
  Версия приложения: 25.0.204.0
  Отметка времени приложения: 516ce058
  Имя модуля с ошибкой: heidi11.dll
  Версия модуля с ошибкой: 11.0.55.0
  Отметка времени модуля с ошибкой: 4f3088ec
  Код исключения: c000041d
  Смещение исключения: 00000000000319c5
  Версия ОС: 6.1.7601.2.1.0.256.48
  Код языка: 1049
  Дополнительные сведения 1: fb82
  Дополнительные сведения 2: fb82fab4641f8439d656a778ac384a64
  Дополнительные сведения 3: a2f4
  Дополнительные сведения 4: a2f482d8614c21cbae37285e17491eff
Что и в каком месте я делаю не так? К сожалению, самостоятельно мозгов не хватает разобраться.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 9696
  • Карма: 1241
  • Рыцарь ObjectARX
  • Skype: rivilis
Исходный шрифт был TTF?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 811
  • Карма: 132
Да, именно. Предварительно вызывал настройку, на оба текстовых стиля (Standard, Annonative) устанавливал Arial.ttf.
Могу привести скриншоты, если они помогут.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 9696
  • Карма: 1241
  • Рыцарь ObjectARX
  • Skype: rivilis
Да, именно. Предварительно вызывал настройку, на оба текстовых стиля (Standard, Annonative) устанавливал Arial.ttf.
Могу привести скриншоты, если они помогут.
Т.е. в принципе код у тебя ничего не делал, т.к. шрифт не менялся?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 9696
  • Карма: 1241
  • Рыцарь ObjectARX
  • Skype: rivilis
Специально проверил в той же версии AutoCAD (сначала проверял в версии 2020). Ошибка не воспроизводится. Записал видео:
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 811
  • Карма: 132
Я планировал использовать аналогичный код в реакторах. Что не воспроизводится - верю. Сейчас при запуске отладки из-под студии ACAD даже до загрузки сборки уже выдает ошибку при вызове команды _.style. Да что же я не так делаю?!
Может, проблема вообще не в коде, а в настройках проекта / студии? Проект приложил на всякий случай. Хотя вроде бы раньше все по аналогичным настойкам прекрасно работало...
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 9696
  • Карма: 1241
  • Рыцарь ObjectARX
  • Skype: rivilis
Честно говоря в чем у тебя проблема не знаю, но у меня и твой пример прекрасно отрабатывает (пришлось только поменять пути к ObjectARX SDK 2013).
Возможно отличие в опциях отладчика:


Но код ошибки у тебя какой-то уж очень странный.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 9696
  • Карма: 1241
  • Рыцарь ObjectARX
  • Skype: rivilis
Я планировал использовать аналогичный код в реакторах.
??? И что же это будет?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 811
  • Карма: 132
Да, похоже, проблема именно в Managed Compatibilty Mode - оказывается, я его не поменял...
И что же это будет?
Это будет дикий микс лиспа (на котором работает по нескольку человек) и NET (который пока что использую только я). Пару своих проектов постепенно пытаюсь перевести на NET. А останавливать их мне никто не даст. Вот и приходится работать "кусками" ;) Ничего, "курочка по зернышку" ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 9696
  • Карма: 1241
  • Рыцарь ObjectARX
  • Skype: rivilis
Это будет дикий микс лиспа...
Я вообще-то не об этом, а об изменении шрифта в текстовом стиле в реакторе, да еще и с запуском REGEN...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 811
  • Карма: 132
Regen оставлен только для полной идентичности исходного кода. Естественно, в реале я его отключу. Это просто кусок стандартизации - пользователи отказываются работать в едином ключе добровольно, вот и приходится извращаться...
P.S. Александр, а насчет кодов CharacterSet и PitchAndFamily - где еще можно найти информацию? А то имеющаяся как-то вызывает у меня сомнения в ее корректности.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 9696
  • Карма: 1241
  • Рыцарь ObjectARX
  • Skype: rivilis
P.S. Александр, а насчет кодов CharacterSet и PitchAndFamily - где еще можно найти информацию? А то имеющаяся как-то вызывает у меня сомнения в ее корректности.
Ну вообще-то это стандартные параметры при создании шрифта в Windows: https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/nf-wingdi-createfonta
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • ****
  • Сообщений: 290
  • Карма: 45
если после UpdateTextFont вызывать окно настроек текстовых стилей, то ACAD тупо валится:
В коде нет DocumentLock, возможно он необходим, если меняется отображение всех объектов через стиль?

Отмечено как Решение Алексей Кулик 13-06-2019, 20:29:17

Оффлайн Привалов Дмитрий

  • ADN Club
  • ****
  • Сообщений: 290
  • Карма: 45
acNewFont = new Autodesk.AutoCAD.GraphicsInterface.FontDescriptor("Arial", acFont.Bold, acFont.Italic, acFont.CharacterSet, acFont.PitchAndFamily);

1. Проверил у себя в 2010. Без DocumentLock все отработало и обновилось. Но я бы попробовал добавить.

2. Еще бы я проверил Arial на твоей машине. Возможно он не поддерживает Bold и Italic. Поддержка может быть в одном файле или нескольких.У меня в XP в папке Windows/fonts (arial.ttf, arialbd.ttf, arialbi.ttf, ariali.ttf) т.е. возможно отсутствуют или повреждены файлы arialbd.ttf, arialbi.ttf, ariali.ttf.

3. Возможно мешают реакторы плагинов для текста или стиля, например в Lisp коде. Можно создать пустой профиль, установить, перезапустить AutoCAD и проверить в нем.

Онлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 811
  • Карма: 132
Ага, попробую, спасибо!
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 9696
  • Карма: 1241
  • Рыцарь ObjectARX
  • Skype: rivilis
В коде нет DocumentLock, возможно он необходим, если меняется отображение всех объектов через стиль?
Для модальной команды он не обязателен (модальная команда сама выполняет блокировку документа). А вот в реакторе точно будет нужен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2054
  • Карма: 528
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Это просто кусок стандартизации - пользователи отказываются работать в едином ключе добровольно, вот и приходится извращаться...
Раз есть возможность загрузить этот код на ПК пользователя, значит, есть к нему админский доступ и какой-то пакет приложений устанавливается. А значит, ничто не мешает добавить в этот пакет файл-шаблон DWG или DWT с уже настроенным стилем и при необходимости просто копировать стиль в чертёж из этого шаблона. Мне кажется, это надёжнее и проще, нет?

Оффлайн Привалов Дмитрий

  • ADN Club
  • ****
  • Сообщений: 290
  • Карма: 45
просто копировать стиль в чертёж из этого шаблона. Мне кажется, это надёжнее и проще, нет?
Предполагаю, что не подойдет, т.к. в коде меняется текущий стиль, т.е. имя заранее неизвестно.

Из шаблона в целом правильнее, если много всего копируешь,  стили, блоки, слои и т.д. но если речь о мелкой вещи, как создать один текстовый стиль или слой, то быстрее программно, чем считать целый чертеж, ради чтения 10 строчек информации из него.

Онлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 811
  • Карма: 132
Пользователь в любой момент может поменять настройки, и повторное тупое копирование (по крайней мере с использованием lisp) не срабатывает. А есть еще размерные стили, которые на Lisp создавать - вообще нечто за гранью добра и зла.
Задача состоит в том, чтобы настройки стиля были неизменны со стороны пользователя. Думаю вечером еще посидеть, поиграться - посмотрю, что получится.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2054
  • Карма: 528
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Я не настаиваю, просто предложил  ;)
Просто я уже неоднократно именно так и делал - прикреплял к приложению чертёж-шаблон и оттуда таскал нужные стили, блоки и т.п. Копаться с их программным созданием и вылавливать все возможные в этом случае ошибки мне лень :) Да и в случае, например, с динамическими блоками - это единственный рабочий вариант.

Онлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 811
  • Карма: 132
Дин.блоки - не спорю. Но стили уж хочется самостоятельно сделать ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Привалов Дмитрий

  • ADN Club
  • ****
  • Сообщений: 290
  • Карма: 45
Я не настаиваю, просто предложил 
И правильно предложил. Вообще общие рекомендации поменьше свойств зашивать в код, а выносить в файлы настроек, шаблонов и т.д.
Просто если задача стоит при открытии каждого чертежа заменить текущий стиль, тут скорость открытия файла может быть приоритетнее.

Задача состоит в том, чтобы настройки стиля были неизменны со стороны пользователя.
Звучит страшновато. По идее нужно проверить и изменить стили, а потом начать перехватывать и прерывать события, переменные и команды. И так-то AutoCAD периодически вылетает и пользователи жалуются, не будет ли хуже?

Оффлайн Владимир Шу

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 109
    • ПГСу Бложик
Но стили уж хочется самостоятельно сделать
А завтра нужно будет подкорректировать этот стиль и заново компилить программу, обновлять сборки, перезагружать автокад =(

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

  • Administrator
  • *****
  • Сообщений: 9696
  • Карма: 1241
  • Рыцарь ObjectARX
  • Skype: rivilis
Подозреваю, что вопрос связан не только с текущим текстовым стилем, но и со всеми (или почти всеми) текстовыми стилями.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 811
  • Карма: 132
Привалов Дмитрий, Владимир Шу, настройки, естественно, "вынесены" в отдельный файл и считываются оттуда. Вопросов с перехватыванием определенных событий через lisp пока что нет ;)
У меня принципиально не получалось создать стиль. Сейчас проблему с ttf вроде решил, тестирую результаты...
Спасибо большое за советы и помощь! Без вас я бы еще доооолго ковырялся ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Онлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 811
  • Карма: 132
Решение, к сожалению, можно отметить только одно - но на самом деле в моей ситуации их оказалось 2: ответ Александра Ривилиса (http://adn-cis.org/forum/index.php?topic=9310.msg38904#msg38904) и подсказка Дмитрия Привалова (http://adn-cis.org/forum/index.php?topic=9310.msg38912#msg38912)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 9696
  • Карма: 1241
  • Рыцарь ObjectARX
  • Skype: rivilis
Алексей Кулик,
У Дмитрия там несколько подсказок. Что оказалось самым важным?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 811
  • Карма: 132
Прежде всего - блокировка документа. Так бы я фиг додумался, почему при полной загрузке всего приложения реакторы срабатывают неверно :)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!