Тема: Удаление слоя

Здравствуйте, уважаемые Знатоки.
На определенном слое я создаю блок с атрибутом. Мне нужно программно перенести их на другой слой, и уничтожить старый слой.  Попробовал  «вручную». Переношу вставку блока на нужный слой. Вхожу через Block Editor в блок и переношу атрибут на новый слой. Получается, что старый слой пустой, хочу его удалить.  Но не получается. Почему. Если можно, то объясните на уровне VB.

Re: Удаление слоя

Слой удалось удалить командой Purge. Подскажите пожалуйста, как в бейсике запустить эту команду? Или придется делать через макрос?

Re: Удаление слоя

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

Option Explicit
Sub PurgeLayer()
ThisDrawing.SendCommand "-PURGE" & vbCr & "LA" & vbCr & _
"MyLayer" & vbCr & "Y" & vbCr & "Y" & vbCr
End Sub

~'J'~

Re: Удаление слоя

В команде ThisDrawing.PurgeAll разобрался.
Причина не удаление «чистого» слоя, в том, что атрибут блока не переноситься на другой слой. Подскажите, как в бейсике перенести его на текущий слой.

Re: Удаление слоя

> Андрей
Пробуй:

Option Explicit
'' written by Fatty T.O.H (c)2006 * all rights removed
'' based on idea by Jeff Mishler
Sub ch_AttLayer()
Dim ownerObj As AcadObject
Dim oBlock As AcadBlock
Dim oAttrib As AcadAttribute
Dim oAttRef As AcadAttributeReference
Dim varPt As Variant
Dim subObj As AcadObject
Dim itmObj As AcadObject
Dim blkName As String, strTag As String
Dim lngId As Long
Dim tmax, cxdata
Dim i, j As Long
Dim blkHdl As String
On Error GoTo Err_Trapp
ThisDrawing.Utility.GetSubEntity subObj, varPt, tmax, cxdata, "Select a block subentity"
If TypeOf subObj Is AcadAttributeReference Then
Set oAttRef = subObj
strTag = oAttRef.TagString
Else
MsgBox "Wrong type of selected object"
Exit Sub
End If
lngId = subObj.OwnerID
Set ownerObj = ThisDrawing.ObjectIdToObject(lngId)
blkName = ownerObj.Name
Debug.Print blkName
strLayer = InputBox("Enter layer name" & vbCr & "to offset attribute on: ", "New Attribute Layer")
Set oBlock = ThisDrawing.Blocks(blkName)
For i = 0 To oBlock.Count - 1
Set itmObj = oBlock.Item(i)
If TypeOf itmObj Is AcadAttribute Then
Set oAttrib = itmObj
If oAttrib.TagString = strTag Then
oAttrib.Layer = strLayer
End If
End If
Next i
Dim oSset As AcadSelectionSet
Dim oEnt As AcadEntity
Dim oBlkRef As AcadBlockReference
Dim fcode(2) As Integer
Dim fData(2) As Variant
Dim dxfcode, dxfdata
Dim setName As String
Dim attVar As Variant
fcode(0) = 0
fData(0) = "INSERT"
fcode(1) = 2
fData(1) = blkName
fcode(2) = 66
fData(2) = 1
dxfcode = fcode
dxfdata = fData
setName = "$Blocks$"
For i = 0 To ThisDrawing.SelectionSets.Count - 1
If ThisDrawing.SelectionSets.Item(i).Name = setName Then
ThisDrawing.SelectionSets.Item(i).Delete
Exit For
End If
Next i
Set oSset = ThisDrawing.SelectionSets.Add(setName)
oSset.Select acSelectionSetAll, , , dxfcode, dxfdata
Debug.Print oSset.Count
For Each oEnt In oSset
Set oBlkRef = oEnt
attVar = oBlkRef.GetAttributes
For i = 0 To UBound(attVar)
Set oAttRef = attVar(i)
If oAttRef.TagString = strTag Then
oAttRef.Layer = strLayer
End If
Next i
Next oEnt
ThisDrawing.Regen acActiveViewport
Exit Sub
Err_Trapp:
If Err Then
MsgBox Err.Description
End If
End Sub

>'J'<

Re: Удаление слоя

Большое спасибо. Постараюсь разобраться.

Re: Удаление слоя

Большое спасибо, все кто откликнулся.
В виду того, что мне нужно было освобождать от атрибутов вхождений блоков все активные слои  и перенести их в текущий, я использовал следующий код.
For Each elem In ThisDrawing.ActiveLayout.Block
      With elem
        If .EntityName Like "AcDbBlockReference" Then
               Atts = elem.GetAttributes
               For Each Att In Atts
              For Each oLayer In Application.ActiveDocument.Layers
              If ((Application.ActiveDocument.ActiveLayer.Name <> Att.Layer) And (oLayer.Name = Att.Layer) And (oLayer.LayerOn = True)) Then Att.Layer = Application.ActiveDocument.ActiveLayer.Name
             Next
              Next
               Exit For
            End If
      End With
   Next

Re: Удаление слоя

Может, лучше переносить все на слой "0"? а саму вставку блока кидать на определенный слой?

Re: Удаление слоя

Или сделать вообще не так: в описании блока атрибут на слой "0", а во вставке - на слой блока. Я далеко не спец по VBA, но что-то типа такого, наверное?

Function NormAttr(blkRef As AcadBlockReference) As AcadBlockReference
Dim blk As AcadBlock
Dim SubEnt As AcadObject
  blk = ThisDrawing.Blocks.Item(blkRef.Name)
  For Each SubEnt In blk
    SubEnt.Layer = "0"
  Next SubEnt
  For Each SubEnt In blkRef
    If SubEnt.ObjectName Like "*" & "Attribute" & "*" Then
      SubEnt.Layer = blkRef.Layer.Name
    End If
  Next SubEnt
  blkRef
End Function

Re: Удаление слоя

Большое спасибо всем ответившим.
А особенно хочу поблагодарить организаторов данного форума!

Re: Удаление слоя

Всем доброго времени суток!
Уважаемый Fatty не могли бы вы более подробно описать процесс проверки статуса слоя.
Столкнулся с ситуацией когда необходимо удалить слой на котором нет никаких видимых объектов, но при попытке удаления выдается сообщение "На объект ссылаются другие объекты"
Заранее благодарен!

Re: Удаление слоя

Перед тем как сделать пурге не забываем перейти на 0 слой.

Re: Удаление слоя

> Dmi3i4
Я не пробовал задаваться этой целью, просто
имел реальную ситуацию, когда в размерном
стиле линия измерения была на неиспользуемом
в чертеже слое, слой было невозможно удалить
Попробуй стандартную команду LAYDEL из пакета
Express Tools
~'J'~

Re: Удаление слоя

> Fatty
удалил слой с помощью LAYDEL
но при этом выдало следующее сообщение
******** WARNING ********
There are 1 block definition(s) which reference the layer(s) you are deleting.
The block(s) will be redefined and the entities referencing the layer(s)
will be removed from the block definition(s).
You are about to permanently delete layer AS_3_6_018 from this drawing.
Do you wish to continue? [Yes/No] <No>:y
Переопределяется блок "AR11"
Не найдены неиспользуемые блоки.
Удаление слой "AS_3_6_018".
Удалено 1 слой.
*************************
Подскажите можно ли найти переопределенный блок "AR11"? Или, зная теперь имя блока, можно найти его в документе "до удаления"?
(По пробовал отыскать его по имени программа возвращает пустой selection set)

varData(0) = strBlkName
  intData(0) = 2
  objSelSet.Select acSelectionSetAll, , , intData, varData
  For Each objblkRef In objSS
    objSS.Highlight True
  Next objblkRef

Заранее спасибо!

Re: Удаление слоя

> Dmi3i4
Возможно этот блок вложенный
в Xref или в другой блок
Только догадка
Кстати примитив на удаленном слое тоже
удаляется из описания блока, забыл сказать
прошлый раз :(
Надеюсь это восстановимо
~'J'~

Re: Удаление слоя

> Fatty
Проблема давно мучала, спасибо!

Re: Удаление слоя

> Saor
Всегда рад помочь :)
~'J'~