VBA. Можно ли (Как) из объекта-примитива узнать пространство (имя листа), в котором он создан?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

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

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

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

Код:
[Выделить все]
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
Можно ли как-то "изнутри него" определить имя листа, в котором он создан?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
Просмотров: 8010
 
Непрочитано 29.12.2017, 12:45
#2
Кулик Алексей aka kpblc
Moderator

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


Попробуй посмотреть свойство 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,692


Цитата:
Сообщение от Кулик Алексей 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,499


Цитата:
Сообщение от 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,692


Цитата:
Сообщение от Сергей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
Просмотров: 218
Размер:	7.1 Кб
ID:	197474  
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 09.01.2018, 13:24
#6
trir


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


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

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


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

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


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


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

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


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


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


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

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


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


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


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


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


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

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


Цитата:
Сообщение от 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,499


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

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,298
Отправить сообщение для 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
С.-Петербург
Сообщений: 40,411


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

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


Цитата:
Сообщение от 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,298
Отправить сообщение для 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,611


нда... лучше бы VBA сдох быстро и достойно, чем такие мучения. =о)
Office 2016 + acad 2017 - дохнет сразу из-за типов данных.
Видимо тут придется из автокада подключаться к excel и читать данные.
Boxa вне форума  
 
Непрочитано 09.01.2018, 16:22
#21
doctorraz

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


пробуй так
Код:
[Выделить все]
Dim ThisDrawing
Sub testId()
'Dim returnObj As AcadObject
Set objAutoCAD = GetObject(, "AutoCAD.Application")
Set ThisDrawing = objAutoCAD.ActiveDocument
ThisDrawing.Activate 'активируем док из которого запущена печать
AppActivate objAutoCAD.Caption 'передаем фокус окну AutoCAD
Set objSelSet = vbdPowerSet("SPDSFORMAT")
objSelSet.SelectOnScreen 'arr_intType, arr_varDat
Set returnObj = objSelSet.Item(0)
NameVkladkiObiekta = ThisDrawing.ObjectIdToObject(returnObj.OwnerID).Layout.Name
NameVkladkiObiekta = ThisDrawing.ObjectIdToObject(returnObj.OwnerID).Layout.Name
Stop
rr = returnObj.OwnerID
Stop
MsgBox "Объект принадлежит " & NameVkladkiObiekta
End Sub
Public Function vbdPowerSet(strName As String) As Object 'AcadSelectionSet
'<EhHeader>

'</EhHeader>
Dim objSelSet As Object ' AcadSelectionSet
Dim objSelCol As Object ' AcadSelectionSets
100     Set objSelCol = ThisDrawing.SelectionSets
110     For Each objSelSet In objSelCol
120         If objSelSet.Name = strName Then
130             objSelSet.Delete
                Exit For
            End If
        Next
140     Set objSelSet = ThisDrawing.SelectionSets.Add(strName)
150     Set vbdPowerSet = objSelSet

End Function
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 09.01.2018, 16:29
#22
AlexV

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


Цитата:
Сообщение от doctorraz Посмотреть сообщение
vb6 же х-32??
если объект получен GetEntity, то OwnerID ошибка, OwnerID32 то же
а если SelectOnScreen , все работает..
Код:
[Выделить все]
        objSelSet.SelectOnScreen
       Set ff = objSelSet.Item(0)
       ff = ff.OwnerID
VB6 - 32b. Коий в офисе 2016. А вот Автокад 2016 - там уже vb7 и 64b.


Цитата:
Сообщение от Boxa Посмотреть сообщение
нда... лучше бы VBA сдох быстро и достойно, чем такие мучения. =о)
Office 2016 + acad 2017 - дохнет сразу из-за типов данных.
Видимо тут придется из автокада подключаться к excel и читать данные.
Так vba фактически и сдох, просто потом его чуть-чуть реанимировали.. Он ожил и чутка задвигался, но пока в инвалидной коляске

Да из автокада - не проблема, в принципе, и без excel обойтись. Тут просто задумка была - коллегам помочь одной утилиткой, ввиду того, что далеко не только лишь все имеют vba enabler, как и желание узнать, что это такое. А эксель - у всех есть, и vba в офисе встроенный.. На самом деле, можно кончено обойтись и без фильтра, перебором листов и таблиц, просто через эксель это прилично дольше получается.
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 09.01.2018, 16:40
#23
Boxa

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


AlexV, так может вообще без VBA обойтись и написать утилитку на нормальном языке... Вы бы сформулировали в чем смысл задачи, нашлись бы варианты
Boxa вне форума  
 
Непрочитано 09.01.2018, 16:47
#24
doctorraz

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


AlexV ты все же попробуй этот код
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 09.01.2018, 16:56
#25
AlexV

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


Цитата:
Сообщение от doctorraz Посмотреть сообщение
пробуй так
Да не, не прокатит, - как ни получай returnObj, в любом случае returnObj.OwnerID в объектной модели автокад 64b будет иметь тип LongLong, и при попытке его съесть / положить в привычный тип Long Excel 32b давится..

Цитата:
Сообщение от Boxa Посмотреть сообщение
AlexV, так может вообще без VBA обойтись и написать утилитку на нормальном языке... Вы бы сформулировали в чем смысл задачи, нашлись бы варианты
Да задачка простейшая - прошерстить все открытые в текущем сеансе файлы автокада, найти и отфильтровать все необходимые объекты ACAD_TABLE с определенными значениями определенных параметров, считать в массив значения определенных ячеек, отсортировать и вывалить результат на лист в файле excel. В дальнейшем возможно - добавить к выборке ACAD_TABLE еще и таблицы СПДС CS. В еще более дальнейшем - реализовать обратную задачу - пакетное заполнение и форматирование таблиц в Автокаде на основе шаблона в Excel.

В принципе, почти все это я "на коленке" уже сделал на Autocad vba, хотелось просто перенести на excel.

..а "другими языками" не владею, увы..

----- добавлено через ~9 мин. -----
Цитата:
Сообщение от doctorraz Посмотреть сообщение
AlexV ты все же попробуй этот код
..О, и правда.. а в чем тут прикол? Почто при SelectOnScreen OwnerID нормально обрабатывается?

А, дело, пожалуй, не в SelectOnScreen.. С Select тоже получилось.. То ли дело в типе переменной returnObj из кода в #21 (я ее пытался то как AcadTable, то как AcadEntity, то как AcadObject, а у doctorraz тип не задается.. Хотя как variant я вроде тож пытался.. Или, может, то что я этот returnObj параметром в другую функцию передавал, а тут все внутри "главной" процедуры..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!

Последний раз редактировалось AlexV, 09.01.2018 в 17:28.
AlexV вне форума  
 
Непрочитано 09.01.2018, 17:42
#26
doctorraz

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


Цитата:
Сообщение от AlexV Посмотреть сообщение
А, дело, пожалуй, не в SelectOnScreen
дело в селектионсет автокад
под твою задачу самое то..
одним селектом со всего документа собираешь все нужные таблицы, можно еще задать кучу фильтров и условий для селекта, потом спокойно в цикле тянешь из них данные..
аналогично таблицы спдс, только по ссылке передаешь их в мссом и тоже шерстишь средствами спдс.. ну и общий цикл по всем документам... только не забывай, что селсет принадлежит документу.. дл каждого свой...

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от AlexV Посмотреть сообщение
То ли дело в типе переменной returnObj из кода
думае все дело в способе ее получения, на 64х разницы нет на 32х есть.... не знаю почему
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 09.01.2018, 17:55
#27
AlexV

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


Цитата:
Сообщение от doctorraz Посмотреть сообщение
дело в селектионсет автокад
под твою задачу самое то..
одним селектом со всего документа собираешь все нужные таблицы, можно еще задать кучу фильтров и условий для селекта, потом спокойно в цикле тянешь из них данные..
аналогично таблицы спдс, только по ссылке передаешь их в мссом и тоже шерстишь средствами спдс.. ну и общий цикл по всем документам... только не забывай, что селсет принадлежит документу.. дл каждого свой...

----- добавлено через ~2 мин. -----

думае все дело в способе ее получения, на 64х разницы нет на 32х есть.... не знаю почему
Ну так да, я и пытаюсь селект использовать. Дело оказалось в типе переменной, с которой снимается OwnerID - эксель согласен только на variant, в других случаях вылетает..

Код:
[Выделить все]
Sub main()
'***
Dim returnObj As AcadTable
On Error Resume Next
Set objApp = GetObject(, "AutoCAD.Application") '
        If Err Then
        Err.Clear
        Set objApp = CreateObject("AutoCAD.Application")
    End If
Set objDoc = objApp.ActiveDocument
Set objSelectionSet = SelectTable(10)
On Error GoTo 0
If objSelectionSet.Count > 0 Then
    For i = 0 To objSelectionSet.Count - 1 
        Set returnObj = objSelectionSet.Item(i)
        MsgBox returnObj.OwnerID   
    Next i
End If
End Sub
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 09.01.2018, 18:04
#28
maratovich


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


Развели демагогию... String он.
maratovich вне форума  
 
Автор темы   Непрочитано 09.01.2018, 18:10
#29
AlexV

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


Цитата:
Сообщение от maratovich Посмотреть сообщение
Развели демагогию... String он.
Кто он?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 09.01.2018, 18:11
#30
maratovich


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


Цитата:
Сообщение от AlexV Посмотреть сообщение
Кто он?
То что суёте в ThisDrawing.ObjectIdToObject()
maratovich вне форума  
 
Непрочитано 09.01.2018, 18:12
#31
doctorraz

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


Цитата:
Сообщение от AlexV Посмотреть сообщение
Set objSelectionSet = SelectTable(10)
что это?

----- добавлено через ~4 мин. -----

Код:
[Выделить все]
Public ThisDrawing As Object
Sub method_not_implemented_under_this_platform()
Dim intType(0) As Integer '(2)
Dim varDat(0)  As Variant
Dim objSelSet  As Object
Dim objNanoCAD As Object
'<Сбор таблиц селсетом
    Set spds = CreateObject("McCOM2.Server")
On Error Resume Next
    Set objNanoCAD = GetObject(, "AutoCAD.Application")
    If Err.Number <> 0 Then
        Err.Number = 0
        Debug.Print Err.Number
        Set objNanoCAD = GetObject(, "NanoCAD.Application")
        If Err.Number <> 0 Then
            MsgBox "Не запущен CAD" 
            Exit Sub
        End If
    End If
On Error GoTo 0
    Set ThisDrawing = objNanoCAD.ActiveDocument
    intType(0) = 0
    varDat(0) = "spdstable2" 'таблицы СПДС от 8,0 и младше, за СПДС 11, 12 не скажу _
    старые версии СПДС, старше 8,0 "spdstable" 
    Set objSelSet = vbdPowerSet("seTEST")
    objSelSet.Select 5, , , intType, varDat
    Debug.Print "spdstable-" & objSelSet.Count
Dim objAK As Object
Dim ObjMC As Object
    For Each objAK In objSelSet
        Set ObjMC = spds.Object(objAK) 'имеем полный доступ к свойствам СПДС в АК но в нане "method not implemented under this platform" 
        namee = ObjMC("Name")
    'или
        nameeee = ObjMC!Name
        Debug.Print "Имя таблицы-" & namee
    'работаем с ним дальше
    Next
End Sub
Public Function vbdPowerSet(strName As String) As Object 'AcadSelectionSet
Dim objSelSet As Object ' AcadSelectionSet
Dim objSelCol As Object ' AcadSelectionSets
    Set objSelCol = ThisDrawing.SelectionSets
    For Each objSelSet In objSelCol
        If objSelSet.Name = strName Then
            objSelSet.Delete
            Exit For
        End If
    Next
    Set objSelSet = ThisDrawing.SelectionSets.Add(strName)
    Set vbdPowerSet = objSelSet
End Function

в нанокад этот код не работает, в автокад на ура
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 09.01.2018, 18:22
#32
AlexV

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


Цитата:
Сообщение от maratovich Посмотреть сообщение
То что суёте в ThisDrawing.ObjectIdToObject()
Ну, не знаю, справка вроде говорит, что не стринг..

Цитата:
ObjectIDToObject Method (ActiveX)
Gets the object that corresponds to the given object ID.
Supported platforms: Windows only
Signature
VBA:
RetVal = object.ObjectIDToObject(ID)object
Type: Database, Document
The objects this method applies to.
ID
Access: Input-only
Type: Long_PTR
The object ID of the object to return.

Цитата:
Сообщение от doctorraz Посмотреть сообщение
что это?

Это секретная функция , которая возвращает Select с фильтром..

Private Function SelectTable(y) As AcadSelectionSet
***
objSelSet.Select acSelectionSetAll, , , groupCode, dataCode
Set SelectTable = objSelSet
End Function
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 10.01.2018, 10:48
| 1 #33
Сергей812


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


В общем, позднее связывание рулит - на виртуалке потестил A2016х64 + E2016х32:

Код:
[Выделить все]
Public Sub TestA2016_64_Excel32()
  Dim lAcadApp As Object
  Set lAcadApp = GetObject(, "AutoCAD.Application")
  Dim lActiveDoc As Object
  Set lActiveDoc = lAcadApp.ActiveDocument
  Dim lSelObj As Object
  Dim lBasePoint As Variant
  lActiveDoc.Utility.GetEntity lSelObj, lBasePoint, "Выберите объект:"
  Dim lParentObj As Object
  Set lParentObj = lActiveDoc.ObjectIdToObject(lSelObj.OwnerID)
  Dim lNameLayout As String
  lNameLayout = lParentObj.Layout.Name
  MsgBox lNameLayout
  Set lParentObj = Nothing
  Set lActiveDoc = Nothing
  Set lAcadApp = Nothing
End Sub
Сергей812 вне форума  
Ответ
Вернуться   Форум 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