Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: alexeyOMG от 14-10-2016, 07:57:31

Название: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: alexeyOMG от 14-10-2016, 07:57:31
Добрый день.

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

(https://s3.postimg.org/rs2grivpr/Windows_8_1_x64_2016_10_14_09_50_18.png) (https://postimg.org/image/rs2grivpr/)
Вот пример.
Высота у ячейки = 62.5
Ширина = 58.4

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

(https://s14.postimg.org/7v0vy9wx9/Windows_8_1_x64_2016_10_14_09_53_22.png) (https://postimg.org/image/7v0vy9wx9/)

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

Вот свойства этой ячейки после изменения размеров (вдруг что-то не так в параметрах ну и вообще вдруг понадобится для решения проблемы):
(https://s21.postimg.org/wyi6lwlur/Windows_8_1_x64_2016_10_14_10_01_51.png) (https://postimg.org/image/wyi6lwlur/)


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

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

Заранее спасибо :)
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Александр Ривилис от 14-10-2016, 08:10:21
Выложи dwg-файл с одной такой таблицей и укажи версию AutoCAD.
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: alexeyOMG от 14-10-2016, 08:31:36
Выложи dwg-файл с одной такой таблицей и укажи версию AutoCAD.

Версия - Autocad 2016

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

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

!!!!!!!!!! В документе  "Ошибка верстки ..." я сделал у всей первой строчки угол поворота - 90 градусов. Тогда у меня в первой ячейке ширина и высота текста стала корректной. После этого обратно поменял угол поворота в остальных ячейках на 0, но в первой ячейки размеры остались корректными.
Так в чем проблема-то? Как мне программно делать?
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: alexeyOMG от 14-10-2016, 08:42:30
Если поможет, то вот метод, который выводит данную таблицу.
Объект 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.  
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: alexeyOMG от 14-10-2016, 11:54:48
Всё! Нашел в чем проблема.

Надо было вместо 1.57 вписать значение Math.PI / 2....
Жесть...
Типа 1.57 - это не ровно 90 градусов. Хотя по факту пишет в автокаде, что 90 (видимо округляет).
В итоге автокад рисует ячейку, как будто текст там под углом 89.999 мб. В итоге он и высоту и в ширину растягивает ячейку (типа квардарата походу рисует). А в случае Math.PI / 2 - это ровно 90 градусов и он нормально растягивает вверх и не оставляет пробелы по бокам.
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Алексей Кулик от 14-10-2016, 12:10:01
Вообще-то pi далеко не 3.14...
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: alexeyOMG от 14-10-2016, 12:13:24
Вообще-то pi далеко не 3.14...

Понятно, что это разные значения. Но в сети куча примеров, где написано именно 3.14. Ну не вдаваясь в подробности я это значение и использовал с самого начала до того момента, когда мне не понадобились чёткие размеры ячейки.
Но а то, что автокад по факту округляет при отображении в свойствах до "90", а по факту меньше - и это влияет так жестко на вёрстку - вот этого я предположить не мог конечно.
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Алексей Кулик от 14-10-2016, 12:17:09
AutoCAD может показывать значение округленным до 2. Но это не делает pi равным 4.
Для ради интересу поменяй luprec на 8 и посмотри на результаты показа и "округления"
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Максим Маркевич от 14-10-2016, 12:59:13
alexeyOMG, сделай, пожалуйста, тестовый пример кода. Скажем, создание таблицы с одной ячейкой, то есть хотелось бы взять вот твой код и побаловаться с ним, попробовать что-то. А то ты выложил кусок, который еще и трудно адаптировать.
Из того, что сразу бросается в глаза - если в твоей программной таблице в настройках поменять угол на 0, а потом снова на 90, то все работает хорошо. Отсюда можно сделать вывод, что ты не в том месте кода поворачиваешь содержимое ячейки (либо "перекрываешь" данное дело табличным стилем либо наоборот).
В принципе, решил, что быстрей тебе помогу, если сам сделаю пример, где все хорошо работает (в силу того, что в твоем коде для меня много непонятного).
Извините, вам запрещён просмотр содержимого спойлеров.

(https://s13.postimg.org/4bpsjdj1v/Screen_Shot_001.jpg) (https://postimg.org/image/4bpsjdj1v/)


UPD. Сорри. :) Пока скринкаст грузился, пошел поесть, потом сразу отправил, а уже все решено. :)
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Максим Маркевич от 14-10-2016, 13:16:19
Надо было вместо 1.57 вписать значение Math.PI / 2....
Жесть...
Как по мне, так по заслугам :) Что это за неуважение к ПИ?  ;) :D
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: alexeyOMG от 14-10-2016, 13:19:52
Спасибо за труды :)
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Александр Ривилис от 14-10-2016, 13:46:11
Всё! Нашел в чем проблема.

Надо было вместо 1.57 вписать значение Math.PI / 2....
Жесть...
Да уж. Я пока не имел доступа к PC всё прозевал. Но с 1.57 это ты загнул. :)
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Дмитрий Загорулькин от 16-10-2016, 10:14:21
Кстати, по поводу 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 знаков достаточно.
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Максим Маркевич от 16-10-2016, 11:00:35
Насколько я помню, AutoCAD оперирует значениями с точностью до 16 знака.
А почему до 16го?
Я везде в AutoCAD на 8 знаков натыкаюсь:
(https://s10.postimg.org/8iuwanf91/Screen_Shot_001.jpg) (https://postimg.org/image/8iuwanf91/)
(https://s10.postimg.org/4nri82w39/Screen_Shot_002.jpg) (https://postimg.org/image/4nri82w39/)
(https://s13.postimg.org/ylsaolhnn/Screen_Shot_003.jpg) (https://postimg.org/image/ylsaolhnn/)
(https://s9.postimg.org/v9l85x4jv/Screen_Shot_004.jpg) (https://postimg.org/image/v9l85x4jv/)
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Дмитрий Загорулькин от 16-10-2016, 11:03:53
Это точность вывода значений, а я говорил про точность выполнения внутренних вычислений.
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Максим Маркевич от 16-10-2016, 11:06:07
Это точность вывода значений, а я говорил про точность выполнения внутренних вычислений.
Понял. А как можно в этом убедиться? Где посмотреть?
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Дмитрий Загорулькин от 16-10-2016, 11:27:33
Сложно сказать. Это было настолько давно, что уже не помню, откуда у меня такие сведения. Возможно, что я читал об этом в справочнике по языку Auto-VisualLisp.
Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Максим Маркевич от 16-10-2016, 14:17:29
Сложно сказать. Это было настолько давно, что уже не помню, откуда у меня такие сведения. Возможно, что я читал об этом в справочнике по языку Auto-VisualLisp.
Я тут, в принципе, подумал о том, как можно доказать это утверждение :)
В общем, написал маленький кодик:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.Geometry;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using ApServCore = Autodesk.AutoCAD.ApplicationServices.Core;
  5.  
  6. namespace Reinforcement
  7. {
  8.     public class Tests
  9.     {
  10.         [CommandMethod("PT")]
  11.         public static void PointTests()
  12.         {
  13.             var ed = ApServCore.Application.DocumentManager.MdiActiveDocument.Editor;
  14.             var db = ed.Document.Database;
  15.  
  16.             var pt1 = ed.GetPoint("\nВыберите точку 1:");
  17.             if (pt1.Status != PromptStatus.OK)
  18.             {
  19.                 return;
  20.             }
  21.             var pt3 = pt1.Value;
  22.            
  23.             var pt2 = ed.GetPoint("\nВыберите точку 2:");
  24.             if (pt2.Status != PromptStatus.OK)
  25.             {
  26.                 return;
  27.             }
  28.             var pt4 = pt2.Value;
  29.  
  30.             var distance = pt3.DistanceTo(pt4);
  31.             var angle = pt3.GetVectorTo(pt4).GetAngleTo(Vector3d.XAxis, Vector3d.YAxis);
  32.  
  33.             ApServCore.Application.ShowAlertDialog("distance = " + distance + "###" + "angle = " + angle);
  34.         }
  35.     }
  36. }
Который выдает вот такие результаты:
(https://s14.postimg.org/59irsxtjx/Screen_Shot.jpg) (https://postimg.org/image/59irsxtjx/)
Ну и, конечно же, мне известно, что угол в 45 градусов в радианах будет равен:
(https://s14.postimg.org/u36fjlr19/Screen_Shot_001.jpg) (https://postimg.org/image/u36fjlr19/)
Таким образом, можно ли утверждать, что точность выполнения внутренних вычислений в автокад равна 16 знакам (не после запятой, а вообще)?

Название: Re: Размер ячейки и текста ячейки таблицы с повёрнутым на 90 градусов содержимым
Отправлено: Александр Ривилис от 16-10-2016, 19:30:05
Таким образом, можно ли утверждать, что точность выполнения внутренних вычислений в автокад равна 16 знакам (не после запятой, а вообще)?
Точность определяется типом данных double, и к AutoCAD непосредственного отношения не имеет.
https://ru.m.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%B4%D0%B2%D0%BE%D0%B9%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8