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

ADN Club => AutoCAD .NET API => Тема начата: avc от 06-10-2018, 01:07:18

Название: Text Frame у MText
Отправлено: avc от 06-10-2018, 01:07:18
Скажите, как доктор доктору, у меня плохо со зрением, или у MText правда нет свойства TextFrame? В упор не вижу даже в библиотеках от Автокад 2019. Склоняюсь, что все-таки со зрением что-то, т.к. ни в одном форуме по этому поводу ни слова...
Название: Re: Text Frame у MText
Отправлено: Вильдар от 06-10-2018, 10:54:49
Рамка вокруг текста?
ShowBorders не оно?
Название: Re: Text Frame у MText
Отправлено: Владимир Шу от 06-10-2018, 11:22:50
Оно и есть.  В панели свойств MText - Text Frame, в API .NET .ShowBorders
Название: Re: Text Frame у MText
Отправлено: avc от 06-10-2018, 11:34:45
Оно! Спасибо! И ведь все свойства перечитал 3 раза, понимал, что как то по другому назвали, и все равно сам не нашел. Появилось оно только в версии 2016.
Название: Re: Text Frame у MText
Отправлено: avc от 13-10-2018, 14:58:28
Пожалуй продолжу тему.
Как включить рамку я понял. Дальше засада еще интересней. ActualHeight и GeometricExtents игнорят рамку. Т.е. оба свойства показывают габариты текста без рамки, а рамка далеко за этими габаритами! Ок, добавлю размер рамки сам. ...А сколько добавлять-то?! Ни каких указаний ни в какой документации не вижу. Наверняка системная переменная есть управляющая отступом рамки, но я ее найти не смог. Чисто эмпирически - похоже на половину TextHeight в каждую сторону. Но всегда ли?
За неимение лучшего, написал такой велосипед на замену ActualHeight:
Код - C# [Выбрать]
  1.     /// <summary>
  2.     /// Высота текста с учетом рамки. Сработает и в старых версиях автокада, где рамок нет.
  3.     /// </summary>
  4.     public static double FrameHeight(this MText mt)
  5.     {
  6.       double height = mt.ActualHeight;
  7.       if (mt.ExistsProp("ShowBorders") && (bool)mt.GetProp("ShowBorders")) // свойство появилось только в AutoCAD 2016 и так и не появилось в прочих API
  8.         height += mt.TextHeight; // ActualHeight игнорирует рамку. вроде бы она всегда отступает на пол высоты шрифта
  9.       return height;
  10.     }
ExistsProp и GetProp это мои хелперы для обращения к свойству через Reflection т.к. не во всех автокадах есть это свойство.
Название: Re: Text Frame у MText
Отправлено: Александр Ривилис от 13-10-2018, 20:32:30
https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2018/ENU/AutoCAD-DXF/files/GUID-5E5DB93B-F8D3-4433-ADF7-E92E250D2BAB-htm.html

DXF группа 45: Fill box scale (optional):

Determines how much border there is around the text.

(https://farm2.staticflickr.com/1972/44382727355_2349b2104a_o.png)

В первом случае с рамкой, второй без. Похоже это MText.BackgroundScaleFactor
Название: Re: Text Frame у MText
Отправлено: avc от 14-10-2018, 00:06:59
Отличный ребус для суботнего вечера :) Я понял, что в недрах DXF есть параметр 45,  как то связанный с рамками. Честно говоря,  я не понял ничего из скрина командной строки. 45 со значением 1.5? Кому-то удалось это использовать это на практике ?
Название: Re: Text Frame у MText
Отправлено: Александр Ривилис от 14-10-2018, 01:20:55
avc,
Думаю что вместо
Код - C# [Выбрать]
  1. height += mt.TextHeight;
должно быть
Код - C# [Выбрать]
  1. height += 2 * mt.BackgroundScaleFactor; // mt.BackgroundScaleFactor - это как раз код DXF 45
Название: Re: Text Frame у MText
Отправлено: Дмитрий Загорулькин от 14-10-2018, 01:33:58
avc,
Думаю что вместо
Код - C# [Выбрать]
  1. height += mt.TextHeight;
должно быть
Код - C# [Выбрать]
  1. height += 2 * mt.BackgroundScaleFactor; // mt.BackgroundScaleFactor - это как раз код DXF 45
Хм, а точно? Это же вроде как коэффициент, а не абсолютная величина.
Название: Re: Text Frame у MText
Отправлено: Александр Ривилис от 14-10-2018, 02:00:57
Хм, а точно? Это же вроде как коэффициент, а не абсолютная величина.
Я не прав. Должно быть так (судя по документации):
Код - C# [Выбрать]
  1. height += 2 * (mt.BackgroundScaleFactor - 1.0) * mt.TextHeight;
В документации:
Цитировать
Border Offset Factor
Specifies the margin around the text for the opaque background. The value is based on the text height. A factor of 1.0 exactly fits the multiline text object. A factor of 1.5 extends the background by 0.5 times the text height.
Название: Re: Text Frame у MText
Отправлено: Александр Ривилис от 14-10-2018, 02:04:40
avc,
Кстати, в случае mt.BackgroundScaleFactor == 1.5 результат в точности совпадает с твоим, т.к.  2 * (mt.BackgroundScaleFactor - 1.0) * mt.TextHeight в этом случае равно mt.TextHeight.