Неверная высота таблицы и ячейки: vla-get-height

Автор Тема: Неверная высота таблицы и ячейки: vla-get-height  (Прочитано 8822 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Добрый день!
Столкнулся с проблемой неверного расчёта высоты таблицы, хотел бы разобраться, в чём причина такого поведения функции vla-get-height.

Имеется тестовая таблица:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun table_test ()
  2.   (vl-load-com)
  3.   (setq acad_application (vlax-get-acad-object))
  4.   (setq actdoc (vla-get-ActiveDocument acad_application))
  5.   (setq model_space (vla-get-ModelSpace actdoc))
  6.  
  7.   (setq table_vla (vla-AddTable model_space (vlax-3d-point (getpoint)) 1 3 8 50))
  8.   (vla-put-regeneratetablesuppressed table_vla :vlax-true)
  9.   (vla-UnmergeCells table_vla 0 0 1 3)
  10.   (vla-SetTextHeight table_vla 7 5)
  11.   (vla-SetRowHeight table_vla 0 12)
  12.   (vla-put-RowHeight table_vla 12)
  13.  
  14.   (vla-SetText table_vla 0 0 "Первая колонка")
  15.   (vla-SetText table_vla 0 1 "Вторая колонка")
  16.   (vla-SetText table_vla 0 2 "Третья колонка")
  17.  
  18.   (setq j 0); номер вставляемой строки
  19.   (setq test_list '(("1" "1" "1") ("2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2" "2" "2") ("3" "3" "3")))
  20.   (foreach i-row test_list
  21.     (setq j (1+ j)); номер вставляемой строки
  22.    
  23.     (vla-InsertRows table_vla j 12 1); вставка новой строки
  24.     (vla-SetText table_vla j 0 (nth 0 i-row))
  25.     (vla-SetText table_vla j 1 (nth 1 i-row))
  26.     (vla-SetText table_vla j 2 (nth 2 i-row))
  27.    
  28.     (setq table_height (vla-get-height table_vla)); ! ! ! ! ! ! ! ! ! ! ! ЗДЕСЬ ставим точку останова ! ! ! ! ! ! ! ! ! ! !
  29.   );foreach
  30.  
  31.   (vla-put-HorzCellMargin table_vla 2)
  32.   (vla-put-VertCellMargin table_vla 2)
  33.  
  34.   (vla-put-regeneratetablesuppressed table_vla :vlax-false)
  35.   (vla-recomputetableblock table_vla :vlax-true)
  36.  
  37. );defun
  38.  
Из-за того, что текст "2 2 2..." получается многострочным, высота ячейки (а также строки и таблицы) увеличивается, но функция vla-get-height в точке останова неизменно показывает увеличение высоты на 12 мм. Примерно также ведёт себя и vla-GetRowHeight.
После завершения построения эти значения становятся корректными. Пробовал эксперименты с vla-put-regeneratetablesuppressed — не принесло результата.

Подскажите, пожалуйста, в чём может быть ошибка? Как найти корректную высоту таблицы в процессе её построения?


Отмечено как Решение Macondo 16-08-2018, 00:36:55

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Пробовал эксперименты с vla-put-regeneratetablesuppressed — не принесло результата.
Видимо нужно экспериментировать с (vla-recomputetableblock table_vla :vlax-true)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Macondo,
Сравни со своим кодом и сравни результаты:

Код - Auto/Visual Lisp [Выбрать]
  1. (defun table_test ()
  2.   (vl-load-com)
  3.   (setq acad_application (vlax-get-acad-object))
  4.   (setq actdoc (vla-get-ActiveDocument acad_application))
  5.   (setq model_space (vla-get-ModelSpace actdoc))
  6.  
  7.   (setq table_vla (vla-AddTable model_space (vlax-3d-point (getpoint)) 1 3 8 50))
  8.   (vla-put-regeneratetablesuppressed table_vla :vlax-true)
  9.   (vla-UnmergeCells table_vla 0 0 1 3)
  10.   (vla-SetTextHeight table_vla 7 5)
  11.   (vla-SetRowHeight table_vla 0 12)
  12.   (vla-put-RowHeight table_vla 12)
  13.  
  14.   (vla-SetText table_vla 0 0 "Первая колонка")
  15.   (vla-SetText table_vla 0 1 "Вторая колонка")
  16.   (vla-SetText table_vla 0 2 "Третья колонка")
  17.   (vla-put-HorzCellMargin table_vla 2)
  18.   (vla-put-VertCellMargin table_vla 2)
  19.  
  20.   (setq j 0); номер вставляемой строки
  21.   (setq test_list '(("1" "1" "1") ("2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2" "2" "2") ("3" "3" "3")))
  22.   (foreach i-row test_list
  23.     (setq j (1+ j)); номер вставляемой строки
  24.    
  25.     (vla-InsertRows table_vla j 12 1); вставка новой строки
  26.     (vla-SetText table_vla j 0 (nth 0 i-row))
  27.     (vla-SetText table_vla j 1 (nth 1 i-row))
  28.     (vla-SetText table_vla j 2 (nth 2 i-row))
  29.     (vla-recomputetableblock table_vla :vlax-true)    
  30.     (setq table_height (vla-get-height table_vla)); ! ! ! ! ! ! ! ! ! ! ! ЗДЕСЬ ставим точку останова ! ! ! ! ! ! ! ! ! ! !
  31.     (print table_height)
  32.   );foreach
  33.   (vla-put-regeneratetablesuppressed table_vla :vlax-false)
  34.   (vla-recomputetableblock table_vla :vlax-true)
  35. )





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

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Александр Ривилис, так работает, а реальный код — нет. Всё перепробовал, пока не пришёл к выводу, что на правильность значения как-то влияет масштабный коэффициент. Вот практически тот же код, но со множителем 100 — и значения высоты уже неверные:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun table_test ()
  2.   (vl-load-com)
  3.   (setq acad_application (vlax-get-acad-object))
  4.   (setq actdoc (vla-get-ActiveDocument acad_application))
  5.   (setq model_space (vla-get-ModelSpace actdoc))
  6.  
  7.   (setq scale_size 100); масштабный коэффициент
  8.   (setq table_vla (vla-AddTable model_space (vlax-3d-point (getpoint)) 1 3 (* 8 scale_size) (* 50 scale_size)))
  9.   (vla-put-regeneratetablesuppressed table_vla :vlax-true)
  10.  
  11.   (vla-UnmergeCells table_vla 0 0 1 3)
  12.   (vla-SetTextHeight table_vla 7 (* 5 scale_size))
  13.   (vla-SetRowHeight table_vla 0 (* 12 scale_size))
  14.   (vla-put-RowHeight table_vla (* 12 scale_size))
  15.  
  16.   (vla-SetText table_vla 0 0 "Первая колонка")
  17.   (vla-SetText table_vla 0 1 "Вторая колонка")
  18.   (vla-SetText table_vla 0 2 "Третья колонка")
  19.  
  20.   (setq j 0); номер вставляемой строки
  21.   (setq test_list '(("1" "1" "1") ("2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2" "2" "2") ("3" "3" "3")))
  22.   (foreach i-row test_list
  23.     (setq j (1+ j)); номер вставляемой строки
  24.    
  25.     (vla-InsertRows table_vla j (* 12 scale_size) 1); вставка новой строки
  26.     (vla-SetText table_vla j 0 (nth 0 i-row))
  27.     (vla-SetText table_vla j 1 (nth 1 i-row))
  28.     (vla-SetText table_vla j 2 (nth 2 i-row))
  29.     (vla-recomputetableblock table_vla :vlax-true)
  30.     (setq table_height (vla-get-height table_vla))
  31.     (print table_height)
  32.   );foreach
  33.  
  34.   (vla-SetTextHeight table_vla 7 (* 5 scale_size))
  35.   (vla-put-HorzCellMargin table_vla (* 2 scale_size))
  36.   (vla-put-VertCellMargin table_vla (* 2 scale_size))
  37.  
  38.   (vla-put-regeneratetablesuppressed table_vla :vlax-false)
  39.   (vla-recomputetableblock table_vla :vlax-true)
  40.  
  41. );defun
  42.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
пока не пришёл к выводу, что на правильность значения как-то влияет масштабный коэффициент.
Вывод неправильный. Правильный вывод - влияют:
Код - Auto/Visual Lisp [Выбрать]
  1.   (vla-SetTextHeight table_vla 7 (* 5 scale_size))
  2.   (vla-put-HorzCellMargin table_vla (* 2 scale_size))
  3.   (vla-put-VertCellMargin table_vla (* 2 scale_size))
Поставь их выше и будет правильно считаться высота.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Спасибо за помощь! До конца весь механизм работы регенераций таблицы непонятен (vla-put-regeneratetablesuppressed и vla-recomputetableblock), но вот такой итоговый вариант работает корректно:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun table_test ()
  2.   (vl-load-com)
  3.   (setq acad_application (vlax-get-acad-object))
  4.   (setq actdoc (vla-get-ActiveDocument acad_application))
  5.   (setq model_space (vla-get-ModelSpace actdoc))
  6.  
  7.   (setq scale_size 100); масштабный коэффициент
  8.   (setq table_vla (vla-AddTable model_space (vlax-3d-point (getpoint)) 1 3 (* 8 scale_size) (* 50 scale_size)))
  9.   (vla-SetTextHeight table_vla 7 (* 5 scale_size))
  10.   (vla-put-HorzCellMargin table_vla (* 2 scale_size))
  11.   (vla-put-VertCellMargin table_vla (* 2 scale_size))
  12.   (vla-put-regeneratetablesuppressed table_vla :vlax-true); !!! Регенерация включена !!!
  13.  
  14.   (vla-UnmergeCells table_vla 0 0 1 3)
  15.   (vla-SetTextHeight table_vla 7 (* 5 scale_size))
  16.   (vla-SetRowHeight table_vla 0 (* 12 scale_size))
  17.   (vla-put-RowHeight table_vla (* 12 scale_size))
  18.  
  19.   (vla-SetText table_vla 0 0 "Первая колонка")
  20.   (vla-SetText table_vla 0 1 "Вторая колонка")
  21.   (vla-SetText table_vla 0 2 "Третья колонка")
  22.  
  23.   (setq j 0); номер вставляемой строки
  24.   (setq test_list '(("1" "1" "1") ("2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2" "2" "2") ("3" "3" "3")))
  25.   (foreach i-row test_list
  26.     (setq j (1+ j)); номер вставляемой строки
  27.     (vla-put-regeneratetablesuppressed table_vla :vlax-false); !!! Регенерация выключена !!!
  28.     (vla-InsertRows table_vla j (* 12 scale_size) 1); вставка новой строки
  29.     (vla-SetText table_vla j 0 (nth 0 i-row))
  30.     (vla-SetText table_vla j 1 (nth 1 i-row))
  31.     (vla-SetText table_vla j 2 (nth 2 i-row))
  32.     (vla-SetTextHeight table_vla 7 (* 5 scale_size))
  33.     (vla-put-regeneratetablesuppressed table_vla :vlax-true); !!! Регенерация включена !!!
  34.     (vla-recomputetableblock table_vla :vlax-true); !!!
  35.     (setq table_height (vla-get-height table_vla))
  36.     (print table_height)
  37.   );foreach
  38.  
  39.   (vla-put-regeneratetablesuppressed table_vla :vlax-false); !!! Регенерация выключена !!!
  40.   (vla-recomputetableblock table_vla :vlax-true); !!!
  41.  
  42. );defun
  43.