Чертеж, выведенный на бумагу, содержит объекты, изображаемые линиями различной ширины. До появления 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 не была упомянута важная ее особенность. Эта функция может производить проверку типа вводимых данных. В качестве последнего контрольного теста устанавливается условие Т. Если среди аргументов встречается аргумент, не соответствующий перечисленным типам, функция возвращает результат операции, приписанный этому условию. В программе plw подобную роль выполняет строка (t (princ (strcat “\nОшибочный выбор !”))). При выборе примитива, тип которого отличается от перечисленных (например эллипса), программа его не обрабатывает, сообщает об ошибке выбора, но продолжает обработку примитивов, тип которых соответствует перечисленным в программе.

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

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

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

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

Перейти на страницу:

Похожие книги