Хоть тема старая, но другой темы про анотативные тексты на форуме нет. Поэтому хочу поставить свою точку над i. У меня работает так:
/// <summary>
/// Создать текст с заданым стилем с учетом аннотативности
/// </summary>
/// <param name="content"></param>
/// <param name="style">может быть пустой - берем текущий</param>
/// <param name="height">может быть 0 - берем текущий из стиля или TextSize</param>
/// <param name="textFrame">сработает только в автокад 2016 и старше</param>
/// <param name="db"></param>
/// <param name="tr"></param>
/// <returns></returns>
public static MText CreateText(string content, string style, double height, bool textFrame, Database db, Transaction tr)
{
MText mt = new MText();
mt.Contents = content;
mt.SetDatabaseDefaults(db);
if (!string.IsNullOrEmpty(style))
{
TextStyleTable styles = tr.GetObject(db.TextStyleTableId, OpenMode.ForRead) as TextStyleTable;
if (styles.Has(style))
mt.TextStyleId = styles[style]; //ToDo сделать загрузку стиля из шаблона
}
if (textFrame && mt.ExistsProp("ShowBorders")) // свойство появилось только в AutoCAD 2016, поэтому через Reflection
mt.SetProp("ShowBorders", true);
if (height > 0)
mt.TextHeight = height;
TextStyleTableRecord ts = tr.GetObject(mt.TextStyleId, OpenMode.ForRead) as TextStyleTableRecord;
mt.Annotative = ts.Annotative; // свойство не назначается само при назначении стиля. вызывать mt.AddContext(db.Cannoscale) не требуется - вызывается сам
if (mt.Annotative == AnnotativeStates.True)
using (AnnotationScale asc = db.Cannoscale) // Автокад без спроса масштабирует заданные размеры по Cannoscale - придется масштабировать обратно
if (asc.Scale != 1) mt.TransformBy(Matrix3d.Scaling(1 / asc.Scale, Point3d.Origin));
.... тут назначаю слой аннотаций ....
return mt;
}