Тема: Последовательная переименовка одноименных атрибутов

Проблема: в чертеж вставлено множество (более 100) разноименных блоков (с разными именами: верстак производственный, тиски слесарные...), пронумерованных с помощью одноименного атрибута ("TAG: Номер" ? одинаково у каждого блока). Значения аттрибута "Номер" хаотичны, т.к. копировались из другого чертежа.
Например, вставлено множество блоков со значениями аттрибута "Номер": 27, 5, 89....... Хотелось бы автоматизировать рутинную операцию последовательной переименовки ат-трибутов, т.е. на выходе получить значения аттрибута "Номер": 1,2,3......... При этом, аб-солютно не важно, какому блоку присвоится очередной порядковый номер.
Примечание: далее, с помощью Attribute Extraction, генерирую спецификацию к чертежу: 1-верстак производственный, 2-тиски слесарные....
P.S.: если бы знал, как из Visual Basic работать с чертежом, то написал бы прогу по сле-дующей схеме:

n=количество разноименных блоков в чертеже
z=значение атрибута "Номер" текущего блока
for i = 1 to n
z=i
переход к следующему блоку
next i

На мой взгляд, непросто будет организовать последовательный перебор блоков от пер-вого к последнему. Возможно на Lispe все гораздо проще, но с этим языком я не знаком, т.к. он ближе к Delphi нежели к Visual Basic.
Заранее искренне благодарен всем тем, кого заинтересует поднятая тема, и кто не пожа-леет времени на ответ.

Re: Последовательная переименовка одноименных атрибутов

ну вот в свое время (уже не помню зачем) наваял, может, оно?

'Получение атрибутов (редактируемых) блока и вывод их в MsgBox
Sub GetBlockAttr()
Dim objBlock As AcadBlock, objBlockRef As AcadBlockReference
Dim objAttr As AcadAttribute
Dim SelSet As AcadSelectionSet
Dim SelBlock As AcadBlockReference
Dim sSelSetName As String, sBlockAttr As String
Dim filterType(0) As Integer
Dim filterData(0) As Variant
Dim blcAttr As Variant
Dim blcAttrCounter As Long, lCounter As Long
  filterType(0) = 0
  filterData(0) = "INSERT"
  sSelSetName = "SelectionForGetBlockAttr"
  For lCounter = 0 To ThisDrawing.SelectionSets.Count
    If ThisDrawing.SelectionSets.Item(lCounter).Name = sSelSetName Then
      ThisDrawing.SelectionSets.Item(lCounter).Clear
      ThisDrawing.SelectionSets.Item(lCounter).Delete
      Exit For
    End If
  Next 'lCounter
  Set SelSet = ThisDrawing.SelectionSets.Add(sSelSetName)
  SelSet.SelectOnScreen
  sBlockAttr = ""
  For lCounter = 1 To SelSet.Count
    Set SelBlock = SelSet.Item(lCounter - 1)
    blcAttr = SelBlock.GetAttributes
    For blcAttrCounter = LBound(blcAttr) To UBound(blcAttr)
      sBlockAttr = sBlockAttr + "; Tag: " + blcAttr(blcAttrCounter).TagString + _
                        "; Value: " + blcAttr(blcAttrCounter).TextString
    Next  'blcAttrCounter
    sBlockAttr = sBlockAttr + vbCr
  Next 'lCounter
  'Удаление SelSet
  SelSet.Clear
  SelSet.Delete
  MsgBox sBlockAttr
End Sub

Re: Последовательная переименовка одноименных атрибутов

Я к тому, что добраться до редактируемых атрибутов можно.

Re: Последовательная переименовка одноименных атрибутов

Спасибо за ответ, завтра на работе обязательно попробую...

Re: Последовательная переименовка одноименных атрибутов

> Lestor GL
https://www.caduser.ru/forum/topic17954.html

Re: Последовательная переименовка одноименных атрибутов

> brigval
Понял, молчу.

Re: Последовательная переименовка одноименных атрибутов

kpblc пишет:

Понял, молчу.

kpblc, да там просто варианты. В добавление к Вашему :)

Re: Последовательная переименовка одноименных атрибутов

> brigval
А можно ко мне на "ты", а?
И по поводу вариантов - я посмотрел на эти "варианты", мне плохо стало, сколько элементов я не предусмотрел (нет, например, отлова ошибок ни в каком виде). А уж после того, как пошел разговор о работе с файлом через dbx...

Re: Последовательная переименовка одноименных атрибутов

> kpblc
kpblc, все мы здесь учимся. Но эта тема уже для другой темы:)

Re: Последовательная переименовка одноименных атрибутов

Немного переделал код, предложенный  Jam (2005-05-23 17:56:22), под свою задачу. Пашет 100%-но. До этого писал на Visual Basic только для Word, это мой первый опыт с Autocad. Спасибо ребята!!!
P.S. Код на всякий случай выложу, может кому сгодиться...

Dim MyBlock As AcadBlock
Dim MyBlocks As AcadBlocks
Dim MyBlockReference As AcadBlockReference
Dim Atts As Variant
Public Function SelectMyBlocks(strName As String) As AcadSelectionSet
  Dim objSelSet As AcadSelectionSet
  Dim objSelCol As 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 SelectMyBlocks = objSelSet
End Function
 Public Sub GetMyBlockRefAtts()
  Dim objSelSet As AcadSelectionSet
  Dim objBlkRef As AcadBlockReference
  Dim intType(0) As Integer
  Dim varDat(0) As Variant
  Dim strAttributes As String
  Dim i As Integer
  Dim s As Integer
  s = 1
  On Error GoTo Err_Control
    intType(0) = 0
    varDat(0) = "INSERT"
    Set objSelSet = SelectMyBlocks("blocks")
    objSelSet.Select acSelectionSetAll, FilterType:=intType, _
    FilterData:=varDat
    For Each MyBlockReference In objSelSet
        Atts = MyBlockReference.GetAttributes
        For i = LBound(Atts) To UBound(Atts)
        strAttributes = strAttributes & "  Tag: " & Atts(i).TagString & "   Value: " & Atts(i).TextString & "    "
        If Atts(i).TagString = "НОМЕР" Then
        Atts(i).TextString = s
        s = s + 1
        End If
        Next i
        Next MyBlockReference
Exit_Here:
  Exit Sub
Err_Control:
  MsgBox Err.Description
  Resume Exit_Here
End Sub

Re: Последовательная переименовка одноименных атрибутов

"Рано радовался"... Дело в том, что код, указанный выше, работает для разноименных блоков. Но если в чертеже несколько блоков с одним именем он всем присваивает разные порядковые номера (аттрибуты), а надо чтобы одноименные блоки имели одинаковый номер.
Поясню: генерю спецификацию, и хочу получить: 1.верстак слесарный- 5 шт. А код выдает: 1.Верстак слесарный -1шт., 2.Верстак слесарный - 1шт. и т.д.
День проседел безрезультатно. Может кто подскажит, как подправить код под эту задачу?

Re: Последовательная переименовка одноименных атрибутов

Разобрался сам, вроде работает:

Public Sub GetMyBlockRefAtts()
  Dim objSelSet As AcadSelectionSet
  Dim objBlkRef As AcadBlockReference
  Dim intType(0) As Integer
  Dim varDat(0) As Variant
  Dim strAttributes As String
  Dim i As Integer
  Dim g As Integer
  Dim name As String
  ' ориентировочное количество разноименных блоков
  Dim massive(200) As String
  Dim s As Integer
  Dim s1 As Integer
      s = 1
  's1 = 1
  On Error GoTo Err_Control
    intType(0) = 0
    varDat(0) = "INSERT"
    Set objSelSet = SelectMyBlocks("blocks")
    objSelSet.Select acSelectionSetAll, FilterType:=intType, _
    FilterData:=varDat
    For Each MyBlockReference In objSelSet
        name = MyBlockReference.name
        ' отбраковка копий
        ' ориентировочное количество разноименных блоков
        For i = 1 To 200
        If massive(i) = name Then GoTo 15
        Next i
        ' заполнение массива
        massive(s) = name
        s = s + 1
15      Next MyBlockReference
       For g = 1 To 200
     For Each MyBlockReference In objSelSet
        name = MyBlockReference.name
     Atts = MyBlockReference.GetAttributes
        For i = LBound(Atts) To UBound(Atts)
        If massive(g) = name And Atts(i).TagString = "НОМЕР" Then
        Atts(i).TextString = s1
        End If
        Next i
        Next MyBlockReference
        s1 = s1 + 1
       Next g
Exit_Here:
  Exit Sub
Err_Control:
  MsgBox Err.Description
  Resume Exit_Here
End Sub