![]() |
Translate to: |
||||||
| Обратная связь | Новости САПР | Программы | Документация | Полезные советы | Обзорные статьи | ||
| Заказ и разработка | Каталог САПР | САПР-конференция | Библиотека ГОСТов | Наши соавторы | Коммерческое ПО | ||
Третья вновь добавляемая задача, появилась дополнительно в ходе разработки новых блоков светильников с добавляемыми атрибутами для обсчета данных групп светильников, а именно получение мощности по установленным группам светильников и получение общей мощности светильников установленных на чертеже. Атрибуты являются скрытыми, т.е. не видны на чертеже, а используются только программами. Условием обсчета светильников является установка номера группы в атрибуте блока светильника. В другом атрибуте по умолчанию установлена мощность светильника, которая была занесе-на при создании блока.
Установленные блоки в виде светильников на поле чертежа будут последовательно просмотрены и в них будут прочитаны имена атрибутов, несущие в своем значении номер группы и мощность светильников. При этом включаются счетчики групп светильников, которые при нахождении атрибутов блоков светильников будут последовательно добавлять число и мощность найденных светильников, соответственно в счетчики тех групп, к которым относятся светильники.
Задача требует использования блоков, которые являются условным обозначением светильников со скрытыми атрибутами, предназначенным для установки информации – номера группы светильника и мощности светильника. Постановка задачи состоит в том, чтобы найти блок светильника, в нем обнаружить скрытые атрибуты с указанной информацией, выделить из него номер группы и мощность светильника и включить счетчик конкретного светильника для каждой группы и счетчик мощности каждой группы, куда добавлять найденные значения мощности. Процесс повторяется при нахождении программой следующего светильника, по порядку, зависящему от последовательности установки светильников в рисунок. Данный порядок не влияет на процесс обсчета, т.к. программой будет просмотрен каждый примитив в чертеже. По окончании обсчета данных на чертеже, полученные данные выводятся на экран и в файлы с расширением «txt» с именами:
Где N – номер группы. При нахождении блока светильника, программа находит номер группы и производит следующие действия:
Разбор задачи выполнен для обсчета одного светильника в общем виде. Все остальные операции для других светильников аналогичны. Точка с запятой используется для пояснений, которые устанавливаются в тексте программы и на работу программы не влияют.
(defun kop1() |
Программная объединяющая функция обсчета числа светильников и мощности светильников в группе. Функция defun под именем /kop1/ объединяет все выражения и функции программы. В сеансе Автокада она вызывается с помощью команды: (load"имя_файла") - загрузка файла, после чего в скобках указывается (имя_файла) для исполнения. Для нашего случая (load "kop1") - загрузка файла,это выражение достаточно набрать в командной строке Автокада, после чего набрать - (kop1) для исполнения программы, полную запись необходимо указать в командной строке Автокада или в пункте меню. Открывающая скобка функции defun должна закрыться закрывающей скобкой в конце программы. Выглядит это так (defun …………) |
(setq a nil b nil c nil op1 nil)(gc) |
Уничтожение всех переменных, участвующих в программе и очистка памяти для безопасности |
(setq ddn "D:\\0_ATOM\\0_NEW_RAZRAB \\0_SVET_2010_PN_GR\\") |
Для работы с внешними файлами, (получение данных и запись данных в файлы с расширением «txt»), из сеанса Автокада в переменную ddn прописывается путь нахождения файла – обычно это папка, где с программой работает проектировщик. Переменную /ddn/ мы будем подставлять там, где это будет необходимо и она сократит нам время и трудоемкость. |
(if pr (progn (close pr) (setq pr nil)(gc))) |
Закрытие дескриптора файла если он случайно открыт, для будущего использования в программе для профилактики. Условие существования pr позволяет узнать, что он существует и с помощью выражения (close pr) закрыть открытый файл. |
(setq a (entnext)) |
Функция setq - присвоение переменной /а/ имени первого примитива в рисунке в длинной очереди выстроенных друг за другом примитивов чертежа. Команда entnext без аргумента дает имя первого неудаленного примитива в рисунке, тем самым мы находим начало данных примитивов рисунка Автокада. Примитивы Автокада это линии, текст, полилинии, круг, блоки и т.д. |
(setq b (cdr(assoc '0 (entget a)))) |
Выражение для получения из информационной структуры примитива рисунка (внутренней базы данных) - типа примитива INSERT, т.е. вставки блока, выражение можно записать и другим способом - последовательным написанием каждой функции: (setq b (entget a)) - список информационной структуры примитива (СИСП), (setq b (assoc '0 b)) - нахождение в (СИСП) по ключу (паролю) '0 ключевой пары типа примитива (0 . тип_примитива), (setq b (cdr b)) - получение значения второго члена ключевой пары, т.е. типа примитива. Наша задача - отбор всех примитивов с типом INSERT т.е. блоков ,а затем из всего числа блоков, выбор блоков светильников |
(setq bb t aa t) |
Создание переменных /aa/и /bb/, присвоение условного, виртуального существования переменных /aa/и /bb/ с помощью специального знака /t/ без каких либо данных |
(while aa |
Начало цикла, открывающая скобка цикла - вход в цикл, который работает только при существовании переменной /aa/. В цикле происходит повторение задуманных действий до тех пор, пока существует переменная /aa/. При этом происходит последовательный внутренний просмотр примитивов рисунка одного за другим, согласно внутренней иерархии. Вызов нового элемента рисунка происходит в конце цикла с помощью команды (entnext a): При этом с помощью команды (setq a .....) происходит переприсвоение в переменную /а/ имени нового примитива взамен старого, уже просмотренного программой |
(if b (progn |
Если существует найденный примитив (тип примитива), мы попадаем в условие существования примитива. Функция progn позволяет объединить разные выражения, находящиеся внутри условия в одно выражение. Если этого не сделать, то произойдет сбой или ошибка выполнения |
(if (equal b "INSERT")(progn |
Если тип примитива – это блок (вставка блока), то мы попадаем в условие нахождения блока. Функция progn позволяет объединить разные выражения, находящиеся внутри условия в одно выражение. Если этого не сделать, то произойдет сбой или ошибка выполнения |
(while bb |
Если существует переменная /bb/, то мы попадаем в цикл, теперь понятно, что существование виртуальной переменной /bb/ необходимо для запуска цикла отбора атрибутов блоков светильников |
(setq b (cdr(assoc '0 (entget a)))) |
Выражение для получения из информационной структуры примитива рисунка (внутренней базы данных) - типа примитива, выражение можно записать и другим способом - последовательным написанием каждой функции: (setq b (entget a)) - список информационной структуры примитива (СИСП), (setq b (assoc '0 b)) - нахождение в (СИСП) по ключу (паролю) '0 ключевой пары типа примитива (0 . тип_примитива) (setq b (cdr b)) - получение значения второго члена ключевой пары, т.е. типа примитива. Наша задача - отбор всех примитивов - атрибутов блоков с типом ATTRIB, имеющих имена NGR и PNL т.е. атрибутов блоков светильников, содержащих информацию о номере группы и мощности светильника |
(setq imj (cdr(assoc '2 (entget a)))) |
Получение имени атрибута из (СИСП), аналогично /b/ - см. рассмотренное выше выражение для получение типа примитива |
(setq zna (cdr(assoc '1 (entget a)))) |
Получение значения атрибута из (СИСП), аналогично /b/ - см. рассмотренное выше выражение для получение типа примитива |
(if (equal b "ATTRIB") (progn |
Начало условия отбора атрибутов. Выполнение условия, что в переменной /b/ содержится тип примитива – атрибут, т.е. при работе цикла и последовательном просмотре примитивов, содержащихся в рисунке, это условие позволяет пропустить внутрь себя только тогда, когда в переменной /b/ содержится признак атрибута - ATTRIB. Функция progn позволяет объединить разные выражения, находящиеся внутри условия в одно выражение. Если этого не сделать, то произойдет сбой или ошибка выполнения |
(if (and (not (equal zna "")) (equal imj "NGR"))(progn |
Условие отбора атрибута, который имеет какое-то значение и имя, равное NGR, которое соответствует атрибуту, содержащему номер группы |
(setq op1 "1") |
Присваиваем условному определителю (переменной) op1 значение «1» |
(if (not zna)(prong (setq zna "0"))) |
В случае, если отсутствует значение, присваиваем переменной zna значение «0» |
(setq ngr zna) |
Теперь создаем переменную ngr и присваиваем ей значение содержащееся в переменной zna |
(setq imj nil zna nil) |
Уничтожаем ставшие ненужными переменные imj и zna |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие по определению номера группы |
(if (and (not (equal zna "")) (equal imj "PNL"))(progn |
Условие отбора атрибута, который имеет какое-то значение и имя, равное PNL, которое соответствует атрибуту, содержащему мощность светильника |
(setq op2 "1") |
Присваиваем условному определителю (переменной) op2 значение «1» |
(if (not zna)(prong (setq zna "0"))) |
В случае, если отсутствует значение, присваиваем переменной zna значение «0» |
(setq mos zna) |
Теперь создаем переменную mos и присваиваем ей значение содержащееся в переменной zna – т.е. мощность светильника или «0» |
(setq imj nil zna nil) |
Уничтожаем ставшие ненужными переменные imj и zna |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие по определению мощности светильника |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие по определению типа примитива ATTRIB, который является атрибутом |
(setq a (entnext a)) |
Выражение для перелистывания примитивов и получения имени следующего примитива или подпримитива, т.е. функция entnext с именем /а/ - предыдущего примитива, дает имя следующего примитива, которое записывается в переменную /а/ |
(if a (progn |
Условие проверки существования следующего примитива, если существует попадаем внутрь условия. |
(setq b (cdr(assoc '0 (entget a)))) |
Выражение для получения из информационной структуры примитива рисунка (внутренней базы данных) - типа примитива, выражение можно записать и другим способом - последовательным написанием каждой функции: (setq b (entget a)) - список информационной структуры примитива (СИСП),(setq b (assoc '0 b)) - нахождение в (СИСП) по ключу (паролю) '0 ключевой пары типа примитива (0 . тип_примитива)(setq b (cdr b)) - получение значения второго члена ключевой пары, т.е. типа примитива. Наша задача - найти признак окончания блока, этот признак "SEQEND" появляется, когда заканчивается просмотр всех атрибутов блока |
(if (equal b "SEQEND") (progn (setq bb nil))) |
Условие появление конца блока, если подтверждается, то следует обнуление переменной /bb/ и выход из цикла работы с блоком светильника |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие по определению существования следующего примитива |
(if (not a)(progn (setq bb nil aa nil))) |
Условие проверки общего отсутствия существования примитива – это может быть в случае окончания просмотра всех примитивов в чертеже, тогда попадаем в условие и следует уничтожение переменных поддерживающих работу двух циклов /aa/ и /bb/ |
) |
Скобка закрытия внутреннего цикла |
(if pr (progn (close pr) (setq pr nil)(gc))) |
Закрытие дескриптора файла если он открыт. Условие существования pr позволяет узнать, что он существует и с помощью выражения (close pr) закрыть открытый файл |
(if (and (not op2) (equal op1 "1"))(progn |
Условие гипотетического варианта, когда номер группы у светильника есть, а мощность отсутствует |
(setq op1 nil op2 nil ngr nil mos nil mos1 nil mosf nil mosf1 nil zna nil imj nil)(gc) |
В этом случае необходимо уничтожить все переменные, которые могут использоваться в процессе программы |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие гипотетического варианта |
(if (and (equal op1 "") (equal op2 "1"))(progn |
Условие редкого варианта, когда у светильника отсутствует номер группы (ошибка ввода номера группы) и имеется мощность |
(setq nazv (strcat ddn "_dangr.txt")) (setq pr (open nazv "r")) |
В переменную nazv записываем имя файла "_dangr" без номера, которое обьединяем с путем нахождения файла /ddn/ с помощью функции strcat. Этот файл будет использоваться для сброса мощности светильников, в которых не указан номер группы. После этого получаем дескриптор файла /pr/, (признак "r" – чтение файла), который поможет напрямую обратиться к файлу и прочитать записанные раннее в него данные |
(setq nazv1 (strcat ddn "_svet.txt")) (setq pr1 (open nazv1 "r")) |
То же самое проделываем с файлом "_svet.txt", в который будем добавлять количество светильников, не имеющих номера группы. Дескриптор файла /pr1/ |
(if (not pr) (progn (setq pr (open nazv "w")) (write-line mos pr) (close pr)(setq pr nil))) |
Если /pr/ не существует, это говорит о том, что такого файла "_dangr" нет, и значит надо его создать. Для этого мы снова вызываем дескриптор файла аналогичным способом, но уже для записи данных (признак "w").В результате создается указанный файл. С помощью выражения (write-line mos pr) мы записываем неучтенную мощность и закрываем файл |
(if (not pr1) (progn (setq pr1 (open nazv1 "w")) (write-line "1" pr1) (close pr1)(setq pr1 nil))) |
Аналогичным образом работаем с файлом количества светильников, не имеющих признака номера группы. Только записываем в файл 1 светильник |
(if pr (progn |
Если же файл существует, то необходимо прочитать величину мощности, спрятан-ную в файле, превратить ее в целое число и добавить мощность светильника. Затем записать в файл новую величину мощности |
(setq mosf (read-line pr)) |
Чтение символьного значение величины мощности из файла |
(setq mos1 (atoi mos)) |
Преобразование мощности светильника в целое число |
(setq mosf1 (atoi mosf)) |
Преобразование мощности, содержащейся в файле, в целое число |
(if (not mos1)(setq mos1 0)) |
Предохранительное полезное действие, если отсутствует мощность светильника, то присваиваем ей нулевое значение для поддержания следующих арифметических действий |
(setq mos1 (+ mosf1 mos1)) |
Складываем мощность светильника и общую мощность файла |
(setq mos (itoa mos1)) |
Преобразовываем общую мощность в символ, теперь можно записать эту величину в файл |
(setq pr (open nazv "w")) (write-line mos pr) (close pr)(setq pr nil) |
Снова открываем файл общей мощности для светильников без номера группы и записываем новую величину общей мощности с помощью выражения (write-line mos pr) , после чего закрываем файл. Кстати можно напомнить, что одновременно открытых файлов может быть только четыре |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие /pr/ - существования файла |
(if pr1 (progn |
Аналогичное условие для существования файла числа светильников не имеющих номера группы. Если файл существует, то необходимо прочитать число светильников, спрятанных в файле, превратить его в целое число и добавить число нового светильника, т.е. единицу. Затем записать в файл новую величину числа светильников |
(setq nsvf (read-line pr1)) |
Чтение символьного значение величины числа светильников без номера группы из файла |
(setq nsvf1 (atoi nsvf)) |
Преобразование величины числа светильников в целое число |
(setq nsv1 1) |
Число найденного светильника, т.е. единица |
(setq nsv1 (+ nsvf1 nsv1)) |
Добавляем число найденного светильника в общее число светильников из файла |
(setq nsv (itoa nsv1)) |
Преобразовываем общее число светильников не имеющих номера группы в символ, теперь можно записать эту величину в файл |
(setq pr1 (open nazv1 "w")) (write-line nsv pr1) (close pr1)(setq pr1 nil) |
Снова открываем файл общего числа светильников без номера группы и записы¬ваем новую величину светильников с помощью выражения (write-line nsv pr1) , после чего закрываем файл |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие /pr1/ - существования файла |
(setq op1 nil op2 nil ngr nil mos nil mos1 nil mosf nil mosf1 nil zna nil imj nil)(gc) (setq nsvf nil nsvf1 nil nsv nil nsv1 nil)(gc) |
Уничтожение возможно существующих перменных. Одновременно очищаем память |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие (and (equal op1 "")(equal op2 "1")) – определения наличия признаков существования мощности светильника и отсутствия номера группы |
(if pr (progn (close pr) (setq pr nil)(gc))) |
Если вдруг файл мощности остался открытым, его надо закрыть |
(if (and (equal op1 "1")
(equal op2 "1"))(progn |
И наконец основное условие, когда у проверяемого блока светильника присутствуют данные по номеру группы и по мощности, это подтверждается определителями op1, op2, которые существуют и имеют определенное значение «1» |
(setq nazv (strcat ddn ngr "_dangr.txt")) (setq pr (open nazv "r")) |
Мы уже рассматривали похожее выражение, в данном случае мы объединяем в общую строку путь нахождения файла, номер группы и имя файла. Видно, что номер группы существенно меняет имя файла. По мере роста номера будут появляться новые файлы. Файл "_dangr.txt" с номером, объединяется с путем нахождения файла /ddn/ с помощью функции strcat. Этот файл будет использоваться для сброса мощности светильников, у которых имеется номер группы. После этого получаем дескриптор файла /pr/, (признак "r"–чтение файла), который поможет напрямую обратиться к файлу и прочитать записанные раннее в него данные |
(setq nazv1 (strcat ddn ngr "_svet.txt")) (setq pr1 (open nazv1 "r")) |
Аналогично работаем с файлом количества светильников. Создается выражение в которое мы объединяем в общую строку путь нахождения файла, номер группы и имя файла. Видно, что номер группы существенно меняет имя файла. По мере роста номера будут появляться новые файлы. Файл "_svet.txt" с номером, объединяется с путем нахождения файла /ddn/ с помощью функции strcat. Этот файл будет использоваться для добавления числа найденных светильников, у которых имеется номер группы. После этого получаем дескриптор файла /pr1/, (признак "r"–чтение файла), который поможет напрямую обратиться к файлу и прочитать записанные раннее в него данные |
(if (not pr) (prong (setq pr (open nazv "w")) (write-line mos pr) (close pr)(setq pr nil))) |
Если /pr/ не существует, это говорит о том, что такого файла "_dangr" (с номером группы впереди) нет, и значит надо его создать. Для этого мы снова вызываем дескриптор файла аналогичным способом, но уже для записи данных (признак "w").В результате создается указанный файл. С помощью выражения (write-line mos pr) мы записываем мощность светильника и закрываем файл |
(if (not pr1) (progn (setq pr1 (open nazv1 "w")) (write-line "1" pr1) (close pr1)(setq pr1 nil))) |
Аналогичным образом работаем с файлом количества светильников, имеющих признак номера группы. Только записываем в файл 1 светильник. Т.е. мы создали новый файл числа светильников с конкретным номером группы |
(if pr (progn |
Если файл мощности конкретной группы светильников существует, то мы попадаем в условие |
(setq mosf (read-line pr)) |
Читаем из файла величину мощности, которая туда записана ранее |
(setq mos1 (atoi mos)) |
Преобразовываем величину мощности найденного светильника в целое число |
(setq mosf1 (atoi mosf)) |
Преобразовываем величину общей мощности в целое число |
(if (not mos1)(setq mos1 0)) |
Если вдруг не найдена мощность светильника, присваиваем ей нулевой значения для возможности участия в арифметических операциях. |
(setq mos1 (+ mosf1 mos1)) (setq mos (itoa mos1)) |
Складываем общую мощность группы и мощность светильника и полученное число преобразовываем в символьное выражения, для того, чтобы можно было его записать в файл |
(setq pr (open nazv "w")) (write-line mos pr) (close pr)(setq pr nil) |
Снова открываем файл общей мощности для светильников группы и записываем новую величину общей мощности с помощью выражения (write-line mos pr) , после чего закрываем файл. Кстати можно напомнить, что одновременно открытых файлов может быть только четыре |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие /pr/ - существования файла |
(if pr1 (progn |
Аналогичное условие для существования файла числа светильников имеющих номер группы. Если файл существует, то необходимо прочитать число светильников, спрятанных в файле, превратить его в целое число и добавить число нового светильника, т.е. единицу. Затем записать в файл новую величину числа светильников |
(setq nsvf (read-line pr1)) |
Чтение символьного значения величины числа светильников группы из файла |
(setq nsvf1 (atoi nsvf)) |
Преобразование величины числа светильников в целое число |
(setq nsv1 1) |
Число найденного светильника, т.е. единица |
(setq nsv1 (+ nsvf1 nsv1)) |
Добавляем число найденного светильника в общее число светильников из файла |
(setq nsv (itoa nsv1)) |
Преобразовываем общее число светильников группы в символ, теперь можно записать эту величину в файл |
(setq pr1 (open nazv1 "w")) (write-line nsv pr1) (close pr1)(setq pr1 nil) |
Снова открываем файл общего числа светильников группы и записываем новую величину светильников с помощью выражения (write-line nsv pr1), после чего закрываем файл. |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие /pr1/ - существования файла |
(setq op1 nil op2 nil ngr nil mos nil mos1 nil mosf nil mosf1 nil zna nil imj nil)(gc) (setq nsvf nil nsvf1 nil nsv nil nsv1 nil)(gc) |
Уничтожение возможно существующих ненужных переменных. Одновременно очищаем память |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие (and (equal op1 "1")(equal op2 "1")) – определения наличия признаков существования мощности светильника и присутствия номера группы |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие нахождения блока (INSERT). |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие существования примитива (b) |
(setq op1 nil op2 nil ngr nil mos nil mos1 nil mosf nil mosf1 nil zna nil imj nil)(gc) |
Уничтожение возможно существующих ненужных переменных. Одновременно очищаем память |
(if aa (progn (setq a (entnext a)))) |
Если переменная /aa/ существует, то работа внешнего цикла продолжается, и мы попадаем в условие, где выражение для перелистывания примитивов и получения имени следующего примитива или подпримитива, т.е. функция entnext с именем /а/ - предыдущего примитива, дает имя следующего примитива, которое записывается в переменную /а/ |
(if a (progn (setq b (cdr(assoc '0 (entget a)))) )) |
Если полученный следующий примитив существует, т.е. нет окончания списка примитивов в чертеже, данное условие помогает получить тип примитива, рассматривалось ранее |
(if (not a) (progn (setq aa nil))) |
Если следующий примитив не существует, значит до этого был рассмотрен последний примитив в чертеже, попадая внутрь условия мы уничтожаем переменную /aa/, тем самым заканчивая работу внешнего цикла |
) |
Скобка закрывающая внешний цикл |
(setq aa t ngr "1")> |
Следующим шагом является получения существования виртуальной переменной /aa/ для запуска нового цикла и присвоение переменной /ngr/ символьного значения «1». Задача, которая стоит перед нами заключается в следующем, на диске находятся текстовые файлы, содержащие количество светильников и их общую мощность по номерам групп и нам надо вывести на текстовый экран Автокада информацию, которая в них содержится |
(while aa |
Включение цикла просмотра файлов на диске и извлечения из них информации |
(setq nazv (strcat ddn ngr "_dangr.txt")) (setq pr (open nazv "r")) |
Открытие файла общей мощности светильников в группе (strcat ddn ngr "_dangr.txt"), если рассмотреть это выражение, то при /ngr/ равном «1» и пути к файлу, например "D:\\0_ATOM\\0_NEW_RAZRAB\\" Мы получим файл "1_dangr.txt" c указанным путем доступа "D:\\0_ATOM\\0_NEW_RAZRAB\\1_dangr.txt " Признак "r" говорит о том, что мы открыли файл для чтения |
(setq nazv1 (strcat ddn ngr "_svet.txt")) (setq pr1 (open nazv1 "r")) |
Аналогично открытие файла количества светильников в группе |
(if (and pr pr1)(progn |
Попадание в условие – существование открытых файлов |
(setq mos (read-line pr)) |
Чтение величины мощности из файла |
(setq chs (read-line pr1)) |
Чтение величины светильников из файла |
(terpri) |
Попадание в текстовом режиме Автокада на новую строку |
(princ "===========")(terpri) |
Создание визуальной разделительной черты для удобства просмотра информации в текстовом режиме Автокада |
(princ "Номер группы = ") (princ ngr)(terpri) |
Вывод строки информации о номере группы в текстовом режиме Автокада |
(princ "Число светильников в группе = ") (princ chs)(terpri) |
Вывод строки информации о количестве светильников в группе |
(princ "Мощность группы = ") (princ mos) (terpri) |
Вывод строки информации об общей мощности светильников в группе |
(princ "===========")(terpri) |
Создание визуальной разделительной черты для удобства просмотра информации в текстовом режиме Автокада |
)) |
Первая скобка закрывает выражение PROGN, а вторая скобка закрывает условие вывода информации на текстовый экран Автокада, т.е. условие существования переменных /pr/ и /pr1/. |
(setq ngr1 (atoi ngr)) |
Выделение символьной величины номера группы в целое число |
(setq ngr1 (+ ngr1 1)) |
Добавление единицы в номер группы, т.е. если была первая группа, станет вторая |
(setq ngr (itoa ngr1)) |
Преобразование целого числа номера группы в символ |
(if (and (not pr)(not pr1))(setq aa nil)) |
Это условие позволяет выйти из цикла, если закончится список файлов, которые можно открыть (и файлы группы номер 15 например не существуют), т.е. до этого мы просмотрели 14 групп файлов, которые находятся на диске |
) |
Скобка закрывающая цикл просмотра данных |
(setq a nil b nil c nil a1 nil)(gc) (setq imj nil op1 nil op2 nil)(gc) |
Удаление неиспользуемых переменных перед окончанием программы |
) |
Скобка закрытия программной объединяющей функции обсчета и просмотра данных групп светильников. (Функция defun) под именем /kop1/ |
(defun kop1() ;функция счета числа светильников и мощности по группам
(setq a nil b nil c nil imj nil op1 nil)(gc)
(setq ddn "D:\\0_ATOM\\0_NEW_RAZRAB\\0_SVET_2010_PN_GR\\")
(if pr (progn (close pr)(setq pr nil)(gc)))
(setq a (entnext))
(setq b (cdr(assoc '0 (entget a))) aa t bb t)
(while aa ;10
(if b (progn ;1
(if (equal b "INSERT")(progn (setq bb t) ;2
(while bb ;11
(setq b (cdr(assoc '0 (entget a))))
(setq imj (cdr(assoc '2 (entget a))))
(setq zna (cdr(assoc '1 (entget a))))
(if (equal b "ATTRIB")(progn ;4
(if (and (not(equal zna ""))(equal imj "NGR"))(progn
(setq op1 "1")
(if (not zna)(progn
(setq zna "0")))(setq ngr zna)(setq imj nil zna nil)
))
(if (and (not(equal zna ""))(equal imj "PNL"))(prong
(setq op2 "1")
(if (not zna)(progn (setq zna "0")))
(setq mos zna)
))
(setq imj nil zna nil)
)) ;4
(setq a (entnext a))
(if a (progn
(setq b (cdr(assoc '0 (entget a))))
;(setq imj (cdr(assoc '2 (entget a))))
;(setq zna (cdr(assoc '1 (entget a))))
(if (equal b "SEQEND")(progn (setq bb nil)))
))
(if (not a)(progn (setq bb nil aa nil)))
) ;11
(if pr (progn (close pr)(setq pr nil)(gc)))
(if (and (not op2)(equal op1 "1"))(progn
(princ "nazv = ")(princ nazv)(terpri)
(setq op1 nil op2 nil ngr nil mos nil mos1 nil)(gc)
(setq mosf nil mosf1 nil zna nil imj nil)(gc)
))
(if pr (progn (close pr)(setq pr nil)(gc)))
(if (and (equal op1 "")(equal op2 "1"))(progn
(setq nazv (strcat ddn "_dangr.txt"))(setq pr (open nazv "r"))
(setq nazv1 (strcat ddn "_svet.txt"))(setq pr1 (open nazv1 "r"))
(if (not pr) (progn
(setq pr (open nazv "w"))(write-line mos pr)(close pr)
(setq pr nil)
))
(if (not pr1) (progn
(setq pr1 (open nazv1 "w"))(write-line "1" pr1)(close pr1)
(setq pr1 nil)
))
(if pr (progn
(setq mosf (read-line pr))(setq mos1 (atoi mos))
(setq mosf1 (atoi mosf))
(if (not mos1)(setq mos1 0))
(setq mos1 (+ mosf1 mos1))(setq mos (itoa mos1))
(setq pr (open nazv "w"))(write-line mos pr)(close pr)
(setq pr nil)
))
(if pr1 (progn (setq nsvf (read-line pr1))(setq nsvf1 (atoi nsvf))
(setq nsv1 1)(setq nsv1 (+ nsvf1 nsv1))
(setq nsv (itoa nsv1))
(setq pr1 (open nazv1 "w"))
(write-line nsv pr1)(close pr1)(setq pr1 nil)
))
(setq op1 nil op2 nil ngr nil mos nil mos1 nil)
(setq mosf nil mosf1 nil zna nil imj nil)(gc)
(setq nsvf nil nsvf1 nil nsv nil nsv1 nil)(gc)
))
(if pr (progn (close pr)(setq pr nil)(gc)))
(if (and (equal op1 "1")(equal op2 "1"))(progn
(setq nazv (strcat ddn ngr "_dangr.txt"))(setq pr (open nazv "r"))
(setq nazv1 (strcat ddn ngr "_svet.txt"))
(setq pr1 (open nazv1 "r"))
(if (not pr) (progn (setq pr (open nazv "w"))
(write-line mos pr)(close pr)(setq pr nil)
))
(if (not pr1) (progn (setq pr1 (open nazv1 "w"))
(write-line "1" pr1)(close pr1)(setq pr1 nil)
))
(if pr (progn (setq mosf (read-line pr))(setq mos1 (atoi mos))
(setq mosf1 (atoi mosf))
(if (not mos1)(setq mos1 0))
(setq mos1 (+ mosf1 mos1))(setq mos (itoa mos1))
(setq pr (open nazv "w"))
(write-line mos pr)(close pr)(setq pr nil)
))
(if pr1 (progn (setq nsvf (read-line pr1))(setq nsvf1 (atoi nsvf))
(setq nsv1 1)(setq nsv1 (+ nsvf1 nsv1))
(setq nsv (itoa nsv1))
(setq pr1 (open nazv1 "w"))
(write-line nsv pr1)(close pr1)(setq pr1 nil)
))
(setq op1 nil op2 nil ngr nil mos nil mos1 nil)
(setq mosf nil mosf1 nil zna nil imj nil)(gc)
(setq nsvf nil nsvf1 nil nsv nil nsv1 nil)(gc)
))
)) ;2
)) ;1
(setq op1 nil op2 nil ngr nil mos nil mos1 nil)
(setq mosf nil mosf1 nil zna nil imj nil)(gc)
(if aa (progn (setq a (entnext a))))
(if a (progn (setq b (cdr(assoc '0 (entget a))))
(setq b (cdr(assoc '0 (entget a))))
)) ;(princ "a = ")(princ a)(terpri)
(if (not a) (progn (setq aa nil)))
) ;10
(setq aa t ngr "1")
(while aa
(setq nazv (strcat ddn ngr "_dangr.txt"))(setq pr (open nazv "r"))
(setq nazv1 (strcat ddn ngr "_svet.txt"))(setq pr1 (open nazv1 "r"))
(if (and pr pr1)(progn (setq mos (read-line pr))
(setq chs (read-line pr1))
(terpri)
(princ "==============================================")(terpri)
(princ " Номер группы = ")(princ ngr)(terpri)
(princ " Число светильников в группе = ")(princ chs)(terpri)
(princ " Мощность группы = ")(princ mos)(terpri)
(princ "==============================================")(terpri)
))
(setq ngr1 (atoi ngr))(setq ngr1 (+ ngr1 1))(setq ngr (itoa ngr1))
(if (and (not pr)(not pr1))(setq aa nil))
)
(setq a nil b nil c nil imj nil op1 nil op2 nil)(gc)
)
Copyright © Сайт поддержки пользователей САПР