Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым

Автор Тема: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым  (Прочитано 14194 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Добрый день.

Мне необходимо задать размеры ячейке таблицы в которой перевернут текст на 90 градусов.


Вот пример.
Высота у ячейки = 62.5
Ширина = 58.4

Если я уменьшу ширину, то у меня текст сузится вертикально в ячейке. вот так получится:



То есть как будто текст сначала верстается, как будто без переворота (поэтому его ширина = ширине ячейки), а потом переворачивается, но ширина текста (а теперь это по сути высота) остаётся прежней и не растягивается по высоте ячейки.

Вот свойства этой ячейки после изменения размеров (вдруг что-то не так в параметрах ну и вообще вдруг понадобится для решения проблемы):



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

Кто знает, как можно сделать так, чтобы после переворота текст растягивался по вертикали и его ширина не равнялась текущей ширине ячейки? НУ и чтобы не было пустого пространства по бокам и сверху (т.к. сейчас даже жестким указанием размеров этого нельзя добиться)?

Заранее спасибо :)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Выложи dwg-файл с одной такой таблицей и укажи версию AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Выложи dwg-файл с одной такой таблицей и укажи версию AutoCAD.

Версия - Autocad 2016

Вот 2 файла.
в "Нет ошибки в таблице, созданной через интерфейс.dwg" я создал через интерфейс, перевернул текст, задал ширину и высоту. Всё вроде как корректно отрисовалось.
А вот в "Ошибка верстки в программно созданной таблице.dwg" таблица, созданная программно. После программной верстки я руками изменил размеры ячейки первой и в итоге у меня появилась проблема, что указана в первом сообщении.

Если по таблице непонятно будет в чем проблема, постараюсь прислать код. Но это сложно сделать, так как логики куча лишней в коде при верстке, код разнесён по куче методов и долго будет вычленять нормальный кусок кода (ну или нужно долго будет въезжать в код)

!!!!!!!!!! В документе  "Ошибка верстки ..." я сделал у всей первой строчки угол поворота - 90 градусов. Тогда у меня в первой ячейке ширина и высота текста стала корректной. После этого обратно поменял угол поворота в остальных ячейках на 0, но в первой ячейки размеры остались корректными.
Так в чем проблема-то? Как мне программно делать?
« Последнее редактирование: 14-10-2016, 09:13:26 от alexeyOMG »

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Если поможет, то вот метод, который выводит данную таблицу.
Объект tableModel содержит параметры таблицы (в частности данные лежат в tableModel.Template).
targetDocument - текущий документ, куда надо вывести таблицу

По сути надо смотреть
#region Инициализация шапки
и
#region Заполнение таблицы


Код - C# [Выбрать]
  1.  
  2. public override float DrawTable(TableModel tableModel, Document targetDocument, string workPath)
  3.         {
  4.             var database = targetDocument.Database;
  5.  
  6.             CellHeight = tableModel.Template.CellHeight > 0 ? tableModel.Template.CellHeight : 8f;
  7.             CellTextHeight = tableModel.Template.TextHeight > 0 ? tableModel.Template.TextHeight : 5f;
  8.  
  9.             //Создаем и позиционируем таблицу в начале координат + смещение по оси x
  10.             Table table = null;
  11.             using (var transaction = database.TransactionManager.StartTransaction())
  12.             {
  13.                 string textStyle = tableModel.Template.TextStyle;
  14.                 var textStyleTable = (TextStyleTable)transaction.GetObject(database.TextStyleTableId, OpenMode.ForRead);
  15.                 if (!string.IsNullOrEmpty(textStyle) && textStyleTable.Has(textStyle))
  16.                     _textStyleId = textStyleTable[textStyle];
  17.  
  18.                 table = _graphicsRepository.GetTableGraphics(tableModel.Id, transaction);
  19.                 if (table == null)
  20.                 {
  21.                     if (!double.IsNaN(tableModel.CoordinateX))
  22.                     {
  23.                         Document acDoc = Application.DocumentManager.MdiActiveDocument;
  24.                         using (acDoc.LockDocument()) // this is needed from a modeless form
  25.                         {
  26.                             PromptPointResult pPtRes;
  27.                             PromptPointOptions pPtOpts = new PromptPointOptions("");
  28.                             Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView();
  29.                             // Prompt for the start point
  30.                             pPtOpts.Message = "\n Укажите место, в которое вы хотите добавить таблицу \"" + tableModel.Name + "\" (его верхний левый улог): ";
  31.                             pPtRes = acDoc.Editor.GetPoint(pPtOpts);
  32.                             if (pPtRes.Status == PromptStatus.OK)
  33.                             {
  34.                                 Point3d ptStart = pPtRes.Value;
  35.                                 tableModel.CoordinateX = ptStart.X;
  36.                                 tableModel.CoordinateY = ptStart.Y;
  37.                                 tableModel.CoordinateZ = ptStart.Z;
  38.                             }
  39.                         }
  40.                     }
  41.                     table = new Table
  42.                     {
  43.                         Position = new Point3d(tableModel.CoordinateX, tableModel.CoordinateY, tableModel.CoordinateZ),
  44.                         LineWeight = (LineWeight)tableModel.Template.LineWeight
  45.                     };
  46.                 }
  47.                 else
  48.                 {
  49.                     var position = table.Position;
  50.                     _graphicsRepository.DeleteTableGraphics(tableModel.Id, transaction);
  51.                     table = new Table()
  52.                     {
  53.                         Position = position,
  54.                         LineWeight = (LineWeight)tableModel.Template.LineWeight
  55.                     };
  56.                 }
  57.  
  58.                 transaction.Commit();
  59.  
  60.             }
  61.            
  62.             //Задаем таблице размер в соответсвии с числом колонок и строк
  63.             IList<Item> rows = Item.GetFlatList(tableModel.Items);
  64.             var templateColumns = tableModel.Template.Columns;
  65.             table.SetSize(rows.Count + 1, templateColumns.Count);
  66.  
  67.  
  68.             #region Инициализация шапки
  69.             table.Rows[0].Height = 15;
  70.  
  71.             table.Cells.TopLeft.Borders.Horizontal.Margin = _cellMargin;
  72.             table.Cells.TopLeft.Borders.Top.Margin = _cellMargin;
  73.             table.Cells.TopLeft.Borders.Bottom.Margin = _cellMargin;
  74.  
  75.             for (var i = 0; i < table.Columns.Count; i++)
  76.             {
  77.                 var column = table.Columns[i];
  78.  
  79.                 string heasderText = ChangeSpecialSymbols(tableModel.Template.Columns[i].Header);
  80.  
  81.                 column.TopLeft.TextString = heasderText;
  82.                 column.TopLeft.TextHeight = CellTextHeight;
  83.                 column.TopLeft.Alignment = CellAlignment.MiddleCenter;
  84.                 if (_textStyleId != ObjectId.Null)
  85.                     column.TopLeft.TextStyleId = _textStyleId;
  86.  
  87.                 var templateWidth = templateColumns.Single(c => c.ColumnNumber == i)?.Width ?? 0;
  88.                 column.Width = templateWidth > 0 ? templateWidth : 40;
  89.                 if (tableModel.Template.Columns[i].IsHeaderTextVerticalOrientation)
  90.                     table.Cells[0, i].Contents[0].Rotation = 1.57;
  91.  
  92.                 table.Cells[0, i].TopLeft.Borders.Horizontal.Margin = 0;
  93.                 table.Cells[0, i].TopLeft.Borders.Top.Margin = 0;
  94.                 table.Cells[0, i].TopLeft.Borders.Bottom.Margin = 0;
  95.  
  96.             }
  97.             #endregion
  98.  
  99.             #region Заполнение таблицы
  100.             for (var i = 1; i < table.Rows.Count; i++)
  101.             {
  102.                 var attributes = rows[i - 1].Attributes;
  103.                 table.Rows[i].Height = CellHeight;
  104.                 for (var j = 0; j < table.Columns.Count; j++)
  105.                 {
  106.                     var column = templateColumns.Single(c => c.ColumnNumber == j);
  107.                     var cell = table.Cells[i, j];
  108.  
  109.                     cell.Alignment = CellAlignment.MiddleCenter;
  110.                     cell.TextHeight = CellTextHeight;
  111.                     cell.Borders.Horizontal.Margin = _cellMargin;
  112.                     cell.Borders.Vertical.Margin = _cellMargin;
  113.                     cell.Borders.Top.Margin = _cellMargin;
  114.  
  115.                     cell.TextString = ChangeSpecialSymbols(AttributeOfItem.GetFirstValueByAttributeIds(attributes, column.AttributeIds) ?? "");
  116.                     cell.TextHeight = CellTextHeight;
  117.                     cell.Alignment = CellAlignment.MiddleLeft;
  118.                 }
  119.  
  120.                 table.Rows[i].State = CellStates.ContentLocked;
  121.             }
  122.             #endregion
  123.  
  124.             using (var transaction = database.TransactionManager.StartTransaction())
  125.             {
  126.                 Matrix3d transform = Matrix3d.Scaling(tableModel.Scale, table.Position);
  127.                 table.TransformBy(transform);
  128.                 transaction.Commit();
  129.             }
  130.  
  131.             #region Сохранение таблицы в чертеже
  132.  
  133.             using (var transaction = database.TransactionManager.StartTransaction())
  134.             {
  135.                 BlockTable blockTable = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead);
  136.                 BlockTableRecord blockTableRecord = (BlockTableRecord)transaction.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  137.                 blockTableRecord.AppendEntity(table);
  138.                 transaction.AddNewlyCreatedDBObject(table, true);
  139.                 transaction.Commit();
  140.             }
  141.             #endregion
  142.  
  143.             _graphicsRepository.PutTableGraphics(tableModel.Id, new List<Handle> { table.Handle });
  144.  
  145.             return (float)table.Width;
  146.         }
  147.  

Отмечено как Решение alexeyOMG 14-10-2016, 12:13:52

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Всё! Нашел в чем проблема.

Надо было вместо 1.57 вписать значение Math.PI / 2....
Жесть...
Типа 1.57 - это не ровно 90 градусов. Хотя по факту пишет в автокаде, что 90 (видимо округляет).
В итоге автокад рисует ячейку, как будто текст там под углом 89.999 мб. В итоге он и высоту и в ширину растягивает ячейку (типа квардарата походу рисует). А в случае Math.PI / 2 - это ровно 90 градусов и он нормально растягивает вверх и не оставляет пробелы по бокам.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Вообще-то pi далеко не 3.14...

Понятно, что это разные значения. Но в сети куча примеров, где написано именно 3.14. Ну не вдаваясь в подробности я это значение и использовал с самого начала до того момента, когда мне не понадобились чёткие размеры ячейки.
Но а то, что автокад по факту округляет при отображении в свойствах до "90", а по факту меньше - и это влияет так жестко на вёрстку - вот этого я предположить не мог конечно.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
AutoCAD может показывать значение округленным до 2. Но это не делает pi равным 4.
Для ради интересу поменяй luprec на 8 и посмотри на результаты показа и "округления"
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Максим Маркевич

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
alexeyOMG, сделай, пожалуйста, тестовый пример кода. Скажем, создание таблицы с одной ячейкой, то есть хотелось бы взять вот твой код и побаловаться с ним, попробовать что-то. А то ты выложил кусок, который еще и трудно адаптировать.
Из того, что сразу бросается в глаза - если в твоей программной таблице в настройках поменять угол на 0, а потом снова на 90, то все работает хорошо. Отсюда можно сделать вывод, что ты не в том месте кода поворачиваешь содержимое ячейки (либо "перекрываешь" данное дело табличным стилем либо наоборот).
В принципе, решил, что быстрей тебе помогу, если сам сделаю пример, где все хорошо работает (в силу того, что в твоем коде для меня много непонятного).
Извините, вам запрещён просмотр содержимого спойлеров.




UPD. Сорри. :) Пока скринкаст грузился, пошел поесть, потом сразу отправил, а уже все решено. :)

Оффлайн Максим Маркевич

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Надо было вместо 1.57 вписать значение Math.PI / 2....
Жесть...
Как по мне, так по заслугам :) Что это за неуважение к ПИ?  ;) :D

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Всё! Нашел в чем проблема.

Надо было вместо 1.57 вписать значение Math.PI / 2....
Жесть...
Да уж. Я пока не имел доступа к PC всё прозевал. Но с 1.57 это ты загнул. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Кстати, по поводу Math.PI. А чему его значение равно, с точностью до какого знака? Если верить справке: https://msdn.microsoft.com/ru-ru/library/system.math.pi(v=vs.110).aspx, то до 20-го. Если смотреть через VS - до 5-го. Попробовал вывести значение в консоль:
Код - C# [Выбрать]
  1. Console.WriteLine("{0:0.00000000000000000000}", Math.PI);
Вывело значение до 14-го знака, а дальше нули.
Насколько я помню, AutoCAD оперирует значениями с точностью до 16 знака. Получается, что Math.PI не очень подходит для AutoCAD? Хотя, может быть, 14 знаков достаточно.

Оффлайн Максим Маркевич

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Насколько я помню, AutoCAD оперирует значениями с точностью до 16 знака.
А почему до 16го?
Я везде в AutoCAD на 8 знаков натыкаюсь:





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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Это точность вывода значений, а я говорил про точность выполнения внутренних вычислений.