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

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

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

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

Несколько программ вызываются каждая из своего пункта меню и производят зацикленные операции. Хотя нормальное завершение и предусмотрено, велика вероятность, что пользователь прервет программу вызовом другого пункта меню.
В этои сдучае оператор (command"_.undo""_begin") остается незавершенным и приходится в обработчик ошибок ставить анализ системной переменной UNDOCNL, т.к. иначе отмена вообще блокируется
При эксплуатации выявились две проблемы:
1) Если обработчик ошибок вовремя не сработал, а такое случается иногда т.к. какие-то действия пользователей способны вызвать прерывание работы самого обраработчика, то оператор (command"_.undo""_end") запущенный не сразу после работы программы, а после выполнения, например, каких-то построений в Автокаде, приведет в случае отмены одновременную отмену и результатов программы и этих построений.
2) Возникает масса ложных необходимостей выполнения (command"_.undo""_end") т.к. обращение к любой команде Автокада в меню устанавливает в переменной UNDOCTL признак незавершенности группы отмены. Предположительно из-за этого резко возрастает количество неоходимых операторов отмены (значительно более одного на одну операцию или программу), при этом результпт работы программы отменяется все-таки одним оператором, а не по частям, просто много операторв отмены расходуются вхолостую.
Думаю, виноват все-таки АвтоКАД, но может кто-то нашел решение.
Помогите!
Просмотров: 10255
 
Автор темы   Непрочитано 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
С.-Петербург
Сообщений: 40,406


Поскольку проблема проявляется одинаково во всех, то и корни надо рубить в одном месте, а не в сотне. Я не предлагаю прислать мне файлы лиспов - работы слишком много, попросту не смогу посмотреть.
С другой стороны, программистов, которые намного сильнее меня, неимоверное количество. Если ты выложишь файлец сюда, я думаю, его достаточно быстро расковыряют и скажут, что и где неверно и как надо выкручиваться. Хотя кто его знает, как карта ляжет...
Допустим, у тебя задача "нарисовать стену, с привязкой 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,413
Отправить сообщение для Александр Ривилис с помощью 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,372


Цитата:
Сообщение от 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
С.-Петербург
Сообщений: 40,406


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

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью 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 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите с отменой действия программы!

Опции темы Поиск в этой теме
Поиск в этой теме:

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