Команда undo в автокаде
При некоторых условиях необходимо, чтобы AutoCAD не записывал файл отмены каких-либо действий. Ну, например, возьмем полилинию с 50-60 тыс.вершин, разобьем ее и потом вызовем _.pedit (пример честно спер у А.Ривилиса ;)). В результате файл отмены (это который UNDO.AC$) достигнет невероятных размеров и AutoCAD просто откажется дальше жить. Можно придумать или вспомнить еще массу примеров, но лечить как-то надо.
На помощь приходит системная переменная UNDOCTL. Ну, точнее, не совсем приходит - переменная-то ReadOnly. Впрямую ее поменять нельзя.
Параметр хранится в виде битового кода, использующего сумму следующих значений.
0 Команда ОТМЕНИТЬ отключена 1 Команда ОТМЕНИТЬ включена 2 Можно отменить только одну команду 4 Включен параметр "Авто" 8 Группа в настоящий момент активна 16 Операции зумирования и панорамирования группируются в одно действие 32 Операции со свойствами слоев группируются в одно действие
Переменная не сохраняется и имеет значение по умолчанию 53. Нам же (ну, по крайней мере теоретически) достаточно снять все значения, кроме 16 и 32. Для этого достаточно выполнить последовательность команд:
А для восстановления
К сожалению, такой вариант означает невозможность впрямую обрабатывать undoctl внутри командных реакторов, ведь там невозможно выполнять команды. Единственный вариант "обхода" - это использование SendStringToExecute, но об этом как-нибудь в другой раз.
Похожее
Комментарии
Небольшое уточнение. По поводу _PEDIT и бесконечно разрастающегося файла UNDO - этот факт был проверен в AutoCAD 2008 SP1. И такая ситуация возникала при установленной системной переменной PLINETYPE = 0, т.е. создаётся не облегченная, а 2D-полилиния. Проблема скорее все связана с многократным созданием/удалением вершин полилинии, которые в этом типе полилинии являются отдельными примитивами. Кстати, максимальный размер файла UNDO равен 2Гбайтам.
Добрый вечер! Подскажите, пожалуйста, есть ли какая-нибудь возможность изменения системной переменной UNDOCTL через лисп. Попробовала в командной в программе написать такую строку (command "_undo" "_control" "_none"), но это не поменяло значение системной переменной. Хотя если эту последовательность делать просто из командной строки - все прекрасно меняется.
Может так: (command "_.undo" "_none")
?
P.S.: Леша. Блог заменяет двойные кавычки на двойной апостроф.
При копировании в vlide получаю только в третьем варианте не нормальные двойные кавычки, а преобразованные. Завтра попробую выяснить, в чем кроется источник проблемы. Спасибо
Получилось, но не совсем как надо. Может я более подробно опишу свою проблему.
У меня есть программа, которая удаляет все одинаковые блоки из чертежа, в том числе блоки из блоков. Так вот мне нужно описать функцию отмены, если вдруг блок был удален не тот, который надо. Обычной командой UNDO отмену сделать не получается. Если из командной строки написать _undo _control _one, а затем _undo 1, то удаленные блоки восстанавливаются. Теперь пробую написать это в лиспе, а он не обрабатывает.
(if (= 1 (logand (getvar "UNDOCTL") 1))
(command "_UNDO" "_CONTROL" "_ONE")
)
(setq UndoMark (getvar "UNDOMARK"))
Последовательность такая: выбрала блок, программа все удалила, нажала правую кнопку мыши, выбрала отмену, далее ставлю в коде точку останова, и проверяю системную переменную. После кода, написанного выше - переменная остается UNDOCTL=53 и ничего не восстанавливается, если я дальше опять выбираю другой блок, все удаляется, правая кнопка мыши, выбор отмены и снова проверяю системную переменную, а она только теперь изменилась: UNDOCTL=51, но отмены все равно не произошло, т.к. после этого (command "_UNDO" "_CONTROL" "_ONE"), командное удаление (command "_undo" "1" "") - не работает
После того, как в коде было добавлено (vla-StartUndoMark adoc) . (vla-EndUndoMark adoc), стала работать команда UNDO, но не программно, а нажатием на стандартную кнопку отмены.
Так обычный Ctrl + Z корректно отменяет метки vla-startundomark .. vla-endundomark. Если был удален блок "не тот", то увидит это только человек, человек же и отменит действие. Или я что-то не понимаю?
Все верно, человек может отменить, но для этого надо завершить программу удаления, а я бы хотела сделать это в коде. Может как-то описать в коде реакцию на UNDO или лучше другой способ?
Я не очень понимаю общую логику, поэтому совет может и не сработать:
1. Если выбран блок
1.1. startundo-удаление-endundo
1.2. Запрос: результат нормален? Если да, то переход на п.1. Если нет, послать в ком.строку ("_.undo" "1"), и на п.1
Продолжать, пока выбран блок
Может быть, общий алгоритм будет таким?
Алгоритм у меня именно такой.
При выборе пользуюсь командой ssget, т.к. есть возможность выбора рамкой. Все работает, если выбран один элемент или рамкой выбрано несколько элементов. Перестает работать отмена удаления только в том случае, если удаляется не один блок (штриховка или текст), а все подобные блоки (штриховки, тексты) из чертежа и из блоков. Т.е. получается при отмене должен восстановиться не один блок, а все подобные в чертеже.
Возможно нужен как раз таки для таких случаев другой алгоритм.
1. Выбор блока
2.Удаление всех блоков с таким именем
3.Запрос правильно ли удален блок? Если да, переход на п.1. А если нет - даже не могу представить что нужно сделать. Ведь если отмену делать стандартную, то она нажимается один раз и восстанавливаются все удаленные блоки сразу.
И вот еще вопрос, где конкретно нужно ставить startundo-endundo? непосредственно перед и после команды delete, или в момент проверки типа выбранного примитива, или может вообще после выбора примитива?
Сейчас еще немного поиграла с кодом и получилось следующее: я поставила startundo-endundo после проверки какой был выбран элемент на чертеже, и он хорошо отрабатывает из командной строки отмену. Но если я пытаюсь сделать отмену из лисп-программы, то он ругается:
" Команда: _DELETESELECT Неизвестная команда "DELETESELECT". Для вызова справки
нажмите F1."
Где DELETESELECT - это моя функция удаления выбранных элементов (defun C:DeleteSelect. )
Может ошибка как раз из-за подчеркивания? откуда оно может появляться?
Так, стоп. Блок - это блок. Штриховка - это штриховка. Предлагаю не вносить сумятицу и соблюдать терминологию
P.S. Обычно я ставлю марки начала-конца отмены только на область, где вносятся изменения в чертеж.
P.P.S. Если (подчеркиваю - если!) я правильно понимаю, то обработка получается такая:
1. Запрос у пользователя типа примитива, который надо удалить (отрезок, штриховка, маскировка, вхождение блока. )
2. Если п.1 успешен (т.е. пользователь не нажал Esc), то:
2.1. Метка начала отмены
2.2. Разблокировать и разморозить слои (по желанию)
2.3. Проходим по всем описаниям блоков
2.4. Внутри каждого описания каждого блока находим примитив, аналогичный выданному в п.1., и удаляем его. Если п.2.2 не был выполнен, то перед удалением проверяем состояние слоя для примитива. Тут же будет "головняк" на предмет того, что делать, если примитив входит в блок, примитив находится на слое "0", а блок - на каком-то другом слое.
2.5. Восстанавливаем состояние слоев (если был п.2.2)
2.6. Метка конца отмены
3. При необходимости - возврат к п.1.
В результате по Ctrl+Z будет отменяться только последнее удаление.
Можно сделать по-другому, поместив отмену до запроса и после п.1. Тогда отменяться будут сразу все удаления.
На счет типа выбранных элементов - ведь Автокаду все равно, что отменять - будь то блок, штриховка, или что-то другое. Сложность только в том, что удаляется не один примитив, а несколько. И стандартная функция отмены восстанавливает сразу все удаленные одинаковые блоки.
В итоге, самая последняя строчка меня спасла
Я сделала двойное подтверждение удаления, сразу после того, как был выбран примитив, и уже после того, как он был удален. Правда после второго подтверждения приходится все равно завершать программу и отменять по Ctrl+Z.
Мне кажется, я даже знаю, почему не отменяется удаление. Когда в программе пошагово иду по коду, то в момент выполнения строки: (command "_undo" "1" ""), в командной строке пишет: "Неизвестная команда "DELETESELECT"." Не понятно совершенно почему он обращается к функции, которая в данный момент выполняется, и не понятно, почему она неизвестная, ведь она загружена в Автокаде? Может решение этого вопроса и позволит придти к нужному результату.
Евгения, AutoCAD отменяет операции, а не примитивы. В остальном - нужен код, потому что я уже запутался, что Вы хотите и в каком объеме.
Алексей, спасибо за подсказки, все получилось. С помощью кода получилось выполнять отмену удаления любого примитива любое количество раз!
Видимо главное было в правильном месте разместить startundo- endundo.
By:
Reverses the effect of commands.
UNDO displays the command or system variable name at the Command prompt to indicate that you have stepped past the point where the command was used.
Note: UNDO has no effect on some commands and system variables, including those that open, close, or save a window or a drawing, display information, change the graphics display, regenerate the drawing, or export the drawing in a different format.The following prompts are displayed.
Number of operations to undo
Reverses the specified number of preceding operations. The effect is the same as entering u multiple times.
Groups the commands in a macro, such as a menu macro, into a single action, making them reversible by a single U command.
UNDO Auto is not available if the Control option has turned off or limited the UNDO feature.
Control
Limits or turns off UNDO.
Note: The Auto, Begin, and Mark options are not available when None or One is in effect. If you attempt to use UNDO while it is turned off, you are prompted to re-enter a Control option.Turns on the full UNDO command.
Turns off the U and UNDO commands and discards any UNDO command information saved earlier in the editing session.
Limits UNDO to a single operation.
Controls whether multiple, consecutive zoom and pan commands are combined as a single operation for undo and redo operations.
Note: Pan and zoom commands that are started from the menu are not combined, and always remain separate actions.Controls whether the layer dialog operations are combined as a single undo operation.
Begin, End
Groups a sequence of actions into a set. After you enter the Begin option, all subsequent actions become part of this set until you use the End option. Entering undo begin while a group is already active ends the current set and begins a new one. UNDO and U treat grouped actions as a single action.
If you enter undo begin without undo end, using the Number option undoes the specified number of commands but does not back up past the begin point. If you want to go back to before the begin point, you must use the End option, even if the set is empty. The same applies to the U command. A mark placed by the Mark option disappears inside an UNDO group.
Mark, Back
Mark places a mark in the undo information. Back undoes all the work done back to this mark. If you undo one operation at a time, you are informed when you reach the mark.
You can place as many marks as necessary. Back moves back one mark at a time, removing the mark. When you use the Number option to undo multiple actions, UNDO stops if it encounters a mark.
This will undo everything. OK? (Displayed if no mark is found during a Back operation)
Enter yes to undo all commands entered in the current session. Enter no to ignore the Back option.
Команда ERASE позволяет удалить из рисунка выбранные объекты. По команде необходимо указать любым известным способом объекты, подлежащие умолчанию.
Если какие-то объекты были удалены ошибочно, то можно использовать команду UNDO , которую можно вызвать только путем ее ввода в командную строку. Имеется одноименная кнопка на стандартной панели инструментов, которая обеспечивает отмену только одного последнего действия.
Команда UNDO имеет следующие опции:
Number (Число) – опция по умолчанию. Введение какого либо числа означает, что будет удалено именно такое количество команд, введенных последними
Auto (Авто) – при включенной опции ( On ) любая последовательность одноименных команд будет рассматриваться как одна команда. При отключенной опции ( Off ) при каждом вызове команды UNDO будет отменяться только одна команда AutoCAD
Control ( Управление) – опция управляющая командой UNDO . Имеет три подопции:
All (Все) – опция по умолчанию, предоставляющая в распоряжение пользователя полный набор функций команды
None ( Ничего) – опция исключающая команду UNDO из текущего сеанса работы, т. к. запрещает запись всех выполняемых команд в файл протокола. Опция блокирует выполнение команд Auto , Begin , Mark
One (Один) – производится отмена только одной предыдущей команды UNDO
Begin (Начало) – используется совместно с опцией End . Вызов опции означает начало формирования группы команд в файле протокола
End (Конец) — используется совместно с опцией Begin . Вызов опции означает конец формирования группы команд в файле протокола
Mark (Метка) – опция используется совместно с опцией Back . Обеспечивает установку метки у команды, к которой пользователь предполагает вернуться.
Back (Обратно) — опция используется совместно с опцией Mark . Обеспечивает отмену действий, произведенной группой команд вплоть до метки установленной по команде Mark
Опыт показывает, что опциями Mark и Back следует пользоваться перед выполнением той последовательности команд, результат действия которых может вызывать определенные сомнения. Такой прием позволяет сэкономить время особенно при работе с большими чертежами
Команда OOPS обеспечивает восстановление объектов, стертых последней командой ERASE . Команда действует только по отношению к самой последней команде стирания графического объекта. Эта команда вернет в чертеж последний стертый графический объект независимо от его сложности.
‹ Использование ручек для редактирования
Вверх
Перемещение объектов по команде MOVE ›
В предыдущем уроке мы начали раздел изучения плоского моделирования и изучили методы создания 2D примитивов. Для того что бы создавать более сложные графические объекты необходимо уметь редактировать плоские объекты. Данный урок посвящен непосредственному изучению вопроса редактирования 2D примитивов.
Редактирование объектов предусматривает возможность удаления, копирования перемещения объектов, изменения их свойств таких, как цвет, вес линий, тип линий и ряда других свойств. Над объектами можно выполнять операции удлинения, обрезания, зеркального отражения, поворота на заданный угол и т.д.
Доступ к командам редактирования осуществляется через:
1. Пункт меню Modify.
2. Панели инструментов Modify.
3. Введение команды с клавиатуры.
Команды редактирования
Команда Свойства (Properties)
Способы ввода команды:
- Набрать с клавиатуры команду: Properties.
- Вызов меню: Modify?Properties.
- Дважды щелкнуть левой кнопкой мыши на объекте.
- Из контекстного меню объекта выбрать команду Properties.
Данной командой можно изменить свойства одного объекта или общие свойства нескольких выбранных объектов. Команда открывает диалоговое окно Properties, в верхней строке которого содержится список избранных объектов и кнопки:
Команда ERASE (Стереть)
Способы ввода команды:
Допускается выбор объектов до ввода команды или после ввода команды. В первом случае после ввода команды выбранные объекты удаляются. Во втором случае система предлагает выбрать объекты.
В командной строке выводится диалог:
Command: _erase
Select objects: 1 found
Select objects: 1 found, 2 total
Select objects: 1 found, 3 total
Select objects:
После выбора объектов нажмите клавишу Enter. Объекты будут удалены. Если необходимо удалить объект не полностью, а лишь определенную его часть, то используют команды TRIM (Обрезать) и BREAK (Разорвать).
Команда BREAK (Разорвать)
Способы ввода команды:
После ввода команды система выдает запросы:
Command: _break | Команда разорвать. |
Select object: | Выбрать объект или указать первую точку. |
Specify second break point or [First point] | Указать вторую точку. |
Выбор объектов осуществляется после ввода команды.
Команда TRIM (Обрезать)
Способы ввода команды:
Команда обрезает выбранный объект режущей кромкой, которая пересекает его, и может быть дугой, линией, полилинией и т.д.. После ввода команды сначала указывается одна или последовательно выбирается, несколько режущих кромок. Процесс выбора завершается нажатием клавиши Enter. Далее система выдаст запрос на выбор объектов, которые обрезаются. Необходимо указывать ту часть объекта, которая обрезается. Для завершения выбора нажать клавишу Enter.
Работа с командой сопровождается запросам:
Команда EXTEND (Удлинить)
Способы ввода команды:
Командой удлиняются графические примитивы (линия, дуга, полилиния, луч, сплайн) до точек пересечения с другими объектами, которые будут предельными кромками. По своему действию она противоположна команде TRIM. после введения команды выдаются запросы на выбор предельных кромок. Прекратить выбор можно нажатием клавиши Enter. Далее система выдает запрос на выбор объектов, которые необходимо продлить. Завершение выбора осуществляется нажатием клавиши Enter. Указывая объекты, нужно показывать край, который ближе к предельной кромке, иначе команда не будет выполняться.
Подсказки системы будут иметь следующий вид:
Команда MOVE (Перемещение)
Способы ввода команды:
Для перемещения нужно на выбранном объекте указать базовую точку и задать координаты нового положения базовой точки после перемещения объекта. Координаты задаются любым из способов.
При использовании команды поддерживайте диалог:
Command: move | Команда Переместить. |
Select objects: 1 found | Выберите объект |
Select objects: | Нажмите Enter. |
Specify base point or displacement: | Указать базовую точку. |
Specify second point of displacement or <use firstpoint as displacement>: | Задать координаты для нового положение базовой точки. |
Команда COPY (Копировать)
Способы ввода команды:
Копирование объектов осуществляется аналогично их перемещению. Разница заключается в том, что образуется копия объекта в заданной позиции с сохранением оригинала.
Команда ROTATE (Повернуть)
Способы ввода команды:
Команда совершает поворот объекта на заданный угол относительно базовой точки (центра поворота). Положительным считается значение угла при повороте в направлении против часовой стрелки. Базовую точку можно выбрать при включенном режиме объектной привязки.
Диалог с системой:
При выборе параметра поддерживайте диалог:
Команда MIRROR (Зеркало)
Способы ввода команды:
Командой получают зеркальное отражение объекта с сохранением или удалением исходного объекта. После выбора объектов нужно задать ось, относительно которой образуется зеркальное отражение.
Диалог с системой:
Command: _mirror | Команда Зеркало. |
Select objects: 1 found | Выбрать объект. |
Select objects: | Нажмите Enter. |
Specify first point of mirror line: | Указать первую точку оси. |
Specify second point of mirror line: | Указать вторую точку оси |
Delete source objects? [Yes / No] <N>: n | Запрос на удаление исходного объекта |
Команда SCALE (Масштаб)
Способы ввода команды:
Пропорциональное увеличение или уменьшение размеров объекта или группы объектов относительно заданной базовой точки. Для увеличения объектов задают коэффициент больше единицы. Для уменьшения объектов коэффициент имеет значение меньше единицы.
Подсказки, которые выдаются системой:
Command _scale | Команда Масштаб |
Select objects: 1 found | Выбрать объект или группу объектов |
Select objects : | Нажать Enter |
Specify base point: | Указать базовую точку |
Specify scale factor or [ Reference ] : 2 | Задать коэффициент масштабирования. |
Задать масштабный коэффициент можно интерактивным способом. После выбора базовой точки от нее до перекрестка тянется резиновая нить. Увеличивая или уменьшая ее размер, можно задать значение коэффициента.
Опция Reference (Опорный отрезок) позволяет задать коэффициент масштабирования, введя первоначальную длину отрезка и его новую длину. Коэффициент рассчитывается как отношение второго числа к первому. Длина отрезка при этом может быть определена автоматически как расстояние между двумя указанными с помощью курсора точками .
Используем команду для увеличение объекта в 8 / 5 раз.
Диалог с системой будет иметь вид:
Command : _scale | Команда Масштаб |
Select objects: 1 found | Выбрать объект 1 |
Select objects: 1 found, total 2 | Выбрать объект 2 |
Select objects : | Нажать Enter |
Specify scale factor or [ Reference ] : r | Выбрали опцию Reference. |
Specify reference length < 1 > : 5 | Длинна отрезка. |
Specify new length : 8 | Новая длинна отрезка. |
Команда STRETCH (Растянуть)
Способы ввода команды:
Команда используется для растяжения или наоборот сжатия графических примитивов путем изменения положения их предельных точек. При применении команды к дуге изменяется ее радиус. Выбор объектов осуществляется только секущей рамкой или секущими многоугольником. Для работы с кругом, текстом, блоком команда не предназначена. Применение команды к набору объектов дает возможность изменить их без нарушения взаимосвязи между объектами.
Работа с командой сопровождается диалогом:
Select objects: Нажать Enter.Specify base point or displacement: Выбрать базовую точку.Specify second point of displacement or <usefirst point as displacement>: Выбрать базовую точку.
Командой изменяется положение только тех точек, попавших в секущую рамку. Положение остальных точек остается неизменным.
Команда LENGTHEN (Продлить)
Способы ввода команды:
Команда служит для изменения длины отрезка или дуги. Чтобы изменить длину отрезка, нужно ввести значение прироста, положительное значение в случае увеличения длины и отрицательное значение при уменьшении длины. Чтобы изменить размер дуги, указывается значение прироста внутреннего угла, положительное, в случае увеличения размера и отрицательное при уменьшении размера.
Команда OFFSET (Сходство)
Способы ввода команды:
Команда предназначена для построения примитивов подобных существующих на чертеже. Подобный объект будет построен на заданном расстоянии и в заданной позиции относительно существующего (режим offset distance). Можно также построить подобный объект, проходящей через заданную точку (выбрать опцию Through). Для линии строится параллельная ей линия. Подобным круга является концентрический круг. Подобной дуги является концентрическая дуга с тем же внутренним углом. Для полилинии строится подобная полилиния.
Диалог с системой:
Command: _offset | Команда Сходство. |
Specify offset distance or [Through]<Through>: 15 | Задать расстояние. |
Select object to offset or <exit>: | Выбрать объект, для которого строится подобный. |
Specify point on side to offset: | Показать, с какой стороны объекта строить ему подобный. |
Select object to offset or <exit>:* Cancel * |
Выбрать следующий объект, для которого строится схожий с тем же значением или нажать клавишу ENTER для выхода из режима.
Чтобы выбрать точку, через которую будет проходить подобный объект, поддерживайте диалог:
Command: _offset | Команда Сходство. |
Specify offset distance or [Through]<Through>: T | Выбрать режим Through. |
Select object to offset or <exit>: | Выбрать объект, для которого строится подобный. |
Specify through point: | Задайте точку, через которую будет проходить подобный объект |
Команда FILLET ( Сопряжение )
Способы ввода команды :
Команда предназначена для выполнения сопряжения двух графических примитивов, а именно: дуг, отрезков, полилиний, дугой заданного радиуса; позволяет закруглить углы, а также может быть использована вместо команд TRIM (Обрезать) и EXTEND (Продлить) при нулевом значении радиуса. При сопряжении двух параллельных отрезков радиус определяется автоматически как половина расстояния между отрезками.
Пример диалога с системой:
Command: _fillet | Команда Сопряжение. |
Current settings: Mode = NOTRIM,Radi us = 0.0000 | Вывод значений параметров, заданных по умолчанию. |
Select first object or[Polyline / Radius / Trim / mUltiple]: R | Выбор параметра Radius. |
Specify fillet radius <0.0000>: 70 | Задать значение радиуса. |
Select first object or[Polyline / Radius / Trim / mUltiple]: P | Выбор параметра Polyline для закругления всехуглов |
Select 2D polyline: | Выбрать полилинию. |
Команда CHAMFER (Фаска)
Способы ввода команды:
Система выдаст диалог:
Command: _chamfer | Команда Фаска. |
(TRIM mode) Current chamfer Dist1 = 0.0000, Di st2 =0.0000 | Значениепараметров по умолчанию. |
Select first line or[Polyline / Distance / Angle / Trim / Method / mUltiple]: d | Выбрать опцию Distance. |
Specify first chamfer distance <0.0000>: 30 | Задать первое значение дистанции. |
Specify second chamfer distance <30.0000>: 30 | Задать второе значение дистанции. |
Select first line or[Polyline / Distance / Angle / Trim / Method / mUltiple] | Выбрать первую сторону. |
Select second line: | Выбрать другую сторону. |
2. Задать значение размера фаски по первой стороне и значение угла в градусах относительно первого выбранного отрезка.
Для данного метода диалог системы будет таким:
Command: _chamfer | Команда Фаска. |
(TRIM mode) Current chamfer Dist1 = 0.0000, Di st2 =0.0000 | Значениепараметров по умолчанию. |
Select first line or[Polyline / Distance / Angle / Trim / Method / mUltiple]: a | Выбрать опцию Angle. |
Specify chamfer length on the first line <0.0000>: 40 | Задать значение дистанции. |
Specify chamfer angle from the first line <0>: 75 | Задать значение угла. |
Select first line or[Polyline / Distance / Angle / Trim / Method / mUltiple] | Выбрать первую сторону. |
Select second line: | Выбрать другую сторону. |
На этом знакомство с командами редактирования плоских объектов законченно. А в следующей уроке мы изучим методы нанесения размеров и штриховки.
Читайте также: