Тема: Как выбрать блок с помощью SelectAtPoint?

Как выбрать блок с помощью SelectAtPoint и получить его атрибуты? Блок могут пересекать другие объекты, но точка выбора с помощю привязки лежит на гафическом элементе блока и являнтся началом полилинии.

Re: Как выбрать блок с помощью SelectAtPoint?

дык:

Dim ssel As AcadSelectionSet
 Dim lobj As AcadBlockReference
 Dim fType(0) As Integer
 Dim fCode(0) As Variant
 Set ssel = vbdPowerset("L_Sel_Set")
 fType(0) = "0"
 fCode(0) = "Insert"
 ssel.Select acSelectAll,pnt,, fType, fCode
 If ssel.Count = 0 Then
'нет здесь блока
 else
'делаем с этим блок все что хочется....
 end if

Re: Как выбрать блок с помощью SelectAtPoint?

SelectAtPoint  выбирает первыйй попавшиййся обьект. ехто может быть и не блок. Тебе лучшхе использовать  SelectByPolygon.

gpCode(0) = 0
dataValue(0) = "INSERT"
acSelSet.SelectByPolygon acSelectionSetFence, point, gpCode, dataValue
 For Each AnyObj In acSelSet
    If AnyObj.HasAttributes Then
       varAttributes =BlocrefObj.GetAttributes
    End If
   End If
next

Re: Как выбрать блок с помощью SelectAtPoint?

> Gogi
Дело в том, что блоки имеют видимые атрибуты, которые могут отстоять от графического изображения на некоторое неизвестное расстояние и метод SelectByPolygon может не всегда сработать.

> Дмитрий
Что это за функция - vbdPowerset("L_Sel_Set")?
Или это добавление набора?
Set ssetObj = ThisDrawing.SelectionSets.Add("SSET")
Большое спасибо за отклики!!! Хотелось бы получить ответы на эти вопросы.

Re: Как выбрать блок с помощью SelectAtPoint?

Может быть что-нибудь наподобие этого:

Dim ssetObj As AcadSelectionSet
    Set ssetObj = ThisDrawing.SelectionSets.Add("TEST_SSET4")
    Dim returnPnt As Variant
    returnPnt = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
    Dim gpCode(0) As Integer
    Dim dataValue(0) As Variant
    gpCode(0) = 0
    dataValue(0) = "INSERT"
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    ssetObj.SelectAtPoint returnPnt, groupCode, dataCode
    Dim blockRefObj As AcadBlockReference
    Dim varAttributes As Variant
    Dim strAttributes As String
    Dim I As Integer
    On Error Resume Next
    For Each blockRefObj In ssetObj
     If (blockRefObj.HasAttributes) Then
          ' Get the attributes for the block reference
           varAttributes = blockRefObj.GetAttributes
          ' Move the attribute tags and values into a string to be displayed in a Msgbox
           For I = LBound(varAttributes) To UBound(varAttributes)
              strAttributes = strAttributes & "  Tag: " & varAttributes(I).TagString & _
                              "   Value: " & varAttributes(I).TextString & "    "
          Next
          MsgBox "The attributes for blockReference " & blockRefObj.Name & " are: " & strAttributes, , "GetAttributes Example"
     End If
    Next blockRefObj

Re: Как выбрать блок с помощью SelectAtPoint?

> Leonid
Ваш код великолепно работает, но не решает поставленной задачи - автоматического получения атрибутов, так как пользователь вынужден указывать блок, причем если указать точку блока к которой привязана полилиния то в набор выбора блок не попадает.
А задача состоит именно в том чтобы получить доступ к атрибутам блока именно из этой точки (точки привязки полилинии к блоку).

Re: Как выбрать блок с помощью SelectAtPoint?

> AVED
Что это за функция - vbdPowerset("L_Sel_Set")?
да, это добавление набора с проверкой на его существование:

On Error Resume Next
  ThisDrawing.SelectionSets.Item(strName).Delete
  Set vbdPowerSet = ThisDrawing.SelectionSets.Add(strName)
  

Re: Как выбрать блок с помощью SelectAtPoint?

> AVED
SelectByPolygon acSelectionSetFence, point сработает если  point  будет находится на любом примитиве блока( не обязательно атрибут). Получив доступ к блоку можно перебрать все его атрибуты, при необходимости вычисляя их геометрические размеры и расположение

Re: Как выбрать блок с помощью SelectAtPoint?

...получить доступ к атрибутам блока именно из этой точки (точки привязки полилинии к блоку).

Так, уточняем - что это за таинственная точка привязки полилинии к блоку? Откуда она взялась (или берется)? На чертеже уже имеется упомянутая полилиния, или Пользователь проводит ее, упирается в блок и тут должны выскочить его атрибуты? Если это так, то программа должна знать, что сейчас выполняется та самая полилиния, с окончаним которой ... и т.д.
Т.е. мы за четкую формулировку технического задания, иначе Джинн может и обрезать ноги...

Re: Как выбрать блок с помощью SelectAtPoint?

> Leonid
Пусть имеются блоки с атрибутами. Соединяем их полилиниями с привязкой к каждому блоку. Далее выбираем полилинию с помощью макроса, при этом сначала ычисляем точки привязки полилинии к блокам (Начальную и Конечную), а потом необходимо обаспечить получение первого атрибута обоих блоков для их дальнейшей обработки.

Re: Как выбрать блок с помощью SelectAtPoint?

Вот несколько схематичное решение, подробнее не было времени:

Dim ssetObj As AcadSelectionSet
     Set ssetObj = ThisDrawing.SelectionSets.Add("SSET")
     Dim gpCode(0) As Integer
     Dim dataValue(0) As Variant
     Dim mode As Integer
    gpCode(0) = 0
    dataValue(0) = "POLYLINE"
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    mode = acSelectionSetAll
    ssetObj.Select mode, groupCode, dataCode
    Dim PL As AcadEntity
    Dim Point As Variant
    On Error Resume Next
    For Each PL In ssetObj
          Point = GetPointStart(PL)
          Call ExtractAtributes(Point)
          Point = GetPointEnd(PL)
          Call ExtractAtributes(Point)
    Next PL

Здесь процедура ExtractAtributes,как вы догадываетесь,
это код из предыдущего поста, а функции GetPointStart,GetPointEnd вы напишете самостоятельно.

Re: Как выбрать блок с помощью SelectAtPoint?

> Leonid
Боьшое спасибо!!! У меня, кажется, все получилось. Теперь идет тестирование на разных вариантах.