Выбрать главу

    (setvar “CMDECHO” 0)

    (setvar "BLIPMODE” 1)

    (setq sset (ssget) n 0)

(setq pl_w (getdist “\nВведите ширину линии:_ “))

    (while (< n (sslength sset))

        (setq name (ssname sset n))

        (setq type_e (cdr (assoc 0 (cdr (entget name)))))

    (cond

((= type_e “LWPOLYLINE”)

    (command “pedit” name “” “W” pl_w “”))

((= type_e “LINE”)

    (command “pedit” name “” “W” pl_w “”))

((= type_e “ARC”)

    (command “pedit” name “” “W” pl__W “”))

((= type_e “CIRCLE”)

    (setq circ (entget name))

    (setq rad (cdr (assoc 40 circ)))

    (setq cen (cdr (assoc 10 circ)))

    (setq diamin (- (* 2 rad) pl_w))

    (setq diamout (+ (* 2 rad) pl_w))

    (command “donut” diamin diamout cen “”)

    (entdel name)

) ; Конец CIRCLE

(t (princ (strcat “\nОшибочный выбор !”)))

) ; Конец cond

(setq n (1+ n))

) ; Конец while

    (command “redraw”)

    (moder)

    (princ)

) ; Конец программы

В этой программе следует обратить внимание на три обстоятельства. В разделе 4.2 при описании функции cond не была упомянута важная ее особенность. Эта функция может производить проверку типа вводимых данных. В качестве последнего контрольного теста устанавливается условие Т. Если среди аргументов встречается аргумент, не соответствующий перечисленным типам, функция возвращает результат операции, приписанный этому условию. В программе plw подобную роль выполняет строка (t (princ (strcat “\nОшибочный выбор !”))). При выборе примитива, тип которого отличается от перечисленных (например эллипса), программа его не обрабатывает, сообщает об ошибке выбора, но продолжает обработку примитивов, тип которых соответствует перечисленным в программе.

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

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

6.8. Извлечение данных из таблиц

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

Рассмотрим следующую ситуацию. В начале работы над чертежом была использована команда scr программы Format, в результате чего в пространстве модели организовано поле чертежа. Независимо от того, какие действия выполнялись оператором в течение сеанса, в чертеже уже присутствуют типы линий Acad_ISO02w100 и Acad_ISO04w100 и несколько слоев. При переходе в пространство бумаги и программном вызове необходимого формата происходит повторная загрузка тех же типов линий и слоев. При выполнении команды linetype Автокад сообщает, что соответствующий тип линий уже загружен, и запрашивает оператора, следует ли произвести перезагрузку. Этот запрос останавливает работу программы и все последующие запрограммированные действия приходится производить вручную.

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

Целый ряд параметров чертежа (например список слоев) хранится в виде таблиц. Для обработки таких таблиц используются функции tblnext и tblsearch. Обработке могут подвергаться таблицы с именами “АРРID”, “BLOCK”, “DIMSTYLE”, LAYER”, “LTYPE”, “STYLE”, “USC”, “VEW”, “VPORT”. Регистр записи имен не играет роли.