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

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: 1958 от 14-04-2022, 07:46:11

Название: Выбор содержимого ячейки таблицы
Отправлено: 1958 от 14-04-2022, 07:46:11
Столкнулся с такой проблемой. При запуске короткого лиспа в AC-2007 всё работает нормально, содержимое указываемой ячейки получается. При запуске этого же кода в AC-2021 ячейка не читается, выдается сообщение:  ** Error: неверный тип аргумента: lentityp nil **
В чем проблема, не пойму. Что интересно, если в AC-2021 (2020) указать не середину ячейки, а сторону ячейки, иногда значение получается.
Прикладываю два чертежа в разных версиях автокада.

Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 14-04-2022, 15:17:51
В чем проблема, не пойму.
Тут не нужно ничего понимать - тут нужно просто отладить программу и найти откуда появляется ошибка.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: 1958 от 14-04-2022, 17:12:38
Вообщем придумал вот это:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:11 (/)
  2.  (vl-load-com)
  3.  (setq p_1 (getpoint "\nКлик по числу в таблице >"))
  4.  (setq p_2 (list (- (car p_1) 50) (- (cadr p_1) 20)))
  5.  (setq ent (ssname (ssget "_C" p_1 p_2 '((0 . "ACAD_TABLE"))) 0))
  6.  (setq vla_table (vlax-ename->vla-object ent))
  7.  (vla-HitTest vla_table
  8.               (vlax-3d-point p_1)
  9.               (vlax-3d-point (trans (getvar 'ViewDir) 1 0))
  10.               'row
  11.               'col
  12.  )
  13.  (setq val (vla-gettext vla_table row col))
  14.  (alert (vl-prin1-to-string val))
  15. )
Вроде работает.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 14-04-2022, 18:35:50
1958,
Не забывай про правило форматирования кода на форуме!
Что касается твоего кода, то он конечно же не универсальный. И кроме того нет проверки на то, что вообще что-то выбрано.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 14-04-2022, 19:05:49
1958,
Проверил код из первого сообщения в AutoCAD 2021. Все нормально работает, если выбираешь текст внутри ячейки.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: 1958 от 14-04-2022, 19:27:38
Проверил код из первого сообщения в AutoCAD 2021. Все нормально работает, если выбираешь текст внутри ячейки.
Ну, не знаю. У меня ни в какую. Кликаю по по тексту и сразу
** Error: неверный тип аргумента: lentityp nil **

Не забывай про правило форматирования кода на форуме!
Прощу прощения в очередной раз!  :(
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 14-04-2022, 19:45:06
1958,
Ну, не знаю. У меня ни в какую. Кликаю по по тексту и сразу
На всякий случай показываю:
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: 1958 от 14-04-2022, 20:11:59
Ну не получается у меня выборка значения через entsel, не знаю почему.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: 1958 от 14-04-2022, 20:44:25
Вот моя запись.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 14-04-2022, 20:49:03
1958,
Правило добавления видео к сообщениям на форуме у меня в подписи.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 14-04-2022, 21:14:29
Похоже выбор не происходит если используется TTF-шрифт и используется визуальный стиль 2D-Wireframe. В других визуальных стилях тексты в таблице нормально выбираются.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: 1958 от 15-04-2022, 08:33:17
Точно! Сейчас проверил. Если выбрать другой стиль, всё работает. Если заменить текстовый стиль на любой, не использующий TTF-шрифт, то работает и при визуальном стиле 2D-каркас.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Алексей Кулик от 15-04-2022, 10:03:39
Может, попробовать vla-getcellvalue? А не vla-gettext?
Сейчас проверить не могу :(
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 15-04-2022, 10:31:05
Может, попробовать vla-getcellvalue? А не vla-gettext?
Сейчас проверить не могу :(
Не срабатывает (entsel) - ничего не выбирается.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Алексей Кулик от 15-04-2022, 10:48:37
Скорее всего, я что-то не понимаю и не учитываю. Но у меня в ACAD2020 корректно сработал следующий вариант (естественно, без проверок):
Код - Auto/Visual Lisp [Выбрать]
  1. (defun t1 (/ table point row col)
  2.   (setq table (vlax-ename->vla-object (car (entsel "\nSelect table : ")))
  3.         point (getpoint "\nPick point in cell: ")
  4.   ) ;_ end of setq
  5.   (vla-hittest table (vlax-3d-point point) (vlax-3d-point (trans (getvar 'viewdir) 1 0)) 'row 'col)
  6.   (list (cons "cellvalue" (vla-getcellvalue table row col))
  7.         (cons "text" (vla-gettext table row col))
  8.   ) ;_ end of list
  9. ) ;_ end of defun
Одно "но": в ячейке у меня находятся именно обычные тексты, не содержащие поля. Ну и вариант вхождения блока в ячейку тоже не предусмотрен.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 15-04-2022, 11:16:26
Алексей Кулик,
В AutoCAD 2020 позже проверю. Уточни у текстов TTF-шрифт? Это существенно, так как с SHX-шрифтами все и так отлично работает. При этом с отдельным текстом (не в таблице) (entsel) нормально срабатывает. Для проверки возьми чертеж из первого сообщения и поменяй шрифт на TTF. Так как у меня оригинального шрифта небыло, то он заменился на simplex.shx
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Алексей Кулик от 15-04-2022, 11:34:24
А нужен именно TTF-шрифт (т.е. принудительное форматирование) или достаточно использования текстового стиля с ttf? У меня-то второй вариант был.
Файл скачаю, но чуть позже - не успеваю ни фига :(
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: 1958 от 15-04-2022, 11:37:19
Скорее всего, я что-то не понимаю и не учитываю
У вас надо два раза делать выборку - 1.выбор таблицы; 2.выбор точки. У меня в посте №2 один клик и выборка текста производится без учета текстового стиля.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 15-04-2022, 11:46:22
Алексей Кулик,
Действительно. У тебя отдельный выбор таблицы. И наверное ты не тыкаешь в текст внутри таблицы. Иначе зачем еще дополнительно запрашивать точку...
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Алексей Кулик от 15-04-2022, 11:49:09
Шрифта тоже нет, заменил на ISOCPEUR - мой код сработал. А если хочется "по одной точке определять сразу все", то код будет чуть-чуть сложнее:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2.  
  3. (defun t2 (/ _kpblc-get-active-space-obj adoc space table point row col mi ma)
  4.  
  5.   (defun _kpblc-get-active-space-obj (doc)
  6.     (if (and (zerop (vla-get-activespace doc)) (equal :vlax-false (vla-get-mspace doc)))
  7.       (vla-get-paperspace doc)
  8.       (vla-get-modelspace doc)
  9.     ) ;_ end of if
  10.   ) ;_ end of defun
  11.  
  12.   (if (and (= (type (vl-catch-all-apply (function (lambda () (setq point (getpoint "\nPick the point : "))))))
  13.               'list
  14.            ) ;_ end of =
  15.            point
  16.       ) ;_ end of and
  17.     (progn
  18.       (setq adoc  (vla-get-activedocument (vlax-get-acad-object))
  19.             space (_kpblc-get-active-space-obj adoc)
  20.       ) ;_ end of setq
  21.       (vlax-for ent (if (vlax-property-available-p space 'block)
  22.                       (vla-get-block space)
  23.                       space
  24.                     ) ;_ end of if
  25.         (if (and (not table)
  26.                  (= (vla-get-objectname ent) "AcDbTable")
  27.                  (not (vl-catch-all-error-p
  28.                         (vl-catch-all-apply
  29.                           (function (lambda () (vla-getboundingbox ent 'mi 'ma)))
  30.                         ) ;_ end of vl-catch-all-apply
  31.                       ) ;_ end of vl-catch-all-error-p
  32.                  ) ;_ end of not
  33.                  (apply (function and)
  34.                         (mapcar (function <=) (vlax-safearray->list mi) point (vlax-safearray->list ma))
  35.                  ) ;_ end of apply
  36.             ) ;_ end of and
  37.           (setq table ent)
  38.         ) ;_ end of if
  39.       ) ;_ end of vlax-for
  40.       (if table
  41.         (progn
  42.           (vla-hittest table (vlax-3d-point point) (vlax-3d-point (trans (getvar 'viewdir) 1 0)) 'row 'col)
  43.           (list (cons "table" table)
  44.                 (cons "row" row)
  45.                 (cons "col" col)
  46.                 (cons "cellvalue" (vla-getcellvalue table row col))
  47.                 (cons "text" (vla-gettext table row col))
  48.           ) ;_ end of list
  49.         ) ;_ end of progn
  50.       ) ;_ end of if
  51.     ) ;_ end of progn
  52.   ) ;_ end of if
  53. ) ;_ end of defun
Попроще придумать пока не смог, в legacy закопался. Проверить код тоже пока не смог, сорри
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 15-04-2022, 12:08:35
В AutoCAD 2020 позже проверю.
Проверил. Ведет себя точно также, как в AutoCAD 2021. Т.е. вызов (entsel) с выбором текста внутри таблицы, у которого TTF-шрифт не срабатывает. Возвращает nil.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Алексей Кулик от 15-04-2022, 13:04:54
Ну, в конце концов можно и nentsel / nentselp использовать, если уж совсем "припрет" ;)
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 15-04-2022, 13:19:20
Ну, в конце концов можно и nentsel / nentselp использовать, если уж совсем "припрет" ;)
Они не работают в этом случае так же, как и entsel. Проверено.
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Алексей Кулик от 15-04-2022, 13:41:08
То ли лыжи, то ли я. С какого тогда у меня все работает?!
Автор, сделай нормальный архив со всеми шрифтами!
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 15-04-2022, 13:45:22
С какого тогда у меня все работает?!
Что именно работает? (entsel) с выбором текста из ячейки таблицы, у которой TTF-текстовый шрифт в стиле? 
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Алексей Кулик от 15-04-2022, 13:50:19
Работает (nentsel).
Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Александр Ривилис от 15-04-2022, 13:56:31
Работает (nentsel).


Название: Re: Выбор содержимого ячейки таблицы
Отправлено: Алексей Кулик от 15-04-2022, 15:31:57
М-да, что-то пошло не так. Сейчас перезапустил ACAD, работать перестало. В таком случае могу предложить только свой вариант из #19 :(
Приношу свои извинения.