Тема: Как узнать какому BlockReference принадлежит SubEntity?

Здравствуйте!

Скажите, можно ли определить какому блоку принадлежит выбранный субпримитив?
Для выделения SubEntity я использую:

ThisDrawing.Utility.GetSubEntity Obj, PickedPoint

Как дополнительно определить принадлежность уже выбранного объекта конкретному вхождению блока. (От блока, собственно, нужен только его угол поворота)?
Нельзя ли, как-нибудь, программно, кликнуть еще раз в точку PickedPoint (координаты ее, ведь уже есть), но уже используя метод GetEntity?

Заранее спасибо.

Re: Как узнать какому BlockReference принадлежит SubEntity?

Обрати внимание на остальные аргументы GetSubEntity (в первую:

object.GetSubEntity Object, PickedPoint, TransMatrix, ContextData[, Prompt] 

В первую очередь на ContextData

Re: Как узнать какому BlockReference принадлежит SubEntity?

Спасибо за ответ, однако, есть неясность:
     Моя операционная система - Vista x64 и в "Locals window" для переменной ContextData (объявлена как Variant) VBA пишет только, что это <Unsupported variant type>. Можно ли это как-нибудь обойти?

     На WinХР все работает исправно - из ContextData можно забрать ID блока. Но интересует, все-таки, работа с Vista и AutoCAD x64.

Re: Как узнать какому BlockReference принадлежит SubEntity?

Увы, но платформа x64 у меня не стоит. Так что проверить не на чем. Одно могу сказать, что на платформе x64 изначально VBA не было и Autodesk'овские программисты как-то попытались залатать этот пробел. Видимо недостаточно успешно...

Re: Как узнать какому BlockReference принадлежит SubEntity?

ОК. Понятно.
Тогда снова задам исходный вопрос о том, как выбрать блок имея выбранный субпримитив и точку на чертеже... SelectAtPoint или еще как?

Re: Как узнать какому BlockReference принадлежит SubEntity?

SelectAtPoint может помочь определить все примитивы, которые есть в окрестностях этой точки. Потребуется найти в твоем случае блок/блоки, которые тебя интересуют. Будет сложнее если таких блоков окажется > 1. Тогда придется лезть в начинку блоков.

Спасибо сказали: kmi1

Re: Как узнать какому BlockReference принадлежит SubEntity?

Александр Ривилис пишет:

Обрати внимание на остальные аргументы GetSubEntity (в первую:




Код


object.GetSubEntity Object, PickedPoint, TransMatrix, ContextData[, Prompt]

В первую очередь на ContextData

Не так все просто
Выбери сначала атрибут
а потом любой примитив блока
(линию, полилинию и тд)

Option Explicit

Sub test()
Dim PickedPoint, TransMatrix, ContextData, i
Dim obj As AcadEntity
Dim s As String
s = ""
ThisDrawing.Utility.GetSubEntity obj, PickedPoint, TransMatrix, ContextData, _
"Select subentity:"

Dim parent As AcadObject
Set parent = ThisDrawing.ObjectIdToObject(obj.OwnerID)

       If VarType(ContextData) <> vbEmpty Then
       For i = 0 To UBound(ContextData)
       s = s & ContextData(0) & vbCr
       Next
       s = "does the following context data:" & vbCr & s
       Else: s = "does not have context data"
       End If
       
 MsgBox "Selected subentity has a type of " & obj.ObjectName & "," & vbCr & _
       "belongs to " & parent.ObjectName & " and" & vbCr & s
       
End Sub

~'J'~

Re: Как узнать какому BlockReference принадлежит SubEntity?

Но и не так сложно. Если выбран атрибут, то вставку блока можно получить по .OwnerID

(изменено: wl2000, 26 февраля 2009г. 14:25:12)

Re: Как узнать какому BlockReference принадлежит SubEntity?

Moй VBA в Vista x64 ругается на OwnerID из кода Fixo:

Set parent = ThisDrawing.ObjectIdToObject(obj.OwnerID)

Говорит, что: Compile Error. Function or interface marked as restricted, or the function uses an Automation type not supported in Visual Basic.

Че делать-то? Может библиотеку какую-нибудь подключить?  :(

Re: Как узнать какому BlockReference принадлежит SubEntity?

Похоже в x64 поддержка VBA еще хуже, чем я думал... В x86 проверил - все работает.

Re: Как узнать какому BlockReference принадлежит SubEntity?

Понял, что шансов нет. Ушел сочинять про SelectAtPoint...  :evil:

Re: Как узнать какому BlockReference принадлежит SubEntity?

Александр Ривилис пишет:

Но и не так сложно. Если выбран атрибут, то вставку блока можно получить по .OwnerID

Я и говорю про это же самое
А если не атрибут, как достать вставку блока?

~'J'~

Re: Как узнать какому BlockReference принадлежит SubEntity?

wl2000 пишет:

Set parent = ThisDrawing.ObjectIdToObject(obj.OwnerID)

Только идея, проверить не могу

Set parent = ThisDrawing.ObjectIdToObject(CLng(obj.OwnerID))

~'J'~

Re: Как узнать какому BlockReference принадлежит SubEntity?

То же самое. Но, ругается, наверное, не на OwnerID, а на ObjectIdToObject, хотя выделяет OwnerID.

Re: Как узнать какому BlockReference принадлежит SubEntity?

fixo пишет:

А если не атрибут, как достать вставку блока?

Set blockRef = ThisDrawing.ObjectIdToObject(ContextData(0))

(изменено: Александр Ривилис, 26 февраля 2009г. 15:58:18)

Re: Как узнать какому BlockReference принадлежит SubEntity?

wl2000 пишет:

То же самое. Но, ругается, наверное, не на OwnerID, а на ObjectIdToObject, хотя выделяет OwnerID.

Почитай http://discussion.autodesk.com/forums/t … ID=6055769.
Там советуют проверить функцию ThisDrawing.ObjectIdToObject32

Re: Как узнать какому BlockReference принадлежит SubEntity?

Попробовал. Да! Проходит строчка: Set parent = ThisDrawing.ObjectIdToObject32(Obj.OwnerID32).

Да вот только parent это Block, а не BlockReference. Можно ли определить конкретное вхождение блока?

Re: Как узнать какому BlockReference принадлежит SubEntity?

Александр Ривилис пишет:


Цитата

fixo пишет:
А если не атрибут, как достать вставку блока?





Код


Set blockRef = ThisDrawing.ObjectIdToObject(ContextData(0))

А у меня возвращает BlockTableRecord вместо BlockReference
Что-то тут не то

~'J'~

Re: Как узнать какому BlockReference принадлежит SubEntity?

А у меня возвращает BlockTableRecord вместо BlockReference

Sub test()
Dim PickedPoint, TransMatrix, ContextData, i
Dim obj As AcadEntity
Dim s As String
s = ""
ThisDrawing.Utility.GetSubEntity obj, PickedPoint, TransMatrix, ContextData, _
"Select subentity:"

Dim parent As AcadObject
Dim blkref As AcadObject

Set parent = ThisDrawing.ObjectIdToObject(obj.OwnerID)
If VarType(ContextData) <> vbEmpty Then
For i = 0 To UBound(ContextData)
 s = s & ContextData(i) & vbCr
 Set blkref = ThisDrawing.ObjectIdToObject(ContextData(i))
 s = s & " blkRef.ObjectName=" & blkref.ObjectName
Next
s = "does the following context data:" & vbCr & s
Else: s = "does not have context data"
End If
      
MsgBox "Selected subentity has a type of " & obj.ObjectName & "," & vbCr & _
       "belongs to " & parent.ObjectName & " and" & vbCr & s
      
End Sub

Результат: Как узнать какому BlockReference принадлежит SubEntity?
Тыкал в полилинию в блоке.
Что не так  :?:

Re: Как узнать какому BlockReference принадлежит SubEntity?

Отцы! Извините, что влезаю...

Может вы что-нибудь с ContextData придумаете, чтобы VBA x64 ее воспринимал, а? :oops:
А то все <Unsupported variant type> про нее пишет...

Re: Как узнать какому BlockReference принадлежит SubEntity?

Тогда уж скорее так

Sub test()
Dim PickedPoint, TransMatrix, ContextData, i
Dim obj As AcadEntity
Dim s As String
Dim typ As String
s = ""
ThisDrawing.Utility.GetSubEntity obj, PickedPoint, TransMatrix, ContextData, _
"Select subentity:"

Dim parent As AcadObject
Dim blkref As AcadObject

Set parent = ThisDrawing.ObjectIdToObject(obj.OwnerID)

If VarType(ContextData) <> vbEmpty Then
For i = 0 To UBound(ContextData)
s = s & ContextData(i) & vbCr
Set blkref = ThisDrawing.ObjectIdToObject(ContextData(i))
s = s & " blkRef.ObjectName=" & typ
Next
s = "does the following context data:" & vbCr & s
Else: s = "does not have context data"
End If
typ = IIf(obj.ObjectName = "AcDbAttributeReference", parent.ObjectName, blkref.ObjectName)
MsgBox "Selected subentity has a type of " & obj.ObjectName & "," & vbCr & _
       "belongs to " & parent.ObjectName & " and" & vbCr & s & typ
       
End Sub

~'J'~

Спасибо сказали: kmi1

Re: Как узнать какому BlockReference принадлежит SubEntity?

wl2000 пишет:

Может вы что-нибудь с ContextData придумаете, чтобы VBA x64 ее воспринимал, а?
А то все <Unsupported variant type> про нее пишет...

К сожалению никак. Даже негде поплясать с бубном...