Чертеж, выведенный на бумагу, содержит объекты, изображаемые линиями различной ширины. До появления 15-й версии Автокада они обычно выполнялись на экране монитора линиями нулевой ширины, а требуемое значение ширины устанавливалось при настройке печатающего устройства. Автокад 2000 снял эту проблему, добавив новую системную переменную - LINEWEIGHT, управляющую шириной линии. Но и в более ранних версиях иногда удобно уже в чертеже задавать необходимую ширину линий, особенно если объекты расположены в одном слое. Автокад в этой ситуации позволяет использовать примитивы, обладающие шириной линии, например, полилинии, полосы, кольца. Однако часто бывает удобнее выполнить чертеж в линиях нулевой толщины, а впоследствии отредактировать нужные примитивы. Автокад предоставляет возможность осуществить это, применив команду Pedit, но подобную обработку, во-первых, воспринимают не все примитивы, во-вторых, она трудоемка и требует особой сосредоточенности в связи с необходимостью постоянно отслеживать информацию в поле сообщений.
Ниже приводится фрагмент программы, осуществляющей одновременное преобразование в примитивы, обладающие шириной, некоторого набора отмеченных примитивов, включающего линии, полилинии, дуги и окружности. Программа использовалась в версиях 11...14, может быть небесполезной и в версии AutoCAD 2000.
(defun MODES (a)
(setq MLST '())
(repeat (length a)
(setq MLST (append MLST (list (list (car a) (getvar (сar a))))))
(setq a (cdr a))
) ; Конец repeat
) ; Конец MODES
(defun MODER ()
(repeat (length MLST)
(setvar (caar MLST) (cadar MLST))
(setq MLST (cdr MLST))
)
)
(defun C:PLW (/ sset pl_w n type_e)
(modes ‘(“BLIPMODE” “CMDECHO”))
(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 не была упомянута важная ее особенность. Эта функция может производить проверку типа вводимых данных. В качестве последнего контрольного теста устанавливается условие Т. Если среди аргументов встречается аргумент, не соответствующий перечисленным типам, функция возвращает результат операции, приписанный этому условию. В программе
Второе обстоятельство заключается в следующем. Три примитива - линия, полилиния и дуга — могут быть обработаны командой pedit, но окружность этой командой не обрабатывается. Поэтому окружность в чертеже заменяется кольцом, а исходный примитив удаляется из чертежа.
Наконец, некоторое неудобство доставляет преобразование окружности в кольцо. Дело в том, что для обрисовки кольца необходимо указать координаты его центра, совпадающие с извлеченными координатами центра окружности. Но если окружность создавалась в одной системе координат, а преобразование осуществляется в другой, то кольцо меняет свое положение относительно прочих элементов чертежа. Чтобы избежать этого, следует либо производить преобразование в той же системе, в которой создана окружность, либо программно осуществить преобразование координат. Читателю, оценившему полезность этой программы, не составит труда дополнить ее нужным фрагментом, а возможно, и добавить к обрабатываемым другие примитивы, например: эллипс и сплайн. Подобная расширенная программа существует и используется студентами при выполнении графических заданий.
6.8. Извлечение данных из таблиц
В описанной ранее программе