Как корректно создать текстовый стиль с ttf-шрифтом?

Автор Тема: Как корректно создать текстовый стиль с ttf-шрифтом?  (Прочитано 5978 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Доброго всем. Пытаюсь создать текстовый стиль, использующий ttf-шрифт. Код старался сделать универсальным, чтобы срабатывал и на shx, и на ttf.
Пример вызова:
Код - Auto/Visual Lisp [Выбрать]
  1. (create-textstyle "adn-ttf" '(("fontfile" . "arial") ("bold" . t) ("italic" . t) ("height" . 0.) ("obliqueangle" . 0.) ("width" . 1.) ("bigfont" . "")))
Если выполнить для результата (entget res '("*")), то получаем
Код - Auto/Visual Lisp [Выбрать]
  1. '((0 . "STYLE")
  2.   (100 . "AcDbSymbolTableRecord")
  3.   (100 . "AcDbTextStyleTableRecord")
  4.   (2 . "adn-ttf")
  5.   (70 . 0)
  6.   (40 . 0.0)
  7.   (41 . 1.0)
  8.   (50 . 0.0)
  9.   (71 . 0)
  10.   (42 . 2.5)
  11.   (3 . "arialbi.ttf")
  12.   (4 . "")
  13.   (-3 ("ACAD" (1000 . "Arial") (1071 . 50331682)))
  14.   )
Но при этом в окне настройки текстовых стилей ситуация выглядит печально (create-style01.png). Если поменять настройки на нормальные, то entget ничем не отличается:
Код - Auto/Visual Lisp [Выбрать]
  1.  (entget (TBLOBJNAME "style" "adn-ttf") '("*"))
  2. '((0 . "STYLE")
  3.   (100 . "AcDbSymbolTableRecord")
  4.   (100 . "AcDbTextStyleTableRecord")
  5.   (2 . "adn-ttf")
  6.   (70 . 0)
  7.   (40 . 0.0)
  8.   (41 . 1.0)
  9.   (50 . 0.0)
  10.   (71 . 0)
  11.   (42 . 2.5)
  12.   (3 . "arialbi.ttf")
  13.   (4 . "")
  14.   (-3 ("ACAD" (1000 . "Arial") (1071 . 50331682)))
  15.   )
Собственно вопрос: что я делаю не так и в каком месте ошибка?
Все, что сказано - личное мнение.

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

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

Отмечено как Решение Алексей Кулик 28-11-2016, 12:35:01

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати, у меня результат выполнения кода:
Код - Auto/Visual Lisp [Выбрать]
  1. (entmake  '((0 . "STYLE")
  2.    (100 . "AcDbSymbolTableRecord")
  3.    (100 . "AcDbTextStyleTableRecord")
  4.    (2 . "adn-ttf")
  5.    (70 . 0)
  6.    (40 . 0.0)
  7.    (41 . 1.0)
  8.    (50 . 0.0)
  9.    (71 . 0)
  10.    (42 . 2.5)
  11.    (3 . "arialbi.ttf")
  12.    (4 . "")
  13.    (-3 ("ACAD" (1000 . "Arial") (1071 . 50331682)))
  14. ))
  15.  
вот такой:


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

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
У меня в 2009, 2013 и 2016 результат был не таким...
Получается, что при создании стиля задавать ему расширенные данные не надо? Вот блин! Похоже, что и при изменении типа шрифта ничего делать с РД не надо. Буду экспериментировать.
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Так, убрал обработку расширенных данных - пока все работает корректно. Очччень забавно. В какой-то версии, кажется, без них подобные текстовые стили не создавались
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
У меня вроде и с расширенными данными работает (2008, 2013 в Windows XP x86 и 2016, 2017 в Windows 7 x64).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Сейчас проверил - если исключить обработку РД из кода, то программное изменение любых настроек стиля (для ttf, конечно, остается критичным имя файла) срабатывает абсолютно корректно
ACAD2009x64Eng, AAD2009x64Rus, ACAD2013x64Eng, ACAD2013x64Rus, ACAD2016x64Eng, OC Win7x64 Pro. Обновления установлены все - и на ACAD, и на ОС.
Все, что сказано - личное мнение.

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

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

Оффлайн Владимир Азарко

  • ADN Club
  • Сообщений: 3
  • Карма: 3
  • Skype: azarko67
Я когда-то вычислил, что если указать полный путь к ttf шрифту в папке windows\fonts, то создается без проблем. Не проверял, насколько осталось актуальным для последних версий
Код - Auto/Visual Lisp [Выбрать]
  1. ;;;Для типов линий
  2. ;;;С ttf шрифтами windows
  3. (setq *activedoc* (vla-get-activedocument (vlax-get-acad-object)))  
  4. (mapcar (function
  5.           (lambda (mip_style font_file / text_style tmp)
  6.             (if (or (setq tmp (findfile font_file))
  7.                     (setq tmp (findfile (strcat
  8.                                           (mip-get-special-folder "Fonts")
  9.                                           "\\"
  10.                                           font_file
  11.                                         ) ;_ end of strcat
  12.                               ) ;_ end of findfile
  13.                     ) ;_ end of setq
  14.                 ) ;_ end of or
  15.               (setq font_file tmp)
  16.               (setq font_file nil)
  17.             ) ;_ end of if
  18.             (if font_file
  19.               (if (not (tblsearch "STYLE" mip_style))
  20.                 (progn
  21.                   (setq text_style
  22.                          (vla-add (vla-get-textstyles *activedoc*)
  23.                                   mip_style
  24.                          ) ;_ end of vla-add
  25.                   ) ;_ end of setq
  26.                   (vla-put-fontfile text_style font_file)
  27.                   (vla-put-width text_style 1.1)
  28.                   (vla-put-height text_style 0.0)
  29.                 ) ;_ end of progn
  30.                 (progn
  31.                   (setq text_style
  32.                          (vla-item (vla-get-textstyles *activedoc*)
  33.                                    mip_style
  34.                          ) ;_ end of vla-item
  35.                   ) ;_ end of setq
  36.                   (vla-put-fontfile text_style (findfile font_file))
  37.                   (vla-put-height text_style 0.0)
  38.                   (vla-put-obliqueangle text_style 0)
  39.                   (vla-put-width text_style 1.1)
  40.                 ) ;_ end of progn
  41.               ) ;_ end of if
  42.             ) ;_ end of if
  43.           ) ;_ end of lambda
  44.         ) ;_ end of function
  45.         '("TestStyle1" "standard")
  46.         '("arialbi.ttf" "isocpeur.ttf")
  47. )
  48. (defun mip-get-special-folder (folder / WS ret)
  49. ;;; Функция для определения одной из "специальных папок" Windows
  50. ;;; folder может быть:
  51. ;;; "AllUsersDesktop" - Windows 2000, Windows XP
  52. ;;; "AllUsersStartMenu" - Windows 2000, Windows XP
  53. ;;; "AllUsersPrograms" - Windows 2000, Windows XP
  54. ;;; "AllUsersStartup" - Windows 2000, Windows XP
  55. ;;; "Desktop" - Windows 98/ME, Windows 2000, Windows XP
  56. ;;; "Favorites" - Windows 98/ME, Windows 2000, Windows XP
  57. ;;; "Fonts" - Windows 98/ME, Windows 2000, Windows XP
  58. ;;; "MyDocuments" - Windows 98/ME, Windows 2000, Windows XP
  59. ;;; "NetHood" - Windows 98/ME, Windows 2000, Windows XP
  60. ;;; "PrintHood" - Windows 98/ME, Windows 2000, Windows XP
  61. ;;; "Programs" - Windows 98/ME, Windows 2000, Windows XP
  62. ;;; "Recent" - Windows 98/ME, Windows 2000, Windows XP
  63. ;;; "SendTo" - Windows 98/ME, Windows 2000, Windows XP
  64. ;;; "StartMenu" - Windows 98/ME, Windows 2000, Windows XP
  65. ;;; "Startup" - Windows 2000, Windows XP
  66. ;;; "Templates" - Windows 2000, Windows XP
  67. ;;; Возвращает или путь, или ""
  68. ;;; Пример:
  69. ;;;  (mip-get-special-folder "Startup")
  70. (vl-load-com)
  71.   (and
  72.     (setq WS (vlax-get-or-create-object "WScript.Shell"))
  73.     (setq folder (mip-conv-to-str folder))
  74.     (setq ret (vlax-invoke-method (vlax-get-property WS "SpecialFolders") "Item" folder))
  75.     (vlax-release-object ws)
  76.     )
  77.   (mip-conv-to-str ret)
  78. );defun
  79. (defun mip-conv-to-str (value)
  80.           (cond
  81.             ((= (type value) 'STR)value)
  82.                 ((= (type value) 'INT)(itoa value))
  83.                 ((= (type value) 'REAL)(rtos value 2 14))
  84.                 ((not value) "")
  85.                 (t (vl-princ-to-string value))
  86.                 ) ;_ end of cond
  87.     )
  88.  
« Последнее редактирование: 04-12-2016, 21:06:30 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Спасибо :) Я стараюсь определять подобные каталоги без обращения к WSCript, только чтением реестра. Пока хватало.
Я сталкивался с тем, что ttf-шрифт может быть не зарегистрирован в системе, и все равно корректно использоваться. Понимаю, что это глюк/баг, но учитывать подобное приходится. И я стараюсь не задавать полные пути к файлам шрифтов - в свое время на shx с этим очень неплохо обжегся (acad2008 записывал все это богайство прямо в определение текстового стиля, и я потом долго удивлялся - почему это стандртные shx не используются! :))
Как говорится, пуганая ворона - и далее по тексту.
Все, что сказано - личное мнение.

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

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