Не определяется стиль заголовка объединенных ячеек

Автор Тема: Не определяется стиль заголовка объединенных ячеек  (Прочитано 4649 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 8
Есть таблица AutoCAD, все строки кроме шапки выполнены стилем ячеек "Данные", верхушка таблицы состоит из трех строк объединенных ячеек, которым назначен стиль "Заголовок".
В скрипте я считываю стиль строк или ячеек и в зависимости от того, "Заголовок" это  или  просто "Данные", выполняю различные действия.
Проблема в том, что как "Заголовок" определяется только самая верхняя строка



Т.е. с помощью "(vla-GetRowType table i)"   выдает "4" только для верхней строки, а  "row_style (vla-GetCellStyle table i 0)"  - только для ячейки верхней строки "_HEADER".
Есть ли способ надежно определить стиль объединенных ячеек? Или это какая-то особенность API автокада и сделать это возможно только для разделенных.

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

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

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

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

AutoCAD 2016

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

  • Administrator
  • *****
  • Сообщений: 945
  • Карма: 154
По-моему, лиспом подобное невозможно сделать. Мало того, даже если разбить ячейки, вторая и далее строки опознаются неверно.
Я бы скорее всего забил на попытки опознания и делал обработку начиная с 4 строки.
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 12891
  • Карма: 1662
  • Рыцарь ObjectARX
  • Skype: rivilis
Electric,
Это похоже на баг в AutoCAD COM/ActiveX. Аналогичное поведение наблюдается и в более свежих версиях AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 8
Тогда у меня глупый вопрос - возможно ли писать на AutoLISP в AutoCAD без применения  ActiveX?
Или проще снова идти учить C#.

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

  • Administrator
  • *****
  • Сообщений: 945
  • Карма: 154
возможно ли писать на AutoLISP в AutoCAD без применения  ActiveX?
Возможно, но очень геморройно - особенно касаемо таблиц. Там в DXF кодах запутаться проще простого, мне кажется.
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 8
По-моему, лиспом подобное невозможно сделать. Мало того, даже если разбить ячейки, вторая и далее строки опознаются неверно.
Я бы скорее всего забил на попытки опознания и делал обработку начиная с 4 строки.

У меня таблицы могут иметь разные заголовки. Я поступил немного иначе, считываю как заголовок все строки, имеющие вертикально объединенные ячейки со строкой-заголовком,  vla-ismergedcell работает нормально.

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

  • Administrator
  • *****
  • Сообщений: 945
  • Карма: 154
А каким манером определяется, что выполнено объединение именно с первой строкой? Мне реально интересно.
Если объединить ячейки данных по вертикали - код корректно сработает?
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 8
А каким манером определяется, что выполнено объединение именно с первой строкой? Мне реально интересно.
Если объединить ячейки данных по вертикали - код корректно сработает?

Пока прохожу по строкам таблицы, если строка по стилю определяется  как Заголовок - с помощью вложенного цикла прохожу по её столбцам и по каждой её ячейке с помощью vla-ismergedcell определяю насколько конкретная ячейка объединена вниз, инкрементируя аргумент maxRow. Таким  образом получаю максимальный номер объединенной ячейки снизу.
На стиль строки  - не Заголовок, этот IF не запустится.
Даже если это неотимальный алгоритм, он выполняется на 1-3 начальных строках таблицы кабельного журнала или спецификации, что не влияет на производительность.

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

  • Administrator
  • *****
  • Сообщений: 12891
  • Карма: 1662
  • Рыцарь ObjectARX
  • Skype: rivilis
Electric,
Вполне нормальный алгоритм. Разве что можно повторно не анализировать при помощи vla-ismergedcell те ячейки, которые уже были определены как объединённые. Т.е. например, если для ячейки (0 0) minRow = 0, а maxRow = 2, то проходить по рядам 1 и 2 для нулевой колонки уже нет смысла.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 945
  • Карма: 154
Я, наверное, плохо объяснил, чего хочу выяснить. Ну или код я не так пишу (почему и просил показать вариант).
Во вложении - слегка модифицированная таблица. Проверял "объединенность" ячеек следующим кодом:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun t1 (table / maxrow res row)
  2.   ;; (t1 (vlax-ename->vla-object (car (entsel))))
  3.   (setq maxrow 0
  4.         row 0
  5.   ) ;_ end of setq
  6.   (repeat (vla-get-rows table)
  7.     (setq res (cons (cons row (vla-ismergedcell table row 0 0 row 0 0)) res)
  8.           row (1+ row)
  9.     ) ;_ end of setq
  10.   ) ;_ end of repeat
  11.   (reverse res)
  12. ) ;_ end of defun
Результат:
Код - Auto/Visual Lisp [Выбрать]
  1. '((0 . :vlax-true)
  2.   (1 . :vlax-true)
  3.   (2 . :vlax-true)
  4.   (3 . :vlax-true)
  5.   (4 . :vlax-true)
  6.   (5 . :vlax-true)
  7.   (6 . :vlax-true)
  8.   (7 . :vlax-true)
  9.   (8 . :vlax-true)
  10.   (9 . :vlax-true)
  11.   (10 . :vlax-true)
  12.   (11 . :vlax-true)
  13.   (12 . :vlax-true)
  14.   (13 . :vlax-true)
  15.   (14 . :vlax-true)
  16.   (15 . :vlax-true)
  17.   (16 . :vlax-true)
  18.   (17 . :vlax-false)
  19.   (18 . :vlax-false)
  20.   (19 . :vlax-false)
  21.   (20 . :vlax-false)
  22.   (21 . :vlax-false)
  23.   (22 . :vlax-false)
  24.   (23 . :vlax-false)
  25.   (24 . :vlax-false)
  26.   (25 . :vlax-false)
  27.   (26 . :vlax-false)
  28.   (27 . :vlax-false)
  29.   (28 . :vlax-false)
  30.   (29 . :vlax-false)
  31.  )
Вот я и спрашиваю - как можно определить границы объединенной ячейки.
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 12891
  • Карма: 1662
  • Рыцарь ObjectARX
  • Skype: rivilis
Алексей Кулик,
А тебе не кажется, что ты неправильно используешь (vla-ismergedcell) ?
Эта функция для ячейки таблицы кроме признака объединенная/необъединенная возвращает еще и minRow, maxRow, minCol, maxCol для области объединения:
Код - Auto/Visual Lisp [Выбрать]
  1. (vla-ismergedcell table row col 'minRow 'maxRow 'minCol 'maxCol)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 945
  • Карма: 154
Возможно, но я ориентируюсь на документацию:
Цитировать
VBA:

RetVal = object.IsMergedCell(row, col, minRow, maxRow, minCol, maxCol)object
Type: Table

The object this method applies to.

row
Access: Input-only

Type: Long

The row number.

col
Access: Input-only

Type: Long

The column number.

minRow
Access: Input-only

Type: Long

Zero-based lower bound of a row index.

maxRow
Access: Input-only

Type: Long

Zero-based upper bound of a row index.

minCol
Access: Input-only

Type: Long

Zero-based lower bound of a column index.

maxCol
Access: Input-only

Type: Long

Zero-based upper bound of a column index.

Как-то не вижу тут про Output-only. В очередной раз документация расходится с жизнью? :)

Я ж говорил, что код неправильно пишу! :)
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 12891
  • Карма: 1662
  • Рыцарь ObjectARX
  • Skype: rivilis
Возможно, но я ориентируюсь на документацию:
Интересно, что в более старой документации про Input-only для последних четырех аргументов ничего не сказано. Зато как всегда помогает первоисточник, т.е. файл acadi.h в ObjectARX SDK:
Код - C++ [Выбрать]
  1.         virtual /* [helpstringcontext][helpcontext][id] */ HRESULT STDMETHODCALLTYPE IsMergedCell(
  2.             /* [in] */ int row,
  3.             /* [in] */ int col,
  4.             /* [out] */ int *minRow,
  5.             /* [out] */ int *maxRow,
  6.             /* [out] */ int *minCol,
  7.             /* [out] */ int *maxCol,
  8.             /* [retval][out] */ VARIANT_BOOL *pbValue) = 0;
       
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение