dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

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

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

AlexV вне форума Вставить имя

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

Код:
[Выделить все]
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
Можно ли как-то "изнутри него" определить имя листа, в котором он создан?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
Просмотров: 3026
 
Непрочитано 09.01.2018, 16:22
#21
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 1,156
Отправить сообщение для 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,601


Цитата:
Сообщение от 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
Санкт-Петербург
Сообщений: 1,720


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

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


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

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


Цитата:
Сообщение от 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
Волгоград
Сообщений: 1,156
Отправить сообщение для doctorraz с помощью Skype™


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

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

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


Цитата:
Сообщение от 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,209
Отправить сообщение для maratovich с помощью Skype™


Развели демагогию... String он.
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 09.01.2018, 18:10
#29
AlexV

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


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


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


Цитата:
Сообщение от AlexV Посмотреть сообщение
Кто он?
То что суёте в ThisDrawing.ObjectIdToObject()
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 09.01.2018, 18:12
#31
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 1,156
Отправить сообщение для 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,601


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


В общем, позднее связывание рулит - на виртуалке потестил 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

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||