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

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

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

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

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



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

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

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

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

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

AutoCAD 2016

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Я, наверное, плохо объяснил, чего хочу выяснить. Ну или код я не так пишу (почему и просил показать вариант).
Во вложении - слегка модифицированная таблица. Проверял "объединенность" ячеек следующим кодом:
Код - 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
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь 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
  • *****
  • Сообщений: 1096
  • Карма: 172
Возможно, но я ориентируюсь на документацию:
Цитировать
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
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь 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 видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Александр, для этого надо знать где искать и уметь читать код на великом и ужасном С++ :) Что с первым, что со вторым у меня напряг ;)
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр, для этого надо знать где искать и уметь читать код на великом и ужасном С++ :) Что с первым, что со вторым у меня напряг ;)
Вот тебе еще и на C#:
Код - C# [Выбрать]
  1. // Autodesk.AutoCAD.Interop.Common.AcadTableClass
  2. using System.Runtime.CompilerServices;
  3. using System.Runtime.InteropServices;
  4.  
  5. [MethodImpl(MethodImplOptions.InternalCall)]
  6. [DispId(101)]
  7. public virtual extern bool IsMergedCell([In] int row, [In] int col, out int minRow, out int maxRow, out int minCol, out int maxCol);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Off-Topic: показать
Александр, Вы слишком высокого мнения о моем знании C# и NET API AutoCAD.
« Последнее редактирование: 17-06-2021, 21:32:05 от Александр Ривилис »
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Алексей Кулик,
А тебе не кажется, что ты неправильно используешь (vla-ismergedcell) ?
Эта функция для ячейки таблицы кроме признака объединенная/необъединенная возвращает еще и minRow, maxRow, minCol, maxCol для области объединения:
Код - Auto/Visual Lisp [Выбрать]
  1. (vla-ismergedcell table row col 'minRow 'maxRow 'minCol 'maxCol)

Похоже, я тоже не совсем оптимально использовал  (vla-ismergedcell), получая только состояние объединения.
Я нашел у себя в коде на Python странную конструкцию, о которой я  давно забыл, но она еще работает. Тогда я получал помимо статуса  объединения ячейки еще и максимальные/минимальные номера   объединяемых строк и столбцов для ячейки. Т.е. в качестве аргумента подавал только адрес ячейки row и col, взвращал 5 значений.

Код - Python [Выбрать]
  1. status, minRow, maxRow, minCol, maxCol = table.IsMergedCell(row, col, row, row, col, col)

Но пока не понимаю  как использовать эту строку на Лиспе, чтобы получить статус  объединения и номера строк/столбцов. Когда я использую код:

Код - Auto/Visual Lisp [Выбрать]
  1. (vla-ismergedcell table row col 'minRow 'maxRow 'minCol 'maxCol)

возвращет  ошибку:

Цитировать
ошибка: ActiveX Server возвратил ошибку: Параметр является обязательным

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Electric,
Надеюсь, что у тебя table - это объект таблицы, row и col - это целые числа (строка и столбец).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Electric,
Надеюсь, что у тебя table - это объект таблицы, row и col - это целые числа (строка и столбец).

Да, ошибка с моей стороны, я забыл, что вместо row у меня в цикле стояло другое  обозначение.
Теперь этот код работает.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
На всякий случай:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun C:TestTab ( / table minRow maxRow minCol maxCol)
  2.   (setq table (vlax-ename->vla-object (car (entsel))))
  3.   (if (= :vlax-true (vla-ismergedcell table 0 0 'minRow 'maxRow 'minCol 'maxCol))
  4.     (progn
  5.       (princ "\nminRow=") (princ minRow)
  6.       (princ "\nmaxRow=") (princ maxRow)
  7.       (princ "\nminCol=") (princ minCol)
  8.       (princ "\nmaxCol=") (princ maxCol)
  9.     )
  10.   )
  11.   (princ)
  12. )
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение