Читаем Введение в Автолисп полностью

Две функции - (write-char число [дескриптор_файла]) и (write-line строка [дескриптор файла]) - в примерах не нуждаются. Их задача - записывать в файл символы или строки.

<p>7.4. Пример обработки файла</p>

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

¬¬1¬¬¬¬0¬¬¬¬¬0.0000¬¬¬¬¬¬¬0.0000

¬¬2¬¬¬¬5¬¬¬¬¬6.4214¬¬¬¬¬¬¬8.2349

¬¬З¬¬¬10¬¬¬¬¬8.7965¬¬¬¬¬¬26.1500

и так далее. В четырех столбцах файла расположены следующие параметры: порядковый номер строки, значение аргумента (например, указан шаг счета нарастающим итогом), координаты X и Y расчетных точек, символом  ¬ обозначены обусловленные форматом вывода незаполненные позиции в строках данных.

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

Длина строки файла составляет 32 позиции. В соответствии с оговоренным условием значения координат могут занимать 9 позиций. Для перестраховки установим длину читаемых позиций, равной 10 символам (вдруг в файле неожиданно для нас окажется число с четырехзначной целой частью).

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

Итак, напишем функцию, извлекающую из чертежа координаты точек.

1 (defun pnt ()

2 (setq lin (read-line file1))

3 (setq x1 (atof (substr lin 10 10)))

4 (setq y1 (atof (substr lin 23 10)))

5 (setq pt1 (listx1 y1))

)

Строка 1 устанавливает имя программируемой функции pnt, строка 2 считывает из файла, определенного дескриптором file1, первую строку lin, рассматривая ее как строковую переменную. Далее (строка 3) функция substr считывает информацию, содержащуюся в позициях 10...19 строки lin, функция atof преобразует считанную строковую переменную в числовую, а уже setq приписывает это значение координате x1. Аналогичные действия выполняет строка 4, устанавливая координату y1. Наконец, выделенные координаты приписываются точке pt1 (строка 5).

Если остановиться на вычерчивании за один прием участка полилинии, проходящего через две точки, то соответствующая функция будет выглядеть, например, следующим образом:

(defun otr ()

    (command “pline” pt1 “w” “0” “” pt2 “”)

).

Теперь можно написать полностью программу, обрабатывающую файл результатов расчета любой длины.

;;; ==============================================

(defun cdraw ()

;;; ==============================================

;;; подавление вывода текста на экран

    (setq svar_old (getvar “cmdecho”))

    (setvar “cmdecho” 0)

;;; загрузка штрих-пунктирной линии

    (if (tblsearch "ltype" "Acad_ISO04w100")

      (princ)

    (command "linetype" "load"

      "Acad_ISO04w100" "acadiso.lin" "" "")

    )

;;; сохранение текущего слоя

    (setq lay_old (getvar "clayer"))

;;; создание нового слоя в чертеже

    (command "layer" "new" "cam"

      "c" "magenta" "cam"

      "I" "Acad_ISO04w100" "cam"

      "s" "cam" "")

;;; вызов файла и чтение первой строки

    (setq get_F (getstring "Введите имя файла:"))

    (setq file1 (open (strcat get_F) "r"))

    (setq t1 (pnt))

;;; организация цикла счета строк файла

        (setq k 0)

    (while (read-line file1)

    (setq k (+ k 1))

    )

        (close file1)

;;; чтение файла и обрисовка профиля

        (setq file1 (open get_F “г”))

    (repeat (- k 1)

        (setq t2 (pnt))

        (otr)

        (setq t1 t2)

    )

    (close file1)

  (command “layer” “s” lay_old)

  (setvar “cmdecho” svar_old)

  (princ)

)

Разумеется, в текст программы должны быть включены функции, описанные в этом параграфе (имеются в виду функции pnt и otr).

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

И последнее замечание. Приведенный фрагмент содержит два цикла: while и repeat. Это сделано лишь для иллюстрации принципов их построения. В реальной программе достаточно одного цикла while.

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных