|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
09.10.2007, 18:05 | #1 | |
Помогите с отменой действия программы!
Москва
Регистрация: 06.10.2007
Сообщений: 132
|
||
Просмотров: 9865
|
|
||||
Регистрация: 14.03.2006
Сообщений: 863
|
по первому у вас обработчик недоработан скорее всего здесь кое какие нюансы показаны
по второму могу предложить опции mark и back для команды undo |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
0. Чтобы у пользователя не возникало нездоровое желание выбирать меню, можно поставить прогресс-бар (вроде тоже на аркаде обсуждалось).
1, 2 и далее: желательно увидеть код, чтобы можно было сказать более конкретно. Если создаются временные примитивы, достаточно перед работой функции запомнить последний созданный (entlast), и все, что после него, сносить. Короче, код - в студию!
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
_mark и _back не помогают - до восьми раз приходится повторять отмену в некоторых случаях, а дисбаланс в сторону _back приведет к отмене всего сеанса работы. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
Так код покажи - ИМХО там можно обойти эти ограничения.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
|
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
"Ладно, папа, пойдем длинным путем" (с)
Опиши, что код должен делать. Может, что и придумается.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Цитата:
Цитата:
При таком подходе, время изменения чертежа мало и его можно обернуть непрерываемой оберткой, а все остальное время, сам чертеж неизменен... Кстати, я не пользуюсь сложными обработчиками ошибок, мне достаточно восстанавливать пару - тройку переменных, которые я изменял во время работы для удобства пользователя... |
||||
|
||||
Забыл добавить, более конкретные советы могут быть только с кодом...
Вы нам пример, который демонстрирует проблему, мы вам пример ее решения. Ваше замечание о размере кода, более чем уместное - чем короче будет ваш пример, тем больше времени будет потрачено на задачу... Мало кто посвятит вашей проблеме, более 10 минут. |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
Еще одно - состояние слоев в обработчик засунуть Кстати, обойтись без временных построений не всегда возможно, но получить указатели на них - не проблема совершенно. К сожалению, пока кода (ну или хотя бы описалова для него) не видно, разговор беспредметный ИМХО.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
[quote="480725"]
Цитата:
|
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
[quote="480725"]
Цитата:
|
|||
|
||||
[quote="480725"]
Цитата:
Код:
|
||||
|
||||
Цитата:
Скорее наоборот, в моих проектах нет стандартных диалогов и стандартных команд автокада, пользователь запускает утром мою программу и в этой оболочке работает до вечера. Но внутри моей оболочки есть и диалоги и клавиатурные сочетания и контекстное меню... |
||||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
В моих пунктах меню стоит загрузчик програм с обращением к конкретному в каждом случае Лиспу. Вначале он запускает UNDO BEGIN (впредь пишу просто Beg) Затем проверяет и подчищает системные переменные Затем загружает программу, если она не в памяти и выполняет ее. Программа с самоценными циклами тоже может содержать _Beg и _End, чтобы можно было отменять по частям. После выполнения программы загрузчик обрабатвывает системные переменные и выполняет UNDO END Обработчик ошибок дублирует заключительную часть загрузчика На случай сбоев в обработчике, в моем меню стоит модифицированная отмена Она вначале Проверяет UNDOCTL и при необходимости запускает _UNDO _End Потом выполняет отмену. Проблемы описаны в первом сообщении. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
Цитата:
1) строится целиком программно 2) не может быть заменен блоком или дин.блоком (нехай навороченным до ужаса) :?: Цитата:
Разбиваем его на подзадачи: 1. Создать (или получить) указатель на блок уклона. Внутри блока нарисовать отрезки, атрибут. Задача номер раз, код примерно таков (без добавления атрибута, уже непринципиально): Код:
- получение точки. Примерно так: Код:
3. Вставка блока в указанную точку с соответствующими масштабами и поворотом; возможно, выполнение vla-mirror с вычислением точек оси отражения и удалением исходного блока. Своя обработка ошибок. 4. Создаем функцию-команду, которая последовательно выполняет шаги 1-3. И в ней уже: если и получен указатель на блок, и точка вставки, и значения поворота, выполнить вставку блока. И вызывать из меню уже п.4. Все это очень подробно расписано в "САПР на базе". P.S. В п.4 уже может быть свой обработчик ошибок, но не думаю, что в нем будет надобность. P.P.S. Кстати, можешь посмотреть на вариант применения vl-catch-all-apply
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
[quote="Елпанов Евгений"]
Цитата:
|
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
Не, что план здания далеко не прямоугольник, я представляю четко. Можно идиотский вопрос: а почему бы не использовать ADT и его методику работы? ИМХО в нем проблем может быть меньше порядка этак на 3 - на 4. Правда, настройка не за 3 минуты...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
[quote="Кулик Алексей aka kpblc"]
Цитата:
|
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
Даже еще четче, моя мне нравится, а ADT - нет. Совсем я стал нескромный.. |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
[quote="Кулик Алексей aka kpblc"]
Цитата:
И все работает правильно. Только отмена несколько раз вхолостую выполняется.. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
Поскольку проблема проявляется одинаково во всех, то и корни надо рубить в одном месте, а не в сотне. Я не предлагаю прислать мне файлы лиспов - работы слишком много, попросту не смогу посмотреть.
С другой стороны, программистов, которые намного сильнее меня, неимоверное количество. Если ты выложишь файлец сюда, я думаю, его достаточно быстро расковыряют и скажут, что и где неверно и как надо выкручиваться. Хотя кто его знает, как карта ляжет... Допустим, у тебя задача "нарисовать стену, с привязкой 180, общая ширина 330, материал бетон, точки начала и окончания задаются пользователем". Если идти по моему варианту, код будет примерно таков: Код:
Код:
Если понадобится отрисовывать по точкам предопределенным, или по трассе, делаешь отдельную функцию, с передачей либо точек, либо указателя на примитив трассы. От обработчика ошибок зачастую можно безболезненно достаточно отказаться, не прибегая к дополнительным ухищрениям. P.S. Можешь еще за компанию анализировать значение системной переменной ERRNO - только поможет ли оно, я не знаю. P.P.S. Чтобы функции не затирали друг друга, надо им давать осмысленные и достаточно уникальные имена. Цитата:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Не все осилил - извини. Главное в том, что в вызов обработчика ошибок (функцию *error*) в AutoCAD 2006 и 2007 (в 2008-ом не проверял) внесли ошибку, из-за которой обработка *error*, содержащие функции (comand ...) не выполняется или выполняется с ошибками. И ничего средствами lisp с этим не поделаешь. Это признанный разработчиками баг.
|
||||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
Хоть перестану лбом стену пробивать! Не удержусь от добрых теплых слов (здесь не приведенных, из-за нехватки места) в адрес разработчиов, они с одной стороны создали проблему, которую без command в *error* особо не решишь, а с другой - сделали невозможным использование command в error. И это в нескольких подряд версиях... Чтож, Автокад пока еще хорош тем. что позволяет решать одну и ту же проблему по разному. Поищем обходы.. |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
"План здания без диалога не построить!" "У Полещука vl-catch-all-apply невнятно описана.. Но она типа не защитит от прерывания обработчик ошибок, а подменит его.." "...менять все программы - это неприемлемая трудоемкость и неприемлемое время" "...все работает правильно. Только..." "...моя мне нравится, а ADT - нет." Для решения всех проблем с ошибками, а также с отменами необходимо пользоваться современными функциями vl-catch-all-apply, vl-catch-all-error-p, vl-catch-all-error-message. И тогда до *error* дело вообще не дойдет, с ошибками или без них реализована она в Автокаде. Вот как реализована в ruCAD универсальная защита: Код:
Код:
Код:
Оберните места в коде, где пользователь может сделать попытку прерывания (особенно при вводе), правильно расставьте vla-startundomark и vla-endundomark. Не забывайте про существование ERRNO. Выносите из "программ" в библиотечные функции типовые действия, чтобы не менять "пару-тройку мегобайт программ". Но можно и "в обход". Дело хозяйское. |
|||
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
К уже сказанному добавлю только то, что с появлением vl-cmdf о command надо забыть. Приличная часть проблем при этом просто исчезнет. Если код писался без использования некорректных приёмов, то можно сделать глобальную замену "command" -> "vl-cmdf" во всех исходниках (предварительно, конечно заархивировав их текущее состояние).
|
|||
|
||||
Цитата:
PS. у меня маленький вопрос, в своих кодах я смог убрать вообще все "command" и "vl-cmdf" кроме одной ситуации, когда необходимо создать "SPATIAL_FILTER"... Другими словами, для создания в файле, первого контура подрезки блоков, мне приходится запускать команду "_.xclip", меня это напрягает, но разобраться я так и не смог. Если можете, помогите с алгоритмом. Еще раз поясню задачу, есть файл, в котором ни одного раза не использовалась команда "_.xclip", т.е. в файле нет словаря "SPATIAL" в словарях фильтров или вообще нет самого словаря "ACAD_FILTER". Создавать их возможно, только через entmakex, но я не смог понять всю последовательность и взаимосвязи, всех этих словарей. Вероятно, еще необходимо загрузить в автокад, какие то arx программы, но здесь я опять уперся в стену. |
||||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
Мы не используем *error* для анализа ошибок пользователя. У нас есть блок анализа ввода, который минимизирует возможность прерывания программы из-за ошибки, так что бессмысленно анализировать случаи, когда этот фильтр прорвался именно из-за неправильного ввода. Но остается ситуация, когда в ходе работы, выполнив несколько действий человек спохватился и отменяет команду. Начнется с того, что команда прервется. И потребуется действие Undo End если не использовать VLA эквивалент, с которым тоже не все ясно именно с точки зрения прерывания незакрытых отменных скобок. Чтож, я не спорю, м.б. для вас это хорошо и решает проблему, для нас, возможно, тоже хорошо.. Но по затратам не подходит, извините. Заметьте, я, - во первых, пытаюсь вас понять, - во вторых, аргументирую свое отношение к вашим доводам, - в третьих, не утверждаю, что вы ошибаетесь или заблуждаетесь, - в четвертых не абсолютизирую свой опыт |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
[quote="ShaggyDoc"]
Цитата:
Мы ехали по дороге, впереди длинная пробка и мы высматриваем объезд. Вы едете по другой дороге и, как бы оцениваете наши поиски объезда с точки зрения вашего маршрута. Вам так дальше. Правильно. Но и нам переместиться на вашу дорогу - ох как неблизко. И совсем бессмысленное дело - обсуждать чья дорога лучше и правильнее. Раз вы едете по своей - вы в ней уверены. И наоборот.. |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
Пару - тройку, а лучше все, перечислите пожалуйста. Заранее благодарен. |
|||
|
|||||
[quote="480725"]
Цитата:
Вот тебе пример вызова моей старенькой программки, по отрисовке часиков и еще одного лиспика, чтоб защитить выполняемую программу от остановки. Попробуй прервать выполнение программы, т.е. остановить показ часиков, раньше, чем пройдет 120 сек... Код:
|
|||||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
|
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
Т.к. другого пути нет. Часики попробую, но это опять решение, которое надо вписывать в каждую программу? Если идти таким путем, то проблем изначально нет. Кроме трудоемкости, в т.ч. проверок. Которая сейчас этот путь перечеркивает. |
|||
|
||||
Цитата:
При условии, что вы не собираетесь править свои программы, ваша проблема не имеет решения на вашем уровне! PS. Под другим уровнем, я имел в виду, исправление ошибок в автокаде и адаптация автокада к вашим программам... |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
Можно подумать, я зря попросил в самом начале код показать. Еще раз повторяю - разговор беспредметный без пациента.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Цитата:
|
||||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
|
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
|
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
Так я ж прошу не простой код, а тот, который порождает проблемы. Хотя дело хозяйское...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
На всякий случай ответ Kean Walmsley (Autodesk Developer Technical Services) на мой запрос:
Цитата:
|
||||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
|
|||
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Цитата:
|
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
сразу после закрытия группы выполняется и отмена этой группы. А обработчиу ошибок должен только закрывать группу, а не отменять ее. Хотя.. Интересная идея! Если мы прервали посредине группы отмены, т.е. заведомо отказавшись от завершения неразрывного действия, то зачем нам его начало.. Остается проблема, что undocnl >=8 бывает не не только при прерывании незакрытой группы отмены. А при выплонении любой команды АвтоКАДа из меню. В общем такое крутое решение надо обдумать.. Может вы и на этот вопрос знаете ответ? К о л и т е с ь! Попробовал видоизменить только не закрытие группы: Код:
Слава, слава AutoDesk-у, слава добрым докторам! И вам, вытянувшему у AutoDesk-а эту информацию! И поделившемуся ею со всеми! |
|||
|
||||
Цитата:
|
||||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
Я попробую ее в работе, а потом отвечу.. Обязательно. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
Цитата:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
А кто заставляет использовать команды? Еще же в самом начале сказали как поступать...
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
Речь не о написании новой системы, а о приспособлении старой к ошибке в АвтоКАДе. Переделывать все - быстро не получится. А обработчик прерываний - помучаемся, но разберемся и сделаем за пару дней! |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
Цитата:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
Но к тому, что о тебе известно, она не способна ничего прибавить. Действительно, на фоне твоих достижений (и только на нем) - это - программка. Только ведь прерывание придумано чтобы прерывать. А обработчик прерываний должен восстановить среду. Т.к. Программы при вызове сами могут восстановить среду, а команды АвтоКАДа, не могут. |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
Т.к. проблема в ошибке Автокада, а не в лиспах. Они уже много поработали.. И все в них, в основном, уже нашли. Когда добрый Автодеск еще проблемки подкинет, тоже попытаемся за пару дней решить, а не за недели.. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,847
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
|
|||
|
||||
Цитата:
И еще. Пока форум autocad.ru работает посмотри: http://www.autocad.ru/cgi-bin/f1/board.cgi?t=25986kt |
||||
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
Ты конечно прав. Но из-за неправильной интерпритации причины я не описал эффект до конца. Прерываю программу вызовм из меню команды отрезок. Программа прервалась а отрезок не вызвался. Повторное обращение к меню нормально вызывает отрезок. Т.е. виновата *ERROR* там только восстановление слоя и твой оператор. |
|||