Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

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

VBA. Можно ли (Как) из объекта-примитива узнать пространство (имя листа), в котором он создан?

Ответ
Поиск в этой теме
Непрочитано 29.12.2017, 12:41 #1
VBA. Можно ли (Как) из объекта-примитива узнать пространство (имя листа), в котором он создан?
AlexV
 
Инженер
 
С-Пб
Регистрация: 02.10.2008
Сообщений: 3,685

Примитивно имеем объект.. Например, так:

Код:
[Выделить все]
Sub main()
Dim objBlk As AcadEntity
Dim varPoint As Variant
Dim strPrompt As String, tempstr As String, obj As Object
On Error Resume Next
strPrompt = "Выбери объект"
ThisDrawing.Utility.GetEntity obj, varPoint, strPrompt
Stop
End Sub
Можно ли как-то "изнутри него" определить имя листа, в котором он создан?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
Просмотров: 7685
 
Непрочитано 29.12.2017, 12:45
#2
Кулик Алексей aka kpblc
Moderator

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


Попробуй посмотреть свойство OwnerID и потом преобразовывай его в указатель на пространство (насколько я помню, ObjectIDToObject - но там были возможны варианты: в некоторых версиях требовалось ObjectIDToObject, в некоторых - ObjectIDToObject32).

----- добавлено через ~11 мин. -----
P.S. VBA у меня сходит с ума при попытке выбора объекта, так что
Код:
[Выделить все]
Sub main()
Dim objBlk As AcadEntity
Dim varPoint As Variant
Dim strPrompt As String, tempstr As String, obj As Object
'On Error Resume Next
'strPrompt = "Âûáåðè îáúåêò"
'ThisDrawing.Utility.GetEntity obj, varPoint, strPrompt
'Stop
Dim oEnt As AcadEntity
  Set oEnt = ThisDrawing.ModelSpace.Item(0)
Dim ownID As Long
  ownID = oEnt.OwnerID32
Dim oOwner As AcadBlock
  Set oOwner = ThisDrawing.ObjectIdToObject32(ownID)
  MsgBox oOwner.Name
End Sub
----- добавлено через ~12 мин. -----
Обрати внимание - в 2013 используются OwnerID32 и ObjectIdToObject32. В других версиях может быть по-другому (а сделать универсальные коды в VBA, по-моему, не получится).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.12.2017, 14:42
#3
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Попробуй посмотреть свойство OwnerID и потом преобразовывай его в указатель на пространство (насколько я помню, ObjectIDToObject - но там были возможны варианты: в некоторых версиях требовалось ObjectIDToObject, в некоторых - ObjectIDToObject32).

----- добавлено через ~11 мин. -----
P.S. VBA у меня сходит с ума при попытке выбора объекта, так что
Код:
[Выделить все]
Sub main()
Dim objBlk As AcadEntity
Dim varPoint As Variant
Dim strPrompt As String, tempstr As String, obj As Object
'On Error Resume Next
'strPrompt = "Âûáåðè îáúåêò"
'ThisDrawing.Utility.GetEntity obj, varPoint, strPrompt
'Stop
Dim oEnt As AcadEntity
  Set oEnt = ThisDrawing.ModelSpace.Item(0)
Dim ownID As Long
  ownID = oEnt.OwnerID32
Dim oOwner As AcadBlock
  Set oOwner = ThisDrawing.ObjectIdToObject32(ownID)
  MsgBox oOwner.Name
End Sub
----- добавлено через ~12 мин. -----
Обрати внимание - в 2013 используются OwnerID32 и ObjectIdToObject32. В других версиях может быть по-другому (а сделать универсальные коды в VBA, по-моему, не получится).
Да, в 2016 без "32".. И тип переменной стал ownID "дважды длинный".. LongLong. В Автокаде - все работает.
..А вот при попытке из Экселя этот финт ушами провернуть - эксель вылетает. Может, потому, что конфликт идет между типами (в excel вроде нету LongLong?).
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 29.12.2017, 15:17
1 | #4
Сергей812


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


Цитата:
Сообщение от AlexV Посмотреть сообщение
в excel вроде нету LongLong?
есть

----- добавлено через ~57 мин. -----
Все же элементарно делается из экселя
Код:
[Выделить все]
Dim lParentObj As AcadObject
Set lParentObj = lDoc.ObjectIdToObject32(lSelAcadObj.OwnerID32)
'Set lParentObj = lDoc.ObjectIdToObject(lSelAcadObj.OwnerID)
Dim lLayout As AcadLayout
Set lLayout = lParentObj.Layout
Dim lNameLayout As String
lNameLayout = lLayout.Name

Последний раз редактировалось Сергей812, 29.12.2017 в 16:15.
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.01.2018, 13:11
#5
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
есть

----- добавлено через ~57 мин. -----
Все же элементарно делается из экселя
Код:
[Выделить все]
Dim lParentObj As AcadObject
Set lParentObj = lDoc.ObjectIdToObject32(lSelAcadObj.OwnerID32)
'Set lParentObj = lDoc.ObjectIdToObject(lSelAcadObj.OwnerID)
Dim lLayout As AcadLayout
Set lLayout = lParentObj.Layout
Dim lNameLayout As String
lNameLayout = lLayout.Name
При попытке извлечь lSelAcadObj.OwnerID Excel умирает..

Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 207
Размер:	7.1 Кб
ID:	197474  
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 09.01.2018, 13:24
#6
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
При попытке извлечь lSelAcadObj.OwnerID Excel умирает..
правильно, а зачем вы это делаете? эта строчка не просто так закоментирована
trir вне форума  
 
Автор темы   Непрочитано 09.01.2018, 13:29
#7
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от trir Посмотреть сообщение
правильно, а зачем вы это делаете? эта строчка не просто так закоментирована
Ну, делаю я это для того, что бы получить то, что обозначено в названии темы..

А строчка закомментирована не просто как?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 09.01.2018, 13:37
#8
Сергей812


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


Пост 2 от Алексея читаем) Там просто два варианта привел сразу - а какой из них работает, проверяйте на своей связке Excel-Акад
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.01.2018, 13:44
#9
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Пост 2 от Алексея читаем) Там просто два варианта привел сразу - а какой из них работает, проверяйте на своей связке Excel-Акад
Да я понял, что для разных вариантов акада.. Но, повторюсь, при использование lSelAcadObj.OwnerID в связке эксель - А2016 эксель мрёт..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 09.01.2018, 13:47
#10
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


так надо использовать lSelAcadObj.OwnerID32 и желательно, чтобы разряднось Excel'я совпадала с разрядносьтью Акада
trir вне форума  
 
Автор темы   Непрочитано 09.01.2018, 13:54
#11
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от trir Посмотреть сообщение
так надо использовать lSelAcadObj.OwnerID32 и желательно, чтобы разряднось Excel'я совпадала с разрядносьтью Акада
OwnerID32 в А2016 отсутствует в списке свойств..
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 14
Размер:	28.4 Кб
ID:	197476  
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 09.01.2018, 14:03
#12
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Excel какой?
trir вне форума  
 
Непрочитано 09.01.2018, 14:04
#13
Сергей812


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


а ObjectIDToObject и ObjectIDToObject32 присутствуют? Если да - пробуйте с ними OwnerID по очереди. Заодно посмотрите в отладчике перед вызовом этих функций - есть ли вообще что-то удобоваримое в этом OwnerID. Ну и контрольный вопрос - все обновления установлены?
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.01.2018, 14:18
#14
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от trir Посмотреть сообщение
Excel 2016. Да, наверное, здесь и зарылась собака, как я и предположил в #3 - конфликт между типами данных в 64b версии.

по ссылке из #12:

Цитата:
Таким образом, для кода для работы в 64-разрядных версий Office необходимо найти и изменить все существующие инструкции Declare для использования спецификатора PtrSafe . И необходимо найти и изменить все типы данных в пределах эти инструкции Declare , дескрипторы ссылку или указатели на использование совместимого 64-разрядная версия LongPtr введите псевдоним и типы, которые необходимы для хранения целых чисел 64-разрядная версия с новой LongLong Тип данных. Кроме того необходимо обновить любые пользовательские типы, которые содержат указатели или значками и 64-разрядных целых чисел используйте типы данных 64-разрядная версия и проверить все назначения переменной, верны для предотвращения ошибок Несоответствие типа.
..хотя я пытался объявлять переменную as LongPtr, и в нее запихивать lSelAcadObj.OwnerID, все равно вылетало..

Кстати сказать, при работе Excel2016 с A2012 и использовании lSelAcadObj.OwnerID32 - тоже вылет экселя..


...А, блин, эксель у меня 32 битный, вот он и не может скушать автокадовский указатель на тип LongLong.. И как его можно экселю скормить?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!

Последний раз редактировалось AlexV, 09.01.2018 в 14:31.
AlexV вне форума  
 
Непрочитано 09.01.2018, 14:32
#15
Сергей812


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


Ну с VBA (правда самого акадовского) я очень быстро свалил в сторону Interop на VB.NET из-за каких то постоянных ограничений и спонтанных ошибок. Синтаксис по сути один и тот же с VBA - надо только уговорить админа поставить бесплатную студию какую-нибудь с поддержкой VB.NET. Ну или в тот же .Net уходить сразу, не приходя в сознание)
Сергей812 вне форума  
 
Непрочитано 09.01.2018, 15:01
#16
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,293
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от AlexV Посмотреть сообщение
Можно ли как-то "изнутри него" определить имя листа, в котором он создан?
так?
Код:
[Выделить все]
Sub obId()
Dim returnObj As AcadObject
    ThisDrawing.Utility.GetEntity returnObj, Null, "Выберите объект"
    NameVkladkiObiekta = ThisDrawing.ObjectIdToObject(returnObj.OwnerID).Layout.Name
    MsgBox "Объект принадлежит " & NameVkladkiObiekta
End Sub
Спасибо Маратовичу
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 09.01.2018, 15:03
#17
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от doctorraz Посмотреть сообщение
ObjectIdToObject
Проблема именно тут. Может быть ObjectIdToObject, а может быть и ObjectIdToObject32. И что оно потребует - тайна
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.01.2018, 15:07
#18
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от doctorraz Посмотреть сообщение
так?
Код:
[Выделить все]
Sub obId()
Dim returnObj As AcadObject
    ThisDrawing.Utility.GetEntity returnObj, Null, "Выберите объект"
    NameVkladkiObiekta = ThisDrawing.ObjectIdToObject(returnObj.OwnerID).Layout.Name
    MsgBox "Объект принадлежит " & NameVkladkiObiekta
End Sub
Спасибо Маратовичу
Да все так, проблема в том, что мне надо автокадовское (A2016 64b) свойство OwnerID, коее имеет тип данных LongLong, выцепить через vba excel, который у меня 32-битный и тип LongLong не поддерживает, вследствие чего умирает при попытке прочитать returnObj.OwnerID..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 09.01.2018, 16:11
#19
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,293
Отправить сообщение для doctorraz с помощью Skype™


vb6 же х-32??
если объект получен GetEntity, то OwnerID ошибка, OwnerID32 то же
а если SelectOnScreen , все работает..
Код:
[Выделить все]
        objSelSet.SelectOnScreen
       Set ff = objSelSet.Item(0)
       ff = ff.OwnerID
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 09.01.2018, 16:12
#20
Boxa

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


нда... лучше бы VBA сдох быстро и достойно, чем такие мучения. =о)
Office 2016 + acad 2017 - дохнет сразу из-за типов данных.
Видимо тут придется из автокада подключаться к excel и читать данные.
Boxa на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. Можно ли (Как) из объекта-примитива узнать пространство (имя листа), в котором он создан?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Autodesk Navisworks Manage 2017 - как узнать объём объекта? jzgte-2 Прочее ПО от Autodesk 0 09.10.2017 23:32
Можно ли выбрать объект модели из листа не активируя видовой экран? mkung Программирование 24 25.06.2014 09:31
Ошибка при экспортировании листа в пространство модели в ASD 2011 moongerm Вертикальные решения на базе AutoCAD 3 11.03.2011 12:07
Каким образом можно выкупить стройматериалы с объекта долгостроя Stitch Разное 12 15.04.2010 09:36
Как можно открыть чертеж через LISP на котором стоит пароль? ivspec LISP 7 10.02.2006 17:36