![]() |
Translate to: |
||||||
| Обратная связь | Новости САПР | Программы | Документация | Полезные советы | Обзорные статьи | ||
| Заказ и разработка | Каталог САПР | САПР-конференция | Библиотека ГОСТов | Наши соавторы | Коммерческое ПО | ||
Третья выбираемая функция, предназначена для скоростного ав-томатического возврата номера модификации свай, находящихся на поле чертежа. Это позволяет мгновенно вернуть эти номера, т.е. увидеть тип каждой сваи. Это бывает необходимо для внесения изменений (расширения) свайного поля. После внесения изменений, нужно снова пронумеровать сваи.
Установленные блоки в виде свай на поле чертежа будут последовательно просмотрены и в них будут прочитаны имена атрибутов, несущие в своем названии номер модификации сваи. Используя этот номер, программа переносит его в значение номера сваи, заменяя тем, самым ранее установленный порядковый номер сваи. Длительность операции составляет секунды. С помощью Автолиспа можно организовать доступ к любому примитиву чертежа. Но если такие простые примитивы, как линия, полилиния и им подобные не имеют специфических отличий, кроме слоя расположения и точек привязки, то блоки и атрибуты имеют еще «имя», и оперируя именем блока или атрибута можно организовать доступ к конкретному блоку/атрибуту, минуя другие примитивы, что и реализовано в данной задаче.
Задача требует использования блоков, которые являются условным обозначением сваи с атрибутом, имеющим в своем имени номер модификации сваи. Постановка задачи состоит в том, чтобы найдя имя атрибута, выделить из него номер модификации сваи и вставить его в номер сваи на чертеже. Процесс повторяется при нахождении программой следующей сваи, по порядку, зависящему от последовательности вставки сваи в рисунок.
Структура программы приведена на чертеже. Предварительно необходимо задать начальный номер для первой сваи. Наглядно видно существование общего цикла, который работает, как "вертушка". Он крутится и просматривает примитивы блока, которые последовательно анализируются программой.
В цикл можно попасть только в случае наличия примитива.
После этого необходимо выполнить два условия:
После выполнения этих условий срабатывает механизм установки в значение атрибута очередного номера сваи. При выполнении условий соблюдается следующий порядок: попасть в проверку 2 условия можно, только выполнив 1 условие.
При продолжении работы цикла и просмотре составляющих элементов блока подходит очередь последнего элемента блока, обозначающего его конец. В этом случае очередь просмотра переходит к следующему примитиву, с целью обнаружить следующий блок сваи. И так далее, пока не закончатся все сваи.
Разбор задачи выполнен для одной сваи в общем виде. Все остальные операции для других свай аналогичны. Точка с запятой используется для пояснений, которые устанавливаются в тексте программы и на работу программы не влияют.
defun vns () |
Программная объединяющая функция возврата N модификации сваи, вместо установленного номера свай на поле чертежа. Функция defun под именем /vns/ объединяет все выражения и функции программы. В сеансе Автокада она вызывается с помощью команды: (load "имя_файла") - загрузка файла, после чего в скобках указывается (имя_файла) для исполнения. Для нашего случая (load "vns") - загрузка файла, после чего - (vns) для исполнения, полную запись можно набрать в командной строке Автокада или указать в добавленном пункте меню Автокада. |
(setq a1 (entnext) |
Начало прокрутки информационной структуры рисунка Автокада – получение имени первого примитива в рисунке. Для того, чтобы не путать назовем его знак примитива (a1) |
(princ "a1 =")(princ a1)(terpri) |
Стандартный вывод информации в текстовое окно Автокада о значении переменной /а1/ |
(setq tip (cdr(assoc ‘0 (entget a1)))) |
Получение типа примитива. Выражение для получения из информационной структуры примитива рисунка - типа примитива, выражение можно записать и другим способом - последовательным написанием каждой функции: (setq t1 (entget a1)) - список информационной структуры примитива (СИСП)(setq t1 (assoc '0 t1)) - нахождение в (СИСП) по ключу (паролю) '0 ключевой пары типа примитива (0.тип_примитива) (setq tip (cdr t1))- получение значения второго члена ключевой пары, т.е. типа примитива. |
(princ "tip =")(princ tip)(terpri) |
Стандартный вывод информации в текстовое окно Автокада о значении переменной /а/ |
(setq b1 t) |
Создание переменной b1, как существующей величины |
(while b1 |
цикл 1 если переменная b1 существует, мы попадаем в цикл и вращаемся вместе с ним, пока существует b1 |
(if (equal tip "INSERT") |
Условие 0. Если тип примитива является вставкой блока, мы попадаем внутрь условия, функция equal сравнивает значение переменной tip с образцом в кавычках, т.е. с обозначением вставки блока в типе примитива |
(progn |
Функция progn позволяет объединить разные выражения находящиеся внутри условия 0 в одно выражение. Если этого не сделать, то произойдет сбой или ошибка выполнения программы |
(setq imj (cdr(assoc '2 (entget a1)))) |
Получение имени примитива, т.е. текстового имени блока. Выражение для получения из информационной структуры примитива рисунка - имени примитива, выражение можно записать и другим способом - последовательным написанием каждой функции:(setq b1 (entget a1)) - список информационной структуры примитива (СИСП),(setq b1 (assoc '2 b1))- нахождение в (СИСП) по ключу (паролю) '2 ключевой пары имени примитива (2.имя_примитива),(setq b1 (cdr b1)) - получение значения второго члена ключевой пары,т.е.имени примитива |
(textscr) |
Функция позволяет переключить экран, из графического режима Автокада в текстовый, чтобы можно было прочитать сообщения программы в текстовом окне Автокада |
(princ "imj =") (princ imj)(terpri) |
Вывод информации на экран с данными о переменной imj. Мы ищем имя атрибута |
(if (or(equal imj "SV51") (equal imj "SV61") (equal imj "SV71") (equal imj "SV81") (equal imj "SV91") (equal imj "SV52") (equal imj "SV62") (equal imj "SV72") (equal imj "SV82") (equal imj "SV92") (equal imj "SV53") (equal imj "SV63") (equal imj "SV73") (equal imj "SV83") (equal imj "SV93")) |
Условие 1. Если имя примитива (блока) совпадает хотя бы с одним именем сваи, то мы попадаем в условие 1. Функция equal сравнивает значение переменной imj с образцом в кавычках, т.е. с именем блока. Функция логического сравнения выражений or позволяет получить истину для условия, если хотя бы одно из двух выражений будет истиной и получить доступ в условие |
(progn |
Функция progn позволяет объединить разные выражения находящиеся внутри условия 1 в одно выражение. Если этого не сделать, то произойдет сбой или ошибка выполнения программы |
(setq a1 (entnext a1)) |
Выражение для перелистывания примитивов в рисунке и получения (имени) знака следующего примитива или подпримитива, т.е. функция entnext с (именем) знаком /а1/ - предыдущего примитива, дает (имя) знак следующего примитива, которое записывается в переменную /а1/. В данном случае используется для получения (имени) знака атрибута, содержащегося в блоке |
(setq imj (cdr(assoc '2 (entget a1)))) |
Получение текстового имени атрибута. Выражение для получения из информационной структуры примитива рисунка - имени атрибута, выражение можно записать и другим способом - последовательным написанием каждой функции:(setq b1 (entget a1)) - список информационной структуры примитива (СИСП), (setq b1 (assoc '2 b1))- нахождение в (СИСП) по ключу (паролю) '2 ключевой пары имени атрибута (2.имя_примитива),(setq b1 (cdr b1)) - получение значения второго члена ключевой пары, т.е. имени атрибута |
(setq imj (substr imj 2)) |
Выделение из имени атрибута части, начинающейся со 2 символа. Если взять имя атрибута «S51», то его остаток будет «51» после применения данного выражения. Как раз это значение необходимо для восстановления типоразмера сваи. Функция substr действует как нож для текстового выражения отрезая необходимую его часть, после чего эту часть записывая в переменную imj |
(setq b1 (subst (cons 1 nnp) (assoc '1 (entget a1)) (entget a1))) |
Функция позволяет заменить в списке старый элемент на новый. Например чтобы заменить в блоке выражение атрибута – номер сваи и т.д. надо получить доступ к списку блока. Это выражение и является основным орудием в этой операции. Рассмотрим его внимательнее: (cons 1 nnp) позволяет сконструировать новое выражение ключевой пары (1 . «101»). Эта пара и заменит в информационной структуре блока старое выражение. (assoc '1 (entget a1)) выражение помогает найти по ключу '1 старое выражение в информационной структуре блока. Оставшееся выражение (entget a1) является списком информационной структуры атрибута, в котором и заменяется «старое» выражение на новое. Это важнейшая структура в языке Автолиспа. |
(entmod b1)(entupd a1) |
Функция (entmod b1) модифицирует выражение в списке, а функция (entupd a1) преобразует выражение на чертеже |
)) |
Конец условия 1 |
)) |
Конец условия 0 |
(setq a1 (entnext a1)) |
Выражение для перелистывания примитивов в рисунке и получения (имени) знака следующего примитива или подпримитива, т.е. функция entnext с (именем) знаком /а1/ - предыдущего примитива, дает (имя) знак следующего примитива, которое записывается в переменную /а1/ |
(if a1 (progn |
Условие 2. Если следующий примитив существует, то мы попадаем в это условие |
(setq tip (cdr(assoc '0 (entget a1)))) |
Выражение для получения из информационной структуры примитива рисунка - типа примитива, выражение можно записать и другим способом - последовательным написанием каждой функ-ции : (setq b (entget a)) - список информационной структуры примитива (СИСП), (setq b (assoc '0 b)) – нахождение в (СИСП) по ключу (паролю) '0 ключевой пары типа примитива (0.тип_примитива), (setq b (cdr b)) - получение значения второго члена ключевой пары, т.е. типа примитива. Наша задача - отбор всех примитивов с типом INSERT ,а затем из всего числа блоков, выбор блоков свай |
| <pre>(setq imj (cdr(assoc '2 (entget a1)))) | Получение имени блока или атрибута из (СИСП), аналогично /tip/ - см. рассмотренное выше выражение для получения типа примитива | )) |
Конец условия 2 |
(if (not a1)(prong (setq a1 nil b1 nil))) |
Если не выбрано ни одной сваи, то есть не существует примитива, то обнуляются переменные, с помощью которых работает цикл, тем самым обеспечивая выход из цикла |
) |
Конец цикла, если b1 не существует и продолжение цикла, если b1 существует, т.е. возвращается к началу цикла и повторяет все выражения внутри него заново |
(setq a1 nil b1 nil tip nil imj nil) |
Дополнительное уничтожение переменных, при возможном их существовании. Перестраховка |
) |
Окончание программной функции defun по нумерации свай чертежа |
(defun vns() ; ФУНКЦИЯ ВОЗВРАТА N модификации сваи
(setq a1 (entnext))
(setq b1 t)
(setq tip (cdr(assoc '0 (entget a1))))
(while b1
(if (equal tip "INSERT")
(progn
(setq imj (cdr(assoc '2 (entget a1))))
(if (equal imj "SV51")(progn (setq imj1 "51")
(setq a1 (entnext a1))
(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV52")(progn (setq imj1 "52")
(setq a1 (entnext a1))
(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV53")(progn (setq imj1 "53")
(setq a1 (entnext a1))
(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV61")(progn (setq imj1 "61")
(setq a1 (entnext a1))
(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV62")(progn (setq imj1 "62")
(setq a1 (entnext a1))
(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV63")(progn (setq imj1 "63")
(setq a1 (entnext a1))(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV71")(progn (setq imj1 "71")
(setq a1 (entnext a1))(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV72")(progn (setq imj1 "72")
(setq a1 (entnext a1))(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV73")(progn (setq imj1 "73")
(setq a1 (entnext a1))(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV81")(progn (setq imj1 "81")
(setq a1 (entnext a1))(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV82")(progn (setq imj1 "82")
(setq a1 (entnext a1))(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV83")(progn (setq imj1 "83")
(setq a1 (entnext a1))(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV91")(progn (setq imj1 "91")
(setq a1 (entnext a1))(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV92")(progn (setq imj1 "92")
(setq a1 (entnext a1))(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
(if (equal imj "SV93")(progn (setq imj1 "93")
(setq a1 (entnext a1))(setq imj (cdr(assoc '2 (entget a1))))
(setq b1 (subst (cons 1 imj1) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)))
))
(setq a1 (entnext a1))
(if a1 (progn
(setq tip (cdr(assoc '0 (entget a1))))
(setq imj (cdr(assoc '2 (entget a1))))
))
(if (not a1)(progn (setq a1 nil b1 nil)))
)
(setq a1 nil b1 nil)
)
Copyright © Сайт поддержки пользователей САПР