Как работает данный макрос?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

Как работает данный макрос?

Ответ
Поиск в этой теме
Непрочитано 28.02.2013, 00:06 #1
Как работает данный макрос?
stimsa
 
Регистрация: 27.02.2013
Сообщений: 8

Имеется макрос написанный на VBA в Autocad 2008.Не могу разобраться как он работает.Помогите доступными и понятными коментами,кто может.Заранее благодарна.

Пример процедур, с помощью которых можно изменить пути к файлам внешних ссылок и перезагрузить их.

Код:
[Выделить все]
Option Explicit

Private Sub ChangeXrefPath(strRefPath As String)
  Dim objSelSet As AcadSelectionSet
  Dim intType(0) As Integer
  Dim varData(0) As Variant
  Dim objBlkRef As Object
  Dim objXref As AcadExternalReference

  intType(0) = 0
  varData(0) = "INSERT"
  Set objSelSet = vbdPowerSet("repathxrefs")
  objSelSet.Select acSelectionSetAll, _
  filtertype:=intType, filterdata:=varData
  For Each objBlkRef In objSelSet
    If TypeOf objBlkRef Is AcadExternalReference Then
      Set objXref = objBlkRef
      objXref.Path = strRefPath & objXref.Name & ".dwg"
    End If
  Next
  ReloadXRefs
  objSelSet.Delete
End Sub

Private Sub ReloadXRefs()
  Dim objBlk As AcadBlock
  Dim objBlks As AcadBlocks
  Set objBlks = ThisDrawing.Blocks
  For Each objBlk In objBlks
    If objBlk.IsXRef Then
      objBlk.Reload
    End If
  Next objBlk
  ThisDrawing.Regen acAllViewports
End Sub

Public Function vbdPowerSet(strName As String) As AcadSelectionSet
  Dim objSelSet As AcadSelectionSet
  Dim objSelCol As AcadSelectionSets
  
  Set objSelCol = ThisDrawing.SelectionSets
    For Each objSelSet In objSelCol
      If objSelSet.Name = strName Then
        objSelSet.Delete
        Exit For
      End If
    '//If you get the error "Automation Error"
    'At the "Next" line, it's because one the blocks
    'You just and changed, contained another Xref, and thats
    'The block you are now trying to change! The solution for
    'This problem can be found in the Project X code for our
    'Object Model extension AcadExternalReferences
    Next
  Set objSelSet = ThisDrawing.SelectionSets.Add(strName)
  Set vbdPowerSet = objSelSet
End Function
Просмотров: 4623
 
Непрочитано 28.02.2013, 08:21
#2
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Код разбит на три логических блока:

1. Событие ChangeXrefPath принимает в качестве параметра строку и заменяет этой строкой путь во всех указанных (см. ниже функцию vbdPowerSet) файлах внешних ссылок, оставляя от старого пути только имя самого подключенного файла.
2. Событие ReloadXRefs выполняет перезагрузку всех подключенных внешних ссылок, с последующей регенерацией чертежа.
3. Функция vbdPowerSet фильтрует содержимое выбранного набора, оставляя только элементы того типа, имя которого указано в качестве параметра этой функции. Данная функция вызывается в событии ChangeXrefPath.

Комментарии, имеющиеся в коде, на русский сама сможешь перевести, если захочешь.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 28.02.2013 в 08:27.
hwd вне форума  
 
Непрочитано 28.02.2013, 08:59
#3
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Очередное изобретение велосипеда, ведь есть AdRefMan.exe
trir вне форума  
 
Непрочитано 28.02.2013, 09:18
#4
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от trir Посмотреть сообщение
Очередное изобретение велосипеда
Полностью согласен. Велосипедостроение обусловлено незнанием "родного" функционала по работе с сылками, доступного в AutoCAD по умолчанию.
2 stimsa
Если надоест чесать ухо ногой, рекомендую ознакомиться хотя бы с этим и этим. Во всяком случае тот велосипед, который решается в выше указанном коде, совершенно не нужен и на видео, помимо прочего, показано как сие решить "родными" средствами автокада. Мои пользователи вроде смогли разобраться (из тех, кто смотрел). Так что, было бы желание...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 28.02.2013, 12:01
#5
stimsa


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


Проблема просто в следующем:у меня имеется 10 000 внешних ссылок и один главный чертеж.Необходимо изменить путь этих внешних ссылок.Для этого мне необходимо было понять как работает данный макрос,чтобы переделать под свою задачу.
Как вы понимаете средствами автокада менять путь к 10 000 внешних ссылок-затруднительно.


P.S. Спасибо за подробный разъяснения.
stimsa вне форума  
 
Непрочитано 28.02.2013, 12:04
#6
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Цитата:
Сообщение от stimsa Посмотреть сообщение
имеется 10 000 внешних ссылок
- Что там такое ???
trir вне форума  
 
Непрочитано 28.02.2013, 12:06
#7
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от stimsa Посмотреть сообщение
у меня имеется 10 000
Ну это вряд ли, что 10 000.
Цитата:
Сообщение от stimsa Посмотреть сообщение
Как вы понимаете средствами автокада менять путь к 10 000 внешних ссылок-затруднительно.
Нет не понимаю. Я точно знаю, что воспользовавшись ProjectName вы за секунду переназначите нужный путь сразу всем 10 000-м ссылкам. Но дело ваше - можете и с VBA колдовать.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 28.02.2013, 12:45
#8
stimsa


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


Цитата:
Сообщение от hwd Посмотреть сообщение
Ну это вряд ли, что 10 000.

Нет не понимаю. Я точно знаю, что воспользовавшись ProjectName вы за секунду переназначите нужный путь сразу всем 10 000-м ссылкам. Но дело ваше - можете и с VBA колдовать.
А где там ProjectName?
stimsa вне форума  
 
Непрочитано 28.02.2013, 12:59
1 | #9
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от stimsa Посмотреть сообщение
А где там ProjectName?
Я ссылки кому выше давал? Если лень смотреть, то в AutoCAD жмите F1 и набирайте в строке поиска "ProjectName".
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 28.02.2013, 13:05
#10
stimsa


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


Простите.Криворукая я немного.

Извините за наглость.Не подскажите,где в вышеизложенном макросе,мне сделать следующее.У меня есть путь внешней ссылки C:\autocad\"Панель.dwg" а его надо заменить на "D:\Проекты\"Панель.dwg" и таких ссылок много.
stimsa вне форума  
 
Непрочитано 28.02.2013, 13:17
#11
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Из каких соображений не желаете ProjectName воспользоваться?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 28.02.2013, 13:47
#12
stimsa


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


Да я то может и с радостью воспользовалась,но преподаватель суровый человек.Так подскажите как?
stimsa вне форума  
 
Непрочитано 28.02.2013, 14:17
#13
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Пожалуй я воздержусь от дальнейших комментариев, а то достанется и преподавателю, который через одно место решает типовые задачи, и талантливому ученику.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 28.02.2013, 14:19
#14
stimsa


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


Спасибо за участие.Буду дальше морочить себе голову
stimsa вне форума  
 
Непрочитано 28.02.2013, 14:42
#15
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


ChangeXrefPath("D:\Проекты\Панель.dwg")

Set objSelSet = vbdPowerSet("C:\autocad\Панель.dwg")
trir вне форума  
 
Автор темы   Непрочитано 28.02.2013, 15:03
#16
stimsa


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


Спасибо огроменное!!!!

Только ошибку выдает на вот этом месте
Private Sub ChangeXrefPath("D:\Проекты\Панель.dwg")

Compile error:
Expected:identifier

Ой спасибо,сама уже разобралась.

Последний раз редактировалось stimsa, 28.02.2013 в 15:26.
stimsa вне форума  
 
Непрочитано 28.02.2013, 15:22
#17
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Учить VBA!!!
trir вне форума  
 
Автор темы   Непрочитано 28.02.2013, 15:40
#18
stimsa


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


Вроде как правильно все делаю,но пути не меняются почему-то
Код:
[Выделить все]
Option Explicit

Private Sub ChangeXrefPath(strRefPath As String)
  Dim objSelSet As AcadSelectionSet
  Dim intType(0) As Integer
  Dim varData(0) As Variant
  Dim objBlkRef As Object
  Dim objXref As AcadExternalReference

  intType(0) = 0
  varData(0) = "INSERT"
  Set objSelSet = vbdPowerSet("D:\Архив\51226900F0-1401 ТН ячейка\51226921F0-07 Блок трансформаторов напряжения\51226921F0-06 Привод трансформаторов напряжения\51226921F0-05 Корпус")
  objSelSet.Select acSelectionSetAll, _
  filtertype:=intType, filterdata:=varData
  For Each objBlkRef In objSelSet
    If TypeOf objBlkRef Is AcadExternalReference Then
      Set objXref = objBlkRef
      objXref.Path = strRefPath & objXref.Name & ".dwg"
    End If
  Next
  ReloadXRefs
  objSelSet.Delete
End Sub

Private Sub ReloadXRefs()
  Dim objBlk As AcadBlock
  Dim objBlks As AcadBlocks
  Set objBlks = ThisDrawing.Blocks
  For Each objBlk In objBlks
    If objBlk.IsXRef Then
      objBlk.Reload
    End If
  Next objBlk
  ThisDrawing.Regen acAllViewports
End Sub

Public Function vbdPowerSet(strName As String) As AcadSelectionSet
  Dim objSelSet As AcadSelectionSet
  Dim objSelCol As AcadSelectionSets
  
  Set objSelCol = ThisDrawing.SelectionSets
    For Each objSelSet In objSelCol
      If objSelSet.Name = strName Then
        objSelSet.Delete
        Exit For
      End If
    Next
  Set objSelSet = ThisDrawing.SelectionSets.Add(strName)
  Set vbdPowerSet = objSelSet
End Function

Sub a()

ChangeXrefPath ("D:\autocad")

End Sub

Последний раз редактировалось stimsa, 28.02.2013 в 20:59. Причина: не работает код
stimsa вне форума  
 
Непрочитано 01.03.2013, 19:02
#19
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Для начала проверь правильность работы функции vbdPowerSet
trir вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как работает данный макрос?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает макрос "поворот группы объектов" A-l-l-A Программирование 19 22.02.2012 21:14
Плохо работает OTRACK(ОТС-ОБЪЕКТ) в 3D начиная с 2008 Акада. Astartes AutoCAD 3 18.01.2012 11:55
не работает макрос перевода спецификации Excel в кад valeal Программирование 5 21.11.2011 19:48
Макрос для подгрузки .dvb dextron3 Программирование 22 11.04.2008 14:47
Не работает макрос изменяющий цвет Джин Программирование 10 21.11.2006 16:53