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

Вернуться   Форум 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 признак незавершенности группы отмены. Предположительно из-за этого резко возрастает количество неоходимых операторов отмены (значительно более одного на одну операцию или программу), при этом результпт работы программы отменяется все-таки одним оператором, а не по частям, просто много операторв отмены расходуются вхолостую.
Думаю, виноват все-таки АвтоКАД, но может кто-то нашел решение.
Помогите!
Просмотров: 9855
 
Непрочитано 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,844


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,844


Так код покажи - ИМХО там можно обойти эти ограничения.
__________________
Моя библиотека 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,844


"Ладно, папа, пойдем длинным путем" (с)
Опиши, что код должен делать. Может, что и придумается.
__________________
Моя библиотека 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,844


Еще одно - состояние слоев в обработчик засунуть Кстати, обойтись без временных построений не всегда возможно, но получить указатели на них - не проблема совершенно. К сожалению, пока кода (ну или хотя бы описалова для него) не видно, разговор беспредметный ИМХО.
__________________
Моя библиотека 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,844


Цитата:
Сообщение от 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,844


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

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