Логотип сайта поддержки пользователей САПРО сайте поддержки пользователей САПР Translate to:
Hosting Ukraine

Программа (p_tbs) – автоматическая установка данных, содержащихся в переменных программ в таблицу данных, в том числе количества и номера свай по модификациям

Оглавление

Пятая выбираемая задача, предназначена для установки данных числового обсчета свай, содержащихся в переменных, в таблицу данных расчета. Таблица состоит из блока «tabl_svaj», который автоматически выводится на поле чертежа в процессе работы задач. Данная задача и предназначена для установки в атрибуты расчетных данных таблицы обсчета – количество свай и перечень порядковых номеров свай данной модификации.

1. Описание технологии автоматического процесса установки табличных данных количества и порядковых номеров свай.

Данные обсчета свайного поля содержатся в переменных, созданных с помощью задач программы в режиме Автокада. Установка данных возможна только тогда, когда задача обнаружит существующие переменные и найдет соответствующий им атрибут, в который и установит данные, содержащиеся в переменной.

2. Разбор решения задачи для создания программы.

Задача требует наличия установленного в чертеже блока таблицы с атрибутами, для количества и порядковых номеров свай, соответствующих модификации конкретной сваи. Решение задачи состоит в том, чтобы найти конкретный атрибут таблицы и установить в него данные, содержащиеся в конкретной существующей переменной. Возможности таблицы всегда превышают конкретные данные свайного поля. Процесс повторяется при нахождении программой следующего атрибута таблицы, по порядку, установленному в задаче по возрастанию модификаций свай. Наглядно видно существование общего цикла, который работает, как "вертушка". Он крутится и просматривает примитивы чертежа, которые последовательно анализируются программой.

В цикл можно попасть только в случае наличия специальной переменной, создающейся специально для работы цикла. После этого необходимо:

После выполнения этих действий срабатывает механизм проверки найденного примитива, если он соответствует табличному имени атрибута, то мы сохраняем метку этого атрибута в специальной переменной. Поскольку у нас имеется два атрибута, соответствующие одной свае, то и переменных в которые мы запишем метки будет две. После этого цикл заканчивает свою работу. Следующими действиями программы будет проверка в условиях наличия счетчиков свай. При их наличии мы попадаем в условие и вызвав метку соответствующего атрибута, находим этот атрибут, чтобы занести в него количество конкретной сваи. Аналогично проверяем наличие списка конкретной сваи и при его наличии попадаем в соответствующее условие и устанавливаем в атрибуте список номеров конкретных свай. После окончания программы, мы получаем таблицу в которой отражены списки номеров и количество конкретных свай, которые имеются на свайном поле.

3. Написание программы с текстовыми пояснениями, чтобы изучающему человеку не заглядывать в справочник Autolisp.

Разбор задачи выполнен для двух атрибутов данных сваи в общем виде. Все остальные операции для других свай аналогичны. Точка с запятой используется вначале пояснений, которые устанавливаются в тексте программы и на работу программы не влияют.

(defun p_tbs()
Программная объединяющая функция занесения данных в таблицу свай. Функция defun под именем /p_tbs/ объединяет все выражения и функции программы. В сеансе Автокада она вызывается с помощью команды: (load "имя_файла") - загрузка файла, после чего в скобках указывается (имя_файла) для исполнения. Для нашего случая (load " p_tbs ") - загрузка файла,это выражение достаточно набрать в командной строке Автокада, после чего набрать - (p_tbs) для исполнения программы, полную запись необходимо указать в командной строке Автокада или в пункте меню. Открывающая скобка функции defun должна закрыться закрывающей скобкой в конце программы. Выглядит это так (defun …………)
(setq a  (entnext))
Функция setq - присвоение переменной /а/ имени первого примитива в рисунке в длинной очереди выстроенных друг за другом примитивов чертежа. Команда entnext без аргумента дает имя первого неудаленного примитива в рисунке, тем самым мы находим начало данных примитивов рисунка Автокада. Примитивы Автокада это линии, текст, полилинии, круг, блоки и т.д.
(setq b t)
Создание переменной /b/, присвоение условного, виртуального существования переменной /b/ с помощью специального знака /t/ без каких либо данных, она нужна только для того, чтобы запустить цикл
(while b
Начало цикла, открывающая скобка цикла - вход в цикл, который работает только при существовании переменной /b/. В цикле происходит повторение задуманных действий до тех пор, пока существует переменная /b/. При этом происходит последовательный внутренний просмотр примитивов рисунка одного за другим, согласно внутренней иерархии. Вызов нового элемента рисунка происходит в конце цикла с помощью команды (entnext a): При этом с помощью команды (setq a .....) происходит переприсвоение в переменную /а/ имени нового примитива взамен старого, уже просмотренного программой
(setq b    (cdr(assoc '0 (entget a))))
Выражение для получения из информационной структуры примитива рисунка (внутренней базы данных) - типа примитива, выражение можно записать и другим способом - последовательным написанием каждой функции: (setq b (entget a)) - список информационной структуры примитива (СИСП), (setq b (assoc '0 b)) - нахождение в (СИСП) по ключу (паролю) '0 ключевой пары типа примитива (0 . тип_примитива), (setq b (cdr b)) - получение значения второго члена ключевой пары, т.е. типа примитива. Наша задача - отбор всех примитивов с типом ATTRIB т.е. атрибутов, а затем из всего числа атрибутов, выбор атрибутов с именем KS51, KS52…KS91, KS92, KS93. для атрибутов количества свай и выбор атрибутов с именем NS51, NS52…NS91, NS92, NS93. для атрибутов имен свай и получение меток этих атрибутов
(setq met    
(cdr(assoc '5 (entget a))))
Выражение для получения метки для атрибута числа свай и атрибута номеров свай, см.выше
(setq imj   
(cdr(assoc '2 (entget a))))
Выражение для получения имени атрибута числа свай и атрибута номеров свай,см.выше
(if (equal imj "KS51")
Начало условия, открывающая скобка условия. Выполнение условия, что в переменной /imj/ содержится имя атрибута “KS51”, т.е. при работе цикла и последовательном просмотре примитивов, содержащихся в рисунке, условие позволяет отобрать и пропустить внутрь себя только тогда, когда в переменной /imj/ содержится имя атрибута - “KS51
(progn
Функция progn позволяет объединить разные выражения, находящиеся внутри второго условия в одно выражение. Если этого не сделать, то произойдет сбой или ошибка выполнения
(setq ks51 met)
Присвоение переменной KS51 метки атрибута. Вызвав переменную в нужный момент можно получить доступ к атрибуту
))
Окончание prong – 1 скобка, окончание условия – 2 скобка
(if (equal imj "NS51")
Начало условия, открывающая скобка условия. Выполнение условия, что в переменной /imj/ содержится имя атрибута “NS51”, т.е. при работе цикла и последовательном просмотре примитивов, содержащихся в рисунке, условие позволяет отобрать и пропустить внутрь себя только тогда, когда в переменной /imj/ содержится имя атрибута - “NS51
(progn
Функция progn позволяет объединить разные выражения, находящиеся внутри второго условия в одно выражение. Если этого не сделать, то произойдет сбой или ошибка выполнения
(setq ns51 met)
Присвоение переменной NS51 метки атрибута. Вызвав переменную в нужный момент можно получить доступ к атрибуту
))
Окончание prong – 1 скобка, окончание условия – 2 скобка

Повторение условий для получения меток атрибутов других модификаций свай, аналогично приведенным выше условиям для сваи 5м первой модификации

(setq a (entnext a))
Выражение для перелистывания примитивов и получения имени следующего примитива или подпримитива, т.е. функция entnext с именем /а/ - предыдущего примитива, дает имя следующего примитива, которое записывается в переменную /а/
(princ "a = ")(princ a)
(terpri)
Вывод сообщения об имени примитива в текстовом режиме Автокада, после отладки это выражение удаляется. Функция (terpri) служит для удобства – переносит следующее сообщение в текстовом режиме Автокада на новую строку
(if (not a)(prong
(setq b nil)))
При отсутствии следующих примитивов (после просмотра последнего примитива), переменная /a/ перестает существовать и с помощью этого условия уничтожаем переменную /b/ для прекращения работы цикла
)
Скобка закрытия цикла, после прекращения его работы, а именно при уничтожении переменной /b/
(if n1  (progn
Условие наличия счетчика сваи длиной 5м 1 модификации. Если переменная /n1/ счетчика имеется мы попадаем внутрь условия, для других счетчиков аналогично
(setq a (handent ks51))
Получение имени примитива /а/, в данном случае атрибута количества свай, для установки в него количества свай. Имя конкретного примитива можно получить, если знать его метку и тогда функция (handent «метка») позволяет получить имя примитива, а значит и доступ к нему
(setq n1 (itoa n1))
Изменение свойств переменной счетчика /n1/ из целого числа в литерал. Такие операции необходимы для того, чтобы установить целое число в атрибут
(setq b (subst (cons 1 n1) (assoc '1 (entget a))
		(entget a)))
Выражение для установки переменной /n1/ в атрибут: функция subst позволяет выполнить следующую операцию – (subst <новый элемент> <старый элемент> <список>)
<новый элемент> - это выражение (cons 1 n1), конструктор новой ключевой пары для списка
<старый элемент> - это выражение (assoc '1 (entget a))
<список> - это выражение (entget a)
В переменную /b/ с помощью функции setq, записывается структурированный (измененный) список атрибута количества свай с установленным значением количества свай
(entmod b)
Функция преобразует структурированный список описывающий атрибут в формат, возвращаемый функцией (entget) и обновляет информацию базы данных о примитиве, т.е. модифицирует в нашем случае – атрибут количества свай
(entupd a)
Функция позволяет обновить на экране модифицированный блок вместе с атрибутами, т.е. проявить вновь вставленную информацию
(setq n1 nil)(gc)
В связи с ненужностью, уничтожение переменной счетчика свай и очистка памяти Ав-токада
))
Первая скобка – закрытие функции prong, Вторая скобка – закрытия условия счетчика свай 5м модификации 1
(if s51  (progn
Условие наличия имен свай длиной 5м модификации 1. Если переменная /s51/ содержащая имена свай имеется, мы попадаем внутрь условия, для других имен свай аналогично
(setq a1 (handent ns51))
Получение имени примитива /а1/, в данном случае атрибута имен свай длиной 5м модификации 1, для установки в него имен свай. Имя конкретного примитива можно получить, если знать его метку и тогда функция (handent «метка») позволяет получить имя примитива, а значит и доступ к нему
(setq b1 (subst
(cons 1 s51) (assoc '1 (entget a1)) (entget a1)))
Выражение для установки переменной /s51/ в атрибут:функция subst позволяет выполнить следующую операцию – (subst <новый элемент > <старый элемент> <список>)
<новый элемент> - это выражение (cons 1 s51), конструктор новой ключевой пары для списка
<старый элемент> - это выражение (assoc '1 (entget a1))
<список> - это выражение (entget a1)
В переменную /b1/ с помощью функции setq, записывается структурированный (измененный) список атрибута имен свай 5м N1 с установленным значением имен свай
(entmod b)
Функция преобразует структурированный список описывающий атрибут в формат, возвращаемый функцией (entget) и обновляет информацию базы данных о примитиве, т.е. модифицирует в нашем случае – атрибут имен свай
(entupd a)
Функция позволяет обновить на экране модифицированный блок вместе с атрибутами, т.е. проявить вновь вставленную информацию
(setq s51 nil)(gc)
В связи с ненужностью, уничтожение переменной имен свай и очистка памяти Автокада
))
Первая скобка – закрытие функции prong, Вторая скобка – закрытия условия установки имен свай 5м модификации 1

Условия для других свай построены по аналогичному принципу и в дополнительном рассмотрении не нуждаются

(setq a nil b nil znu nil imj nil)(gc)
(setq a1 nil b1 nil met nil)(gc)
Удаление неиспользуемых переменных перед окончанием программы
)
Скобка закрытия программной объединяющей функции данных свай. (Функция defun) под именем /p_tbs/

Текст программы вставки данных свай в таблицу чертежа Автокада (P_TBS.lsp)

(defun p_tbs(); поиск данных - ТАБЛИЦА СВАЙ - ЯЧЕЙКИ
(setq a (entnext) b t)
(while b ; цикл поиска меток в таблице  
 (princ "b = ")(princ b)(terpri)
 (princ "imj = ")(princ imj)(terpri)
 (setq imj (cdr(assoc '2 (entget a))))
 (setq met (cdr(assoc '5 (entget a))))
 (setq b (cdr(assoc '0 (entget a))))
 (if (equal imj "KS51") (progn (setq ks51 met)))
 (if (equal imj "NS51") (progn (setq ns51 met)))
 (if (equal imj "KS52") (progn (setq ks52 met)))
 (if (equal imj "NS52") (progn (setq ns52 met)))
 (if (equal imj "KS53") (progn (setq ks53 met)))
 (if (equal imj "NS53") (progn (setq ns53 met)))
 (if (equal imj "KS61") (progn (setq ks61 met)))
 (if (equal imj "NS61") (progn (setq ns61 met)))
 (if (equal imj "KS62") (progn (setq ks62 met)))
 (if (equal imj "NS62") (progn (setq ns62 met)))
 (if (equal imj "KS63") (progn (setq ks63 met)))
 (if (equal imj "NS63") (progn (setq ns63 met)))
 (if (equal imj "KS71") (progn (setq ks71 met)))
 (if (equal imj "NS71") (progn (setq ns71 met)))
 (if (equal imj "KS72") (progn (setq ks72 met)))
 (if (equal imj "NS72") (progn (setq ns72 met)))
 (if (equal imj "KS73") (progn (setq ks73 met)))
 (if (equal imj "NS73") (progn (setq ns73 met)))
 (if (equal imj "KS81") (progn (setq ks81 met)))
 (if (equal imj "NS81") (progn (setq ns81 met)))
 (if (equal imj "KS82") (progn (setq ks82 met)))
 (if (equal imj "NS82") (progn (setq ns82 met)))
 (if (equal imj "KS83") (progn (setq ks83 met)))
 (if (equal imj "NS83") (progn (setq ns83 met)))
 (if (equal imj "KS91") (progn (setq ks91 met)))
 (if (equal imj "NS91") (progn (setq ns91 met)))
 (if (equal imj "KS92") (progn (setq ks92 met)))
 (if (equal imj "NS92") (progn (setq ns92 met)))
 (if (equal imj "KS93") (progn (setq ks93 met)))
 (if (equal imj "NS93") (progn (setq ns93 met)))
 (setq a (entnext a))
 (princ "a = ")(princ a)(terpri)
 (if (not a)(progn (setq b nil)))
)
(if n1 (progn (setq a (handent ks51))(setq n1 (itoa n1))
  (setq b (subst (cons 1 n1)(assoc '1 (entget a))(entget a)))
  (entmod b)(entupd a)(setq n1 nil)(gc)))
(if s51 (progn (setq a1 (handent ns51))
  (setq b1 (subst (cons 1 s51)(assoc '1 (entget a1))(entget a1)))
  (entmod b1)(entupd a1)(setq s51 nil)(gc)))
(if n11 (progn (setq a (handent ks52))(setq n11 (itoa n11))
  (setq b (subst (cons 1 n11)(assoc '1 (entget a))(entget a)))
  (entmod b)(entupd a)(setq n11 nil)(gc)))
(if s52 (progn (setq a1 (handent ns52))
   (setq b1 (subst (cons 1 s52)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s52 nil)(gc)))
(if n12 (progn (setq a (handent ks53))(setq n12 (itoa n12))
   (setq b (subst (cons 1 n12)(assoc '1 (entget a))(entget a)))
   (entmod b)(entupd a)(setq n12 nil)(gc)))
(if s53 (progn (setq a1 (handent ns53))
   (setq b1 (subst (cons 1 s53)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s53 nil)(gc)))
(if n2  (progn (setq a (handent ks61))(setq n2 (itoa n2))
   (setq b (subst (cons 1 n2)(assoc '1 (entget a))(entget a)))
   (entmod b)(entupd a)(setq n2 nil)(gc)))
(if s61 (progn (setq a1 (handent ns61))
   (setq b1 (subst (cons 1 s61)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s61 nil)(gc)))
(if n21 (progn (setq a (handent ks62))(setq n21 (itoa n21))
   (setq b (subst (cons 1 n21)(assoc '1 (entget a))(entget a)))
   (entmod b)(entupd a)(setq n21 nil)(gc)))
(if s62 (progn (setq a1 (handent ns62))
   (setq b1 (subst (cons 1 s62)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s62 nil)(gc)))

(if n22 (progn (setq a (handent ks63))(setq n22 (itoa n22))
   (setq b (subst (cons 1 n22) (assoc '1 (entget a)) (entget a)))
   (entmod b)(entupd a)(setq n22 nil)(gc)))
(if s63 (progn (setq a1 (handent ns63))
   (setq b1 (subst (cons 1 s63)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s63 nil)(gc)))
(if n3  (progn (setq a (handent ks71))(setq n3 (itoa n3))
   (setq b (subst (cons 1 n3) (assoc '1 (entget a)) (entget a)))
   (entmod b)(entupd a)(setq n3 nil)(gc)))
(if s71 (progn (setq a1 (handent ns71))
   (setq b1 (subst (cons 1 s71)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s71 nil)(gc)))
(if n31 (progn (setq a (handent ks72))(setq n31 (itoa n31))
   (setq b (subst (cons 1 n31) (assoc '1 (entget a)) (entget a)))
   (entmod b)(entupd a)(setq n31 nil)(gc)))
(if s72 (progn (setq a1 (handent ns72))
   (setq b1 (subst (cons 1 s72)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s72 nil)(gc)))
(if n32 (progn (setq a (handent ks73))(setq n32 (itoa n32))
   (setq b (subst (cons 1 n32) (assoc '1 (entget a)) (entget a)))
   (entmod b)(entupd a)(setq n32 nil)(gc)))
(if s73 (progn (setq a1 (handent ns73))
   (setq b1 (subst (cons 1 s73)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s73 nil)(gc)))
(if n4  (progn (setq a (handent ks81))(setq n4 (itoa n4))
   (setq b (subst (cons 1 n4) (assoc '1 (entget a)) (entget a)))
   (entmod b)(entupd a)(setq n4 nil)(gc)))
(if s81 (progn (setq a1 (handent ns81))
   (setq b1 (subst (cons 1 s81)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s81 nil)(gc)))
(if n41 (progn (setq a (handent ks82))(setq n41 (itoa n41))
   (setq b (subst (cons 1 n41) (assoc '1 (entget a)) (entget a)))
   (entmod b)(entupd a)(setq n41 nil)(gc)))
(if s82 (progn (setq a1 (handent ns82))
   (setq b1 (subst (cons 1 s82)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s82 nil)(gc)))
(if n42 (progn (setq a (handent ks83))(setq n42 (itoa n42))
    (setq b (subst (cons 1 n42) (assoc '1 (entget a)) (entget a)))
    (entmod b)(entupd a)(setq n42 nil)(gc)))
(if s83 (progn (setq a1 (handent ns83))
   (setq b1 (subst (cons 1 s83)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s83 nil)(gc)))
(if n5  (progn (setq a (handent ks91))(setq n5 (itoa n5))
    (setq b (subst (cons 1 n5) (assoc '1 (entget a)) (entget a)))
    (entmod b)(entupd a)(setq n4 nil)(gc)))
(if s91 (progn (setq a1 (handent ns81))
   (setq b1 (subst (cons 1 s91)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s91 nil)(gc)))
(if n51 (progn (setq a (handent ks92))(setq n51 (itoa n51))
    (setq b (subst (cons 1 n51) (assoc '1 (entget a)) (entget a)))
    (entmod b)(entupd a)(setq n51 nil)(gc)))
(if s92 (progn (setq a1 (handent ns92))
   (setq b1 (subst (cons 1 s92)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s92 nil)(gc)))
(if n52 (progn (setq a (handent ks93))(setq n52 (itoa n52))
    (setq b (subst (cons 1 n52) (assoc '1 (entget a)) (entget a)))
    (entmod b)(entupd a)(setq n52 nil)(gc)))
(if s93 (progn (setq a1 (handent ns93))
   (setq b1 (subst (cons 1 s93)(assoc '1 (entget a1))(entget a1)))
   (entmod b1)(entupd a1)(setq s93 nil)(gc)))
(setq a nil b nil znu nil imj nil met nil)(gc)
(setq a1 nil b1 nil dln nil imj1 nil)(gc)
)
Оглавление



Copyright © Сайт поддержки пользователей САПР