Отключить выполнение команд повешенных на AcadDocument_Activate() - Страница 2
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Отключить выполнение команд повешенных на AcadDocument_Activate()

Отключить выполнение команд повешенных на AcadDocument_Activate()

Ответ
Поиск в этой теме
Непрочитано 20.05.2011, 09:44
Отключить выполнение команд повешенных на AcadDocument_Activate()
Ольга_DG
 
Регистрация: 20.05.2011
Сообщений: 10

Здравствуйте!
Я написала программу, которой в качестве исходных данных вводится папка, из которой она берет файлы, открывает их по чтению и считывает нужные данные и записывает в xml-файл. Но попадаются файлы, на которых она останавливается. В этих файлах прописан код при открытии AcadDocument_Activate. Что нужно сделать чтобы она не останавливалась?
Может существуют какие системные переменные AutoCADa которые отключат выполнение макроса при отрытии файла? Подскажите пожалуйста!

ПРИМЕР КОДА

Private Sub AcadDocument_Activate()
Dim VBEModel As Object
Dim i As Integer
Dim bLoad As Boolean
Dim FileName As String
bLoad = True
FileName = Application.Preferences.Files.TemplateDwgPath & "\AcadMirage.dvb"
Set VBEModel = VBE
For i = 1 To VBEModel.VBProjects.Count
If StrComp(VBEModel.VBProjects(i).Name, "ACADMirage", vbTextCompare) = 0 Then
bLoad = False
Exit For
End If
Next i
If bLoad Then LoadDVB FileName
Application.RunMacro VBEModel.VBProjects(i).Name + ".Mirage.MenuMirage"
End Sub

Этот код выполняется при открытии файла. КАК избавится от его выполнения?

Последний раз редактировалось Ольга_DG, 20.05.2011 в 10:45. Причина: изменения
Просмотров: 8430
 
Непрочитано 20.05.2011, 13:14
#21
hwd

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
запустил - открылся как обычный файл (попробуйте сами на другой машине).
У меня при обычном открытии файла (двойной клик мышью по файлу) появилось окошко:



Если нажать первую кнопку - то макросы не будут загружены в память, но в редакторе VBA они присутствуют.
Если нажать последнюю - макросы не будут считаны из dwg-файла и в редакторе VBA будет чисто (никакого кода не будет).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 20.05.2011 в 14:37. Причина: добавил "двойной клик мышью по файлу"
hwd вне форума  
 
Непрочитано 20.05.2011, 13:16
#22
Сергей Богатов


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
запустил - открылся как обычный файл (попробуйте сами на другой машине).
наверное в настройках безопасности стоит "никогда не запускать макросы"

или наоборот "никогда не спрашивать" и работаете вы в ТЭПе и макрос нормально отрабатывет
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Автор темы   Непрочитано 20.05.2011, 13:29
#23
Ольга_DG


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
запустил - открылся как обычный файл (попробуйте сами на другой машине).
В в какой версии AutoCAD открывали файл? Если в 2010,2011 или2012 то проверьте установку vba модуля, т.к. он ставится отдельно


ДЛЯ hwd:
я не хочу чтобы это окно загружалось. Безопастность макросов я уже настраивала через меню Сервис-Макрос-Макросы-Опции

Последний раз редактировалось Ольга_DG, 20.05.2011 в 13:34. Причина: добавление
Ольга_DG вне форума  
 
Непрочитано 20.05.2011, 13:32
#24
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Семен Семеный - у меня на 2010 и VBA-то не установлен - сейчас скачаю отпишусь.
p.s. Ольга Семен Семеныч - это я не Вам - когда писал Вашего поста еще не видел.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.05.2011, 13:44
#25
Сергей Богатов


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


а моё предложение? см http://forum.dwg.ru/showpost.php?p=754619&postcount=20
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Автор темы   Непрочитано 20.05.2011, 13:53
#26
Ольга_DG


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


Цитата:
Сообщение от Сергей Богатов Посмотреть сообщение
а моё предложение? см http://forum.dwg.ru/showpost.php?p=754619&postcount=20
Это не подходит т.к. в другом файле будет другой код. и еще мне не надо его выполнять, у меня свой запущен и должен выполняться. я же писала: файлов тысячи штук я с них списываю информация в xml-файл.
Ольга_DG вне форума  
 
Непрочитано 20.05.2011, 14:08
#27
hwd

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


Ольга_DG, используйте способ, указанный мною выше - проверено, работает.
На примере вашего файла протестировал:
Код:
[Выделить все]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;

namespace ClassLibrary1 {
    public class Class1 : IExtensionApplication  {
        public void Initialize() {
            Document dwg = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = dwg.Database;
            Editor ed = dwg.Editor;
            Database sourceDb = new Database(false, true);
            string externDwgName = @"D:\Мусор\10191_085_r2.dwg";
            sourceDb.ReadDwgFile(externDwgName, System.IO.FileShare.Read, true, "");

            ed.WriteMessage(string.Format("Считываем имена текстовых стилей, имеющихся в файле \"{0}\":\n", externDwgName));

            using (Transaction tr = sourceDb.TransactionManager.StartTransaction()) {

                TextStyleTable tsTable = (TextStyleTable) tr.GetObject(sourceDb.TextStyleTableId, OpenMode.ForRead);

                foreach (ObjectId item in tsTable) {
                    TextStyleTableRecord style = (TextStyleTableRecord) tr.GetObject(item, OpenMode.ForRead);
                    ed.WriteMessage(string.Format("{0}\n", style.Name));
                }
            }
        }

        public void Terminate() {
            //throw new NotImplementedException();
        }
    }
}
Результат:



Как видим - проблем не возникает.

п.с.
Цитата:
я не хочу чтобы это окно загружалось. Безопастность макросов я уже настраивала через меню Сервис-Макрос-Макросы-Опции
Это окно открывается, когда я обычным образом открываю файл (в проводнике мышкой двойным кликом). А то, что я показал в коде - извлекает информацию из нужного файла без открытия этих окон. И не важно, будь он хоть весь обвешан макросами VBA - они не запускаются при таком способе...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 20.05.2011 в 14:18. Причина: добавил п.с.
hwd вне форума  
 
Непрочитано 20.05.2011, 14:18
#28
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Offtop: мда-уж запускает (спрашивает запускать или нет) - удалю-ка я нафиг обратно этот VBA раз сам в нем чайник - нефиг и воду мутить.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.05.2011, 14:21
#29
hwd

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Offtop: мда-уж запускает (спрашивает запускать или нет) - удалю-ка я нафиг обратно этот VBA раз сам в нем чайник - нефиг и воду мутить.
Имхо, лучше оставить. Можно будет отловить "пряники", которые у тебя при отладке кода не будут проявляться (т.к. нет VBA), но по факту проявятся у юзеров, у которых VBA установлен...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 20.05.2011, 15:42
#30
Ольга_DG


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


hwd, можете помочь с кодом на VBA
Ольга_DG вне форума  
 
Непрочитано 20.05.2011, 15:46
#31
hwd

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


Цитата:
Сообщение от Ольга_DG Посмотреть сообщение
hwd, можете помочь с кодом на VBA
На VBA не пишу, но всё равно выкладывайте свой вариант - думаю, что найдутся те, кто пишет и сможет показать, как выполнить то, что я показал на C#. Попрошу Oleg ~J~ глянуть - возможно он поможет.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 20.05.2011 в 15:56. Причина: исправил опечатку: заменил VBA на C#
hwd вне форума  
 
Автор темы   Непрочитано 20.05.2011, 15:55
#32
Ольга_DG


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


спасибо.
привожу свой код на открытие этих файлов
Код:
[Выделить все]
 
On Error GoTo metka1        
Documents.Open mass_dwg(k), True
.
.
.
metka1:

    'If Err <> 0 Then
    Err.Clear
    FileNameErr = mass_dwg(k)
    Open PathFilesXML & "\dwg_err.txt" For Output As #2
    Print #2, FileNameErr
    Close #2
    'End If
              
можно попробовать другой отладчик ошибок
еще в объектной модели AutoCAD есть в Application свойство VBE но про него мало что известно. если что то знаете напишите, пожалуйста.
Ольга_DG вне форума  
 
Непрочитано 20.05.2011, 16:06
#33
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Посмотри, может это подойдет
DBXremVBA/DBXscanVBA - batch remove VBA macros from DWG files
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 20.05.2011, 16:15
#34
hwd

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


Цитата:
Сообщение от VVA Посмотреть сообщение
Посмотри, может это подойдет
DBXremVBA/DBXscanVBA - batch remove VBA macros from DWG files
Насколько я понял автора, ей не нужно убивать VBA-код, поскольку он может потом кому-то понадобиться. Её нужно просто программно прочитать информацию из кучи файлов. Поэтому я и рекомендовал найти в VBA метод, аналогичный экземплярному Database.ReadDwgFile(...) - в этом случае наличие макросов не помеха.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 20.05.2011, 16:18
#35
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от hwd Посмотреть сообщение
Её нужно просто программно прочитать информацию из кучи файлов.
Как вариант можно попробывать вставлять файл как ссылку (блок) в текущий документ и лазить по нему (надеюсь так он запускатся не будет).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.05.2011, 16:20
#36
hwd

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Как вариант можно попробывать вставлять файл как ссылку (блок) в текущий документ и лазить по нему (надеюсь так он запускатся не будет).
Offtop: И всё таки как хорошо, что я не пишу в AutoCAD на VBA - лишний раз убеждаюсь...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 20.05.2011, 16:24
#37
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Ольга_DG Посмотреть сообщение
можно попробовать другой отладчик ошибок
Тут не это нужно скорее всего
Если тебе просто надо считать данные со всей папки более логично использовать ObjectDBX а приведенный код можно просто вставить в цикл прохода по всем файлам
Поищи на форуме насчет ObjectDBX
Можешь попробовать такпой код (лучше на резервной копии небольшого
количества файлов)

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

'' Require References to:
'' AutoCAD/ObjectDBX Common 17.0 Type Library (for A2007-2009) AutoCAD/ObjectDBX Common 18.x for A2009+
'' Microsoft Scripting Runtime

Public Function BrowseForFolderF(ByVal msg As String) As String
     Dim oBrowser, folderObj, folderAcpt As Object
     Dim folderStr As String

     Set oBrowser = ThisDrawing.Application.GetInterfaceObject("Shell.Application")
     Set folderAcpt = oBrowser.BrowseForFolder(vbOKOnly, msg, vbDefaultButton3, 0)

     With folderAcpt
          Set folderObj = .Self
          folderStr = folderObj.Path
     End With
     Set folderObj = Nothing
     Set folderAcpt = Nothing
     Set oBrowser = Nothing
     BrowseForFolderF = folderStr

End Function

Public Function CheckFolder(ByVal strPath As String) As Variant
     Dim objFolder     ''As Scripting.Folder
     Dim objFile     ''As Scripting.File
     Dim objSubdirs     ''As Scripting.Folders
     Dim objLoopFolder     ''As Scripting.Folder
     Dim varFs() As Variant
     Dim m_objFSO, n, m_lngFileCount

     Set m_objFSO = CreateObject("Scripting.FileSystemObject")
     Set objFolder = m_objFSO.GetFolder(strPath)
     '
     ' Check files in this directory
     '
     n = -1
     For Each objFile In objFolder.Files
          If UCase$(Right$(objFile.ShortPath, 4)) = ".DWG" Then
               m_lngFileCount = m_lngFileCount + 1
               n = n + 1
               ReDim Preserve varFs(n)
               varFs(n) = objFile.Path
          End If
     Next objFile

     ' Loop through all subdirectories and
     ' do the same thing.
     '
     Set objSubdirs = objFolder.SubFolders
     For Each objLoopFolder In objSubdirs
          CheckFolder objLoopFolder.Path
     Next objLoopFolder

     Set objSubdirs = Nothing
     Set objFolder = Nothing
     CheckFolder = varFs
End Function

Private Sub CreateCSVFile(fso As Variant, strFname As String)
     Dim tf
     If Not fso.FileExists(strFname) Then
          Set tf = fso.CreateTextFile(strFname, True)
          Set tf = Nothing
     End If
End Sub

Private Sub WriteToCSVFile(strFname As String, strData As String)
     Open strFname For Append As #1
     Write #1, strData
     Close #1
End Sub

Sub BatchReadTitleBlock()
     Dim oblkRef As AcadBlockReference
     Dim objFnd As Object
     Dim indx As Integer
     Dim iFiles() As Variant
     Dim m_objFSO
     Dim fold, DwgName, cnt As Integer, nm As String

     fold = BrowseForFolderF("Select Folder to Read Data from")
     Set m_objFSO = CreateObject("Scripting.FileSystemObject")

     iFiles = CheckFolder(fold)

     CreateCSVFile m_objFSO, "C:\Temp\Test.csv"     '// CHANGE TEXT FILE NAME HERE

     Dim oDbx As New AxDbDocument

     Set oDbx = GetInterfaceObject("ObjectDBX.AxDbDocument.17")     '' or 16 for A2005-6

     On Error Resume Next
     For indx = LBound(iFiles) To UBound(iFiles)
          DwgName = iFiles(indx)
          oDbx.Open DwgName

'/*----------------- ВСТАВЬ СВОЙ КОД ВМЕСТО ЭТОГО БЛОКА: -----------------
          For Each objFnd In oDbx.PaperSpace
               If TypeOf objFnd Is AcadBlockReference Then
                    Set oblkRef = objFnd
                    If StrComp(UCase(oblkRef.Name), "TITLEBLOCK", 1) = 0 Then '// CHANGE BLOCK NAME HERE
                         Exit For
                    End If
               End If
          Next objFnd

          With oblkRef
               Dim atts As Variant
               Dim strData As String
               strData = .Name
               atts = .GetAttributes
               For i = 0 To UBound(atts)
                    strData = strData & "," & atts(i).TextString
               Next i
          End With

          WriteToCSVFile "C:\Temp\Test.csv", strData     '// CHANGE TEXT FILE NAME HERE
          
'-------------------------------------------------------------------*/
          Set oDbx = Nothing

     Next indx

End Sub

Последний раз редактировалось Олег (jr.), 20.05.2011 в 17:25. Причина: добавлен код
Олег (jr.) вне форума  
 
Непрочитано 20.05.2011, 16:26
#38
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от hwd Посмотреть сообщение
Насколько я понял автора, ей не нужно убивать VBA-код, поскольку он может потом кому-то понадобиться.
На крайний случай можно собрать информацию на копии dwg файлов с убитым VBA кодом
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 20.05.2011, 16:35
#39
hwd

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


Цитата:
Сообщение от VVA Посмотреть сообщение
На крайний случай можно собрать информацию на копии dwg файлов с убитым VBA кодом
Похоже, что для автора это будет самый быстрый вариант...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 20.05.2011, 18:46
#40
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


ручки за такое поотбивал... Афтару... либо во всех файлах меняйте переменную bLoad = True на bLoad = false
либо попробуйте убивать событие чуть раньше... например во время EndOpen
gomer вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Отключить выполнение команд повешенных на AcadDocument_Activate()



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что нужно чтобы отключить Отопление в квартире? Колян Отопление 96 30.01.2019 13:58
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
Есть ли в Автокаде 2008 клавиша перебора команд, ранее введенных в командной строке? onick AutoCAD 4 13.11.2010 21:25
В русской версии AutoCAD 2010 SP1 32-bit файл Acad.PGP содержит ошибки. hwd Баги и пожелания в Autodesk 21 21.04.2010 20:27
Комбинации клавиш для команд в AutoCAD 2006 Artiznov AutoCAD 3 03.03.2006 15:23