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

ADN Club => ObjectARX => Тема начата: Sergey_K от 26-11-2019, 20:43:14

Название: AcDbTable underworld
Отправлено: Sergey_K от 26-11-2019, 20:43:14
SDK 2018
Извините, вам запрещён просмотр содержимого спойлеров.

Это TopLeft  :-X?

(https://i.postimg.cc/TLtF8J7N/jpg.jpg) (https://postimg.cc/TLtF8J7N)
Название: Re: AcDbTable underworld
Отправлено: Александр Ривилис от 26-11-2019, 21:58:59
Это ты попал на баг:

(https://live.staticflickr.com/65535/49129025137_6cc873d632_o.png)

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

(https://live.staticflickr.com/65535/49128364188_223e441fc9_o.png)



Название: Re: AcDbTable underworld
Отправлено: Sergey_K от 26-11-2019, 22:29:30
Через свойства устанавливается и topLeft.
Программно НИКАК
Название: Re: AcDbTable underworld
Отправлено: Александр Ривилис от 26-11-2019, 23:39:10
Попробовал еще через COM/ActiveX - результат тот же. Отправил запрос в ADN DevHelp.
Название: Re: AcDbTable underworld
Отправлено: Александр Ривилис от 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.: Но это не означает, что такое поведение нормальное.
Название: Re: AcDbTable underworld
Отправлено: Sergey_K от 26-11-2019, 23:57:47
Достаточно было закрыть таблицу, открыть её повторно и снова установить выравнивание ячейкам

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

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

Именно что анормальное ), чтоб не сказать ...бнормальное
Название: Re: AcDbTable underworld
Отправлено: Александр Ривилис от 27-11-2019, 01:00:00
На этой таблице возможно, а на реальной - опять танцы с бубном...
Т.е.? Этот способ не меняет выравнивание в ячейках какой-то таблицы на TopLeft? Если да, то предоставь пример. Добавлю к запросу в ADN DevHelp.
Название: Re: AcDbTable underworld
Отправлено: Sergey_K от 27-11-2019, 11:11:05
Цитата: .link=topic=9592.msg41207#msg41207 date=1574805600
Этот способ не меняет выравнивание в ячейках какой-то таблицы на TopLeft?
Этот меняет. Ждём'с ответа
Название: Re: AcDbTable underworld
Отправлено: Александр Ривилис от 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. }
Название: Re: AcDbTable underworld
Отправлено: Sergey_K от 27-11-2019, 18:28:31
наполнение и форматирование выполняется после её повторного открытия
Как вариант - да. Только при этом скорость падает...
В первом случае - одна операция с БД. В этом - сотни.

Конкретно речь об импорте из Excel через COM, где скорость и так невелика.
Пока приходится отлавливать и запоминать адреса с выравниванием topleft и  при повторном открытии переформатировать )
Название: Re: AcDbTable underworld
Отправлено: Александр Ривилис от 27-11-2019, 18:33:59
В первом случае - одна операция с БД. В этом - сотни.
Не понял. Максимум в два раза больше.
Конкретно речь об импорте из Excel через COM, где скорость и так невелика.
Скорее это будет тормозить, чем повторное открытие AcDbTable.
Ну и еще может помочь для уменьшения тормозов AcDbTable::suppressRegenerateTable(true) перед обновлением таблицы и AcDbTable::suppressRegenerateTable(false) с AcDbTable:: recomputeTableBlock() после обновления таблицы.
Название: Re: AcDbTable underworld
Отправлено: Sergey_K от 27-11-2019, 19:46:50
Off-Topic: показать
Ректальная тонзиллэктомия: Каким образом при помощи барометра можно измерить высоту небоскреба?
1. Бросить барометр с крыши, измерить время до удара об землю, отсюда вычислить высоту здания.
2. Привязать к барометру веревку. Опустить с крыши до касания с землей. Высота здания = длина веревки плюс высота барометра.
3. Подняться по лестнице, прикладывая барометр к стене и так считая высоту здания "в барометрах". Затем умножить на высоту барометра.
4. В солнечный день положить барометр на землю рядом с небоскребом. Измерить высоту барометра, длину отбрасываемой им тени и длину тени, отбрасываемой небоскребом. Вычислить нужный катет через подобие треугольников.
5. Сделать из барометра и веревочки маятник. Измерить период колебаний на земле и на крыше. Отсюда вычислить разность ускорения свободного падения и через нее высоту.

Не хватает самого простого способа - найти управдома и сказать "Вот отличный барометр. Он ваш, если Вы скажете мне точную высоту этого здания".
Название: Re: AcDbTable underworld
Отправлено: Александр Ривилис от 27-11-2019, 19:51:06
Sergey_K,
Это все было к чему?
Название: Re: AcDbTable underworld
Отправлено: Sergey_K от 27-11-2019, 19:54:28
Ректальная тонзиллэктомия - это удаление гланд с противоположного отверстия.
Напоминает случай с topleft
Название: Re: AcDbTable underworld
Отправлено: Александр Ривилис от 27-11-2019, 19:58:33
Не вижу аналогии. Но если тебя такой workaround не устраивает - можешь ждать исправления.
Название: Re: AcDbTable underworld
Отправлено: Sergey_K от 27-11-2019, 20:06:42
"Нормальные герои всегда идут в обход"
(с) Айболит-66

Меня устраивает, но хотелось бы услышать и начальника механического цеха )
Название: Re: AcDbTable underworld
Отправлено: Александр Ривилис от 27-11-2019, 21:44:31
Меня устраивает, но хотелось бы услышать и начальника механического цеха )
Там вообще-то речь шла о начальнике транспортного цеха...
Название: Re: AcDbTable underworld
Отправлено: Александр Ривилис от 11-12-2019, 13:09:47
Попробовал еще через COM/ActiveX - результат тот же. Отправил запрос в ADN DevHelp.
В ADN DevHelp подтвердили такое поведение и создали запрос к команде разработчиков на исправление. Т.е. когда-нибудь это поведение будет исправлено. Пока же пользуйся найденным мной обходом этой проблемы.
Название: Re: AcDbTable underworld
Отправлено: Sergey_K от 11-12-2019, 20:52:03
Цитата:  
link=topic=9592.msg41481#msg41481 date=1576058987
Пока же пользуйся найденным мной обходом этой проблемы
Пользуюсь. Даже до находки...
Это не единственный баг у AcDbTable. Форматирование числового формата тоже глючит на нерезидентных объектах и обходится аналогично
Название: Re: AcDbTable underworld
Отправлено: Александр Ривилис от 11-12-2019, 21:05:56
Форматирование числового формата тоже глючит на нерезидентных объектах и обходится аналогично
Это не считается багом и неоднократно описано.