Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA AUTOCAD помогите новичку понять алгоритмы взаимодействия VBA и Autocad

VBA AUTOCAD помогите новичку понять алгоритмы взаимодействия VBA и Autocad

Ответ
Поиск в этой теме
Непрочитано 05.10.2016, 08:34 #1
VBA AUTOCAD помогите новичку понять алгоритмы взаимодействия VBA и Autocad
zenija2007
 
Регистрация: 18.09.2015
Сообщений: 120

При самостоятельном изучении vba для autocad столкнулся со следующими проблемами:
1) вся литература по программированию в vba for office, особенности программирования в autocad не раскрыты. Даже у Полищука в основном раскрыт Lisp.
2) приходится работать не с созданными с нуля документами, а с уже готовыми, для создания которых в том числе применялось какое-то стороннее ПО. Эти документы уже имеют в себе кучу настроек, которые влияют на работу vba программ, но каких-то алгоритмов по сбросу настроек документа в нуль не нашел. Рассуждаю по аналогии с версткой в CSS, когда перед созданием собственного стиля все поля вокруг элементов сбрасываются и работа во всех браузерах более-менее одинакова.

Далее - алгоритм, на основе которого изучаю vba для autocad - печать из пространства модели. Отдельные вопросы задавать бесполезно без полного понимания алгоритма, а просмотр кода уже готовых программ помогает, но мало. Описания отдельных команд в справке очень краткие и не дают представления о возможных проблемах.
Алгоритм:
1) обновить информацию о принтерах: ThisDrawing.ModelSpace.Layout.RefreshPlotDeviceInfo
2) загрузить информацию о принтерах: ThisDrawing.ModelSpace.Layout.GetPlotDeviceNames()
3) применить один из доступных принтеров: ThisDrawing.ModelSpace.Layout.ConfigName = [один из элементов полученного выше массива]
4) загрузить настройки форматов и стилей для выбранного принтера: ThisDrawing.ModelSpace.Layout.GetCanonicalMediaNames(): ThisDrawing.ModelSpace.Layout.GetPlotStyleTableNames()
5) применить эти и прочие настройки печати:
- формат листов: ThisDrawing.ModelSpace.Layout.CanonicalMediaName = [один из элементов массива]
- стиль печати: ThisDrawing.ModelSpace.Layout.StyleSheet = [один из элементов массива]
- центрирование: ThisDrawing.ModelSpace.Layout.CenterPlot = True
- вписать: ThisDrawing.ModelSpace.Layout.StandardScale = acScaleToFit
- вес линий: ThisDrawing.ModelSpace.Layout.PlotWithLineweights = True
- число копий: ThisDrawing.Plot.NumberOfCopies = [число]
6) применить тип выделения области чертежа на печать - рамкой: ThisDrawing.ModelSpace.Layout.PlotType = acWindow
7) создать переменные для хранения координат: dim t as variant: ....ThisDrawing.Utility.InitializeUserInput 128: ....GetPoint...GetCorner...redim preserve t (0 to 1) - взяли координаты с чертежа мышкой и обрезали ось z.
8) применить координаты рамки: ThisDrawing.ModelSpace.Layout.SetWindowToPlot t1, t2
9) выводим предпросмотр для контроля результата: ThisDrawing.Plot.DisplayPlotPreview acFullPreview
Передаваемые значения легко контролируются через msgbox, тут ошибки исключены. Примеры в справке помогают избежать проблем с неверно указанным типом переменной.
Но чего-то не хватает в этом алгоритме: в зависимости от настроек печати, которые уже хранятся в чертеже, может выводиться нормальный предпросмотр по выделению, выдать ошибку в пункте 6), вывести пустой лист.
Сам разобраться в этом не могу, прошу помочь разобраться. Не обязательно все разжёвывать, достаточно указать, откуда черпать информацию, в справке автокада информации крайне мало. На других форумах ответа не нашел.
Код чуть ниже.

Последний раз редактировалось zenija2007, 05.10.2016 в 10:26.
Просмотров: 11374
 
Непрочитано 05.10.2016, 08:57
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от zenija2007 Посмотреть сообщение
VBA AUTOCAD помогите новичку понять алгоритмы взаимодействия VBA и Autocad
VBA взаимодействует с AutoCAD по средством объектной модели компонентов (COM)

Схема самой объектной модели есть в справке к автокаду, вот ее фрагмент:


В той же справке очень подробно и с примерами расписаны свойства и методы каждого объекта модели и их взаимодействие между собой.
В книгах и статьях слабо отражен аспект написание программ на VBA под Autocad именно по причине наличия очень, ОЧЕНЬ, подробной справки.
(подробной, до определенной границы)

Так же, на скудность книг, влияет тот факт, что IDE VBA, имеет достаточно продвинутый отладчик и потому в режиме пошаговой отладки, можно и без справки разобраться что , да как.


По поводу Вашего алгоритма. Мой совет, начните писать код, пробуйте, и предметно, с кусками кода спрашивайте.
Вот прямо по списку и начните:
Обновите информацию о принтерах
загрузите список принтеров в переменную
Укажите текущим принтер из списка в переменной...

ну и далее..
Boxa вне форума  
 
Автор темы   Непрочитано 05.10.2016, 09:33
#3
zenija2007


 
Регистрация: 18.09.2015
Сообщений: 120


да, по ней и изучал, очень удобно. код есть

Код:
[Выделить все]
Dim actlay As AcadLayout
Dim form_canon As Variant
Private Sub ButtonCancel_Click() 'завершить приложение
    End
End Sub
Public Sub FillCombo(combik As ComboBox, spis As Variant) 'подготовка выпадающего списка
    Dim i As Integer
    For i = LBound(spis) To UBound(spis)
        combik.AddItem (spis(i))
    Next
    combik.Value = spis(0)
End Sub
Private Sub ButtonOK_Click() 'пока нет обработки кнопки ОК. Наверное удалю.

End Sub
Private Sub ButtonSelect_Click() 'обработка нажатия на кнопку Рамки. Выбор и печать листа. Все ошибки наверное здесь.
    Me.Hide
    Dim pr As AcadPlot
    Set pr = ThisDrawing.Plot
    pr.NumberOfCopies = Me.ComboNum.Value  'назначили кол-во страниц
    actlay.CanonicalMediaName = form_canon(Me.ComboForm.ListIndex)
    actlay.StyleSheet = Me.ComboStil.Value
    actlay.CenterPlot = True            'вроде как центрирует изображение
    actlay.PlotWithLineweights = True   'включаем веса линий при печати
    actlay.StandardScale = acScaleToFit  'масштаб - вписать (предположительно)
    Dim inp As AcadUtility
    Set inp = ThisDrawing.Utility
    inp.InitializeUserInput 128, "выХод"
    Dim t1 As Variant  'точки
    Dim t2 As Variant
    t1 = inp.GetPoint(, "введите первый угол прямоугольника или выХод: ")
    t2 = inp.GetCorner(t1, "введите второй угол прямоугольника или выХод: ")
    ReDim Preserve t1(0 To 1)
    ReDim Preserve t2(0 To 1)
    actlay.PlotType = acWindow            'выделение рамкой.
    actlay.SetWindowToPlot t1, t2
    pr.DisplayPlotPreview acFullPreview
    Me.show
End Sub
Private Sub ComboPrint_Change() 'при выборе принтера применяем его и обновляем остальные поля
    actlay.ConfigName = Me.ComboPrint.Value  'назначили принтер
    Me.ComboForm.Clear
    Me.ComboStil.Clear
    form_canon = actlay.GetCanonicalMediaNames() 'получили имена форматов массивом
    Dim form_local As Variant
    ReDim form_local(LBound(form_canon) To UBound(form_canon))
    For i = LBound(form_canon) To UBound(form_canon)
            form_local(i) = actlay.GetLocaleMediaName(form_canon(i)) 'преобразовали форматы в локальный вариант (русский, наверное)
    Next
    Call FillCombo(Me.ComboForm, form_local)
    Dim stil_spis As Variant
    stil_spis = actlay.GetPlotStyleTableNames() 'получили имена стилей печати
    Call FillCombo(Me.ComboStil, stil_spis)
End Sub
Private Sub UserForm_Initialize() 'тело программы
    Dim i As Integer 'для циклов
    Set actlay = ThisDrawing.ModelSpace.Layout  'создали объект со ссылкой на лист модели
    actlay.RefreshPlotDeviceInfo  'обновление списка устройств вывода
    Dim pr_spis As Variant
    pr_spis = actlay.GetPlotDeviceNames() 'получили имена принтеров в виде массива
    Call FillCombo(Me.ComboPrint, pr_spis)
    For i = 1 To 20                             'заливаем в combonum число копий
        Me.ComboNum.AddItem (i)
    Next
    Me.ComboNum.Value = 1
End Sub


Вроде и работает, но не во всех чертежах, как писал выше. Просто не знаю, что тут можно еще добавить для стабильности. Ну автоповорот листов - это уже потом, после отладки.
Вложения
Тип файла: dvb Project.dvb (25.0 Кб, 71 просмотров)

Последний раз редактировалось zenija2007, 05.10.2016 в 10:13.
zenija2007 вне форума  
 
Непрочитано 08.10.2016, 15:59
#4
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от zenija2007 Посмотреть сообщение
Вроде и работает, но не во всех чертежах, как писал выше. Просто не знаю, что тут можно еще добавить для стабильности.
В свое время начинал тоже на VBA писать в Акаде 2012. Пока была 32 битная версия - все работало прекрасно, потом дали взамен комп помощнее - и там уже 64 битная версия акада и VBA. Получил массу "удовольствия" от непредсказуемой работы/не работы VBA макросов. И когда среда VBA стала сообщать, что она не знает функций типа MID - плюнул и зарекся иметь дело с VBA в акаде)
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.10.2016, 14:37
#5
zenija2007


 
Регистрация: 18.09.2015
Сообщений: 120


Проблема как бы решена. Меняем местами строки actlay.PlotType = acWindow и actlay.SetWindowToPlot t1, t2, помня что t1 - нижний левый угол, а t2 - верхний правый, и все должно заработать.
Остальные проблемы решены в теме http://forum.dwg.ru/showthread.php?t=122509, очень помогло разобраться.

Последний раз редактировалось zenija2007, 09.10.2016 в 15:30.
zenija2007 вне форума  
 
Непрочитано 09.10.2016, 14:54
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Координаты следует передавать не в МСК (WCS) и не в ПСК (UCS), а в ДСК (DCS).
Код:
[Выделить все]
Utility.TranslateCoordinates(p1, acWorld, acDisplayDCS, False)
http://adndevblog.typepad.com/autoca...using-vba.html
Александр Ривилис вне форума  
 
Непрочитано 09.10.2016, 15:12
1 | #7
ssn

Инженер проектировщик (раздел ТМ - фриланс)
 
Регистрация: 06.12.2003
Геленджик
Сообщений: 1,794
Отправить сообщение для ssn с помощью Skype™


Цитата:
Сообщение от zenija2007 Посмотреть сообщение
Возможно, надо проделать некие операции с вьюпортом? Кто разбирается в этом - есть идеи?
когда то я тоже сражался с печатью.
мне помогла функция

leaut.RefreshPlotDeviceInfo

после изменений некоторых параметров печати для лейаута надо обновлять информацию. иначе она не применялась.
ssn вне форума  
 
Непрочитано 09.10.2016, 16:06
#8
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


А чем вам готовые решения не угодили то - бесплатные и платные?
Сергей812 вне форума  
 
Непрочитано 09.10.2016, 17:45
1 | #9
ssn

Инженер проектировщик (раздел ТМ - фриланс)
 
Регистрация: 06.12.2003
Геленджик
Сообщений: 1,794
Отправить сообщение для ssn с помощью Skype™


своё ближе и понятнее.
сам сделал, сам используешь, сам знаешь тонкости.
я например, только свой макрос и юзаю по печати. и очень доволен.
ssn вне форума  
 
Автор темы   Непрочитано 12.10.2016, 12:00
#10
zenija2007


 
Регистрация: 18.09.2015
Сообщений: 120


Цитата:
Сообщение от ssn Посмотреть сообщение
я например, только свой макрос и юзаю по печати
Раз вы вникли в тонкости печати, можете подсказать одну вещь? Скрипт работает, но вот после отправки листа на печать функцией plottodevice его обработка занимает довольно много времени. Скрипт почти тот же, что и выше. При печати штатными средствами это лишь небольшая задержка. Возможно, стоит печатать через видовой экран?
zenija2007 вне форума  
 
Непрочитано 12.10.2016, 12:14
#11
ssn

Инженер проектировщик (раздел ТМ - фриланс)
 
Регистрация: 06.12.2003
Геленджик
Сообщений: 1,794
Отправить сообщение для ssn с помощью Skype™


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

Код:
[Выделить все]
  For Each PlotConfiguration In PlotConfigurations
            If PlotConfiguration.Name = (format) Then
            Acdoc.Plot.QuietErrorMode = False
            leaut.RefreshPlotDeviceInfo
            leaut.ConfigName = PlotConfiguration.ConfigName
            leaut.RefreshPlotDeviceInfo
            leaut.CanonicalMediaName = PlotConfiguration.CanonicalMediaName
            leaut.PaperUnits = PlotConfiguration.PaperUnits
            leaut.PlotHidden = PlotConfiguration.PlotHidden
            leaut.PlotOrigin = PlotConfiguration.PlotOrigin
            leaut.PlotRotation = PlotConfiguration.PlotRotation
            leaut.PlotViewportBorders = PlotConfiguration.PlotViewportBorders
            leaut.PlotViewportsFirst = PlotConfiguration.PlotViewportsFirst
            leaut.PlotWithLineweights = PlotConfiguration.PlotWithLineweights
            leaut.PlotWithPlotStyles = PlotConfiguration.PlotWithPlotStyles
            leaut.ScaleLineweights = PlotConfiguration.ScaleLineweights
            leaut.StyleSheet = PlotConfiguration.StyleSheet
            End If
            Next
    Dim oPlot As AcadPlot
    Dim AddedLayouts() As String
    Dim LayoutList As Variant
    Dim oLayout As AcadLayout
    Dim ArraySize As Integer, BatchCount As Integer
    
    ArraySize = 1
    ReDim Preserve AddedLayouts(1 To ArraySize)
    AddedLayouts(ArraySize) = leaut.Name
    LayoutList = AddedLayouts
    Set oPlot = Acdoc.Plot
    oPlot.SetLayoutsToPlot LayoutList
    oPlot.PlotToDevice
хотите - скину код целиком. только я тот ещё писатель кодов ))) это была первая и последняя программа. хотя, она работает и меня вполне устраивает. есть момент, который стоило бы допилить (даже пара моментов) что бы выложить эту программу так же в ветке про печать. но, за распространение программы не переживаю, кому нравится - тот юзает.
ssn вне форума  
 
Автор темы   Непрочитано 13.10.2016, 10:37
#12
zenija2007


 
Регистрация: 18.09.2015
Сообщений: 120


Цитата:
Сообщение от ssn Посмотреть сообщение
хотите - скину код целиком
буду очень признателен. хочу потестить на скорость подготовки фрагмента к печати, если все быстро, переделаю у себя.
zenija2007 вне форума  
 
Непрочитано 13.10.2016, 10:54
1 | #13
ssn

Инженер проектировщик (раздел ТМ - фриланс)
 
Регистрация: 06.12.2003
Геленджик
Сообщений: 1,794
Отправить сообщение для ssn с помощью Skype™


на самом деле это набор программ, которые так или иначе использую в оформлении. Есть мои, есть много сторонних. не стал выделать именно код про печать отдельно, думаю найдёте.
сделан установщик, но по сути он просто разархивирует файл куда то на диске и добавляет потом путь поддержки к папке (причем по моему только путь, который по умолчанию), а потом подгружает файл меню. Т.е. можно разархивировать куда угодно, добавить в пути поддержки и загрузить файл меню. винда 64 (в 32 часть функций не будет работать, надо править)

там есть нюанс по настройке печати (про который я писал, что надо бы переделать, но руки не доходят), надеюсь разберётесь как добавлять форматы программой ))
Вложения
Тип файла: rar оформление v 4.10.3.rar (2.00 Мб, 99 просмотров)
ssn вне форума  
 
Автор темы   Непрочитано 16.10.2016, 05:25
#14
zenija2007


 
Регистрация: 18.09.2015
Сообщений: 120


Цитата:
Сообщение от ssn Посмотреть сообщение
это набор программ
как выбирать листы, особо не разбирался - просто нет времени, рабочий день на вахте 10-ичасовой. Посмотрел, как Вы настраиваете параметры печати - в принципе же все как у всех, но вот только именно в моей программе подготовка к отправке на принтер в фоне после выполнения команды plottodevice занимает ну очень много времени. перерыл интернет - о такой проблеме даже нигде не упоминается. Вы сталкивались с подобным при написании своей программы? При просмотре кода каких-то особых решений не увидел. Возможно, где-то уже обсуждалось, какие операции выполняет автокад так долго в фоне и как ускорить этот процесс?
zenija2007 вне форума  
 
Непрочитано 16.10.2016, 10:47
#15
ssn

Инженер проектировщик (раздел ТМ - фриланс)
 
Регистрация: 06.12.2003
Геленджик
Сообщений: 1,794
Отправить сообщение для ssn с помощью Skype™


я с такой проблемой не сталкивался.
а мой код выполняется тоже долго?
возможно... разница в том, что я даю переменным значения, которые ранее задаются в самом автокаде. т.е. нельзя ошибиться с синтаксисом.
а вы, как я понял, назначаете текстом. может по этому?
ssn вне форума  
 
Непрочитано 16.10.2016, 15:44
#16
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


zenija2007,
Версия и разрядность AutoCAD?
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 21.10.2016, 05:26
#17
zenija2007


 
Регистрация: 18.09.2015
Сообщений: 120


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Версия и разрядность AutoCAD?
работа не зависит от разрядности, проверял на обеих версиях. autocad 2014.

----- добавлено через ~52 мин. -----
Цитата:
Сообщение от ssn Посмотреть сообщение
т.е. нельзя ошибиться с синтаксисом
если верить справке, то ошибок в синтаксисе нет, я обновляю данные о принтерах, устанавливаю нужный принтер, потом для него выбираю стиль печати и формат листа из поддерживаемых, скорее, проблема в том, что какой-то параметр печати не установил, поэтому он так долго думает, но я не смогу найти, что это за такой параметр, потому что нельзя посмотреть, чем занят автокад во время подготовки листа к печати в фоне. много людей до меня писали подобные программы, наверняка все они в начале сталкивались с долгой подготовкой к печати, но почему-то никто из них не отписался на форуме об этом. решение наверное очень простое, но вот я его никак не вижу, во всяком случае пытался назначать или убирать различные параметры печати, но они никак не влияют на ситуацию. разобрал программу !Plot_U, и опять не нашел никаких отличий от своей, кроме ненужных мне наворотов и огромного количества повторов одних и тех же блоков кода в разных подпрограммах, что только затрудняет его чтение. одна из причин, почему не хочу взять за основу готовую программу - тяжело читаемый код. единственное, вот эти строки - они для чего вообще нужны, если печать идет из пространства модели, а не видового экрана?
Код:
[Выделить все]
Dim viewportObj As AcadViewport
Set viewportObj = ThisDrawing.ActiveViewport
Dim currTarget As Variant
currTarget = viewportObj.Target
If viewportObj.Target(0) <> 0# Or viewportObj.Target(1) <> 0# Or viewportObj.Target(2) <> 0# Then
Dim newTarget(0 To 2) As Double
newTarget(0) = 0#: newTarget(1) = 0#: newTarget(2) = 0
viewportObj.Target = newTarget
ThisDrawing.ActiveViewport = viewportObj
ThisDrawing.Regen acAllViewports
ZoomAll
А печать идет через команду
oPlot.PlotToDevice IIf(usePrinter = 1, Plot_U.CB_PRINTNAME.Value, Plot_U.CB_PRINTNAME2.Value)
выбор области печати - через SetWindowToPlot.

Последний раз редактировалось zenija2007, 21.10.2016 в 06:24.
zenija2007 вне форума  
 
Непрочитано 21.10.2016, 10:31
#18
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


в свое время на Net API писал подобное - то быстро все печатало, то по минуте и более на лист. Закономерности не выявил, хотя сильно и не искал.
Сергей812 вне форума  
 
Непрочитано 21.10.2016, 10:51
#19
ssn

Инженер проектировщик (раздел ТМ - фриланс)
 
Регистрация: 06.12.2003
Геленджик
Сообщений: 1,794
Отправить сообщение для ssn с помощью Skype™


мой код тоже вроде как печатает быстро. бывает, медленно ищет рамки, если много на листе объектов, это да.
но, я и не сталкивался с проблемой долгой печати. у меня была проблема назначения параметров переменным для печати. пока мне не подсказали, что после назначения некоторым свойствам нового значения надо обновить информацию специальной командой (leaut.RefreshPlotDeviceInfo). и после это все заработало.
ssn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA AUTOCAD помогите новичку понять алгоритмы взаимодействия VBA и Autocad

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Восстановление *.DWG Солидворкер AutoCAD 5249 01.02.2024 09:41
Помогите разобраться с подсчетом количества болтов в AutoCAD Plant 3d April Вертикальные решения на базе AutoCAD 1 01.12.2015 08:29
Пропали инструменты и панели, помогите, AutoCAD 2008 LBA AutoCAD 1 19.11.2012 11:13
AutoCad 2010 + СПДС GraphiCS 7.1.1064 Зависает всё, помогите... Львиное сердце ПО от CSoft 2 03.07.2012 16:19
Проблема с XREF в Autocad 2005(2004). Помогите, кто знает. 0leg AutoCAD 10 13.01.2006 17:53