Получить ListBox с именами блоков в чертеже
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Получить ListBox с именами блоков в чертеже

Получить ListBox с именами блоков в чертеже

Ответ
Поиск в этой теме
Непрочитано 18.08.2024, 18:32 #1
Получить ListBox с именами блоков в чертеже
olga87
 
Регистрация: 28.05.2007
Сообщений: 229

Здравствуйте Уважаемые специалисты AutoCAD!

Подскажите пожалуйста, как получить в списке "blkList" перечень имен как не динамических, так и динамических блоков в чертеже?
Код ниже работает так - выводит в "blkList" либо имена не динамических, либо динамических блоков. Но одновременно не работает.

Код:
[Выделить все]
Public Function GetBlockNamesWithAttributes(Space As Integer) As List(Of String)

Dim ss As SelectionSet
Dim doc As Document = Application.DocumentManager.MdiActiveDocument

ss = GetObjects("INSERT", Space)
Dim blkList As New List(Of String)

Dim bname As String
Using trans As Transaction = doc.TransactionManager.StartTransaction()
    For Each sObj As SelectedObject In ss
        Dim blk As BlockReference = TryCast(trans.GetObject(sObj.ObjectId, OpenMode.ForRead), BlockReference)
        Dim dynId As ObjectId = blk.DynamicBlockTableRecord
        Dim dynbtr As BlockTableRecord = TryCast(trans.GetObject(dynId, OpenMode.ForRead), BlockTableRecord)

        If blk.AttributeCollection.Count > 0 Then

            If Not blk.IsDynamicBlock Then
                If Not blkList.Contains(blk.Name) Then
                    bname = blk.Name
                    blkList.Add(bname)
                End If
            Else
                If Not blkList.Contains(dynbtr.Name) And dynbtr IsNot Nothing Then
                    bname = dynbtr.Name
                    blkList.Add(bname)
                End If
            End If

        End If
    Next

    trans.Commit()
End Using

    Return blkList
End Function



Public Function GetObjects(objType As String, Space As Integer) As SelectionSet
    Dim doc As Document = Application.DocumentManager.MdiActiveDocument
    Dim edt As Editor = doc.Editor

    Dim acTypValAr(1) As TypedValue
    acTypValAr.SetValue(New TypedValue(67, Space), 0)
    acTypValAr.SetValue(New TypedValue(DxfCode.Start, objType), 1)

    Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
    Dim psr As PromptSelectionResult = edt.SelectAll(acSelFtr)
    Dim ss As SelectionSet = psr.Value

    Return ss
End Function
Заранее спасибо!
Просмотров: 883
 
Непрочитано 18.08.2024, 19:32
#2
Сергей812


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


Как вариант - получаете через фильтр список ObjectId вставок блоков, затем внутри транзакции в цикле получаете их имена. Для уникальности имен можно тот же HashSet<T> класс использовать, задав его начальную емкость равную, например, 1/2 или 1/4 от количество найденных фильтром вставок блока.
Сергей812 вне форума  
 
Непрочитано 19.08.2024, 06:34
#3
gumel


 
Регистрация: 20.04.2011
Сообщений: 481


У блоков автокада есть Name и EffectiveName. Name для динамических блоков будет такого вида: *U12, *U15 и т.п., а вот EffectiveName - отображает действительное имя

Код:
[Выделить все]
 
Private Sub Select_Blocks()
  Dim ssetBlocks As AcadSelectionSet
  Set ssetBlocks = ThisDrawing.SelectionSets.Add("BlockSelection777")
  ssetBlocks.SelectOnScreen
  Dim entry As AcadEntity
  Dim blockname As String
  For Each entry In ssetBlocks
    If TypeOf entry Is AcadBlockReference Then
      blockname = entry.EffectiveName
....
  Next entry
  ssetBlocks.Delete
....
End Sub

gumel вне форума  
 
Непрочитано 19.08.2024, 09:35
#4
Сергей812


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


ThisDrawing в VBA, а не в .Net)
Сергей812 вне форума  
 
Автор темы   Непрочитано 19.08.2024, 15:29
#5
olga87


 
Регистрация: 28.05.2007
Сообщений: 229


Подскажите пожалуйста, как в функции "GetObjects(objType As String, blkName As String, Space As Integer)" задать , чтобы "BlockName" было настоящим именем для динамического блока?
Это возможно?


Код:
[Выделить все]
Public Function GetObjects(objType As String, blkName As String, Space As Integer) As SelectionSet
    BlocksCountDWG = 0

    Dim doc As Document = Application.DocumentManager.MdiActiveDocument
    Dim edt As Editor = doc.Editor

    Dim acTypValAr(1) As TypedValue
    acTypValAr.SetValue(New TypedValue(67, Space), 0)
    acTypValAr.SetValue(New TypedValue(DxfCode.Start, objType), 1)
    acTypValAr.SetValue(New TypedValue(CInt(DxfCode.BlockName), blkName), 1)

    Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
    Dim psr As PromptSelectionResult = edt.SelectAll(acSelFtr)
    Dim ss As SelectionSet = psr.Value

    BlocksCountDWG = psr.Value.Count

    Return ss
End Function



Public Function GetBlockNamesWithAttributes(Space As Integer) As List(Of String)
Dim ss As SelectionSet
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database

ss = GetObjects("INSERT", Space)
Dim blkList As New List(Of String)

Using trans As Transaction = db.TransactionManager.StartTransaction()
    For Each sObj As SelectedObject In ss

        Dim blockRef As BlockReference = TryCast(trans.GetObject(sObj.ObjectId, OpenMode.ForRead), BlockReference)
        Dim block As BlockTableRecord = Nothing

        'Только блоки с атрибутами
        If blockRef.AttributeCollection.Count > 0 Then

            If blockRef.IsDynamicBlock Then
                'Получаем настоящее имя блока
                block = trans.GetObject(blockRef.DynamicBlockTableRecord, OpenMode.ForRead)
            Else
                block = trans.GetObject(blockRef.BlockTableRecord, OpenMode.ForRead)
            End If

            If Not block = Nothing Then
                blkList.Add(block.Name)
            End If

        End If

    Next

    trans.Commit()
End Using

Return blkList
End Function
olga87 вне форума  
 
Непрочитано 19.08.2024, 17:02
1 | #6
Сергей812


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


Цитата:
Сообщение от olga87 Посмотреть сообщение
Подскажите пожалуйста, как в функции "GetObjects(objType As String, blkName As String, Space As Integer)" задать , чтобы "BlockName" было настоящим именем для динамического блока?
Это возможно?
нет, фильтрация не умеет сразу по эффективному имени блока работать, насколько знаю. Но в .Net можно не одним путем двигаться к реализации - например
Сергей812 вне форума  
 
Непрочитано 22.08.2024, 09:33
#7
Boxa

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


Extensions method:
Код:
[Выделить все]
    public static string GetEffectiveName(this Db.BlockReference br)
    {
      string result = br.Name;
      var id = br.BlockTableRecord;
      if (br.IsDynamicBlock)
        id = br.DynamicBlockTableRecord;

      using (var btr = id.Open(Db.OpenMode.ForRead, true) as Db.BlockTableRecord)
        result = btr.Name;

      return result;
    }
Пример вызова:
Код:
[Выделить все]
        using (var br = id.Open(Db.OpenMode.ForRead, true, true) as Db.BlockReference)
        {
          brName = br.GetEffectiveName();
        }
Boxa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Получить ListBox с именами блоков в чертеже



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему Автокад не показывает атрибуты, созданные в редакторе блоков, а не непосредственно на чертеже, при вставке блока на чертёж? cancercat AutoCAD 30 06.02.2023 10:20
Регенирация всех динамических блоков на чертеже Малюк AutoCAD 2 01.12.2019 10:03
Тормозит команда расчленения набора блоков batmax Программирование 4 31.08.2010 17:37
Получить список блоков в чертеже DonVik Программирование 6 27.08.2008 15:08