VBA. Как получить содержимое поля через ID поля?
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. Как получить содержимое поля через ID поля?

VBA. Как получить содержимое поля через ID поля?

Ответ
Поиск в этой теме
Непрочитано 03.03.2025, 14:02 #1
VBA. Как получить содержимое поля через ID поля?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,134

Команда "GetFormula" получает содержимое формулы в которой есть ID поля:
sText = objТабл.GetFormula(I, J, 0)
sText ="(%<\_FldId 2603654316864>%)"
Где можно посмотреть поле с ID="2603654316864"?
Просмотров: 950
 
Непрочитано 03.03.2025, 19:39
#2
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


уже два года назад спрашивали
Сергей812 вне форума  
 
Автор темы   Непрочитано 04.03.2025, 03:42
#3
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


В VBA есть какой-то метод для работы с полями?
МишаИнженер вне форума  
 
Непрочитано 04.03.2025, 10:11
#4
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


открываете редактор VBA -> F2 -> В поиске Field и смотрим, что может предложить VBA для работы с полями. Учитесь работать с информацией всеми доступными способами)
Сергей812 вне форума  
 
Автор темы   Непрочитано 05.03.2025, 04:04
#5
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Почему данный код ЛИСП возвращает ошибку:
Код:
[Выделить все]
 (defun get-field-content-by-id (field-id / field-obj field-content)
  ;; Получаем объект по ID
  (setq field-obj (vlax-ename->vla-object (handent field-id)))
  ;; Получаем содержимое поля
  (setq field-content (vla-get-textstring field-obj))
)
; ошибка: неверный тип аргумента: stringp 1.68206e+12
Вызываю команду так: (get-field-content-by-id 1682059942352)
Может быть вместо команды "vla-get-textstring" использовать команду "vla-get-fieldcode"?

Последний раз редактировалось МишаИнженер, 05.03.2025 в 05:10.
МишаИнженер вне форума  
 
Непрочитано 05.03.2025, 06:19
#6
AlphaForz

Surveyor
 
Регистрация: 10.04.2023
Krasnoyarsk
Сообщений: 5


неверный тип аргумента: stringp 1.68206e+12 указывает на то, что функция handent ожидает строку, а вы передаете ей число.
Для полей нужно использовать vla-get-fieldcode а затем разобрать полученный код чтобы извлечь нужное значение.
Код:
[Выделить все]
 (defun get-field-content-by-id (field-id / field-obj field-content)
  ;; Преобразуем ID в строку
  (setq field-id (itoa field-id))
  ;; Получаем объект по ID
  (setq field-obj (vlax-ename->vla-object (handent field-id)))
  ;; Получаем содержимое поля
  (setq field-content (vla-get-fieldcode field-obj))
  ;; Возвращаем содержимое поля
  field-content
)
Код:
[Выделить все]
 (get-field-content-by-id 1682059942352)
AlphaForz вне форума  
 
Непрочитано 05.03.2025, 07:57
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Мне интересно, а кто сказал, что число через itoa будет преобразовано в реальный хендл?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.03.2025, 08:14
#8
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Возвращает ошибку:
; ошибка: неверный тип аргумента: fixnump: 1.68206e+12
МишаИнженер вне форума  
 
Непрочитано 05.03.2025, 10:30
#9
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Мне интересно, а кто сказал, что число через itoa будет преобразовано в реальный хендл?
не надо мешать ТС подбирать работающий код вместо чтения документации) Да и учитывая, что в VBA вроде нельзя вызывать лисп-функции напрямую - все будет идти через командную строку со всеми сопутствующими рисками...
Сергей812 вне форума  
 
Автор темы   Непрочитано 05.03.2025, 13:22
#10
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Почему данный код не работает:
Код:
[Выделить все]
 (defun check-table-exists (table-id / table-obj)
  (setq table-obj (handent table-id))
  (if table-obj
    (progn
      (princ (strcat "\nТаблица с ID " table-id " существует."))
      table-obj
    )
    (princ (strcat "\nТаблица с ID " table-id " не найдена."))
  )
)

;; Пример использования
(setq table-id "123456789") ;; Замените на реальный ID таблицы
(check-table-exists table-id)
Делаю в формуле ячейки ссылку на другую таблицу (из этой ссылки беру ID таблицы).
Код:
[Выделить все]
 
Команда: (setq table-id "2286252394128")
"2286252394128"
Команда: (check-table-exists table-id)
Таблица с ID 2286252394128 не найдена."\nТаблица с ID 2286252394128 не найдена."
Почему возвращает ошибку?
МишаИнженер вне форума  
 
Непрочитано 05.03.2025, 13:35
#11
name02


 
Регистрация: 10.01.2020
Сообщений: 415


потому что handle это не ID - посмотри в пятую группу (entget(car(entsel))) - это и есть хендл таблицы, по которому через handent получаем таблицу
Вообще же, лучше делать так, чтобы функции для проверки возвращали T (или объекты) или nil. А уж что делать с этой информацией решишь в вызывающей процедуре:
Код:
[Выделить все]
 (defun check-table-exists (table-id / *adoc* table-obj)
  (setq *adoc* (vla-get-activedocument (vlax-get-acad-object)))

  (setq table-obj (vla-ObjectIdToObject *adoc* table-id))

  (if table-obj (vlax-vla-object->ename table-obj) nil)

) ;_ end of defun
Еще тут нашел уточнение по ObjectID https://forum.dwg.ru/showpost.php?p=252379&postcount=9

Последний раз редактировалось name02, 05.03.2025 в 13:51.
name02 вне форума  
 
Непрочитано 05.03.2025, 15:01
#12
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


ObjectID - текущее состояние объекта открытого чертежа, и включает в себя хэндл. Это связано с быстродействием и ресурсами - иначе бы пришлось, например, при каждом удалении объекта сдвигать остальные объекты в коллекции - если их (объектов) десятки и сотни тысяч - то это было бы очень затратным. А так помечается объект как удаленный - а физически продолжает существовать, просто акад его игнорирует.
Сергей812 вне форума  
 
Автор темы   Непрочитано 06.03.2025, 14:39
#13
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Цитата:
Сообщение от name02 Посмотреть сообщение
потому что handle это не ID - посмотри в пятую группу (entget(car(entsel))) - это и есть хендл таблицы, по которому через handent получаем таблицу
Вообще мне надо добраться до "поля" на которое ссылается формула в ячейке таблицы. Этот пример я привел потому что используется одна и таже функция "handent" для получения доступа к таблице и к полю.
Как будет выглядеть код для получения поля вместо таблицы?
МишаИнженер вне форума  
 
Непрочитано 06.03.2025, 16:22
#14
name02


 
Регистрация: 10.01.2020
Сообщений: 415


Почитай тут https://forum.dwg.ru/showpost.php?p=...8&postcount=15
может что-то поможет.
Вообще если взять оттуда код
(vla-fieldcode (vlax-ename->vla-object (car (nentsel))))
ткнуть в поле в ячейке таблицы, то вернется строка с содержимым ячейки.
Из этой строке можно увидеть и ObjectID (и далее уже пихать в vla-ObjectIdToObject) и формулу
name02 вне форума  
 
Автор темы   Непрочитано 07.03.2025, 07:06
#15
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Выдает ошибку:
Код:
[Выделить все]
Команда: (vla-fieldcode (vlax-ename->vla-object (car (nentsel))))
Выберите объект: ; ошибка: неверный тип аргумента: lentityp nil
Что такое lentityp?
МишаИнженер вне форума  
 
Непрочитано 07.03.2025, 07:46
#16
name02


 
Регистрация: 10.01.2020
Сообщений: 415


Ты куда тыкал - надо тыкать прямо в текст в ячейке.
lentityp - внутренняя проверка языка программирования того, что в какую-то функцию передается entity, т.е. какой-то объект. В лиспе функции, которые проверяют какое-либо свойство имеют имена, заканчивающиеся на p - listp, vl-catch-all-error-p или vl-consp
nil говорит о том, что проверка не прошла
name02 вне форума  
 
Автор темы   Непрочитано 07.03.2025, 12:52
#17
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Цитата:
Сообщение от name02 Посмотреть сообщение
прямо в текст в ячейке.
Прямо в текст и нажимал. Не работает функция. Выдает ошибку:
Цитата:
Команда: (vla-fieldcode (vlax-ename->vla-object (car (nentsel))))
Выберите объект: ; ошибка: неверный тип аргумента: lentityp nil
Попробуйте сами: выделите строку с формулой, вставьте в командную строку, нажмите ENTER, укажите ячейку таблицы с формулой. Делов то, нетрудно. И у Вас то же не сработает.

Последний раз редактировалось МишаИнженер, 07.03.2025 в 12:57.
МишаИнженер вне форума  
 
Непрочитано 07.03.2025, 14:02
#18
name02


 
Регистрация: 10.01.2020
Сообщений: 415


Я делаю так - все работает и с простыми текстами в ячейке:
Нажмите на изображение для увеличения
Название: 1.gif
Просмотров: 11
Размер:	4.75 Мб
ID:	267183

и с формулами:
Нажмите на изображение для увеличения
Название: 2.gif
Просмотров: 10
Размер:	6.03 Мб
ID:	267185

и с полями:
Нажмите на изображение для увеличения
Название: 3.gif
Просмотров: 9
Размер:	4.43 Мб
ID:	267186

Кстати, ты в ячейках случайно не шрифты TrueType *.ttf используешь? С ними ошибку будет такую же как у тебя выдавать

Последний раз редактировалось name02, 07.03.2025 в 14:16.
name02 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. Как получить содержимое поля через ID поля?

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA. Получить из Акада запущенный экземпляр Excel через Getobject Dinoxromniy Программирование 4 11.10.2023 12:58
Как через FldId получить текст поля с формулой? МишаИнженер Программирование 1 20.06.2023 13:48
Выход с технического этажа на лестничниую клетку Н-1 через воздушную зону. W985 Архитектура 5 24.02.2015 16:26
Поля AutoCAD + Windows vanfil AutoCAD 6 07.04.2010 10:37
Как настроить выход в интернет с комуникатора через блютуз и ПК KonGo Разное 15 01.04.2010 18:46