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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 805
  • Карма: 130
Увы и ах, понадобилось работать в 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
  • *****
  • Сообщений: 9626
  • Карма: 1230
  • Рыцарь ObjectARX
  • Skype: rivilis
Исходный шрифт был TTF?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 9626
  • Карма: 1230
  • Рыцарь 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
  • ****
  • Сообщений: 277
  • Карма: 40
если после UpdateTextFont вызывать окно настроек текстовых стилей, то ACAD тупо валится:
В коде нет DocumentLock, возможно он необходим, если меняется отображение всех объектов через стиль?

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

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

  • ADN Club
  • ****
  • Сообщений: 277
  • Карма: 40
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
  • *****
  • Сообщений: 805
  • Карма: 130
Ага, попробую, спасибо!
Все, что сказано - личное мнение.

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

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