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

Программа (zng) – полуавтоматическая установка номера группы светильника в блок светильника

Оглавление

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

1. Описание технологии процесса ручной нумерации.

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

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

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

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

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

(defun zng ()
Программная объединяющая функция простановки номеров групп светильников на поле чертежа. Функция defun под именем /zng/ объединяет все выражения и функции программы. В сеансе Автокада она вызывается с помощью команды: (load "имя_файла")- загрузка файла, после чего в скобках указывается (имя_файла) для исполнения. Для нашего случая (load "zng") - загрузка файла, после чего - (zng) для исполнения, полную запись необходимо указать в командной строке Автокада или в пункте меню
(setq nnp (getstring "\n ВВЕДИТЕ начальный N ГРУППЫ\n: "))
getstring – функция ввода символьной строки с клавиатуры и записи ее в переменную nnp с помощью функции setq. В нашем случае мы вводим число в виде символа. Почему же нам не иметь переменную nnp с содержанием в виде числа. Это будет объяснено дальше
(setq nnp1 (atoi nnp))
Функция atoi изменяет символьное содержание переменной nnp в числовое (целое) значение, которое присваивается переменной nnp1
(setq a1 
(car(entsel"\n ВЫБЕРИТЕ СВЕТИЛЬНИК для изменения N группы \n: ")))
Команда entsel позволяет выбрать примитив из чертежа, указав на него курсором. Понятно, что это будет блок, определяющий светильник. Возвращает же выражение, список, где первый элемент - это имя выбранного примитива, а второй элемент – это координаты точки, использованной для указания примитива. Функция car позволяет выбрать из списка первый элемент списка, т.е. имя примитива
(princ "a =")(princ a1)(terpri)
Стандартный вывод информации в текстовое окно Автокада о значе-нии переменной /а1/
(setq a1 (entnext a1))
Прокрутка информационной структуры рисунка Автокада на 1 шаг – получение нового имени примитива, следующего за именем блока, в данном случае получение имени примитива, которым является атрибут блока
(setq b1 (cdr(assoc '2 (entget a1))))
Получение имени атрибута. Выражение для получения из информационной структуры примитива рисунка - имени атрибута (например NGR),выражение можно записать и другим способом - последовательным написанием каждой функции: (setq b1 (entget a1)) - список информационной структуры примитива (СИСП), (setq b1 (assoc '2 b1))- нахождение в (СИСП) по ключу (паролю) '2 ключевой пары имени примитива, кстати переменную b1 можно использовать несколько раз, меняя ее назначение. (2 . имя_атрибута) – ключевая пара (setq b1 (cdr b1)) - получение значения второго члена ключевой пары, т.е. имени примитива
(setq tip (cdr(assoc '0 (entget a1))))
Получение типа примитива. Выражение для получения из информационной структуры примитива рисунка - типа примитива, в данном случае тип для атрибута ATTRIB. Выражение можно записать и другим способом - последовательным написанием каждой функции: (setq t1 (ent-get a1)) - список информационной структуры примитива (СИСП), (setq t1 (assoc '0 t1)) - нахождение в (СИСП) по ключу (паролю) '0 ключевой пары типа примитива (0 . тип_примитива), (setq tip (cdr t1)) - получение значения второго члена ключевой пары, т.е. типа примитива (ATTRIB)
(while b1
Цикл 1, если примитив существует, мы попадаем в цикл и вращаемся вместе с ним, пока существует b1, то есть имя атрибута
(if (or (equal tip "ATTDEF")
(equal tip "ATTRIB"))
Условие 0. Если тип примитива является атрибутом, мы попадаем внутрь условия, функция equal сравнивает значение переменной tip с образцом в кавычках, т.е. с обозначением атрибута в типе примитива. Функция логического сравнения выражений or позволяет получить истину для условия, если хотя бы одно из двух выражений будет истиной и получить доступ в условие
(progn
Функция progn позволяет объединить разные выражения находящиеся внутри первого условия в одно выражение. Если этого не сделать, то произойдет сбой или ошибка выполнения программы
(princ "b1 =")(princ b1)(terpri)
Вывод информации на экран с данными о переменной b1. Мы ищем имя атрибута
(if (equal b1 “NGR”) (progn
Условие 1. Если b1 существует и равна выражению «NGR», то мы по-падаем в условие
(setq b1 (subst (cons 1 nnp)
(assoc '1 (entget a1)) (entget a1)))
Действия внутри условия – выражение позволяет заменить в списке старый элемент на новый. Например чтобы заменить в блоке выражение атрибута – номер группы светильника и т.д. надо получить доступ к списку блока. Это выражение и является основным орудием в этой операции. Рассмотрим его внимательнее: (cons 1 nnp) позволяет сконструировать новое выражение ключевой пары (1 . «1»), где «1» - это номер группы. Эта пара и заменит в информационной структуре атрибута блока старое выражение, т.е. заменит на номер группы светильника. (assoc '1 (entget a1)) выражение помогает найти по ключу '1 старое выражение в информационной структуре блока. Оставшееся выражение (entget a1) является списком информационной структуры блока, в котором и заменяется старое выражение на новое. Это важнейшее выражение в языке Автолисп
(entmod b1)(entupd a1)
Функция (entmod b1) модифицирует выражение в списке, а функция (entupd a1) преобразует выражение на чертеже. После замены и установки номера группы светильника, необходимо вывести данные измененного значения атрибута группы светильника на печать в текстовый режим Автокада.
(setq zna
(cdr(assoc '1 (entget a1))))
Получение значения атрибута. Выражение для получения из информационной структуры примитива рисунка - значения атрибута, выражение можно записать и другим способом - последовательным написанием каждой функции: (setq per (entget a1)) - список информационной структуры примитива (СИСП), (setq per (assoc '1 per)) - нахождение в (СИСП) по ключу (паролю) '1 ключевой пары значения примитива, кстати переменную per можно использовать несколько раз, меняя ее назначение (1 . имя_атрибута) – ключевая пара, (setq zna (cdr per)) - получение значения второго члена ключевой пары, т.е. значения примитива (атрибута)
(princ "ГРУППА НОМЕР =")
(princ zna)(princ "   ")(terpri)
Вывод текстовой информации - номера группы светильника в текстовом режиме Автокада, если появилась цифра группы – это подтверждает установку номера группы в атрибут, в этом случае другого подтверждения не требуется, например изменения цвета блока, переставляя его на другой слой
))
Конец условия 1, две скобки – одна закрывает групповую функцию prong, которая помогает объединять все выражения и функции в теле условия, вторая скобка закрывает условие
(setq a1 (entnext a1))
Выражение для перелистывания примитивов и получения имени следующего примитива или подпримитива, т.е. функция entnext с именем /а1/ - предыдущего примитива, дает имя следующего примитива, которое записывается в переменную /а1/. Это помогает найти в блоке нужный атрибут номера группы светильника, т.к. имеется два атрибута и неизвестно какой появится первым
(if a1 (progn
Условие 2. Если следующий примитив существует, то мы попадаем в это условие
(setq tip (cdr(assoc '0 (entget a1))))
Выражение для получения из информационной структуры примитива рисунка - типа примитива, выражение можно записать и другим способом - последовательным написанием каждой функции : (setq per (entget a)) - список информацной структуры примитива (СИСП), (setq per (assoc '0 per)) – нахождение в (СИСП) по ключу (паролю) '0 ключевой пары типа примитива (0.тип_примитива), (setq tip (cdr per)) - получение значения второго члена ключевой пары, т.е. типа примитива. Наша задача - отбор всех примитивов с типом ATTRIB, а затем из всего числа атрибутов, выбор нужного атрибута номера группы светильника
(setq b1 
(cdr(assoc '2 (entget a1))))
Получение имени атрибута из (СИСП) , аналогично /tip/ - см. рассмотренное выше выражение для получение типа примитива
(setq zna
(cdr(assoc '1 (entget a1))))
Получение значения атрибута из (СИСП) , аналогично /tip/ - см. рассмотренное выше выражение для получение типа примитива
(if (equal tip "SEQEND")(progn  
     (textscr)
Условие 3. Если тип примитива является выражением SEQEND – это означает, что рассматриваемый блок светильника закончился и нужно выбирать следующий светильник. Функция (textscr) переводит режим Автокада в текстовый режим
(setq a1 (car(entsel"\n ВЫБЕРИТЕ 
  СВЕТИЛЬНИК для изменения N группы \n: ")))
Команда entsel позволяет выбрать примитив из чертежа, указав на него курсором. Понятно, что это будет блок, определяющий светильник. Возвращает же выражениесписок, где первый элемент - это имя выбранного примитива, а второй элемент – это координаты точки, использованной для указания примитива. Функция car позволяет выбрать из списка первый элемент списка, т.е. имя примитива. Данное выражение работает в цикле, т.е. повторяется каждый раз, когда заканчивается блок рассматриваемого светильника
(if a1 (progn
Условие 4. Если существует найденный примитив, то мы попадаем в условие
(setq a1 (entnext a1))
Выражение для перелистывания примитивов и получения имени следующего примитива или подпримитива, т.е. функция entnext с именем /а1/ - предыдущего примитива, дает имя следующего примитива, которое записывается в переменную /а1/. Это помогает найти в блоке нужный атрибут номера группы светильника, т.к. имеется два атрибута и неизвестно какой появится первым
(setq tip (cdr(assoc '0 (entget a1))))
Выражение для получения из информационной структуры примитива рисунка - типа примитива, выражение можно записать и другим способом - последовательным написанием каждой функции : (setq per (entget a)) - список информацной структуры примитива (СИСП), (setq per (assoc '0 per)) – нахождение в (СИСП) по ключу (паролю) '0 ключевой пары типа примитива (0.тип_примитива), (setq tip (cdr per)) – получение значения второго члена ключевой пары, т.е. типа примитива. Наша задача - отбор всех примитивов с типом ATTRIB ,а затем из всего числа атрибутов, выбор нужного атрибута номера группы светильника
(setq b1 (cdr(assoc '2 (entget a1))))
Получение имени атрибута из (СИСП) , аналогично /tip/ - см. рассмотренное выше выражение для получение типа примитива
(setq zna (cdr(assoc '1 (entget a1))))
Получение имени атрибута из (СИСП) , аналогично /tip/ - см. рассмотренное выше выражение для получение типа примитива
))
Конец условия 4 при выборе нового светильника
))
Конец условия 3 по определению конца блока светильника
))
Конец условия 2 по определению существования следующего примитива
(if (not a1)(progn 
(setq a1 nil b1 nil)))
Если не выбрано ни одного светильника, то в условии обнуляются переменные, с помощью которых работает цикл
))
Конец условия 0 по определению существования атрибута.
)
Конец цикла 1. Цикл закончится только тогда, когда не будет существования примитива.
)
Окончание программной функции defun по нумерации групп светильников чертежа.

Полный текст программы (файл ZNG.LSP)

 (defun zng() 
; ФУНКЦИЯ ИЗМЕНЕНИЯ N ГРУППЫ ОСВЕЩЕНИЯ
(textscr)(princ "==========================================")(terpri)
(setq nnp (getstring"\n ВВЕДИТЕ начальный N ГРУППЫ\n: "))
(setq nnp1 (atoi nnp))(textscr)
(setq a1 (car(entsel"\n ВЫБЕРИТЕ СВЕТИЛЬНИК для изменения N ГРУППЫ\n: ")))
(princ "a =")(princ a1)(terpri)
(setq a1 (entnext a1))
(setq b1 (cdr(assoc '2 (entget a1)))) 
(setq tip (cdr(assoc '0 (entget a1))))
(while b1 
  (if (or (equal tip "ATTDEF")(equal tip "ATTRIB"))
     (progn 
     ;(princ "b1 =")(princ b1)(terpri)
     (if (equal b1 "NGR") (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 zna (cdr(assoc '1 (entget a1)))) ;значение примитива
         (princ "ГРУППА НОМЕР =")(princ zna)(princ "       ");(terpri)
     ))
    (setq a1 (entnext a1))
    (if a1 (progn 
          (setq tip (cdr(assoc '0 (entget a1)))) ;тип примитива
         ;(princ "tip =")(princ tip)(terpri)
          (setq b1 (cdr(assoc '2 (entget a1)))) ;имя примитива
          (setq zna (cdr(assoc '1 (entget a1)))) ;значение примитива
          (if (equal tip "SEQEND")(progn (textscr)
            (setq a1 
            (car(entsel"\n ВЫБЕРИТЕ СВЕТИЛЬНИК для изменения N ГРУППЫ\n: ")))
             ;(textscr)
              (if a1 (progn 
                   (setq a1 (entnext a1))
                   (setq tip (cdr(assoc '0 (entget a1)))) ;тип примитива
                   (setq b1 (cdr(assoc '2 (entget a1)))) ;тип примитива
                   (setq zna (cdr(assoc '1 (entget a1))));значение примитива
              ))
          ))
    ))
   (if (not a1)(progn 
       (setq nnp (getstring"\n ВВЕДИТЕ N ГРУППЫ\n: "))
       (setq nnp1 (atoi nnp))(textscr)
       (setq a1(car(entsel"\n ВЫБЕРИТЕ СВЕТИЛЬНИК для изменения N ГРУППЫ\n: ")))
       (setq a1 (entnext a1))
       (setq b1 (cdr(assoc '2 (entget a1)))) 
       (setq tip (cdr(assoc '0 (entget a1))))
       (setq zna (cdr(assoc '1 (entget a1)))) ;значение примитива
   )) 
     (if (not a1)(progn (setq a1 nil b1 nil))) 
  ))    ;условие нахождения атрибута
)       ;цикл
(setq a1 nil b1 nil)
)
Оглавление



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