Правильное создание многострочного текста

Автор Тема: Правильное создание многострочного текста  (Прочитано 15802 раз)

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

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Вопрос возможно нубский, но поговорить мне с кем-то нужно ;D
В общем - в программе предусмотрена вставка в чертеж многострочного текста. В окне программы я задаю параметры, которые может указать пользователь: высота текста, ширина текста, стиль текста и аннотативность. В коде есть метод, который определяет текущий масштаб scale - значение на которое меняется примитив при масштабировании (т.е. для масштаба 1:2 scale=2, при масштабе 2:1 scale=0.5 и т.д.)
Переходим к сути вопроса - мне нужно понять и сделать самый правильный и логичный вариант вставки. Рассуждаем:
1. Текст не аннотативный

В данном случае вроде все просто - задали для текста высоту и ширину. Допустим в окне программы задано: высота 2.5, ширина 180. Но возникает вопрос - нужно-ли высоту и ширину умножать на масштаб?
В виде кода имеем два варианта:
Код - C# [Выбрать]
  1. // 1 вариант
  2. if(isAnnot)
  3. {
  4.      mtxt.Annotation = AnnotationState.True;
  5.      mtxt.TextHeigh = txtH; //2.5
  6.      mtxt.Width = txtW;//180
  7. }
  8. // 2 вариант
  9. {
  10.      mtxt.Annotation = AnnotationState.True;
  11.      mtxt.TextHeigh = txtH * scale; //2.5 * scale
  12.      mtxt.Width = txtW * scale;//180 * scale
  13. }
2. Текст аннотативный

Тут уже интересней и запутаннее - теперь у нас есть высота и ширина в пространстве модели и пространстве листа. Если я задаю высоту 2.5 и ширину 180, а масштаб у меня 1:2, то вставленный аннотативный многострочный текст будет с размерами в пространстве модели вдвое меньшими заданным
В виде кода имеем два варианта (они в общем такие-же как и для не аннотативного):
Код - C# [Выбрать]
  1. // 1 вариант
  2. if(!isAnnot)
  3. {
  4.      mtxt.TextHeigh = txtH; //2.5
  5.      mtxt.Width = txtW;//180
  6. }
  7. // 2 вариант
  8. {
  9.      mtxt.TextHeigh = txtH * scale; //2.5 * scale
  10.      mtxt.Width = txtW * scale;//180 * scale
  11. }

Кстати, если для многострочного текста задать аннотативный текстовый стиль, но не указать аннотативность "насильно", то вставленный многострочный текст не будет аннотативным

В общем - как делать более правильно и логично?

Off-Topic: показать
Тип изображения "эротика" при загрузке изображения на форум поднял мне настроение на весь день))

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
У меня сохранился видео урок по аннотативности, который я писал для своих пользователей лет 6 назад. Если интересно - могу выложить на youtube для ознакомления.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Блин... :) Отправил второе сообщение посредством редактирования первого (по ошибке)...

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
У меня сохранился видео урок по аннотативности
Да вопрос в общем не о том, что такое аннотативность, а том как логически правильно сделать вставку текста из программы.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Да вопрос в общем не о том, что такое аннотативность, а том как логически правильно сделать вставку текста из программы.
Вопрос как раз именно в том. Я об этом подробно расписал в первом сообщении, которое случайно затёр, когда сообщал о возможности выложить мультик.

Во первых, говоря о не аннотативном тексте ты показываешь код аннотативного, и говоря об аннотативном - код неаннотативного. Подозреваю, что ошибочный копипаст. Кроме того, когда говоря об аннотативном тексте ты вдруг зачем-то начинаешь умножать величину текста на масштаб (во втором варианте) - это наводит на большие сомнение о том, действительно ли ты понимаешь как работает аннотативность... :(

Аннотативному объекту нужно назначать размер, который ты хочешь видеть на бумаге. Затем в список его аннотативных масштабов добавляешь те, которые имеют видовые экраны, в которых этот объект должен отображаться.

Использование аннотативных объектов зачастую наиболее целесообразно, чем использование не аннотативных (при условии, что пользователь действительно понимает, как это работает - иначе он может такого накуралесить....).

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Андрей Бушман, тогда выкладывай видео! Я и сам-то с этими аннотациями не очень дружу)))
А вообще я начинаю склонятся к тому, чтобы из программы просто убрать все эти настройки и созданному новому тексту задавать только содержимое. Тогда вид этого текста будет полностью зависеть от принятых решений пользователя

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Вот ссылка. Подожди некоторое время (минут 30), чтобы появилось более качественное видео.  Насколько я помню, наушники не нужны (информация даётся текстом).

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Андрей Бушман, я начинаю склонятся к тому, что возможность делать текст аннотативным должна ОТСУТСТВОВАТЬ в моей программе, ровно так-же как и масштаб (т.е. какие-либо умножения на масштаб). Высоту и ширину можно оставить. Наверно так будет правильнее всего?
НО! Возникает другая проблема о которой я упомянул в первом посте:
Цитировать
Кстати, если для многострочного текста задать аннотативный текстовый стиль, но не указать аннотативность "насильно", то вставленный многострочный текст не будет аннотативным
Может я в чем-то ошибаюсь? Поправьте меня тогда

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
должна ОТСУТСТВОВАТЬ в моей программе
Я не знаком с твоей программой, поэтому ничего об этом сказать не могу. Однако "правила игры" аннотативных объектов не зависят от сторонних приложений.
Цитировать
Кстати, если для многострочного текста задать аннотативный текстовый стиль, но не указать аннотативность "насильно", то вставленный многострочный текст не будет аннотативным
Будет аннотативным. И никто не мешает тебе это проверить (создай вручную и увидишь).
Цитировать
Может я в чем-то ошибаюсь? Поправьте меня тогда
Ошибаешься. Поправил.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я не знаком с твоей программой, поэтому ничего об этом сказать не могу
С ней и не нужно быть знакомым. Смысл - вставить в чертеж текст. Вопрос - делать возможность создать его аннотативным или нет
Будет аннотативным. И никто не мешает тебе это проверить (создай вручную и увидишь).
Так я и проверил. Только не вручную, а программно (что и требуется)
Простой код:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.EditorInput;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.Geometry;
  6.  
  7. namespace MTextCreation
  8. {
  9.     public class Commands
  10.     {
  11.         [CommandMethod("MTEXTTEST")]
  12.         static public void CreateMText()
  13.         {
  14.             var doc = Application.DocumentManager.MdiActiveDocument;
  15.             var db = doc.Database;
  16.             var ed = doc.Editor;
  17.  
  18.             ObjectId mtId;
  19.             var mtLoc = Point3d.Origin;
  20.  
  21.             using (var tr = db.TransactionManager.StartTransaction())
  22.             {
  23.                 var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  24.                 var btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  25.                 var tst = (TextStyleTable)tr.GetObject(db.TextStyleTableId, OpenMode.ForRead);
  26.  
  27.                 MText mt = new MText();
  28.                 mt.Location = mtLoc;
  29.                 mt.Contents = "Some text";
  30.                 mt.TextStyleId = tst["Аннотативный"];                
  31.                
  32.                 mtId = btr.AppendEntity(mt);
  33.                 tr.AddNewlyCreatedDBObject(mt, true);
  34.                 tr.Commit();
  35.             }
  36.         }
  37.     }
  38. }
И вот такой результат:


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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Так я и проверил. Только не вручную, а программно (что и требуется)
Подтверждаю (та же ситуация в 2009-м).

Если делать вручную, то будет аннотативным. Если в окне свойств твоему тексту назначить стиль Standard, а затем снова Annotative, то свойство аннотативности при этом изменится в true.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Если делать вручную, то будет аннотативным.
Логично) Но нужно-то программно
Ну эту проблему я решил - это не баг. Нужно добавить одну строчку
Код - C# [Выбрать]
  1. MText mt = new MText();
  2. mt.Location = mtLoc;
  3. mt.Contents = "Some text";                
  4. mt.TextStyleId = tst["Аннотативный"];
  5. mt.SetFromStyle();

По поводу основного вопроса - я пока пришел к выводу, что не нужно делать возможность задать аннотативность и не нужно ничего масштабировать...

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вот я и добрался до кода, протестировал и встретил кучу неясностей :(
Допустим я создаю текст вручную: включаю аннотативный стиль, ставлю масштаб 1:4 и создаю текст. В свойствах у меня будет высота текста в пространстве модели 2.5 и высота текста в пространстве листа 10. Вроде все логично и правильно
Теперь я создаю текст программно:
Код - C# [Выбрать]
  1. txt.TextStyleId = tst["Аннотативный"];
  2. txt.SetFromStyle();
  3. txt.Width = 2.5;
  4. txt.TextHeight = 180;
и в результате получаю все наоборот: высота текста в пространстве модели 0.625, высота текста в пространстве листа 2.5.
И это не есть хорошо(

Получается, что когда пользователь в списке выбрал аннотативный текстовый стиль, программа должна предложить ему выбрать масштаб аннотации и высоту/ширину текста все-же умножить на масштаб???

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Есть подозрение, что тексту еще надо добавить масштабы аннотации.Надо бы взглянуть на этот созданный программно текст в чертеже.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Есть подозрение, что тексту еще надо добавить масштабы аннотации.Надо бы взглянуть на этот созданный программно текст в чертеже.
Ну я примерно так и сделал) Если в списке выбран аннотативный текстовый стиль, то при вставке текста значения ширины и высоты умножаются на масштаб. Потестив варианты я решил, что это самое логичное решение