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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Cчитывание свойств ACAD_PROXY_ENTITY из VBA

Cчитывание свойств ACAD_PROXY_ENTITY из VBA

Ответ
Поиск в этой теме
Непрочитано 16.07.2013, 16:52 #1
Cчитывание свойств ACAD_PROXY_ENTITY из VBA
Константин Селикатов
 
Регистрация: 16.07.2013
Сообщений: 4

Есть объект написанный при помощи .NET и библиотеки MultiCAD API (статья на Хабре). Необходимо достать свойства(текст) из данного объекта.
Свойства видно через диспетчер свойств акада. В VBA при выделении объекта он определяется как AcadEntity. Каким образом можно достать текст из данного объекта используя VBA? Заранее благодарен за ответы.
Просмотров: 7403
 
Непрочитано 16.07.2013, 16:53
#2
Кулик Алексей aka kpblc
Moderator

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


Я бы сначала снял дамп объекта.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.07.2013, 17:52
#3
Константин Селикатов


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


Вот дамп объекта:

_$ (entget(car(entsel))'("*"))
((-1 . <Имя объекта: 7ee5b4f8>) (0 . "TESTENTITY") (330 . <Имя объекта: 7ee59cf8>) (5 . "217") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (48 . 100.0) (100 . "TESTENTITY") (100 . "TESTENTITY") (90 . 1) (301 . "Name") (300 . "тестовый объект") (301 . "Info") (300 . "тестовый объект") (301 . "Scale") (40 . 100.0) (301 . "Text") (300 . "Text field") (301 . "ClassID") (300 . "8d0ac8b1-0d5f-423f-abc9-958ea9c11ed0") (301 . "IsTempObject") (290 . 1) (301 . "DbEntity") (300 . "Multicad.DatabaseServices.McDbEntity") (301 . "ID"))
Константин Селикатов вне форума  
 
Непрочитано 16.07.2013, 21:19
#4
Кулик Алексей aka kpblc
Moderator

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


Константин Селикатов, дамп (в смысле - свойства и методы) можно обычно смотреть не только в лиспе. Ты ж работаешь в VBA? Вот там и смотри свойства объекта.
P.S. Лично у меня нет никакой возможности ковыряться.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.07.2013, 10:24
#5
Константин Селикатов


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


Вся проблема в том что доступны методы только AcadEntity, т.е. нужные свойства отсутствуют, но всё равно спасибо за помощь.
Буду пытать сделать свой COM объект чтобы связать .NET и VBA.
Константин Селикатов вне форума  
 
Непрочитано 17.07.2013, 20:16
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


В порядке бреда - через SendCommand послать лисп, который выберет нужное значение и запишет в текстовую переменную, например USERS1. Потом значение прочитать в VBA. Может будет полезно
LISP & VBA. Передача данных и Vlax.cls concerns
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 12.02.2014, 09:35
#7
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,435
Отправить сообщение для maratovich с помощью Skype™


Подниму тему так как решения не было, а вопрос остался открытый.
Как не пробовал у AcadEntity нет прямых свойств получения (301 . "Text").
Лисп работает, но связка лиспа с VBA - это мягко выражаясь нехорошо.
Кто знает, как получить значения 301, 310 свойств ? Хотябы вектор в каком направлении двигаться.
maratovich вне форума  
 
Непрочитано 13.02.2014, 02:37
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от maratovich Посмотреть сообщение
Кто знает, как получить значения 301, 310 свойств ? Хотябы вектор в каком направлении двигаться.
Нормально получить dxf-коды можно только в AutoLisp/ObjectARX, через одно место (называемое P/Invoke) в .NET. А вот в VBA (точнее средствами только VBA) - никак.
Александр Ривилис вне форума  
 
Непрочитано 13.02.2014, 09:07
#9
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,435
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Нормально получить dxf-коды можно только в AutoLisp/ObjectARX
Мне бы хоть и не нормально, пускай с кракозябрами, но что нибудь от туда выдрать.
maratovich вне форума  
 
Непрочитано 13.02.2014, 10:05
#10
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от maratovich Посмотреть сообщение
Лисп работает, но связка лиспа с VBA - это мягко выражаясь нехорошо.
VBA - это уже "мягко выражаясь нехорошо". Так что использование Auto-VisualLISP картины уже не испортит, ятд.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 13.02.2014, 10:44
#11
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,435
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
VBA - это уже "мягко выражаясь нехорошо".
Спорить не буду т.к. это ни к чему не приведёт, просто запускать из exe лисп вообще не фантан, так что нужно только VBA.
Вообще странно, всё есть, а получить данные невозможно.
maratovich вне форума  
 
Непрочитано 13.02.2014, 11:33
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от maratovich Посмотреть сообщение
Мне бы хоть и не нормально, пускай с кракозябрами, но что нибудь от туда выдрать.
Ну можно еще кривее - запомнить дескриптор (Handle) примитива, сохранить файл в dxf - там его найти и ....
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.02.2014, 12:40
#13
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
через одно место (называемое P/Invoke) в .NET.
Любопытство не порок =)
Можно пример?
Boxa вне форума  
 
Непрочитано 13.02.2014, 16:31
#14
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Boxa Посмотреть сообщение
Можно пример?
В этом коде есть использование функции из ObjectARX с именем acdbEntGet, которая является аналогом (entget) в AutoLisp'е:
Зеркальное отображение примитива однострочного текста (DBText)

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от maratovich Посмотреть сообщение
Мне бы хоть и не нормально, пускай с кракозябрами, но что нибудь от туда выдрать.
Тогда пиши arx, который из VBA-будешь загружать, передавать ему ObjectID и код группы, и получать значение.
Только с lisp'ом явно будет проще - как минимум от версии и платформы AutoCAD не зависит.

----- добавлено через ~12 мин. -----
Цитата:
Сообщение от maratovich Посмотреть сообщение
Спорить не буду т.к. это ни к чему не приведёт, просто запускать из exe лисп вообще не фантан, так что нужно только VBA.
Вообще странно, всё есть, а получить данные невозможно.
Еще вариант. Поищи VLAX.CLS - он может помочь обойтись без лиспа в явном виде.
Александр Ривилис вне форума  
 
Непрочитано 13.02.2014, 16:54
#15
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,435
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Еще вариант. Поищи VLAX.CLS - он может помочь обойтись без лиспа в явном виде
Вот, это уже интересней...
Случайно не подскажете что такое "VL.Application.1" и чем отличается от "VL.Application.16" и будет ли зависимость VLAX.CLS от версии Автокада?
maratovich вне форума  
 
Непрочитано 13.02.2014, 16:57
#16
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Все нижеизложенное воспринимать не как инструкция к приминению, а что-то вроде, что всегда можно придумать как.
Из "чистого" VBA (или Net) получить текстовую строку по DXF 310 - да пожалуйста - он dxf читать не умеет, но задавать их в качестве критерия выборки SelectionSet (FilterType, FilterData) - может. Выбираем все примитивы (301 . "") - смотрим есть-ли с нашим Handle (если мне память не изменяет задать фильтр на DXF 5 - нельзя), если есть - то значит строка пустая, если нет, то ищем с (301 . "*") - соответственно есть такие или нет в принципе - а далее в цикле прогоняем все значения (симовлов 1-255) по каждой букве (учитывая что * и ? надо "маскировать") то есть "a*", "b*"... пока не поймаем 1-ую букву - допустим выдаст совпадение "X*". Далее проверяем на просто "X" и если нет то идем дальше "Xa*", "Xb"... (под a и b - имеются в виду начало алфавита). В итоге получим-таки всю строку (в наихудшем случае за X*255 обращений - где X длинна строки).
з.ы. Я сам против таких методов - любую работу надо делать предназначенным на то инструментом, но...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.02.2014, 17:06
#17
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,435
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
качестве критерия выборки SelectionSet (FilterType, FilterData) - может
Согласен, а вот далее написанное вообще не переварил.
Ну выберем мы через фильтр 5 примитивов, у каждого по 38 кодов 301, и как это мы сможем перебрать эти коды на наличие в них символов ?
maratovich вне форума  
 
Непрочитано 13.02.2014, 17:13
#18
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от maratovich Посмотреть сообщение
Случайно не подскажете что такое "VL.Application.1" и чем отличается от "VL.Application.16" и будет ли зависимость VLAX.CLS от версии Автокада?
Код:
[Выделить все]
HKEY_CLASSES_ROOT\VL.Application.16
Вроде от версии AutoCAD начиная как минимум с AutoCAD 2004 не зависит. Но я им не пользовался никогда, так что утверждать не берусь.
Цитата:
Сообщение от Дима_ Посмотреть сообщение
Выбираем все примитивы (301 . "")
Насколько мне не изменяет память по группе 301 отфильтровать не получится (могу ошибаться). Кстати, в примитиве таких групп может быть несколько.
Александр Ривилис вне форума  
 
Непрочитано 13.02.2014, 17:14
#19
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


У 5-ти мы проверим есть-ли там наш - по handle - что может быть несколько 301 - это я не учел - тогда нада для каждого примитива проверять всегда (а не до 1-го совпадения) весь алфавит, то есть выделить вначале все первые буквы, потом все вторые и пр - количество обращений "геометрически немного" вырастет и небудет понятно где какая строка (в каком порядке) - это минус....
з.ы. внимание на этом методе я бы не акцентировал
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.02.2014, 17:24
#20
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,435
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
тогда нада для каждого примитива проверять всегда (а не до 1-го совпадения) весь алфавит,
Что то я недопонимаю...
Выбрал через фильтр 5 примитивов у которых есть группа 301, и у каждого есть такое:
.......
(301 . "Text1") (300 . "Text field1")
(301 . "Text2") (300 . "Text field2")
(301 . "Text3") (300 . "Text field3")
.......
38 шт таких строк

Мне нужно найти программно значение (300 . "Text field2"), я же не знаю что там "Text field2", если Вы говорите про перебор группы (301 . ...) и сравнением с искомым, то тут и непонятно как получить 301 а следом и 300 ? Фильтр внутри примитива - фантастика, тогда как ?
maratovich вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Cчитывание свойств ACAD_PROXY_ENTITY из VBA



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DwgRuLispLib: Функции чтения и установки свойств рисунка (_dwgprops) VVA Библиотека функций 15 14.12.2013 10:04
Прикрепить к примитиву (полилинии) данные, которые отобразит окно свойств (Properties, OPM) Ax3 Программирование 25 06.04.2013 23:52
Устраненние просадочных свойств грунта при II-м типе просадочности - только по всей толще? engineer_a Основания и фундаменты 16 10.12.2012 18:26
Ошибка 0xC0000005 (access violation) при импорте свойств динамических блоков Ax3 Программирование 17 24.12.2010 09:43
зависание меню свойств єлементов в AutoCad 2010 rus x86 при работе в Windows 7 micropyhcher Баги и пожелания в Autodesk 3 21.11.2009 11:05