Re: Блоки с одинаковым именем

fixo пишет:

Проверял на твоем чертеже, у меня проблем нет

На нем и у меня проблем нет.
Моя вина, не предоставил проблемный чертеж.
Исправился, закачал, ссылку кинул.

В общем:

На 1.dwg - переименовывается без проблем.
На 1_1.dwg  - только первый блок.

Re: Блоки с одинаковым именем

У тебя там их куча какой куда переименовывать
объясни что ты хочешь

Re: Блоки с одинаковым именем

Можно еще попробовать двойное переименование,
сначала ковертировать блок в анонимный а потом
присвоить ему необходимое имя
Без особой проверки, надо бы добавить функцию
на определение существующего блока, чтобы не
получились дубликаты

Option Explicit
Sub TestRenameBlocks()
     Dim handleArr() As String
     Dim oSset As AcadSelectionSet
     Dim oEnt As AcadEntity
     Dim pickPt As Variant
     Dim blkRef As AcadBlockReference
     Dim setName As String
     Dim dxfcode(0 To 1) As Integer
     Dim dxfdata(0 To 1) As Variant
     dxfcode(0) = 0
     dxfdata(0) = "INSERT"
     dxfcode(1) = 2
     Dim i As Integer
     Dim bName As String
     bName = ""
     Do
      ThisDrawing.Utility.GetEntity oEnt, pickPt, "Выбрать единичный блок:"
      If TypeOf oEnt Is AcadBlockReference Then
      Set blkRef = oEnt
      bName = blkRef.EffectiveName
      Else
      bName = InputBox(vbCr & vbCr & "Введи имя блока:", "Переименование блоков")
     dxfdata(1) = bName
     End If
     Loop Until bName <> ""
     
    'MsgBox bName

     dxfdata(1) = bName

     setName = "$Blocks$"
    
          ' удостоверяемся, что именованный выбор не существует

          With ThisDrawing.SelectionSets
               While .Count > 0
                    .Item(0).Delete
               Wend
               ' создаем новый выбор
          Set oSset = .Add(setName)
          End With
     
     oSset.SelectOnScreen dxfcode, dxfdata
     '
     If oSset.Count = 0 Then
          ThisDrawing.Utility.prompt (vbCr & "Блок " & bName & " не существует в рисунке")
          Exit Sub
     Else
          ThisDrawing.Utility.prompt (vbCr & "Выбрано: " & oSset.Count & " блоков")
     End If
     
     Dim n
     ReDim handleArr(0 To oSset.Count - 1)
     For Each oEnt In oSset
     
     Set blkRef = oEnt
     'сохраняем хэндлы всех выбранных блоков в массив:
     handleArr(n) = blkRef.Handle
     'конвертируем вставку блока в анонимный блок
     blkRef.ConvertToAnonymousBlock
     n = n + 1
     Next
     ' переименовываем блоки по одному или единичный блок если один
     bName = ""
     For n = LBound(handleArr) To UBound(handleArr)
     Dim oObj  As AcadObject
     Set oObj = ThisDrawing.HandleToObject(handleArr(n))
     Set blkRef = oObj
     bName = InputBox(vbCr & vbCr & "Введи новое имя блока:", "Переименование блоков", "Предыдущее имя = " & bName)
     On Error Resume Next
     blkRef.ConvertToStaticBlock (bName)
     If Err Then
     Err.Clear
    ''MsgBox "Блок с именем " & bName & "существует, выход..."
     End If
     
     On Error GoTo 0
     blkRef.Update
     Next
     
End Sub

[FONT=Arial]~'J'~[/FONT]

Re: Блоки с одинаковым именем

fixo пишет:

У тебя там их куча какой куда переименовывать
объясни что ты хочешь

Блокам с именем "МПВ...." надо присвоить имя "МПВ" и добавить атрибут (здесь уже проблем нет).
То есть все эти блоки должны иметь одно и то же имя - "МПВ".
И вот на чертеже 1.dwg получается, на 1_1.dwg - нет.

В чем причина - не пойму никак.


P. S.

Код попробую немного позже.

Re: Блоки с одинаковым именем

Попробовал (немного изменил):

Sub TestRenameBlocks()
     Dim handleArr() As String
     Dim oSset As AcadSelectionSet
     Dim oEnt As AcadEntity
     Dim pickPt As Variant
     Dim blkRef As AcadBlockReference
     Dim setName As String
     Dim dxfcode(0 To 1) As Integer
     Dim dxfdata(0 To 1) As Variant
     
     dxfcode(0) = 0
     dxfdata(0) = "INSERT"
     dxfcode(1) = 2
     
     Dim i As Integer
     Dim n As Integer
     Dim bName As String
     bName = ""
     
     n = 0
     For Each oEnt In ThisDrawing.ModelSpace
         If TypeOf oEnt Is AcadBlockReference Then
            If oEnt.EffectiveName Like "*&#204;&#207;&#194;*" Then
               n = n + 1
            End If
         End If
     Next
     
     ReDim handleArr(0 To n - 1)
     n = 0
     For Each oEnt In ThisDrawing.ModelSpace
         If TypeOf oEnt Is AcadBlockReference Then
            If oEnt.EffectiveName Like "*МПВ*" Then
               Set blkRef = oEnt
               'сохраняем хэндлы всех выбранных блоков в массив: 
               handleArr(n) = blkRef.Handle
                'конвертируем вставку блока в анонимный блок 
               blkRef.ConvertToAnonymousBlock
               n = n + 1
            End If
         End If
     Next
     
     ' переименовываем блоки 
     bName = ""
     For n = LBound(handleArr) To UBound(handleArr)
        Dim oObj  As AcadObject
        Set oObj = ThisDrawing.HandleToObject(handleArr(n))
        Set blkRef = oObj
        bName = blkRef.EffectiveName
        bName = "МПВ"
        On Error Resume Next
        blkRef.ConvertToStaticBlock (bName)
        If Err Then
           Err.Clear
           MsgBox "Блок с именем " & bName & "  существует, выход..." 
        End If
        On Error GoTo 0
        
        blkRef.Update
        Set oObj = ThisDrawing.HandleToObject(handleArr(n))
        Set blkRef = oObj
        bName = blkRef.EffectiveName
     Next
    
End Sub

Результат тот же (с небольшим изменением).
Первый блок переименовывается, все остальные нет (остаются со случайным именем).
Вылета по ошибке нет.

(изменено: fixo, 18 августа 2012г. 23:09:59)

Re: Блоки с одинаковым именем

Ты зря переделал мой код, я просто добавил имя блока
как *МПВ* и выбирал примитивы поштучно и похожие по
содержанию, т.е крестик и 2 текста, затем в следущем цикле
я переименовал их по отдельности и все пучком, а когда ты выбираешь из модели
там без разницы что выбралось, то с одним текстом, то с двумя, поэтому ничего не выйдет
короче код не сохранил, потом покажу

По-быстрому:

Option Explicit
''~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~''
Sub RenameBlocks()
     Dim handleArr() As String
     Dim oSset As AcadSelectionSet
     Dim oEnt As AcadEntity
     Dim pickPt As Variant
     Dim blkRef As AcadBlockReference
     Dim setName As String
     Dim dxfcode(0 To 1) As Integer
     Dim dxfdata(0 To 1) As Variant
     dxfcode(0) = 0
     dxfdata(0) = "INSERT"
     dxfcode(1) = 2
     Dim i As Integer
     Dim bName As String
     bName = "*МПВ*"

     dxfdata(1) = bName

     setName = "$Blocks$"
    
          ' удостоверяемся, что именованный выбор не существует

          With ThisDrawing.SelectionSets
               While .Count > 0
                    .Item(0).Delete
               Wend
               ' создаем новый выбор
          Set oSset = .Add(setName)
          End With
     
     oSset.SelectOnScreen dxfcode, dxfdata
     '
     If oSset.Count = 0 Then Exit Sub
   
     Dim n
     ReDim handleArr(0 To oSset.Count - 1)
     For Each oEnt In oSset
     
     Set blkRef = oEnt
     'сохраняем хэндлы всех выбранных блоков в массив:
     handleArr(n) = blkRef.Handle
     'конвертируем вставку блока в анонимный блок
     blkRef.ConvertToAnonymousBlock
     n = n + 1
     Next
     ' переименовываем блоки по одному или единичный блок если один
     bName = ""
     For n = LBound(handleArr) To UBound(handleArr)
     Dim oObj  As AcadObject
     Set oObj = ThisDrawing.HandleToObject(handleArr(n))
     Set blkRef = oObj
     bName = InputBox(vbCr & vbCr & "Введи новое имя блока:", "Переименование блоков", "Предыдущее имя = " & bName)
     On Error Resume Next
     blkRef.ConvertToStaticBlock (bName)
     If Err Then
     Err.Clear
     MsgBox "Блок с именем " & bName & "существует, выход..."
     End If
     
     On Error GoTo 0
     blkRef.Update
     Next
     
End Sub

Re: Блоки с одинаковым именем

Сейчас проверил одну идею и появились вопросы.
Когда  пытался вручную переименовать блок на чертеже 1.DWG (пример),
то обратил внимание, что блоков было показано только 3 - ИИ16001, ИИ22002, ИИ25020.
То есть на чертеже мы можем выделить отдельные блоки (одно имя, разные атрибуты), однако для переименования они выглядят как один блок!
И после переименования ИИ22002 имя меняется сразу у всех таких блоков (или подблоков, как их там).
После этого выполнил свою процедуру только один раз - изменил имя только у одного блока. Результат
был аналогичным - сразу все блоки изменили имя!
В общем ситуация следующая (как я понимаю):
На чертеже 1.DWG (пример) есть один большой блок (ИИ22002), состоящий из блоков (назову их подблоки) с различными атрибутами. Мы можем обратится к подблоку - выделить его, изменить атрибут, переместить его и т. д. Но все операции на блоке (переименование) выполняются на всех подблоках сразу.
Может именно здесь и порылась собака?
Моих знаний AUTOCAD не хватает, чтобы воспроизвести данную ситуацию.
Как может такое быть,  как можно сформировать такой блок (суперблок :D )?

Re: Блоки с одинаковым именем

Поищи по основному форуму:
https://www.caduser.ru/forum/forum2.html

Re: Блоки с одинаковым именем

fixo пишет:

Поищи по основному форуму:

А по какой тематике, приблизительно, искать, к какому разделу относится (может относиться) мой блок? Перелопачивать весь форум тяжеловато.
Да и пытался искать, пока результатов не было.

Re: Блоки с одинаковым именем

Может "динамический блок"
Трудно понять твои пожелания, что значит суперблок
Есть возможность создать динамический блок (только вручную)
там прописать в виде атрибутов название какоих-то опций и их значения
в самом блоке можно создать различные видимости,
как он будет выглядеть на экране в зависмости от переключателя
можно так же создавать блоки с видимыми и невидимыми атрибутами,
есть многое на свете, друг Гораций...

[FONT=Arial]~'J'~[/FONT]

Re: Блоки с одинаковым именем

Я так назвал, так как не знаю что это такое.
Вообще, что это за блок, состоящий из множества блоков,имеющих одно и то же имя?
Как бы Вы охарактеризовали блок из моего примера (1.dwg)? Что это такое?

Re: Блоки с одинаковым именем

там у тебя вроде лидеры были с атрибутами,
это посложнее

Re: Блоки с одинаковым именем

А что это за лидеры? Как их можно создать (пусть хотя бы вручную) в 2007-м?

Re: Блоки с одинаковым именем

Не помню как это было в 2007
Попробуй, может у тебя получится,
только измени имя блока в коде:

Option Explicit
'' Установить :
''Tools --> Options -->  General --> Error field --> Break on Unhandled Errors
Public Sub doLeader()

Dim p1, p2 As Variant
Dim ipt(0 To 2) As Double
Dim blkRef As AcadBlockReference
Dim m_leader As AcadLeader
Dim pts(0 To 5) As Double
Dim intPt(0 To 2) As Double
Dim m_anno As AcadObject
Dim pickPt As Variant
Dim scl As Double
Dim vxPt
scl = 1
p1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "Точка вставки блока:")
ipt(0) = p1(0): ipt(1) = p1(1):
ipt(2) = p1(2)
' Измени имя блока здесь:
Set blkRef = ThisDrawing.ModelSpace.InsertBlock(ipt, "Мой блок здесь", scl, scl, scl, 0)
' Сщздаем блок в модели
p2 = ThisDrawing.Utility.GetPoint(, vbCrLf & "Точка вставки стрелки:")
pts(0) = p2(0): pts(1) = p2(1): pts(2) = p2(2)
pts(3) = p1(0): pts(4) = p1(1): pts(5) = p1(2)


Set m_anno = Nothing

Set m_leader = ThisDrawing.ModelSpace.AddLeader(pts, m_anno, acLineWithArrow)
m_leader.ScaleFactor = scl / 2
m_leader.ArrowheadType = acArrowDot
m_leader.ArrowheadSize = scl * 100
' Соединяем блок с лидером
pickPt = blkRef.IntersectWith(m_leader, acExtendNone)
intPt(0) = pickPt(0): intPt(1) = pickPt(1):
intPt(2) = pickPt(2)
vxPt = m_leader.Coordinate(1)
vxPt(0) = intPt(0)
vxPt(1) = intPt(1)
vxPt(2) = intPt(2)

m_leader.Coordinate(1) = vxPt
' Добавляем блок в качестве аннотации к лидеру
m_leader.Annotation = blkRef
m_leader.Update

End Sub

[FONT=Arial]~'J'~[/FONT]

Re: Блоки с одинаковым именем

Все оказалось до банальности просто. Эти блоки были получены или через копирование или через вставку одного и того же блока. В обоих случаях новые блоки будут иметь одно и тоже имя.

Re: Блоки с одинаковым именем

Ну так что, проблема решена?

Re: Блоки с одинаковым именем

Да, остальное дело техники.