AcDbTable underworld

Автор Тема: AcDbTable underworld  (Прочитано 13993 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
AcDbTable underworld
« : 26-11-2019, 20:43:14 »
SDK 2018
Извините, вам запрещён просмотр содержимого спойлеров.

Это TopLeft  :-X?



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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbTable underworld
« Ответ #1 : 26-11-2019, 21:58:59 »
Это ты попал на баг:



Т.е. при установке выравнивания ячейки TopLeft выравнивание TopCenter.
А вот при установке выравнивания TopRight всё нормально.





« Последнее редактирование: 29-11-2019, 13:07:34 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: AcDbTable underworld
« Ответ #2 : 26-11-2019, 22:29:30 »
Через свойства устанавливается и topLeft.
Программно НИКАК

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbTable underworld
« Ответ #3 : 26-11-2019, 23:39:10 »
Попробовал еще через COM/ActiveX - результат тот же. Отправил запрос в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbTable underworld
« Ответ #4 : 26-11-2019, 23:48:36 »
Ха! Я ведь победил этот баг. Достаточно было закрыть таблицу, открыть её повторно и снова установить выравнивание ячейкам:

Код - C++ [Выбрать]
  1. static void TestAligmentTopLeft()
  2. {
  3.   AcGePoint3d insPoint;
  4.   if (RTNORM == acedGetPoint(NULL, L"\nInsert Point: ", asDblArray(insPoint)))
  5.   {
  6.     ACHAR * TextAlign = L"Test Text";
  7.     AcDbObjectPointer<AcDbTable> table; table.create();
  8.     table->setDatabaseDefaults();
  9.     AcDbBlockTableRecordPointer pBTR(acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
  10.     pBTR->appendAcDbEntity(table);
  11.     table->setPosition(insPoint);
  12.     table->setAlignment(AcDb::CellAlignment::kTopLeft);
  13.     table->setSize(5, 2);
  14.     table->setColumnWidth(0, 70); table->setColumnWidth(1, 70);
  15.     table->mergeCells(2, 4, 0, 0);
  16.     table->setTextString(2, 0, TextAlign);
  17.     table->setTextString(3, 1, TextAlign);
  18.     table->setAlignment(2, 0, AcDb::CellAlignment::kTopLeft); // <-- Cell Alignment
  19.     table->setAlignment(3, 1, AcDb::CellAlignment::kTopLeft); // <-- Cell Alignment
  20.     table->recomputeTableBlock();
  21.     AcDbObjectId eid = table->objectId();
  22.     table->close();
  23.     table.open(eid, AcDb::kForWrite);
  24.     table->setAlignment(2, 0, AcDb::CellAlignment::kTopLeft); // <-- Cell Alignment
  25.     table->setAlignment(3, 1, AcDb::CellAlignment::kTopLeft); // <-- Cell Alignment
  26.     table->recomputeTableBlock();
  27.   }
  28. }

Пробуй.

P.S.: Но это не означает, что такое поведение нормальное.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: AcDbTable underworld
« Ответ #5 : 26-11-2019, 23:57:47 »
Достаточно было закрыть таблицу, открыть её повторно и снова установить выравнивание ячейкам

На этой таблице возможно, а на реальной - опять танцы с бубном...

Но это не означает, что такое поведение аномальное

Именно что анормальное ), чтоб не сказать ...бнормальное

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbTable underworld
« Ответ #6 : 27-11-2019, 01:00:00 »
На этой таблице возможно, а на реальной - опять танцы с бубном...
Т.е.? Этот способ не меняет выравнивание в ячейках какой-то таблицы на TopLeft? Если да, то предоставь пример. Добавлю к запросу в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: AcDbTable underworld
« Ответ #7 : 27-11-2019, 11:11:05 »
Цитата: .link=topic=9592.msg41207#msg41207 date=1574805600
Этот способ не меняет выравнивание в ячейках какой-то таблицы на TopLeft?
Этот меняет. Ждём'с ответа

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbTable underworld
« Ответ #8 : 27-11-2019, 11:54:44 »
Цитата: .link=topic=9592.msg41207#msg41207 date=1574805600
Этот способ не меняет выравнивание в ячейках какой-то таблицы на TopLeft?
Этот меняет. Ждём'с ответа

Если они нашли это workaround раньше, то ответ будет такой же как и у меня. Но я им пока подсказывать не буду. :)

P.S.: Вообще оптимальным я вижу код, который создаёт таблицу (без наполнения и форматирования), добавляет её в базу и сразу закрывает. А вот наполнение и форматирование выполняется после её повторного открытия:

Код - C++ [Выбрать]
  1. static void TestAligmentTopLeft()
  2. {
  3.   AcGePoint3d insPoint;
  4.   if (RTNORM == acedGetPoint(NULL, L"\nInsert Point: ", asDblArray(insPoint)))
  5.   {
  6.     ACHAR * TextAlign = L"Test Text";
  7.     // Создаём таблицу
  8.     AcDbObjectPointer<AcDbTable> table; table.create();
  9.     table->setDatabaseDefaults();
  10.     AcDbBlockTableRecordPointer pBTR(acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
  11.     // Добавляем таблицу в базу
  12.     pBTR->appendAcDbEntity(table);
  13.     AcDbObjectId eid = table->objectId();
  14.     // Закрываем и повторно открываем таблицу
  15.     table->close();
  16.     table.open(eid, AcDb::kForWrite);
  17.     // А вот теперь производим все действия
  18.     // по наполнению и форматированию таблицы
  19.     table->setPosition(insPoint);
  20.     table->setAlignment(AcDb::CellAlignment::kTopLeft);
  21.     table->setSize(5, 2);
  22.     table->setColumnWidth(0, 70); table->setColumnWidth(1, 70);
  23.     table->mergeCells(2, 4, 0, 0);
  24.     table->setTextString(2, 0, TextAlign);
  25.     table->setTextString(3, 1, TextAlign);
  26.     table->setAlignment(2, 0, AcDb::CellAlignment::kTopLeft); // <-- Cell Alignment
  27.     table->setAlignment(3, 1, AcDb::CellAlignment::kTopLeft); // <-- Cell Alignment
  28.     table->recomputeTableBlock();
  29.   }
  30. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: AcDbTable underworld
« Ответ #9 : 27-11-2019, 18:28:31 »
наполнение и форматирование выполняется после её повторного открытия
Как вариант - да. Только при этом скорость падает...
В первом случае - одна операция с БД. В этом - сотни.

Конкретно речь об импорте из Excel через COM, где скорость и так невелика.
Пока приходится отлавливать и запоминать адреса с выравниванием topleft и  при повторном открытии переформатировать )

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbTable underworld
« Ответ #10 : 27-11-2019, 18:33:59 »
В первом случае - одна операция с БД. В этом - сотни.
Не понял. Максимум в два раза больше.
Конкретно речь об импорте из Excel через COM, где скорость и так невелика.
Скорее это будет тормозить, чем повторное открытие AcDbTable.
Ну и еще может помочь для уменьшения тормозов AcDbTable::suppressRegenerateTable(true) перед обновлением таблицы и AcDbTable::suppressRegenerateTable(false) с AcDbTable:: recomputeTableBlock() после обновления таблицы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: AcDbTable underworld
« Ответ #11 : 27-11-2019, 19:46:50 »
Off-Topic: показать
Ректальная тонзиллэктомия: Каким образом при помощи барометра можно измерить высоту небоскреба?
1. Бросить барометр с крыши, измерить время до удара об землю, отсюда вычислить высоту здания.
2. Привязать к барометру веревку. Опустить с крыши до касания с землей. Высота здания = длина веревки плюс высота барометра.
3. Подняться по лестнице, прикладывая барометр к стене и так считая высоту здания "в барометрах". Затем умножить на высоту барометра.
4. В солнечный день положить барометр на землю рядом с небоскребом. Измерить высоту барометра, длину отбрасываемой им тени и длину тени, отбрасываемой небоскребом. Вычислить нужный катет через подобие треугольников.
5. Сделать из барометра и веревочки маятник. Измерить период колебаний на земле и на крыше. Отсюда вычислить разность ускорения свободного падения и через нее высоту.

Не хватает самого простого способа - найти управдома и сказать "Вот отличный барометр. Он ваш, если Вы скажете мне точную высоту этого здания".
« Последнее редактирование: 27-11-2019, 19:50:33 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbTable underworld
« Ответ #12 : 27-11-2019, 19:51:06 »
Sergey_K,
Это все было к чему?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: AcDbTable underworld
« Ответ #13 : 27-11-2019, 19:54:28 »
Ректальная тонзиллэктомия - это удаление гланд с противоположного отверстия.
Напоминает случай с topleft

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbTable underworld
« Ответ #14 : 27-11-2019, 19:58:33 »
Не вижу аналогии. Но если тебя такой workaround не устраивает - можешь ждать исправления.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение