Тема: Информация из штампа по листам

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

Dim oSset As AcadSelectionSet
Dim oEnt As AcadEntity
Dim blkRef As AcadBlockReference
Dim oAtt As AcadAttributeReference
Dim attArr() As AcadAttributeReference
Dim attVal1 As String
Dim attVal2 As String
Dim dxfcode(0 To 1) As Integer
Dim dxfdata(0 To 1) As Variant
dxfcode(0) = 0
dxfdata(0) = "INS ERT"
dxfcode(1) = 2
dxfdata(1) = "Øòàìï" & ",`*U*"
Dim LayoutName As String

 
 For i = 0 To pages_count - 1
LayoutName = namelayotArray(i)
For k = 0 To pages_count - 1
 '*********
' LayoutName = ThisDrawing.ActiveLayout.name
Dim setName As String, j As Integer
Dim hgt As Double, scl As Double
hgt = ThisDrawing.GetVariable("DIMTXT")
hgt = hgt * 0.0001
setName = "$Blocks$"
'ThisDrawing.ActiveLayout (iD)
'Make sure selection set does not exist
For j = 0 To ThisDrawing.SelectionSets.count - 1
If ThisDrawing.SelectionSets.Item(j).name = setName Then
ThisDrawing.SelectionSets.Item(j).Delete
Exit For
End If
Next j
' select all blocks
Set oSset = ThisDrawing.SelectionSets.Add(setName)
oSset.Select acSelectionSetAll, , , dxfcode, dxfdata
ThisDrawing.Utility.Prompt "Selected: " & oSset.count & " blocks"
'Process each block instance
For Each oEnt In oSset
Dim iD As Long
iD = oEnt.OwnerID
Dim oLayObj As AcadObject
Set oLayObj = ThisDrawing.ObjectIdToObject(iD)
Dim objLt As AcadLayout
Set objLt = oLayObj.Layout  ' 
Dim oLayout As AcadBlock

Set oLayout = oLayObj
Set blkRef = oEnt
Dim pt As Variant
pt = blkRef.InsertionPoint


   attArr = blkRef.GetAttributes
   For j = 0 To UBound(attArr)
            Set oAtt = attArr(j)
            Select Case oAtt.TagString
        
             Case "CELL5_7"
           
             NlayotArray(k) = oAtt.TextString
      
            End Select
          
     Next j
   Next
' End If
Next
  
Next
oSset.Delete
Se t oSset = Nothing
End Sub

в данном коде  считывает только с активного листа, мне нужно со всех листов  чертежа, где есть  блок штампа

(изменено: Вильдар, 27 августа 2010г. 17:33:40)

Re: Информация из штампа по листам

Щас накатаю пример для выбора листов и блоков штампа на них.

Нужно пояснить:

1. На листе может быть больше одного блока штампа?
2. Нужно переименовать лист в соответствии с текстом в атрибуте блока штампа этого листа?

Re: Информация из штампа по листам

1.конечно не может
2.да переименовать

Re: Информация из штампа по листам

Вот, что получилось. Потестировал на своем блоке штампа. Замени имена. И вставь в новый модуль. Запускать через Main.

Option Explicit

Public Sub Main()
   
   Dim list As AcadLayout
   Dim sBlStampName As String
   Dim ent As AcadEntity
   Dim blStamp As AcadBlockReference
   
   sBlStampName = "Штамп"
   
   For Each list In ThisDrawing.Layouts
      If list.Name <> "Model" Then
         For Each ent In list.Block
            If TypeOf ent Is AcadBlockReference Then
               Set blStamp = ent
               If blStamp.Name = sBlStampName Then
                  RenameList list, blStamp
               End If
            End If
         Next
      End If 'list.Name <> "Model"
   Next 'list In ThisDrawing.Layouts
   
End Sub

' Переименование листа, по данным из блока штампа.
Private Function RenameList(list As AcadLayout, blStamp As AcadBlockReference)
   
   Dim sName As String
   
   sName = GetListName(blStamp)
   
   On Error Resume Next
   list.Name = sName
   
   If Err Then
      MsgBox "Недопусьтимое имя для листа - " + sName
   End If
   
   On Error GoTo 0
   
End Function

' Получение имени листа из блока штампа
Private Function GetListName(blStamp As AcadBlockReference) As String
   
   Dim atr As AcadAttributeReference
   Dim vAtr As Variant
   
   If blStamp.HasAttributes = True Then
      
      For Each vAtr In blStamp.GetAttributes
         
         Set atr = vAtr
         
         If Strings.LCase(atr.TagString) = Strings.LCase("Наименование") Then
            GetListName = atr.TextString
            Exit Function
         End If
         
      Next
   End If
   
End Function

Смысл такой, перебираются листы в чертеже, находится блок штампа и нужный атрибут у него, затем переименовывается лист.

Несколько моментов.
1. Забыл добавить проверку единственности блока штампа на листе.
2. С именами листов могут быть проблемы. Недопустимые символы - <>/\":;?,='
   В атрибутах такого нет.

(изменено: Вильдар, 27 августа 2010г. 18:21:09)

Re: Информация из штампа по листам

Опс, ошибка выскакивает при присвоении недопустимого имени листу.
Странно, что On Error ее не ловит.

Нужна проверка правильности имени для листа. Может кто подскажет? Я не знаю. Тупо, проверять наличие недопустимых символов! Блин, лень немного.
Поищу щас.

(изменено: Элис, 27 августа 2010г. 18:41:14)

Re: Информация из штампа по листам

Спасибо большое!!   сейчас  постараюсь  данные  из штампа запихнуть в динамический массив

Re: Информация из штампа по листам

там в другом месте  не бьет я выловила так что все   работает

Re: Информация из штампа по листам

Элис пишет:

там в другом местене бьет я выловила так что все работает

По-конкретнее.

Re: Информация из штампа по листам

If Strings.LCase(atr.TagString) = Strings.LCase("Наименование") Then 
 GetListName = atr.TextString 

здесь

Re: Информация из штампа по листам

Вроде все правильно. Проверка имени атрибута. Lcase добавил, что было независимо от регистра имен.
В чем проблема? Непонял опять )

Re: Информация из штампа по листам

По поводу проверки имени листа ничего не нашел.

Re: Информация из штампа по листам

Вильдар пишет:

По поводу проверки имени листа ничего не нашел.

Можно для проверки правильности (валидности) имени листа
использовать RegularExpression
Или более древним способом, сравнивая коды символов с
использованием функции Asc
Проверь все ли символы я учел, нет времени:

Sub RenameLayout()

Dim i, pos

Dim arr
'' using ascii codes:
arr = Array(34, 39, 44, 47, 58, 59, 60, 61, 62, 63, 92)

Dim lname As String

lname = InputBox("Enter layout name:", "Validating Layout Name", "Haha\")

Dim leng As Integer

leng = Len(lname)

For i = 0 To leng - 1

Dim letter As String

letter = Left(lname, 1)

lname = Right(lname, leng - (i + 1))

For pos = 0 To UBound(arr)

If Asc(letter) = arr(pos) Then

MsgBox "Found invalid character " & Chr(34) & letter & Chr(34) & " in layout name" & vbCr & _
"Enter another layout name"
Exit Sub

End If

Next

Next

MsgBox "Valid layout name entered"

End Sub

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

Re: Информация из штампа по листам

fixo, Спасибо,
Вообще, я думал в акаде есть встроенная функция проверки имен для листов, блоков и т.п., которую можно было бы использовать. Наверняка есть.

Список недопустимых символов для имени листа:

< > / \ " ; : ? | , = `

Соответственно ASCII коды

60 62 47 92 34 58 59 63 42 124 44 61 96

где ` - 96 это кнопка ё при англ.раскладке.
А ' - 39 апостроф разрешен.
Если я не ошибся.

Re: Информация из штампа по листам

Вильдар пишет:

fixo,  Спасибо,
Вообще, я думал в акаде есть встроенная функция проверки имен для листов, блоков и т.п., которую можно было бы использовать. Наверняка есть.

Список недопустимых символов для имени листа:




Код   


< > / \ " ; : ? | , = `
Соответственно ASCII коды




Код   


60 62 47 92 34 58 59 63 42 124 44 61 96
где ` - 96 это кнопка ё при англ.раскладке.
А ' - 39 апостроф разрешен.
Если я не ошибся.

В AutoLisp, C#, VB.NET есть
а VBA не знаю такого
Честно, нет времени ковырять в доках

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

Re: Информация из штампа по листам

А стандартный вариант проверки ввода?:

Private Sub MyTextList_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If (InStr("< > / \ " ; : ? | , = `", Chr(KeyAscii)) = 0) Then
        KeyAscii = 0
   End If

End Sub