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

ADN Club => AutoCAD .NET API => Тема начата: Xara от 22-01-2020, 11:56:46

Название: Проблема с установкой строке таблицы типа DATA
Отправлено: Xara от 22-01-2020, 11:56:46
Столкнулся с неприятным моментом, что повторяются ДВЕ первые строки вместо одной :(
Хотя я делаю проверку, что если строка 1-я, то назначаю ей стиль _TITLE - назначается, а если последующие - то _DATA - вот тут происходит не совсем то, что нужно...
Спасибо Диме Загорулькину, его конструкция помогла выявить стили:
Код - C# [Выбрать]
  1. TableStyle tableStyle = db.Tablestyle.GetObject(OpenMode.ForRead) as TableStyle;
  2. string[] cellStyles = tableStyle.CellStyles.Cast<string>().ToArray();
  3. string cellStyle1 = cellStyles.FirstOrDefault(item => item.ToLower(CultureInfo.InvariantCulture).Contains("title"));
  4. string cells, cellStyle2 = cellStyles.FirstOrDefault(item => item.ToLower(CultureInfo.InvariantCulture).Contains("data"));
(последнюю строку я дописал по аналогии)
Однако первой строчке назначается _TITLE, остальным вроде _DATA, кроме второй! Ей все равно задается стиль _HEADER и начинает переноситься в каждый столбец :(
Отладка показала, что он его находит, но вот эта строчка не срабатывает:
Код - C# [Выбрать]
  1. tb1.Rows[i].Style = cellStyle2; // cellstyle2 = "_DATA"
Т.е. на выходе получается tb1.Rows.Style = null.

Как бы мне от этого неприятного явления избавиться? Что нужно проверить?
(https://i.postimg.cc/jD198831/Screenshot-3.png) (https://postimg.cc/jD198831)

Заранее спасибо!
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 12:44:57
Xara,
Выложи чертеж с таблицей.
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Xara от 22-01-2020, 12:52:29
Выложи чертеж с таблицей.
Уважаемый Александр Наумович!
Прикрепил.
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 12:56:35
Выложи чертеж с таблицей.
Уважаемый Александр Наумович!
Прикрепил.
Уточняю - таблицу с заполнением.
Фу. Черт. Я не видел твоё заполнение из-за твоего текстового стиля с BigFont - таблица выглядела пустой.
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Xara от 22-01-2020, 13:08:50
таблицу с заполнением
Ой, да, Вы имеете ввиду заполнение из кода? Тогда вот:
Код - C# [Выбрать]
  1. TextStyleTable curtextstyle = tr.GetObject(doc.Database.TextStyleTableId, OpenMode.ForRead) as TextStyleTable;
  2. TableStyle tableStyle = db.Tablestyle.GetObject(OpenMode.ForRead) as TableStyle;
  3. string[] cellStyles = tableStyle.CellStyles.Cast<string>().ToArray();
  4. string cellStyle1 = cellStyles.FirstOrDefault(item => item.ToLower(CultureInfo.InvariantCulture).Contains("title"));
  5. string cells, cellStyle2 = cellStyles.FirstOrDefault(item => item.ToLower(CultureInfo.InvariantCulture).Contains("data"));
  6.  
  7. for (int i = 0; i < ncoords+1; i++)
  8.                 {
  9.                     if (i < 1)
  10.                     {
  11.                         tb1.Rows[i].Style = cellStyle1;
  12.                     }
  13.                     else
  14.                     {
  15.                         tb1.Rows[i].Style = cellStyle2; // НЕ РАБОТАЕТ
  16.                     }
  17.                     for (int j = 0; j < 3; j++)
  18.                     {
  19.                         tb1.SetTextHeight(i, j, 3);
  20.                         tb1.SetTextStyle(i, j, curtextstyle["eskdu"]);
  21.                         tb1.SetTextString(i, j, str[i, j]);
  22.                         tb1.SetAlignment(i, j, CellAlignment.MiddleCenter);
  23.                     }
  24.                    
  25.                 }
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 13:19:33
Код - C# [Выбрать]
  1. [CommandMethod("ChgRowTypeData")]
  2. public void ChgRowTypeData() // This method can have any name
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.   Editor ed = doc.Editor;
  7.   PromptEntityOptions prTab =
  8.     new PromptEntityOptions("\nВыберите таблицу для установки типа строки в Data: ");
  9.   prTab.SetRejectMessage("Это не таблица!");
  10.   prTab.AddAllowedClass(typeof(Table), true);
  11.   PromptEntityResult rsTab = ed.GetEntity(prTab);
  12.   if (rsTab.Status != PromptStatus.OK)
  13.     return;
  14.   PromptIntegerOptions prNumRow =
  15.     new PromptIntegerOptions("\nУкажите номер строки (нумерация с нуля): ");
  16.   prNumRow.AllowNegative = false;
  17.   //prNumRow.AllowZero = false;
  18.   prNumRow.AllowNone = false;
  19.   prNumRow.DefaultValue = 2;
  20.  
  21.   PromptIntegerResult rsNumRow = ed.GetInteger(prNumRow);
  22.   if (rsNumRow.Status != PromptStatus.OK)
  23.     return;
  24.  
  25.   using (Transaction tr = doc.TransactionManager.StartTransaction())
  26.   {
  27.     Table tab = tr.GetObject(rsTab.ObjectId, OpenMode.ForWrite) as Table;
  28.     if (tab != null)
  29.     {
  30.       tab.Rows[rsNumRow.Value].Style = "_Data";
  31.     }
  32.     tr.Commit();
  33.   }
  34. }

Выберешь таблицу и номер строки 1.

Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 13:21:58
Ой, да, Вы имеете ввиду заполнение из кода?
Нет. Из-за того что ты использовал шрифт eskd.shx (которого у меня нет), да еще и с установленным флажком BigFont, я видел пустую таблицу. Только после того, как я снял этот флажок - увидел заполнение таблицы.
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 13:25:32
Если ты создаёшь таблицу программно, то меняй стиль строке в отдельной транзакции, после того как таблица добавлена в чертеж.
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Xara от 22-01-2020, 16:09:39
Из-за того что ты использовал шрифт eskd.shx
Ах да, простите, не подумал об этом :)

меняй стиль строке в отдельной транзакции, после того как таблица добавлена в чертеж
Ууууууупс. У меня весь код в одной транзакции... А в процессе транзакции создается 5-6 таких таблиц...  :-[
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 16:10:51
Ууууууупс. У меня весь код в одной транзакции... А в процессе транзакции создается 5-6 таких таблиц... 
Ну так разделишь на две транзакции. Не вижу проблемы.
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Xara от 22-01-2020, 16:27:47
Не виду проблемы.
Если я правильно понял ход мыслей в коде #5, таблицу для приведения к нужному виду надо указать вручную.
А мой плагин должен отрабатывать полностью в автоматическом режиме без участия пользователя, и я пока не очень понимаю, как мне сослаться на данную таблицу "без рук" :)
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 16:37:30
Xara,
Ничего ручного здесь нет!!!
1. Код #5 у тебя нормально меняет стиль строки на "_DATA"? Если да, то переходим к пункту 2, если нет, то нужно искать причину.
2. В твоём коде когда ты добавляешь таблицу в базу вызывается метод AppendEntity. Этот метод возвращает ObjectId таблицы. После завершения транзакции, ты открываешь новую транзакцию и используя полученный в первой транзакции ObjectId таблицы открываешь её и меняешь стиль строки на "_DATA". Если несколько таблиц, то соответственно запоминаешь несколько ObjectId таблиц и открыв их в новой транзакции (метод GetObject) модифицируешь для каждой из них стиль строки.
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Xara от 22-01-2020, 17:10:34
Код #5 у тебя нормально меняет стиль строки на "_DATA"?
Не меняет  :(
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 17:11:32
Код #5 у тебя нормально меняет стиль строки на "_DATA"?
Не меняет  :(
Странно. У меня на твоей таблице меняет.
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 17:20:43
Специально подготовил видео:
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Xara от 22-01-2020, 17:58:30
Я ни в коем случае не ставил под сомнение то, что у Вас оно работает :)

Скажите пожалуйста, я вот нашел пример (https://adn-cis.org/forum/index.php?topic=32.msg288#msg288), однако тут, хоть и не используется разбиение таблицы, но и для присвоения стиля строкам ячейки не используется отдельная транзакция...  ???
Правильно ли я понимаю, что такая отдельная транзакция нужна, если разметку планируется сделать отличной от такой:
TITLE
---------
HEADER
---------
DATA
.
.
.DATA
?
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 18:01:35
Я ни в коем случае не ставил под сомнение, что у Вас оно работает :)
Тогда что не работает у тебя? Я просил проверить именно мой код полностью.
Правильно ли я понимаю, что такая отдельная транзакция нужна, если разметку планируется сделать отличной от такой:
Это один из частных случаев. Здесь на форуме уже попадались ситуации, когда требовалось разделение транзакций.
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Xara от 22-01-2020, 18:36:00
Тогда что не работает у тебя? Я просил проверить именно мой код полностью.
Так да, я проверил Ваш код, полностью, без правок - ничего не меняется.
Строка
Код - C# [Выбрать]
  1. tab.Rows[rsNumRow.Value].Style = "_Data";
не меняет значение tab.Rows[1].Style со значения null на _Data.

Физически до выполнения кода первая строка была TITLE, вторая HEADER, дальше DATA. После выполнения кода - все то же самое.
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 18:37:25
Xara,
1. Видео смотрел?
Физически до выполнения кода первая строка была TITLE, вторая HEADER, дальше DATA. После выполнения кода - все то же самое.
В видео ты видел, что вторая строка поменялась на DATA?
2. В какой версии AutoCAD проверял?
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Xara от 22-01-2020, 18:44:45
Xara,
1. Видео смотрел?
Физически до выполнения кода первая строка была TITLE, вторая HEADER, дальше DATA. После выполнения кода - все то же самое.
В видео ты видел, что вторая строка поменялась на DATA?
2. В какой версии AutoCAD проверял?
1. Видео, конечно же, смотрел. Само собой, видел :)
2. Вот он тот вопрос, чую, после которого буду либо забанен, либо просто отправлен на три весёлые... :-\
Прошу, не торопитесь тапками гнать куда подальше... :-[
...NanoCAD СПДС 9.1.
В дальнейшем мой плагин я буду адаптировать и под AutoCAD, но первоочередная задача - к сожалению, ...
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 18:46:28
Прошу, не торопитесь тапками гнать куда подальше... :-[
...NanoCAD СПДС 9.1.
С этими багами к ним. На нашем форуме мы обсуждаем только продукты Autodesk
P.S.: Это я не посылаю, а объясняю, что на этот вопрос нужно искать ответ не здесь.
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Xara от 22-01-2020, 18:50:12
С этими багами к ним. На нашем форуме мы обсуждаем только продукты Autodesk
Я только перешел с LISP на C# и в этом еще пока новичок (кстати, Дима Загорулькин меня и подтолкнул в этом направлении, спасибо тебе, если читаешь!), и, мне казалось, что архитектура ACAD и NCAD очень схожая, а отличия минимальные по сути... Ладно, спасибо за помощь, буду искать :)
Название: Re: Проблема с установкой строке таблицы типа DATA
Отправлено: Александр Ривилис от 22-01-2020, 20:51:24
архитектура ACAD и NCAD очень схожая
Может быть и схожая (внешне), но баги разные. И так как NCAD пытается копировать функциональность AutoCAD, то рассчитывать на 100%-ую одинаковость поведения в API не приходится.