![]() |
Translate to: |
||||||
| Обратная связь | Новости САПР | Программы | Документация | Полезные советы | Обзорные статьи | ||
| Заказ и разработка | Каталог САПР | САПР-конференция | Библиотека ГОСТов | Наши соавторы | Коммерческое ПО | ||
Вторая выбираемая функция, предназначена для скоростного автоматического и хаотичного назначения номера сваи, находящейся на поле чертежа. Это позволяет мгновенно присвоить порядковый номер всем сваям, но расположение последовательности чисел номера сваи на чертеже будет зависеть от нескольких факторов, в том числе от последовательности установки свай. Это не совсем то, что хочет проектировщик, поэтому эта задача является базовой и ознакомительной, на основе которой можно выстроить другие задачи. Например, выбор групп свай для нумерации, отличающихся по-следовательными координатами по Х или Y. Таким образом, можно увеличить скорость нумерации.
Установленные блоки в виде свай на поле чертежа будут хаотично, но последовательно пронумерованы в порядке, зависящим от последовательности установки в рисунок. Длительность операции составляет секунды. С помощью Автолиспа можно организовать доступ к любому примитиву чертежа. Но если такие простые примитивы, как линия, полилиния и им подобные не имеют специфических отличий, кроме слоя расположения и точек привязки, то блоки имеют еще «имя блока», и оперируя именем блока можно организовать доступ к конкретному блоку минуя другие примитивы, что и реализовано в данной задаче.
Задача требует использования блоков, которые являются условным обозначением сваи с атрибутом, позволяющим устанавливать номер сваи. Постановка задачи состоит в том, чтобы после задания номера первой сваи, у других свай последовательно изменять номер путем хаотичного выбора программой следующей сваи, по порядку, зависящему от последовательности вставки сваи в рисунок. Это намного облегчает изменение номера сваи по сравнению с командой Автокада по редактированию атрибута. Задача выполняет те же операции, заменяя ручной труд замены в окне Автокада.
Структура программы приведена на чертеже. Предварительно необходимо задать начальный номер для первой сваи. Наглядно видно существование общего цикла, который работает, как "вертушка". Он крутится и просматривает примитивы блока, которые последовательно просматриваются программой. В цикл можно попасть только в случае наличия примитива.
После этого необходимо выполнить два условия:После выполнения этих условий срабатывает механизм установки в атрибут очередного номера сваи. После этого в переменную, содержащую номер сваи добавляется единица. При выполнении условий соблюдается следующий порядок: попасть в проверку 2 условия мож-но, только выполнив 1 условие.
При продолжении работы цикла наступает конец блока, в котором была произведена замена номера сваи. В этом случае происходит просмотр следующего примитива, с целью обнаружить следующий блок сваи. И так далее, пока не закончатся все сваи.
Разбор задачи выполнен для одной сваи в общем виде. Все остальные операции для других свай аналогичны. Точка с запятой используется для пояснений, которые устанавливаются в тексте программы и на работу программы не влияют.
defun zans () |
Программная объединяющая функция простановки номеров свай на поле чертежа. Функция defun под именем /zans/ объединяет все выражения и функции программы. В сеансе Автокада она вызывается с помощью команды: (load "имя_файла") - загрузка файла, после чего в скобках указывается (имя_файла) для исполнения. Для нашего случая (load "zans") - загрузка файла, после чего набрать - (zans) для исполнения, полную запись необходимо указать в командной строке Автокада или в пункте меню |
(textscr) |
Функция, позволяет переключить экран, из графического режима Автокада в текстовый чтобы можно было прочитать сообщения программы в текстовом окне Автокада |
(princ "====")(terpri) |
Визуальный разделитель в текстовом окне Автокада при выводе информации, помогает выделить отдельные фрагменты текста – для программы не требуется |
(setq nnp (getstring "\n ВВЕДИТЕ начальный N СВАИ\n: ")) |
getstring – функция ввода символьной строки с клавиатуры и записи ее в переменную nnp с помощью функции setq. В нашем случае мы вводим число в виде символа. Почему же нам не иметь переменную nnp с содержанием в виде числа. Это будет объяснено дальше |
(setq nnp1 (atoi nnp)) |
Функция atoi изменяет символьное содержание переменной nnp в числовое (целое) значение, которое присваивается переменной nnp1 |
(setq a1 (entnext) |
Начало прокрутки информационной структуры рисунка Автокада – получение имени первого примитива в рисунке |
(princ "a =")(princ a1)(terpri) |
Стандартный вывод информации в текстовое окно Автокада о значении переменной /а1/ |
(setq b1 t) |
Создание переменной b1, как существующей величины |
(while b1 |
цикл 1 если переменная b1 существует, попадаем в цикл и вращаемся вместе с ним, пока существует b1 |
(setq tip (cdr(assoc '0 (entget a1)))) |
Получение типа примитива. Выражение для получения из информационной структуры примитива рисунка - типа примитива,выражение можно записать и другим способом - последовательным написанием каждой функции:(setq t1 (entget a1)) - список информационной структуры примитива (СИСП),(setq t1 (assoc '0 t1)) - нахождение в (СИСП) по ключу (паролю) '0 ключевой пары типа примитива (0.тип_примитива) значения второго члена ключевой пары, т.е. типа примитива |
(princ "tip =")(princ tip)(terpri) |
Стандартный вывод информации в текстовое окно Автокада о значении пере-менной /tip/ |
(if (or (equal tip "ATTDEF")
(equal tip "ATTRIB")) |
Условие 0. Если тип примитива является атрибутом, мы попадаем внутрь условия, функция equal сравнивает значение переменной tip с образцом в кавычках, т.е. с обозначением атрибута в типе примитива. Функция логического сравнения выражений or позволяет получить истину для условия, если хотя бы одно из двух выражений будет истиной и получить доступ в условие |
(progn |
Функция progn позволяет объединить разные выражения находящиеся внутри первого условия в одно выражение. Если этого не сделать, то произойдет сбой или ошибка выполнения программы |
(setq imj (cdr(assoc '2 (entget a1)))) |
Получение имени примитива. Выражение для получения из информационной структуры примитива рисунка - имени примитива, выражение можно записать и другим способом - последовательным написанием каждой функции: (setq b1 (entget a1)) - список информационной структуры примитива (СИСП),(setq b1 (assoc '2 b1)) - нахождение в (СИСП) по ключу (паролю) '2 ключевой пары имени примитива (2 . имя_примитива) (setq b1 (cdr b1)) - получение значения второго члена ключевой пары, т.е. имени примитива |
(princ "imj =")(princ imj)(terpri) |
Вывод информации на экран с данными о переменной imj. Мы ищем имя атрибута |
(if (or(equal imj "S51") (equal imj "S61")(equal imj "S71") (equal imj "S81")(equal imj "S91") (equal imj "S52")(equal imj "S62") (equal imj "S72")(equal imj "S82") (equal imj "S92")(equal imj "S53") (equal imj "S63")(equal imj "S73") (equal imj "S83")(equal imj "S93")) |
Условие 1. Если имя примитива совпадает хотя бы с одним именем атрибута сваи, то мы попадаем в условие 1. Функция equal сравнивает значение переменной imj с образцом в кавычках, т.е. с именем атрибута. Функция логического сравнения выражений or позволяет получить истину для условия, если хотя бы одно из нескольких выражений будет истиной и получить доступ в условие |
(progn |
Функция progn позволяет объединить разные выражения находящиеся внутри первого условия в одно выражение. Если этого не сделать, то произойдет сбой или ошибка выполнения программы |
(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) (setq nnp1 (+ nnp1 1)) (setq nnp (itoa nnp1)) |
Функция (entmod b1) модифицирует выражение в списке, а функция (entupd a1) преобразует выражение на чертеже. После замены и установки номера в свае, необходимо в переменной nnp1 изменить номер на следующее значение. Этим и занята функция (+ nnp1 1) .Следующее выражение (itoa nnp1) превращает число в символьное выражение и оно записывается в переменную nnp |
)) |
Конец условия 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 ,а затем из всего числа блоков, выбор только блоков свай |
(setq imj (cdr(assoc '2 (ent-get a1)))) |
Получение имени блока или атрибута из (СИСП), аналогично получению /tip/ - см. рассмотренное выше выражение для получения типа примитива |
)) |
Конец условия 2 |
(if (not a1)(prong (setq a1 nil b1 nil))) |
Если в рисунке кончилась последова-тельность примитивов (т.е. был рассмотрен последний примитив), то обнуляются переменные, с помощью которых работает цикл |
) |
Конец цикла, если b1 не существует, и продолжение цикла, если b1 существует, т.е. программа возвращается к началу цикла и повторяет все выражения заново |
(setq a1 nil b1 nil tip nil imj nil)(gc) |
Дополнительное уничтожение переменных, при возможном их существовании. Перестраховка. И очистка памяти (gc) |
) |
Окончание программной функции defun по нумерации свай чертежа |
Ниже приведен текст - программы, который намного меньше верхнего варианта с пояснениями. Хорошо видно тело программы с отступами, которые формируют и выражают функции цикла и условий. Наглядно видно, что каждое выражение, которое открывается скобкой должно иметь соответствующую закрывающую скобку. Кстати наиболее часто встречающаяся ошибка – несоответствие по количеству открывающих и закрывающих скобок.
(defun zans()
; ФУНКЦИЯ автоматического ИЗМЕНЕНИЯ N сваи
(textscr)(princ "==========================================")(terpri)
(setq nnp (getstring"\n ВВЕДИТЕ начальный N СВАИ\n: "))
(setq nnp1 (atoi nnp))
(setq a1 (entnext))(princ "a =")(princ a1)(terpri)
(setq b1 t)(setq tip (cdr(assoc '0 (entget a1))))
(while b1 (princ "tip =")(princ tip)(terpri)
(if (or (equal tip "ATTDEF")(equal tip "ATTRIB"))(progn
(setq imj (cdr(assoc '2 (entget a1))))
(if
(or(equal imj "S51")(equal imj "S61")(equal imj "S71")(equal imj "S81")
(equal imj "S91")(equal imj "S52")(equal imj "S62")(equal imj "S72")
(equal imj "S82")(equal imj "S92")(equal imj "S53")(equal imj "S63")
(equal imj "S73")(equal imj "S83")(equal imj "S93"))
(progn
(setq b1 (subst (cons 1 nnp) (assoc '1 (entget a1)) (entget a1)))
(entmod b1)(entupd a1)(setq nnp1 (+ nnp1 1) nnp (itoa nnp1))
))
))
(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 © Сайт поддержки пользователей САПР