Тема: Новые имена вставленным блокам

Уважаемые Знатоки, подскажите пожалуйста, как изменить имена вставленных блоков
Dim objBlk As AcadBlock
  Dim objBlks As AcadBlocks
  Dim intCnt As Integer
  Set objBlks = ThisDrawing.Blocks
   For Each objBlk In objBlks
      intCnt = intCnt + 1
      objBlk.Name = "Block" & intCnt
  Next objBlk
При попытки присвоить блоку новое имя
objBlk.Name = "Block" & intCnt
   выдается ошибка
Run-time error '-2145386493, Invalid input

Re: Новые имена вставленным блокам

> Андрей
Да никак не изменишь. Надо их ПЕРЕОПРЕДЕЛЯТЬ.

Re: Новые имена вставленным блокам

Вообще-то новое имя описанию блока задать можно. Но не вставке блока! На лиспе я такое написать могу, но на VBA... - явно не сейчас :(

Re: Новые имена вставленным блокам

> Андрей
Мне кажется идея непродуктивная, не лучше ли
будет изменять значения атрибутов с приращением
а то у тебя будет немерено блоков
Тем не менее попробуй (почти без теста):

Option Explicit
Sub RenameOnFly()
Dim objBlk As AcadBlock
Dim newBlk As AcadBlock
Dim itmBlk As AcadObject
Dim objBlks As AcadBlocks
Dim insPnt As Variant
Dim origPt As Variant
Dim i, j As Integer
Dim blkRef As AcadBlockReference
Dim itmVar() As AcadObject
Dim blkName, matchStr As String
Dim isExist As Boolean
isExist = False
On Error GoTo ErrQuit
Set objBlks = ThisDrawing.Blocks
blkName = InputBox("Block Name:", , "Number")
For Each itmBlk In objBlks
If itmBlk.Name = blkName Then
isExist = True
End If
Next
If isExist Then
Set objBlk = objBlks(blkName)
Else
MsgBox "Block " & blkName & " does not isExist"
Exit Sub
End If
Set objBlk = objBlks(blkName)
origPt = objBlk.Origin
ReDim Preserve itmVar(0 To objBlk.Count - 1)
For i = 0 To objBlk.Count - 1
Set itmVar(i) = objBlk.Item(i)
Next
j = 0
On Error Resume Next
With ThisDrawing
Do
insPnt = .Utility.GetPoint(, "Pick insertion point >> :")
Set newBlk = objBlks.Add(origPt, "Block" & CStr(j))
.CopyObjects itmVar, newBlk
Set blkRef = .ModelSpace.InsertBlock(insPnt, "Block" & CStr(j), 1#, 1#, 1#, 0#)
j = j + 1
Loop
End With
ErrQuit:
MsgBox Err.Description
End Sub

~'J'~

Re: Новые имена вставленным блокам

Да можно менять. Только для 2 блоков нельзя:  "*MODEL_SPACE" i "*PAPER_SPACE". [rus]
A jesli nuzhny tol'ko bloki(bez lajjoutov) prosto dobav' proverku: [/rus]

Dim objBlk As AcadBlock
Dim objBlks As AcadBlocks
Dim intCnt As Integer
Set objBlks = ThisDrawing.Blocks
For Each objBlk In objBlks
If Not objBlk.IsLayout Then
intCnt = intCnt + 1
objBlk.Name = "Block" & intCnt
endif
Next objBlk

Re: Новые имена вставленным блокам

Уважаемые Знатоки, большое спасибо за подсказки. Немного изменив ваш кусок программы, я буду перед вставкой стандартного блока, изменять его имя. После чего, даже после редактирования блока командой  refedit, изменения блока будут касаться, лишь этого блока, а все остальные останутся без изменения.

Re: Новые имена вставленным блокам

> Андрей
Андрей, определитесь пожалуйста, о каких блоках идет речь - О вставленных, или о вставляемых?

Re: Новые имена вставленным блокам

Я хочу изменять имена уже вставленным блокам.  Если у меня в чертеже вставлено несколько блоков с одинаковым именем, то желательно, чтобы я мог изменить имя выделенного блока без изменения имен его тесок.
Спасибо за помощь.

Re: Новые имена вставленным блокам

> Андрей
Андрей. Мне кажется я понимаю что хотите сделать. И что у вас не получается. Вы из файлов блоки вставляете?
У меня такое ощущение, что Вы не понимаете разницу между блоком и BlockReference. Один раз вставив блок из файла  и ссылку на него. А во второй раз уже надо BlockReference в ModelSpase вставлять ...
Может не прав?

Re: Новые имена вставленным блокам

Вы абсолютно правы, я окончательно запутался. Поэтому постараюсь изложить все более подробно. Я создал библиотеку блоков с атрибутом в панели TOOL PALETTES. Блоки в чертеж я вставляю с этой панели. Некоторые блоки нужно будет редактировать. Я понимаю, что если отредактировать блок с именем совпадающем с именем других блоков на чертеже, то все изменения коснуться всех тесок. Поэтому , наверное мне придется изменять имя блока сразу же после вставки в чертеж. Конечно, получается не элегантно.

Re: Новые имена вставленным блокам

Помоему мнения можно написать vba скриптик, которая решает эту проблему и если мне не отшибло память то ссылка на подобный пример есть.... Т.е. по ссылке куча примеров и одни из них - то что вам нужно

Re: Новые имена вставленным блокам

> Андрей
Что значит  Некоторые блоки нужно будет редактировать? Если речь идет о значениях атрибутов, то редактируйте на здоровье свой блок, эти изменения не коснутся его тезок.

Re: Новые имена вставленным блокам

Уважаемые Знатоки, под фразой редактирования блока, я подразумевал редактирование вхождения блока командой Refedit, которая конечно затронет все блоки с одинаковым именем.

Re: Новые имена вставленным блокам

> Андрей
http://vbamaker.narod.ru/Cod2.html
вот здесь полазай и посмотри как с блоками работать из VBA

Re: Новые имена вставленным блокам

И напишешь свою первую софтинку ... для

Re: Новые имена вставленным блокам

> Андрей
И все таки, если речь идет о блоках с атрибутами - AcadBlockReference, то какие параметры ты намереваешься редактировать? То есть, почему именно команда _refedit?

Re: Новые имена вставленным блокам

В блоках я собираюсь редактировать длины сторон прямоугольников входящих в состав блока. Мне нужно, чтобы блок (AcadBlockReference) после редактирования оставался блоком, с любым именем.

Re: Новые имена вставленным блокам

> Андрей
А динамические блоки не катят?

Re: Новые имена вставленным блокам

К сожалению о динамических блоках, я и не слыхал.

Re: Новые имена вставленным блокам

> Андрей
Они применяются начиная с ACAD2006

Re: Новые имена вставленным блокам

Есть еще способ. Если нужно изменять размеры сторон прямоугольника, то может быть подойдет вставка блока с разными масштабными коэффициентами по осям X и Y?
Более или менее близкий пример можно посмотреть здесь:
http://www.cad.dp.ua/stats/a_vba/conten … lockScales

Re: Новые имена вставленным блокам

Помоему нет ничиго проше выделить примитив. Проверить на то что выделенный примитив это BlockReference. Найти в блоках -"ModelSpase.Blocks" по имени тот блок на который ссылается BlockReferense создать новый блок с новым именем напхать в него другие примитивы. Удалить выделенный BlockReference и в туже точку вставки вставить другой BlockReference но уже с сылкой на свежесозданный блок?

Re: Новые имена вставленным блокам

> Сергей
Виноват ... ThisDrawing.Blocks