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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как дождаться пока AutoCAD открывает файл? "ThisDrawing.Open" VBA

Как дождаться пока AutoCAD открывает файл? "ThisDrawing.Open" VBA

Ответ
Поиск в этой теме
Непрочитано 18.06.2011, 18:51 #1
Как дождаться пока AutoCAD открывает файл? "ThisDrawing.Open" VBA
Miniril
 
Регистрация: 14.03.2010
Сообщений: 27

Проблема следующая:

Есть функция (не моих рук дело):
Код:
[Выделить все]
Public Function OpenAnyMode(strFileName As String) As AcadDocument
  Dim varMode As Variant
  Dim intCnt As Integer
  Dim objDoc As AcadDocument
  On Error GoTo Err_Control
  intCnt = Application.Documents.count
  If intCnt > 0 Then
  varMode = ThisDrawing.GetVariable("SDI")
    If varMode Then
      Set objDoc = ThisDrawing.Open(strFileName)
    Else
      Set objDoc = Application.Documents.Open(strFileName)
    End If
  Else
    Set objDoc = Application.Documents.Open(strFileName)
  End If
  Set OpenAnyMode = objDoc
Exit_Here:
  Exit Function
Err_Control:
  MsgBox "Error opening " & strFileName & vbCrLf & _
  Err.Description
  Resume Exit_Here
End Function
Запускаю я ее таким макаром: "Set objDoc = OpenAnyMode(colFiles(intCnt))"
С ее помощью я хочу перелопатить чертежи поочередно.
При этом использую "On error resume next"
Только вот AutoCAD открывает чертеж не в один момент. А за это время, пока acad его открыват VBA успевает пропустить несколько последующих строк.
Как это можно исправить?
Просмотров: 7065
 
Непрочитано 18.06.2011, 19:09
#2
hwd

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


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

Последний раз редактировалось hwd, 18.06.2011 в 19:26.
hwd вне форума  
 
Автор темы   Непрочитано 19.06.2011, 01:30
#3
Miniril


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


а можно, пожалуйста покнкретнее, а то
Код:
[Выделить все]
    Do While Documents.Item(0).Name <> objDoc.Name
    DoEvents
    Loop
и отслеживать переменную: "Documents.count", VBA не устраивает - вылетает.((((
Miniril вне форума  
 
Непрочитано 19.06.2011, 10:45
#4
hwd

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


Цитата:
Сообщение от Miniril Посмотреть сообщение
а можно, пожалуйста покнкретнее
поконкретней я на эту тему писал тут.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 19.06.2011, 11:50
#5
Miniril


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


Нашел, вот так работает (хотя может это не совсем правильно):
Код:
[Выделить все]
Dim objDoc As AcadDocument
On Error Resume Next

Set objDoc = OpenAnyMode(colFiles(intCnt))

Do While Application.ActiveDocument.Name <> objDoc.Name
Loop
Miniril вне форума  
 
Непрочитано 19.06.2011, 12:00
#6
gomer

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


Может лучше пробовать ObjectDBX? Не надо делать за автокад то с чем он прекрасно и сам справляется... Что хоть нужно делать с файлом?...
Offtop: hwd, новый вид сайта мне понравился... просто и со вкусом... только не желтое на белом...
Для себя делал программку для очистки чертежей в папке для брикскад... там многие вкусности могут быть не доступны...
а идея очень простая =)
gomer вне форума  
 
Непрочитано 19.06.2011, 12:04
#7
hwd

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


Цитата:
Сообщение от Miniril Посмотреть сообщение
Нашел, вот так работает (хотя может это не совсем правильно):
Код:
[Выделить все]
Dim objDoc As AcadDocument
On Error Resume Next

Set objDoc = OpenAnyMode(colFiles(intCnt))

Do While Application.ActiveDocument.Name <> objDoc.Name
Loop
Вообще-то, программно можно открывать базу данных чертежа без визуального открытия файла - для пакетной обработки это самый лучший вариант, ибо заставлять юзера сидеть и смотреть, как перед его глазами открывается/модифицируется/сохраняется/закрывается туева хуча файлов (так, чтобы у него аж в глазах зарябило) - сие не есть "зер гуд". А в этом случае твой подход вряд ли подойдёт. Ну, как говорится - хозяин барин... Устраивает тебя такой вариант - значит юзай его.
Цитата:
Сообщение от gomer
только не желтое на белом...
Песочницу в порядок пока не приводил.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 19.06.2011, 12:56
#8
Miniril


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


Вообще нужно чтобы еще миниатюры файлов сохранились. Поэтому и открываю визуально.
А делаю с ними разное:
Код:
[Выделить все]
    'Удаляем всякие разные листы с внутрелистовым хламом
    For Each Layout In ThisDrawing.Layouts
    If Layout.Name <> "Model" Then Layout.Delete
    Next
    ThisDrawing.Layouts.Add ("Layout2") 'добавляем второй (стандартный) лист
 
    ' размораживаем и разблокируем все слои
    For Each Layer In ThisDrawing.layers
    If Layer.Freeze = True Then Layer.Freeze = False
    If Layer.Lock = True Then Layer.Lock = False
    If Layer.LayerOn = False Then Layer.LayerOn = True
    Next
 
    ThisDrawing.SendCommand ("_.burst _all  ") 'взрываем блоки с атрибутами и без...
    ThisDrawing.SendCommand ("_.-overkill _all   ") 'удаляем копии объектов
    ThisDrawing.SendCommand ("_.-scalelistedit _r _y _e ") 'обнуляем список масштабов
 
    ThisDrawing.layers.Add ("3D") 'добавляем слой "3D" которого вечно нет
    Rename_layers 'приводим слои в порядок (тут регистр в названиях слоев _
                         правильно выставляется, чтобы его не учитывать)
 
    ThisDrawing.ModelSpace.Units = acInsertUnitsUnitless 'безразмерные единицы чертежа
    ThisDrawing.ActiveSpace = acModelSpace 'активируем пространство модели
    ThisDrawing.ActiveLayer = ThisDrawing.layers(0) 'активный слой 0
    ThisDrawing.layers(0).TrueColor.ColorIndex = acWhite 'цвет нулевого слоя - белый
    ThisDrawing.SetVariable "CECOLOR", "BYLAYER" 'цвет активного слоя - по слою
 
'здесь определенные преобразования пообъектно
 
    ThisDrawing.SendCommand ("_-view _swiso ") 'вид изометрии (здесь же и regen)
    ThisDrawing.SendCommand ("_ucs _w ") 'мировая СК
    ThisDrawing.SetVariable "UCSICON", 3 'координатные оси привязаны к началу координат
    ThisDrawing.PurgeAll 'очистка чертежа
    ThisDrawing.SetVariable "DISPSILH", 1 'сглаживание поверхностей
    ThisDrawing.SendCommand ("_hide ") 'скрыть
 
'дальше создается log файл с ошибками в чертежах
Miniril вне форума  
 
Непрочитано 19.06.2011, 13:00
#9
hwd

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


Избегай использование SendCommand везде, где это возможно (он работает асинхронно).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 11.03.2018, 16:34
#10
Simson


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


в тему про sendcommand
похожая ситуация и у меня.. как раз столкнулся с такой проблемой что команда выполняется после когда.. как подождать пока выполнится команда/передать управление?
посоветовали doevents но то ли не правильно пользуюсь то ли не работает эта команда.
есть идея как решить проблему?
Simson вне форума  
 
Непрочитано 11.03.2018, 18:27
#11
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,293
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от Simson Посмотреть сообщение
как подождать пока выполнится команда
подписаться на событие, этой команды.... если оно есть
что за команда?
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 11.03.2018, 19:47
#12
Simson


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


извлечение данных

----- добавлено через ~1 мин. -----
вы имеете ввиду выполнить когда закончится команда? это опять же костыль.. я конечно так и сделал..
но надеялся обойтись одной волшебной строчкой doevents
Simson вне форума  
 
Непрочитано 11.03.2018, 19:50
#13
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,293
Отправить сообщение для doctorraz с помощью Skype™


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

дитю мороженое даме цветы.. наоборот не взлетит
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 11.03.2018, 19:55
#14
Simson


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


когда гуглил про команды напоролся на эту тему.. подумал что тот кто остерегает от командной строки должен знать как решить проблему.. потом только на дату взглянул..
Simson вне форума  
 
Непрочитано 11.03.2018, 20:03
#15
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,293
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от Simson Посмотреть сообщение
подумал что тот кто остерегает от командной строки должен знать как решить проблему.. потом только на дату взглянул..
проблема где?
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 12.03.2018, 09:47
#16
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


http://forum.dwg.ru/showthread.php?p...2&#post1716192
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как дождаться пока AutoCAD открывает файл? "ThisDrawing.Open" VBA

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA в AutoCAD alle Программирование 47 03.12.2014 11:26
AutoCAD LT 2005 и VBA Macros Vidas Программирование 10 03.05.2005 11:00