Странное поведение объекта DBText.

Автор Тема: Странное поведение объекта DBText.  (Прочитано 5467 раз)

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

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Наблюдение первое:
Если создать объект DBText, настроить его, но не добавлять в какое-либо пространство и транзакцию, текст все равно создастся в текущем пространстве. Чтобы этого не происходило, нужно обязательно вызывать метод Erase для него.
Наблюдение второе:
При задании стиля для этого текста, свойства угла наклона текста и коэффициента ширины почему-то не берутся из стиля, их нужно дополнительно "вручную" задавать.

Код для проверки можно сделать на основе этого метода:
Код - C# [Выбрать]
  1. public static double AcadTextLen(ObjectId styleId, string str, double height)
  2.         {
  3.             double len = 0.0;
  4.  
  5.             Database db = styleId.Database;      
  6.  
  7.             using (Transaction tr = db.TransactionManager.StartTransaction())
  8.             using (DBText dbTxt = new DBText())
  9.             {                
  10.                 dbTxt.TextStyleId = styleId;
  11.  
  12.                 // Помимо назначения стиля, нужно еще дополнительно
  13.                 // назначить угол наклона букв и коэффициент ширины
  14.                 TextStyleTableRecord txtStyle = tr.GetObject(styleId, OpenMode.ForRead) as TextStyleTableRecord;
  15.                 dbTxt.Oblique = txtStyle.ObliquingAngle;
  16.                 dbTxt.WidthFactor = txtStyle.XScale;
  17.  
  18.                 // Если тексту принудительно не задана высота
  19.                 if (txtStyle.TextSize.Equal(0.0))
  20.                     // Задаем желаемую
  21.                     dbTxt.Height = height;
  22.  
  23.                 // Дополнительные настройки
  24.                 dbTxt.Normal = Vector3d.ZAxis;
  25.                 dbTxt.Rotation = 0.0;
  26.                 dbTxt.Position = Point3d.Origin;
  27.                
  28.                 dbTxt.TextString = str;                
  29.                
  30.                
  31.                 Point3d ptMin = dbTxt.GeometricExtents.MinPoint;
  32.                 Point3d ptMax = dbTxt.GeometricExtents.MaxPoint;
  33.                 len = ptMax.X - ptMin.X;
  34.  
  35.                 dbTxt.Erase();
  36.  
  37.                 tr.Commit();
  38.             }
  39.  
  40.             return len;
  41.         }

Или это так работает только в 2014 версии?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Странное поведение объекта DBText.
« Ответ #1 : 03-04-2014, 18:33:42 »
Наблюдение второе:
При задании стиля для этого текста, свойства угла наклона текста и коэффициента ширины почему-то не берутся из стиля, их нужно дополнительно "вручную" задавать.
Это всегда так и было. Т.е. можно сказать "by design".

Наблюдение первое:
Если создать объект DBText, настроить его, но не добавлять в какое-либо пространство и транзакцию, текст все равно создастся в текущем пространстве. Чтобы этого не происходило, нужно обязательно вызывать метод Erase для него.
Проверю и отпишусь. Так быть не должно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Странное поведение объекта DBText.
« Ответ #2 : 03-04-2014, 18:44:44 »
Это всегда так и было. Т.е. можно сказать "by design".
Странно... Для меня это как-то нелогично. Ну да ладно :) Жалко только, что пока я до этого докопался, много времени потратил.
Кстати, в связи с этим, получается, что код вот отсюда http://adndevblog.typepad.com/autocad/2012/05/actual-width-and-height-of-a-text-string.html для таких "наклоненных и расширенных" стилей будет неправильные данные выдавать.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Странное поведение объекта DBText.
« Ответ #3 : 03-04-2014, 20:24:17 »
Странно... Для меня это как-то нелогично.
Для меня это было нелогичным 20 лет назад. Сейчас обвыкся.
Кстати, в связи с этим, получается, что код вот отсюда http://adndevblog.typepad.com/autocad/2012/05/actual-width-and-height-of-a-text-string.html для таких "наклоненных и расширенных" стилей будет неправильные данные выдавать.
Чего вдруг? Для текста созданного в точности в соответствии с текстовым стилем, как делаешь ты в своём коде, или как делает команда _TEXT (которая ведёт себя аналогично) - всё будет правильно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Странное поведение объекта DBText.
« Ответ #4 : 03-04-2014, 22:05:28 »
Странно, проверил дома на Civil 2014 Eng No SP - на методе dbTxt.Erase(); выдает исключение, пишет, что объект не добавлен в базу, как и должно быть. Если закомментировать эту строчку - текст в чертеж не добавляется - тоже все в порядке. Вероятно, проблема только в русской версии.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Странное поведение объекта DBText.
« Ответ #5 : 04-04-2014, 00:00:48 »
Вероятно, проблема только в русской версии.
Сомневаюсь. Дмитрий, давай ты сделаешь тестовый пример и скажешь точные условия при которых это у тебя происходит. Судя по коду такого поведения не может быть никогда. dbTxt понятия не имеет ни о db, ни о её ModelSpace. Тут что-то не то.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Странное поведение объекта DBText.
« Ответ #6 : 04-04-2014, 09:33:21 »
Хе-хе... В тестовом примере, который я сделал для проверки, в русском Civil и в русском AutoCAD все в порядке.
Буду искать причину проблемы, если найду - отпишусь.

Update:
Сегодня мне так и не удалось воспроизвести проблему. Видимо, она была следствием работы какого-то промежуточного варианта кода   :-\
« Последнее редактирование: 04-04-2014, 11:27:01 от Загорулькин Дмитрий »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Странное поведение объекта DBText.
« Ответ #7 : 04-04-2014, 14:59:24 »
Видимо, она была следствием работы какого-то промежуточного варианта кода
Ну и замечательно, что всё так легко решилось. Намного проще исправить код в своей программе, чем пытаться обойти баги в AutoCAD. Тем более, что указанное тобой поведение рушило все "догматы" AutoCAD .NET API. :)
« Последнее редактирование: 04-04-2014, 15:40:31 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение