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

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

Помогите с отменой действия программы!

Ответ
Поиск в этой теме
Непрочитано 09.10.2007, 18:05 #1
Помогите с отменой действия программы!
480725
 
Москва
Регистрация: 06.10.2007
Сообщений: 132

Несколько программ вызываются каждая из своего пункта меню и производят зацикленные операции. Хотя нормальное завершение и предусмотрено, велика вероятность, что пользователь прервет программу вызовом другого пункта меню.
В этои сдучае оператор (command"_.undo""_begin") остается незавершенным и приходится в обработчик ошибок ставить анализ системной переменной UNDOCNL, т.к. иначе отмена вообще блокируется
При эксплуатации выявились две проблемы:
1) Если обработчик ошибок вовремя не сработал, а такое случается иногда т.к. какие-то действия пользователей способны вызвать прерывание работы самого обраработчика, то оператор (command"_.undo""_end") запущенный не сразу после работы программы, а после выполнения, например, каких-то построений в Автокаде, приведет в случае отмены одновременную отмену и результатов программы и этих построений.
2) Возникает масса ложных необходимостей выполнения (command"_.undo""_end") т.к. обращение к любой команде Автокада в меню устанавливает в переменной UNDOCTL признак незавершенности группы отмены. Предположительно из-за этого резко возрастает количество неоходимых операторов отмены (значительно более одного на одну операцию или программу), при этом результпт работы программы отменяется все-таки одним оператором, а не по частям, просто много операторв отмены расходуются вхолостую.
Думаю, виноват все-таки АвтоКАД, но может кто-то нашел решение.
Помогите!
Просмотров: 9865
 
Непрочитано 09.10.2007, 18:42
#2
Zouss


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


по первому у вас обработчик недоработан скорее всего здесь кое какие нюансы показаны
по второму могу предложить опции mark и back для команды undo
Zouss вне форума  
 
Непрочитано 09.10.2007, 19:02
#3
Кулик Алексей aka kpblc
Moderator

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


0. Чтобы у пользователя не возникало нездоровое желание выбирать меню, можно поставить прогресс-бар (вроде тоже на аркаде обсуждалось).
1, 2 и далее: желательно увидеть код, чтобы можно было сказать более конкретно. Если создаются временные примитивы, достаточно перед работой функции запомнить последний созданный (entlast), и все, что после него, сносить. Короче, код - в студию!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.10.2007, 19:58
#4
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Zouss
по первому у вас обработчик недоработан скорее всего здесь кое какие нюансы показаны
по второму могу предложить опции mark и back для команды undo
Обработчик работает нормально, просто прерывание сбрасывает сначало программу, а потом и обработчик. Пример видел, его тоже сорвет.
_mark и _back не помогают - до восьми раз приходится повторять отмену в некоторых случаях, а дисбаланс в сторону _back приведет к отмене всего сеанса работы.
480725 вне форума  
 
Непрочитано 09.10.2007, 20:02
#5
Кулик Алексей aka kpblc
Moderator

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


Так код покажи - ИМХО там можно обойти эти ограничения.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.10.2007, 20:06
#6
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Кулик Алексей aka kpblc
0. Чтобы у пользователя не возникало нездоровое желание выбирать меню, можно поставить прогресс-бар (вроде тоже на аркаде обсуждалось).
1, 2 и далее: желательно увидеть код, чтобы можно было сказать более конкретно. Если создаются временные примитивы, достаточно перед работой функции запомнить последний созданный (entlast), и все, что после него, сносить. Короче, код - в студию!
Можно конечно отключить меню вообще.. Тогда точно проблема снимется. Но ведь включат. Им так удобнее. Чтобы привести программы надо столько объяснить - если никого, кто просто сталкивался и решил описанную проблему не найдется сделаю примитивный пример для иллюстрации. Запоминать Entlast и стирать до него - попадаем на проблему 1. (удаление всех примитивов, построенных командами автокада после работы программы одной отменой)
480725 вне форума  
 
Автор темы   Непрочитано 09.10.2007, 20:10
#7
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Кулик Алексей aka kpblc
Так код покажи - ИМХО там можно обойти эти ограничения.
Код большой, без больших объяснений непонятный, я или решу проблему на форуме (т.е. код вообще не потребуется), или напишу иллюстративный код, чтобы на своем ПК все могли воспроизвести ситуацию. Кстати, если сам решу - тоже опубликую.
480725 вне форума  
 
Непрочитано 09.10.2007, 20:16
#8
Кулик Алексей aka kpblc
Moderator

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


"Ладно, папа, пойдем длинным путем" (с)
Опиши, что код должен делать. Может, что и придумается.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.10.2007, 21:02 Re: Помогите с отменой действия программы!
#9
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от 480725
1) Если обработчик ошибок вовремя не сработал, а такое случается иногда т.к. какие-то действия пользователей способны вызвать прерывание работы самого обработчика, то оператор (command"_.undo""_end") запущенный не сразу после работы программы, а после выполнения, например, каких-то построений в Автокаде, приведет в случае отмены одновременную отмену и результатов программы и этих построений.
Если все проблемы решаются запретом на прерывание работы обработчика, то просто запрети его прерывать и все...
Цитата:
Сообщение от 480725
2) Возникает масса ложных необходимостей выполнения (command"_.undo""_end") т.к. обращение к любой команде Автокада в меню устанавливает в переменной UNDOCTL признак незавершенности группы отмены. Предположительно из-за этого резко возрастает количество необходимых операторов отмены (значительно более одного на одну операцию или программу), при этом результат работы программы отменяется все-таки одним оператором, а не по частям, просто много операторов отмены расходуются вхолостую.
Думаю, виноват все-таки АвтоКАД, но может кто-то нашел решение.
Помогите!
я в своих программах не использую промежуточных построений или редактирований, стараюсь сначала все вычислить, а потом в едином и мгновенном порыве, внести правки во все нужные места базы чертежа...
При таком подходе, время изменения чертежа мало и его можно обернуть непрерываемой оберткой, а все остальное время, сам чертеж неизменен... Кстати, я не пользуюсь сложными обработчиками ошибок, мне достаточно восстанавливать пару - тройку переменных, которые я изменял во время работы для удобства пользователя...
Елпанов Евгений вне форума  
 
Непрочитано 09.10.2007, 21:06
#10
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Забыл добавить, более конкретные советы могут быть только с кодом...
Вы нам пример, который демонстрирует проблему, мы вам пример ее решения. Ваше замечание о размере кода, более чем уместное - чем короче будет ваш пример, тем больше времени будет потрачено на задачу... Мало кто посвятит вашей проблеме, более 10 минут.
Елпанов Евгений вне форума  
 
Непрочитано 09.10.2007, 21:07
#11
Кулик Алексей aka kpblc
Moderator

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


Еще одно - состояние слоев в обработчик засунуть Кстати, обойтись без временных построений не всегда возможно, но получить указатели на них - не проблема совершенно. К сожалению, пока кода (ну или хотя бы описалова для него) не видно, разговор беспредметный ИМХО.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.10.2007, 21:44 Re: Помогите с отменой действия программы!
#12
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


[quote="480725"]
Цитата:
Сообщение от Елпанов Евгений
Если все проблемы решаются запретом на прерывание работы обработчика, то просто запрети его прерывать и все...
Все не решаются, но многие решатся! Только как это сделать?
480725 вне форума  
 
Автор темы   Непрочитано 09.10.2007, 21:49 Re: Помогите с отменой действия программы!
#13
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


[quote="480725"]
Цитата:
Сообщение от Елпанов Евгений
я в своих программах не использую промежуточных построений или редактированный, стараюсь сначала все вычислить, а потом в едином и мгновенном порыве, внести правки во все нужные места базы чертежа...
При таком подходе, время изменения чертежа мало и его можно обернуть непрерываемой оберткой, а все остальное время, сам чертеж неизменен... Кстати, я не пользуюсь сложными обработчиками ошибок, мне достаточно восстанавливать пару - тройку переменных, которые я изменял во время работы для удобства пользователя...
В твоих программах это возможно, а в моих нет. План здания без диалога не построить!
480725 вне форума  
 
Непрочитано 09.10.2007, 21:55 Re: Помогите с отменой действия программы!
#14
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


[quote="480725"]
Цитата:
Сообщение от 480725
Цитата:
Сообщение от Елпанов Евгений
Если все проблемы решаются запретом на прерывание работы обработчика, то просто запрети его прерывать и все...
Все не решаются, но многие решатся! Только как это сделать?
например:
Код:
[Выделить все]
(vl-catch-all-apply
 (function твоя-супер-функция)
 (list список аргументов твоей супер функции)
)
Елпанов Евгений вне форума  
 
Непрочитано 09.10.2007, 21:58 Re: Помогите с отменой действия программы!
#15
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от 480725
План здания без диалога не построить!
Почему ты думаешь, что в моих проектах нет диалогов?
Скорее наоборот, в моих проектах нет стандартных диалогов и стандартных команд автокада, пользователь запускает утром мою программу и в этой оболочке работает до вечера. Но внутри моей оболочки есть и диалоги и клавиатурные сочетания и контекстное меню...
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 09.10.2007, 22:15
#16
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Кулик Алексей aka kpblc
"Ладно, папа, пойдем длинным путем" (с)
Опиши, что код должен делать. Может, что и придумается.
Чтобы не быть невежливым:
В моих пунктах меню стоит загрузчик програм с обращением к конкретному в каждом случае Лиспу.
Вначале он запускает UNDO BEGIN (впредь пишу просто Beg)
Затем проверяет и подчищает системные переменные
Затем загружает программу, если она не в памяти и выполняет ее.
Программа с самоценными циклами тоже может содержать _Beg и _End, чтобы можно было отменять по частям.
После выполнения программы загрузчик обрабатвывает системные переменные и выполняет UNDO END

Обработчик ошибок дублирует заключительную часть загрузчика

На случай сбоев в обработчике, в моем меню стоит модифицированная отмена

Она вначале Проверяет UNDOCTL и при необходимости запускает _UNDO _End

Потом выполняет отмену.

Проблемы описаны в первом сообщении.
480725 вне форума  
 
Непрочитано 09.10.2007, 22:20 Re: Помогите с отменой действия программы!
#17
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от 480725
В твоих программах это возможно, а в моих нет. План здания без диалога не построить!
Вот интересно, а что там такого в этом плане, что он:
1) строится целиком программно
2) не может быть заменен блоком или дин.блоком (нехай навороченным до ужаса)
:?:
Цитата:
В моих пунктах меню стоит загрузчик програм с обращением к конкретному в каждом случае Лиспу.
Вначале он запускает UNDO BEGIN (впредь пишу просто Beg)
Затем проверяет и подчищает системные переменные
Затем загружает программу, если она не в памяти и выполняет ее.
Программа с самоценными циклами тоже может содержать _Beg и _End, чтобы можно было отменять по частям.
После выполнения программы загрузчик обрабатвывает системные переменные и выполняет UNDO END

Обработчик ошибок дублирует заключительную часть загрузчика

На случай сбоев в обработчике, в моем меню стоит модифицированная отмена

Она вначале Проверяет UNDOCTL и при необходимости запускает _UNDO _End

Потом выполняет отмену.

Проблемы описаны в первом сообщении.
ИМХО (подчеркиваю - это лично мое мнение, не больше!) подход в принципе неверен изначально. Намного проще сделать универсальный загрузчик, который прописать внутрь либо acaddoc.lsp, либо (я пошел по второму пути) - в MenuName.mnl. Этот загрузчик загружает в текущий документ все лиспы. Соответственно, допустим, есть лисп отрисовки обозначения (пример "от балды"!) уклона.
Разбиваем его на подзадачи:
1. Создать (или получить) указатель на блок уклона. Внутри блока нарисовать отрезки, атрибут. Задача номер раз, код примерно таков (без добавления атрибута, уже непринципиально):
Код:
[Выделить все]
(defun _me-create-block-bias (/ blk_name)
                             ;|
*    Функция создания или получения указателя на описание блока уклона
*    Слои уже должны быть разморожены и разблокированы
|;
  (cond
    ((tblobjname "block" (setq blk_name "me-blk-bias"))
     (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
               blk_name
               ) ;_ end of vla-item
     )
    (t
     ((lambda (/ blk_def)
        (setq
          blk_def (vla-add (vla-get-blocks
                             (vla-get-activedocument (vlax-get-acad-object))
                             ) ;_ end of vla-get-blocks
                           (vlax-3d-point '(0. 0. 0.))
                           blk_name
                           ) ;_ end of vla-add
          ) ;_ end of setq
        (vla-addline
          blk_def
          (vlax-3d-point '(0. 0. 0.))
          (vlax-3d-point '(5. 0. 0.))
          ) ;_ end of vla-addline
        (vla-addline
          blk_def
          (vlax-3d-point '(0. 0. 0.))
          (vlax-3d-point (polar '(0. 0. 0.) (/ pi 6.) 5.))
          ) ;_ end of vla-addline
        (vlax-for item blk_def
          (vla-put-color item 0)
          (vla-put-layer item "0")
          (vla-put-lineweight item aclnwtbyblock)
          (vla-put-linetype item "byblock")
          ) ;_ end of vlax-for
        blk_def
        ) ;_ end of lambda
      )
     )
    ) ;_ end of cond
  ) ;_ end of defun
2. Визуальная вставка блока, с указанием направления уклона. Разбивается на 2 подзадачи:
- получение точки. Примерно так:
Код:
[Выделить все]
(defun _me-get-point (start-point msg / res)
  (if (and (listp (setq res (vl-catch-all-apply
                         '(lambda ()
                            (cond (start-point
                                   (getpoint start-point msg)
                                   )
                                  (t (getpoint msg))
                                  ) ;_ end of cond
                            ) ;_ end of lambda
                         ) ;_ end of vl-catch-all-apply
                   ) ;_ end of setq
             ) ;_ end of listp
          res)
;| Отредактировал немного код, сначала не было обработки по Enter
или правому клику мыши |;
    (trans res 1 0)
    nil
    ) ;_ end of if
  ) ;_ end of defun
- получение второй точки, с динамическим отрисовыванием блока. Поскольку тут простой поворот не прокатит, придется использовать (grread) и (grvecs). Своя оболочка обработки ошибок.
3. Вставка блока в указанную точку с соответствующими масштабами и поворотом; возможно, выполнение vla-mirror с вычислением точек оси отражения и удалением исходного блока. Своя обработка ошибок.
4. Создаем функцию-команду, которая последовательно выполняет шаги 1-3. И в ней уже: если и получен указатель на блок, и точка вставки, и значения поворота, выполнить вставку блока.
И вызывать из меню уже п.4. Все это очень подробно расписано в "САПР на базе".
P.S. В п.4 уже может быть свой обработчик ошибок, но не думаю, что в нем будет надобность.
P.P.S. Кстати, можешь посмотреть на вариант применения vl-catch-all-apply
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.10.2007, 22:21 Re: Помогите с отменой действия программы!
#18
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


[quote="Елпанов Евгений"]
Цитата:
Сообщение от 480725
Цитата:
Сообщение от 480725
Цитата:
Сообщение от Елпанов Евгений
Если все проблемы решаются запретом на прерывание работы обработчика, то просто запрети его прерывать и все...
Все не решаются, но многие решатся! Только как это сделать?
например:
Код:
[Выделить все]
(vl-catch-all-apply
 (function твоя-супер-функция)
 (list список аргументов твоей супер функции)
)
У Полещука vl-catch-all-apply невнятно описана.. Но она типа не защитит от прерывания обработчик ошибок, а подменит его..
480725 вне форума  
 
Автор темы   Непрочитано 09.10.2007, 22:45 Re: Помогите с отменой действия программы!
#19
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Кулик Алексей aka kpblc
Цитата:
Сообщение от 480725
В твоих программах это возможно, а в моих нет. План здания без диалога не построить!
Вот интересно, а что там такого в этом плане, что он:
1) строится целиком программно
2) не может быть заменен блоком или дин.блоком (нехай навороченным до ужаса)
:?:
Ты здание в плане прямоугольником представляешь? Может быть любая форма. И план - это не только наружные стены, а еще внутренние прегородки окна и двери.. И все заданных размеров. Но это к делу не относится. Просто принимаем, что необходим набор разных программ. И доступ к командам Автокада. Которые могут прерывать зацикленные программы. Эта среда в которой возникла проблема. Она создавалась много лет, и изменить ее за приемлемое время нельзя, как бы мы этго не хотели. До А2005 проблем не было: Автокад правильно завершали Undo Beg при прерывании. А потом стали блокировать прерванный Undo Beg. Причем единственный программный критерий - системная переменная UNDOCTL принимает аварийное значение не только после прерывания программы, но и после любого срабатывания меню с Автокадской командой. Но отмена портится только при прерывании программы до срабатывании Undo End, а не от срабатывания меню с командой АвтоКАДа, хотя переменная Undoctl в обоих случаях одинаковая.
480725 вне форума  
 
Непрочитано 09.10.2007, 22:48
#20
Кулик Алексей aka kpblc
Moderator

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


Не, что план здания далеко не прямоугольник, я представляю четко. Можно идиотский вопрос: а почему бы не использовать ADT и его методику работы? ИМХО в нем проблем может быть меньше порядка этак на 3 - на 4. Правда, настройка не за 3 минуты...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.10.2007, 23:08 Re: Помогите с отменой действия программы!
#21
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


[quote="Кулик Алексей aka kpblc"]
Цитата:
Сообщение от 480725
ИМХО (подчеркиваю - это лично мое мнение, не больше!) подход в принципе неверен изначально. Намного проще сделать универсальный загрузчик, который прописать внутрь либо acaddoc.lsp, либо (я пошел по второму пути) - в MenuName.mnl. Этот загрузчик загружает в текущий документ все лиспы. Соответственно, допустим, есть лисп отрисовки обозначения (пример "от балды"!) уклона.
Я больше про отмену интересовался.. Свои пару-тройку мегобайт программ я за один раз загружать боюсь.. Если и не затрут одна другую, то просто времени много пожрут на загрузку. Но смысла проблем наличие или отсутствие самой загрузки в загрузчике твой подход не меняет. Тем более не меняет (и не влияет) программа, которая вызывается внутри, пусть и отрисовки обозначения (пример "от балды"!) уклона, единственное достоинство примера, что имеет смысл делать несколько уклонов в цикле и отменять их по одному а не все вместе. А текст этой программы значения не имеет. Т.к. проблемы не в ней. Они одинаково проявляются в всех программах. Кроме того менять все программы - это неприемлемая трудоемкость и неприемлемое время.
480725 вне форума  
 
Автор темы   Непрочитано 09.10.2007, 23:18
#22
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Кулик Алексей aka kpblc
Не, что план здания далеко не прямоугольник, я представляю четко. Можно идиотский вопрос: а почему бы не использовать ADT и его методику работы? ИМХО в нем проблем может быть меньше порядка этак на 3 - на 4. Правда, настройка не за 3 минуты...
Ну как тебе объяснить.. Мне больше нравится моя система чем ADT.
Даже еще четче, моя мне нравится, а ADT - нет. Совсем я стал нескромный..
480725 вне форума  
 
Автор темы   Непрочитано 09.10.2007, 23:30 Re: Помогите с отменой действия программы!
#23
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


[quote="Кулик Алексей aka kpblc"]
Цитата:
Сообщение от 480725
получение второй точки, с динамическим отрисовыванием блока. Поскольку тут простой поворот не прокатит, придется использовать (grread) и (grvecs). Своя оболочка обработки ошибок.
3. Вставка блока в указанную точку с соответствующими масштабами и поворотом; возможно, выполнение vla-mirror с вычислением точек оси отражения и удалением исходного блока. Своя обработка ошибок.
Суть обработчика ошибок в возврате значений системных переменных и других параметров. В том числе завершении группы Undo Beg - Undo end. Индивидуальные особенности ошибки пользователя можно обрабатывать по разному, но эта суть остается всегда: Привести в порядок среду в случае невозможности сделать это в вызываемой программе.
И все работает правильно. Только отмена несколько раз вхолостую выполняется..
480725 вне форума  
 
Непрочитано 09.10.2007, 23:38
#24
Кулик Алексей aka kpblc
Moderator

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


Поскольку проблема проявляется одинаково во всех, то и корни надо рубить в одном месте, а не в сотне. Я не предлагаю прислать мне файлы лиспов - работы слишком много, попросту не смогу посмотреть.
С другой стороны, программистов, которые намного сильнее меня, неимоверное количество. Если ты выложишь файлец сюда, я думаю, его достаточно быстро расковыряют и скажут, что и где неверно и как надо выкручиваться. Хотя кто его знает, как карта ляжет...
Допустим, у тебя задача "нарисовать стену, с привязкой 180, общая ширина 330, материал бетон, точки начала и окончания задаются пользователем". Если идти по моему варианту, код будет примерно таков:
Код:
[Выделить все]
(defun draw-wall-by-user-points (layer-name width att mat / pt_start pt_end res ang)
                 ;|
*    Отрисовка стены
*    Параметры вызова:
	layer-name	имя слоя
	width		ширина стены
	att		привязка
	mat		материал
|;
  (if
    (and
      (setq pt_start (_me-get-point nil "Точка начала стены <Отмена> : "))
      (setq pt_end (_me-get-point pt_start "Точка окончания стены <Отмена> : "))
      ) ;_ end of and
     (progn
          ; ( (42 . 0.0) (10 572.83 373.084) (40 . 0.0) (41 . 0.0) (42 . 0.0)
          ; (10
          ; 410.958 134.589) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0
          ; 1.0))
       (setq ang (angle pt_start pt_end)
             res (entmakex
                   (list (cons 0 "LWPOLYLINE")
                         '(100 . "AcDbEntity")
                         (cons 8 layer-name)
                         '(100 . "AcDbPolyline")
                         '(90 . 4)
                         '(70 . 1)
                         '(43 . 0.)
                         '(38 . 0.)
                         '(39 . 0.)
                         (cons 10 (polar pt_start (- ang (/ pi 2.)) att))
                         (cons 10 (polar pt_end (- ang (/ pi 2.)) att))
                         (cons 10 (polar pt_end (+ ang (/ pi 2.)) (- width att)))
                         (cons 10 (polar pt_start (+ ang (/ pi 2.)) (- width att)))
                         (cons 210 '(0. 0. 1.))
                         ) ;_ end of list
                   ) ;_ end of entmakex
             ) ;_ end of setq
       ) ;_ end of progn
     ) ;_ end of if
  res
  ) ;_ end of defun
Пример вызова:
Код:
[Выделить все]
(draw-wall-by-user-points "qwert" 330. 180. nil)
Материал и обработку штриховки делай сам (если надо, конечно). Ну и, требуется здесь обработчик ошибок или не совсем? ИМХО - он будет только мешаться.
Если понадобится отрисовывать по точкам предопределенным, или по трассе, делаешь отдельную функцию, с передачей либо точек, либо указателя на примитив трассы. От обработчика ошибок зачастую можно безболезненно достаточно отказаться, не прибегая к дополнительным ухищрениям.
P.S. Можешь еще за компанию анализировать значение системной переменной ERRNO - только поможет ли оно, я не знаю.
P.P.S. Чтобы функции не затирали друг друга, надо им давать осмысленные и достаточно уникальные имена.
Цитата:
Даже еще четче, моя мне нравится, а ADT - нет. Совсем я стал нескромный..
Как говорится, вольному - воля (чур, без обид!). Но я б попытался все же наладить ADT - удобств немеряно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.10.2007, 23:54 Re: Помогите с отменой действия программы!
#25
Александр Ривилис

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


Не все осилил - извини. Главное в том, что в вызов обработчика ошибок (функцию *error*) в AutoCAD 2006 и 2007 (в 2008-ом не проверял) внесли ошибку, из-за которой обработка *error*, содержащие функции (comand ...) не выполняется или выполняется с ошибками. И ничего средствами lisp с этим не поделаешь. Это признанный разработчиками баг.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 10.10.2007, 01:13 Re: Помогите с отменой действия программы!
#26
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Александр Ривилис
Не все осилил - извини. Главное в том, что в вызов обработчика ошибок (функцию *error*) в AutoCAD 2006 и 2007 (в 2008-ом не проверял) внесли ошибку, из-за которой обработка *error*, содержащие функции (comand ...) не выполняется или выполняется с ошибками. И ничего средствами lisp с этим не поделаешь. Это признанный разработчиками баг.
Я так и знал, что помощь придет отсюда!
Хоть перестану лбом стену пробивать!
Не удержусь от добрых теплых слов (здесь не приведенных, из-за нехватки места) в адрес разработчиов, они с одной стороны создали проблему, которую без command в *error* особо не решишь, а с другой - сделали невозможным использование command в error. И это в нескольких подряд версиях... Чтож, Автокад пока еще хорош тем. что позволяет решать одну и ту же проблему по разному. Поищем обходы..
480725 вне форума  
 
Непрочитано 10.10.2007, 07:13 Re: Помогите с отменой действия программы!
#27
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от 480725
Поищем обходы..
Да, вместо прямого пути обязательно нужно идти в обход. Правильные пути подсказали несколько раз [9][14][17]. Но автор упорно заблуждается, например:

"План здания без диалога не построить!"

"У Полещука vl-catch-all-apply невнятно описана.. Но она типа не защитит от прерывания обработчик ошибок, а подменит его.."

"...менять все программы - это неприемлемая трудоемкость и неприемлемое время"

"...все работает правильно. Только..."

"...моя мне нравится, а ADT - нет."

Для решения всех проблем с ошибками, а также с отменами необходимо пользоваться современными функциями vl-catch-all-apply, vl-catch-all-error-p, vl-catch-all-error-message. И тогда до *error* дело вообще не дойдет, с ошибками или без них реализована она в Автокаде.

Вот как реализована в ruCAD универсальная защита:

Код:
[Выделить все]
(defun ru-error-catch
       (protected_expression on_error_expression / catch_error_result)
  (setq catch_error_result
         (vl-catch-all-apply protected_expression)
  ) 
  (if (and (vl-catch-all-error-p catch_error_result)
           on_error_expression
      ) 
    (apply on_error_expression
           (list (vl-catch-all-error-message catch_error_result))
    ) 
    catch_error_result
  ) 
)
Применяется примерно так:

Код:
[Выделить все]
(ru-error-catch
    (function (lambda () (выражение_для_защиты)))
    ;;Это выполняется при ошибке
      (function (lambda (msg) (выражение_при_ошибке)))
)
или

Код:
[Выделить все]
(ru-error-catch
    (function (lambda () (выражение_для_защиты)))
	NIL
)
если не требуется никаких действий при ошибке.

Оберните места в коде, где пользователь может сделать попытку прерывания (особенно при вводе), правильно расставьте vla-startundomark и vla-endundomark. Не забывайте про существование ERRNO. Выносите из "программ" в библиотечные функции типовые действия, чтобы не менять "пару-тройку мегобайт программ".

Но можно и "в обход". Дело хозяйское.
ShaggyDoc вне форума  
 
Непрочитано 10.10.2007, 08:06
#28
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


К уже сказанному добавлю только то, что с появлением vl-cmdf о command надо забыть. Приличная часть проблем при этом просто исчезнет. Если код писался без использования некорректных приёмов, то можно сделать глобальную замену "command" -> "vl-cmdf" во всех исходниках (предварительно, конечно заархивировав их текущее состояние).
Alaspher вне форума  
 
Непрочитано 10.10.2007, 09:21
#29
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Alaspher
К уже сказанному добавлю только то, что с появлением vl-cmdf о command надо забыть. Приличная часть проблем при этом просто исчезнет. Если код писался без использования некорректных приёмов, то можно сделать глобальную замену "command" -> "vl-cmdf" во всех исходниках (предварительно, конечно заархивировав их текущее состояние).
Полностью согласен!

PS. у меня маленький вопрос, в своих кодах я смог убрать вообще все "command" и "vl-cmdf" кроме одной ситуации, когда необходимо создать "SPATIAL_FILTER"...
Другими словами, для создания в файле, первого контура подрезки блоков, мне приходится запускать команду "_.xclip", меня это напрягает, но разобраться я так и не смог. Если можете, помогите с алгоритмом. Еще раз поясню задачу, есть файл, в котором ни одного раза не использовалась команда "_.xclip", т.е. в файле нет словаря "SPATIAL" в словарях фильтров или вообще нет самого словаря "ACAD_FILTER". Создавать их возможно, только через entmakex, но я не смог понять всю последовательность и взаимосвязи, всех этих словарей. Вероятно, еще необходимо загрузить в автокад, какие то arx программы, но здесь я опять уперся в стену.
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 10.10.2007, 10:11 Re: Помогите с отменой действия программы!
#30
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от ShaggyDoc
Цитата:
Сообщение от 480725
Поищем обходы..
Да, вместо прямого пути обязательно нужно идти в обход.
Но автор упорно заблуждается...
Т.е. вы вместо системы, которая автоматически фиксирует прерывания пользователя в любом месте программы предлагаете в каждой точке любого запроса (т.к. в других местах прервать программу намного труднее, но потенциально если таковые появятся - то и в них) ставить указания об обработке возможного прерывания. Так?
Мы не используем *error* для анализа ошибок пользователя. У нас есть блок анализа ввода, который минимизирует возможность прерывания программы из-за ошибки, так что бессмысленно анализировать случаи, когда этот фильтр прорвался именно из-за неправильного ввода. Но остается ситуация, когда в ходе работы, выполнив несколько действий человек спохватился и отменяет команду. Начнется с того, что команда прервется. И потребуется действие Undo End если не использовать VLA эквивалент, с которым тоже не все ясно именно с точки зрения прерывания незакрытых отменных скобок.
Чтож, я не спорю, м.б. для вас это хорошо и решает проблему, для нас, возможно, тоже хорошо.. Но по затратам не подходит, извините.
Заметьте, я,
- во первых, пытаюсь вас понять,
- во вторых, аргументирую свое отношение к вашим доводам,
- в третьих, не утверждаю, что вы ошибаетесь или заблуждаетесь,
- в четвертых не абсолютизирую свой опыт
480725 вне форума  
 
Автор темы   Непрочитано 10.10.2007, 10:45 Re: Помогите с отменой действия программы!
#31
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


[quote="ShaggyDoc"]
Цитата:
Сообщение от 480725

Да, вместо прямого пути обязательно нужно идти в обход..
Аналогия с прямым и кривым путем не подходит.
Мы ехали по дороге, впереди длинная пробка и мы высматриваем объезд.
Вы едете по другой дороге и, как бы оцениваете наши поиски объезда с точки зрения вашего маршрута. Вам так дальше. Правильно. Но и нам переместиться на вашу дорогу - ох как неблизко.
И совсем бессмысленное дело - обсуждать чья дорога лучше и правильнее. Раз вы едете по своей - вы в ней уверены. И наоборот..
480725 вне форума  
 
Автор темы   Непрочитано 10.10.2007, 10:52
#32
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Alaspher
К уже сказанному добавлю только то, что с появлением vl-cmdf о command надо забыть. Приличная часть проблем при этом просто исчезнет. Если код писался без использования некорректных приёмов, то можно сделать глобальную замену "command" -> "vl-cmdf" во всех исходниках (предварительно, конечно заархивировав их текущее состояние).
Я думаю многих, в т.ч. меня, заинтересует какие проблемы исчезают.
Пару - тройку, а лучше все, перечислите пожалуйста. Заранее благодарен.
480725 вне форума  
 
Непрочитано 10.10.2007, 10:59 Re: Помогите с отменой действия программы!
#33
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


[quote="480725"]
Цитата:
Сообщение от Елпанов Евгений
Цитата:
Сообщение от 480725
Цитата:
Сообщение от 480725
Цитата:
Сообщение от Елпанов Евгений
Если все проблемы решаются запретом на прерывание работы обработчика, то просто запрети его прерывать и все...
Все не решаются, но многие решатся! Только как это сделать?
например:
Код:
[Выделить все]
(vl-catch-all-apply
 (function твоя-супер-функция)
 (list список аргументов твоей супер функции)
)
У Полещука vl-catch-all-apply невнятно описана.. Но она типа не защитит от прерывания обработчик ошибок, а подменит его..
А как, насчет, самому поэксперементировать или тоже не до этого?
Вот тебе пример вызова моей старенькой программки, по отрисовке часиков и еще одного лиспика, чтоб защитить выполняемую программу от остановки. Попробуй прервать выполнение программы, т.е. остановить показ часиков, раньше, чем пройдет 120 сек...
Код:
[Выделить все]
(defun c:clo (/ s)
 ;;  ElpanovEvgeniy, Russia, Moscow, 2006
 ;;  Timer for test-3dorbit
 ;; (time-3dorbit)
 ;; http://www.theswamp.org/index.php?topic=12382.msg153796;topicseen#msg153796
 ;; « Reply #53 on: 18-09-2006, 15:57:17 »
 (princ "\n tiner set 120 sec ")
 (setq s ((lambda (sec) (+ (* 86400 (- sec (fix sec))) 120)) (getvar "DATE")))
 (while (> s ((lambda (sec) (* 86400 (- sec (fix sec)))) (getvar "DATE")))
  (VL-CATCH-ALL-APPLY (function clo) (list s))
 ) ;_  while
 (princ)
) ;_  defun
(defun clo ( sec / A1 GR I S)
 ;;  ElpanovEvgeniy, Russia, Moscow, 2006
 ;;  Clock that show time in the screen
 ;; http://www.theswamp.org/index.php?topic=8969.0
 ;; « Reply #10 on: 09-09-2006, 11:28:31 »
 (setq a1 (/ pi 30))
 (while (> sec ((lambda (sec) (* 86400 (- sec (fix sec)))) (getvar "DATE")))
  (if (= (car (setq gr (grread nil 5 1))) 5)
   (progn
    (setq s  (/ (getvar "viewsize") 8.)
          gr (trans (cadr gr) 1 3)
          i  0
    ) ;_  setq
    (redraw)
    (grvecs     ;SS
     '(2 (-0.01 0.) (1. 0.))
     ((lambda (a)
       ((lambda (c s x y sc)
         (list (list c (- s) 0. x) (list s c 0. y) (list 0. 0. sc 0.) '(0. 0. 0. 1.))
        ) ;_  lambda
        (* (cos a) s)
        (* (sin a) s)
        (car gr)
        (cadr gr)
        s
       )
      ) ;_  lambda
      (- (/ pi 2.) (* (/ pi 30.) (atof (menucmd "M=$(edtime,$(getvar,date),SS.MSEC)"))))
     )
    ) ;_  grvecs
    (grvecs     ;MM
     '(3
       (-0.01 0.)
       (0.8 0.)
       3
       (-0.01 -0.01)
       (0.6 -0.01)
       3
       (-0.01 0.01)
       (0.6 0.01)
       3
       (-0.01 -0.02)
       (0.4 -0.02)
       3
       (-0.01 0.02)
       (0.4 0.02)
       3
       (0.4 -0.02)
       (0.8 0.)
       3
       (0.4 0.02)
       (0.8 0.)
      )
     ((lambda (a)
       ((lambda (c s x y sc)
         (list (list c (- s) 0. x) (list s c 0. y) (list 0. 0. sc 0.) '(0. 0. 0. 1.))
        ) ;_  lambda
        (* (cos a) s)
        (* (sin a) s)
        (car gr)
        (cadr gr)
        s
       )
      ) ;_  lambda
      (- (/ pi 2.) (* (/ pi 30.) (atoi (menucmd "M=$(edtime,$(getvar,date),MM)"))))
     )
    ) ;_  grvecs
    (grvecs     ;H
     '(1
       (-0.01 0.)
       (0.5 0.)
       1
       (-0.01 -0.01)
       (0.4 -0.01)
       1
       (-0.01 0.01)
       (0.4 0.01)
       1
       (-0.01 -0.02)
       (0.3 -0.02)
       1
       (-0.01 0.02)
       (0.3 0.02)
       1
       (-0.01 -0.03)
       (0.2 -0.03)
       1
       (-0.01 0.03)
       (0.2 0.03)
       1
       (0.2 -0.03)
       (0.5 0.)
       1
       (0.2 0.03)
       (0.5 0.)
      )
     ((lambda (a)
       ((lambda (c s x y sc)
         (list (list c (- s) 0. x) (list s c 0. y) (list 0. 0. sc 0.) '(0. 0. 0. 1.))
        ) ;_  lambda
        (* (cos a) s)
        (* (sin a) s)
        (car gr)
        (cadr gr)
        s
       )
      ) ;_  lambda
      (- (/ pi 2.)
         (* (/ pi 6.)
            (+ (atoi (menucmd "M=$(edtime,$(getvar,date),H)"))
               (/ (atoi (menucmd "M=$(edtime,$(getvar,date),MM)")) 60.)
            ) ;_  +
         ) ;_  *
      ) ;_  -
     )
    ) ;_  grvecs
    (repeat 4
     (grvecs
      '(6
        (0.8 0.)
        (0.82 0.02)
        6
        (0.82 0.02)
        (1. 0.02)
        6
        (1. 0.02)
        (1. -0.02)
        6
        (1. -0.02)
        (0.82 -0.02)
        6
        (0.82 -0.02)
        (0.8 0.)
       )
      ((lambda (c s x y sc)
        (list (list c (- s) 0. x) (list s c 0. y) (list 0. 0. sc 0.) '(0. 0. 0. 1.))
       ) ;_  lambda
       (* (cos (* a1 i)) s)
       (* (sin (* a1 i)) s)
       (car gr)
       (cadr gr)
       s
      )
     ) ;_  grvecs
     (repeat 3
      (grvecs
       '(5
         (1. 0.01)
         (0.92 0.01)
         5
         (1. -0.01)
         (0.92 -0.01)
         5
         (0.92 0.01)
         (0.89 0.)
         5
         (0.92 -0.01)
         (0.89 0.)
        )
       ((lambda (c s x y sc)
         (list (list c (- s) 0. x) (list s c 0. y) (list 0. 0. sc 0.) '(0. 0. 0. 1.))
        ) ;_  lambda
        (* (cos (* a1 i)) s)
        (* (sin (* a1 i)) s)
        (car gr)
        (cadr gr)
        s
       )
      ) ;_  grvecs
      (repeat 5
       (grvecs '(3
                 (-0.25 1.2)
                 (0 1.3)
                 3
                 (0 1.3)
                 (0.25 1.2)
                 3
                 (0.25 1.2)
                 (0 1.1)
                 3
                 (0 1.1)
                 (-0.25 1.2)
                )
               ((lambda (c s x y sc)
                 (list (list c (- s) 0. (+ s s (* s 0.5) x))
                       (list s c 0. y)
                       (list 0. 0. sc 0.)
                       '(0. 0. 0. 1.)
                 ) ;_  list
                ) ;_  lambda
                (* (cos (* a1 i 1)) s)
                (* (sin (* a1 i 1)) s)
                (car gr)
                (cadr gr)
                s
               )
       ) ;_  grvecs
       (grvecs
        '(5 (0.9 0) (1 0)) ; 5 (1.05 -0.9) (1.05 0.9)
        ((lambda (c s x y sc)
          (list (list c (- s) 0. x) (list s c 0. y) (list 0. 0. sc 0.) '(0. 0. 0. 1.))
         ) ;_  lambda
         (* (cos (* a1 i)) s)
         (* (sin (* a1 i)) s)
         (car gr)
         (cadr gr)
         s
        )
       ) ;_  grvecs
       (setq i (1+ i))
      ) ;_  repeat
     ) ;_  repeat
    ) ;_  repeat
   ) ;_  progn
  ) ;_  if
 ) ;_  while
 (redraw)
) ;_  defun
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 10.10.2007, 11:06 Re: Помогите с отменой действия программы!
#34
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Александр Ривилис
Не все осилил - извини. Главное в том, что в вызов обработчика ошибок (функцию *error*) в AutoCAD 2006 и 2007 (в 2008-ом не проверял) внесли ошибку, из-за которой обработка *error*, содержащие функции (comand ...) не выполняется или выполняется с ошибками. И ничего средствами lisp с этим не поделаешь. Это признанный разработчиками баг.
А vl-cmdf не поможет?
480725 вне форума  
 
Автор темы   Непрочитано 10.10.2007, 11:14 Re: Помогите с отменой действия программы!
#35
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Елпанов Евгений
А как, насчет, самому поэксперементировать или тоже не до этого?
Я пятый день только и делаю, что эксперементирую.
Т.к. другого пути нет.
Часики попробую, но это опять решение, которое надо вписывать в каждую программу? Если идти таким путем, то проблем изначально нет. Кроме трудоемкости, в т.ч. проверок. Которая сейчас этот путь перечеркивает.
480725 вне форума  
 
Непрочитано 10.10.2007, 11:19 Re: Помогите с отменой действия программы!
#36
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от 480725
Если идти таким путем, то проблем изначально нет. Кроме трудоемкости, в т.ч. проверок. Которая сейчас этот путь перечеркивает.
Тогда, должен вас разочаровать...
При условии, что вы не собираетесь править свои программы, ваша проблема не имеет решения на вашем уровне!
PS. Под другим уровнем, я имел в виду, исправление ошибок в автокаде и адаптация автокада к вашим программам...
Елпанов Евгений вне форума  
 
Непрочитано 10.10.2007, 11:19
#37
Кулик Алексей aka kpblc
Moderator

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


Можно подумать, я зря попросил в самом начале код показать. Еще раз повторяю - разговор беспредметный без пациента.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2007, 11:20 Re: Помогите с отменой действия программы!
#38
Александр Ривилис

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


Цитата:
Сообщение от 480725
А vl-cmdf не поможет?
В данном случае в *error* замена (command ...) на (vl-cmdf ...) не поможет. Проблема в том, что при отказе (ESC или ^C в меню) срабатывает обработка ошибок, но флаг отказа не снимается и поэтому команды ни при помощи command, ни при помощи vl-cmdf не выполняются. В этом и заключается баг, о котором я писал раньше.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 10.10.2007, 11:26 Re: Помогите с отменой действия программы!
#39
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Елпанов Евгений
Цитата:
Сообщение от 480725
Если идти таким путем, то проблем изначально нет. Кроме трудоемкости, в т.ч. проверок. Которая сейчас этот путь перечеркивает.
Тогда, должен вас разочаровать...
При условии, что вы не собираетесь править свои программы, ваша проблема не имеет решения на вашем уровне!
PS. Под другим уровнем, я имел в виду, исправление ошибок в автокаде и адаптация автокада к вашим программам...
Если ничего не поможет - перепишем программы.. А категорически утверждения мы учитываем, но проверяем. Совсем лоб об стенку прошибать не станем, но пару деньков еще постучим..
480725 вне форума  
 
Автор темы   Непрочитано 10.10.2007, 11:28
#40
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Кулик Алексей aka kpblc
Можно подумать, я зря попросил в самом начале код показать. Еще раз повторяю - разговор беспредметный без пациента.
Мы обещали: или сообщим найденное решение, или выложим простой код, который легко воспроизведется на любом АвтоКАДе!
480725 вне форума  
 
Автор темы   Непрочитано 10.10.2007, 11:29 Re: Помогите с отменой действия программы!
#41
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Александр Ривилис
Цитата:
Сообщение от 480725
А vl-cmdf не поможет?
В данном случае в *error* замена (command ...) на (vl-cmdf ...) не поможет. Проблема в том, что при отказе (ESC или ^C в меню) срабатывает обработка ошибок, но флаг отказа не снимается и поэтому команды ни при помощи command, ни при помощи vl-cmdf не выполняются. В этом и заключается баг, о котором я писал раньше.
Я так и думал.. Просто отсек последние сомнения.
480725 вне форума  
 
Непрочитано 10.10.2007, 11:31
#42
Кулик Алексей aka kpblc
Moderator

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


Так я ж прошу не простой код, а тот, который порождает проблемы. Хотя дело хозяйское...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2007, 11:36 Re: Помогите с отменой действия программы!
#43
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от 480725
Совсем лоб об стенку прошибать не станем, но пару деньков еще постучим..
До встречи, послезавтра...
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 10.10.2007, 11:45 Re: Помогите с отменой действия программы!
#44
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Елпанов Евгений
Цитата:
Сообщение от 480725
Совсем лоб об стенку прошибать не станем, но пару деньков еще постучим..
До встречи, послезавтра...
Ку!
480725 вне форума  
 
Непрочитано 10.10.2007, 11:52
#45
Александр Ривилис

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


На всякий случай ответ Kean Walmsley (Autodesk Developer Technical Services) на мой запрос:

Цитата:
Hi Alexander,

This is very strange - the *error* function no longer appears to support the use of (command) (whether on its own or with arguments). I have submitted a change request for this functionality.

In the meantime, you can use a workaround as show in the attached file, using COM functions to call the commands you wish. It's not ideal, as these strings do not then respect CMDECHO, but it does function as you'd expect:

(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat (chr 27)(chr 27)"_.undo _e _.u "))
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 10.10.2007, 12:02
#46
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Александр Ривилис
На всякий случай ответ Kean Walmsley (Autodesk Developer Technical Services) на мой запрос:

Цитата:
Hi Alexander,

This is very strange - the *error* function no longer appears to support the use of (command) (whether on its own or with arguments). I have submitted a change request for this functionality.

In the meantime, you can use a workaround as show in the attached file, using COM functions to call the commands you wish. It's not ideal, as these strings do not then respect CMDECHO, but it does function as you'd expect:

(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat (chr 27)(chr 27)"_.undo _e _.u "))
Я не силен в английском, но он, как видно предлагал какое-то решение.. Оно помогло?
480725 вне форума  
 
Непрочитано 10.10.2007, 12:12
#47
Александр Ривилис

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


Решение в последней строке. Т.е. в *error* вместо:
Код:
[Выделить все]
(command "_.undo" "_e" "_.u")
использовать:
Код:
[Выделить все]
(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat (chr 27)(chr 27)"_.undo _e _.u "))
Недостаток - эхо в командной строке.
Александр Ривилис вне форума  
 
Непрочитано 10.10.2007, 13:59
#48
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от 480725
Цитата:
Сообщение от Alaspher
К уже сказанному добавлю только то, что с появлением vl-cmdf о command надо забыть. Приличная часть проблем при этом просто исчезнет. Если код писался без использования некорректных приёмов, то можно сделать глобальную замену "command" -> "vl-cmdf" во всех исходниках (предварительно, конечно заархивировав их текущее состояние).
Я думаю многих, в т.ч. меня, заинтересует какие проблемы исчезают.
Пару - тройку, а лучше все, перечислите пожалуйста. Заранее благодарен.
Не думаю, что так уж и многих это интересует - никаких тайн тут нет - всё описано в документации. Основное, это то, что vl-cmdf не передаёт на выполнение аргументы если они имеют некорректный тип и то, что она прерывается при возникновении ошибок выполнения команды и по Esc не в ошибку, а в тихий nil, что позволяет писать более безопасный код. А в сочетании с некоторыми приёмами, которые тут уже многократно упоминались, практически избавиться от использования *error*.
Alaspher вне форума  
 
Автор темы   Непрочитано 10.10.2007, 14:01
#49
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Александр Ривилис
Решение в последней строке. Т.е. в *error* вместо:
Код:
[Выделить все]
(command "_.undo" "_e" "_.u")
использовать:

Недостаток - эхо в командной строке.
В варианте Kean Walmsley (Autodesk Developer Technical Services)
сразу после закрытия группы выполняется и отмена этой группы. А обработчиу ошибок должен только закрывать группу, а не отменять ее. Хотя.. Интересная идея! Если мы прервали посредине группы отмены, т.е. заведомо отказавшись от завершения неразрывного действия, то зачем нам его начало.. Остается проблема, что undocnl >=8 бывает не не только при прерывании незакрытой группы отмены. А при выплонении любой команды АвтоКАДа из меню. В общем такое крутое решение надо обдумать.. Может вы и на этот вопрос знаете ответ?

К о л и т е с ь!

Попробовал видоизменить только не закрытие группы:

Код:
[Выделить все]
(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat (chr 27)(chr 27)"_.undo _e "))
И все получилось! Проверял пока только в командной строке.. Но думаю и в *error* проблем не будет
Слава, слава AutoDesk-у, слава добрым докторам! И вам, вытянувшему у AutoDesk-а эту информацию! И поделившемуся ею со всеми!
480725 вне форума  
 
Непрочитано 10.10.2007, 14:08
#50
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от 480725
И вам, вытянувшему у AutoDesk-а эту информацию! И поделившемуся ею со всеми!
Это было больше года назад, все пояснения и уточнения лежат в открытом доступе, на форуме autocad.ru, правда сам форум пока лежит... Видимо, Денис в отпуске...
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 10.10.2007, 14:14
#51
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Alaspher
Цитата:
Сообщение от 480725
Цитата:
Сообщение от Alaspher
К уже сказанному добавлю только то, что с появлением vl-cmdf о command надо забыть. Приличная часть проблем при этом просто исчезнет. Если код писался без использования некорректных приёмов, то можно сделать глобальную замену "command" -> "vl-cmdf" во всех исходниках (предварительно, конечно заархивировав их текущее состояние).
Я думаю многих, в т.ч. меня, заинтересует какие проблемы исчезают.
Пару - тройку, а лучше все, перечислите пожалуйста. Заранее благодарен.
Не думаю, что так уж и многих это интересует - никаких тайн тут нет - всё описано в документации. Основное, это то, что vl-cmdf не передаёт на выполнение аргументы если они имеют некорректный тип и то, что она прерывается при возникновении ошибок выполнения команды и по Esc не в ошибку, а в тихий nil, что позволяет писать более безопасный код. А в сочетании с некоторыми приёмами, которые тут уже многократно упоминались, практически избавиться от использования *error*.
Это шире и подробнее, чем в описании.
Я попробую ее в работе, а потом отвечу.. Обязательно.
480725 вне форума  
 
Автор темы   Непрочитано 10.10.2007, 14:20
#52
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от 480725
Цитата:
Сообщение от Александр Ривилис
Попробовал видоизменить только не закрытие группы:
Опечатка! Должно быть:
Попробовал видоизменить только НА закрытие группы:
480725 вне форума  
 
Непрочитано 10.10.2007, 14:38
#53
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от 480725
Попробовал видоизменить только не закрытие группы:

Код:
[Выделить все]
(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat (chr 27)(chr 27)"_.undo _e "))
Код:
[Выделить все]
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2007, 14:43
#54
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Елпанов Евгений
Цитата:
Сообщение от 480725
И вам, вытянувшему у AutoDesk-а эту информацию! И поделившемуся ею со всеми!
Это было больше года назад, все пояснения и уточнения лежат в открытом доступе, на форуме autocad.ru, правда сам форум пока лежит... Видимо, Денис в отпуске...
Про Дениса не знаю, а форум - точно в отпуске!
480725 вне форума  
 
Автор темы   Непрочитано 10.10.2007, 14:49
#55
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Кулик Алексей aka kpblc
Цитата:
Сообщение от 480725
[/code]
Код:
[Выделить все]
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
Неочевидно как это будет работать, если группа отмены открыта командой!
480725 вне форума  
 
Непрочитано 10.10.2007, 14:53
#56
Кулик Алексей aka kpblc
Moderator

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


А кто заставляет использовать команды? Еще же в самом начале сказали как поступать...
Код:
[Выделить все]
(defun mainfunc( / doc *error*)
(defun *error*(msg)
(vla-endundomark adoc)
(princ msg)
(princ)
)
(vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
; Выполняемый код
(vla-endundomark adoc)
(princ))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2007, 15:34
#57
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Кулик Алексей aka kpblc
А кто заставляет использовать команды? Еще же в самом начале сказали как поступать...
Код:
[Выделить все]
(defun mainfunc( / doc *error*)
(defun *error*(msg)
(vla-endundomark adoc)
(princ msg)
(princ)
)
(vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
; Выполняемый код
(vla-endundomark adoc)
(princ))
Я же писал. Программы уже есть. И во всех стоит command!
Речь не о написании новой системы, а о приспособлении старой к ошибке в АвтоКАДе. Переделывать все - быстро не получится. А обработчик прерываний - помучаемся, но разберемся и сделаем за пару дней!
480725 вне форума  
 
Непрочитано 10.10.2007, 15:42
#58
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от 480725
Я же писал. Программы уже есть. И во всех стоит command!
Речь не о написании новой системы, а о приспособлении старой к ошибке в АвтоКАДе. Переделывать все - быстро не получится. А обработчик прерываний - помучаемся, но разберемся и сделаем за пару дней!
И потом потратить неделю на внесение измененного варианта во все лиспы. А потом найти еще чего-то и снова тратить неделю. Не, я на такое не согласный...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2007, 15:58 Re: Помогите с отменой действия программы!
#59
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Елпанов Евгений
Вот тебе пример вызова моей старенькой программки, по отрисовке часиков и еще одного лиспика, чтоб защитить выполняемую программу от остановки. Попробуй прервать выполнение программы, т.е. остановить показ часиков, раньше, чем пройдет 120 сек...
Класс! Действительно, только что молотком по экрану не стучал, 120 секунд стоит. И часики красивые, не ожидал! Мелкие недочеты (стрелка секундная буксует, если не возить циферблат по экрану) списываем надавность разработки и связанную с ней возможную подмену версии, или вообще, на оригинальную задумку автора.
Но к тому, что о тебе известно, она не способна ничего прибавить.
Действительно, на фоне твоих достижений (и только на нем) - это - программка.

Только ведь прерывание придумано чтобы прерывать.
А обработчик прерываний должен восстановить среду. Т.к. Программы при вызове сами могут восстановить среду, а команды АвтоКАДа, не могут.
480725 вне форума  
 
Автор темы   Непрочитано 10.10.2007, 16:13
#60
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Кулик Алексей aka kpblc
Цитата:
Сообщение от 480725
Я же писал. Программы уже есть. И во всех стоит command!
Речь не о написании новой системы, а о приспособлении старой к ошибке в АвтоКАДе. Переделывать все - быстро не получится. А обработчик прерываний - помучаемся, но разберемся и сделаем за пару дней!
И потом потратить неделю на внесение измененного варианта во все лиспы. А потом найти еще чего-то и снова тратить неделю. Не, я на такое не согласный...
Так я же тебя не заставляю. А мне лучше решить проблему быстро.
Т.к. проблема в ошибке Автокада, а не в лиспах. Они уже много поработали.. И все в них, в основном, уже нашли. Когда добрый Автодеск еще проблемки подкинет, тоже попытаемся за пару дней решить, а не за недели..
480725 вне форума  
 
Непрочитано 10.10.2007, 16:13
#61
Кулик Алексей aka kpblc
Moderator

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


http://dwg.ru/forum/viewtopic.php?t=...r=asc&start=26
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2007, 19:10
#62
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Александр Ривилис
На всякий случай ответ Kean Walmsley (Autodesk Developer Technical Services) на мой запрос:

Цитата:
Hi Alexander,

This is very strange - the *error* function no longer appears to support the use of (command) (whether on its own or with arguments). I have submitted a change request for this functionality.

In the meantime, you can use a workaround as show in the attached file, using COM functions to call the commands you wish. It's not ideal, as these strings do not then respect CMDECHO, but it does function as you'd expect:

(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat (chr 27)(chr 27)"_.undo _e _.u "))
В любой программе, не только в *error* после этого оператора уже ничего больше не выполняется.. Зря я славил автодеск. перевелись добрые доктора.. А из командной строки нормально работала..
480725 вне форума  
 
Непрочитано 10.10.2007, 19:14
#63
Александр Ривилис

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


Цитата:
Сообщение от 480725
В любой программе, не только в *error* после этого оператора уже ничего больше не выполняется.. Зря я славил автодеск. перевелись добрые доктора.. А из командной строки нормально работала..
Ты видимо чего-то не допонял. Эта строка посылается в командную строку и выполняется после (!!!) завершения lisp-программы, когда AutoCAD находтся в "ждущем" режиме. Поэтому в *error* этот код работает, но выполнен он будет только после всех остальных действий, когда они будут завершены.
И еще. Пока форум autocad.ru работает посмотри: http://www.autocad.ru/cgi-bin/f1/board.cgi?t=25986kt
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 10.10.2007, 20:43
#64
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Александр Ривилис
Цитата:
Сообщение от 480725
В любой программе, не только в *error* после этого оператора уже ничего больше не выполняется.. Зря я славил автодеск. перевелись добрые доктора.. А из командной строки нормально работала..
Ты видимо чего-то не допонял. Эта строка посылается в командную строку и выполняется после (!!!) завершения lisp-программы, когда AutoCAD находтся в "ждущем" режиме. Поэтому в *error* этот код работает, но выполнен он будет только после всех остальных действий, когда они будут завершены.
И еще. Пока форум autocad.ru работает посмотри: http://www.autocad.ru/cgi-bin/f1/board.cgi?t=25986kt
Интернет ломался. Два раза терял ответ.
Ты конечно прав. Но из-за неправильной интерпритации причины я не описал эффект до конца. Прерываю программу вызовм из меню команды отрезок. Программа прервалась а отрезок не вызвался. Повторное обращение к меню нормально вызывает отрезок. Т.е. виновата *ERROR* там только восстановление слоя и твой оператор.
480725 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите с отменой действия программы!

Размещение рекламы