Пакетная печать VBA из листа со многими ВЭ

Автор Тема: Пакетная печать VBA из листа со многими ВЭ  (Прочитано 16536 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Timofeev

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Начал просмотр видео уроков
Печатает он конечно не понял по какой логике порядок.
В имя файла пдф атрибут Лист из блока можно как-то посадить вместо CStr(i) с шагом 1 ?
Объявил Dim varAttributes As Variant и Dim l As Variant
 varAttributes = objBRef.GetAttributes ' ДОБАВИЛ
l = varAttributes(4).TextString ' ДОБАВИЛ
Ругается на имя
Код - Visual Basic [Выбрать]
  1. Sub PlotByBlocks()
  2. 'Tools -> References-> ïîäêëþ÷èòü áèáëèîòåêó AutoCAD 20XX Type Library
  3. On Error Resume Next
  4. Dim acadApp As AcadApplication
  5. Dim acadDoc As AcadDocument
  6. 'Ïîëó÷àåì ññûëêó íà ïðèëîæåíèå àâòîêàäà
  7. Set acadApp = GetObject(, "AutoCad.Application")
  8. Set acadDoc = acadApp.ActiveDocument
  9. If acadDoc.ActiveSpace = 0 Then '0 = acPaperSpace in early binding
  10.    acadDoc.ActiveSpace = 1     '1 = acModelSpace in early binding
  11. End If
  12.     Dim objEnt As AcadObject
  13.     Dim objBRef As AcadBlockReference
  14.     Dim pt1 As Variant
  15.     Dim pt2(0 To 1) As Double
  16.     Dim i As Integer
  17.     Dim varAttributes As Variant ' ÄÎÁÀÂÈË
  18.    Dim l As Variant ' ÄÎÁÀÂÈË
  19. Dim ss As AcadSelectionSet
  20. 'Ïðîâåðèòü ñóùåñòâóåò ëè  íàáîð ñ òàêèì èìåíåì
  21. Set ss = acadDoc.SelectionSets.Item("SS")
  22. 'åñëè íå ñóùåñòâóåò òî ñîçäàåì
  23. If ss Is Nothing Then
  24.     Set ss = acadDoc.SelectionSets.Add("SS")
  25. End If
  26. ss.SelectonScreen
  27. On Error GoTo 0
  28.     i = 0
  29.     For Each objEnt In ss
  30.     'Ó âàñ áûëî  íå ïðàâèëüíîå èìÿ
  31.    If objEnt.ObjectName = "AcDbBlockReference" Then
  32.     Set objBRef = objEnt
  33.         If objBRef.EffectiveName = "À1àøá" Then
  34.         pt1 = objBRef.InsertionPoint
  35.         varAttributes = objBRef.GetAttributes ' ÄÎÁÀÂÈË
  36.        l = varAttributes(4).TextString ' ÄÎÁÀÂÈË
  37.        'pt1 = ThisDrawing.Utility.TranslateCoordinates(pt1, acWorld, acDisplayDCS, False)
  38.        ReDim Preserve pt1(0 To 1)
  39.         pt2(0) = pt1(0) + 84100
  40.         pt2(1) = pt1(1) + 59400
  41.         i = i + 1
  42.         'òàê êàê êîä çàïóñêàåòñÿ èç Åêñåëÿ, ìû íå ìîæåì ññûëàòüñÿ íà  ThisDrawling, íóæíî â ïðîöåäóðó PolyPlot ïåðåäàòü ññûëêó íà äîêóìåíò àâòîêàäà
  43.        'ActiveWorkbook.Path -- ïóòü âàøåãî åêñåëÿ
  44.        PolyPlot acadDoc, ActiveWorkbook.Path + "\" + CStr(l), pt1, pt2 ' æåëàòåëüíî ïî ïóòè ôàéëà Excel ñîõðàíèòü â ïàïêó èç ÿ÷åéêè B1
  45.        End If
  46.     End If
  47.     Next
  48. End Sub
  49. Sub PolyPlot(ByRef acadDoc, strFileName As String, pt1 As Variant, pt2 As Variant)
  50.     Dim Layout As AcadLayout
  51.     'çàìåíà ThisDrawling íà ññûëêó ÷åðòåæà â àâòîêàä
  52.    Set Layout = acadDoc.ActiveLayout
  53.     Layout.RefreshPlotDeviceInfo
  54.     Layout.ConfigName = "DWG To PDF.pc3"
  55.     acadDoc.SetVariable "BACKGROUNDPLOT", 0
  56.    
  57.         'â âèäåî Ìàêñèì Ìàðêåâè÷ àêöåíòèðîâàë ÷òî èìÿ ôîðìàòà äîëæíî áûòü íà àíãëèéñêîì ñ çàìåíîé ïðîáåëîâ íà íèæíåå ïîä÷åðêèâàíèå
  58.    Layout.CanonicalMediaName = "ISO_full_bleed_A1_(841.00_x_594.00_MM)"
  59.     Layout.CenterPlot = True
  60.     Layout.PlotRotation = ac0degrees
  61.     Layout.StandardScale = acScaleToFit
  62.     Layout.StyleSheet = "acad.ctb"
  63.     Layout.SetWindowToPlot pt1, pt2
  64.     Layout.PlotType = acWindow
  65.    
  66.     'çàìåíà ThisDrawling íà ññûëêó ÷åðòåæà â àâòîêàä
  67.    acadDoc.Regen acAllViewports
  68.     acadDoc.Plot.PlotToFile strFileName
  69. End Sub
  70.  
Атрибут забрал но он почему-то отображается как \W0.9000;1 - а должно быть просто значение 1

Оффлайн Nutson

  • ADN OPEN
  • Сообщений: 43
  • Карма: 6

Ну они у вас в блоке так и записаны, это скорее всего какая то управляющая последовательность, типа "выравнивание по середине", надо гуглить



Оффлайн Timofeev

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Это принудительно назначенная ширина для многострочного текста. Снимай форматирование исходного объекта. - так пишут в гугле сейчас поробую.
А можно как-то отсечь из названия 9 символов и начать с десятого ? - так получается недопустимое имя

Оффлайн Nutson

  • ADN OPEN
  • Сообщений: 43
  • Карма: 6
Поищите функции VBA для работы с текстовыми значениями.
И через комбинацию функций Len() b Rigth() можно будет отсечь лишнее

Оффлайн Timofeev

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Файл был странный какой-то переделал блок исчезла эта мешающая запись из атрибута
В этом коде думаю нужно еще один блок все таки вводить для блока с книжным расположением для имени блока "А1кшб" при помощи ElseIf, но как во второй части кода тогда выбрать ориентацию тогда
Если это получится то модулей писать придется в 2 раза меньше

Еще вопрос возник. Как добавить еще имя блока сюда If objBRef.EffectiveName = "А1ашб" Then (или "А1а" или "А1ашм")

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Timofeev,
Перед копированием VBA-кода переключай раскладку клавиатуру на русскую. Тогда вместо абракадабры будет нормальный текст.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Timofeev

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Александр, принял

Оффлайн Timofeev

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Ничего не делал особо выгрузилось пару раз - потом перестало
Опять я что-то сломал - ошибка на строке
For Each objEnt In ss
ошибка Run-time error '-214748113 (8000ffff)' :
Automation error
Разрушительный сбой

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Timofeev,
Возможно ss пустой, т.е. ничего не выбрано.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Nutson

  • ADN OPEN
  • Сообщений: 43
  • Карма: 6
Тут не екселька нужна а чертеж и еще бы принтскрин окна Locals на момент ошибки


И еще надо бы добавить очистку существующего селекшн сета
Код - Visual Basic [Выбрать]
  1. 'Проверить существует ли  набор с таким именем
  2. Set ss = acadDoc.SelectionSets.Item("SS")
  3. 'если не существует то создаем
  4. If ss Is Nothing Then
  5.     Set ss = acadDoc.SelectionSets.Add("SS")
  6. Else
  7.     ss.Clear ' если используем сущ. SS то очистить его
  8. End If


а блок у Вас действительно странный, если зайти в редактор блока то там нет аттрибутов.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
а блок у Вас действительно странный, если зайти в редактор блока то там нет аттрибутов.
Блок действительно не вполне законный с точки зрения AutoCAD - в определении блока нет определений атрибутов, а во вставке блока есть атрибуты.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Timofeev

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Добавил переменную для взятия имени с листа Эксель
Код - Visual Basic [Выбрать]
  1. Dim n As Integer ' ДОБАВИЛ 2
  2. With Sheets("!")
  3. .Activate
  4. n = .Range("B" & 1).Value ' ДОБАВИЛ 2
  5. End With

Оффлайн Timofeev

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Как бы обратится по имени атрибута "ЛИСТ", а не по номеру он может быть на разных местах в блоках
varAttributes = objBRef.GetAttributes
l = varAttributes(4).TextString

Оффлайн Nutson

  • ADN OPEN
  • Сообщений: 43
  • Карма: 6
Пробежаться циклом по коллекции атрибутов сравнивая TagString, опять же Максим это показывает в роликах :)

Оффлайн Timofeev

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
За 1 день все это успеть понять и отсмотреть сложно достаточно, но буду стараться и писать тоже буду много затык  почти в каждой строчке кода по мере его насыщения
С циклом нашел пробег по атрибутам вроде:
Код - Visual Basic [Выбрать]
  1. For j = LBound(varAttributes) To UBound(varAttributes)
  2. If varAttributes(j).TagString = "ЛИСТ" Then
  3. l = = varAttributes(j).TextString
  4. End If
Правильно я понял?
« Последнее редактирование: 14-01-2021, 15:57:29 от Александр Ривилис »