Как создать мультивыноску в .NET?

Автор Тема: Как создать мультивыноску в .NET?  (Прочитано 5548 раз)

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

Оффлайн ADSKАвтор темы

  • Administrator
  • Сообщений: 0
  • Карма: 2

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Как создать мультивыноску в .NET?
« Ответ #2 : 24-05-2017, 18:00:28 »
На мой взгляд в этой статье (и во всех примерах, что я нашел) есть принципиальная ошибка. Объекту MText нельзя присваивать значения свойств по умолчанию (DatabaseDefaults). Дело в том что все параметры текста заданы в стиле выноски. И эти параметры (включая стиль текста и высоту текста) могут не совпадать (и как правило не совпадают) с текущим стилем текста.  Достаточно присвоить mtext.TextStyleId = leader.TextStyleId и все станет работать так как задумано. Причем, если у текста задана высота (например, через SetDatabaseDefaults), то ее уже не изменит присваивание тексту другого стиля. Поэтому вызов mText.SetDatabaseDefaults() не просто бесполезен, он недопустим.
Любопытно что после присвоения тексту правильного стиля leader.TextStyleId, его свойство mtext.TextHeight остается равным 0. Но выноска отображается правильно и реальная высота текста берется из leader.TextHeight

Код - C# [Выбрать]
  1.           MLeader leader = new MLeader();
  2.           leader.SetDatabaseDefaults();
  3.           leader.ContentType = ContentType.MTextContent;
  4.           MText mtext = new MText();
  5.           //mtext.SetDatabaseDefaults(); недопустимо! получим тексты с не тем стилем и высотой
  6.           mtext.TextStyleId = leader.TextStyleId;
  7.           mtext.Contents = .....;
  8.           leader.MText = mtext;
  9.  

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Как создать мультивыноску в .NET?
« Ответ #3 : 05-09-2017, 15:04:30 »
После многих мучений я стал использовать такой хелпер:
Код - C# [Выбрать]
  1.     /// <summary>
  2.     /// Присвоить текст выноске. Для новых выносок вызовите предварительно SetDatabaseDefaults
  3.     /// </summary>
  4.     public static void SetText(this MLeader ml, string text)
  5.     {
  6.       MText mt;
  7.       if (ml.HasContent() && ml.ContentType == ContentType.MTextContent)
  8.         mt = ml.MText; // клонировать не надо - MLeader сам делает клон
  9.       else
  10.       {
  11.         ml.ContentType = ContentType.MTextContent;
  12.         mt = new MText();
  13.         if (ml.TextStyleId.IsNull) mt.SetDatabaseDefaults(); // только на аварийный случай
  14.         else mt.TextStyleId = ml.TextStyleId; // стиль текста следует брать из стиля выноски. он обычно не совпадает DatabaseDefaults
  15.         mt.Color = ml.Color; // иначе будет черный не смотря ни на какие стили
  16.         mt.TextHeight = ml.TextHeight; // иначе будет 0
  17.       }
  18.  
  19.       if (text.StartsWith("%<\\")) // это поле
  20.       {
  21.         Field f = new Field(text, true);
  22.         f.Evaluate();
  23.         mt.SetField(f);
  24.       }
  25.       else
  26.         mt.Contents = text;
  27.  
  28.       ml.ContentType = ContentType.MTextContent;
  29.       ml.MText = mt;
  30.       mt.Dispose(); // MLeader не сохраняет этот объект, а только копирует его свойства себе. Поэтому надо удалить
  31.     }