Как в VBA_Autocad создать конструкцию Do While...Loop, чтобы цикл завершался при нажатии Esc?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как в VBA_Autocad создать конструкцию Do While...Loop, чтобы цикл завершался при нажатии Esc?

Как в VBA_Autocad создать конструкцию Do While...Loop, чтобы цикл завершался при нажатии Esc?

Ответ
Поиск в этой теме
Непрочитано 08.10.2015, 00:45 #1
Как в VBA_Autocad создать конструкцию Do While...Loop, чтобы цикл завершался при нажатии Esc?
evthisrel
 
Инженер-проектировщик строительных конструкций, BIM-менеджер
 
Минск
Регистрация: 08.10.2015
Сообщений: 8

Доброго времени суток, уважаемые форумчане. Прикрепляю примерный код для более ясного понимания ситуации. При помощи цикла Do While...Loop я строю отрезки из точки. Так вот, хочу, чтобы при нажатии Esc построение отрезков завершалось. Как быть? Заранее, признателен за помощь.
Код:
[Выделить все]
Sub example()
Dim Line as AcadLine
    pp1(0) = 0: pp1(1) = 0: pp1(2) = 0:
        Do While Err
            pp2 = ThisDrawing.Utility.GetPoint(pp1, vbCrLf & "")
            Set Line = ThisDrawing.ModelSpace.AddLine(pp1, pp2)
        Loop
End Sub
Просмотров: 4553
 
Непрочитано 08.10.2015, 01:07
#2
swell{d}

гадание на конечно-элементной гуще
 
Регистрация: 31.05.2006
Düsseldorf
Сообщений: 7,596


Код:
[Выделить все]
Sub example()
    On Error GoTo ErrorHandler
...
Exit Sub
ErrorHandler:
    Select Case Err.Number
        Case -2147467259
            ThisDrawing.Utility.Prompt "Отменено пользователем"
            End
    End Select
    MsgBox Err.Number & " - " & Err.Description, vbCritical
    End
End Sub
Для акада возможно код ошибки будет другой
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Автор темы   Непрочитано 08.10.2015, 02:22
#3
evthisrel

Инженер-проектировщик строительных конструкций, BIM-менеджер
 
Регистрация: 08.10.2015
Минск
Сообщений: 8
Отправить сообщение для evthisrel с помощью Skype™


swell{d}, Проблема в том, что дело до Error и не доходит. Создание отрезков я заканчиваю, зайдя в редактор VBA и нажав Reset. Иначе я буду проставлять их вечно.
В своем коде под Err я подразумевал, что, если откажусь ставить точку, а, скажем, нажму Esc, то будет ошибка и все.
Кажется, с таким же успехом я мог бы сразу отправить в конец процедуры и все. Или я чего-то не понимаю?
Код:
[Выделить все]
Sub example()
Dim Line as AcadLine
    pp1(0) = 0: pp1(1) = 0: pp1(2) = 0:
 On Error GoTo ES
        Do While Err
            pp2 = ThisDrawing.Utility.GetPoint(pp1, vbCrLf & "")
            Set Line = ThisDrawing.ModelSpace.AddLine(pp1, pp2)
        Loop
ES:
End Sub
evthisrel вне форума  
 
Непрочитано 08.10.2015, 11:00
#4
swell{d}

гадание на конечно-элементной гуще
 
Регистрация: 31.05.2006
Düsseldorf
Сообщений: 7,596


Код, который я выложил, у меня работает именно так, как вы хотите.
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 08.10.2015, 12:03
#5
allrather


 
Регистрация: 27.02.2011
Минск
Сообщений: 169
Отправить сообщение для allrather с помощью Skype™


Цитата:
Сообщение от swell{d} Посмотреть сообщение
Для акада возможно код ошибки будет другой
Меня устроил тот, что на скине.
С Вашей помощью. Спасибо огромное!

Вот черновик того, что я хотел сделать: http://autode.sk/1RvjfuO
Миниатюры
Нажмите на изображение для увеличения
Название: Screen Shot 001.PNG
Просмотров: 38
Размер:	5.2 Кб
ID:	158177  

Последний раз редактировалось allrather, 08.10.2015 в 12:34.
allrather вне форума  
 
Непрочитано 08.10.2015, 12:15
#6
Кулик Алексей aka kpblc
Moderator

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


Может быть, следует отслеживать значение системной переменной ERRNO?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.10.2015, 12:29
#7
allrather


 
Регистрация: 27.02.2011
Минск
Сообщений: 169
Отправить сообщение для allrather с помощью Skype™


Кулик Алексей aka kpblc, может быть. Но, в принципе, все хорошо работает, как посоветовал swell{d}, стоило только цикл заменить. Я не знаю почему, но с Do While..Loop ничего не выходило.
Я попробовал For...Next (В принципе, мне не нужна бесконечность точек, я знаю, что максимум, скажем, 10. Просто, изначально хотелось сделать все максимально гибко), и все отлично. Даже слишком просто.
Код:
[Выделить все]
Sub example()
Dim Line as AcadLine
    pp1(0) = 0: pp1(1) = 0: pp1(2) = 0:
        For i=1 To 10
            On Error GoTo ErrorHandler
            pp2 = ThisDrawing.Utility.GetPoint(pp1, vbCrLf & "")
            Set Line = ThisDrawing.ModelSpace.AddLine(pp1, pp2)
        Next
Exit sub
ErrorHandler:
End Sub
allrather вне форума  
 
Непрочитано 08.10.2015, 12:38
#8
Boxa

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


Бесконечный цыкл он не только с помощью Do Loop делается,
по крайней мере, раньше так работало, а проверять сейчас желания нет.
Код:
[Выделить все]
for i=1 to 10 step 0
   'Ваш код
next
Boxa вне форума  
 
Непрочитано 08.10.2015, 12:41
#9
allrather


 
Регистрация: 27.02.2011
Минск
Сообщений: 169
Отправить сообщение для allrather с помощью Skype™


Цитата:
Сообщение от Boxa Посмотреть сообщение
Бесконечный цыкл он не только с помощью Do Loop делается,
по крайней мере, раньше так работало, а проверять сейчас желания нет.
А у меня желание есть.
Крутоо
Все работает. Спасибо, возьму себе на заметку!


Хотелось бы подытожить!
Вся путаница произошла именно из-за использования цикла Do while...Loop. Проблема в том, что он не прекращается при нажатии Esc, то есть не фиксирует ошибку. В принципе, я придумал кривой код, чтобы и Do while...Loop работал. Но лучше для бесконечных циклов использовать совет выше!
Всем спасибо.

Последний раз редактировалось allrather, 08.10.2015 в 12:47.
allrather вне форума  
 
Непрочитано 08.10.2015, 13:14
#10
doctorraz

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


Цитата:
Сообщение от allrather Посмотреть сообщение
Я не знаю почему, но с Do While..Loop ничего не выходило.
Цитата:
Сообщение от allrather Посмотреть сообщение
Вся путаница произошла именно из-за использования цикла Do while...Loop. Проблема в том, что он не прекращается при нажатии Esc, то есть не фиксирует ошибку. В принципе, я придумал кривой код, чтобы и Do while...Loop работал. Но лучше для бесконечных циклов использовать совет выше!
Не поэтому... просто ты пока не умеешь их готовить )))
========================
тот же вид только сбоку )))
Код:
[Выделить все]
Sub example()
Dim Line As AcadLine
Dim pp1(2)  As Double
    pp1(0) = 0: pp1(1) = 0: pp1(2) = 0:
On Error Resume Next
    Do While Err.Number = 0 'пока ноль выполняем
        pp2 = ThisDrawing.Utility.GetPoint(pp1, vbCrLf & "")
        Set Line = ThisDrawing.ModelSpace.AddLine(pp1, pp2)
    Loop
On Error GoTo 0' сбрасываем ошибку в ноль и включаем обработчик прерываний
'продолжаем еще, что то делать в программе
End Sub
или извратиться наоборот )))

Код:
[Выделить все]
Sub example()
Dim Line As AcadLine
Dim pp1(2)  As Double
    pp1(0) = 0: pp1(1) = 0: pp1(2) = 0:
On Error Resume Next
    Do Until Err.Number <> 0 'когда будет не ноль прекратим
        pp2 = ThisDrawing.Utility.GetPoint(pp1, vbCrLf & "")
        Set Line = ThisDrawing.ModelSpace.AddLine(pp1, pp2)
    Loop
On Error GoTo 0' сбрасываем ошибку в ноль и включаем обработчик прерываний
'продолжаем еще, что то делать в программе
End Sub
конец не только по Esc но и spase, Enter и ПКМ
__________________
Мастерская СПДС

Последний раз редактировалось doctorraz, 09.10.2015 в 08:45. Причина: поправил On Error GoTo 0
doctorraz вне форума  
 
Непрочитано 08.10.2015, 13:19
#11
allrather


 
Регистрация: 27.02.2011
Минск
Сообщений: 169
Отправить сообщение для allrather с помощью Skype™


doctorraz, Спасибо за ликбез Как же все просто!

Цитата:
Сообщение от doctorraz Посмотреть сообщение
Не поэтому... просто ты пока не умеешь их готовить )))
Уже умею.
allrather вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как в VBA_Autocad создать конструкцию Do While...Loop, чтобы цикл завершался при нажатии Esc?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19